{"record":{"id":"474b58c56f92da4c","repo":"tailscale/tailscale","slug":"failed-to-delete-config-secrets-for-peerrelay-q","errorCode":null,"errorMessage":"failed to delete config Secrets for PeerRelay %q: %w","messagePattern":"failed to delete config Secrets for PeerRelay %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"k8s-operator/reconciler/peerrelay/peerrelay.go","lineNumber":392,"sourceCode":"\t\treturn fmt.Errorf(\"failed to update PeerRelay status: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc (r *Reconciler) delete(ctx context.Context, logger *zap.SugaredLogger, pr *tsapi.PeerRelay) (reconcile.Result, error) {\n\tlogger.Infof(\"deleting PeerRelay %q\", pr.Name)\n\n\tif err := r.deleteDevicesFrom(ctx, logger, pr, 0); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to delete tailnet devices for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err := r.deleteStatefulSet(ctx, logger, pr); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to delete StatefulSet for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err := r.deleteConfigSecretsFrom(ctx, logger, pr, 0); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to delete config Secrets for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err := r.deleteServicesFrom(ctx, logger, pr, 0); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to delete Services for PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tif err := reconciler.ClearFinalizer(ctx, r.Client, pr, reconciler.Finalizer); err != nil {\n\t\treturn reconcile.Result{}, fmt.Errorf(\"failed to remove finalizer from PeerRelay %q: %w\", pr.Name, err)\n\t}\n\n\tr.tracker.Remove(pr.UID)\n\tr.reissuer.RemoveState(pr.Name)\n\n\treturn reconcile.Result{}, nil\n}\n\nfunc (r *Reconciler) ensureService(ctx context.Context, logger *zap.SugaredLogger, desired *corev1.Service) error {\n\tlogger.Debugf(\"applying Service %q\", desired.Name)","sourceCodeStart":374,"sourceCodeEnd":410,"githubUrl":"https://github.com/tailscale/tailscale/blob/6e0912f97994f927632b34ae9e63b53d6516a6ac/k8s-operator/reconciler/peerrelay/peerrelay.go#L374-L410","documentation":"Raised in delete when deleteConfigSecretsFrom (all replicas) cannot list or delete the tailscaled config Secrets. Devices and the StatefulSet are already gone; the finalizer is retained until the Secrets are removed.","triggerScenarios":"Thrown at k8s-operator/reconciler/peerrelay/peerrelay.go:392 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Deleting the config Secrets failed; check RBAC delete permission on Secrets and retry."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6e0912f97994f927632b34ae9e63b53d6516a6ac","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}