75 lines
2.4 KiB
Markdown
75 lines
2.4 KiB
Markdown
# PRD 0043: Sidecar Pipe Lifecycle Cleanup
|
|
|
|
- **Status:** Active
|
|
- **Author:** didericis-codex
|
|
- **Created:** 2026-06-02
|
|
- **Issue:** #140
|
|
|
|
## Summary
|
|
|
|
Close the unclosed child stdout pipe file descriptors that `sidecar_init.py`
|
|
leaks during restart and shutdown paths, eliminating `ResourceWarning` noise
|
|
and tightening the process lifecycle.
|
|
|
|
## Problem
|
|
|
|
Unit tests for `sidecar_init.py` pass, but restart and shutdown cases emit
|
|
`ResourceWarning: unclosed file <_io.BufferedReader …>` for child stdout pipes,
|
|
originating around lines 141 and 273. The warnings indicate the restart path
|
|
leaks pipe file descriptors: a pipe opened for a stopped or replaced child is
|
|
not explicitly closed before the next child is spawned or before the supervisor
|
|
exits.
|
|
|
|
## Goals / Success Criteria
|
|
|
|
- `python3 -m unittest tests.unit.test_sidecar_init` produces no
|
|
`ResourceWarning` output.
|
|
- Pipe file descriptors for stopped or replaced child processes are explicitly
|
|
closed in the restart path.
|
|
- Pipe file descriptors for all children are explicitly closed in the shutdown
|
|
path.
|
|
- No change to the external signal or exit-code contract from PRD 0034.
|
|
|
|
## Non-goals
|
|
|
|
- No changes to restart or shutdown policy (coalescing, ordering, timeout).
|
|
- No changes to egress, pipelock, git-gate, or supervise daemon argv.
|
|
- No new runtime dependencies.
|
|
|
|
## Scope
|
|
|
|
In scope:
|
|
|
|
- `bot_bottle/sidecar_init.py` pipe open/close lifecycle in `_Supervisor`.
|
|
- Unit tests in `tests/unit/test_sidecar_init.py` asserting no leaked pipes.
|
|
|
|
Out of scope:
|
|
|
|
- Changing how pumping threads read from pipes.
|
|
- Integration tests that start a live sidecar container.
|
|
|
|
## Design
|
|
|
|
Audit every code path in `_Supervisor` where a child process is stopped,
|
|
replaced, or reaches end-of-life, and ensure the corresponding stdout pipe is
|
|
explicitly closed before spawning a replacement or exiting the supervisor loop.
|
|
|
|
Where a pumping thread holds a reference to the pipe, coordinate closure so the
|
|
thread sees EOF and exits cleanly rather than blocking indefinitely.
|
|
|
|
## Testing Strategy
|
|
|
|
- Enable `ResourceWarning` as an error in test setUp:
|
|
`warnings.simplefilter("error", ResourceWarning)`.
|
|
- Run existing restart and shutdown test cases under this stricter setting.
|
|
- Add tests for restart-then-shutdown if not already covered.
|
|
|
|
Run:
|
|
|
|
- `python3 -m unittest tests.unit.test_sidecar_init`
|
|
- `python3 -m unittest discover -s tests/unit`
|
|
|
|
## Open Questions
|
|
|
|
None.
|