return 0;
}
-int MonitorStore::put_bl_sn_map(const char *a, map<version_t,bufferlist>& vals)
+int MonitorStore::put_bl_sn_map(const char *a,
+ map<version_t,bufferlist>::iterator start,
+ map<version_t,bufferlist>::iterator end)
{
- version_t first = vals.begin()->first;
- version_t last = vals.rbegin()->first;
+ version_t first = start->first;
+ map<version_t,bufferlist>::iterator lastp = end;
+ --lastp;
+ version_t last = lastp->first;
dout(15) << "put_bl_sn_map " << a << "/[" << first << ".." << last << "]" << dendl;
// only do a big sync if there are several values.
- if (vals.size() < 5) {
+ if (last - first < 5) {
// just do them individually
- for (map<version_t,bufferlist>::iterator p = vals.begin();
- p != vals.end();
- p++) {
+ for (map<version_t,bufferlist>::iterator p = start; p != end; ++p) {
int err = put_bl_sn(p->second, a, p->first);
if (err < 0)
return err;
snprintf(dfn, sizeof(dfn), "%s/%s", dir.c_str(), a);
::mkdir(dfn, 0755);
- for (map<version_t,bufferlist>::iterator p = vals.begin();
- p != vals.end();
- p++) {
+ for (map<version_t,bufferlist>::iterator p = start; p != end; ++p) {
char tfn[1024], fn[1024];
snprintf(fn, sizeof(fn), "%s/%llu", dfn, (long long unsigned)p->first);
::close(dirfd);
// rename them all into place
- for (map<version_t,bufferlist>::iterator p = vals.begin();
- p != vals.end();
- p++) {
+ for (map<version_t,bufferlist>::iterator p = start; p != end; ++p) {
char tfn[1024], fn[1024];
snprintf(fn, sizeof(fn), "%s/%llu", dfn, (long long unsigned)p->first);
* @param vals - map of int name -> values
* @return 0 for success or negative error code
*/
- int put_bl_sn_map(const char *a, map<version_t,bufferlist>& vals);
+ int put_bl_sn_map(const char *a,
+ map<version_t,bufferlist>::iterator start,
+ map<version_t,bufferlist>::iterator end);
int erase_ss(const char *a, const char *b);
int erase_sn(const char *a, version_t b) {
last_committed = m->latest_version;
first_committed = last_committed;
mon->store->put_int(first_committed, machine_name, "first_committed");
+ mon->store->put_int(last_committed, machine_name, "last_committed");
+ return;
}
// build map of values to store
- map<version_t,bufferlist> vals;
- vals.swap(m->values);
- if (vals.size()) {
- if (vals.begin()->first > last_committed + 1) {
- // drop everything if it starts in the future.
- dout(20) << " dropping full set, it starts at " << vals.begin()->first << " > last_committed+1" << dendl;
- vals.clear();
- } else {
- // drop anything we've already committed
- if (vals.begin()->first <= last_committed) {
- dout(20) << " dropping leading elements from " << vals.begin()->first << " to last_committed" << dendl;
- while (!vals.empty() && vals.begin()->first <= last_committed) {
- vals.erase(vals.begin());
- }
- }
- if (!vals.empty()) {
- mon->store->put_bl_sn_map(machine_name, vals);
- last_committed = vals.rbegin()->first;
- }
- }
+ // we want to write the range [last_committed, m->last_committed] only.
+ map<version_t,bufferlist>::iterator start = m->values.begin();
+
+ if (start != m->values.end() &&
+ start->first > last_committed + 1) {
+ // ignore everything if values start in the future.
+ dout(10) << "store_state ignoring all values, they start at " << start->first
+ << " > last_committed+1" << dendl;
+ start = m->values.end();
+ }
+
+ while (start != m->values.end() &&
+ start->first <= last_committed)
+ ++start;
+
+ map<version_t,bufferlist>::iterator end = start;
+ while (end != m->values.end() &&
+ end->first <= m->last_committed) {
+ last_committed = end->first;
+ ++end;
+ }
+
+ if (start == end) {
+ dout(10) << "store_state nothing to commit" << dendl;
+ } else {
+ dout(10) << "store_state [" << start->first << ".." << last_committed << "]" << dendl;
+ mon->store->put_bl_sn_map(machine_name, start, end);
+ mon->store->put_int(last_committed, machine_name, "last_committed");
}
- mon->store->put_int(last_committed, machine_name, "last_committed");
}