]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: misc fixes.. basic cloning works
authorSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 05:11:21 +0000 (22:11 -0700)
committerSage Weil <sage@newdream.net>
Thu, 3 Jul 2008 05:11:21 +0000 (22:11 -0700)
src/client/Client.cc
src/messages/MOSDSubOp.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osdc/Objecter.cc
src/vstartnew.sh

index d9d3939bcb795054a3a96ae5b6bd645a9dbd2a61..25c4c8e60a2a124b7d0fa9dd2cbbeac71a48b1d0 100644 (file)
@@ -3319,6 +3319,14 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf)
     unsafe_sync_write++;
     in->get_cap_ref(CEPH_CAP_WRBUFFER);
     
+    // hack
+    if (1) {
+      static int a = 0;
+      in->snaprealm->snaps.insert(in->snaprealm->snaps.begin(), ++a);
+      in->snaprealm->snaps.insert(in->snaprealm->snaps.begin(), ++a);
+      dout(10) << "snaps now " << in->snaprealm->snaps << dendl;
+    }
+
     filer->write(in->inode.ino, &in->inode.layout, 
                 CEPH_NOSNAP,
                 in->snaprealm->snaps,
index f308cd88cad31e70b835fbbbfe8ffa30729a47b7..cb46b7daf1d93390fbfc2d66b40f535a06ad0618 100644 (file)
@@ -40,6 +40,7 @@ public:
   tid_t rep_tid;
   eversion_t version;
   uint32_t inc_lock;
+
   snapid_t follows_snap;
   vector<snapid_t> snaps;
   
@@ -119,7 +120,8 @@ public:
     out << "osd_sub_op(" << reqid
        << " " << MOSDOp::get_opname(op)
        << " " << poid
-       << " av" << version;    
+       << " v " << version
+       << " follows_snap=" << follows_snap << " snaps=" << snaps;    
     if (length) out << " " << offset << "~" << length;
     out << ")";
   }
index c27c5d2cbad786854e45dc4c380fe51067b68cac..407594dd5beb81c3cc11dd17a3ec2fe524250898 100644 (file)
@@ -619,13 +619,13 @@ void ReplicatedPG::prepare_transaction(ObjectStore::Transaction& t, osd_reqid_t
       
       unsigned l;
       for (l=1; l<snaps.size() && snaps[l] > follows_snap; l++) ;
-      vector<snapid_t> csnaps;
-      csnaps.insert(snaps.begin(), l);
+      vector<snapid_t> csnaps(l);
+      for (unsigned i=0; i<l; i++)
+       csnaps[i] = snaps[i];
 
       // log clone
       dout(10) << "cloning to " << coid << " v " << at_version << " csnaps=" << csnaps << dendl;
       Log::Entry cloneentry(PG::Log::Entry::CLONE, coid.oid, at_version, reqid);
-      log.add(cloneentry);
       dout(10) << "prepare_transaction " << cloneentry << dendl;
       log.add(cloneentry);
       assert(log.top == at_version);
@@ -925,10 +925,12 @@ void ReplicatedPG::issue_repop(RepGather *repop, int dest, utime_t now)
   osd->messenger->send_message(wr, osd->osdmap->get_inst(dest));
 }
 
