{"record":{"id":"c614e3975760ffc1","repo":"argoproj/argo-workflows","slug":"offload-node-status-is-not-supported","errorCode":null,"errorMessage":"offload node status is not supported","messagePattern":"offload node status is not supported","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"persist/sqldb/explosive_offload_node_status_repo.go","lineNumber":12,"sourceCode":"package sqldb\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\twfv1 \"github.com/argoproj/argo-workflows/v4/pkg/apis/workflow/v1alpha1\"\n)\n\nvar (\n\tExplosiveOffloadNodeStatusRepo OffloadNodeStatusRepo = &explosiveOffloadNodeStatusRepo{}\n\tErrOffloadNotSupported                               = fmt.Errorf(\"offload node status is not supported\")\n)\n\ntype explosiveOffloadNodeStatusRepo struct{}\n\nfunc (n *explosiveOffloadNodeStatusRepo) IsEnabled() bool {\n\treturn false\n}\n\nfunc (n *explosiveOffloadNodeStatusRepo) Save(context.Context, string, string, wfv1.Nodes) (string, error) {\n\treturn \"\", ErrOffloadNotSupported\n}\n\nfunc (n *explosiveOffloadNodeStatusRepo) Get(context.Context, string, string) (wfv1.Nodes, error) {\n\treturn nil, ErrOffloadNotSupported\n}\n\nfunc (n *explosiveOffloadNodeStatusRepo) List(context.Context, string) (map[UUIDVersion]wfv1.Nodes, error) {\n\treturn nil, ErrOffloadNotSupported","sourceCodeStart":1,"sourceCodeEnd":30,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/persist/sqldb/explosive_offload_node_status_repo.go#L1-L30","documentation":"ErrOffloadNotSupported is the sentinel error returned by every method of the explosiveOffloadNodeStatusRepo (Save, Get, List, Delete, ListOldOffloads). This repo is a no-op stand-in used when offloading node status to the database is disabled; calling it signals the caller expected offload storage that is not configured.","triggerScenarios":"Any controller code path calls ExplosiveOffloadNodeStatusRepo.Save/Get/List/Delete/ListOldOffloads while node status offloading is not enabled (IsEnabled() == false), e.g. when the workflow archive database is not configured.","commonSituations":"Running without persistence configured (no postgres/mysql offload) while a code path or test assumes offload; manually injecting the explosive repo; misconfigured persistence block in the controller configmap.","solutions":["Configure persistence (offload node status) in the workflow-controller-configmap so the real sqldb-backed offload repo is used instead of the explosive no-op.","Guard callers with OffloadNodeStatusRepo.IsEnabled() before calling Save/Get/Delete.","If writing tests, use the explosive repo only for paths that tolerate ErrOffloadNotSupported or mock the repo interface.","Verify which repo the controller wired at startup (logs) and correct the wiring/config."],"exampleFix":"// before\n// nodes, err := offloadRepo.Get(ctx, wfNamespace, wfName)\n// after\n// if !offloadRepo.IsEnabled() {\n//     return nil // or read status from the workflow object\n// }\n// nodes, err := offloadRepo.Get(ctx, wfNamespace, wfName)","handlingStrategy":"type-guard","validationCode":"// check offloading before use\nif !persist.OffloadNodeStatusRepo.IsEnabled() {\n    return errors.New(\"node status offloading is disabled; configure persistence\")\n}","typeGuard":"func offloadAvailable(repo persist.OffloadNodeStatusRepo) bool {\n    return repo != nil && repo.IsEnabled()\n}","tryCatchPattern":"if err == persist.ErrOffloadNotSupported {\n    logger.Info(ctx, \"offload disabled; falling back to inline node status\")\n    return nil // read status from the Workflow object instead\n}","preventionTips":["Call IsEnabled() before any offload repo operation.","Configure persistence in the controller configmap if offloading is required.","In tests, mock the repo instead of relying on the explosive no-op.","Check controller startup logs to confirm which offload repo was wired."],"tags":["database","offload","controller"],"backgroundTag":"offload-not-enabled","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}