Description of problem: In cls_timeindex_list() though `to_index` has expired for a timespan, the marker is set for a subsequent index during the time boundary check. This marker is further returned to RGWObjectExpirer::process_single_shard(), where this out_marker is trimmed from the respective shard, resulting in a lost removal hint and a leaked object. Version-Release number of selected component (if applicable): 2.3 How reproducible: 100% Steps to Reproduce: To reproduce this, I've used the following simple script and by having an aggressive object expiry gc interval setting rgw_objexp_gc_interval = 30 !/bin/sh object="myobjects" container=newcontainer objects=50 j=1 while [ $j -lt $objects ] do final_object=$(printf "%s$j" "$object") touch $final_object swift -A http://localhost:80/auth -U test:tester -K testing upload $container $final_object -H X-Delete-After:60 j=`expr $j + 1` done For one such run, am left with the following leaked objects after the run swift -A http://localhost:80/auth -U test:tester -K testing list newcontainer myobjects20 myobjects24 myobjects33 Actual results: Objects not expired Expected results: Objects should be expired Additional info: Upstream PR: https://github.com/ceph/ceph/pull/18821