fix: absorb multiplex close bursts

This commit is contained in:
richjohnrambo
2026-10-02 15:53:03 +08:00
parent a406d63154
commit 80808349fb
4 changed files with 238 additions and 0 deletions
+51
View File
@@ -112,3 +112,54 @@ func TestClusterWriteLoopRejectsWritesAfterTermination(t *testing.T) {
t.Fatalf("terminated multiplexing session retained %d outbound messages", len(sess.send))
}
}
func TestMultiplexEnqueueWaitsForDrain(t *testing.T) {
sess := &Session{proto: MULTIPLEX, send: make(chan any, 1)}
sess.send <- "existing"
go func() {
time.Sleep(10 * time.Millisecond)
<-sess.send
}()
payload := &ServerComMessage{TenantID: types.TenantID(1)}
if !sess.enqueueMultiplexOutbound(payload, 200*time.Millisecond) {
t.Fatal("multiplex enqueue failed while the drain was making progress")
}
if got := <-sess.send; got != payload {
t.Fatalf("unexpected queued payload: %#v", got)
}
}
func TestMultiplexEnqueueTimesOutWithoutDrain(t *testing.T) {
sess := &Session{proto: MULTIPLEX, send: make(chan any, 1)}
sess.send <- "existing"
started := time.Now()
if sess.enqueueMultiplexOutbound("next", 20*time.Millisecond) {
t.Fatal("multiplex enqueue succeeded without queue capacity")
}
if elapsed := time.Since(started); elapsed < 15*time.Millisecond || elapsed > 200*time.Millisecond {
t.Fatalf("multiplex enqueue timeout outside expected bounds: %s", elapsed)
}
}
func TestMultiplexEnqueueStopsWhenSessionTerminates(t *testing.T) {
sess := &Session{proto: MULTIPLEX, send: make(chan any, 1)}
sess.send <- "existing"
go func() {
time.Sleep(10 * time.Millisecond)
sess.clusterQueueMu.Lock()
atomic.StoreInt32(&sess.terminating, 1)
<-sess.send
sess.clusterQueueMu.Unlock()
}()
if !sess.enqueueMultiplexOutbound("next", 200*time.Millisecond) {
t.Fatal("terminating multiplex session should discard the pending write")
}
if len(sess.send) != 0 {
t.Fatalf("terminating multiplex session retained %d outbound messages", len(sess.send))
}
}