From 78b790b0b92fb2d10fa5fe25223b8c9ed310c932 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Mon, 19 Apr 2021 08:32:01 +0100 Subject: [PATCH] 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) --- src/os/filestore/HashIndex.cc | 48 +++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/os/filestore/HashIndex.cc b/src/os/filestore/HashIndex.cc index edd8339556f6..75c3d1b673b2 100644 --- a/src/os/filestore/HashIndex.cc +++ b/src/os/filestore/HashIndex.cc @@ -552,15 +552,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, @@ -578,14 +586,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, -- 2.47.3