argoproj/argo-workflows · error
failed to close temp file
Error message
failed to close temp file: %w
What it means
BufferReaderToTempFile spools an io.Reader into a temp file so artifacts can be saved via SaveStreamViaTempFile. This error wraps a failure from tmpFile.Close() after the stream was successfully written; close can flush buffered data and fail (e.g. ENOSPC), so it is checked explicitly. The temp file is removed and the write is abandoned when this happens.
Solutions
- Free disk space on the node / increase the ephemeral storage size for the workflow pod
- Check node disk health (dmesg for I/O errors) and move the workflow to a healthy node
- Retry the workflow; if it recurs, check kubelet ephemeral-storage limits
Example fix
// before
if err := tmpFile.Close(); err != nil {
cleanup()
return "", noop, fmt.Errorf("failed to close temp file: %w", err)
}
// after
// no code fix in caller; fix is infra: ensure the executor's temp volume has free space, e.g.
// spec.volumes: [{name: tmp, emptyDir: {sizeLimit: 1Gi}}] and adequate node disk Defensive patterns
Strategy: validation
Validate before calling
// before submitting workflows that emit large artifacts, check executor disk space:
// kubectl describe node <node> | grep -A3 'Ephemeral Storage'
// or inside a probe step:
import "syscall"
var st syscall.Statfs_t
_ = syscall.Statfs("/tmp", &st)
freeBytes := st.Bavail * uint64(st.Bsize)
if freeBytes < 512<<20 { /* skip / fail fast */ } Prevention
- Set emptyDir sizeLimit generously for artifact-heavy workflows
- Monitor node disk pressure conditions (KubeletDiskPressure)
- Keep script stdout/outputs small; offload large data to object storage directly
When it happens
Trigger: Calling SaveStreamViaTempFile (or BufferReaderToTempFile directly) with a stream whose bytes were written fine to the temp file, but where the final Close() on the temp file fails — typically disk full on the node, an I/O error, or the file having been closed/invalid already.
Common situations: Executor pod running on a node whose emptyDir/tmp volume is full while capturing large script outputs or logs; disk-pressure-evicted nodes; read-only tmp mounts.
Related errors
- failed to buffer stream to temp file
- failed to clear existing path for artifact
- failed to close
- failed to copy to
- failed to create artifact temporary parent directory
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/b38233ee9207cce9.
Report an issue: GitHub.
Appendix: source
Thrown at workflow/artifacts/common/streaming.go:47
noop := func() {}
tmpFile, err := os.CreateTemp("", pattern)
if err != nil {
return "", noop, fmt.Errorf("failed to create temp file: %w", err)
}
name := tmpFile.Name()
cleanup = func() {
_ = os.Remove(name)
}
if _, err := io.Copy(tmpFile, reader); err != nil {
_ = tmpFile.Close()
cleanup()
return "", noop, fmt.Errorf("failed to buffer stream to temp file: %w", err)
}
if err := tmpFile.Close(); err != nil {
cleanup()
return "", noop, fmt.Errorf("failed to close temp file: %w", err)
}
return name, cleanup, nil
}
View on GitHub (pinned to 35bff19146)