Skip to content

Commit ddba780

Browse files
Riccardo Cipolleschifacebook-github-bot
Riccardo Cipolleschi
authored andcommitted
fix: Change checkout cache strategy (#35259)
Summary: This PR updates he cache strategy for the `checkout_with_cache command`. The previous strategy was using three keys in descending priority order to restore from the cache: * `<< parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}-{{ .Revision }}` * `<< parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}` *`<< parameters.checkout_base_cache_key >>-{{ arch }}` When it saves, it always saves using the first key. The restore works as it follows: 1. It tries to restore the cache using the first key 2. If it fails, it checks whether there is a cache hit for a key that matches the second key as a pattern 3. If it fails, it checks whether there is a cache hit for a key that matches the third pattern 4. Otherwise, it is a cache miss. This does not work well. Imagine that you submit some code in commit `xxxx` for branch `abc`. The CI run the first time, it misses all the three keys and checks out the code normally. Then, it stores the checked out code in the `checkout_key-abc-xxxx` key. Then, you submit a commit `yyyy` in the same branch. The CI starts, it tries with the key `checkout_key-abc-yyyy` but it misses It tries with the key `checkout_key-abc` and it finds the cache for `checkout_key-abc-xxxx` and it restores it, forgetting about your changes. While doing the release, we created a tag in a commit X. Then we manually had to remove it, but the CI had a cached version of .git with the tag for the `0.71-stable` branch. And the release failed because the tag was already existing. ### Why this should work With this solution, we are going to cache using the commit. If there is no cache for a specific commit, it will be a miss. It won't try to be smart and retrieve the code from previous caches. This should prevent stale caches and if we manually remove a tag, and then we do a new commit, it should work. This is a good trade-off that allows to pay the checkout cost only for the first batch of jobs of the pipeline. **NOTE:** This still won't work if we don't do a new commit. ## Changelog [General] [Fixed] - Change Cache strategy to avoid cache bumps in Release Pull Request resolved: #35259 Test Plan: 1. CircleCI must be green Reviewed By: jacdebug Differential Revision: D41120895 Pulled By: cipolleschi fbshipit-source-id: 2b45da01803197dbe4a25a313a9dfc53a976d096
1 parent 9cb0261 commit ddba780

File tree

1 file changed

+1
-4
lines changed

1 file changed

+1
-4
lines changed

.circleci/config.yml

+1-4
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,7 @@ commands:
132132
type: string
133133
steps:
134134
- restore_cache:
135-
keys:
136-
- << parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}-{{ .Revision }}
137-
- << parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}-
138-
- << parameters.checkout_base_cache_key >>-{{ arch }}-
135+
key: << parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}-{{ .Revision }}
139136
- checkout
140137
- save_cache:
141138
key: << parameters.checkout_base_cache_key >>-{{ arch }}-{{ .Branch }}-{{ .Revision }}

0 commit comments

Comments
 (0)