-
Notifications
You must be signed in to change notification settings - Fork 705
fix: avoid painc caused by writing to closed channel #318
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughThe changes update the internal goroutine logic in the Changes
Possibly related PRs
Suggested reviewers
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 golangci-lint (1.64.8)Error: you are using a configuration file for golangci-lint v2 with golangci-lint v1: please use golangci-lint v2 Note ⚡️ AI Code Reviews for VS Code, Cursor, WindsurfCodeRabbit now has a plugin for VS Code, Cursor and Windsurf. This brings AI code reviews directly in the code editor. Each commit is reviewed immediately, finding bugs before the PR is raised. Seamless context handoff to your AI code agent ensures that you can easily incorporate review feedback. Note ⚡️ Faster reviews with cachingCodeRabbit now supports caching for code and dependencies, helping speed up reviews. This means quicker feedback, reduced wait times, and a smoother review experience overall. Cached data is encrypted and stored securely. This feature will be automatically enabled for all accounts on May 30th. To opt out, configure 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🔇 Additional comments (3)
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
Description
The current implementation of
handleGet
creates awritechan
and closes it from the receiver side usingdefer close(writechan)
. However, two goroutines (the notification handler and heartbeat sender) may continue writing to this channel. This pattern introduces a potential risk of painc under concurrent scenarios:r.Context().Done()
), thehandleGet
function exits, andwriteChan
is closed.writeChan
, which causes a painc (painc: send on closed channel
)This issue may not always surface in normal conditions but can randomly crash the server under high concurrency or slow network response (delayed

done
propagation). Proof and mocking:Fixes: Remove the
defer close(writeChan)
and let the channel be implicitly garbage-collected once all goroutines referencing it exit. Instead, thedone
channel is used to signal all background goroutines to stop.Type of Change
Checklist
Summary by CodeRabbit