fix(database): synchronize repo manager snapshots - #16774
dajiaohuang wants to merge 1 commit into
Conversation
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize the Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counterproductive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. |
|
Thanks for the contribution! A couple of housekeeping items:
|
paulb777
left a comment
There was a problem hiding this comment.
Thanks, this finishes applying the @synchronized(configs) locking that createRepo and getRepo already use. interruptAll/resumeAll (reachable from goOffline()/goOnline()) and disposeRepos previously read or mutated configs without the lock. Looks good to me apart from a nit and the formatting.
| + (NSArray<FRepo *> *)reposForConfigIdentifier:(NSString *)sessionIdentifier | ||
| inConfigs:(FRepoDictionary *)configs { | ||
| @synchronized(configs) { | ||
| return [[configs[sessionIdentifier] allValues] copy] ?: @[]; |
There was a problem hiding this comment.
nit: allValues already returns a new array, so the copy isn't needed (same at L50).
Summary\n- Snapshot per-config and all-config repo arrays while holding the shared configs monitor.\n- Release the monitor before interrupt/resume/dispose side effects.\n- Snapshot and remove a config entry atomically during disposal.\n\nThis closes concurrent reads of the mutable configs and nested repo dictionaries against createRepo/getRepo writes.\n\n## Validation\n- \git diff --check\ passed.\n- Native Database tests were not run because Xcode is unavailable in this environment.\n- clang-format was unavailable in PATH.