Register the broker wait before the first poll (closes #157)
check / check (push) Waiting to run
check / check (push) Waiting to run
GET /api/v1/messages read the client output queue and only then registered with the broker. Notify wakes only the channels registered at that moment, so a message queued between the empty read and the registration waited out the whole long-poll timeout. The handler now registers first and removes its channel on every exit path; the IRC relay loop registers before each drain in the same way. The handlers read the queue through a function field that defaults to Database.PollMessages, so tests can act just after a read: one checks that a message queued there comes back at once, others that no wait channel stays registered however a request ends. Model: opus-5-5
This commit is contained in:
@@ -27,17 +27,22 @@ func (c *Conn) relayMessages(ctx context.Context) {
|
||||
default:
|
||||
}
|
||||
|
||||
// Register with the broker before draining, so that a
|
||||
// message queued after the drain has read the queue
|
||||
// still signals waitCh.
|
||||
waitCh := c.brk.Wait(c.sessionID)
|
||||
|
||||
// Drain any available messages.
|
||||
delivered := c.drainQueue(ctx)
|
||||
|
||||
if delivered {
|
||||
c.brk.Remove(c.sessionID, waitCh)
|
||||
|
||||
// Tight loop while there are messages.
|
||||
continue
|
||||
}
|
||||
|
||||
// Wait for notification or timeout.
|
||||
waitCh := c.brk.Wait(c.sessionID)
|
||||
|
||||
select {
|
||||
case <-waitCh:
|
||||
// New message notification — loop back.
|
||||
|
||||
Reference in New Issue
Block a user