From: Sage Weil Date: Wed, 6 Aug 2008 18:33:56 +0000 (-0700) Subject: Merge commit 'origin/unstable' into snap X-Git-Tag: v0.4~318 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ea422a610f5fea8a1915903c299417d95f75dfac;p=ceph.git Merge commit 'origin/unstable' into snap Conflicts: src/osd/OSDMap.cc src/osd/ReplicatedPG.cc --- ea422a610f5fea8a1915903c299417d95f75dfac diff --cc src/include/object.h index 01528ad69879,c3f7162436c1..a5f5c9b7294e --- a/src/include/object.h +++ b/src/include/object.h @@@ -38,13 -36,13 +36,13 @@@ struct object_t struct { uint64_t ino; // "file" identifier uint32_t bno; // "block" in that "file" - objectrev_t rev; // revision. normally ctime (as epoch). + uint64_t snap; // snap revision. } __attribute__ ((packed)); - }; + } __attribute__ ((packed)); - object_t() : ino(0), bno(0), rev(0) {} - object_t(uint64_t i, uint32_t b) : ino(i), bno(b), rev(0) {} - object_t(uint64_t i, uint32_t b, uint64_t r) : ino(i), bno(b), rev(r) {} + object_t() : ino(0), bno(0), snap(0) {} + object_t(uint64_t i, uint32_t b) : ino(i), bno(b), snap(0) {} + object_t(uint64_t i, uint32_t b, uint64_t r) : ino(i), bno(b), snap(r) {} // IMPORTANT: make this match struct ceph_object **** object_t(const ceph_object& co) { diff --cc src/os/Fake.h index 3ac968de1097,cd96c6596ad2..fa1398bdabb4 --- a/src/os/Fake.h +++ b/src/os/Fake.h @@@ -130,16 -130,16 +130,24 @@@ class FakeAttrs bl.copy(0, l, (char*)value); return l; } - return -1; + return -ENODATA; + } + int getattr(const char *name, bufferptr &bp) { + string n = name; + if (attrs.count(n)) { + bp = attrs[n]; + return bp.length(); + } + return -ENODATA; } + int getattr(const char *name, bufferlist& bl) { + string n = name; + if (attrs.count(n)) { + bl.append(attrs[n]); + return bl.length(); + } + return -1; + } int getattrs(map& aset) { aset = attrs; return 0; diff --cc src/osd/ReplicatedPG.cc index 45e3763bf05e,dba5807fcd27..0e6bd839b4a5 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@@ -606,59 -654,30 +606,58 @@@ void ReplicatedPG::prepare_transaction( if (op == CEPH_OSD_OP_WRNOOP) return; - - // raise last_complete? - if (info.last_complete == info.last_update) - info.last_complete = version; - - // raise last_update. - assert(version > info.last_update); - info.last_update = version; + // clone? + if (poid.oid.snap) { + assert(poid.oid.snap == NOSNAP); + dout(20) << "snaps=" << snaps << " follows_snap=" << follows_snap << dendl;; + + if (follows_snap && + !snaps.empty() && snaps[0] > follows_snap) { + // clone + pobject_t coid = poid; + coid.oid.snap = snaps[0]; + + unsigned l; + for (l=1; l follows_snap; l++) ; + vector csnaps(l); + for (unsigned i=0; i crev) { - assert(0); - pobject_t noid = poid; // FIXME **** - noid.oid.rev = rev; - dout(10) << "prepare_op_transaction cloning " << poid << " crev " << crev << " to " << noid << dendl; - t.clone(info.pgid, poid, noid); - did_clone = true; - } - - // apply the op + assert(at_version > log.top); + log.add(logentry); + assert(log.top == at_version); + + // prepare op switch (op) { // -- locking -- @@@ -736,28 -755,21 +735,30 @@@ } // object collection, version - if (op == CEPH_OSD_OP_DELETE) { - // remove object from c - //t.collection_remove(pgid, poid); - } else { - // add object to c - //t.collection_add(pgid, poid); - + if (op != CEPH_OSD_OP_DELETE) { // object version - t.setattr(info.pgid, poid, "version", &version, sizeof(version)); + t.setattr(info.pgid, poid, "version", &at_version, sizeof(at_version)); - // set object crev - if (crev == 0 || // new object - did_clone) // we cloned - t.setattr(info.pgid, poid, "crev", &rev, sizeof(rev)); + if (snaps.size()) + t.setattr(info.pgid, poid, "follows_snap", &snaps[0], snaps.size() * sizeof(snapid_t)); } + + // update pg info: + // raise last_complete only if we were previously up to date + if (info.last_complete == info.last_update) + info.last_complete = at_version; + + // raise last_update. + assert(at_version > info.last_update); + info.last_update = at_version; + + // write pg info - t.collection_setattr(info.pgid, "info", &info, sizeof(info)); ++ bufferlist infobl; ++ ::encode(info, infobl); ++ t.collection_setattr(info.pgid, "info", infobl); + + // prepare log append + append_log(t, logentry, trim_to); } diff --cc src/vstartnew.sh index ebf928d4946a,d4f0e2ca4db4..465742492e8e --- a/src/vstartnew.sh +++ b/src/vstartnew.sh @@@ -34,11 -34,11 +34,11 @@@ don $CEPH_BIN/osdmaptool --clobber --createsimple .ceph_monmap 4 --print .ceph_osdmap # --pgbits 2 $CEPH_BIN/cmonctl osd setmap -i .ceph_osdmap -for osd in 0 #1 2 3 #4 5 6 7 8 9 10 11 12 13 14 15 +for osd in 0 #1 #2 3 #4 5 6 7 8 9 10 11 12 13 14 15 do $CEPH_BIN/cosd --mkfs_for_osd $osd dev/osd$osd # initialize empty object store - #valgrind --leak-check=full --show-reachable=yes $CEPH_BIN/cosd dev/osd$osd --debug_ms 1 --debug_osd 20 --debug_filestore 10 1>out/o$osd & #--debug_osd 40 - $CEPH_BIN/cosd -m $IP:12345 dev/osd$osd -d --debug_ms 1 --debug_osd 20 # --debug_filestore 10 + echo valgrind --leak-check=full --show-reachable=yes $CEPH_BIN/cosd dev/osd$osd --debug_ms 1 --debug_osd 20 --debug_filestore 10 --debug_ebofs 20 #1>out/o$osd #& #--debug_osd 40 + #$CEPH_BIN/cosd -m $IP:12345 dev/osd$osd -d --debug_ms 1 --debug_osd 20 # --debug_filestore 10 done # mds