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:
1 parent
df15e2b2cd
commit
26d939ad72
9 files changed
+608
-54
No files matched your search
@@ -5,6 +5,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"slices"
|
||||
"sync"
|
||||
@@ -177,13 +178,14 @@ type stopLog struct {
|
||||
Msg string `json:"msg"`
|
||||
Updates int `json:"updates"`
|
||||
TableChanges int `json:"table_changes"`
|
||||
HeldMessages int `json:"held_messages"`
|
||||
Paths int `json:"paths"`
|
||||
BatchEntries int `json:"batch_entries"`
|
||||
}
|
||||
|
||||
// newErrorLogger returns a logger that writes only errors, as JSON lines, to
|
||||
// logs.
|
||||
func newErrorLogger(logs *bytes.Buffer) *logger.Logger {
|
||||
func newErrorLogger(logs io.Writer) *logger.Logger {
|
||||
return &logger.Logger{Logger: slog.New(slog.NewJSONHandler(logs,
|
||||
&slog.HandlerOptions{Level: slog.LevelError}))}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user