diff options
author | Sage Weil <sage@inktank.com> | 2013-09-23 14:12:33 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-23 14:12:33 -0700 |
commit | da42355a6d8ef7197ae6f9f3bef2eb6f9f8ca9cb (patch) | |
tree | e06ecc55343fa8f3a93035c6134a683ffa8fac1f | |
parent | 3c64784e3fcbd0530acf14c7e3b37cae4cd54a91 (diff) | |
parent | 0d20cae0be701c5b6151a26ee5e4fe24d89aa20a (diff) | |
download | ceph-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.cc | 29 |
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)) { |