From d4f917f1be7b97796b1ca33d6987128c988f8175 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 11 Jul 2008 10:25:13 -0700 Subject: [PATCH] mds: use set (not vector) for cached_snaps --- src/mds/MDCache.cc | 34 ++++++++++++--------- src/mds/Migrator.cc | 2 +- src/mds/Server.cc | 10 +++--- src/mds/snap.cc | 56 +++++++++++++++++++++------------- src/mds/snap.h | 16 +++++----- src/messages/MClientFileCaps.h | 18 +++++++++-- src/messages/MClientReply.h | 18 +++++++++-- src/osdc/Filer.cc | 2 +- src/osdc/Filer.h | 6 ++-- src/osdc/Objecter.cc | 10 +++--- src/osdc/Objecter.h | 28 ++++++++--------- 11 files changed, 122 insertions(+), 78 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index dc8f0fea36595..974f04afc6b96 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -932,6 +932,9 @@ int MDCache::num_subtrees_fullnonauth() // =================================== // journal helpers +/* + * find first inode in cache that follows given snapid. otherwise, return current. + */ CInode *MDCache::pick_inode_snap(CInode *in, snapid_t follows) { if (follows == 0) @@ -940,21 +943,22 @@ CInode *MDCache::pick_inode_snap(CInode *in, snapid_t follows) dout(10) << "pick_inode_snap follows " << follows << " on " << *in << dendl; SnapRealm *realm = in->find_snaprealm(); - vector& snaps = *realm->get_snap_vector(); + const set& snaps = realm->get_snaps(); dout(10) << " realm " << *realm << " " << *realm->inode << dendl; dout(10) << " snaps " << snaps << dendl; - unsigned i=0; - while (i+1 < snaps.size() && snaps[i+1] > follows) i++; + if (snaps.empty()) + return in; + CInode *t = 0; - do { - t = get_inode(in->ino(), snaps[i]); - if (t) - break; - } while (i-- > 0); - if (t) { - in = t; - dout(10) << "pick_inode_snap " << snaps[i] << " found " << *in << dendl; + for (set::const_iterator p = snaps.upper_bound(follows); + p != snaps.end(); + p++) { + t = get_inode(in->ino(), *p); + if (t) { + in = t; + dout(10) << "pick_inode_snap snap " << *p << " found " << *in << dendl; + } } return in; } @@ -2895,7 +2899,7 @@ void MDCache::rejoin_import_cap(CInode *in, int client, inode_caps_reconnect_t& cap->pending(), cap->wanted(), cap->get_mseq()); - reap->get_snaps() = *realm->get_snap_vector(); + reap->set_snaps(realm->get_snaps()); reap->set_snap_created(realm->created); reap->set_snap_highwater(realm->snap_highwater); mds->messenger->send_message(reap, session->inst); @@ -3068,13 +3072,13 @@ void MDCache::do_file_recover() CInode *in = *file_recover_queue.begin(); file_recover_queue.erase(in); - vector *snaps = in->find_snaprealm()->get_snap_vector(); + const vector& snaps = in->find_snaprealm()->get_snap_vector(); if (in->inode.max_size > in->inode.size) { dout(10) << "do_file_recover starting " << in->inode.size << "/" << in->inode.max_size << " " << *in << dendl; file_recovering.insert(in); - mds->filer->probe(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, *snaps, + mds->filer->probe(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, snaps, in->inode.max_size, &in->inode.size, false, 0, new C_MDC_Recover(this, in)); } else { @@ -3171,7 +3175,7 @@ void MDCache::_do_purge_inode(CInode *in, loff_t newsize, loff_t oldsize) // remove if (newsize < oldsize) { - vector snaps; + const vector snaps = in->find_snaprealm()->get_snap_vector(); mds->filer->remove(in->inode.ino, &in->inode.layout, CEPH_NOSNAP, snaps, newsize, oldsize-newsize, 0, 0, new C_MDC_PurgeFinish(this, in, newsize, oldsize)); diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index a2150a8399799..0272be7f946aa 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -2061,7 +2061,7 @@ void Migrator::finish_import_inode_caps(CInode *in, int from, cap->pending(), cap->wanted(), cap->get_mseq()); - caps->get_snaps() = *realm->get_snap_vector(); + caps->set_snaps(realm->get_snaps()); caps->set_snap_created(realm->created); caps->set_snap_highwater(realm->snap_highwater); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 67f51aafc5223..88217a2b34242 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -4436,7 +4436,7 @@ void Server::_do_open(MDRequest *mdr, CInode *cur) reply->set_file_caps_mseq(cap->get_mseq()); SnapRealm *realm = cur->find_snaprealm(); - reply->get_snaps() = *realm->get_snap_vector(); + reply->set_snaps(realm->get_snaps()); reply->set_snap_info(realm->inode->ino(), realm->created, realm->snap_highwater); dout(10) << " snaprealm is " << *realm << " snaps=" << reply->get_snaps() << " on " << *realm->inode << dendl; @@ -4738,11 +4738,11 @@ void Server::handle_client_mksnap(MDRequest *mdr) q.pop_front(); // build new snaps list - vector *snaps; - snaps = diri->snaprealm->update_snap_vector(snapid); + const set snaps = diri->snaprealm->update_snaps(snapid); + const vector snapvec = diri->snaprealm->get_snap_vector(); dout(10) << " realm " << *realm - << " snaps " << *snaps + << " snaps " << snaps << " on " << *realm->inode << dendl; for (map >::iterator p = realm->client_caps.begin(); @@ -4762,7 +4762,7 @@ void Server::handle_client_mksnap(MDRequest *mdr) } updates[p->first] = update; } - update->realms[realm->inode->ino()] = *snaps; + update->realms[realm->inode->ino()] = snapvec; } // notify for active children, too. diff --git a/src/mds/snap.cc b/src/mds/snap.cc index ac2b4a5dadd9c..f1635a43fb91f 100644 --- a/src/mds/snap.cc +++ b/src/mds/snap.cc @@ -57,9 +57,9 @@ bool SnapRealm::open_parents(MDRequest *mdr) * get list of snaps for this realm. we must include parents' snaps * for the intervals during which they were our parent. */ -void SnapRealm::get_snap_set(set &s, snapid_t first, snapid_t last) +void SnapRealm::build_snap_set(set &s, snapid_t first, snapid_t last) { - dout(10) << "get_snap_set [" << first << "," << last << "] on " << *this << dendl; + dout(10) << "build_snap_set [" << first << "," << last << "] on " << *this << dendl; // include my snaps within interval [first,last] for (map::iterator p = snaps.lower_bound(first); // first element >= first @@ -77,46 +77,60 @@ void SnapRealm::get_snap_set(set &s, snapid_t first, snapid_t last) assert(oldparent->snaprealm); thru = MIN(last, p->first); - oldparent->snaprealm->get_snap_set(s, - MAX(first, p->second.first), - thru); + oldparent->snaprealm->build_snap_set(s, + MAX(first, p->second.first), + thru); ++thru; } if (thru <= last && parent) - parent->get_snap_set(s, thru, last); + parent->build_snap_set(s, thru, last); } /* * build vector in reverse sorted order */ -vector *SnapRealm::get_snap_vector() +const set& SnapRealm::get_snaps() { if (!cached_snaps.size()) { - dout(10) << "get_snap_vector " << cached_snaps << " (cached)" << dendl; - return &cached_snaps; + dout(10) << "get_snaps " << cached_snaps << " (cached)" << dendl; + return cached_snaps; } - set s; - get_snap_set(s, 0, CEPH_NOSNAP); - cached_snaps.resize(s.size()); - int i = 0; - for (set::reverse_iterator p = s.rbegin(); p != s.rend(); p++) - cached_snaps[i++] = *p; + cached_snaps.clear(); + cached_snap_vec.clear(); + build_snap_set(cached_snaps, 0, CEPH_NOSNAP); - dout(10) << "get_snap_vector " << cached_snaps + dout(10) << "get_snaps " << cached_snaps << " (highwater " << snap_highwater << ")" << dendl; - return &cached_snaps; + return cached_snaps; } -vector *SnapRealm::update_snap_vector(snapid_t creating) +const vector& SnapRealm::get_snap_vector() +{ + if (cached_snap_vec.empty()) { + get_snaps(); + + cached_snap_vec.resize(cached_snaps.size()); + unsigned i = 0; + for (set::reverse_iterator p = cached_snaps.rbegin(); + p != cached_snaps.rend(); + p++) + cached_snap_vec[i++] = *p; + } + + return cached_snap_vec; +} + +const set& SnapRealm::update_snaps(snapid_t creating) { if (!snap_highwater) { assert(cached_snaps.empty()); - get_snap_vector(); + get_snaps(); } snap_highwater = creating; - cached_snaps.insert(cached_snaps.begin(), creating); // FIXME.. we should store this in reverse! - return &cached_snaps; + cached_snaps.insert(creating); + cached_snap_vec.insert(cached_snap_vec.begin(), creating); + return cached_snaps; } diff --git a/src/mds/snap.h b/src/mds/snap.h index 2a08408f90bbc..3116add8639ff 100644 --- a/src/mds/snap.h +++ b/src/mds/snap.h @@ -106,7 +106,8 @@ struct SnapRealm { set open_children; // active children that are currently open // caches? - vector cached_snaps; + set cached_snaps; + vector cached_snap_vec; snapid_t snap_highwater; xlist inodes_with_caps; // for efficient realm splits @@ -120,15 +121,16 @@ struct SnapRealm { { } bool open_parents(MDRequest *mdr); - void get_snap_set(set& s, snapid_t first=0, snapid_t last=CEPH_NOSNAP); - vector *get_snap_vector(); - vector *update_snap_vector(snapid_t adding=0); + void build_snap_set(set& s, snapid_t first, snapid_t last); + const set& get_snaps(); + const vector& get_snap_vector(); + const set& update_snaps(snapid_t adding=0); snapid_t get_latest_snap() { - vector *snaps = get_snap_vector(); - if (snaps->empty()) + const set &snaps = get_snaps(); + if (snaps.empty()) return 0; else - return (*snaps)[0]; + return *snaps.rbegin(); } void split_at(SnapRealm *child); diff --git a/src/messages/MClientFileCaps.h b/src/messages/MClientFileCaps.h index 7dd499878c460..5d9b6774356d2 100644 --- a/src/messages/MClientFileCaps.h +++ b/src/messages/MClientFileCaps.h @@ -35,6 +35,7 @@ class MClientFileCaps : public Message { private: struct ceph_mds_file_caps h; vector snaps; + bufferlist snapbl; public: int get_caps() { return h.caps; } @@ -46,6 +47,13 @@ class MClientFileCaps : public Message { snapid_t get_snap_created() { return snapid_t(h.snap_created); } snapid_t get_snap_highwater() { return snapid_t(h.snap_highwater); } vector &get_snaps() { return snaps; } + void set_snaps(const set& s) { + snaps.clear(); + snapbl.clear(); + for (set::const_reverse_iterator p = s.rbegin(); p != s.rend(); p++) + ::encode(*p, snapbl); + h.num_snaps = s.size(); + } inodeno_t get_ino() { return inodeno_t(h.ino); } __u64 get_size() { return h.size; } @@ -120,10 +128,14 @@ class MClientFileCaps : public Message { ::decode(snaps[i], p); } void encode_payload() { - h.num_snaps = snaps.size(); + if (!snapbl.length()) + h.num_snaps = snaps.size(); ::encode(h, payload); - for (unsigned i=0; i snaps; + bufferlist snapbl; bufferlist trace_bl; bufferlist dir_bl; @@ -168,6 +169,13 @@ class MClientReply : public Message { snapid_t get_snap_created() { return snapid_t(st.snap_created); } snapid_t get_snap_highwater() { return snapid_t(st.snap_highwater); } vector &get_snaps() { return snaps; } + void set_snaps(const set& s) { + snaps.clear(); + snapbl.clear(); + for (set::const_reverse_iterator p = s.rbegin(); p != s.rend(); p++) + ::encode(*p, snapbl); + st.num_snaps = s.size(); + } void set_snap_info(inodeno_t r, snapid_t c, snapid_t hw) { st.snap_realm = r; @@ -215,10 +223,14 @@ class MClientReply : public Message { assert(p.end()); } virtual void encode_payload() { - st.num_snaps = snaps.size(); + if (snapbl.length() == 0) + st.num_snaps = snaps.size(); ::encode(st, payload); - for (unsigned i=0; i &snaps, + snapid_t snap, const vector &snaps, __u64 start_from, __u64 *end, // LB, when !fwd bool fwd, diff --git a/src/osdc/Filer.h b/src/osdc/Filer.h index 92bb0938ca146..bcd5cc649230e 100644 --- a/src/osdc/Filer.h +++ b/src/osdc/Filer.h @@ -68,7 +68,7 @@ class Filer { map known; map ops; - Probe(inodeno_t i, ceph_file_layout &l, snapid_t sn, vector &sns, + Probe(inodeno_t i, ceph_file_layout &l, snapid_t sn, const vector& sns, __u64 f, __u64 *e, int fl, bool fw, Context *c) : ino(i), layout(l), snap(sn), snaps(sns), from(f), end(e), flags(fl), fwd(fw), onfinish(c), probing_len(0) {} @@ -140,7 +140,7 @@ class Filer { int remove(inodeno_t ino, ceph_file_layout *layout, - snapid_t snap, vector& snaps, + snapid_t snap, const vector& snaps, __u64 offset, size_t len, int flags, @@ -158,7 +158,7 @@ class Filer { */ int probe(inodeno_t ino, ceph_file_layout *layout, - snapid_t snap, vector &snaps, + snapid_t snap, const vector &snaps, __u64 start_from, __u64 *end, bool fwd, diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 895e287486348..e8b06e62f078e 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -336,7 +336,7 @@ void Objecter::handle_osd_op_reply(MOSDOpReply *m) // stat ----------------------------------- -tid_t Objecter::stat(object_t oid, __u64 *size, ceph_object_layout ol, vector& snaps, int flags, Context *onfinish) +tid_t Objecter::stat(object_t oid, __u64 *size, ceph_object_layout ol, const vector& snaps, int flags, Context *onfinish) { OSDStat *st = prepare_stat(snaps, size, flags); st->extents.push_back(ObjectExtent(oid, 0, 0)); @@ -452,7 +452,7 @@ void Objecter::handle_osd_stat_reply(MOSDOpReply *m) // read ----------------------------------- -tid_t Objecter::read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector &snaps, bufferlist *bl, int flags, +tid_t Objecter::read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector &snaps, bufferlist *bl, int flags, Context *onfinish) { OSDRead *rd = prepare_read(snaps, bl, flags); @@ -710,7 +710,7 @@ void Objecter::handle_osd_read_reply(MOSDOpReply *m) // write ------------------------------------ -tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector &snaps, bufferlist &bl, int flags, +tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector &snaps, bufferlist &bl, int flags, Context *onack, Context *oncommit) { OSDWrite *wr = prepare_write(snaps, bl, flags); @@ -724,7 +724,7 @@ tid_t Objecter::write(object_t oid, __u64 off, size_t len, ceph_object_layout ol // zero -tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector &snaps, int flags, +tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector &snaps, int flags, Context *onack, Context *oncommit) { OSDModify *z = prepare_modify(snaps, CEPH_OSD_OP_ZERO, flags); @@ -737,7 +737,7 @@ tid_t Objecter::zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, // lock ops -tid_t Objecter::lock(int op, object_t oid, int flags, ceph_object_layout ol, vector &snaps, +tid_t Objecter::lock(int op, object_t oid, int flags, ceph_object_layout ol, const vector &snaps, Context *onack, Context *oncommit) { OSDModify *l = prepare_modify(snaps, op, flags); diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 838030fb167ce..bb8ff9c91d1aa 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -73,7 +73,7 @@ class Objecter { list extents; vector snaps; int inc_lock; - OSDOp(vector& s) : snaps(s), inc_lock(0) {} + OSDOp(const vector& s) : snaps(s), inc_lock(0) {} virtual ~OSDOp() {} }; @@ -85,13 +85,13 @@ class Objecter { map read_data; // bits of data as they come back int flags; - OSDRead(vector &s, bufferlist *b, int f) : OSDOp(s), bl(b), onfinish(0), flags(f) { + OSDRead(const vector &s, bufferlist *b, int f) : OSDOp(s), bl(b), onfinish(0), flags(f) { if (bl) bl->clear(); } }; - OSDRead *prepare_read(vector& snaps, bufferlist *b, int f) { + OSDRead *prepare_read(const vector& snaps, bufferlist *b, int f) { return new OSDRead(snaps, b, f); } @@ -101,10 +101,10 @@ class Objecter { __u64 *size; // where the size goes. int flags; Context *onfinish; - OSDStat(vector &sn, __u64 *s, int f) : OSDOp(sn), tid(0), size(s), flags(f), onfinish(0) { } + OSDStat(const vector &sn, __u64 *s, int f) : OSDOp(sn), tid(0), size(s), flags(f), onfinish(0) { } }; - OSDStat *prepare_stat(vector& snaps, __u64 *s, int f) { + OSDStat *prepare_stat(const vector& snaps, __u64 *s, int f) { return new OSDStat(snaps, s, f); } @@ -120,10 +120,10 @@ class Objecter { map tid_version; map waitfor_commit; - OSDModify(vector& sn, int o, int f) : OSDOp(sn) ,op(o), flags(f), onack(0), oncommit(0) {} + OSDModify(const vector& sn, int o, int f) : OSDOp(sn) ,op(o), flags(f), onack(0), oncommit(0) {} }; - OSDModify *prepare_modify(vector& snaps, int o, int f) { + OSDModify *prepare_modify(const vector& snaps, int o, int f) { return new OSDModify(snaps, o, f); } @@ -131,10 +131,10 @@ class Objecter { class OSDWrite : public OSDModify { public: bufferlist bl; - OSDWrite(vector& sn, bufferlist &b, int f) : OSDModify(sn, CEPH_OSD_OP_WRITE, f), bl(b) {} + OSDWrite(const vector& sn, bufferlist &b, int f) : OSDModify(sn, CEPH_OSD_OP_WRITE, f), bl(b) {} }; - OSDWrite *prepare_write(vector& snaps, bufferlist &b, int f) { + OSDWrite *prepare_write(const vector& snaps, bufferlist &b, int f) { return new OSDWrite(snaps, b, f); } @@ -237,15 +237,15 @@ class Objecter { tid_t modifyx(OSDModify *wr, Context *onack, Context *oncommit); // even lazier - tid_t read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector& snaps, bufferlist *bl, int flags, + tid_t read(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector& snaps, bufferlist *bl, int flags, Context *onfinish); - tid_t write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector& snaps, bufferlist &bl, int flags, + tid_t write(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector& snaps, bufferlist &bl, int flags, Context *onack, Context *oncommit); - tid_t zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, vector& snaps, int flags, + tid_t zero(object_t oid, __u64 off, size_t len, ceph_object_layout ol, const vector& snaps, int flags, Context *onack, Context *oncommit); - tid_t stat(object_t oid, __u64 *size, ceph_object_layout ol, vector& snaps, int flags, Context *onfinish); + tid_t stat(object_t oid, __u64 *size, ceph_object_layout ol, const vector& snaps, int flags, Context *onfinish); - tid_t lock(int op, object_t oid, int flags, ceph_object_layout ol, vector& snaps, Context *onack, Context *oncommit); + tid_t lock(int op, object_t oid, int flags, ceph_object_layout ol, const vector& snaps, Context *onack, Context *oncommit); void ms_handle_failure(Message *m, entity_name_t dest, const entity_inst_t& inst); -- 2.39.5