From 383489d5d96e673a6b5ce43facdad70c0b0b1d20 Mon Sep 17 00:00:00 2001 From: Krishnan Parthasarathi Date: Tue, 19 Mar 2024 17:10:58 -1000 Subject: [PATCH] Handle zero versions qualified for expiration (#19301) When objects have more versions than their ILM policy expects to retain via NewerNoncurrentVersions, but they don't qualify for expiry due to NoncurrentDays are configured in that rule. In this case, applyNewerNoncurrentVersionsLimit method was enqueuing empty tasks, which lead to a panic (panic: runtime error: index out of range [0] with length 0) in newerNoncurrentTask.OpHash method, which assumes the task to contain at least one version to expire. --- cmd/bucket-lifecycle.go | 4 ++++ cmd/data-scanner.go | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/bucket-lifecycle.go b/cmd/bucket-lifecycle.go index d34cec431..f6c74fd17 100644 --- a/cmd/bucket-lifecycle.go +++ b/cmd/bucket-lifecycle.go @@ -233,6 +233,10 @@ func (es *expiryState) enqueueByDays(oi ObjectInfo, event lifecycle.Event, src l // enqueueByNewerNoncurrent enqueues object versions expired by // NewerNoncurrentVersions limit for expiry. func (es *expiryState) enqueueByNewerNoncurrent(bucket string, versions []ObjectToDelete, lcEvent lifecycle.Event) { + if len(versions) == 0 { + return + } + task := newerNoncurrentTask{bucket: bucket, versions: versions, event: lcEvent} wrkr := es.getWorkerCh(task.OpHash()) if wrkr == nil { diff --git a/cmd/data-scanner.go b/cmd/data-scanner.go index 505f51dc1..4ba4a7c4a 100644 --- a/cmd/data-scanner.go +++ b/cmd/data-scanner.go @@ -1051,7 +1051,9 @@ func (i *scannerItem) applyNewerNoncurrentVersionLimit(ctx context.Context, _ Ob }) } - expState.enqueueByNewerNoncurrent(i.bucket, toDel, event) + if len(toDel) > 0 { + expState.enqueueByNewerNoncurrent(i.bucket, toDel, event) + } return objectInfos, nil }