Project

General

Profile

Backport #41116

luminous: Lifecycle expiration action generates delete marker continuously

Added by Patrick Donnelly 8 months ago. Updated 7 months ago.

Status:
Need More Info
Priority:
Normal
Assignee:
-
Target version:
-
Release:
luminous
Crash signature:

Related issues

Copied from rgw - Bug #40393: Lifecycle expiration action generates delete marker continuously Pending Backport 06/17/2019

History

#1 Updated by Patrick Donnelly 8 months ago

  • Copied from Bug #40393: Lifecycle expiration action generates delete marker continuously added

#2 Updated by Nathan Cutler 7 months ago

  • Status changed from New to Need More Info

In luminous, src/rgw/rgw_lc.cc looks very different than in mimic+. This looks difficult to backport to luminous.

#3 Updated by Matt Benjamin 7 months ago

Hi Nathan,

The process on L is indeed (or should I say "remove_indeed") has a very different flow. It looks to me that this behavior was most likely a regression relative to L, though.

On L, the logic is unrolled in RGWLC::bucket_lc_process, into two large cases: !versioned bucket, and else (the case has a misleading comment "/* bucket versioning is enabled or suspended */"). So if there can be a delete marker, it's only in the else case, and, in the else case, remove_expired_obj can be reached only if we dont take the branch (my l.555):

if (obj_iter->is_delete_marker()) {
if ((obj_iter + 1)==objs.end()) {
if (is_truncated) {
//deal with it in next round because we can't judge whether this marker is the only version
list_op.get_next_marker() = obj_iter->key;
break;
}
} else if (obj_iter->key.name.compare((obj_iter + 1)->key.name) == 0) { //*obj_iter is delete marker and isn't the only version, do nothing.
continue;
}
skip_expiration = prefix_iter->second.dm_expiration;
remove_indeed = true; //we should remove the delete marker if it's the only version
} else {
remove_indeed = false;
}

Which looks like the same logic from the upstream PR l. 729?

}
if (o.is_delete_marker()) {
if (oc.ol.next_has_same_name()) {
return false;
} else {
*exp_time = real_clock::now();
return true;
}
}

Matt

Also available in: Atom PDF