]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: use brute force to find a sync provider if our first one fails
authorGreg Farnum <greg@inktank.com>
Fri, 26 Apr 2013 19:32:10 +0000 (12:32 -0700)
committerGreg Farnum <greg@inktank.com>
Fri, 26 Apr 2013 19:32:10 +0000 (12:32 -0700)
We try and select a random monitor first, but if that fails we should
make sure that nobody's available before asserting.

Fixes #4812

Signed-off-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/mon/Monitor.cc

index c2cde236de257d04f0e5f2bbec2154ebfc0d8f36..787a804db0ca6be3a0631517232d5cc1e915f3d1 100644 (file)
@@ -1106,6 +1106,17 @@ void Monitor::sync_timeout(entity_inst_t &entity)
       }
     }
 
+    // well that sucks. Let's see if we can find a monitor to connect to
+    for (int i = 0; i < monmap->size(); ++i) {
+      entity_inst_t i_inst = monmap->get_inst(i);
+      if (i != rank && i_inst != entity) {
+       sync_provider->entity = i_inst;
+       sync_state = SYNC_STATE_START;
+       sync_start_chunks(sync_provider);
+       return;
+      }
+    }
+
     assert(0 == "Unable to find a new monitor to connect to. Not cool.");
   } else if (sync_role & SYNC_ROLE_PROVIDER) {
     dout(10) << __func__ << " cleanup " << entity << dendl;