Clear gem specification cache after acquiring process lock#9310
Open
ngan wants to merge 1 commit intoruby:masterfrom
Open
Clear gem specification cache after acquiring process lock#9310ngan wants to merge 1 commit intoruby:masterfrom
ngan wants to merge 1 commit intoruby:masterfrom
Conversation
When multiple `bundle install` processes run concurrently, a race condition can cause issues. The second process populates its `Gem::Specification.stubs` and `@installed_specs` caches before acquiring the ProcessLock. While waiting for the lock, the first process installs gems. After acquiring the lock, the second process uses its stale cache and may not see the newly installed gems. This fix clears the caches immediately after acquiring the process lock, ensuring that any gems installed by another process while waiting for the lock are properly detected. Similar to ruby#8539 which addressed a related cache invalidation issue for the `bundle update` command. Fixes ruby#8473 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Contributor
Author
|
An inefficiency here is that a reset happens after every lock acquisition, even when the lock wasn't held by some other process in the first place. I was thinking the ProcessLock can yield whether or not it was able to acquire the lock immediately or it had to wait. Then the reset can happen based off of that. Thoughts? |
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.
Summary
bundle installprocesses run concurrentlyGem::Specificationand source caches after acquiring the process lockclear_cachemethod toSource::RubygemsandSourceListProblem
When two
bundle installprocesses run concurrently:Gem::Specification.stubsand@installed_specscaches (showing no gems installed)This can lead to issues where gems appear to be missing or need reinstallation.
Solution
After acquiring the process lock, clear the caches before proceeding with installation:
This ensures that any gems installed by another process while waiting for the lock are properly detected.
Related
Similar to #8539 which addressed a related cache invalidation issue for the
bundle updatecommand.Diagram
Test plan
Source::Rubygems#clear_cacheSourceList#clear_cachedelegation🤖 Generated with Claude Code