test(brokeripc): pin the stream window against the daemon byte budget
- commit
- 45b5fca3f1acd57a5a9d9d3013f8045ed8887a4a
- author
- brice · · 2026-10-08 14:25 UTC
- committer
- brice · · 2026-10-08 15:05 UTC
- parent
- 9c7eb05
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
1 file · +6 -5
M internal/adapters/brokeripc/pipe_test.go +6 -5
| @@ -115,11 +115,12 @@ func newTestPipe() *streamPipe { | |||
| 115 | 115 | return newStreamPipe(func([]byte) error { return nil }, func(uint64) error { return nil }) | |
| 116 | 116 | } | |
| 117 | 117 | ||
| 118 | - | // TestStreamWindowCoversTheSessionOutputWindow pins the invariant that lets a | |
| 119 | - | // broker stream carry a full session output window without the daemon ever | |
| 120 | - | // waiting on the stream instead of on its own ACK window: the daemon's | |
| 121 | - | // unacknowledged byte budget plus one maximum Output fits in one stream window. | |
| 122 | - | // When it does not, credit still keeps every stream correct, only slower. | |
| 118 | + | // TestStreamWindowCoversTheSessionOutputWindow pins the sizing invariant | |
| 119 | + | // between the two flow-control layers: one broker stream window holds the | |
| 120 | + | // daemon's whole unacknowledged byte budget, so in normal operation the daemon | |
| 121 | + | // is paced by its own ACK window and coalesces frames, rather than blocking a | |
| 122 | + | // send on stream credit. A single Output larger than the window (a big image) | |
| 123 | + | // still crosses, only paced by credit. | |
| 123 | 124 | func TestStreamWindowCoversTheSessionOutputWindow(t *testing.T) { | |
| 124 | 125 | require.GreaterOrEqual(t, brokerwire.StreamWindowBytes, uint64(protocol.MaxOutputWindowBytes), | |
| 125 | 126 | "one stream window must hold the daemon's whole unacknowledged byte budget") | |
| @@ -115,11 +115,12 @@ func newTestPipe() *streamPipe { | |||||
| 115 | return newStreamPipe(func([]byte) error { return nil }, func(uint64) error { return nil }) | 115 | return newStreamPipe(func([]byte) error { return nil }, func(uint64) error { return nil }) | ||
| 116 | } | 116 | } | ||
| 117 | 117 | ||||
| 118 | - | // TestStreamWindowCoversTheSessionOutputWindow pins the invariant that lets a | 118 | + | // TestStreamWindowCoversTheSessionOutputWindow pins the sizing invariant |
| 119 | - | // broker stream carry a full session output window without the daemon ever | 119 | + | // between the two flow-control layers: one broker stream window holds the |
| 120 | - | // waiting on the stream instead of on its own ACK window: the daemon's | 120 | + | // daemon's whole unacknowledged byte budget, so in normal operation the daemon |
| 121 | - | // unacknowledged byte budget plus one maximum Output fits in one stream window. | 121 | + | // is paced by its own ACK window and coalesces frames, rather than blocking a |
| 122 | - | // When it does not, credit still keeps every stream correct, only slower. | 122 | + | // send on stream credit. A single Output larger than the window (a big image) |
| 123 | + | // still crosses, only paced by credit. | |||
| 123 | func TestStreamWindowCoversTheSessionOutputWindow(t *testing.T) { | 124 | func TestStreamWindowCoversTheSessionOutputWindow(t *testing.T) { | ||
| 124 | require.GreaterOrEqual(t, brokerwire.StreamWindowBytes, uint64(protocol.MaxOutputWindowBytes), | 125 | require.GreaterOrEqual(t, brokerwire.StreamWindowBytes, uint64(protocol.MaxOutputWindowBytes), | ||
| 125 | "one stream window must hold the daemon's whole unacknowledged byte budget") | 126 | "one stream window must hold the daemon's whole unacknowledged byte budget") | ||