From: Casey Bodley Date: Wed, 8 Feb 2023 19:01:29 +0000 (-0500) Subject: cls/rgw: remove index entry after cancelling last racing delete op X-Git-Tag: v18.1.0~352^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=08efcc2536c34935a516bf850a9f909c0a3b3f52;p=ceph.git cls/rgw: remove index entry after cancelling last racing delete op Signed-off-by: Casey Bodley --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index a4c531915514..cf5f1793b674 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -1172,18 +1172,32 @@ int rgw_bucket_complete_op(cls_method_context_t hctx, bufferlist *in, bufferlist if (op.op == CLS_RGW_OP_CANCEL) { log_op = false; // don't log cancelation if (op.tag.size()) { - // we removed this tag from pending_map so need to write the changes - CLS_LOG_BITX(bitx_inst, 20, - "INFO: %s: setting map entry at key=%s", - __func__, escape_str(idx).c_str()); - bufferlist new_key_bl; - encode(entry, new_key_bl); - rc = cls_cxx_map_set_val(hctx, idx, &new_key_bl); - if (rc < 0) { - CLS_LOG_BITX(bitx_inst, 1, - "ERROR: %s: unable to set map val, key=%s, rc=%d", - __func__, escape_str(idx).c_str(), rc); - return rc; + if (!entry.exists && entry.pending_map.empty()) { + // a racing delete succeeded, and we canceled the last pending op + CLS_LOG_BITX(bitx_inst, 20, + "INFO: %s: removing map entry with key=%s", + __func__, escape_str(idx).c_str()); + rc = cls_cxx_map_remove_key(hctx, idx); + if (rc < 0) { + CLS_LOG_BITX(bitx_inst, 1, + "ERROR: %s: unable to remove map key, key=%s, rc=%d", + __func__, escape_str(idx).c_str(), rc); + return rc; + } + } else { + // we removed this tag from pending_map so need to write the changes + CLS_LOG_BITX(bitx_inst, 20, + "INFO: %s: setting map entry at key=%s", + __func__, escape_str(idx).c_str()); + bufferlist new_key_bl; + encode(entry, new_key_bl); + rc = cls_cxx_map_set_val(hctx, idx, &new_key_bl); + if (rc < 0) { + CLS_LOG_BITX(bitx_inst, 1, + "ERROR: %s: unable to set map val, key=%s, rc=%d", + __func__, escape_str(idx).c_str(), rc); + return rc; + } } } } // CLS_RGW_OP_CANCEL