diff --git a/internal/lifecycle/executor.go b/internal/lifecycle/executor.go index 5ab3984..8c4c41b 100644 --- a/internal/lifecycle/executor.go +++ b/internal/lifecycle/executor.go @@ -438,17 +438,19 @@ func (e *Executor) expiredObjectMatcher(ctx context.Context, bktInfo *data.Bucke return nil, fmt.Errorf("invalid expiration date '%s': %w", rule.Expiration.Date, err) } - if prm.expirationEpoch, err = timeToEpoch(ni, dateToExpire); err != nil { + expirationEpoch, err := timeToEpoch(ni, dateToExpire) + if err != nil { return nil, fmt.Errorf("expiration date to epoch: %w", err) } + prm.expirationEpoch = &expirationEpoch } if rule.Expiration.Days != nil { - var err error - prm.expirationDurationEpochs, err = durationToEpochsAbs(ni, 24*time.Hour*time.Duration(*rule.Expiration.Days)) + expirationDurationEpochs, err := durationToEpochsAbs(ni, 24*time.Hour*time.Duration(*rule.Expiration.Days)) if err != nil { return nil, fmt.Errorf("Expiration.Days to epochs: %w", err) } + prm.expirationDurationEpochs = &expirationDurationEpochs } prm.expiredObjectDeleteMarker = rule.Expiration.ExpiredObjectDeleteMarker != nil && *rule.Expiration.ExpiredObjectDeleteMarker @@ -478,8 +480,8 @@ type objectMatcherParams struct { maxObjSize uint64 nonCurrentDuration *uint64 expiredObjectDeleteMarker bool - expirationEpoch uint64 - expirationDurationEpochs uint64 + expirationEpoch *uint64 + expirationDurationEpochs *uint64 tagsToMatch []data.Tag } @@ -520,12 +522,26 @@ func (e *Executor) objectMatcher(ctx context.Context, bktInfo *data.BucketInfo, return true, nil } + if prm.expirationEpoch == nil && prm.expirationDurationEpochs == nil { + return false, nil + } + versionEpoch, err := versionCreationEpoch(version, ni) if err != nil { return false, err } - if ni.CurrentEpoch() < prm.expirationEpoch && versionEpoch+prm.expirationDurationEpochs > ni.CurrentEpoch() { + var expirationEpoch uint64 + switch { + case prm.expirationEpoch == nil: + expirationEpoch = versionEpoch + *prm.expirationDurationEpochs + case prm.expirationDurationEpochs == nil: + expirationEpoch = *prm.expirationEpoch + default: + expirationEpoch = min(*prm.expirationEpoch, versionEpoch+*prm.expirationDurationEpochs) + } + + if ni.CurrentEpoch() < expirationEpoch { return false, nil } diff --git a/internal/lifecycle/executor_test.go b/internal/lifecycle/executor_test.go index 1c550ff..14bbfc0 100644 --- a/internal/lifecycle/executor_test.go +++ b/internal/lifecycle/executor_test.go @@ -227,6 +227,10 @@ func TestExecutorFilterNewerNoncurrent(t *testing.T) { require.NoError(t, err) } } + + versions, err := ec.tree.GetVersions(ec.ctx, bktInfo, "obj") + require.NoError(t, err) + require.Len(t, versions, maxNonCurrent+1) } func TestExecutorFilterNoncurrent(t *testing.T) {