implemented ping-pong heartbeats. adjusted logs and defaults.
This commit is contained in:
+29
-1
@@ -70,13 +70,18 @@ func (w *DefaultWorker) Start(pool PoolPlugin) {
|
||||
toForwarder := make(chan types.ReceivedMessage, 256)
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(4)
|
||||
wg.Add(5)
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
RunReader(w.ctx, pool.OnExit, w.conn, toQueue, w.heartbeat, w.logger)
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
RunHeartbeatForwarder(w.ctx, w.conn, w.heartbeat, w.logger)
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
queue.RunQueue(w.id, w.ctx, toQueue, toForwarder, w.config.MaxQueueSize)
|
||||
@@ -177,6 +182,29 @@ func RunReader(
|
||||
}
|
||||
}
|
||||
|
||||
func RunHeartbeatForwarder(
|
||||
ctx context.Context,
|
||||
conn *transport.Connection,
|
||||
heartbeat chan<- struct{},
|
||||
logger *slog.Logger,
|
||||
) {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-conn.Heartbeat():
|
||||
select {
|
||||
case heartbeat <- struct{}{}:
|
||||
if logger != nil {
|
||||
logger.Debug("ping-pong heartbeat")
|
||||
}
|
||||
case <-ctx.Done():
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func RunForwarder(
|
||||
id string,
|
||||
ctx context.Context,
|
||||
|
||||
@@ -229,3 +229,36 @@ func TestWorkerSend(t *testing.T) {
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestHeartbeatForwarder(t *testing.T) {
|
||||
t.Run("connection level heartbeat propagates", func(t *testing.T) {
|
||||
socket, _, _ := honeybeetest.SetupTestSocket(t)
|
||||
var pongHandler func(string) error
|
||||
socket.SetPongHandlerFunc = func(h func(string) error) { pongHandler = h }
|
||||
|
||||
conn, err := transport.NewConnectionFromSocket(socket, nil, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
heartbeat := make(chan struct{}, 1)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
go RunHeartbeatForwarder(ctx, conn, heartbeat, nil)
|
||||
|
||||
honeybeetest.Eventually(t, func() bool {
|
||||
return pongHandler != nil
|
||||
}, "expected Connection to register PongHandler")
|
||||
|
||||
if pongHandler == nil {
|
||||
t.Fatal("pong handler was never set")
|
||||
}
|
||||
|
||||
pongHandler("") // Trigger pong
|
||||
|
||||
select {
|
||||
case <-heartbeat:
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("pong did not propagate to worker heartbeat")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user