Shopify / bootsnap

Boot large Ruby/Rails apps faster
MIT License
2.68k stars 183 forks source link

Revalidate cache based on source digest #468

Closed etiennebarrie closed 10 months ago

etiennebarrie commented 10 months ago

Ref: https://github.com/Shopify/bootsnap/issues/336

Bootsnap was initially designed for improving boot time in development, so it was logical to use mtime to detect changes given that's reliable on a given machine.

But is just as useful on production and CI environments, however there its hit rate can vary a lot because depending on how the source code and caches are saved and restored, many if not all mtime will have changed.

To improve this, we can first try to revalidate using the mtime, and if it fails, fallback to compare a digest of the file content. Digesting a file, even with fnv1a_64 is of course an overhead, but the assumption is that true misses should be relatively rare and that digesting the file will always be faster than compiling it. So even if it only improve the hit rate marginally, it should be faster overall.

Also we only recompute the digest if the file mtime changed, but its size remained the same, which should discard the overwhelming majority of legitimate source file changes.