bootsnap 1.11.1 → 1.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 [](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.
|