{
char path[PATH_MAX];
get_cdir(cid, path, sizeof(path));
- return index_manager.get_index(cid, path, index);
+ int r = index_manager.get_index(cid, path, index);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::init_index(coll_t cid)
{
char path[PATH_MAX];
get_cdir(cid, path, sizeof(path));
- return index_manager.init_index(cid, path, on_disk_version);
+ int r = index_manager.init_index(cid, path, on_disk_version);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_find(coll_t cid, const hobject_t& oid, IndexedPath *path)
return r;
r = index->lookup(oid, path, &exist);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
if (!exist)
return -ENOENT;
return 0;
int r = lfn_find(cid, oid, &path);
if (r < 0)
return r;
- return do_getxattr(path->path(), name, val, size);
+ r = do_getxattr(path->path(), name, val, size);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_setxattr(coll_t cid, const hobject_t& oid, const char *name, const void *val, size_t size)
int r = lfn_find(cid, oid, &path);
if (r < 0)
return r;
- return do_setxattr(path->path(), name, val, size);
+ r = do_setxattr(path->path(), name, val, size);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_removexattr(coll_t cid, const hobject_t& oid, const char *name)
int r = lfn_find(cid, oid, &path);
if (r < 0)
return r;
- return do_removexattr(path->path(), name);
+ r = do_removexattr(path->path(), name);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_listxattr(coll_t cid, const hobject_t& oid, char *names, size_t len)
int r = lfn_find(cid, oid, &path);
if (r < 0)
return r;
- return do_listxattr(path->path(), names, len);
+ r = do_listxattr(path->path(), names, len);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_truncate(coll_t cid, const hobject_t& oid, off_t length)
return r;
r = ::truncate(path->path(), length);
if (r < 0)
- return -errno;
+ r = -errno;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
return r;
r = ::stat(path->path(), buf);
if (r < 0)
- return -errno;
- return 0;
+ r = -errno;
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_open(coll_t cid, const hobject_t& oid, int flags, mode_t mode,
if (r < 0) {
derr << "error getting collection index for " << cid
<< ": " << cpp_strerror(-r) << dendl;
- return r;
+ goto fail;
}
r = (*index)->lookup(oid, path, &exist);
if (r < 0) {
derr << "could not find " << oid << " in index: "
<< cpp_strerror(-r) << dendl;
- return r;
+ goto fail;
}
r = ::open((*path)->path(), flags, mode);
r = -errno;
dout(10) << "error opening file " << (*path)->path() << " with flags="
<< flags << " and mode=" << mode << ": " << cpp_strerror(-r) << dendl;
- return r;
+ goto fail;
}
fd = r;
TEMP_FAILURE_RETRY(::close(fd));
derr << "error creating " << oid << " (" << (*path)->path()
<< ") in index: " << cpp_strerror(-r) << dendl;
- return r;
+ goto fail;
}
}
return fd;
+
+ fail:
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::lfn_open(coll_t cid, const hobject_t& oid, int flags, mode_t mode, IndexedPath *path)
}
r = index_old->lookup(o, &path_old, &exist);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
if (!exist)
return -ENOENT;
r = index_new->lookup(o, &path_new, &exist);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
if (exist)
return -EEXIST;
return -errno;
r = index_new->created(o, path_new->path());
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
IndexedPath path;
int exist;
r = index->lookup(o, &path, &exist);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
struct stat st;
r = ::stat(path->path(), &st);
if (r < 0) {
- return -errno;
+ r = -errno;
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
if (st.st_nlink == 1) {
r = object_map->clear(o, &spos);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
} else {
/* Ensure that replay of this op doesn't result in the object_map
* going away.
do {
get_raw_xattr_name(name, i, raw_name, sizeof(raw_name));
r = sys_fgetxattr(fd, raw_name, 0, 0);
- if (!i && r < 0) {
+ if (!i && r < 0)
return r;
- }
if (r < 0)
break;
total += r;
int do_getxattr(const char *fn, const char *name, void *val, size_t size)
{
int fd = ::open(fn, O_RDONLY);
- if (fd < 0)
- return -errno;
- int r = do_fgetxattr(fd, name, val, size);
+ int r = 0;
+ if (fd < 0) {
+ r = -errno;
+ goto out;
+ }
+ r = do_fgetxattr(fd, name, val, size);
TEMP_FAILURE_RETRY(::close(fd));
+ out:
return r;
}
return ret;
}
-int do_setxattr(const char *fn, const char *name, const void *val, size_t size) {
+int do_setxattr(const char *fn, const char *name, const void *val, size_t size)
+{
int i = 0, pos = 0;
char raw_name[ATTR_MAX_NAME_LEN * 2 + 16];
int ret = 0;
before) */
if (ret >= 0 && chunk_size == ATTR_MAX_BLOCK_LEN) {
get_raw_xattr_name(name, i, raw_name, sizeof(raw_name));
- do_removexattr(fn, raw_name);
+ int r = do_removexattr(fn, raw_name);
+ if (r < 0 && r != -ENODATA)
+ ret = r;
}
return ret;
before) */
if (ret >= 0 && chunk_size == ATTR_MAX_BLOCK_LEN) {
get_raw_xattr_name(name, i, raw_name, sizeof(raw_name));
- ::ceph_os_fremovexattr(fd, raw_name);
+ int r = ::ceph_os_fremovexattr(fd, raw_name);
+ if (r < 0 && r != -ENODATA)
+ ret = r;
}
return ret;
int r;
if (!len)
- return sys_listxattr(fn, names, len);
+ return sys_listxattr(fn, names, len);
r = sys_listxattr(fn, 0, 0);
if (r < 0)
int FileStore::statfs(struct statfs *buf)
{
- if (::statfs(basedir.c_str(), buf) < 0)
- return -errno;
+ if (::statfs(basedir.c_str(), buf) < 0) {
+ int r = -errno;
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
+ }
return 0;
}
int FileStore::read_op_seq(uint64_t *seq)
{
int op_fd = ::open(current_op_seq_fn.c_str(), O_CREAT|O_RDWR, 0644);
- if (op_fd < 0)
- return -errno;
+ if (op_fd < 0) {
+ int r = -errno;
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
+ }
char s[40];
memset(s, 0, sizeof(s));
int ret = safe_read(op_fd, s, sizeof(s) - 1);
if (ret < 0) {
derr << "error reading " << current_op_seq_fn << ": " << cpp_strerror(ret) << dendl;
TEMP_FAILURE_RETRY(::close(op_fd));
+ assert(!m_filestore_fail_eio || ret != -EIO);
return ret;
}
*seq = atoll(s);
char s[30];
snprintf(s, sizeof(s), "%" PRId64 "\n", seq);
int ret = TEMP_FAILURE_RETRY(::pwrite(fd, s, strlen(s), 0));
- if (ret < 0)
- return -errno;
+ if (ret < 0) {
+ ret = -errno;
+ assert(!m_filestore_fail_eio || ret != -EIO);
+ }
return ret;
}
TEMP_FAILURE_RETRY(::close(fsid_fd));
fsid_fd = -1;
done:
+ assert(!m_filestore_fail_eio || ret != -EIO);
return ret;
}
int r = do_fgetxattr(fd, REPLAY_GUARD_XATTR, buf, sizeof(buf));
if (r < 0) {
dout(20) << "_check_replay_guard no xattr" << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return 1; // no xattr
}
bufferlist bl;
if (len == 0) {
struct stat st;
memset(&st, 0, sizeof(struct stat));
- ::fstat(fd, &st);
+ int r = ::fstat(fd, &st);
+ assert(r == 0);
len = st.st_size;
}
if (got < 0) {
dout(10) << "FileStore::read(" << cid << "/" << oid << ") pread error: " << cpp_strerror(got) << dendl;
TEMP_FAILURE_RETRY(::close(fd));
+ assert(!m_filestore_fail_eio || got != -EIO);
return got;
}
bptr.set_length(got); // properly size the buffer
dout(10) << "fiemap " << cid << "/" << oid << " " << offset << "~" << len << " = " << r << " num_extents=" << exomap.size() << " " << exomap << dendl;
free(fiemap);
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
TEMP_FAILURE_RETRY(::close(o));
out2:
dout(10) << "clone " << cid << "/" << oldoid << " -> " << cid << "/" << newoid << " = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
l = do_getxattr(fn, name, bp.c_str(), l);
}
}
+ assert(!m_filestore_fail_eio || l != -EIO);
return l;
}
dout(20) << "getattrs " << cid << "/" << oid << " getting '" << name << "'" << dendl;
int r = _getattr(cid, oid, attrname, aset[set_name]);
- if (r < 0) return r;
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
+ }
}
}
name += strlen(name) + 1;
char *name = 0;
if (len == -ERANGE) {
len = do_listxattr(fn, 0, 0);
- if (len < 0)
+ if (len < 0) {
+ assert(!m_filestore_fail_eio || len != -EIO);
return len;
+ }
dout(10) << " -ERANGE, len is " << len << dendl;
names2 = new char[len+1];
len = do_listxattr(fn, names2, len);
dout(10) << " -ERANGE, got " << len << dendl;
- if (len < 0)
+ if (len < 0) {
+ assert(!m_filestore_fail_eio || len != -EIO);
return len;
+ }
name = names2;
- } else if (len < 0)
+ } else if (len < 0) {
+ assert(!m_filestore_fail_eio || len != -EIO);
return len;
- else
+ } else {
name = names1;
+ }
name[len] = 0;
char *end = name + len;
r = get_index(cid, &index);
if (r < 0) {
dout(10) << __func__ << " could not get index r = " << r << dendl;
- return r;
+ goto out;
}
r = object_map->get_xattrs(oid, to_get, &got);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " get_xattrs err r =" << r << dendl;
- return r;
+ goto out;
}
if (!got.size()) {
dout(10) << __func__ << " got.size() is 0" << dendl;
got.begin()->second.length());
r = 0;
}
+ out:
dout(10) << "getattr " << cid << "/" << oid << " '" << name << "' = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
int r = get_index(cid, &index);
if (r < 0) {
dout(10) << __func__ << " could not get index r = " << r << dendl;
- return r;
+ goto out;
}
r = object_map->get_all_xattrs(oid, &omap_attrs);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl;
- return r;
+ goto out;
}
r = object_map->get_xattrs(oid, omap_attrs, &omap_aset);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl;
- return r;
+ goto out;
}
assert(omap_attrs.size() == omap_aset.size());
for (map<string, bufferlist>::iterator i = omap_aset.begin();
bufferptr(i->second.c_str(), i->second.length())));
}
}
+ out:
dout(10) << "getattrs " << cid << "/" << oid << " = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
map<string, bufferlist> omap_set;
set<string> omap_remove;
map<string, bufferptr> inline_set;
- if (g_conf->filestore_xattr_use_omap)
- _getattrs(cid, oid, inline_set);
+ if (g_conf->filestore_xattr_use_omap) {
+ int r = _getattrs(cid, oid, inline_set);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ }
dout(15) << "setattrs " << cid << "/" << oid << dendl;
int r = 0;
for (map<string,bufferptr>::iterator p = aset.begin();
r = object_map->remove_xattrs(oid, omap_remove, &spos);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not remove_xattrs r = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
r = object_map->set_xattrs(oid, omap_set, &spos);
if (r < 0) {
dout(10) << __func__ << " could not set_xattrs r = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
}
r = object_map->remove_xattrs(oid, to_remove, &spos);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not remove_xattrs index r = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
}
r = object_map->get_all_xattrs(oid, &omap_attrs);
if (r < 0 && r != -ENOENT) {
dout(10) << __func__ << " could not get omap_attrs r = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
r = object_map->remove_xattrs(oid, omap_attrs, &spos);
get_attrname(name, n, PATH_MAX);
int r = do_getxattr(fn, n, value, size);
dout(10) << "collection_getattr " << fn << " '" << name << "' len " << size << " = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
int r = _getattr(fn, n, bp);
bl.push_back(bp);
dout(10) << "collection_getattr " << fn << " '" << name << "' = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
dout(10) << "collection_getattrs " << fn << dendl;
int r = _getattrs(fn, aset);
dout(10) << "collection_getattrs " << fn << " = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
if (!dir) {
r = -errno;
derr << "tried opening directory " << fn << ": " << cpp_strerror(-r) << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
if (r < 0) {
r = -errno;
derr << "stat on " << filename << ": " << cpp_strerror(-r) << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
break;
}
if (!S_ISDIR(sb.st_mode)) {
}
::closedir(dir);
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
get_cdir(c, fn, sizeof(fn));
dout(15) << "collection_stat " << fn << dendl;
int r = ::stat(fn, st);
- if (r < 0) r = -errno;
+ if (r < 0)
+ r = -errno;
dout(10) << "collection_stat " << fn << " = " << r << dendl;
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
}
vector<hobject_t> ls;
collection_list_handle_t handle;
r = index->collection_list_partial(hobject_t(), 1, 1, 0, &ls, NULL);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return false;
+ }
return ls.size() > 0;
}
r = index->collection_list_partial(start,
min, max, seq,
ls, next);
- if (r < 0)
+ if (r < 0) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
int r = get_index(c, &index);
if (r < 0)
return r;
- return index->collection_list(&ls);
+ r = index->collection_list(&ls);
+ assert(!m_filestore_fail_eio || r != -EIO);
+ return r;
}
int FileStore::omap_get(coll_t c, const hobject_t &hoid,
if (r < 0)
return r;
r = object_map->get(hoid, header, out);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
if (r < 0)
return r;
r = object_map->get_header(hoid, bl);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
if (r < 0)
return r;
r = object_map->get_keys(hoid, keys);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
if (r < 0)
return r;
r = object_map->get_values(hoid, keys, out);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
if (r < 0)
return r;
r = object_map->check_keys(hoid, keys, out);
- if (r < 0 && r != -ENOENT)
+ if (r < 0 && r != -ENOENT) {
+ assert(!m_filestore_fail_eio || r != -EIO);
return r;
+ }
return 0;
}
get_cdir(c, fn, sizeof(fn));
dout(15) << "create_collection " << fn << dendl;
int r = ::mkdir(fn, 0755);
- if (r < 0) r = -errno;
+ if (r < 0)
+ r = -errno;
dout(10) << "create_collection " << fn << " = " << r << dendl;
- if (r < 0) return r;
+ if (r < 0)
+ return r;
return init_index(c);
}
get_cdir(c, fn, sizeof(fn));
dout(15) << "_destroy_collection " << fn << dendl;
int r = ::rmdir(fn);
- if (r < 0) r = -errno;
+ if (r < 0)
+ r = -errno;
dout(10) << "_destroy_collection " << fn << " = " << r << dendl;
return r;
}
return r;
return 0;
}
+
int FileStore::_omap_setkeys(coll_t cid, const hobject_t &hoid,
const map<string, bufferlist> &aset,
const SequencerPosition &spos) {
return r;
return object_map->set_keys(hoid, aset, &spos);
}
+
int FileStore::_omap_rmkeys(coll_t cid, const hobject_t &hoid,
const set<string> &keys,
const SequencerPosition &spos) {
return r;
return 0;
}
+
int FileStore::_omap_setheader(coll_t cid, const hobject_t &hoid,
const bufferlist &bl,
const SequencerPosition &spos)