Fix RWMutex double unlock panic in RADIUS reject delay under high concurrency #192
+146
−8
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.
Fixes a critical panic that occurs during high-concurrency RADIUS authentication failures:
panic: sync: RUnlock of unlocked RWMutex
.Problem
Under heavy load with frequent authentication failures, the RADIUS service crashes with:
The issue occurs in
radius_reject_delay.go
where read-to-write lock upgrades cause double unlocking:The same pattern existed in
RejectCache.GetItem()
.Solution
Removed problematic
defer
statements and implemented proper manual lock management:Before:
After:
Testing
Added comprehensive test suite (
radius_reject_delay_test.go
) with:go test -race
)All tests pass with no panics or race conditions detected.
Impact
This fix prevents process crashes and systemd restart loops in production deployments experiencing high authentication failure rates. The change is minimal and preserves all existing functionality while ensuring thread safety under concurrent access.
Resolves the panic described in issue where production systems crash during high-concurrency authentication scenarios.
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.