[#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:
parent
b3677cefbb
commit
0e58ccbed7
2 changed files with 26 additions and 6 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue