Repository navigation
Conversation
QwpWebSocketSender.flushAndGetSequence() publishes the frame and only then checks the I/O loop for a latched error, so a server that rejects the frame at once can make flush() throw the terminal it caused. Five tests called flush() unguarded against such a server and failed when the rejection won that race: - SymbolDictRecycleFsnContinuityTest: the latched-error and the sender-error-span tests - ConnectionHealthTest: the terminal-rejection health test - ServerErrorAckTerminalTest: both poison-escalation tests - IoThreadErrorSurfacedOnRowApiTest: its outer catch swallowed the early throw, so the test passed without asserting anything Each now catches the early throw at flush(), as ServerErrorAckTerminalTest already does since #111; the error is sticky, so the assertions that follow still see it.
Review of PR #119 (level 3): no findings, verdict approveI reviewed head Scope:
The PR's claims, tested against the code
Findings
Tests
Summary
|
QwpWebSocketSender.flushAndGetSequence()publishes the frame and only then checks the I/O loop for a latched error, so against a server that rejects the frame at once,flush()can throw the terminal error that frame caused. Five tests calledflush()unguarded against such a server and failed intermittently withLineSenderServerException: server rejected batch: PARSE_ERROR: two inSymbolDictRecycleFsnContinuityTest, one inConnectionHealthTestand the two poison-escalation tests inServerErrorAckTerminalTest.IoThreadErrorSurfacedOnRowApiTestdid not fail on that race, but its outer catch swallowed the early throw and the test passed without asserting anything.Each test now catches the early throw at
flush(), asServerErrorAckTerminalTestalready does since #111. The error is sticky, so the assertions that follow still observe it. The change is test-only.