fix(telegram): prevent polling hangs with concurrent processing and stall-aware media downloads#284
Closed
badgerbees wants to merge 1 commit into
Closed
Conversation
Contributor
|
Thanks for identifying and analyzing this polling hang issue — the idea of using concurrent goroutines for handlers and a We've addressed this in commit 670b295 on main, with some additional improvements building on your PR:
Thanks for the contribution! 🙏 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The Telegram integration was vulnerable to "deadlock" scenarios where a single slow operation specifically a large or stalled media download would block the entire polling loop, making the bot unresponsive to all users.
Why it matters
In production environments, network jitter or large files (voice notes, images) from one user could effectively crash the bot's availability for everyone else for up to 5 minutes (the default download timeout).
What changed:
internal/channels/telegram/channel.goto process incoming updates in parallel goroutines. This ensures that slow processing of one message never blocks the receipt of subsequent ones.progressReaderininternal/channels/telegram/media.gothat monitors the download stream. It now includes a 60-second stall watchdog; if no data is received within this window, the specific download is aborted early, even if the global 5-minute timeout hasn't been reached.