From: Sage Weil Date: Thu, 9 Jan 2014 22:44:49 +0000 (-0800) Subject: mon: set next commit in mon command replies X-Git-Tag: v0.75~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8c5c55c8b47ee3c94c0dbcd82e0588ae629ba0ea;p=ceph.git mon: set next commit in mon command replies The mon command acks include a version that is used by the client to determine which version of the map they need to get or wait for in order to see the effects of their command. Current we are returning get_last_committed() everywhere, but we are about to commit something (and waiting for it), which will increase that value by one. As a result, clients are always getting epoch/version-1 instead of epoch. This manifested by a LibRadosTier.Promote test that failed becaues the OSD had the OSDMap updates adding the tier and overlay but not the final map change that set the cache-mode to writeback. I suspect this is also the cause of of spurious errors in the past where we've seen misdirected request errors that made no sense. Backport: emperor, dumpling Signed-off-by: Sage Weil Reviewed-by: Joao Eduardo Luis --- diff --git a/src/mon/AuthMonitor.cc b/src/mon/AuthMonitor.cc index 9f885589442..53bf47d4766 100644 --- a/src/mon/AuthMonitor.cc +++ b/src/mon/AuthMonitor.cc @@ -726,7 +726,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) ss << "imported keyring"; getline(ss, rs); err = 0; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "auth add" && !entity_name.empty()) { /* expected behavior: @@ -763,7 +764,7 @@ bool AuthMonitor::prepare_command(MMonCommand *m) if (inc.op == KeyServerData::AUTH_INC_ADD && inc.name == entity) { wait_for_finished_proposal( - new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + new Monitor::C_Command(mon, m, 0, rs, get_last_committed() + 1)); return true; } } @@ -848,7 +849,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) ss << "added key for " << auth_inc.name; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if ((prefix == "auth get-or-create-key" || prefix == "auth get-or-create") && @@ -900,7 +902,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) ::decode(auth_inc, q); if (auth_inc.op == KeyServerData::AUTH_INC_ADD && auth_inc.name == entity) { - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } @@ -935,7 +938,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) rdata.append(ds); getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, rdata, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, rdata, + get_last_committed() + 1)); return true; } else if (prefix == "auth caps" && !entity_name.empty()) { KeyServerData::Incremental auth_inc; @@ -957,7 +961,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) ss << "updated caps for " << auth_inc.name; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "auth del" && !entity_name.empty()) { KeyServerData::Incremental auth_inc; @@ -972,7 +977,8 @@ bool AuthMonitor::prepare_command(MMonCommand *m) ss << "updated"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } diff --git a/src/mon/LogMonitor.cc b/src/mon/LogMonitor.cc index b60656f5f92..65139d0bb5a 100644 --- a/src/mon/LogMonitor.cc +++ b/src/mon/LogMonitor.cc @@ -382,7 +382,8 @@ bool LogMonitor::prepare_command(MMonCommand *m) le.msg = str_join(logtext, " "); pending_summary.add(le); pending_log.insert(pair(le.stamp, le)); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, string(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, string(), + get_last_committed() + 1)); return true; } diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 3a1af05ffae..11bc7f9608d 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -838,7 +838,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) map.epoch = pending_mdsmap.epoch; // make sure epoch is correct pending_mdsmap = map; string rs = "set mds map"; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else { ss << "next mdsmap epoch " << pending_mdsmap.epoch << " != " << e; @@ -857,7 +858,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) ss << "set mds gid " << gid << " to state " << state << " " << ceph_mds_state_name(state); string rs; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } @@ -887,7 +889,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) ss << "removed mds gid " << gid; string rs; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } else if (prefix == "mds rmfailed") { @@ -898,7 +901,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) ss << "removed failed mds." << w; string rs; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "mds cluster_down") { if (pending_mdsmap.test_flag(CEPH_MDSMAP_DOWN)) { @@ -1026,7 +1030,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) ss << "new fs with metadata pool " << metadata << " and data pool " << data; string rs; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } else { @@ -1038,7 +1043,8 @@ bool MDSMonitor::prepare_command(MMonCommand *m) if (r >= 0) { // success.. delay reply - wait_for_finished_proposal(new Monitor::C_Command(mon, m, r, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, r, rs, + get_last_committed() + 1)); return true; } else { // reply immediately diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc index 7ecf2715283..61d85ae96c6 100644 --- a/src/mon/MonmapMonitor.cc +++ b/src/mon/MonmapMonitor.cc @@ -346,7 +346,7 @@ bool MonmapMonitor::prepare_command(MMonCommand *m) pending_map.last_changed = ceph_clock_now(g_ceph_context); getline(ss, rs); wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, - get_last_committed())); + get_last_committed() + 1)); return true; } else if (prefix == "mon remove") { diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 3ff0d660a2b..6c92b82f216 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2827,7 +2827,8 @@ bool OSDMonitor::prepare_set_flag(MMonCommand *m, int flag) pending_inc.new_flags = osdmap.get_flags(); pending_inc.new_flags |= flag; ss << "set " << OSDMap::get_flag_string(flag); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } @@ -2838,7 +2839,8 @@ bool OSDMonitor::prepare_unset_flag(MMonCommand *m, int flag) pending_inc.new_flags = osdmap.get_flags(); pending_inc.new_flags &= ~flag; ss << "unset " << OSDMap::get_flag_string(flag); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } @@ -3257,7 +3259,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << action << " item id " << id << " name '" << name << "' weight " << weight << " at location " << loc << " to crush map"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd crush create-or-move") { @@ -3296,7 +3299,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "create-or-move updating item name '" << name << "' weight " << weight << " at location " << loc << " to crush map"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } while (false); @@ -3330,7 +3334,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) pending_inc.crush.clear(); newcrush.encode(pending_inc.crush); getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } else { @@ -3383,7 +3388,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) err = 0; } } - wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd crush rm" || prefix == "osd crush remove" || @@ -3405,7 +3411,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) err = 0; ss << "device '" << name << "' does not appear in the crush map"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } int id = newcrush.get_item_id(name); @@ -3434,7 +3441,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) newcrush.encode(pending_inc.crush); ss << "removed item id " << id << " name '" << name << "' from crush map"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } while (false); @@ -3468,7 +3476,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "reweighted item id " << id << " name '" << name << "' to " << w << " in crush map"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } while (false); @@ -3493,7 +3502,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) newcrush.encode(pending_inc.crush); ss << "adjusted tunables profile to " << profile; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd crush rule create-simple") { @@ -3529,7 +3539,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) newcrush.encode(pending_inc.crush); } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd crush rule rm") { @@ -3571,7 +3582,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) newcrush.encode(pending_inc.crush); } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd setmaxosd") { @@ -3588,7 +3600,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) pending_inc.new_max_osd = newmax; ss << "set new max_osd = " << pending_inc.new_max_osd; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pause") { @@ -3710,7 +3723,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) } if (any) { getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, err, rs, + get_last_committed() + 1)); return true; } } else if (prefix == "osd reweight") { @@ -3728,7 +3742,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) pending_inc.new_weight[id] = ww; ss << "reweighted osd." << id << " to " << w << " (" << ios::hex << ww << ios::dec << ")"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } @@ -3748,7 +3763,8 @@ bool OSDMonitor::prepare_command(MMonCommand *m) pending_inc.new_lost[id] = e; ss << "marked osd lost in epoch " << e; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } @@ -3817,7 +3833,8 @@ done: ss << i; rdata.append(ss); } - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, rdata, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, rdata, + get_last_committed() + 1)); return true; } else if (prefix == "osd blacklist") { @@ -3839,7 +3856,8 @@ done: pending_inc.new_blacklist[addr] = expires; ss << "blacklisting " << addr << " until " << expires << " (" << d << " sec)"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (blacklistop == "rm") { if (osdmap.is_blacklisted(addr) || @@ -3850,7 +3868,8 @@ done: pending_inc.new_blacklist.erase(addr); ss << "un-blacklisting " << addr; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } ss << addr << " isn't blacklisted"; @@ -3894,7 +3913,8 @@ done: ss << "created pool " << poolstr << " snap " << snapname; } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pool rmsnap") { string poolstr; @@ -3933,7 +3953,8 @@ done: ss << "already removed pool " << poolstr << " snap " << snapname; } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pool create") { int64_t pg_num; @@ -4028,7 +4049,8 @@ done: ss << "pool '" << poolstr << "' created"; } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pool delete") { @@ -4055,7 +4077,8 @@ done: if (ret == 0) ss << "pool '" << poolstr << "' deleted"; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, ret, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, ret, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pool rename") { string srcpoolstr, destpoolstr; @@ -4095,7 +4118,8 @@ done: << cpp_strerror(ret); } getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, ret, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, ret, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd pool set") { @@ -4104,7 +4128,8 @@ done: goto reply; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd tier add") { string poolstr; @@ -4143,7 +4168,8 @@ done: pending_inc.get_new_pool(pool_id, p)->tiers.insert(tierpool_id); pending_inc.get_new_pool(tierpool_id, p)->tier_of = pool_id; ss << "pool '" << tierpoolstr << "' is now (or already was) a tier of '" << poolstr << "'"; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd tier remove") { string poolstr; @@ -4185,7 +4211,8 @@ done: pending_inc.get_new_pool(pool_id, p)->tiers.erase(tierpool_id); pending_inc.get_new_pool(tierpool_id, tp)->clear_tier(); ss << "pool '" << tierpoolstr << "' is now (or already was) not a tier of '" << poolstr << "'"; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd tier set-overlay") { string poolstr; @@ -4227,7 +4254,8 @@ done: pending_inc.get_new_pool(pool_id, p)->read_tier = overlaypool_id; pending_inc.get_new_pool(pool_id, p)->write_tier = overlaypool_id; ss << "overlay for '" << poolstr << "' is now (or already was) '" << overlaypoolstr << "'"; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd tier remove-overlay") { string poolstr; @@ -4249,7 +4277,8 @@ done: pending_inc.get_new_pool(pool_id, p)->clear_read_tier(); pending_inc.get_new_pool(pool_id, p)->clear_write_tier(); ss << "there is now (or already was) no overlay for '" << poolstr << "'"; - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd tier cache-mode") { string poolstr; @@ -4279,7 +4308,8 @@ done: pending_inc.get_new_pool(pool_id, p)->cache_mode = mode; ss << "set cache-mode for pool '" << poolstr << "' to " << pg_pool_t::get_cache_mode_name(mode); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, ss.str(), + get_last_committed() + 1)); return true; } else if (prefix == "osd pool set-quota") { string poolstr; @@ -4320,7 +4350,8 @@ done: } ss << "set-quota " << field << " = " << value << " for pool " << poolstr; rs = ss.str(); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } else if (prefix == "osd reweight-by-utilization") { @@ -4336,7 +4367,8 @@ done: } else { ss << "SUCCESSFUL reweight-by-utilization: " << out_str; getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } } else if (prefix == "osd thrash") { @@ -4360,7 +4392,8 @@ reply: update: getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, 0, rs, + get_last_committed() + 1)); return true; } diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 4310dd05a2b..8b077c18554 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -1667,7 +1667,8 @@ bool PGMonitor::prepare_command(MMonCommand *m) update: getline(ss, rs); - wait_for_finished_proposal(new Monitor::C_Command(mon, m, r, rs, get_last_committed())); + wait_for_finished_proposal(new Monitor::C_Command(mon, m, r, rs, + get_last_committed() + 1)); return true; }