From: Pritha Srivastava Date: Wed, 14 Oct 2020 11:05:50 +0000 (+0530) Subject: rgw/gc: fixing the condition when marker for a queue is X-Git-Tag: v16.1.0~790^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bf3f3ba675d092f48e403826fc0813e23c07045d;p=ceph.git rgw/gc: fixing the condition when marker for a queue is always reset to empty which causes RGWGC::list to get stuck in a loop, which ultimately is broken out of when the queue's truncated flag is false. 1. Check for entries size also while evaluating whether objects cache for a gc object should be marked as 'transitioned' in case of cls_rgw_gc_list. When there are no entries, we get back a return value of 0, and the object cache is not marked as 'transitioned'. 2. Also for the last gc object, we need to check whether the queue is still under process and set the correct flag. Missing the two conditions above causes the GC::list to loop continously over the same gc object. Fixes: https://tracker.ceph.com/issues/47909 Signed-off-by: Pritha Srivastava --- diff --git a/src/rgw/rgw_gc.cc b/src/rgw/rgw_gc.cc index b7b89e7b8697..ef8ad3b18de0 100644 --- a/src/rgw/rgw_gc.cc +++ b/src/rgw/rgw_gc.cc @@ -209,7 +209,7 @@ int RGWGC::list(int *index, string& marker, uint32_t max, bool expired_only, std } obj_version objv; cls_version_read(store->gc_pool_ctx, obj_names[*index], &objv); - if (ret == -ENOENT) { + if (ret == -ENOENT || entries.size() == 0) { if (objv.ver == 0) { continue; } else { @@ -253,6 +253,11 @@ int RGWGC::list(int *index, string& marker, uint32_t max, bool expired_only, std marker = next_marker; if (*index == max_objs - 1) { + if (queue_entries.size() > 0 && *truncated) { + processing_queue = true; + } else { + processing_queue = false; + } /* we cut short here, truncated will hold the correct value */ return 0; } @@ -538,13 +543,13 @@ int RGWGC::process(int index, int max_secs, bool expired_only, if (non_expired_entries.size() == 0) { transitioned_objects_cache[index] = true; marker.clear(); - ldpp_dout(this, 20) << "RGWGC::process cls_rgw_gc_list returned ENOENT for non expired entries, so setting cache entry to TRUE" << dendl; + ldpp_dout(this, 20) << "RGWGC::process cls_rgw_gc_list returned NO non expired entries, so setting cache entry to TRUE" << dendl; } else { ret = 0; goto done; } } - if ((objv.ver == 0) && (ret == -ENOENT)) { + if ((objv.ver == 0) && (ret == -ENOENT || entries.size() == 0)) { ret = 0; goto done; }