]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: delay pg list on a snapid until missing is empty
authorSamuel Just <samuel.just@dreamhost.com>
Fri, 2 Dec 2011 23:42:01 +0000 (15:42 -0800)
committerSamuel Just <samuel.just@dreamhost.com>
Fri, 9 Dec 2011 21:44:32 +0000 (13:44 -0800)
We cannot determine from the missing set whether an object existed
at a given snap.

Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
src/osd/PG.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index f95eb18dd2c56224e2b2b402c89a9b67990cb57c..53174c9a4230c975e664f14bf4ce3d026bb6ae64 100644 (file)
@@ -1368,6 +1368,7 @@ protected:
 
   // pg waiters
   list<class Message*>            waiting_for_active;
+  list<class Message*>            waiting_for_all_missing;
   map<hobject_t, list<class Message*> > waiting_for_missing_object,
                                         waiting_for_degraded_object;
   map<eversion_t,list<Message*> > waiting_for_ondisk;
index e4131f2bbab1029a9a86aa3462af9fe929ae7857..1d6ec96ee601abf888bb2f85012ae7136ddb1400 100644 (file)
@@ -119,6 +119,11 @@ void ReplicatedPG::wait_for_missing_object(const hobject_t& soid, Message *m)
   waiting_for_missing_object[soid].push_back(m);
 }
 
+void ReplicatedPG::wait_for_all_missing(Message *m)
+{
+  waiting_for_all_missing.push_back(m);
+}
+
 bool ReplicatedPG::is_degraded_object(const hobject_t& soid)
 {
   if (missing.missing.count(soid))
@@ -227,6 +232,20 @@ int ReplicatedPG::get_pgls_filter(bufferlist::iterator& iter, PGLSFilter **pfilt
 
 
 // ==========================================================
+bool ReplicatedPG::pg_op_must_wait(MOSDOp *op)
+{
+  if (missing.missing.empty())
+    return false;
+  for (vector<OSDOp>::iterator p = op->ops.begin(); p != op->ops.end(); ++p) {
+    if (p->op.op == CEPH_OSD_OP_PGLS) {
+      if (op->get_snapid() != CEPH_NOSNAP) {
+       return true;
+      }
+    }
+  }
+  return false;
+}
+
 void ReplicatedPG::do_pg_op(MOSDOp *op)
 {
   dout(10) << "do_pg_op " << *op << dendl;
@@ -400,8 +419,13 @@ void ReplicatedPG::get_src_oloc(const object_t& oid, const object_locator_t& olo
  */
 void ReplicatedPG::do_op(MOSDOp *op) 
 {
-  if ((op->get_rmw_flags() & CEPH_OSD_FLAG_PGOP))
+  if ((op->get_rmw_flags() & CEPH_OSD_FLAG_PGOP)) {
+    if (pg_op_must_wait(op)) {
+      wait_for_all_missing(op);
+      return;
+    }
     return do_pg_op(op);
+  }
 
   dout(10) << "do_op " << *op << (op->may_write() ? " may_write" : "") << dendl;
 
@@ -4447,6 +4471,10 @@ void ReplicatedPG::sub_op_push(MOSDSubOp *op)
       dout(20) << " kicking waiters on " << soid << dendl;
       osd->requeue_ops(this, waiting_for_missing_object[soid]);
       waiting_for_missing_object.erase(soid);
+      if (missing.missing.size() == 0) {
+       osd->requeue_ops(this, waiting_for_all_missing);
+       waiting_for_all_missing.clear();
+      }
     } else {
       dout(20) << " no waiters on " << soid << dendl;
       /*for (hash_map<hobject_t,list<class Message*> >::iterator p = waiting_for_missing_object.begin();
@@ -4654,8 +4682,12 @@ void ReplicatedPG::mark_all_unfound_lost(int what)
 
 void ReplicatedPG::_finish_mark_all_unfound_lost(list<ObjectContext*>& obcs)
 {
-  dout(10) << "_finish_mark_all_unfound_lost " << dendl;
   lock();
+  dout(10) << "_finish_mark_all_unfound_lost " << dendl;
+
+  osd->requeue_ops(this, waiting_for_all_missing);
+  waiting_for_all_missing.clear();
+
   while (!obcs.empty()) {
     ObjectContext *obc = obcs.front();
     put_object_context(obc);
@@ -4733,6 +4765,8 @@ void ReplicatedPG::on_change()
   // take object waiters
   requeue_object_waiters(waiting_for_missing_object);
   requeue_object_waiters(waiting_for_degraded_object);
+  osd->requeue_ops(this, waiting_for_all_missing);
+  waiting_for_all_missing.clear();
 
   // clear pushing/pulling maps
   pushing.clear();
index c51279247ccd1b3548506e3c0edd98f00d1b889a..3077ddb2eaedf7c69ba011045464f4c7dc8ac5e0 100644 (file)
@@ -725,6 +725,7 @@ public:
 
 
   void do_op(MOSDOp *op);
+  bool pg_op_must_wait(MOSDOp *op);
   void do_pg_op(MOSDOp *op);
   void do_sub_op(MOSDSubOp *op);
   void do_sub_op_reply(MOSDSubOpReply *op);
@@ -809,6 +810,7 @@ public:
 
   bool is_missing_object(const hobject_t& oid);
   void wait_for_missing_object(const hobject_t& oid, Message *op);
+  void wait_for_all_missing(Message *op);
 
   bool is_degraded_object(const hobject_t& oid);
   void wait_for_degraded_object(const hobject_t& oid, Message *op);