From 7281bb7069fb3f4c8b0d0bc4623e6fd343881be0 Mon Sep 17 00:00:00 2001 From: Rafael Bortolon Paulovic Date: Thu, 6 Nov 2025 09:21:11 +0100 Subject: [PATCH] fix: background delete on create failure after ctx cancellation (#113442) * fix: background delete on create failure after ctx cancellation * fix: address comments * chore: remove tests using mock --- pkg/storage/legacysql/dualwrite/dualwriter.go | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/pkg/storage/legacysql/dualwrite/dualwriter.go b/pkg/storage/legacysql/dualwrite/dualwriter.go index cefaf923efc..adb36ae5e73 100644 --- a/pkg/storage/legacysql/dualwrite/dualwriter.go +++ b/pkg/storage/legacysql/dualwrite/dualwriter.go @@ -241,10 +241,12 @@ func (d *dualWriter) Create(ctx context.Context, in runtime.Object, createValida if errObjectSt != nil { log.With("object", createdCopy).Error("failed to CREATE object in unified storage", "err", errObjectSt) // If we cannot create in unified storage, attempt to clean up legacy. - _, _, err = d.legacy.Delete(ctx, accCreated.GetName(), nil, &metav1.DeleteOptions{}) - if err != nil { - log.With("name", accCreated.GetName()).Error("failed to CLEANUP object in legacy storage", "err", err) - } + go func(ctxBg context.Context, cancel context.CancelFunc) { + defer cancel() + if _, asyncDelete, err := d.legacy.Delete(ctxBg, accCreated.GetName(), nil, &metav1.DeleteOptions{}); err != nil { + log.With("name", accCreated.GetName()).Error("failed to CLEANUP object in legacy storage", "err", err, "asyncDelete", asyncDelete) + } + }(context.WithTimeout(context.WithoutCancel(ctx), backgroundReqTimeout)) return nil, errObjectSt } return storageObj, nil @@ -263,12 +265,13 @@ func (d *dualWriter) Create(ctx context.Context, in runtime.Object, createValida if d.errorIsOK { return createdFromLegacy, nil } - // If we cannot create in unified storage, attempt to clean up legacy. - _, _, errLegacy := d.legacy.Delete(ctx, accCreated.GetName(), nil, &metav1.DeleteOptions{}) - if errLegacy != nil { - log.With("name", accCreated.GetName()).Error("failed to CLEANUP object in legacy storage", "err", errLegacy) - } + go func(ctxBg context.Context, cancel context.CancelFunc) { + defer cancel() + if _, asyncDelete, err := d.legacy.Delete(ctxBg, accCreated.GetName(), nil, &metav1.DeleteOptions{}); err != nil { + log.With("name", accCreated.GetName()).Error("failed to CLEANUP object in legacy storage", "err", err, "asyncDelete", asyncDelete) + } + }(context.WithTimeout(context.WithoutCancel(ctx), backgroundReqTimeout)) return nil, err } }