]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: Monitor: make sure we backup a monmap during sync start
authorJoao Eduardo Luis <joao.luis@inktank.com>
Wed, 19 Jun 2013 01:50:45 +0000 (02:50 +0100)
committerSage Weil <sage@inktank.com>
Wed, 19 Jun 2013 04:58:36 +0000 (21:58 -0700)
First of all, we must find a monmap to backup.  The newest version.

Secondly, we must make sure we back it up before clearing the store.

Finally, we must make sure that we don't remove said backup while
clearing the store; otherwise, we would be out of a backup monmap if the
sync happened to fail (and if the monitor happened to be killed before a
new sync had finished).

This patch makes sure these conditions are met.

Fixes: #5256 (partially)
Backport: cuttlefish

Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
src/mon/Monitor.cc

index 9e910f52e7a76f42dd73ce0e1b81d034dc67f746..3465b3ae1ba3f26fe46e50cfd574f960ed5a3427 100644 (file)
@@ -1462,15 +1462,17 @@ void Monitor::sync_start(entity_inst_t &other)
   sync_role = SYNC_ROLE_REQUESTER;
   sync_state = SYNC_STATE_START;
 
+  // First init the store (grab the monmap and all that) and only then
+  // clear the store (except for the mon_sync prefix).  This avoids that
+  // we end up losing the monmaps from the store.
+  sync_store_init();
+
   // clear the underlying store, since we are starting a whole
   // sync process from the bare beginning.
   set<string> targets = get_sync_targets_names();
-  targets.insert("mon_sync");
   store->clear(targets);
 
 
-  sync_store_init();
-
   // assume 'other' as the leader. We will update the leader once we receive
   // a reply to the sync start.
   entity_inst_t leader = other;