From 09b71b1675937209f69171584bf26d81b3efe3b3 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 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, -- 2.39.5