From 4400aa85e7fa259b6131fb97788dc3b8ce45d42e Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Wed, 3 Jun 2015 18:05:29 +0800 Subject: [PATCH] client: track cap flushing TIDs for each session Signed-off-by: Yan, Zheng --- src/client/Client.cc | 18 ++++++++++++++++-- src/client/Client.h | 1 + src/client/MetaSession.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 0ba948128c30..d98e514f2ab2 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3483,7 +3483,7 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id 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; } @@ -3591,6 +3591,7 @@ void Client::remove_session_caps(MetaSession *s) put_inode(in); } } + s->flushing_caps_tids.clear(); sync_cond.Signal(); } @@ -3731,11 +3732,23 @@ int Client::mark_caps_flushing(Inode *in, ceph_tid_t* ptid) 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::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; @@ -4278,7 +4291,7 @@ void Client::handle_cap_export(MetaSession *session, Inode *in, MClientCaps *m) 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, @@ -4325,6 +4338,7 @@ void Client::handle_cap_flush_ack(MetaSession *session, Inode *in, Cap *cap, MCl 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; diff --git a/src/client/Client.h b/src/client/Client.h index b6ea21ba7eb6..e6c74db5a4b1 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -536,6 +536,7 @@ protected: 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); diff --git a/src/client/MetaSession.h b/src/client/MetaSession.h index 36b5814c7c67..e21be8351527 100644 --- a/src/client/MetaSession.h +++ b/src/client/MetaSession.h @@ -46,6 +46,7 @@ struct MetaSession { xlist flushing_capsnaps; xlist requests; xlist unsafe_requests; + std::set flushing_caps_tids; Cap *s_cap_iterator; -- 2.47.3