summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoao Eduardo Luis <joao.luis@inktank.com>2013-09-17 17:58:20 +0100
committerSage Weil <sage@inktank.com>2013-09-23 14:19:40 -0700
commit06c58132199ed22413b509dfa751321ccdb24225 (patch)
tree3fa5c63c76d6c57a80e296ab18228f833d4b86fe
parent65bbcaf4b68790dae4506c1f5db237077e1ff0ae (diff)
downloadceph-06c58132199ed22413b509dfa751321ccdb24225.tar.gz
mon: OSDMonitor: multiple rebuilt full maps per transaction
Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com> (cherry picked from commit 0d20cae0be701c5b6151a26ee5e4fe24d89aa20a)
-rw-r--r--src/mon/OSDMonitor.cc28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index 20b16c26fa8..5339472f873 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -179,8 +179,9 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap)
}
// walk through incrementals
+ MonitorDBStore::Transaction *t = NULL;
+ size_t tx_size = 0;
while (version > osdmap.epoch) {
- MonitorDBStore::Transaction t;
bufferlist inc_bl;
int err = get_version(osdmap.epoch+1, inc_bl);
assert(err == 0);
@@ -191,20 +192,35 @@ void OSDMonitor::update_from_paxos(bool *need_bootstrap)
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);
- put_version_latest_full(&t, osdmap.epoch);
+ 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 (!t.empty())
- mon->store->apply_transaction(t);
+
+ 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 != NULL) {
+ mon->store->apply_transaction(*t);
+ delete t;
}
for (int o = 0; o < osdmap.get_max_osd(); o++) {