From 0212f13c537808874fc5bb77c285c56cf9ccd2d9 Mon Sep 17 00:00:00 2001 From: Cassandra Heart Date: Mon, 23 Feb 2026 01:02:30 -0600 Subject: [PATCH] tweak: force shutdown after five seconds for app worker --- node/consensus/app/app_consensus_engine.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/node/consensus/app/app_consensus_engine.go b/node/consensus/app/app_consensus_engine.go index a20670e..37b6770 100644 --- a/node/consensus/app/app_consensus_engine.go +++ b/node/consensus/app/app_consensus_engine.go @@ -974,14 +974,19 @@ func (e *AppConsensusEngine) Stop(force bool) <-chan error { e.pubsub.Unsubscribe(e.getDispatchMessageBitmask(), false) e.pubsub.UnregisterValidator(e.getDispatchMessageBitmask()) - // Wait for all component workers to finish before signalling callers. - // Without this, RespawnServer creates a new engine while old goroutines - // are still running, causing "context cancelled" error loops. + // Wait briefly for component workers to finish. If they don't exit in + // time, close pubsub to cancel subscription goroutines that may be + // keeping handlers alive and preventing clean shutdown. select { case <-e.Done(): - case <-time.After(30 * time.Second): - if !force { - errChan <- errors.New("timeout waiting for app engine shutdown") + case <-time.After(5 * time.Second): + e.pubsub.Close() + select { + case <-e.Done(): + case <-time.After(25 * time.Second): + if !force { + errChan <- errors.New("timeout waiting for app engine shutdown") + } } }