From 3949b6f7516380d6bb2977baf44bc09b25f1b2d8 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Tue, 15 May 2018 12:35:53 -0700 Subject: [PATCH] client: cleanup Cap init Use reference for inode so it's write-once and must be valid. Signed-off-by: Patrick Donnelly --- src/client/Client.cc | 58 +++++++++++++++++++++----------------------- src/client/Inode.cc | 2 +- src/client/Inode.h | 24 +++++++++--------- 3 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2a6c5402c7c..56fc4564646 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3672,10 +3672,8 @@ void Client::signal_context_list(list& ls) void Client::wake_inode_waiters(MetaSession *s) { - xlist::iterator iter = s->caps.begin(); - while (!iter.end()){ - signal_cond_list((*iter)->inode->waitfor_caps); - ++iter; + for (const auto &cap : s->caps) { + signal_cond_list(cap->inode.waitfor_caps); } } @@ -3854,7 +3852,7 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id } mds_rank_t mds = mds_session->mds_num; - const auto &capem = in->caps.emplace(std::piecewise_construct, std::forward_as_tuple(mds), std::forward_as_tuple(in, mds_session)); + const auto &capem = in->caps.emplace(std::piecewise_construct, std::forward_as_tuple(mds), std::forward_as_tuple(*in, mds_session)); Cap &cap = capem.first->second; if (!capem.second) { /* @@ -3922,37 +3920,37 @@ void Client::add_update_cap(Inode *in, MetaSession *mds_session, uint64_t cap_id void Client::remove_cap(Cap *cap, bool queue_release) { - Inode *in = cap->inode; + auto &in = cap->inode; MetaSession *session = cap->session; mds_rank_t mds = cap->session->mds_num; - ldout(cct, 10) << __func__ << " mds." << mds << " on " << *in << dendl; + ldout(cct, 10) << __func__ << " mds." << mds << " on " << in << dendl; if (queue_release) { session->enqueue_cap_release( - in->ino, + in.ino, cap->cap_id, cap->issue_seq, cap->mseq, cap_epoch_barrier); } - if (in->auth_cap == cap) { - if (in->flushing_cap_item.is_on_list()) { + if (in.auth_cap == cap) { + if (in.flushing_cap_item.is_on_list()) { ldout(cct, 10) << " removing myself from flushing_cap list" << dendl; - in->flushing_cap_item.remove_myself(); + in.flushing_cap_item.remove_myself(); } - in->auth_cap = NULL; + in.auth_cap = NULL; } - size_t n = in->caps.erase(mds); + size_t n = in.caps.erase(mds); assert(n == 1); cap = nullptr; - if (!in->is_any_caps()) { - ldout(cct, 15) << __func__ << " last one, closing snaprealm " << in->snaprealm << dendl; - in->snaprealm_item.remove_myself(); - put_snap_realm(in->snaprealm); - in->snaprealm = 0; + if (!in.is_any_caps()) { + ldout(cct, 15) << __func__ << " last one, closing snaprealm " << in.snaprealm << dendl; + in.snaprealm_item.remove_myself(); + put_snap_realm(in.snaprealm); + in.snaprealm = 0; } } @@ -3968,7 +3966,7 @@ void Client::remove_session_caps(MetaSession *s) while (s->caps.size()) { Cap *cap = *s->caps.begin(); - Inode *in = cap->inode; + InodeRef in(&cap->inode); bool dirty_caps = false, cap_snaps = false; if (in->auth_cap == cap) { cap_snaps = !in->cap_snaps.empty(); @@ -3980,7 +3978,6 @@ void Client::remove_session_caps(MetaSession *s) remove_cap(cap, false); signal_cond_list(in->waitfor_caps); if (cap_snaps) { - InodeRef tmp_ref(in); in->cap_snaps.clear(); } if (dirty_caps) { @@ -3991,7 +3988,7 @@ void Client::remove_session_caps(MetaSession *s) } in->flushing_caps = 0; in->mark_caps_clean(); - put_inode(in); + put_inode(in.get()); } } s->flushing_caps_tids.clear(); @@ -4092,7 +4089,7 @@ void Client::trim_caps(MetaSession *s, uint64_t max) std::set anchor; /* prevent put_inode from deleting all caps during traversal */ while ((caps_size - trimmed) > max && !p.end()) { Cap *cap = *p; - InodeRef in(cap->inode); + InodeRef in(&cap->inode); // Increment p early because it will be invalidated if cap // is deleted inside remove_cap @@ -4150,9 +4147,9 @@ void Client::force_session_readonly(MetaSession *s) { s->readonly = true; for (xlist::iterator p = s->caps.begin(); !p.end(); ++p) { - Inode *in = (*p)->inode; - if (in->caps_wanted() & CEPH_CAP_FILE_WR) - signal_cond_list(in->waitfor_caps); + auto &in = (*p)->inode; + if (in.caps_wanted() & CEPH_CAP_FILE_WR) + signal_cond_list(in.waitfor_caps); } } @@ -4338,12 +4335,11 @@ void Client::early_kick_flushing_caps(MetaSession *session) void Client::kick_maxsize_requests(MetaSession *session) { - xlist::iterator iter = session->caps.begin(); - while (!iter.end()){ - (*iter)->inode->requested_max_size = 0; - (*iter)->inode->wanted_max_size = 0; - signal_cond_list((*iter)->inode->waitfor_caps); - ++iter; + for (const auto &cap : session->caps) { + auto &in = cap->inode; + in.requested_max_size = 0; + in.wanted_max_size = 0; + signal_cond_list(in.waitfor_caps); } } diff --git a/src/client/Inode.cc b/src/client/Inode.cc index 1a03e7d9243..a4b09538790 100644 --- a/src/client/Inode.cc +++ b/src/client/Inode.cc @@ -545,7 +545,7 @@ void Inode::dump(Formatter *f) const void Cap::dump(Formatter *f) const { f->dump_int("mds", session->mds_num); - f->dump_stream("ino") << inode->ino; + f->dump_stream("ino") << inode.ino; f->dump_unsigned("cap_id", cap_id); f->dump_stream("issued") << ccap_string(issued); if (implemented != issued) diff --git a/src/client/Inode.h b/src/client/Inode.h index ce7b1a6eb61..ca724d05312 100644 --- a/src/client/Inode.h +++ b/src/client/Inode.h @@ -32,10 +32,11 @@ class Fh; class Cap { public: Cap() = delete; - Cap(Inode *i, MetaSession *s) : - session(s), inode(i), cap_id(0), issued(0), - implemented(0), wanted(0), seq(0), issue_seq(0), mseq(0), gen(s->cap_gen), - latest_perms(), cap_item(this) { + Cap(Inode &i, MetaSession *s) : inode(i), + session(s), + gen(s->cap_gen), + cap_item(this) + { s->caps.push_back(&cap_item); } ~Cap() { @@ -49,14 +50,15 @@ public: void dump(Formatter *f) const; + Inode &inode; MetaSession *session; - Inode *inode; - uint64_t cap_id; - unsigned issued; - unsigned implemented; - unsigned wanted; // as known to mds. - uint64_t seq, issue_seq; - __u32 mseq; // migration seq + uint64_t cap_id = 0; + unsigned issued = 0; + unsigned implemented = 0; + unsigned wanted = 0; // as known to mds. + uint64_t seq = 0; + uint64_t issue_seq = 0; + __u32 mseq = 0; // migration seq __u32 gen; UserPerm latest_perms; -- 2.39.5