From cc644b842261dbeefde804ed999061b8733a9190 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 20 Jun 2011 13:56:09 -0700 Subject: [PATCH] mds: avoid EMetaBlob::fullbit copying with shared_ptr The fullbit subclass has a pointer, making it unsafe to copy around. Fix by adding a undefined copy constructor and operator, and using a shared_ptr to reference it in the containing STL list<>. Tested-by: Sam Lang Signed-off-by: Sage Weil --- src/mds/events/EMetaBlob.h | 27 +++++++++++++++------------ src/mds/journal.cc | 7 ++++--- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index deb4ed3b9ed2d..f4a911c8b2b0d 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -70,6 +70,9 @@ public: bufferlist _enc; + fullbit(const fullbit& o); + const fullbit& operator=(const fullbit& o); + fullbit(const string& d, snapid_t df, snapid_t dl, version_t v, inode_t& i, fragtree_t &dft, map &xa, const string& sym, @@ -272,7 +275,7 @@ public: private: mutable bufferlist dnbl; bool dn_decoded; - list dfull; + list > dfull; list dremote; list dnull; @@ -286,7 +289,7 @@ public: bool is_new() { return state & STATE_NEW; } void mark_new() { state |= STATE_NEW; } - list &get_dfull() { return dfull; } + list > &get_dfull() { return dfull; } list &get_dremote() { return dremote; } list &get_dnull() { return dnull; } @@ -296,8 +299,8 @@ public: << " num " << nfull << "/" << nremote << "/" << nnull << std::endl; _decode_bits(); - for (list::iterator p = dfull.begin(); p != dfull.end(); ++p) - p->print(out); + for (list >::iterator p = dfull.begin(); p != dfull.end(); ++p) + (*p)->print(out); for (list::iterator p = dremote.begin(); p != dremote.end(); ++p) p->print(out); for (list::iterator p = dnull.begin(); p != dnull.end(); ++p) @@ -552,15 +555,15 @@ private: in->encode_snap_blob(snapbl); lump.nfull++; - lump.get_dfull().push_back(fullbit(dn->get_name(), - dn->first, dn->last, - dn->get_projected_version(), - *pi, *pdft, *px, - in->symlink, snapbl, - dirty, default_layout)); + lump.get_dfull().push_back(std::tr1::shared_ptr(new fullbit(dn->get_name(), + dn->first, dn->last, + dn->get_projected_version(), + *pi, *pdft, *px, + in->symlink, snapbl, + dirty, default_layout))); if (pi) - lump.get_dfull().back().inode = *pi; - return &lump.get_dfull().back().inode; + lump.get_dfull().back()->inode = *pi; + return &lump.get_dfull().back()->inode; } // convenience: primary or remote? figure it out. diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 35142003d321a..864a6b6a42d6c 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -521,9 +521,10 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) lump._decode_bits(); // full dentry+inode pairs - for (list::iterator p = lump.get_dfull().begin(); - p != lump.get_dfull().end(); - p++) { + for (list >::iterator pp = lump.get_dfull().begin(); + pp != lump.get_dfull().end(); + pp++) { + std::tr1::shared_ptr p = *pp; CDentry *dn = dir->lookup_exact_snap(p->dn, p->dnlast); if (!dn) { dn = dir->add_null_dentry(p->dn, p->dnfirst, p->dnlast); -- 2.39.5