From 570adec5bb8142f5baf1f05f0040e8afdb11ec05 Mon Sep 17 00:00:00 2001 From: Cory Snyder Date: Thu, 21 Sep 2023 19:27:51 +0000 Subject: [PATCH] rgw: prevent another leftover bucket index olh entry scenario If a call to bucket_index_link_olh or bucket_index_unlink_instance fails, its associated pending xattr may have prevented the olh object from being removed by another thread. We should do a best effort cleanup attempt for this case by calling update_olh before returning an error to the caller. Signed-off-by: Cory Snyder --- src/rgw/driver/rados/rgw_rados.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index f634df58a52c4..b6e3151295a1e 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -8102,6 +8102,13 @@ int RGWRados::set_olh(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx, } continue; } + // it's possible that the pending xattr from this op prevented the olh + // object from being cleaned by another thread that was deleting the last + // existing version. We invoke a best-effort update_olh here to handle this case. + int r = update_olh(dpp, obj_ctx, state, bucket_info, olh_obj, y); + if (r < 0 && r != -ECANCELED) { + ldpp_dout(dpp, 20) << "update_olh() target_obj=" << olh_obj << " returned " << r << dendl; + } return ret; } break; @@ -8170,6 +8177,13 @@ int RGWRados::unlink_obj_instance(const DoutPrefixProvider *dpp, RGWObjectCtx& o if (ret == -ECANCELED) { continue; } + // it's possible that the pending xattr from this op prevented the olh + // object from being cleaned by another thread that was deleting the last + // existing version. We invoke a best-effort update_olh here to handle this case. + int r = update_olh(dpp, obj_ctx, state, bucket_info, olh_obj, y, zones_trace); + if (r < 0 && r != -ECANCELED) { + ldpp_dout(dpp, 20) << "update_olh() target_obj=" << olh_obj << " returned " << r << dendl; + } return ret; } break; -- 2.39.5