]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: shouldn't call index_op.cancel() when rados op return ETIMEDOUT
authorlu.shasha <lu.shasha@aishu.cn>
Fri, 6 Dec 2024 04:40:27 +0000 (12:40 +0800)
committerlu.shasha <lu.shasha@aishu.cn>
Fri, 6 Dec 2024 04:42:54 +0000 (12:42 +0800)
when rados op return ETIMEOUT, rgw can't determine whether or not the rados op succeeded,
we shouldn't be calling index_op->cancel() in this case
Instead, we should leave that pending entry in the index so than bucket listing can recover with check_disk_state() and cls_rgw_suggest_changes()

Signed-off-by: Shasha Lu <lu.shasha@aishu.cn>
src/rgw/driver/rados/rgw_rados.cc

index 5a7cd92790a324f1c17db95b1a2af6adff84bff9..b79f81c9f2160c8aec09617b58edb8f4f2992735 100644 (file)
@@ -3343,12 +3343,17 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
   return 0;
 
 done_cancel:
-  int ret = index_op->cancel(rctx.dpp, meta.remove_objs, rctx.y, log_op);
-  if (ret < 0) {
-    ldpp_dout(rctx.dpp, 0) << "ERROR: index_op.cancel() returned ret=" << ret << dendl;
-  }
+  // if r == -ETIMEDOUT, rgw can't determine whether or not the rados op succeeded
+  // we shouldn't be calling index_op->cancel() in this case
+  // Instead, we should leave that pending entry in the index so than bucket listing can recover with check_disk_state() and cls_rgw_suggest_changes()
+  if (r != -ETIMEDOUT) {
+    int ret = index_op->cancel(rctx.dpp, meta.remove_objs, rctx.y, log_op);
+    if (ret < 0) {
+      ldpp_dout(rctx.dpp, 0) << "ERROR: index_op.cancel() returned ret=" << ret << dendl;
+    }
 
-  meta.canceled = true;
+    meta.canceled = true;
+  }
 
   /* we lost in a race. There are a few options:
    * - existing object was rewritten (ECANCELED)