Problem
Artifact publication has two failure paths:
DockerImageArtifact.put() reads stdout before wait(timeout=...) and leaves stderr unread. A stalled save or full stderr pipe blocks before the timeout is reached.
FileArtifact.put() / put_bytes() upload to a write-once version path before inserting their document. If insertion fails, the next attempt chooses the same version and collides with the orphaned object.
Reproduced impact
| Scenario |
Current behavior |
| Save timeout set to 0.2 s |
Still blocked at 2 s; external watchdog required |
| Document insert fails after upload |
Three retries all fail with ObjectAlreadyExistsError |
Reproduced against local subprocesses, SQLite and filesystem stores; no cloud or Docker engine required.
Acceptance
Bound the save and stream drain while keeping archive memory bounded; kill/reap failed saves and clean temporary files. Isolate each file upload attempt so retry succeeds without overwriting published data. Cover file and byte uploads, concurrent writes, saturated stderr, stalled stdout and successful gzip output.
Problem
Artifact publication has two failure paths:
DockerImageArtifact.put()reads stdout beforewait(timeout=...)and leaves stderr unread. A stalled save or full stderr pipe blocks before the timeout is reached.FileArtifact.put()/put_bytes()upload to a write-once version path before inserting their document. If insertion fails, the next attempt chooses the same version and collides with the orphaned object.Reproduced impact
ObjectAlreadyExistsErrorReproduced against local subprocesses, SQLite and filesystem stores; no cloud or Docker engine required.
Acceptance
Bound the save and stream drain while keeping archive memory bounded; kill/reap failed saves and clean temporary files. Isolate each file upload attempt so retry succeeds without overwriting published data. Cover file and byte uploads, concurrent writes, saturated stderr, stalled stdout and successful gzip output.