From: Mykola Golub Date: Mon, 19 Apr 2021 07:32:01 +0000 (+0100) Subject: os/FileStore: don't propagate split/merge error to "create"/"remove" X-Git-Tag: v15.2.13~3^2~6^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F40988%2Fhead;p=ceph.git os/FileStore: don't propagate split/merge error to "create"/"remove" Either ignore or terminate, otherwise it may confuse the "create"/"remove" caller. Fixes: https://tracker.ceph.com/issues/50395 Signed-off-by: Mykola Golub (cherry picked from commit 936898b8caf7b13a120ea6108df0b0dac29882c4) --- diff --git a/src/os/filestore/HashIndex.cc b/src/os/filestore/HashIndex.cc index ab56b43c2c5e0..d73fdd114491b 100644 --- a/src/os/filestore/HashIndex.cc +++ b/src/os/filestore/HashIndex.cc @@ -543,15 +543,23 @@ int HashIndex::_created(const vector &path, dout(1) << __func__ << " " << path << " has " << info.objs << " objects, starting split in pg " << coll() << "." << dendl; int r = initiate_split(path, info); - if (r < 0) - return r; - r = complete_split(path, info); - dout(1) << __func__ << " " << path << " split completed in pg " << coll() << "." - << dendl; - return r; - } else { - return 0; + if (r < 0) { + derr << __func__ << " error starting split " << path << " in pg " + << coll() << ": " << cpp_strerror(r) << dendl; + ceph_assert(!cct->_conf->filestore_fail_eio); + } else { + r = complete_split(path, info); + if (r < 0) { + derr << __func__ << " error completing split " << path << " in pg " + << coll() << ": " << cpp_strerror(r) << dendl; + ceph_assert(!cct->_conf->filestore_fail_eio); + } + dout(1) << __func__ << " " << path << " split completed in pg " << coll() + << "." << dendl; + } } + + return 0; } int HashIndex::_remove(const vector &path, @@ -569,14 +577,28 @@ int HashIndex::_remove(const vector &path, r = set_info(path, info); if (r < 0) return r; + if (must_merge(info)) { + dout(1) << __func__ << " " << path << " has " << info.objs + << " objects, starting merge in pg " << coll() << "." << dendl; r = initiate_merge(path, info); - if (r < 0) - return r; - return complete_merge(path, info); - } else { - return 0; + if (r < 0) { + derr << __func__ << " error starting merge " << path << " in pg " + << coll() << ": " << cpp_strerror(r) << dendl; + ceph_assert(!cct->_conf->filestore_fail_eio); + } else { + r = complete_merge(path, info); + if (r < 0) { + derr << __func__ << " error completing merge " << path << " in pg " + << coll() << ": " << cpp_strerror(r) << dendl; + ceph_assert(!cct->_conf->filestore_fail_eio); + } + dout(1) << __func__ << " " << path << " merge completed in pg " << coll() + << "." << dendl; + } } + + return 0; } int HashIndex::_lookup(const ghobject_t &oid,