}
}
+// kludge to associate a global version number with each per-machine paxos state
+version_t MonitorStore::get_global_version(const char *a, version_t b)
+{
+ char fn[1024], fn2[1024];
+ snprintf(fn, sizeof(fn), "%s_gv", a);
+ snprintf(fn2, sizeof(fn2), "%llu", (long long unsigned)b);
+ return get_int(fn, fn2);
+}
+
+void MonitorStore::put_global_version(const char *a, version_t b, version_t gv)
+{
+ char fn[1024], fn2[1024];
+ snprintf(fn, sizeof(fn), "%s_gv", a);
+ snprintf(fn2, sizeof(fn2), "%llu", (long long unsigned)b);
+ put_int(gv, fn, fn2);
+}
// ----------------------------------------
// buffers
strcpy(fn, dr);
}
int r = ::unlink(fn);
+
+ if (b) {
+ // wipe out _gv file too, if any. this is sloppy, but will work.
+ char gvf[1024];
+ snprintf(gvf, sizeof(gvf), "%s/%s_gv/%s", dir.c_str(), a, b);
+ ::unlink(gvf); // ignore error; it may not be there.
+ }
+
::rmdir(dr); // sloppy attempt to clean up empty dirs
return r;
}
int MonitorStore::put_bl_sn_map(const char *a,
map<version_t,bufferlist>::iterator start,
- map<version_t,bufferlist>::iterator end)
+ map<version_t,bufferlist>::iterator end,
+ map<version_t,version_t> *gvmap)
{
version_t first = start->first;
map<version_t,bufferlist>::iterator lastp = end;
int err = put_bl_sn(p->second, a, p->first);
if (err < 0)
return err;
+ if (gvmap && gvmap->count(p->first) && (*gvmap)[p->first] > 0)
+ put_global_version(a, p->first, (*gvmap)[p->first]);
}
return 0;
}
::close(fd);
if (err < 0)
return -errno;
+
+ // this doesn't try to be efficient.. too bad for you! it may also
+ // extend beyond commmitted, but that's okay; we only look at these
+ // if the actual state files exist too.
+ if (gvmap && gvmap->count(p->first) && (*gvmap)[p->first])
+ put_global_version(a, p->first, (*gvmap)[p->first]);
}
// sync them all
version_t get_int(const char *a, const char *b=0);
void put_int(version_t v, const char *a, const char *b=0);
+ version_t get_global_version(const char *a, version_t b);
+ void put_global_version(const char *a, version_t b, version_t gv);
+
// buffers
// ss and sn varieties.
bool exists_bl_ss(const char *a, const char *b=0);
*/
int put_bl_sn_map(const char *a,
map<version_t,bufferlist>::iterator start,
- map<version_t,bufferlist>::iterator end);
+ map<version_t,bufferlist>::iterator end,
+ map<version_t,version_t> *gvmap);
int erase_ss(const char *a, const char *b);
int erase_sn(const char *a, version_t b) {