bootsnap 1.11.1 → 1.18.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +76 -0
- data/README.md +19 -10
- data/ext/bootsnap/bootsnap.c +253 -112
- data/ext/bootsnap/extconf.rb +20 -13
- data/lib/bootsnap/bundler.rb +1 -1
- data/lib/bootsnap/cli.rb +18 -16
- data/lib/bootsnap/compile_cache/iseq.rb +14 -8
- data/lib/bootsnap/compile_cache/json.rb +18 -17
- data/lib/bootsnap/compile_cache/yaml.rb +46 -60
- data/lib/bootsnap/compile_cache.rb +11 -15
- data/lib/bootsnap/load_path_cache/cache.rb +20 -21
- data/lib/bootsnap/load_path_cache/change_observer.rb +19 -2
- data/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb +7 -35
- data/lib/bootsnap/load_path_cache/loaded_features_index.rb +2 -2
- data/lib/bootsnap/load_path_cache/path.rb +16 -18
- data/lib/bootsnap/load_path_cache/path_scanner.rb +7 -1
- data/lib/bootsnap/load_path_cache/store.rb +11 -14
- data/lib/bootsnap/load_path_cache.rb +36 -13
- data/lib/bootsnap/setup.rb +1 -1
- data/lib/bootsnap/version.rb +1 -1
- data/lib/bootsnap.rb +36 -32
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4fa4ab785277ee01a1c8ee75b43f0efb93db42bffcdacc1c8505a65efa03dede
|
4
|
+
data.tar.gz: 8aaaca48ae257b563580023c8fa36a59463f4c30f5463c14f6b8b94bf5fe27df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27b48d27d3330c8565952a2fbb979e71013b1e9585bcb3284656192808c304f2874c32a135b14895eec61a7ef038fa71fa111964a56e7aaedc9ff507ef307686
|
7
|
+
data.tar.gz: c3d83a0b068f2908a6298c7cd8e1a660f1228a7ddbfb9409cb3f6c174319f3974388ce73756c04062b17b97a37e199a07bccbb0b8dc1c6224998c58c51194b27
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,81 @@
|
|
1
1
|
# Unreleased
|
2
2
|
|
3
|
+
# 1.18.3
|
4
|
+
|
5
|
+
* Fix the cache corruption issue in the revalidation feature. See #474.
|
6
|
+
The cache revalidation feature remains opt-in for now, until it is more battle tested.
|
7
|
+
|
8
|
+
# 1.18.2
|
9
|
+
|
10
|
+
* Disable stale cache entries revalidation by default as it seems to cause cache corruption issues. See #471 and #474.
|
11
|
+
Will be re-enabled in a future version once the root cause is identified.
|
12
|
+
* Fix a potential compilation issue on some systems. See #470.
|
13
|
+
|
14
|
+
# 1.18.1
|
15
|
+
|
16
|
+
* Handle `EPERM` errors when opening files with `O_NOATIME`.
|
17
|
+
|
18
|
+
# 1.18.0
|
19
|
+
|
20
|
+
* `Bootsnap.instrumentation` now receive `:hit` events.
|
21
|
+
* Add `Bootsnap.log_stats!` to print hit rate statistics on process exit. Can also be enabled with `BOOTSNAP_STATS=1`.
|
22
|
+
* Revalidate stale cache entries by digesting the source content.
|
23
|
+
This should significantly improve performance in environments where `mtime` isn't preserved (e.g. CI systems doing a git clone, etc).
|
24
|
+
See #468.
|
25
|
+
* Open source files and cache entries with `O_NOATIME` when available to reduce disk accesses. See #469.
|
26
|
+
* `bootsnap precompile --gemfile` now look for `.rb` files in the whole gem and not just the `lib/` directory. See #466.
|
27
|
+
|
28
|
+
# 1.17.1
|
29
|
+
|
30
|
+
* Fix a compatibility issue with the `prism` library that ships with Ruby 3.3. See #463.
|
31
|
+
* Improved the `Kernel#require` decorator to not cause a method redefinition warning. See #461.
|
32
|
+
|
33
|
+
# 1.17.0
|
34
|
+
|
35
|
+
* Ensure `$LOAD_PATH.dup` is Ractor shareable to fix an conflict with `did_you_mean`.
|
36
|
+
* Allow to ignore directories using absolute paths.
|
37
|
+
* Support YAML and JSON CompileCache on TruffleRuby.
|
38
|
+
* Support LoadPathCache on TruffleRuby.
|
39
|
+
|
40
|
+
# 1.16.0
|
41
|
+
|
42
|
+
* Use `RbConfig::CONFIG["rubylibdir"]` instead of `RbConfig::CONFIG["libdir"]` to check for stdlib files. See #431.
|
43
|
+
* Fix the cached version of `YAML.load_file` being slightly more permissive than the default `Psych` one. See #434.
|
44
|
+
`Date` and `Time` values are now properly rejected, as well as aliases.
|
45
|
+
If this causes a regression in your application, it is recommended to load *trusted* YAML files with `YAML.unsafe_load_file`.
|
46
|
+
|
47
|
+
# 1.15.0
|
48
|
+
|
49
|
+
* Add a readonly mode, for environments in which the updated cache wouldn't be persisted. See #428 and #423.
|
50
|
+
|
51
|
+
# 1.14.0
|
52
|
+
|
53
|
+
* Require Ruby 2.6.
|
54
|
+
* Add a way to skip directories during load path scanning.
|
55
|
+
If you have large non-ruby directories in the middle of your load path, it can severely slow down scanning.
|
56
|
+
Typically this is a problem with `node_modules`. See #277.
|
57
|
+
* Fix `Bootsnap.unload_cache!`, it simply wouldn't work at all because of a merge mistake. See #421.
|
58
|
+
|
59
|
+
# 1.13.0
|
60
|
+
|
61
|
+
* Stop decorating `Kernel.load`. This used to be very useful in development because the Rails "classic" autoloader
|
62
|
+
was using `Kernel.load` in dev and `Kernel.require` in production. But Zeitwerk is now the default, and it doesn't
|
63
|
+
use `Kernel.load` at all.
|
64
|
+
|
65
|
+
People still using the classic autoloader might want to stick to `bootsnap 1.12`.
|
66
|
+
|
67
|
+
* Add `Bootsnap.unload_cache!`. Applications can call it at the end of their boot sequence when they know
|
68
|
+
no more code will be loaded to reclaim a bit of memory.
|
69
|
+
|
70
|
+
# 1.12.0
|
71
|
+
|
72
|
+
* `bootsnap precompile` CLI will now also precompile `Rakefile` and `.rake` files.
|
73
|
+
|
74
|
+
* Stop decorating `Module#autoload` as it was only useful for supporting Ruby 2.2 and older.
|
75
|
+
|
76
|
+
* Remove `uname` and other platform specific version from the cache keys. `RUBY_PLATFORM + RUBY_REVISION` should be
|
77
|
+
enough to ensure bytecode compatibility. This should improve caching for alpine based setups. See #409.
|
78
|
+
|
3
79
|
# 1.11.1
|
4
80
|
|
5
81
|
* Fix the `can't modify frozen Hash` error on load path cache mutation. See #411.
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Bootsnap [![Actions Status](https://github.com/Shopify/bootsnap/workflows/ci/badge.svg)](https://github.com/Shopify/bootsnap/actions)
|
2
2
|
|
3
|
-
Bootsnap is a library that plugs into Ruby, with optional support for `YAML`,
|
3
|
+
Bootsnap is a library that plugs into Ruby, with optional support for `YAML` and `JSON`,
|
4
4
|
to optimize and cache expensive computations. See [How Does This Work](#how-does-this-work).
|
5
5
|
|
6
6
|
#### Performance
|
@@ -52,10 +52,13 @@ require 'bootsnap'
|
|
52
52
|
env = ENV['RAILS_ENV'] || "development"
|
53
53
|
Bootsnap.setup(
|
54
54
|
cache_dir: 'tmp/cache', # Path to your cache
|
55
|
+
ignore_directories: ['node_modules'], # Directory names to skip.
|
55
56
|
development_mode: env == 'development', # Current working environment, e.g. RACK_ENV, RAILS_ENV, etc
|
56
57
|
load_path_cache: true, # Optimize the LOAD_PATH with a cache
|
57
58
|
compile_cache_iseq: true, # Compile Ruby code into ISeq cache, breaks coverage reporting.
|
58
|
-
compile_cache_yaml: true
|
59
|
+
compile_cache_yaml: true, # Compile YAML into a cache
|
60
|
+
compile_cache_json: true, # Compile JSON into a cache
|
61
|
+
readonly: true, # Use the caches but don't update them on miss or stale entries.
|
59
62
|
)
|
60
63
|
```
|
61
64
|
|
@@ -66,7 +69,7 @@ will help optimize boot time further if you have an extremely large `$LOAD_PATH`
|
|
66
69
|
Note: Bootsnap and [Spring](https://github.com/rails/spring) are orthogonal tools. While Bootsnap
|
67
70
|
speeds up the loading of individual source files, Spring keeps a copy of a pre-booted Rails process
|
68
71
|
on hand to completely skip parts of the boot process the next time it's needed. The two tools work
|
69
|
-
well together
|
72
|
+
well together.
|
70
73
|
|
71
74
|
### Environment variables
|
72
75
|
|
@@ -76,7 +79,12 @@ well together, and are both included in a newly-generated Rails applications by
|
|
76
79
|
- `DISABLE_BOOTSNAP` allows to entirely disable bootsnap.
|
77
80
|
- `DISABLE_BOOTSNAP_LOAD_PATH_CACHE` allows to disable load path caching.
|
78
81
|
- `DISABLE_BOOTSNAP_COMPILE_CACHE` allows to disable ISeq and YAML caches.
|
82
|
+
- `BOOTSNAP_READONLY` configure bootsnap to not update the cache on miss or stale entries.
|
79
83
|
- `BOOTSNAP_LOG` configure bootsnap to log all caches misses to STDERR.
|
84
|
+
- `BOOTSNAP_STATS` log hit rate statistics on exit. Can't be used if `BOOTSNAP_LOG` is enabled.
|
85
|
+
- `BOOTSNAP_IGNORE_DIRECTORIES` a comma separated list of directories that shouldn't be scanned.
|
86
|
+
Useful when you have large directories of non-ruby files inside `$LOAD_PATH`.
|
87
|
+
It defaults to ignore any directory named `node_modules`.
|
80
88
|
|
81
89
|
### Environments
|
82
90
|
|
@@ -92,8 +100,8 @@ Bootsnap cache misses can be monitored though a callback:
|
|
92
100
|
Bootsnap.instrumentation = ->(event, path) { puts "#{event} #{path}" }
|
93
101
|
```
|
94
102
|
|
95
|
-
`event` is either `:miss` or `:
|
96
|
-
log all events to STDERR.
|
103
|
+
`event` is either `:hit`, `:miss`, `:stale` or `:revalidated`.
|
104
|
+
You can also call `Bootsnap.log!` as a shortcut to log all events to STDERR.
|
97
105
|
|
98
106
|
To turn instrumentation back off you can set it to nil:
|
99
107
|
|
@@ -113,6 +121,7 @@ into two broad categories:
|
|
113
121
|
compilation.
|
114
122
|
* `YAML.load_file` is modified to cache the result of loading a YAML object in MessagePack format
|
115
123
|
(or Marshal, if the message uses types unsupported by MessagePack).
|
124
|
+
* `JSON.load_file` is modified to cache the result of loading a JSON object in MessagePack format
|
116
125
|
|
117
126
|
### Path Pre-Scanning
|
118
127
|
|
@@ -183,9 +192,9 @@ translated ruby source to an internal bytecode format, which is then executed by
|
|
183
192
|
allows caching that bytecode. This allows us to bypass the relatively-expensive compilation step on
|
184
193
|
subsequent loads of the same file.
|
185
194
|
|
186
|
-
We also noticed that we spend a lot of time loading YAML documents during our application boot, and
|
187
|
-
that MessagePack and Marshal are *much* faster at deserialization than YAML, even with a fast
|
188
|
-
implementation. We use the same strategy of compilation caching for YAML documents, with the
|
195
|
+
We also noticed that we spend a lot of time loading YAML and JSON documents during our application boot, and
|
196
|
+
that MessagePack and Marshal are *much* faster at deserialization than YAML and JSON, even with a fast
|
197
|
+
implementation. We use the same strategy of compilation caching for YAML and JSON documents, with the
|
189
198
|
equivalent of Ruby's "bytecode" format being a MessagePack document (or, in the case of YAML
|
190
199
|
documents with types unsupported by MessagePack, a Marshal stream).
|
191
200
|
|
@@ -232,9 +241,9 @@ Bootsnap writes a cache file containing a 64 byte header followed by the cache c
|
|
232
241
|
is a cache key including several fields:
|
233
242
|
|
234
243
|
* `version`, hardcoded in bootsnap. Essentially a schema version;
|
235
|
-
* `ruby_platform`, A hash of `RUBY_PLATFORM` (e.g. x86_64-linux-gnu) variable
|
244
|
+
* `ruby_platform`, A hash of `RUBY_PLATFORM` (e.g. x86_64-linux-gnu) variable.
|
236
245
|
* `compile_option`, which changes with `RubyVM::InstructionSequence.compile_option` does;
|
237
|
-
* `ruby_revision`,
|
246
|
+
* `ruby_revision`, A hash of `RUBY_REVISION`, the exact version of Ruby;
|
238
247
|
* `size`, the size of the source file;
|
239
248
|
* `mtime`, the last-modification timestamp of the source file when it was compiled; and
|
240
249
|
* `data_size`, the number of bytes following the header, which we need to read it into a buffer.
|