Commit 4dd6a29
authored
streaming: prevent reader Close from deadlocking on a fatal read error (#78)
* streaming: prevent reader Close from deadlocking on fatal read error
On a fatal read error (e.g. the underlying stream key being destroyed)
the reader read loop called Close synchronously. Close waits on the read
goroutine via wait.Wait, so calling it from that same goroutine deadlocked
and leaked the reader and its Redis connection; any external Close blocked
forever too.
Trigger the shutdown asynchronously so the read goroutine can return and
release the wait group. Close is already idempotent via sync.Once, so this
is safe alongside a concurrent external Close.
Adds a regression test that drives the real read loop through a simulated
fatal error (via a small xreadFn seam) and asserts the reader closes
instead of hanging. The test hangs on pre-fix code.
* streaming: make reader read seam a package var
Move the test-only read hook from a Reader struct field to a package
variable so it no longer pollutes Reader. Behavior is unchanged; it
defaults to (*Reader).xread and is only overridden in tests.1 parent cfaf76b commit 4dd6a29
2 files changed
Lines changed: 38 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
224 | 224 | | |
225 | 225 | | |
226 | 226 | | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
227 | 232 | | |
228 | 233 | | |
229 | 234 | | |
230 | 235 | | |
231 | 236 | | |
232 | | - | |
| 237 | + | |
233 | 238 | | |
234 | 239 | | |
235 | 240 | | |
236 | 241 | | |
237 | 242 | | |
238 | 243 | | |
239 | | - | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
240 | 249 | | |
241 | 250 | | |
242 | 251 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
5 | 7 | | |
6 | 8 | | |
| |||
124 | 126 | | |
125 | 127 | | |
126 | 128 | | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
127 | 154 | | |
128 | 155 | | |
129 | 156 | | |
| |||
0 commit comments