Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@
connection, indefinitely. Default is now 30s (overridable, including
back to `0`, via the existing `WithSessionWriteTimeouts`). `sendPacket`
also now logs a warning when a single write exceeds 250ms — previously
there was no observable signal for this at all. Root-cause writeup and
regression tests in `issue-evaluation.md`. (#19)
there was no observable signal for this at all. See PR #19 for the full
root-cause writeup and regression tests. (#19)
- `relay/store.EventStore.FindEventBytes` returned a bbolt-transaction-
scoped byte slice after its own read transaction had already closed —
invalid per bbolt's own contract, and reproducibly served corrupted
Expand Down
4 changes: 2 additions & 2 deletions relay/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ const (
// may block on conn.WriteJSON before the session gives up and closes
// the connection. Every subscription on a connection shares one
// outgoing pipe, so an unbounded deadline let one stuck reader stall
// delivery to all of them indefinitely (see issue-evaluation.md). 30s
// is a deliberately generous default, not a tuned optimum. Override
// delivery to all of them indefinitely (see PR #19). 30s is a
// deliberately generous default, not a tuned optimum. Override
// via WithSessionWriteTimeouts (0 restores the old unbounded behavior).
defaultDataWriteTimeout = 30 * time.Second

Expand Down
6 changes: 3 additions & 3 deletions relay/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ const (

// slowSendWarnThreshold is how long a single sendPacket call may take
// before it's logged as a warning -- surfaces a backed-up outgoing
// pipe (see issue-evaluation.md), which previously had no observable
// signal at all. Several multiples of the poll interval, to avoid
// firing on ordinary jitter.
// pipe (see PR #19), which previously had no observable signal at
// all. Several multiples of the poll interval, to avoid firing on
// ordinary jitter.
slowSendWarnThreshold = 250 * time.Millisecond
)

Expand Down
2 changes: 1 addition & 1 deletion relay/session_backpressure_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func readUntil(t testing.TB, conn *websocket.Conn, deadline time.Time, fn func(w
}

// TestSessionSlowReaderStallsEveryOtherSubscriptionOnThatConnection
// reproduces the delivery stall (issue-evaluation.md) at report-realistic
// reproduces the delivery stall fixed in PR #19 at report-realistic
// scale: 3 fresh events on the filter under test, not the 55+
// TestSubscriptionBackpressureDelaysButNeverLosesEvents needs.
//
Expand Down
6 changes: 3 additions & 3 deletions relay/subscription_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,9 @@ func TestSubscriptionCombinedKindBurstDoesNotStarveFreshEvent(t *testing.T) {
}

// TestSubscriptionBackpressureDelaysButNeverLosesEvents reproduces the
// no-timeout blocking-send mechanism behind the delivery stall in
// issue-evaluation.md: storeScan.handleEvents' send into a subscription's
// outgoing channel (eventBufferCapacity, 55 slots) has no timeout, and
// no-timeout blocking-send mechanism behind the delivery stall fixed in
// PR #19: storeScan.handleEvents' send into a subscription's outgoing
// channel (eventBufferCapacity, 55 slots) has no timeout, and
// Subscription.Start's poll loop calls Fetch synchronously on every tick --
// so once the channel is full, the next poll tick blocks inside Fetch until
// the consumer drains it, stalling delivery of any new matching event.
Expand Down
Loading