Fix two gateway test failures: outbox lane scoping + SSE teardown race
- outbox: delete_message/message_info now match the exact lane first
(a flat-lane delete/lookup with thread_id=None sees only frames with
no thread_id) and fall back to the message_id across all lanes only
when the exact lane matches nothing. Previously lane=None meant
'any lane' in the first pass, so a flat-lane delete also removed
same-id frames from threads (test expected 3 removed, got 4).
- http_server: the SSE live loop skipped queued frames when stop() set
sub.closed before the handler thread reached the loop (descheduled
under load between the initial hello/status writes and the loop).
The loop now drains frames queued before the close, so the
status{restarting} teardown broadcast always reaches the client
before EOF (test_disconnect_broadcasts_status_restarting was flaky
~70% under CPU load).
This commit is contained in:
1 parent
d801a18db5
commit
29d0c1a73f
2 files changed
+33
-16
No files matched your search
@@ -523,12 +523,25 @@ class HttpServer:
|
||||
for snap in self._adapter.todo_snapshot_frames():
|
||||
self._write_sse(handler, "frame", None, snap.to_json())
|
||||
# 3. Live frames (cursor=None frames have no id).
|
||||
while not sub.closed.is_set():
|
||||
try:
|
||||
item = sub.q.get(timeout=SSE_HEARTBEAT_S)
|
||||
except queue.Empty:
|
||||
self._write_raw(handler, ": hb\n\n")
|
||||
continue
|
||||
while True:
|
||||
if sub.closed.is_set():
|
||||
# stop() can land between the initial writes above and
|
||||
# this loop (the handler thread is descheduled under
|
||||
# load): drain the frames queued before the close — e.g.
|
||||
# the status{restarting} teardown broadcast — so the
|
||||
# client sees them before EOF instead of losing them to
|
||||
# the closed check.
|
||||
try:
|
||||
item = sub.q.get_nowait()
|
||||
except queue.Empty:
|
||||
reason = "stopped"
|
||||
break
|
||||
else:
|
||||
try:
|
||||
item = sub.q.get(timeout=SSE_HEARTBEAT_S)
|
||||
except queue.Empty:
|
||||
self._write_raw(handler, ": hb\n\n")
|
||||
continue
|
||||
if item is _STOP:
|
||||
reason = "stopped"
|
||||
break
|
||||
|
||||
Reference in new issue
Block a user