]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: possible fix for rare problem where osd boot messages are double-logged.
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 29 Jan 2010 21:05:44 +0000 (13:05 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Fri, 29 Jan 2010 22:11:21 +0000 (14:11 -0800)
From Sage.

src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index a7f1c169f9b0c35d0de8a5653a274434bc29e9b5..f62b98bcdb2d767ee7b6de40c577dfd816c84c2f 100644 (file)
@@ -433,6 +433,10 @@ bool OSDMonitor::prepare_boot(MOSDBoot *m)
     pending_inc.new_down[from] = false;
     
     paxos->wait_for_commit(new C_RetryMessage(this, m));
+  } else if (pending_inc.new_up.count(from)) {
+    // already prepared, just wait
+    dout(7) << "prepare_boot already prepared, waiting on " << m->get_orig_source_addr() << dendl;
+    paxos->wait_for_commit(new C_Booted(this, m, false));
   } else {
     // mark new guy up.
     down_pending_out.erase(from);  // if any
index 3632035e97025565ef4cef7c3ead85819a1609f4..1c5f50414f17bd424859fce99104c6148befcf82 100644 (file)
@@ -93,11 +93,12 @@ private:
   struct C_Booted : public Context {
     OSDMonitor *cmon;
     MOSDBoot *m;
-    C_Booted(OSDMonitor *cm, MOSDBoot *m_) : 
-      cmon(cm), m(m_) {}
+    bool logit;
+    C_Booted(OSDMonitor *cm, MOSDBoot *m_, bool l=true) : 
+      cmon(cm), m(m_), logit(l) {}
     void finish(int r) {
       if (r >= 0)
-       cmon->_booted(m, true);
+       cmon->_booted(m, logit);
       else
        cmon->dispatch((PaxosServiceMessage*)m);
     }