return *_dout << "store(" << dir << ") ";
}
-
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
}
derr << "MonitorStore::get_int: failed to open '" << fn << "': "
<< cpp_strerror(err) << dendl;
+ assert(0 == "failed to open");
return 0;
}
<< cpp_strerror(r) << dendl;
int close_err = TEMP_FAILURE_RETRY(::close(fd));
assert(0 == close_err);
+ assert(0); // the file exists; so this is a different failure
return 0;
}
int close_err = TEMP_FAILURE_RETRY(::close(fd));
return r == 0;
}
-int MonitorStore::erase_ss(const char *a, const char *b)
+void MonitorStore::erase_ss(const char *a, const char *b)
{
char fn[1024];
char dr[1024];
strcpy(fn, dr);
}
int r = ::unlink(fn);
+ assert(0 == r || ENOENT == errno); // callers don't check for existence first
if (b) {
// wipe out _gv file too, if any. this is sloppy, but will work.
}
::rmdir(dr); // sloppy attempt to clean up empty dirs
- return r;
}
int MonitorStore::get_bl_ss(bufferlist& bl, const char *a, const char *b)
return len;
}
-int MonitorStore::write_bl_ss_impl(bufferlist& bl, const char *a, const char *b, bool append)
+void MonitorStore::write_bl_ss_impl(bufferlist& bl, const char *a, const char *b, bool append)
{
int err = 0;
char fn[1024];
err = -errno;
derr << __func__ << " failed to create dir " << fn
<< ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to create dir");
}
dout(15) << "put_bl " << a << "/" << b << " = " << bl.length() << " bytes" << dendl;
snprintf(fn, sizeof(fn), "%s/%s/%s", dir.c_str(), a, b);
err = -errno;
derr << "failed to open " << fn << "for append: "
<< cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to open for append");
}
} else {
snprintf(tfn, sizeof(tfn), "%s.new", fn);
if (fd < 0) {
err = -errno;
derr << "failed to open " << tfn << ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to open");
}
}
err = bl.write_fd(fd);
-
- if (!err)
- err = ::fsync(fd);
- int close_err = TEMP_FAILURE_RETRY(::close(fd));
- assert (0 == close_err); // this really can't fail, right? right?...
- if (!append && !err) {
- int r = ::rename(tfn, fn);
- if (r < 0) {
+ assert(!err);
+ err = ::fsync(fd);
+ assert(!err);
+ err = TEMP_FAILURE_RETRY(::close(fd));
+ assert (!err); // this really can't fail, right? right?...
+ if (!append) {
+ err = ::rename(tfn, fn);
+ if (err < 0) {
err = -errno;
derr << __func__ << " failed to rename '" << tfn << "' -> '"
<< fn << "': " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to rename");
}
- } else if (err) {
- err = -errno;
- derr << __func__ << "failed to write or fsync " << fn << cpp_strerror(err) << dendl;
}
-
- return err;
}
-int MonitorStore::write_bl_ss(bufferlist& bl, const char *a, const char *b, bool append)
+void MonitorStore::write_bl_ss(bufferlist& bl, const char *a, const char *b, bool append)
{
- int err = write_bl_ss_impl(bl, a, b, append);
- if (err)
- derr << "write_bl_ss " << a << "/" << b << " got error " << cpp_strerror(err) << dendl;
- assert(!err); // for now
- return 0;
+ write_bl_ss_impl(bl, a, b, append);
}
-int MonitorStore::put_bl_sn_map(const char *a,
+void MonitorStore::put_bl_sn_map(const char *a,
map<version_t,bufferlist>::iterator start,
map<version_t,bufferlist>::iterator end,
map<version_t,version_t> *gvmap)
last - first < (unsigned)g_conf->mon_sync_fs_threshold) {
// just do them individually
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;
+ put_bl_sn(p->second, a, p->first);
if (gvmap && gvmap->count(p->first) && (*gvmap)[p->first] > 0)
put_global_version(a, p->first, (*gvmap)[p->first]);
}
- return 0;
+ return;
}
// make sure dir exists
err = -errno;
derr << __func__ << " failed to create dir " << dfn << ": "
<< cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to create dir");
}
for (map<version_t,bufferlist>::iterator p = start; p != end; ++p) {
if (fd < 0) {
int err = -errno;
derr << "failed to open " << tfn << ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to open");
}
err = p->second.write_fd(fd);
close_err = TEMP_FAILURE_RETRY(::close(fd));
assert (0 == close_err);
if (err < 0)
- return -errno;
+ assert(0 == "failed to write");
// 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 (dirfd < 0) {
err = -errno;
derr << "failed to open " << dir << ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to open temp file");
}
sync_filesystem(dirfd);
close_err = TEMP_FAILURE_RETRY(::close(dirfd));
err = ::rename(tfn, fn);
if (err < 0)
- return -errno;
+ assert(0 == "failed to rename");
}
// fsync the dir (to commit the renames)
err = -errno;
derr << __func__ << " failed to open " << dir
<< ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to open dir");
}
err = ::fsync(dirfd);
if (err < 0) {
err = -errno;
derr << __func__ << " failed to fsync " << dir
<< ": " << cpp_strerror(err) << dendl;
- return err;
+ assert(0 == "failed to fsync");
}
close_err = TEMP_FAILURE_RETRY(::close(dirfd));
assert (0 == close_err);
-
- return 0;
}
void MonitorStore::sync()
int err = -errno;
derr << __func__ << " failed to open " << dir
<< ": " << cpp_strerror(err) << dendl;
- return;
+ assert(0 == "failed to open dir for syncing");
}
sync_filesystem(dirfd);
int close_err = TEMP_FAILURE_RETRY(::close(dirfd));
string dir;
int lock_fd;
- int write_bl_ss_impl(bufferlist& bl, const char *a, const char *b,
+ void write_bl_ss_impl(bufferlist& bl, const char *a, const char *b,
bool append);
- int write_bl_ss(bufferlist& bl, const char *a, const char *b,
+ void write_bl_ss(bufferlist& bl, const char *a, const char *b,
bool append);
public:
MonitorStore(const std::string &d) : dir(d), lock_fd(-1) { }
int ret = get_bl_ss(bl, a, b);
assert (ret >= 0 || ret == -ENOENT);
}
- int put_bl_ss(bufferlist& bl, const char *a, const char *b) {
- return write_bl_ss(bl, a, b, false);
+ void put_bl_ss(bufferlist& bl, const char *a, const char *b) {
+ write_bl_ss(bl, a, b, false);
}
- int append_bl_ss(bufferlist& bl, const char *a, const char *b) {
- return write_bl_ss(bl, a, b, true);
+ void append_bl_ss(bufferlist& bl, const char *a, const char *b) {
+ write_bl_ss(bl, a, b, true);
}
bool exists_bl_sn(const char *a, version_t b) {
char bs[20];
int ret = get_bl_sn(bl, a, b);
assert(ret >= 0 || ret == -ENOENT);
}
- int put_bl_sn(bufferlist& bl, const char *a, version_t b) {
+ void put_bl_sn(bufferlist& bl, const char *a, version_t b) {
char bs[20];
snprintf(bs, sizeof(bs), "%llu", (unsigned long long)b);
- return put_bl_ss(bl, a, bs);
+ put_bl_ss(bl, a, bs);
}
/**
* Put a whole set of values efficiently and safely.
* @param vals - map of int name -> values
* @return 0 for success or negative error code
*/
- int put_bl_sn_map(const char *a,
+ void put_bl_sn_map(const char *a,
map<version_t,bufferlist>::iterator start,
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) {
+ void erase_ss(const char *a, const char *b);
+ void erase_sn(const char *a, version_t b) {
char bs[20];
snprintf(bs, sizeof(bs), "%llu", (unsigned long long)b);
- return erase_ss(a, bs);
+ erase_ss(a, bs);
}
/*