]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: only register the ObjectContext if we go on to write
authorSage Weil <sage@newdream.net>
Mon, 25 May 2009 18:12:06 +0000 (11:12 -0700)
committerSage Weil <sage@newdream.net>
Mon, 25 May 2009 20:18:21 +0000 (13:18 -0700)
We only need it to be registered if we are carrying state over some period
of time, which isn't the case for reads.

src/messages/MOSDOp.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 7736419a5ebaee14b13d02ada143b2732a6069fc..a70365f273622aa9b3ae02640ff71c69d8082b2f 100644 (file)
@@ -180,7 +180,8 @@ public:
       out << "r";
     if (may_write())
       out << "w";
-    else
+
+    if (head.snapid != CEPH_NOSNAP)
       out << "@" << snapid_t((__u64)head.snapid);
 
     out << " " << ops;
index c491e744cacbc4aa711fdc7abc73accfd7109d42..a0789994870cca0b7e1dd09eb1d92316783d910d 100644 (file)
@@ -1838,11 +1838,12 @@ void ReplicatedPG::repop_ack(RepGather *repop, int result, int ack_type,
 
 ReplicatedPG::ObjectContext *ReplicatedPG::get_object_context(const sobject_t& soid, bool can_create)
 {
-  map<sobject_t, ObjectContext>::iterator p = object_contexts.find(soid);
+  map<sobject_t, ObjectContext*>::iterator p = object_contexts.find(soid);
   ObjectContext *obc;
   if (p != object_contexts.end()) {
-    obc = &p->second;
-    dout(10) << "get_object_context " << soid << " " << obc->ref << " -> " << (obc->ref+1) << dendl;
+    obc = p->second;
+    dout(10) << "get_object_context " << soid << " " << obc->ref
+            << " -> " << (obc->ref+1) << dendl;
   } else {
     // check disk
     struct stat st;
@@ -1850,7 +1851,7 @@ ReplicatedPG::ObjectContext *ReplicatedPG::get_object_context(const sobject_t& s
     if (r < 0 && !can_create)
       return 0;   // -ENOENT!
 
-    obc = &object_contexts[soid];
+    obc = new ObjectContext;
     obc->soid = soid;
 
     if (r == 0) {
@@ -1953,7 +1954,10 @@ void ReplicatedPG::put_object_context(ObjectContext *obc)
   if (obc->ref == 0) {
     assert(obc->waiting.empty());
 
-    object_contexts.erase(obc->soid);
+    if (obc->registered)
+      object_contexts.erase(obc->soid);
+    delete obc;
+
     if (object_contexts.empty())
       kick();
   }
@@ -2078,8 +2082,6 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc)
     noop = true;
   }
 
-  ctx->mtime = op->get_mtime();
-
   // version
   ctx->at_version = log.top;
   if (!noop) {
@@ -2089,12 +2091,16 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc)
     assert(ctx->at_version > log.top);
   }
 
-  // snap
-  ctx->snapc.seq = op->get_snap_seq();
-  ctx->snapc.snaps = op->get_snaps();
+  if (op->may_write()) {
+    ctx->mtime = op->get_mtime();
+    
+    // snap
+    ctx->snapc.seq = op->get_snap_seq();
+    ctx->snapc.snaps = op->get_snaps();
 
-  // set version in op, for benefit of client and our eventual reply
-  op->set_version(ctx->at_version);
+    // set version in op, for benefit of client and our eventual reply
+    op->set_version(ctx->at_version);
+  }
 
   dout(10) << "op_modify " << soid << " " << ctx->ops
            << " ov " << obc->oi.version << " av " << ctx->at_version 
@@ -2144,6 +2150,9 @@ void ReplicatedPG::op_modify(MOSDOp *op, ObjectContext *obc)
 
     log_op(ctx);
   }
+  
+  // continuing on to write path, make sure object context is registered
+  register_object_context(obc);
 
   if (ctx->indata.length()) {
     osd->logger->inc(l_osd_c_wr);
index 211145ee14dc34a3a9906e35def2f9d0ad763b33..c8f61cdd8233ef0e9af35a5bd771055eab9eee4a 100644 (file)
@@ -327,9 +327,15 @@ protected:
 
 
   // projected object info
-  map<sobject_t, ObjectContext> object_contexts;
+  map<sobject_t, ObjectContext*> object_contexts;
 
   ObjectContext *get_object_context(const sobject_t& soid, bool can_create=true);
+  void register_object_context(ObjectContext *obc) {
+    if (!obc->registered) {
+      obc->registered = true;
+      object_contexts[obc->soid] = obc;
+    }
+  }
   void put_object_context(ObjectContext *obc);
   int find_object_context(object_t oid, snapid_t snapid, ObjectContext **pobc, bool can_create);