summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-09-23 14:12:33 -0700
committerSage Weil <sage@inktank.com>2013-09-23 14:12:33 -0700
commitda42355a6d8ef7197ae6f9f3bef2eb6f9f8ca9cb (patch)
treee06ecc55343fa8f3a93035c6134a683ffa8fac1f
parent3c64784e3fcbd0530acf14c7e3b37cae4cd54a91 (diff)
parent0d20cae0be701c5b6151a26ee5e4fe24d89aa20a (diff)
downloadceph-da42355a6d8ef7197ae6f9f3bef2eb6f9f8ca9cb.tar.gz
Merge pull request #599 from ceph/wip-6323
mon: OSDMonitor: fix #6322 and #6323 Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mon/OSDMonitor.cc29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index 1bbf628fe7e..d12ba22e462 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -179,32 +179,49 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap)
}
// walk through incrementals
- MonitorDBStore::Transaction t;
+ MonitorDBStore::Transaction *t = NULL;
+ size_t tx_size = 0;
while (version > osdmap.epoch) {
bufferlist inc_bl;
int err = get_version(osdmap.epoch+1, inc_bl);
assert(err == 0);
assert(inc_bl.length());
-
+
dout(7) << "update_from_paxos applying incremental " << osdmap.epoch+1 << dendl;
OSDMap::Incremental inc(inc_bl);
err = osdmap.apply_incremental(inc);
assert(err == 0);
+ if (t == NULL)
+ t = new MonitorDBStore::Transaction;
+
// write out the full map for all past epochs
bufferlist full_bl;
osdmap.encode(full_bl);
- put_version_full(&t, osdmap.epoch, full_bl);
+ tx_size += full_bl.length();
+
+ put_version_full(t, osdmap.epoch, full_bl);
+ put_version_latest_full(t, osdmap.epoch);
// share
dout(1) << osdmap << dendl;
if (osdmap.epoch == 1) {
- t.erase("mkfs", "osdmap");
+ t->erase("mkfs", "osdmap");
+ }
+
+ if (tx_size > g_conf->mon_sync_max_payload_size*2) {
+ mon->store->apply_transaction(*t);
+ delete t;
+ t = NULL;
+ tx_size = 0;
}
}
- if (!t.empty())
- mon->store->apply_transaction(t);
+
+ if (t != NULL) {
+ mon->store->apply_transaction(*t);
+ delete t;
+ }
for (int o = 0; o < osdmap.get_max_osd(); o++) {
if (osdmap.is_down(o)) {