{"record":{"id":"cc6dff5b6222ef4e","repo":"helm/helm","slug":"uninstall-failed-to-purge-the-release-w","errorCode":null,"errorMessage":"uninstall: Failed to purge the release: %w","messagePattern":"uninstall: Failed to purge the release: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/action/uninstall.go","lineNumber":188,"sourceCode":"\t}\n\tif len(relsi) < 1 {\n\t\treturn nil, errMissingRelease\n\t}\n\n\trels, err := releaseListToV1List(relsi)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treleaseutil.SortByRevision(rels)\n\trel := rels[len(rels)-1]\n\n\t// TODO: Are there any cases where we want to force a delete even if it's\n\t// already marked deleted?\n\tif rel.Info.Status == common.StatusUninstalled {\n\t\tif !u.KeepHistory {\n\t\t\tif err := u.purgeReleases(rels...); err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"uninstall: Failed to purge the release: %w\", err)\n\t\t\t}\n\t\t\treturn &releasei.UninstallReleaseResponse{Release: rel}, nil\n\t\t}\n\t\treturn nil, fmt.Errorf(\"the release named %q is already deleted\", name)\n\t}\n\n\tu.cfg.Logger().Debug(\"uninstall: deleting release\", \"name\", name)\n\trel.Info.Status = common.StatusUninstalling\n\trel.Info.Deleted = time.Now()\n\trel.Info.Description = \"Deletion in progress (or silently failed)\"\n\tres := &releasei.UninstallReleaseResponse{Release: rel}\n\n\tif !u.DisableHooks {\n\t\tserverSideApply := true\n\t\tif err := u.cfg.execHook(rel, release.HookPreDelete, u.WaitStrategy, u.WaitOptions, u.Timeout, serverSideApply); err != nil {\n\t\t\treturn res, err\n\t\t}\n\t} else {","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/helm/helm/blob/2a29f1770b62844b27197d2507377361d45ad7c0/pkg/action/uninstall.go#L170-L206","documentation":"On the already-uninstalled path: the latest revision has StatusUninstalled and KeepHistory is false, so Helm tries to purge every historical revision via Releases.Delete(name, version); one delete failed and the wrapped storage error is returned. The release stays half-purged: some revisions removed, the failing one(s) still in storage.","triggerScenarios":"u.purgeReleases iterating all revisions and the driver Delete failing on any single one: RBAC delete denial on that Secret/ConfigMap, SQL delete error, concurrent uninstall deleting the same revision first (404/already-gone race).","commonSituations":"Two helm uninstall processes racing; permission grants that allow get/list but not delete on secrets; SQL backend constraint or connection drop mid-purge; operator automation re-running cleanup after a partially failed prior purge.","solutions":["Check which revisions remain: helm history <name> or kubectl get secrets | grep sh.helm.release.v1.<name>","Grant delete permission or fix the backend error named by the wrapped %w","Re-run helm uninstall <name> (without --keep-history) — purging remaining revisions is idempotent","Delete leftover records manually if the release object is otherwise empty: kubectl delete secret sh.helm.release.v1.<name>.v<N>"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"uninstall: Failed to purge the release\") {\n    // half-purged history: re-running uninstall without --keep-history is idempotent\n    u.KeepHistory = false\n    return u.Run(name)\n}","preventionTips":["Never run two uninstalls of one release concurrently; lock per release in automation","Ensure delete verb on release secrets/configmaps, not just get/list","After purge errors, sweep for leftover sh.helm.release.v1.<name>.* records before declaring cleanup done"],"tags":["helm","uninstall","storage","purge","rbac"],"backgroundTag":null,"analyzedSha":"2a29f1770b62844b27197d2507377361d45ad7c0","analyzedAt":"2026-08-15T22:02:47.490Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}