diff --git a/internal/lifecycle/executor.go b/internal/lifecycle/executor.go index 14d1b67..e7a79af 100644 --- a/internal/lifecycle/executor.go +++ b/internal/lifecycle/executor.go @@ -192,7 +192,10 @@ func (e *Executor) matchMultipartByRulesFn(ni *netmap.NetworkInfo, rules []data. matchers := make([]func(*data.MultipartInfo) bool, 0, len(rules)) for _, rule := range rules { matchFn, err := e.matchMultipartByRuleFn(ni, rule) - if err != nil && !errors.Is(err, errNotApplicableRule) { + if err != nil { + if errors.Is(err, errNotApplicableRule) { + continue + } return nil, err } diff --git a/internal/lifecycle/executor_test.go b/internal/lifecycle/executor_test.go index 4a365b1..c71abbf 100644 --- a/internal/lifecycle/executor_test.go +++ b/internal/lifecycle/executor_test.go @@ -325,6 +325,48 @@ func TestExecutorMultipleRules(t *testing.T) { } } +func TestExecutorMultipleRulesMultiparts(t *testing.T) { + ec := newExecutorContext(t) + defer ec.cancel() + + bktInfo, err := ec.createBktInfo(data.VersioningUnversioned) + require.NoError(t, err) + + err = ec.tree.CreateMultipartUpload(ec.ctx, bktInfo, &data.MultipartInfo{Key: "obj1", UploadID: "upload1", Meta: map[string]string{}}) + require.NoError(t, err) + err = ec.tree.CreateMultipartUpload(ec.ctx, bktInfo, &data.MultipartInfo{Key: "obj2", UploadID: "upload2", Meta: map[string]string{}}) + require.NoError(t, err) + + lifecycleCfg := &data.LifecycleConfiguration{Rules: []data.LifecycleRule{ + { + Status: "Disabled", + AbortIncompleteMultipartUpload: &data.AbortIncompleteMultipartUpload{DaysAfterInitiation: ptrInt(1)}, + Filter: &data.LifecycleRuleFilter{Prefix: "obj1"}, + ID: "for obj1", + }, + { + Status: "Enabled", + AbortIncompleteMultipartUpload: &data.AbortIncompleteMultipartUpload{DaysAfterInitiation: ptrInt(1)}, + Filter: &data.LifecycleRuleFilter{Prefix: "obj2"}, + ID: "for obj2", + }, + }} + + ec.jobs <- Job{ + ContainerID: bktInfo.CID, + PrivateKey: ec.key, + LifecycleConfiguration: lifecycleCfg, + Epoch: 1, + } + + ec.close() + + multiparts, err := ec.tree.GetMultipartUploadsByPrefix(ec.ctx, bktInfo, "") + require.NoError(t, err) + require.Len(t, multiparts, 1) + require.Equal(t, multiparts[0].Key, "obj1") +} + func ptrUint64(val uint64) *uint64 { return &val }