bootstrap();
}
-/**
- *
- */
-void Monitor::sync_store_init()
+void Monitor::sync_obtain_latest_monmap(bufferlist &bl)
{
- MonitorDBStore::Transaction t;
- t.put("mon_sync", "in_sync", 1);
+ dout(1) << __func__ << dendl;
- bufferlist latest_monmap;
- int err = monmon()->get_monmap(latest_monmap);
+ MonMap latest_monmap;
+
+ // Grab latest monmap from MonmapMonitor
+ bufferlist monmon_bl;
+ int err = monmon()->get_monmap(monmon_bl);
if (err < 0) {
if (err != -ENOENT) {
derr << __func__
<< " something wrong happened while reading the store: "
<< cpp_strerror(err) << dendl;
assert(0 == "error reading the store");
- return; // this is moot
- } else {
- dout(10) << __func__ << " backup current monmap" << dendl;
- monmap->encode(latest_monmap, CEPH_FEATURES_ALL);
}
+ } else {
+ latest_monmap.decode(monmon_bl);
+ }
+
+ // Grab last backed up monmap (if any) and compare epochs
+ if (store->exists("mon_sync", "latest_monmap")) {
+ bufferlist backup_bl;
+ int err = store->get("mon_sync", "latest_monmap", backup_bl);
+ if (err < 0) {
+ assert(err != -ENOENT);
+ derr << __func__
+ << " something wrong happened while reading the store: "
+ << cpp_strerror(err) << dendl;
+ assert(0 == "error reading the store");
+ }
+ assert(backup_bl.length() > 0);
+
+ MonMap backup_monmap;
+ backup_monmap.decode(backup_bl);
+
+ if (backup_monmap.epoch > latest_monmap.epoch)
+ latest_monmap = backup_monmap;
}
- t.put("mon_sync", "latest_monmap", latest_monmap);
+ // Check if our current monmap's epoch is greater than the one we've
+ // got so far.
+ if (monmap->epoch > latest_monmap.epoch)
+ latest_monmap = *monmap;
+
+ assert(latest_monmap.epoch > 0);
+ dout(1) << __func__ << " obtained monmap e" << latest_monmap.epoch << dendl;
+
+ latest_monmap.encode(bl, CEPH_FEATURES_ALL);
+}
+
+/**
+ *
+ */
+void Monitor::sync_store_init()
+{
+ MonitorDBStore::Transaction t;
+ t.put("mon_sync", "in_sync", 1);
+
+ bufferlist backup_monmap;
+ sync_obtain_latest_monmap(backup_monmap);
+ assert(backup_monmap.length() > 0);
+
+ t.put("mon_sync", "latest_monmap", backup_monmap);
store->apply_transaction(t);
}