Keep taking messages while a peer's session goes down (closes #216)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The table's PeerDown visits every prefix under the write lock, which takes over a second on a full table. The prefix handler called it inline, so its queue filled and the streamer dropped updates. PeerDown now holds the lock for 10,000 prefixes at a time, then lets the lock go for as long again. The handler runs PeerDown on a separate goroutine, one peer at a time. The handler holds back the down peer's later messages until that PeerDown returns. Then the handler applies them in order, one at a time, and takes new messages in between. It holds back at most 20,000 messages. Stop waits for all of this before its last flush. Model: opus-5-5
This commit was merged in pull request #220.
This commit is contained in:
@@ -10,10 +10,6 @@ import (
|
||||
"git.eeqj.de/sneak/routewatch/internal/ristypes"
|
||||
)
|
||||
|
||||
// walkBatch is how many prefixes the walk over the whole table reads in one
|
||||
// hold of the read lock. The updates waiting for the lock get it in between.
|
||||
const walkBatch = 10000
|
||||
|
||||
// Overview holds figures about the whole table. Working them out takes a walk
|
||||
// over every prefix, so a caller asks for them now and then and keeps them.
|
||||
type Overview struct {
|
||||
|
||||
Reference in New Issue
Block a user