diff --git a/pkg/storage/unified/resource/datastore.go b/pkg/storage/unified/resource/datastore.go index eabacd2da1a..0b06a2e7a43 100644 --- a/pkg/storage/unified/resource/datastore.go +++ b/pkg/storage/unified/resource/datastore.go @@ -449,6 +449,27 @@ func (d *dataStore) Delete(ctx context.Context, key DataKey) error { return d.kv.Delete(ctx, dataSection, key.String()) } +func (n *dataStore) BatchDelete(ctx context.Context, keys []DataKey) error { + for len(keys) > 0 { + batch := keys + if len(batch) > dataBatchSize { + batch = batch[:dataBatchSize] + } + + keys = keys[len(batch):] + stringKeys := make([]string, len(batch)) + for _, dataKey := range batch { + stringKeys = append(stringKeys, dataKey.String()) + } + + if err := n.kv.BatchDelete(ctx, dataSection, stringKeys); err != nil { + return err + } + } + + return nil +} + // ParseKey parses a string key into a DataKey struct func ParseKey(key string) (DataKey, error) { parts := strings.Split(key, "/") diff --git a/pkg/storage/unified/resource/datastore_test.go b/pkg/storage/unified/resource/datastore_test.go index 39d995b810a..4402100f3e9 100644 --- a/pkg/storage/unified/resource/datastore_test.go +++ b/pkg/storage/unified/resource/datastore_test.go @@ -2950,6 +2950,42 @@ func TestDataStore_getGroupResources(t *testing.T) { } } +func TestDataStore_BatchDelete(t *testing.T) { + ds := setupTestDataStore(t) + ctx := context.Background() + + keys := make([]DataKey, 95) + for i := 0; i < 95; i++ { + rv := node.Generate().Int64() + keys[i] = DataKey{ + Namespace: "test-namespace", + Group: "test-group", + Resource: "test-resource", + Name: fmt.Sprintf("test-name-%d", i), + ResourceVersion: rv, + Action: DataActionCreated, + Folder: "test-folder", + } + content := fmt.Sprintf("test-value-%d", i) + err := ds.Save(ctx, keys[i], bytes.NewReader([]byte(content))) + require.NoError(t, err) + } + + err := ds.BatchDelete(ctx, keys) + require.NoError(t, err) + + // Verify all events were deleted + for i := 0; i < 95; i++ { + _, err := ds.Get(ctx, DataKey{ + Namespace: "test-namespace", + Group: "test-group", + Resource: "test-resource", + Name: fmt.Sprintf("test-name-%d", i), + }) + require.Error(t, err, "Resource should have been deleted") + } +} + func TestDataStore_BatchGet(t *testing.T) { ds := setupTestDataStore(t) ctx := context.Background()