if (in->auth_cap && in->flushing_cap_item.is_on_list()) {
ldout(cct, 10) << "add_update_cap changing auth cap: "
<< "add myself to new auth MDS' flushing caps list" << dendl;
- mds_session->flushing_caps.push_back(&in->flushing_cap_item);
+ adjust_session_flushing_caps(in, in->auth_cap->session, mds_session);
}
in->auth_cap = cap;
}
put_inode(in);
}
}
+ s->flushing_caps_tids.clear();
sync_cond.Signal();
}
session->flushing_caps.push_back(&in->flushing_cap_item);
+ session->flushing_caps_tids.insert(flush_tid);
*ptid = flush_tid;
return flushing;
}
+void Client::adjust_session_flushing_caps(Inode *in, MetaSession *old_s, MetaSession *new_s)
+{
+ for (map<ceph_tid_t, int>::iterator it = in->flushing_cap_tids.begin();
+ it != in->flushing_cap_tids.end();
+ ++it) {
+ old_s->flushing_caps_tids.erase(it->first);
+ new_s->flushing_caps_tids.insert(it->first);
+ }
+ new_s->flushing_caps.push_back(&in->flushing_cap_item);
+}
+
void Client::flush_caps()
{
ldout(cct, 10) << "flush_caps" << dendl;
if (cap == in->auth_cap)
in->auth_cap = tcap;
if (in->auth_cap == tcap && in->flushing_cap_item.is_on_list())
- tsession->flushing_caps.push_back(&in->flushing_cap_item);
+ adjust_session_flushing_caps(in, session, tsession);
}
} else {
add_update_cap(in, tsession, m->peer.cap_id, cap->issued,
if (it->first == flush_ack_tid)
cleaned = it->second;
if (it->first <= flush_ack_tid) {
+ session->flushing_caps_tids.erase(it->first);
in->flushing_cap_tids.erase(it++);
++flushed;
continue;
void remove_session_caps(MetaSession *session);
void mark_caps_dirty(Inode *in, int caps);
int mark_caps_flushing(Inode *in, ceph_tid_t *ptid);
+ void adjust_session_flushing_caps(Inode *in, MetaSession *old_s, MetaSession *new_s);
void flush_caps();
void flush_caps(Inode *in, MetaSession *session);
void kick_flushing_caps(MetaSession *session);