helm/helm · error

uninstall: Failed to purge the release: %w

Error message

uninstall: Failed to purge the release: %w

What it means

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.

Source

Thrown at pkg/action/uninstall.go:188

	}
	if len(relsi) < 1 {
		return nil, errMissingRelease
	}

	rels, err := releaseListToV1List(relsi)
	if err != nil {
		return nil, err
	}

	releaseutil.SortByRevision(rels)
	rel := rels[len(rels)-1]

	// TODO: Are there any cases where we want to force a delete even if it's
	// already marked deleted?
	if rel.Info.Status == common.StatusUninstalled {
		if !u.KeepHistory {
			if err := u.purgeReleases(rels...); err != nil {
				return nil, fmt.Errorf("uninstall: Failed to purge the release: %w", err)
			}
			return &releasei.UninstallReleaseResponse{Release: rel}, nil
		}
		return nil, fmt.Errorf("the release named %q is already deleted", name)
	}

	u.cfg.Logger().Debug("uninstall: deleting release", "name", name)
	rel.Info.Status = common.StatusUninstalling
	rel.Info.Deleted = time.Now()
	rel.Info.Description = "Deletion in progress (or silently failed)"
	res := &releasei.UninstallReleaseResponse{Release: rel}

	if !u.DisableHooks {
		serverSideApply := true
		if err := u.cfg.execHook(rel, release.HookPreDelete, u.WaitStrategy, u.WaitOptions, u.Timeout, serverSideApply); err != nil {
			return res, err
		}
	} else {

View on GitHub (pinned to 2a29f1770b)

Solutions

  1. Check which revisions remain: helm history <name> or kubectl get secrets | grep sh.helm.release.v1.<name>
  2. Grant delete permission or fix the backend error named by the wrapped %w
  3. Re-run helm uninstall <name> (without --keep-history) — purging remaining revisions is idempotent
  4. Delete leftover records manually if the release object is otherwise empty: kubectl delete secret sh.helm.release.v1.<name>.v<N>
Defensive patterns

Strategy: retry

Try / catch

if err != nil && strings.Contains(err.Error(), "uninstall: Failed to purge the release") {
    // half-purged history: re-running uninstall without --keep-history is idempotent
    u.KeepHistory = false
    return u.Run(name)
}

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Related errors


AI-assisted analysis of helm/helm@2a29f1770b (2026-08-15). Data as JSON: /api/errors/cc6dff5b6222ef4e. Report an issue: GitHub.