Repository navigation
Conversation
AppRefTracker.AppsForRef and RefsForApp take the tracker lock, but
return the tracker's internal maps. The Secret and ConfigMap event
handlers range over the map returned by AppsForRef after the lock is
released, while App and PackageRepository reconcilers call
ReconcileRefs and RemoveAppFromAllRefs from other goroutines, which
modify the same maps. Concurrent iteration and modification of a map
is a data race, and the Go runtime can terminate the controller with
"fatal error: concurrent map iteration and map write", which is not
recoverable.
Return a copy of the map from both accessors while the lock is held,
so callers iterate a snapshot that is not modified by later tracker
updates. Return types are unchanged, so callers do not need changes.
Changes:
1. pkg/reftracker/ref_tracker.go
- Return maps.Clone of the internal map from AppsForRef and
RefsForApp
2. pkg/reftracker/ref_tracker_test.go
- Add Test_AppsForRef_RefsForApp_ReturnSnapshot verifying returned
maps are not affected by later tracker changes and vice versa
- Add Test_AppsForRef_ConcurrentWithReconcileRefs which iterates
returned maps while another goroutine updates the tracker. Without
this change it fails under -race, and without -race it usually
crashes with "concurrent map iteration and map write".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Himanshu Singh <himansh.singh3@gmail.com>
This branch has not been deployed
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.
AppRefTracker.AppsForRef and RefsForApp take the tracker lock, but return the tracker's internal maps. The Secret and ConfigMap event handlers range over the map returned by AppsForRef after the lock is released, while App and PackageRepository reconcilers call ReconcileRefs and RemoveAppFromAllRefs from other goroutines, which modify the same maps. Concurrent iteration and modification of a map is a data race, and the Go runtime can terminate the controller with "fatal error: concurrent map iteration and map write", which is not recoverable.
Return a copy of the map from both accessors while the lock is held, so callers iterate a snapshot that is not modified by later tracker updates. Return types are unchanged, so callers do not need changes.
Changes:
pkg/reftracker/ref_tracker.go
pkg/reftracker/ref_tracker_test.go
What this PR does / why we need it:
Which issue(s) this PR fixes:
Fixes #
Does this PR introduce a user-facing change?
Additional Notes for your reviewer:
Review Checklist:
a link to that PR
change
Additional documentation e.g., Proposal, usage docs, etc.: