From 8a9f6416d2806a74d9b510c6ee59d5065c9076a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Tue, 11 Feb 2025 15:39:39 +0100 Subject: [PATCH] fix(unified-storage): error on failed primary deletes in mode2 (#100427) --- pkg/apiserver/rest/dualwriter_mode2.go | 33 ++++++++++++-------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/pkg/apiserver/rest/dualwriter_mode2.go b/pkg/apiserver/rest/dualwriter_mode2.go index fd6aeaf7e23..62b3526d504 100644 --- a/pkg/apiserver/rest/dualwriter_mode2.go +++ b/pkg/apiserver/rest/dualwriter_mode2.go @@ -207,28 +207,25 @@ func (d *DualWriterMode2) Delete(ctx context.Context, name string, deleteValidat log := d.Log.WithValues("name", name, "method", method) ctx = klog.NewContext(ctx, log) + // We should delete from Unified storage first so we can retry if legacy fails. + startStorage := time.Now() + deletedS, _, err := d.Storage.Delete(ctx, name, deleteValidation, options) + d.recordStorageDuration(err != nil, mode2Str, d.resource, method, startStorage) + if err != nil { + if !apierrors.IsNotFound(err) { + log.WithValues("objectList", deletedS).Error(err, "could not delete from unified storage") + return nil, false, err + } + } + startLegacy := time.Now() deletedLS, async, err := d.Legacy.Delete(ctx, name, deleteValidation, options) - + d.recordLegacyDuration(err != nil, mode2Str, d.resource, method, startLegacy) + // Deleting from legacy should always work in mode two, as legacy is still the primary database and + // needs to have all the data. if err != nil { - if !apierrors.IsNotFound(err) { - log.WithValues("objectList", deletedLS).Error(err, "could not delete from legacy store") - d.recordLegacyDuration(true, mode2Str, d.resource, method, startLegacy) - return deletedLS, async, err - } + return nil, false, err } - d.recordLegacyDuration(false, mode2Str, d.resource, method, startLegacy) - - startStorage := time.Now() - deletedS, async, err := d.Storage.Delete(ctx, name, deleteValidation, options) - if err != nil { - if !apierrors.IsNotFound(err) { - log.WithValues("objectList", deletedS).Error(err, "could not delete from duplicate storage") - d.recordStorageDuration(true, mode2Str, d.resource, method, startStorage) - } - return deletedS, async, err - } - d.recordStorageDuration(false, mode2Str, d.resource, method, startStorage) go func() { areEqual := Compare(deletedS, deletedLS)