{"record":{"id":"fa77214a6721358c","repo":"argoproj/argo-workflows","slug":"s-compressed-size-d-maxsize-d","errorCode":null,"errorMessage":"%s compressed size %d > maxSize %d","messagePattern":"(.+?) compressed size (.+?) > maxSize (.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"workflow/packer/packer.go","lineNumber":96,"sourceCode":"\t\treturn err\n\t}\n\twf.Status.CompressedNodes = file.CompressEncodeString(ctx, string(nodeContent))\n\twf.Status.Nodes = nil\n\t// still too large?\n\tlarge, err := IsLargeWorkflow(wf)\n\tif err != nil {\n\t\twf.Status.CompressedNodes = \"\"\n\t\twf.Status.Nodes = nodes\n\t\treturn err\n\t}\n\tif large {\n\t\tcompressedSize, err := getSize(wf)\n\t\twf.Status.CompressedNodes = \"\"\n\t\twf.Status.Nodes = nodes\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn fmt.Errorf(\"%s compressed size %d > maxSize %d\", tooLarge, compressedSize, getMaxWorkflowSize())\n\t}\n\treturn nil\n}\n","sourceCodeStart":78,"sourceCodeEnd":100,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/workflow/packer/packer.go#L78-L100","documentation":"When a Workflow's node status exceeds the size limit, packer compresses the Nodes field into CompressedNodes and re-checks the size; if even the compressed form exceeds maxWorkflowSize (Kubernetes etcd object limit, default ~1.5MB adjusted by env), compressWorkflow returns this error and the workflow cannot be persisted. It signals the status is fundamentally too large for the API server.","triggerScenarios":"CompressWorkflowIfNeeded on a workflow whose node list is so large that gzip-compressed JSON still exceeds getMaxWorkflowSize() — e.g. workflows with tens of thousands of nodes or nodes carrying huge outputs/inputs.","commonSituations":"Fan-out workflows (withItems/withSequence over very large lists) generating enormous node graphs; steps persisting large blobs in node outputs instead of artifacts; clusters where the env-configured max size was lowered; older controller versions before automatic offloading.","solutions":["Reduce workflow fan-out: split into child workflows, or use artifacts/loop over chunks instead of huge withItems lists","Move large outputs into artifacts (S3/artifact repository) instead of inline node status","Ensure a database archiver (Postgres/MySQL) is configured so large node data can be offloaded rather than kept in the object","Check the WORKFLOW_SIZE_LIMIT / related env configuration for getMaxWorkflowSize and Kubernetes API server --max-request-size limits","Upgrade Argo Workflows — newer versions compress/offload node status more aggressively"],"exampleFix":"# before: giant inline fan-out\nwithItems: [{{ huge list of 50000 items }}]\n# after: chunked child workflows\n- name: chunk\n  template: child\n  withSequence:\n    count: \"10\"\n  arguments:\n    parameters:\n      - name: part\n        value: \"{{item}}\"","handlingStrategy":"validation","validationCode":"// estimate node count before large fan-outs; keep well under the limit\nmaxNodes := 5000\nif len(items) > maxNodes {\n\treturn fmt.Errorf(\"fan-out of %d items will likely exceed workflow size limit; chunk it\", len(items))\n}","typeGuard":null,"tryCatchPattern":"err := packer.CompressWorkflowIfNeeded(wf)\nif err != nil && strings.Contains(err.Error(), \"> maxSize\") {\n\t// reduce fan-out, move outputs to artifacts, then resubmit\n}","preventionTips":["Cap withItems/withSequence fan-out; chunk into child workflows","Store large outputs as artifacts, not inline parameters","Configure a SQL archiver so large statuses offload","Monitor workflow size in tests with big datasets","Keep API server max-request-size and WORKFLOW_SIZE_LIMIT aligned"],"tags":["workflow","status-size","etcd","limits","packer"],"backgroundTag":"workflow-status-too-large","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"}