Release v1.56.6
🛠️ Fixes
-
Crontab Goroutine Leak on Shutdown — The cron scheduler's ticker goroutine ran an unbounded
for range c.ticker.Cloop with no stop signal, so it leaked on everyApp.Shutdown(). Added adonechannel and aStop()method guarded bysync.Once, and the goroutine nowselects between the ticker anddoneto exit cleanly.App.Shutdown()now stops the cron scheduler before closing the container, so scheduled jobs are no longer torn down out of order. (#3292) -
Circuit Breaker Read-Lock & Non-Blocking Recovery —
circuitBreaker.isOpen()took a full writeLock()for a read-only state check, andtryCircuitRecovery()held the lock across the entirehealthCheckcall — blocking all other requests for the duration of the health probe.isOpen()now usesRLock(), and recovery releases the lock before running the health check, re-acquiring it only to reset the circuit (and only if it's still in the open state). (#3255, #3427) -
Subscriber Commits Messages After Handler Panic — When a subscription handler panicked,
panicRecoveryswallowed the panic and lefterrasnil, so the message fell through tomsg.Commit()and was acknowledged despite never being processed — causing silent message loss. The recovery path now sets a sentinel error and returns before the commit, so a panicked message is left uncommitted and will be redelivered. (#3424) -
Go 1.26 — Bumped Go to
1.26across all modules and CI workflows. (#3426) -
Dependency Updates — Consolidated minor and patch dependency updates across the core module and datasource sub-modules. (#3423)