-ReplicatedPG::RepGather *ReplicatedPG::new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv)
+ReplicatedPG::RepGather *ReplicatedPG::new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv,
+                                                     snapid_t follows_snap, vector<snapid_t> &snaps)
 {
   dout(10) << "new_rep_gather rep_tid " << rep_tid << " on " << *op << dendl;
-  RepGather *repop = new RepGather(op, rep_tid, nv, info.last_complete);
+  RepGather *repop = new RepGather(op, rep_tid, nv, info.last_complete,
+                                  follows_snap, snaps);
   
   // osds. commits all come to me.
   for (unsigned i=0; i<acting.size(); i++) {
@@ -942,7 +944,7 @@ ReplicatedPG::RepGather *ReplicatedPG::new_rep_gather(MOSDOp *op, tid_t rep_tid,
     int osd = acting[i];
     repop->waitfor_ack.insert(osd);
   }
-  
+
   repop->start = g_clock.now();
 
   rep_gather[repop->rep_tid] = repop;
@@ -1198,7 +1200,7 @@ void ReplicatedPG::op_modify(MOSDOp *op)
 
   // issue replica writes
   tid_t rep_tid = osd->get_tid();
-  RepGather *repop = new_rep_gather(op, rep_tid, av);
+  RepGather *repop = new_rep_gather(op, rep_tid, av, follows, op->get_snaps());
   for (unsigned i=1; i<acting.size(); i++)
     issue_repop(repop, acting[i], now);
 
index f4f33c103681fd8af41d27dd3fa621fa45cbeb5b..8a093609c5e486ae58ee281c7883fc5f8532098a 100644 (file)
@@ -50,11 +50,13 @@ public:
     eversion_t       pg_local_last_complete;
     map<int,eversion_t> pg_complete_thru;
     
-    RepGather(MOSDOp *o, tid_t rt, eversion_t av, eversion_t lc) :
+    RepGather(MOSDOp *o, tid_t rt, eversion_t av, eversion_t lc,
+             snapid_t fs, vector<snapid_t> &sn) :
       op(o), rep_tid(rt),
       applied(false),
       sent_ack(false), sent_commit(false),
       at_version(av), 
+      follows_snap(fs), snaps(sn),
       pg_local_last_complete(lc) { }
 
     bool can_send_ack() { 
@@ -83,7 +85,8 @@ protected:
   void apply_repop(RepGather *repop);
   void put_rep_gather(RepGather*);
   void issue_repop(RepGather *repop, int dest, utime_t now);
-  RepGather *new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv);
+  RepGather *new_rep_gather(MOSDOp *op, tid_t rep_tid, eversion_t nv,
+                           snapid_t follows_snap, vector<snapid_t> &snaps);
   void repop_ack(RepGather *repop,
                  int result, bool commit,
                  int fromosd, eversion_t pg_complete_thru=eversion_t(0,0));
index acc9ef1f1b69421e9410aa087188f0d7bb35253b..71315d404c14b30f0f11facd4a33e6780ba2e1b2 100644 (file)
@@ -377,6 +377,7 @@ tid_t Objecter::stat_submit(OSDStat *st)
     MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, last_tid,
                           ex.oid, ex.layout, osdmap->get_epoch(), 
                           CEPH_OSD_OP_STAT, flags);
+    m->get_snaps() = st->snaps;
     if (inc_lock > 0) {
       st->inc_lock = inc_lock;
       m->set_inc_lock(inc_lock);
@@ -505,6 +506,7 @@ tid_t Objecter::readx_submit(OSDRead *rd, ObjectExtent &ex, bool retry)
     MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, last_tid,
                           ex.oid, ex.layout, osdmap->get_epoch(), 
                           CEPH_OSD_OP_READ, flags);
+    m->get_snaps() = rd->snaps;
     if (inc_lock > 0) {
       rd->inc_lock = inc_lock;
       m->set_inc_lock(inc_lock);
@@ -808,6 +810,7 @@ tid_t Objecter::modifyx_submit(OSDModify *wr, ObjectExtent &ex, tid_t usetid)
     MOSDOp *m = new MOSDOp(messenger->get_myinst(), client_inc, tid,
                           ex.oid, ex.layout, osdmap->get_epoch(),
                           wr->op, flags);
+    m->get_snaps() = wr->snaps;
     if (inc_lock > 0) {
       wr->inc_lock = inc_lock;
       m->set_inc_lock(inc_lock);
index 9378b688895e070446cbd910ba5f0e3fee62cf09..ebf88761b289707b235012a6aa874f4426d5cdac 100755 (executable)
@@ -34,7 +34,7 @@ done
 $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