Skip to content

Commit a316525

Browse files
committed
fix: ignore version conflicts in destroy calls
Add a small reproducer. Make the destroy code treat not found version as successful deletion. Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
1 parent 119f626 commit a316525

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

pkg/state/impl/etcd/etcd.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,12 @@ func (st *State) Destroy(ctx context.Context, resourcePointer resource.Pointer,
330330
var foundVersion int64
331331

332332
txnGetKvs := txnResp.Responses[0].GetResponseRange().Kvs
333-
if len(txnResp.Responses[0].GetResponseRange().Kvs) > 0 {
334-
foundVersion = txnGetKvs[0].Version
333+
if len(txnGetKvs) == 0 {
334+
return nil
335335
}
336336

337+
foundVersion = txnGetKvs[0].Version
338+
337339
return fmt.Errorf("failed to destroy: %w", ErrVersionConflict(resourcePointer, etcdVersion, foundVersion))
338340
}
339341

pkg/state/impl/etcd/etcd_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import (
1414
"github.com/cosi-project/runtime/pkg/state/conformance"
1515
"github.com/cosi-project/runtime/pkg/state/impl/store"
1616
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
1718
clientv3 "go.etcd.io/etcd/client/v3"
19+
"golang.org/x/sync/errgroup"
1820
"google.golang.org/grpc/metadata"
1921

2022
"github.com/cosi-project/state-etcd/pkg/state/impl/etcd"
@@ -57,6 +59,35 @@ func TestPreserveCreated(t *testing.T) {
5759
})
5860
}
5961

62+
func TestDestroy(t *testing.T) {
63+
t.Parallel()
64+
65+
res := conformance.NewPathResource("default", "/")
66+
67+
withEtcd(t, func(s state.State) {
68+
ctx, cancel := context.WithCancel(context.Background())
69+
defer cancel()
70+
71+
var eg errgroup.Group
72+
73+
err := s.Create(ctx, res)
74+
assert.NoError(t, err)
75+
76+
for range 10 {
77+
eg.Go(func() error {
78+
err := s.Destroy(ctx, res.Metadata())
79+
if err != nil && !state.IsNotFoundError(err) {
80+
return err
81+
}
82+
83+
return nil
84+
})
85+
}
86+
87+
require.NoError(t, eg.Wait())
88+
})
89+
}
90+
6091
func TestClearGRPCMetadata(t *testing.T) {
6192
t.Parallel()
6293

0 commit comments

Comments
 (0)