]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
fixed osd recovery bug
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 19 Nov 2007 23:22:24 +0000 (23:22 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Mon, 19 Nov 2007 23:22:24 +0000 (23:22 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2091 29311d96-e01e-0410-9327-a35deaab8ce9

trunk/ceph/osd/OSD.cc
trunk/ceph/osd/PG.h
trunk/ceph/osd/ReplicatedPG.cc
trunk/ceph/osd/ReplicatedPG.h

index 77451c086926de5332e8dcfdab581bcb3da51245..52db665a68d5cd14503db5b66581546d9b64282e 100644 (file)
@@ -1390,7 +1390,7 @@ void OSD::advance_map(ObjectStore::Transaction& t)
 
       // -- there was a change! --
       pg->lock();
-      
+
       int oldrole = pg->get_role();
       int oldprimary = pg->get_primary();
       int oldacker = pg->get_acker();
@@ -1416,9 +1416,9 @@ void OSD::advance_map(ObjectStore::Transaction& t)
       // reset primary state?
       if (oldrole == 0 || pg->get_role() == 0)
         pg->clear_primary_state();
-      
-      // apply any repops in progress.
-      if (oldacker == whoami) {
+
+      pg->on_change();
+      if (oldacker != pg->get_acker() && oldacker == whoami) {
        pg->on_acker_change();
       }
 
index 4fac4a468832e581a2a27015d05dd9f5e2394eb7..3a8ebb9b8e4b1625e84d4b09f43a22fd04fc8984 100644 (file)
@@ -660,6 +660,7 @@ public:
 
   virtual void on_acker_change() = 0;
   virtual void on_role_change() = 0;
+  virtual void on_change() = 0;
 };
 
 
index 7b5bdf581d643cf13dab8a9eb1d1678f86fb60e8..07ab10fadbd20545ed8b25ea12e53eb6dbc09932 100644 (file)
@@ -1673,34 +1673,30 @@ void ReplicatedPG::note_failed_osd(int o)
 void ReplicatedPG::on_acker_change()
 {
   dout(10) << "on_acker_change" << dendl;
+}
 
-  if (g_conf.osd_rep == OSD_REP_PRIMARY) {
-    // we're fine.
-    // note that note_failed_osd() above shoudl ahve implicitly acked/committed
-    // from the failed guy.
-  } else {
-    // for splay or chain replication, any change is significant. 
-    // apply repops
-    for (hash_map<tid_t,RepGather*>::iterator p = rep_gather.begin();
-        p != rep_gather.end();
-        p++) {
-      if (!p->second->applied)
-       apply_repop(p->second);
-      delete p->second->op;
-      delete p->second;
-    }
-    rep_gather.clear();
-    
-    // and repop waiters
-    for (hash_map<tid_t, list<Message*> >::iterator p = waiting_for_repop.begin();
-        p != waiting_for_repop.end();
-        p++)
-      for (list<Message*>::iterator pm = p->second.begin();
-          pm != p->second.end();
-          pm++)
-       delete *pm;
-    waiting_for_repop.clear();
+void ReplicatedPG::on_change()
+{
+  // apply repops
+  for (hash_map<tid_t,RepGather*>::iterator p = rep_gather.begin();
+       p != rep_gather.end();
+       p++) {
+    if (!p->second->applied)
+      apply_repop(p->second);
+    delete p->second->op;
+    delete p->second;
   }
+  rep_gather.clear();
+  
+  // and discard repop waiters (chain/splay artifact)
+  for (hash_map<tid_t, list<Message*> >::iterator p = waiting_for_repop.begin();
+       p != waiting_for_repop.end();
+       p++)
+    for (list<Message*>::iterator pm = p->second.begin();
+        pm != p->second.end();
+        pm++)
+      delete *pm;
+  waiting_for_repop.clear();
 }
 
 
index ab44026b43fb2210b89c8864eb1958231b04a8e1..628b3a6eeda455480597647c38247abbeefda195 100644 (file)
@@ -150,7 +150,7 @@ public:
   void note_failed_osd(int o);
   void on_acker_change();
   void on_role_change();
-
+  void on_change();
 };