[#17] executor: Don't create unnecessary delete markers

Separate regular expiration from non-current versions removing

Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
Denis Kirillov 2024-08-02 15:05:10 +03:00
parent b3677cefbb
commit 0e58ccbed7
2 changed files with 26 additions and 6 deletions

View file

@ -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
}

View file

@ -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) {