argoproj/argo-workflows · error

getting archived workflow for estimator not supported

Error message

getting archived workflow for estimator not supported

What it means

nullWorkflowArchive.GetWorkflowForEstimator is the no-op implementation used when workflow archiving is disabled. Estimator logic (used to predict workflow duration from archived runs) needs an archived workflow sample, which does not exist without an archive, so it always returns this error.

Source

Thrown at persist/sqldb/null_workflow_archive.go:43

func (r *nullWorkflowArchive) ListWorkflows(ctx context.Context, options sutils.ListOptions) (wfv1.Workflows, error) {
	return wfv1.Workflows{}, nil
}

func (r *nullWorkflowArchive) CountWorkflows(ctx context.Context, options sutils.ListOptions) (int64, error) {
	return 0, nil
}

func (r *nullWorkflowArchive) HasMoreWorkflows(ctx context.Context, options sutils.ListOptions) (bool, error) {
	return false, nil
}

func (r *nullWorkflowArchive) GetWorkflow(ctx context.Context, uid string, namespace string, name string) (*wfv1.Workflow, error) {
	return nil, fmt.Errorf("getting archived workflows not supported")
}

func (r *nullWorkflowArchive) GetWorkflowForEstimator(ctx context.Context, namespace string, requirements []labels.Requirement) (*wfv1.Workflow, error) {
	return nil, fmt.Errorf("getting archived workflow for estimator not supported")
}

func (r *nullWorkflowArchive) DeleteWorkflow(ctx context.Context, uid string) error {
	return fmt.Errorf("deleting archived workflows not supported")
}

func (r *nullWorkflowArchive) DeleteExpiredWorkflows(ctx context.Context, ttl time.Duration) error {
	return nil
}

func (r *nullWorkflowArchive) ListWorkflowsLabelKeys(ctx context.Context) (*wfv1.LabelKeys, error) {
	return &wfv1.LabelKeys{}, nil
}

func (r *nullWorkflowArchive) ListWorkflowsLabelValues(ctx context.Context, key string) (*wfv1.LabelValues, error) {
	return &wfv1.LabelValues{}, nil
}

View on GitHub (pinned to 35bff19146)

Solutions

  1. Enable workflow archiving via the persistence section in the workflow-controller-configmap so a real archive backs the estimator.
  2. Disable/avoid estimator-dependent features when archiving is off.
  3. Guard callers: skip estimation (return no estimate) when the archive repo is the null implementation or archiving is disabled.
  4. Confirm the server and controller both run with archiving enabled if estimation is expected to work.

Example fix

// before
// wf, err := archive.GetWorkflowForEstimator(ctx, ns, reqs)
// after
// if !archiveEnabled {
//     return nil, nil // no estimate available without archive
// }
// wf, err := archive.GetWorkflowForEstimator(ctx, ns, reqs)
Defensive patterns

Strategy: type-guard

Validate before calling

// gate estimator usage on archive availability
if !archivingEnabled(ctx) {
    return nil, nil // no estimate possible without an archive
}

Type guard

func estimatorSupported(archive workflowarchive.Archive) bool {
    _, err := archive.GetWorkflowForEstimator(ctx, "default", nil)
    return !strings.Contains(fmt.Sprint(err), "not supported")
}

Try / catch

wf, err := archive.GetWorkflowForEstimator(ctx, ns, reqs)
if err != nil && strings.Contains(err.Error(), "not supported") {
    return nil, nil // degrade gracefully: no duration estimate
}

Prevention

When it happens

Trigger: A workflow template uses an estimator / estimated-duration feature, or server code calls GetWorkflowForEstimator to find a representative archived workflow, while the null archive is wired (archive not configured).

Common situations: Using duration estimation or `estimatedDuration` features on a cluster without persistence enabled; API/UI paths that estimate progress hitting a server with no archive database.

Related errors


AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03). Data as JSON: /api/errors/37a5a93dfd740514. Report an issue: GitHub.