[libc++][lit] Atomically update the persistent cache (#66538)

When running multiple shards in parallel, one shard might write to the
cache while another one is reading this cache. Instead of updating the
file in place, write to a temporary file and swap the cache file using
os.replace(). This is an atomic operation and means shards will either
see the old state or the new one.
This commit is contained in:
Alexander Richardson 2023-09-18 09:08:24 -07:00 committed by GitHub
parent 6a45339bac
commit 14882d6b74
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -69,8 +69,14 @@ def _memoizeExpensiveOperation(extractCacheKey):
if cacheKey not in cache:
cache[cacheKey] = function(config, *args, **kwargs)
# Update the persistent cache so it knows about the new key
with open(persistentCache, "wb") as cacheFile:
# We write to a PID-suffixed file and rename the result to
# ensure that the cache is not corrupted when running the test
# suite with multiple shards. Since this file is in the same
# directory as the destination, os.replace() will be atomic.
unique_suffix = ".tmp." + str(os.getpid())
with open(persistentCache + unique_suffix, "wb") as cacheFile:
pickle.dump(cache, cacheFile)
os.replace(persistentCache + unique_suffix, persistentCache)
return cache[cacheKey]
return f