fix(lifecycle): Fix ObjectInfo fields and mod_time error handling (#1088)

Co-authored-by: loverustfs <hello@rustfs.com>
This commit is contained in:
tennisleng
2025-12-10 18:17:35 -05:00
committed by GitHub
parent 53c126d678
commit 978845b555
2 changed files with 16 additions and 4 deletions
+2
View File
@@ -473,6 +473,8 @@ impl Scanner {
size: usage.total_size as i64, size: usage.total_size as i64,
delete_marker: !usage.has_live_object && usage.delete_markers_count > 0, delete_marker: !usage.has_live_object && usage.delete_markers_count > 0,
mod_time: usage.last_modified_ns.and_then(Self::ns_to_offset_datetime), mod_time: usage.last_modified_ns.and_then(Self::ns_to_offset_datetime),
// Set is_latest to true for live objects - required for lifecycle expiration evaluation
is_latest: usage.has_live_object,
..Default::default() ..Default::default()
} }
} }
@@ -283,7 +283,17 @@ impl Lifecycle for BucketLifecycleConfiguration {
"eval_inner: object={}, mod_time={:?}, now={:?}, is_latest={}, delete_marker={}", "eval_inner: object={}, mod_time={:?}, now={:?}, is_latest={}, delete_marker={}",
obj.name, obj.mod_time, now, obj.is_latest, obj.delete_marker obj.name, obj.mod_time, now, obj.is_latest, obj.delete_marker
); );
if obj.mod_time.expect("err").unix_timestamp() == 0 {
// Gracefully handle missing mod_time instead of panicking
let mod_time = match obj.mod_time {
Some(t) => t,
None => {
info!("eval_inner: mod_time is None for object={}, returning default event", obj.name);
return Event::default();
}
};
if mod_time.unix_timestamp() == 0 {
info!("eval_inner: mod_time is 0, returning default event"); info!("eval_inner: mod_time is 0, returning default event");
return Event::default(); return Event::default();
} }
@@ -323,7 +333,7 @@ impl Lifecycle for BucketLifecycleConfiguration {
} }
if let Some(days) = expiration.days { if let Some(days) = expiration.days {
let expected_expiry = expected_expiry_time(obj.mod_time.unwrap(), days /*, date*/); let expected_expiry = expected_expiry_time(mod_time, days /*, date*/);
if now.unix_timestamp() >= expected_expiry.unix_timestamp() { if now.unix_timestamp() >= expected_expiry.unix_timestamp() {
events.push(Event { events.push(Event {
action: IlmAction::DeleteVersionAction, action: IlmAction::DeleteVersionAction,
@@ -446,11 +456,11 @@ impl Lifecycle for BucketLifecycleConfiguration {
}); });
} }
} else if let Some(days) = expiration.days { } else if let Some(days) = expiration.days {
let expected_expiry: OffsetDateTime = expected_expiry_time(obj.mod_time.unwrap(), days); let expected_expiry: OffsetDateTime = expected_expiry_time(mod_time, days);
info!( info!(
"eval_inner: expiration check - days={}, obj_time={:?}, expiry_time={:?}, now={:?}, should_expire={}", "eval_inner: expiration check - days={}, obj_time={:?}, expiry_time={:?}, now={:?}, should_expire={}",
days, days,
obj.mod_time.expect("err!"), mod_time,
expected_expiry, expected_expiry,
now, now,
now.unix_timestamp() > expected_expiry.unix_timestamp() now.unix_timestamp() > expected_expiry.unix_timestamp()