* pkg/tools/batcher: stop scheduler panicking when b.data is closed externally
scheduler()'s defer unconditionally calls close(b.data). If the channel
was closed by the caller (or an upstream producer) instead of via the
normal Close()-sends-nil path, the receive on b.data returns ok == false,
scheduler returns, and the deferred close(b.data) then fires on an
already-closed channel:
panic: close of closed channel
reliably reproducible under the #3653 steps (manually closing b.data
while Start() is running).
Track whether we observed the external-close via a local
`externallyClosed` flag set in the `ok == false` branch. The defer
only closes b.data when that flag is false, i.e. when the scheduler
exited through the nil-message or ticker paths and still owns the
channel. No behaviour change on the graceful Close() path.
Fixes#3653
* ci: retrigger after transient gha outage
Signed-off-by: SAY-5 <say.apm35@gmail.com>
---------
Signed-off-by: SAY-5 <say.apm35@gmail.com>
(cherry picked from commit b3a7342a42ca7daf3e01e275fb0e7d166fb16a58)
* refactor: cmd update.
* refactor: msg transfer refactor.
* refactor: msg transfer refactor.
* refactor: msg transfer refactor.
* fix: read prometheus port when flag set to enable and prevent failure during startup.
* fix: notification has counted unread counts bug fix.
* fix: merge opensource code into local.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* refactor: delete message and message batch use lua.
* fix: add protective measures against memory overflow.