pigeonhole-db 1.1.0
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 +7 -0
- data/Cargo.lock +899 -0
- data/Cargo.toml +45 -0
- data/LICENSE +21 -0
- data/README.md +22 -0
- data/extconf.rb +12 -0
- data/lib/pigeonhole/api.rb +615 -0
- data/lib/pigeonhole/index.rb +208 -0
- data/lib/pigeonhole/memory.rb +507 -0
- data/lib/pigeonhole/version.rb +6 -0
- data/lib/pigeonhole-db.rb +6 -0
- data/lib/pigeonhole.rb +47 -0
- data/sig/pigeonhole.rbs +1484 -0
- data/src/budget.rs +205 -0
- data/src/classes.rs +279 -0
- data/src/convert.rs +192 -0
- data/src/db.rs +685 -0
- data/src/error.rs +151 -0
- data/src/feed.rs +316 -0
- data/src/fork.rs +64 -0
- data/src/gvl.rs +112 -0
- data/src/index.rs +1157 -0
- data/src/lib.rs +534 -0
- data/src/memory.rs +2178 -0
- data/src/read.rs +312 -0
- data/src/table.rs +1161 -0
- data/src/vector.rs +262 -0
- data/src/walk.rs +406 -0
- data/vendor/bundle/ruby/3.4.0/bin/minitest +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake-compiler-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rb-sys-dock +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/cache/drb-2.2.3.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/minitest-6.0.6.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/prism-1.9.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-1.3.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-compiler-dock-1.12.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rb_sys-0.9.130.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rbs-4.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/toml-rb-6.0.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/tsort-0.2.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/gem_make.out +44 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/mkmf.log +74 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/prism-1.9.0/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/gem_make.out +41 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/mkmf.log +102 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/rbs-4.2.0/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/drb.gemspec +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/acl.rb +239 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/drb.rb +1993 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/eq.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extserv.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/extservm.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/gw.rb +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/observer.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/ssl.rb +354 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/timeridconv.rb +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/unix.rb +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/version.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb/weakidconv.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/drb-2.2.3/lib/drb.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/History.rdoc +1860 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Manifest.txt +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/README.rdoc +763 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/Rakefile +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/bin/minitest +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/design_rationale.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/hoe/minitest.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/assertions.rb +821 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/autorun.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/benchmark.rb +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/bisect.rb +304 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/complete.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/compress.rb +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/error_on_warning.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/expectations.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/find_minimal_combination.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/hell.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/manual_plugins.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/parallel.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/path_expander.rb +432 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/pride_plugin.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/server_plugin.rb +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/spec.rb +324 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint.rb +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/sprint_plugin.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test.rb +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest/test_task.rb +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/lib/minitest.rb +1232 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/metametameta.rb +150 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_bisect.rb +249 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_find_minimal_combination.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_assertions.rb +1729 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_benchmark.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_reporter.rb +437 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_spec.rb +1095 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test.rb +1295 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_minitest_test_task.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_path_expander.rb +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/minitest-6.0.6/test/minitest/test_server.rb +146 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/BSDmakefile +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CHANGELOG.md +786 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CODE_OF_CONDUCT.md +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/CONTRIBUTING.md +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/LICENSE.md +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/Makefile +116 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/README.md +143 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/config.yml +4739 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/build_system.md +119 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/configuration.md +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/cruby_compilation.md +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/design.md +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/encoding.md +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/fuzzing.md +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/heredocs.md +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/javascript.md +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/local_variable_depth.md +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/mapping.md +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parser_translation.md +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/parsing_rules.md +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/releasing.md +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/relocation.md +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ripper_translation.md +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_api.md +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/ruby_parser_translation.md +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/serialization.md +233 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/docs/testing.md +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_node.c +6945 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/api_pack.c +276 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extconf.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.c +1427 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/ext/prism/extension.h +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/ast.h +8254 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/defines.h +260 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/diagnostic.h +458 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/encoding.h +283 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/node.h +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/options.h +488 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/pack.h +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/parser.h +936 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/prettyprint.h +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/regexp.h +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/static_literals.h +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_buffer.h +236 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_char.h +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_constant_pool.h +218 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_integer.h +130 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_list.h +103 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_memchr.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_newline_list.h +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_string.h +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strncasecmp.h +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/util/pm_strpbrk.h +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism/version.h +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/include/prism.h +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/compiler.rb +801 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/desugar_compiler.rb +392 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dispatcher.rb +2210 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dot_visitor.rb +4767 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/dsl.rb +1003 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/ffi.rb +578 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/inspect_visitor.rb +2393 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/lex_compat.rb +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/mutation_compiler.rb +772 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node.rb +19966 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/node_ext.rb +511 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pack.rb +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/comments.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/errors.rb +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result/newlines.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/parse_result.rb +907 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/pattern.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/append_as_bytes.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/byteindex.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/scan_byte.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/unpack1.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/polyfill/warn.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/prism.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/reflection.rb +416 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/relocation.rb +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/serialize.rb +2400 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/string_query.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/builder.rb +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/compiler.rb +2234 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser/lexer.rb +820 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser.rb +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_current.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/parser_versions.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/filter.rb +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/lexer.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/sexp.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper/shim.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ripper.rb +3520 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation/ruby_parser.rb +1964 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/translation.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism/visitor.rb +813 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/lib/prism.rb +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/prism.gemspec +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/compiler.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/dsl.rbi +524 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/inspect_visitor.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node.rbi +8750 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/node_ext.rbi +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/parse_result.rbi +404 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/reflection.rbi +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/string_query.rbi +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser.rbi +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/parser_versions.rbi +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/translation/ripper.rbi +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism/visitor.rbi +473 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/rbi/prism.rbi +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/compiler.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dispatcher.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dot_visitor.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/dsl.rbs +351 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/inspect_visitor.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/lex_compat.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/mutation_compiler.rbs +159 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node.rbs +4042 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/node_ext.rbs +149 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pack.rbs +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result/comments.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/parse_result.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/pattern.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/reflection.rbs +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/relocation.rbs +185 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/serialize.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/string_query.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism/visitor.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/sig/prism.rbs +272 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/diagnostic.c +854 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/encoding.c +5340 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/node.c +8685 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/options.c +338 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/pack.c +509 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prettyprint.c +8957 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/prism.c +22679 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/regexp.c +790 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/serialize.c +2274 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/static_literals.c +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/token_type.c +703 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_buffer.c +357 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_char.c +318 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_constant_pool.c +342 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_integer.c +670 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_list.c +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_memchr.c +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_newline_list.c +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_string.c +381 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strncasecmp.c +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/prism-1.9.0/src/util/pm_strpbrk.c +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/History.md +708 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/LICENSE.txt +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/README.md +505 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/Rakefile +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/appveyor.yml +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/bin/rake-compiler +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/cucumber.yml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/compile.feature +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-compile.feature +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package-multi.feature +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/cross-package.feature +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-compile.feature +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-no-native-compile.feature +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/java-package.feature +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/package.feature +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/compilation.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/cross_compilation.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/execution.rb +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/folders.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/gem.rb +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/step_definitions/java_compilation.rb +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/env.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/file_template_helpers.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/generator_helpers.rb +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/features/support/platform_extension_helpers.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/baseextensiontask.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/compiler_config.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensioncompiler.rb +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/extensiontask.rb +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/lib/rake/javaextensiontask.rb +321 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bin/cross-ruby.rake +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/bootstrap.rake +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/common.rake +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/cucumber.rake +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/gem.rake +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-1.3.2/tasks/rspec.rake +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CHANGELOG.md +446 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/CONTRIBUTING.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.jruby +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Dockerfile.mri.erb +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Gemfile +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/README.md +447 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/Rakefile +246 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/bin/rake-compiler-dock +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/buildkitd.toml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/gem_helper.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_i686.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_musl_cross.sh +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_osxcross.sh +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/mk_pkg_config.sh +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/parallel_docker_build.rb +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0004-Enable-build-of-static-libruby.patch +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0005-build-miniruby-first.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/patches/rake-compiler-1.3.1/0006-ruby-4-rubyspec-capiext.patch +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/rcd-env.sh +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/runas +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sigfw.c +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_codesign +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/strip_wrapper_vbox +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/build/sudoers +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/colors.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/docker_check.rb +356 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/predefined_user_group.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/starter.rb +206 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock/version.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/lib/rake_compiler_dock.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/Dockerfile +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/README.md +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/rake-compiler-dock.gemspec +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.alpine +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/env/Dockerfile.debian +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/fixtures/mig_test_rpc.defs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Gemfile +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/Rakefile +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/extconf.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.c +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/ext/mri/rcd_test_ext.h +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/lib/rcd_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/rcd_test.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/rcd_test/test/test_basic.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_environment_variables.rb +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_mig.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_parallel_docker_build.rb +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_rubygems_plugins.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_starter.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-compiler-dock-1.12.0/test/test_versions.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-APACHE +190 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/LICENSE-MIT +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/README.md +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/certs/ianks.pem +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/exe/rb-sys-dock +495 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/config.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo/metadata.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder/link_flag_converter.rb +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/cargo_builder.rb +370 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/error.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/extensiontask.rb +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf/config.rb +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/mkmf.rb +413 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info/data.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/toolchain_info.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/util/logger.rb +73 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rb_sys-0.9.130/lib/rb_sys.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/CHANGELOG.md +2463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Dockerfile.jruby +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/README.md +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Rakefile +1213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/Steepfile +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/config.yml +920 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/array.rbs +4205 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/basic_object.rbs +376 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/binding.rbs +148 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/builtin.rbs +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/class.rbs +223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/comparable.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/complex.rbs +812 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/constants.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/data.rbs +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/dir.rbs +993 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/encoding.rbs +1368 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerable.rbs +2506 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator/product.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/enumerator.rbs +705 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/env.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errno.rbs +682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/errors.rbs +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/exception.rbs +485 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/false_class.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber.rbs +570 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/fiber_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file.rbs +2045 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_constants.rbs +463 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_stat.rbs +534 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/file_test.rbs +331 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/float.rbs +1292 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/gc.rbs +788 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/global_variables.rbs +184 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/hash.rbs +2183 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/integer.rbs +1374 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/buffer.rbs +995 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io/wait.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/io.rbs +3473 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/kernel.rbs +3172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/marshal.rbs +207 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/match_data.rbs +637 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/math.rbs +770 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/method.rbs +422 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/module.rbs +1856 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/nil_class.rbs +210 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/numeric.rbs +832 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space/weak_key_map.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/object_space.rbs +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/pathname.rbs +1312 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/proc.rbs +905 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/process.rbs +2316 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ractor.rbs +914 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/random.rbs +255 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/range.rbs +1209 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rational.rbs +502 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rb_config.rbs +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/ops.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/argf.rbs +1236 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/env_class.rbs +1214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/main_class.rbs +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rbs/unnamed/random.rbs +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/refinement.rbs +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/regexp.rbs +1974 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/ruby_vm.rbs +809 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/basic_specification.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/config_file.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/dependency_installer.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/errors.rbs +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/installer.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/path_support.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/platform.rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/request_set.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/requirement.rbs +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/rubygems.rbs +1108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/source_list.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/specification.rbs +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/stream_ui.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/uninstaller.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/rubygems/version.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/set.rbs +751 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/signal.rbs +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/string.rbs +5532 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/struct.rbs +668 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/symbol.rbs +482 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread.rbs +1821 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/thread_group.rbs +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/time.rbs +1793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/trace_point.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/true_class.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/unbound_method.rbs +337 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/core/warning.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/CONTRIBUTING.md +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/aliases.md +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/architecture.md +110 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/collection.md +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/config.md +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/data_and_struct.md +86 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/encoding.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/gem.md +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/inline.md +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rbs_by_example.md +309 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/release.md +303 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/repo.md +125 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/rust.md +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/sigs.md +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/stdlib.md +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/syntax.md +952 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/tools.md +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/type_fingerprint.md +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/docs/wasm_serialization.md +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/exe/rbs +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.c +1870 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/ast_translation.h +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.c +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/class_constants.h +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/compat.h +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/extconf.rb +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.c +299 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/legacy_location.h +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/main.c +649 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_extension.h +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/goodcheck.yml +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/ast.h +1055 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/defines.h +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/lexer.h +208 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/location.h +40 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/parser.h +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/serialize.h +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/string.h +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_allocator.h +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_assert.h +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_buffer.h +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_constant_pool.h +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_encoding.h +282 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs/util/rbs_unescape.h +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/include/rbs.h +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ancestor_graph.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/annotations.rb +199 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/formatter.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_annotator.rb +398 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/annotate.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/annotation.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/comment.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/declarations.rb +472 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/directives.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/members.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/annotations.rb +451 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/declarations.rb +291 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/ruby/members.rb +762 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/type_param.rb +235 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/ast/visitor.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/buffer.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/builtin_names.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/colored_io.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/diff.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli/validate.rb +294 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/cli.rb +1253 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/cleaner.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config/lockfile_generator.rb +269 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/config.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/installer.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/base.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/git.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/local.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection/sources.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/collection.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/constant.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition.rb +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/ancestor_builder.rb +681 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder/method_builder.rb +295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/definition_builder.rb +1057 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/diff.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/class_entry.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/module_entry.rb +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment/use_map.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment.rb +1028 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_loader.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/environment_walker.rb +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/errors.rb +634 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/factory.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/file_finder.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/inline_parser.rb +568 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/location_aux.rb +170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/locator.rb +247 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/method_type.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/namespace.rb +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/lex_result.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser/token.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/parser_aux.rb +144 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/helpers.rb +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/node_usage.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rb.rb +816 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/rbi.rb +793 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime/value_object_generator.rb +278 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/prototype/runtime.rb +680 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/repository.rb +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/resolver/type_name_resolver.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/rewriter.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/sorter.rb +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/source.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/substitution.rb +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/subtractor.rb +204 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/errors.rb +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/guaranteed.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/hook.rb +212 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/observer.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/setup_helper.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/tester.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test/type_check.rb +457 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/test.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_dependency.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_alias_regularity.rb +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/type_name.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/types.rb +1646 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/convertibles.rb +177 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/spy.rb +138 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/type_assertions.rb +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test/with_aliases.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/unit_test.rb +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/validator.rb +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/variance_calculator.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/vendorer.rb +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/deserializer.rb +213 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/location.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/parser.rb +174 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/runtime.rb +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/wasm/serialization_schema.rb +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs/writer.rb +424 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_extension.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rbs_jars.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc/discover.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/lib/rdoc_plugin/parser.rb +168 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/rbs.gemspec +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/annotation.json +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/comment.json +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/decls.json +326 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/function.json +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/location.json +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/members.json +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/methodType.json +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/typeParam.json +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/schema/types.json +317 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_builder.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ancestor_graph.rbs +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/annotations.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/formatter.rbs +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_annotater.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotate/rdoc_source.rbs +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/annotation.rbs +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/annotations.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/comment_block.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/declarations.rbs +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/ast/ruby/members.rbs +198 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/buffer.rbs +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/builtin_names.rbs +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/colored_io.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/diff.rbs +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli/validate.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/cli.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/cleaner.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile.rbs +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config/lockfile_generator.rbs +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/config.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/installer.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection/sources.rbs +214 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/collection.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/comment.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/constant.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/declarations.rbs +274 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition.rbs +232 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/definition_builder.rbs +181 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/diff.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/directives.rbs +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/class_entry.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment/module_entry.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment.rbs +286 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_loader.rbs +111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/environment_walker.rbs +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/errors.rbs +408 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/factory.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/file_finder.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser/comment_association.rbs +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/inline_parser.rbs +126 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/location.rbs +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/locator.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/manifest.yaml +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/members.rbs +258 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_builder.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/method_types.rbs +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/namespace.rbs +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/parser.rbs +164 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/helpers.rbs +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/node_usage.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rb.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/rbi.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/prototype/runtime.rbs +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rbs.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rdoc/rbs.rbs +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/repository.rbs +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/constant_resolver.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/context.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/resolver/type_name_resolver.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/rewriter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/bundler.rbs +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/enumerable.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/shims/rubygems.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/sorter.rbs +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/source.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/substitution.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/subtractor.rbs +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/errors.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/guranteed.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test/type_check.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/test.rbs +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_dependency.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_alias_regularity.rbs +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/type_param.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/typename.rbs +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/types.rbs +588 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/convertibles.rbs +154 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/spy.rbs +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/type_assertions.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/unit_test/with_aliases.rbs +136 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/use_map.rbs +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/util.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/validator.rbs +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/variance_calculator.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/vendorer.rbs +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/version.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/visitor.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/deserializer.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/wasm/serialization_schema.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/sig/writer.rbs +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/ast.c +1644 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.c +3223 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexer.re +187 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/lexstate.c +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/location.c +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/parser.c +4318 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/serialize.c +965 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/string.c +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_allocator.c +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_assert.c +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_buffer.c +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_constant_pool.c +268 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_encoding.c +21454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/src/util/rbs_unescape.c +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/abbrev/0/array.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/base64/0/base64.rbs +355 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal/0/big_decimal.rbs +1647 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/big_math.rbs +280 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/core.rbs +911 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/coverage/0/coverage.rbs +266 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/csv.rbs +3776 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/csv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date.rbs +1598 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/date_time.rbs +617 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/date/0/time.rbs +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/dbm/0/dbm.rbs +421 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/delegator.rbs +188 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/kernel.rbs +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/did_you_mean/0/did_you_mean.rbs +344 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/digest/0/digest.rbs +693 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/erb/0/erb.rbs +933 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/etc/0/etc.rbs +884 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/fileutils/0/fileutils.rbs +1753 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/find/0/find.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/forwardable/0/forwardable.rbs +271 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/io-console/0/io-console.rbs +414 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ipaddr/0/ipaddr.rbs +431 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/json/0/json.rbs +1963 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/kconv/0/kconv.rbs +166 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/formatter.rbs +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/log_device.rbs +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/logger.rbs +796 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/period.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/logger/0/severity.rbs +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/kernel.rbs +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/minitest/0/minitest.rbs +115 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/monitor/0/monitor.rbs +363 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-http/0/net-http.rbs +5580 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/nkf/0/nkf.rbs +402 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/objspace/0/objspace.rbs +470 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/observable/0/observable.rbs +217 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/manifest.yaml +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open-uri/0/open-uri.rbs +433 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/open3/0/open3.rbs +606 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/openssl/0/openssl.rbs +12237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/optparse/0/optparse.rbs +1734 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pathname/0/pathname.rbs +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pp/0/pp.rbs +301 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pstore/0/pstore.rbs +608 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/core_ext.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/dbm.rbs +237 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/psych.rbs +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/psych/0/store.rbs +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/pty/0/pty.rbs +240 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/code_object.rbs +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/comment.rbs +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/context.rbs +153 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/markup.rbs +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/options.rbs +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/parser.rbs +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/rdoc.rbs +393 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/ri.rbs +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/store.rbs +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/rdoc/0/top_level.rbs +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/resolv/0/resolv.rbs +1787 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/ripper/0/ripper.rbs +1654 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/securerandom/0/securerandom.rbs +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/singleton/0/singleton.rbs +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/addrinfo.rbs +666 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/basic_socket.rbs +590 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/constants.rbs +2295 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/ip_socket.rbs +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket.rbs +4170 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/socket_error.rbs +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_server.rbs +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/tcp_socket.rbs +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/udp_socket.rbs +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_server.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/socket/0/unix_socket.rbs +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/stringio/0/stringio.rbs +1682 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/strscan/0/string_scanner.rbs +1648 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/manifest.yaml +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tempfile/0/tempfile.rbs +483 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/time/0/time.rbs +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/timeout/0/timeout.rbs +132 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/cyclic.rbs +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/interfaces.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/tsort/0/tsort.rbs +410 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/common.rbs +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/file.rbs +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ftp.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/generic.rbs +1111 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/http.rbs +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/https.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldap.rbs +230 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ldaps.rbs +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/mailto.rbs +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/ws.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/uri/0/wss.rbs +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/manifest.yaml +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/yaml/0/yaml.rbs +1 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/buf_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/data_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/deflate.rbs +211 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/error.rbs +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/gzip_writer.rbs +169 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/inflate.rbs +180 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/mem_error.rbs +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/need_dict.rbs +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_end.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/stream_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/version_error.rbs +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zlib.rbs +449 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/stdlib/zlib/0/zstream.rbs +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/README.md +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/rbs-4.2.0/wasm/rbs_wasm.c +479 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/LICENSE +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/README.md +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/datetime.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/dumper.rb +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/errors.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/inline_table.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/keyvalue.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/parser.rb +296 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/string.rb +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/table_array.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/toml-rb-6.0.0/lib/toml-rb.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Gemfile +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/README.md +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/Rakefile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/console +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/lib/tsort.rb +455 -0
- data/vendor/bundle/ruby/3.4.0/gems/tsort-0.2.0/tsort.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/drb-2.2.3.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/minitest-6.0.6.gemspec +35 -0
- data/vendor/bundle/ruby/3.4.0/specifications/prism-1.9.0.gemspec +24 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-1.3.2.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-compiler-dock-1.12.0.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rb_sys-0.9.130.gemspec +29 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rbs-4.2.0.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/toml-rb-6.0.0.gemspec +27 -0
- data/vendor/bundle/ruby/3.4.0/specifications/tsort-0.2.0.gemspec +23 -0
- data/vendor/cache/Cargo.toml +21 -0
- data/vendor/cache/LICENSE +21 -0
- data/vendor/cache/README.md +5 -0
- data/vendor/cache/src/hash.rs +85 -0
- data/vendor/cache/src/lib.rs +751 -0
- data/vendor/cache/src/loom_tests.rs +340 -0
- data/vendor/cache/src/s3fifo.rs +648 -0
- data/vendor/cache/src/sync.rs +25 -0
- data/vendor/cache/src/tests.rs +260 -0
- data/vendor/compaction/Cargo.toml +32 -0
- data/vendor/compaction/LICENSE +21 -0
- data/vendor/compaction/README.md +5 -0
- data/vendor/compaction/src/blob.rs +478 -0
- data/vendor/compaction/src/cursor.rs +700 -0
- data/vendor/compaction/src/gc.rs +802 -0
- data/vendor/compaction/src/job.rs +861 -0
- data/vendor/compaction/src/lib.rs +102 -0
- data/vendor/compaction/src/merge.rs +995 -0
- data/vendor/compaction/src/picker.rs +681 -0
- data/vendor/compaction/src/resolver.rs +1346 -0
- data/vendor/engine/Cargo.toml +56 -0
- data/vendor/engine/LICENSE +21 -0
- data/vendor/engine/README.md +5 -0
- data/vendor/engine/src/admission.rs +421 -0
- data/vendor/engine/src/catalog.rs +1233 -0
- data/vendor/engine/src/check.rs +1386 -0
- data/vendor/engine/src/clock.rs +244 -0
- data/vendor/engine/src/clock_loom.rs +482 -0
- data/vendor/engine/src/close_gate.rs +325 -0
- data/vendor/engine/src/compact.rs +1509 -0
- data/vendor/engine/src/engine/hooks.rs +1654 -0
- data/vendor/engine/src/engine/info.rs +229 -0
- data/vendor/engine/src/engine.rs +6114 -0
- data/vendor/engine/src/error.rs +490 -0
- data/vendor/engine/src/feed.rs +960 -0
- data/vendor/engine/src/feed_reader.rs +1600 -0
- data/vendor/engine/src/flush.rs +839 -0
- data/vendor/engine/src/flushed_roots.rs +158 -0
- data/vendor/engine/src/flushed_through_loom.rs +77 -0
- data/vendor/engine/src/health.rs +201 -0
- data/vendor/engine/src/large.rs +372 -0
- data/vendor/engine/src/large_settle.rs +201 -0
- data/vendor/engine/src/lib.rs +112 -0
- data/vendor/engine/src/load_slot.rs +324 -0
- data/vendor/engine/src/maintenance.rs +935 -0
- data/vendor/engine/src/manifest/flight.rs +563 -0
- data/vendor/engine/src/manifest.rs +1516 -0
- data/vendor/engine/src/nonblocking.rs +603 -0
- data/vendor/engine/src/options.rs +334 -0
- data/vendor/engine/src/position.rs +125 -0
- data/vendor/engine/src/purge_guard.rs +220 -0
- data/vendor/engine/src/read/keys.rs +1049 -0
- data/vendor/engine/src/read/knn.rs +423 -0
- data/vendor/engine/src/read/reduce.rs +2057 -0
- data/vendor/engine/src/read/traverse.rs +1013 -0
- data/vendor/engine/src/read.rs +2429 -0
- data/vendor/engine/src/row_cache.rs +1101 -0
- data/vendor/engine/src/shard/tablets.rs +3582 -0
- data/vendor/engine/src/shard.rs +12215 -0
- data/vendor/engine/src/snapshot.rs +1429 -0
- data/vendor/engine/src/source.rs +1379 -0
- data/vendor/engine/src/timer_state.rs +226 -0
- data/vendor/engine/src/waker.rs +124 -0
- data/vendor/engine/src/watermark_waiters.rs +674 -0
- data/vendor/engine/src/write.rs +1321 -0
- data/vendor/format/Cargo.toml +40 -0
- data/vendor/format/LICENSE +21 -0
- data/vendor/format/README.md +5 -0
- data/vendor/format/src/blob.rs +101 -0
- data/vendor/format/src/block.rs +1120 -0
- data/vendor/format/src/bloom.rs +456 -0
- data/vendor/format/src/buckets.rs +552 -0
- data/vendor/format/src/bytes.rs +101 -0
- data/vendor/format/src/checksum.rs +132 -0
- data/vendor/format/src/compress.rs +196 -0
- data/vendor/format/src/cursor.rs +110 -0
- data/vendor/format/src/distance.rs +598 -0
- data/vendor/format/src/error.rs +93 -0
- data/vendor/format/src/exact.rs +602 -0
- data/vendor/format/src/feed.rs +285 -0
- data/vendor/format/src/filter.rs +157 -0
- data/vendor/format/src/half.rs +182 -0
- data/vendor/format/src/hash.rs +127 -0
- data/vendor/format/src/hll.rs +500 -0
- data/vendor/format/src/ids.rs +95 -0
- data/vendor/format/src/key.rs +620 -0
- data/vendor/format/src/kind_params.rs +101 -0
- data/vendor/format/src/lib.rs +54 -0
- data/vendor/format/src/manifest.rs +1287 -0
- data/vendor/format/src/roaring.rs +865 -0
- data/vendor/format/src/scan.rs +297 -0
- data/vendor/format/src/shm.rs +805 -0
- data/vendor/format/src/sst.rs +233 -0
- data/vendor/format/src/superblock.rs +345 -0
- data/vendor/format/src/value.rs +163 -0
- data/vendor/format/src/varint.rs +87 -0
- data/vendor/format/src/vector.rs +936 -0
- data/vendor/format/src/version.rs +92 -0
- data/vendor/format/src/wal.rs +999 -0
- data/vendor/io/Cargo.toml +29 -0
- data/vendor/io/LICENSE +21 -0
- data/vendor/io/README.md +5 -0
- data/vendor/io/src/async_poll.rs +44 -0
- data/vendor/io/src/buf.rs +694 -0
- data/vendor/io/src/completion.rs +444 -0
- data/vendor/io/src/error.rs +110 -0
- data/vendor/io/src/file.rs +206 -0
- data/vendor/io/src/lib.rs +53 -0
- data/vendor/io/src/nowait.rs +256 -0
- data/vendor/io/src/os/mod.rs +149 -0
- data/vendor/io/src/os/unix.rs +897 -0
- data/vendor/io/src/os/windows.rs +552 -0
- data/vendor/io/src/own.rs +257 -0
- data/vendor/io/src/pread.rs +854 -0
- data/vendor/io/src/ring_wake.rs +113 -0
- data/vendor/io/src/shared.rs +410 -0
- data/vendor/io/src/sim.rs +1545 -0
- data/vendor/io/src/sys.rs +214 -0
- data/vendor/io/src/uring.rs +1839 -0
- data/vendor/io/src/vfs.rs +154 -0
- data/vendor/memory/Cargo.toml +34 -0
- data/vendor/memory/LICENSE +21 -0
- data/vendor/memory/README.md +11 -0
- data/vendor/memory/src/consolidate.rs +640 -0
- data/vendor/memory/src/dedup.rs +231 -0
- data/vendor/memory/src/error.rs +131 -0
- data/vendor/memory/src/feed_loop.rs +572 -0
- data/vendor/memory/src/forget.rs +724 -0
- data/vendor/memory/src/hooks.rs +109 -0
- data/vendor/memory/src/ivf.rs +204 -0
- data/vendor/memory/src/layout.rs +340 -0
- data/vendor/memory/src/lib.rs +61 -0
- data/vendor/memory/src/recall.rs +1182 -0
- data/vendor/memory/src/store.rs +1785 -0
- data/vendor/memory/src/watch.rs +339 -0
- data/vendor/memtable/Cargo.toml +24 -0
- data/vendor/memtable/LICENSE +21 -0
- data/vendor/memtable/README.md +5 -0
- data/vendor/memtable/src/lib.rs +1658 -0
- data/vendor/memtable/src/loom_tests.rs +274 -0
- data/vendor/memtable/src/mem.rs +344 -0
- data/vendor/memtable/src/tests.rs +1061 -0
- data/vendor/pager/Cargo.toml +23 -0
- data/vendor/pager/LICENSE +21 -0
- data/vendor/pager/README.md +5 -0
- data/vendor/pager/src/alloc.rs +1008 -0
- data/vendor/pager/src/lib.rs +1710 -0
- data/vendor/pigeonhole/Cargo.toml +42 -0
- data/vendor/pigeonhole/LICENSE +21 -0
- data/vendor/pigeonhole/README.md +99 -0
- data/vendor/pigeonhole/src/cell.rs +829 -0
- data/vendor/pigeonhole/src/check.rs +368 -0
- data/vendor/pigeonhole/src/db.rs +2324 -0
- data/vendor/pigeonhole/src/doc_support.rs +89 -0
- data/vendor/pigeonhole/src/error.rs +257 -0
- data/vendor/pigeonhole/src/feed.rs +696 -0
- data/vendor/pigeonhole/src/info.rs +425 -0
- data/vendor/pigeonhole/src/lib.rs +202 -0
- data/vendor/pigeonhole/src/merge.rs +135 -0
- data/vendor/pigeonhole/src/metrics.rs +476 -0
- data/vendor/pigeonhole/src/nonblocking.rs +666 -0
- data/vendor/pigeonhole/src/options.rs +2075 -0
- data/vendor/pigeonhole/src/read/budget.rs +584 -0
- data/vendor/pigeonhole/src/read.rs +2463 -0
- data/vendor/pigeonhole/src/recovery.rs +876 -0
- data/vendor/pigeonhole/src/retry.rs +358 -0
- data/vendor/pigeonhole/src/set.rs +103 -0
- data/vendor/pigeonhole/src/table.rs +861 -0
- data/vendor/pigeonhole/src/vector.rs +351 -0
- data/vendor/pigeonhole/src/write.rs +2815 -0
- data/vendor/runtime/Cargo.toml +21 -0
- data/vendor/runtime/LICENSE +21 -0
- data/vendor/runtime/README.md +5 -0
- data/vendor/runtime/src/completion.rs +629 -0
- data/vendor/runtime/src/drivers.rs +1175 -0
- data/vendor/runtime/src/lib.rs +1546 -0
- data/vendor/runtime/src/pool.rs +992 -0
- data/vendor/runtime/src/sched.rs +809 -0
- data/vendor/runtime/src/signal.rs +532 -0
- data/vendor/runtime/src/submit_gate.rs +144 -0
- data/vendor/shm/Cargo.toml +24 -0
- data/vendor/shm/LICENSE +21 -0
- data/vendor/shm/README.md +5 -0
- data/vendor/shm/src/lib.rs +427 -0
- data/vendor/shm/src/lock.rs +153 -0
- data/vendor/shm/src/region.rs +1609 -0
- data/vendor/sst/Cargo.toml +26 -0
- data/vendor/sst/LICENSE +21 -0
- data/vendor/sst/README.md +5 -0
- data/vendor/sst/src/blob.rs +380 -0
- data/vendor/sst/src/iter.rs +803 -0
- data/vendor/sst/src/lib.rs +695 -0
- data/vendor/sst/src/reader.rs +814 -0
- data/vendor/sst/src/writer.rs +596 -0
- data/vendor/text/Cargo.toml +26 -0
- data/vendor/text/LICENSE +21 -0
- data/vendor/text/README.md +9 -0
- data/vendor/text/src/error.rs +108 -0
- data/vendor/text/src/fuzzy.rs +265 -0
- data/vendor/text/src/highlight.rs +236 -0
- data/vendor/text/src/index.rs +1152 -0
- data/vendor/text/src/layout.rs +424 -0
- data/vendor/text/src/lib.rs +75 -0
- data/vendor/text/src/maxscore.rs +658 -0
- data/vendor/text/src/query.rs +450 -0
- data/vendor/text/src/search.rs +569 -0
- data/vendor/text/src/sloppy.rs +460 -0
- data/vendor/text/src/tokenizer.rs +163 -0
- data/vendor/vector/Cargo.toml +28 -0
- data/vendor/vector/LICENSE +21 -0
- data/vendor/vector/README.md +9 -0
- data/vendor/vector/src/error.rs +63 -0
- data/vendor/vector/src/half.rs +167 -0
- data/vendor/vector/src/hooks.rs +135 -0
- data/vendor/vector/src/index.rs +2690 -0
- data/vendor/vector/src/layout.rs +102 -0
- data/vendor/vector/src/lib.rs +52 -0
- data/vendor/vector/src/point.rs +500 -0
- data/vendor/vector/src/rebalancer.rs +200 -0
- data/vendor/vector/src/registry.rs +81 -0
- data/vendor/wal/Cargo.toml +25 -0
- data/vendor/wal/LICENSE +21 -0
- data/vendor/wal/README.md +5 -0
- data/vendor/wal/src/feed.rs +610 -0
- data/vendor/wal/src/foreground.rs +122 -0
- data/vendor/wal/src/lib.rs +458 -0
- data/vendor/wal/src/mem.rs +166 -0
- data/vendor/wal/src/recovery.rs +426 -0
- data/vendor/wal/src/stream.rs +2382 -0
- metadata +1310 -0
|
@@ -0,0 +1,1658 @@
|
|
|
1
|
+
//! Offset-linked single-writer multi-reader skiplist memtable for Pigeonhole.
|
|
2
|
+
//!
|
|
3
|
+
//! One memtable per `(tablet, family)`, written only by the owning shard thread and read
|
|
4
|
+
//! concurrently by any thread, and by reader processes. Nodes live in the shard's arena (a
|
|
5
|
+
//! part of the shared-memory region) and link by `u32` offsets relative to the arena base,
|
|
6
|
+
//! never by pointer, so any process that maps the region can traverse them. The writer
|
|
7
|
+
//! publishes each node with a release store; readers load with acquire.
|
|
8
|
+
//!
|
|
9
|
+
//! Keys are complete internal keys from `pigeonhole_format::key` and values are stored
|
|
10
|
+
//! values, so comparison is `memcmp` and flushing is a copy. The node and header layout is in
|
|
11
|
+
//! `FORMAT.md` §11.6.
|
|
12
|
+
//!
|
|
13
|
+
//! Until `shm` lands (and in unit tests) use [`ArenaRegion::heap`] as the arena.
|
|
14
|
+
//!
|
|
15
|
+
//! ```
|
|
16
|
+
//! use pigeonhole_format::{Cursor, Kind, encode_key};
|
|
17
|
+
//! use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
18
|
+
//!
|
|
19
|
+
//! let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
20
|
+
//! let mut memtable = Memtable::create(&mut arena)?;
|
|
21
|
+
//!
|
|
22
|
+
//! let mut key = Vec::new();
|
|
23
|
+
//! encode_key(&mut key, b"row", b"qual", 10, 1, Kind::Put).unwrap();
|
|
24
|
+
//! memtable.insert(&mut arena, &key, b"\x00hello")?;
|
|
25
|
+
//!
|
|
26
|
+
//! let reader = memtable.reader(); // usable from any thread
|
|
27
|
+
//! let mut it = reader.iter();
|
|
28
|
+
//! it.seek_to_first()?;
|
|
29
|
+
//! assert!(it.valid());
|
|
30
|
+
//! assert_eq!(it.key(), &key[..]);
|
|
31
|
+
//! assert_eq!(it.value(), b"\x00hello");
|
|
32
|
+
//! # Ok::<(), pigeonhole_memtable::Error>(())
|
|
33
|
+
//! ```
|
|
34
|
+
//!
|
|
35
|
+
//! # Memory ordering
|
|
36
|
+
//!
|
|
37
|
+
//! The writer fully writes a node (header, tower, key, value) with plain stores, then links
|
|
38
|
+
//! it bottom-up with a release store into each predecessor's `next[i]`, and finally bumps the
|
|
39
|
+
//! header's `count` with a release store. A reader acquires `next[i]` (or `count`) and may
|
|
40
|
+
//! then read the node's bytes plainly: they are immutable until the memtable is retired and
|
|
41
|
+
//! its chunks reclaimed, which the engine does only once no view that lists the memtable is
|
|
42
|
+
//! pinned anywhere. The same discipline holds across processes, since a mapping of the
|
|
43
|
+
//! region is ordinary memory.
|
|
44
|
+
//!
|
|
45
|
+
//! # Reclamation
|
|
46
|
+
//!
|
|
47
|
+
//! A retired memtable's chunks go back to the arena through [`ShardArena::reclaim`], which
|
|
48
|
+
//! is safe to call at any time: reuse is deferred while any handle of that memtable created
|
|
49
|
+
//! in this process (a [`MemtableReader`], [`MemIter`] or [`ArenaSlice`], from
|
|
50
|
+
//! [`Memtable::reader`] or [`MemtableReader::open`]) is alive, so a `&[u8]` borrowed from
|
|
51
|
+
//! the arena can never be overwritten. Reader *processes* are protected by the shared-memory
|
|
52
|
+
//! protocol instead: the engine calls `reclaim` only after no reader slot pins a view that
|
|
53
|
+
//! lists the memtable. A reader process that nevertheless reads reused memory sees garbage
|
|
54
|
+
//! but never faults: every node a cursor reaches is bounds-checked, a link above a node's
|
|
55
|
+
//! height is rejected, and a traversal longer than the entry count is reported as a cycle,
|
|
56
|
+
//! all as [`Error::Corrupt`].
|
|
57
|
+
//!
|
|
58
|
+
//! Part of [Pigeonhole](https://github.com/CodingAnarchy/pigeonhole). See the crate README.
|
|
59
|
+
// `unsafe` is permitted in this crate; every block carries a `// SAFETY:` argument.
|
|
60
|
+
#![deny(unsafe_op_in_unsafe_fn)]
|
|
61
|
+
|
|
62
|
+
// Arena integers are native-endian in memory while FORMAT.md §11.6 fixes them as
|
|
63
|
+
// little-endian; refuse to build where the two differ (decision D56).
|
|
64
|
+
#[cfg(not(target_endian = "little"))]
|
|
65
|
+
compile_error!("pigeonhole-memtable supports little-endian targets only (FORMAT.md §11.6)");
|
|
66
|
+
|
|
67
|
+
use std::cmp::Ordering as Cmp;
|
|
68
|
+
use std::collections::HashMap;
|
|
69
|
+
use std::fmt;
|
|
70
|
+
use std::sync::{Arc, Mutex, Weak};
|
|
71
|
+
|
|
72
|
+
#[cfg(loom)]
|
|
73
|
+
use loom::sync::atomic::AtomicBool;
|
|
74
|
+
#[cfg(not(loom))]
|
|
75
|
+
use std::sync::atomic::AtomicBool;
|
|
76
|
+
|
|
77
|
+
use pigeonhole_format::key::split_suffix;
|
|
78
|
+
use pigeonhole_format::shm::memtable as layout;
|
|
79
|
+
use pigeonhole_format::version::MEMTABLE_MAGIC;
|
|
80
|
+
use pigeonhole_format::{Cursor, Seqno};
|
|
81
|
+
use pigeonhole_io::SharedRegion;
|
|
82
|
+
|
|
83
|
+
mod mem;
|
|
84
|
+
|
|
85
|
+
use mem::{Mem, Ordering};
|
|
86
|
+
use pigeonhole_format::key::SUFFIX_LEN;
|
|
87
|
+
|
|
88
|
+
#[cfg(all(test, loom))]
|
|
89
|
+
mod loom_tests;
|
|
90
|
+
#[cfg(all(test, not(loom)))]
|
|
91
|
+
mod tests;
|
|
92
|
+
|
|
93
|
+
/// Result alias for this crate.
|
|
94
|
+
pub type Result<T, E = Error> = std::result::Result<T, E>;
|
|
95
|
+
|
|
96
|
+
/// Memtable errors.
|
|
97
|
+
///
|
|
98
|
+
/// ```
|
|
99
|
+
/// use pigeonhole_memtable::Error;
|
|
100
|
+
///
|
|
101
|
+
/// assert_eq!(Error::ArenaFull.to_string(), "shard arena is full");
|
|
102
|
+
/// assert_eq!(
|
|
103
|
+
/// Error::Corrupt("node height").to_string(),
|
|
104
|
+
/// "corrupt memtable: node height"
|
|
105
|
+
/// );
|
|
106
|
+
/// ```
|
|
107
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
108
|
+
#[non_exhaustive]
|
|
109
|
+
pub enum Error {
|
|
110
|
+
/// The shard arena has no chunk left: the engine must flush or stall writes.
|
|
111
|
+
ArenaFull,
|
|
112
|
+
/// One entry is larger than the arena could ever hold.
|
|
113
|
+
EntryTooLarge,
|
|
114
|
+
/// A reader found an offset or length outside the arena, or a bad header (possible
|
|
115
|
+
/// only with a buggy or crashed writer; checked so a reader never faults).
|
|
116
|
+
Corrupt(&'static str),
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
impl fmt::Display for Error {
|
|
120
|
+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
121
|
+
match self {
|
|
122
|
+
Error::ArenaFull => f.write_str("shard arena is full"),
|
|
123
|
+
Error::EntryTooLarge => f.write_str("entry is larger than the arena can hold"),
|
|
124
|
+
Error::Corrupt(what) => write!(f, "corrupt memtable: {what}"),
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
impl std::error::Error for Error {}
|
|
130
|
+
|
|
131
|
+
/// Maximum skiplist height (the head node's height).
|
|
132
|
+
const MAX_HEIGHT: usize = layout::MAX_HEIGHT;
|
|
133
|
+
|
|
134
|
+
/// Levels a cursor records for its forward seeks' finger search: with towers growing by 4
|
|
135
|
+
/// per level, the lowest 4 reach about 64 entries ahead (a row's columns and versions, the
|
|
136
|
+
/// forward seeks a read makes); a forward seek farther than that searches from the top. Few
|
|
137
|
+
/// levels keep the cursor small: it is built and moved for every read.
|
|
138
|
+
const FINGER_LEVELS: usize = 4;
|
|
139
|
+
|
|
140
|
+
/// A walk's step count, against a budget that catches a link cycle.
|
|
141
|
+
#[derive(Debug, Default)]
|
|
142
|
+
struct Walk {
|
|
143
|
+
steps: usize,
|
|
144
|
+
budget: usize,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
impl Walk {
|
|
148
|
+
/// Counts a step: [`Error::Corrupt`] once the walk has taken more steps than `reader`
|
|
149
|
+
/// has entries (plus [`STEP_SLACK`]). Entries may have been published since the last
|
|
150
|
+
/// check, so the count is re-read before deciding.
|
|
151
|
+
#[inline(always)]
|
|
152
|
+
fn step(&mut self, reader: &MemtableReader) -> Result<()> {
|
|
153
|
+
self.steps += 1;
|
|
154
|
+
if self.steps > self.budget {
|
|
155
|
+
self.budget = reader.len() + STEP_SLACK;
|
|
156
|
+
if self.steps > self.budget {
|
|
157
|
+
return Err(Error::Corrupt("link cycle"));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
Ok(())
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/// Bytes reserved at the start of every arena; offset `0` is null.
|
|
164
|
+
const RESERVED: usize = 64;
|
|
165
|
+
/// Length of the head node: a tower of [`MAX_HEIGHT`] links and no key or value.
|
|
166
|
+
const HEAD_LEN: usize = layout::N_TOWER + 4 * MAX_HEIGHT;
|
|
167
|
+
/// Offsets are `u32`, so an arena holds at most this many bytes.
|
|
168
|
+
const MAX_ARENA_LEN: usize = 1 << 32;
|
|
169
|
+
/// Header layout version written to every memtable header (2: nodes carry a stale-tail
|
|
170
|
+
/// offset, D277).
|
|
171
|
+
const HEADER_VERSION: u16 = 2;
|
|
172
|
+
/// Header flag bit: frozen.
|
|
173
|
+
const FLAG_FROZEN: u8 = 1;
|
|
174
|
+
/// Header flag bit: the writer records stale tails in this memtable's nodes (D194, D277), so
|
|
175
|
+
/// a reader's [`Cursor::skip_column`] can jump.
|
|
176
|
+
const FLAG_TAILS: u8 = 2;
|
|
177
|
+
/// The null offset.
|
|
178
|
+
const NULL: u32 = 0;
|
|
179
|
+
/// Extra traversal steps allowed beyond the entry count before a walk is called a cycle
|
|
180
|
+
/// (one level stop per level, plus nodes linked but not yet counted).
|
|
181
|
+
const STEP_SLACK: usize = MAX_HEIGHT + 16;
|
|
182
|
+
|
|
183
|
+
/// One strong reference per live in-process handle of a memtable (the writer, each reader,
|
|
184
|
+
/// cursor and slice, and the `Retired` token). `ShardArena::reclaim` reuses the chunks only
|
|
185
|
+
/// once the token holds the last reference.
|
|
186
|
+
///
|
|
187
|
+
/// Also carries the writer's process-local knowledge of the memtable (ICR 0020): whether a
|
|
188
|
+
/// delete marker was ever inserted. A pin a reader process makes for a root it found in a
|
|
189
|
+
/// view has no writer behind it, so it answers "maybe" ([`MemtableReader::may_have_markers`]).
|
|
190
|
+
#[derive(Debug)]
|
|
191
|
+
struct Pin {
|
|
192
|
+
/// Made by this memtable's writer (`Memtable::create`), so `markers` is kept.
|
|
193
|
+
writer: bool,
|
|
194
|
+
/// A delete marker was inserted (set before the marker is linked, Release).
|
|
195
|
+
markers: AtomicBool,
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
impl Pin {
|
|
199
|
+
fn writer() -> Self {
|
|
200
|
+
Self {
|
|
201
|
+
writer: true,
|
|
202
|
+
markers: AtomicBool::new(false),
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
fn foreign() -> Self {
|
|
207
|
+
Self {
|
|
208
|
+
writer: false,
|
|
209
|
+
markers: AtomicBool::new(true),
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/// Shared by every clone of an [`ArenaRegion`]: the pins of the memtables this process
|
|
215
|
+
/// created, by root, so a reader opened by root in the writer process pins the same memtable.
|
|
216
|
+
#[derive(Debug, Default)]
|
|
217
|
+
struct Registry {
|
|
218
|
+
pins: Mutex<HashMap<u32, Weak<Pin>>>,
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
impl Registry {
|
|
222
|
+
fn lock(&self) -> std::sync::MutexGuard<'_, HashMap<u32, Weak<Pin>>> {
|
|
223
|
+
self.pins.lock().unwrap_or_else(|e| e.into_inner())
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
fn register(&self, root: u32, pin: &Arc<Pin>) {
|
|
227
|
+
self.lock().insert(root, Arc::downgrade(pin));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/// The pin of the memtable at `root` if it was created in this process, else a fresh one
|
|
231
|
+
/// (a reader process: nothing reclaims there).
|
|
232
|
+
fn pin_for(&self, root: u32) -> Arc<Pin> {
|
|
233
|
+
self.lock()
|
|
234
|
+
.get(&root)
|
|
235
|
+
.and_then(Weak::upgrade)
|
|
236
|
+
.unwrap_or_else(|| Arc::new(Pin::foreign()))
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
fn forget(&self, root: u32, pin: &Arc<Pin>) {
|
|
240
|
+
let mut pins = self.lock();
|
|
241
|
+
if pins
|
|
242
|
+
.get(&root)
|
|
243
|
+
.is_some_and(|w| Weak::ptr_eq(w, &Arc::downgrade(pin)))
|
|
244
|
+
{
|
|
245
|
+
pins.remove(&root);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/// Offset of link `level` in the tower of the node at `node`.
|
|
251
|
+
#[inline]
|
|
252
|
+
fn tower(node: u32, level: usize) -> usize {
|
|
253
|
+
node as usize + layout::N_TOWER + 4 * level
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// A byte range of a [`SharedRegion`] holding one shard's arena. Cheap to clone; keeps the
|
|
257
|
+
/// mapping alive.
|
|
258
|
+
///
|
|
259
|
+
/// ```
|
|
260
|
+
/// use pigeonhole_io::SharedRegion;
|
|
261
|
+
/// use pigeonhole_memtable::ArenaRegion;
|
|
262
|
+
///
|
|
263
|
+
/// // The engine hands the memtable its shard's slice of the shared-memory region.
|
|
264
|
+
/// let region = SharedRegion::heap(4 << 20);
|
|
265
|
+
/// let arena = ArenaRegion::new(region, 2 << 20, 2 << 20).unwrap();
|
|
266
|
+
/// assert_eq!(arena.len(), 2 << 20);
|
|
267
|
+
///
|
|
268
|
+
/// // Tests and the engine before `shm` lands use a private heap arena.
|
|
269
|
+
/// let mock = ArenaRegion::heap(1 << 20);
|
|
270
|
+
/// assert!(!mock.is_empty());
|
|
271
|
+
/// ```
|
|
272
|
+
#[derive(Debug, Clone)]
|
|
273
|
+
pub struct ArenaRegion {
|
|
274
|
+
mem: Mem,
|
|
275
|
+
registry: Arc<Registry>,
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
impl ArenaRegion {
|
|
279
|
+
/// A private heap-backed arena of `len` bytes (the mock until `shm` lands).
|
|
280
|
+
pub fn heap(len: usize) -> Self {
|
|
281
|
+
assert!(len <= MAX_ARENA_LEN, "arena longer than 4 GiB");
|
|
282
|
+
Self {
|
|
283
|
+
mem: Mem::heap(len),
|
|
284
|
+
registry: Arc::default(),
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/// `[offset, offset + len)` of `region`. `offset` must be 64-byte aligned and `len` at
|
|
289
|
+
/// most 4 GiB (offsets are `u32`).
|
|
290
|
+
///
|
|
291
|
+
/// # Errors
|
|
292
|
+
/// [`Error::Corrupt`] if the range is misaligned, too long or outside the region.
|
|
293
|
+
#[cfg(not(loom))]
|
|
294
|
+
pub fn new(region: SharedRegion, offset: usize, len: usize) -> Result<Self> {
|
|
295
|
+
if !offset.is_multiple_of(64) {
|
|
296
|
+
return Err(Error::Corrupt("arena offset is not 64-byte aligned"));
|
|
297
|
+
}
|
|
298
|
+
if len > MAX_ARENA_LEN {
|
|
299
|
+
return Err(Error::Corrupt("arena longer than 4 GiB"));
|
|
300
|
+
}
|
|
301
|
+
if !offset
|
|
302
|
+
.checked_add(len)
|
|
303
|
+
.is_some_and(|end| end <= region.len())
|
|
304
|
+
{
|
|
305
|
+
return Err(Error::Corrupt("arena extends past its region"));
|
|
306
|
+
}
|
|
307
|
+
Ok(Self {
|
|
308
|
+
mem: Mem::new(region, offset, len),
|
|
309
|
+
registry: Arc::default(),
|
|
310
|
+
})
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/// Shared regions are not modeled under loom; only [`ArenaRegion::heap`] works there.
|
|
314
|
+
#[cfg(loom)]
|
|
315
|
+
pub fn new(region: SharedRegion, offset: usize, len: usize) -> Result<Self> {
|
|
316
|
+
let _ = (region, offset, len);
|
|
317
|
+
Err(Error::Corrupt("shared regions are not modeled under loom"))
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/// Length in bytes.
|
|
321
|
+
pub fn len(&self) -> usize {
|
|
322
|
+
self.mem.len()
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/// Whether the arena is empty.
|
|
326
|
+
pub fn is_empty(&self) -> bool {
|
|
327
|
+
self.mem.len() == 0
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/// Whether `other` is a clone of this arena (the same mapping and pin registry).
|
|
331
|
+
fn is_same(&self, other: &ArenaRegion) -> bool {
|
|
332
|
+
Arc::ptr_eq(&self.registry, &other.registry)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/// A contiguous run of chunks: `[first, first + count)` chunk indices.
|
|
337
|
+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
338
|
+
struct Run {
|
|
339
|
+
first: u32,
|
|
340
|
+
count: u32,
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/// The writer-side chunk allocator over one shard's arena. Owned by the shard thread; its
|
|
344
|
+
/// free list is private memory (a restarted writer rebuilds the region anyway).
|
|
345
|
+
///
|
|
346
|
+
/// ```
|
|
347
|
+
/// use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
348
|
+
///
|
|
349
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), ShardArena::DEFAULT_CHUNK);
|
|
350
|
+
/// assert_eq!(arena.free_bytes(), 1 << 20);
|
|
351
|
+
///
|
|
352
|
+
/// let memtable = Memtable::create(&mut arena)?;
|
|
353
|
+
/// assert_eq!(arena.free_bytes(), (1 << 20) - ShardArena::DEFAULT_CHUNK);
|
|
354
|
+
///
|
|
355
|
+
/// // After its flush is in the manifest and no view pins it, its chunks come back.
|
|
356
|
+
/// arena.reclaim(memtable.retire());
|
|
357
|
+
/// assert_eq!(arena.free_bytes(), 1 << 20);
|
|
358
|
+
///
|
|
359
|
+
/// // Reuse waits for in-process readers: a cursor keeps the chunks it borrows from.
|
|
360
|
+
/// let mut memtable = Memtable::create(&mut arena)?;
|
|
361
|
+
/// let reader = memtable.reader();
|
|
362
|
+
/// arena.reclaim(memtable.retire());
|
|
363
|
+
/// assert_eq!(arena.free_bytes(), (1 << 20) - ShardArena::DEFAULT_CHUNK);
|
|
364
|
+
/// drop(reader);
|
|
365
|
+
/// let next = Memtable::create(&mut arena)?; // the deferred chunk is free again
|
|
366
|
+
/// assert_eq!(next.root(), 64);
|
|
367
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
368
|
+
/// ```
|
|
369
|
+
#[derive(Debug)]
|
|
370
|
+
pub struct ShardArena {
|
|
371
|
+
region: ArenaRegion,
|
|
372
|
+
chunk_size: usize,
|
|
373
|
+
/// `true` for each free chunk.
|
|
374
|
+
free: Vec<bool>,
|
|
375
|
+
free_count: usize,
|
|
376
|
+
/// Retired memtables whose chunks some in-process handle still borrows.
|
|
377
|
+
deferred: Vec<Retired>,
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
impl ShardArena {
|
|
381
|
+
/// Default chunk size (256 KiB).
|
|
382
|
+
pub const DEFAULT_CHUNK: usize = 256 * 1024;
|
|
383
|
+
|
|
384
|
+
/// Smallest chunk size accepted.
|
|
385
|
+
const MIN_CHUNK: usize = 1024;
|
|
386
|
+
|
|
387
|
+
/// An allocator handing out `chunk_size` chunks of `region`. Entries larger than a chunk
|
|
388
|
+
/// take a contiguous run of chunks.
|
|
389
|
+
///
|
|
390
|
+
/// # Panics
|
|
391
|
+
/// If `chunk_size` is below 1 KiB or not a multiple of 64.
|
|
392
|
+
pub fn new(region: ArenaRegion, chunk_size: usize) -> Self {
|
|
393
|
+
assert!(
|
|
394
|
+
chunk_size >= Self::MIN_CHUNK && chunk_size.is_multiple_of(64),
|
|
395
|
+
"chunk size must be a multiple of 64 and at least 1 KiB"
|
|
396
|
+
);
|
|
397
|
+
let chunks = region.len() / chunk_size;
|
|
398
|
+
Self {
|
|
399
|
+
region,
|
|
400
|
+
chunk_size,
|
|
401
|
+
free: vec![true; chunks],
|
|
402
|
+
free_count: chunks,
|
|
403
|
+
deferred: Vec::new(),
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/// The region (for building readers).
|
|
408
|
+
pub fn region(&self) -> &ArenaRegion {
|
|
409
|
+
&self.region
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/// Bytes not allocated to any memtable. Chunks of a retired memtable count once no
|
|
413
|
+
/// in-process handle of it is left (see [`ShardArena::reclaim`]).
|
|
414
|
+
pub fn free_bytes(&self) -> usize {
|
|
415
|
+
self.free_count * self.chunk_size
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/// Usable bytes of the largest run of contiguous free chunks: the largest entry an
|
|
419
|
+
/// allocation can place now. An entry larger than a chunk needs one such run, so free
|
|
420
|
+
/// bytes elsewhere do not help it.
|
|
421
|
+
pub fn largest_free_run(&self) -> usize {
|
|
422
|
+
let mut best = 0;
|
|
423
|
+
self.free_runs_each(|first, count| best = best.max(self.usable(first, count)));
|
|
424
|
+
best
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/// How many blocks of `chunks` contiguous free chunks the free runs are sure to hold
|
|
428
|
+
/// after any `removed` chunks are allocated: `Σ ⌊run / chunks⌋` minus the most blocks
|
|
429
|
+
/// that many chunks could break.
|
|
430
|
+
///
|
|
431
|
+
/// Every allocation takes its chunks from the start of a free run (the first one long
|
|
432
|
+
/// enough). Taking chunks from a run's start breaks its first block only once its spare
|
|
433
|
+
/// chunks (`run mod chunks`) are gone, and each further block costs `chunks` more, so
|
|
434
|
+
/// the most blocks `removed` chunks can break is found by spending them on the cheapest
|
|
435
|
+
/// breaks first. While at least one block is left, an allocation of up to `chunks`
|
|
436
|
+
/// chunks finds a run (issue #141).
|
|
437
|
+
pub fn blocks_left(&self, chunks: usize, removed: usize) -> usize {
|
|
438
|
+
let chunks = chunks.max(1);
|
|
439
|
+
let mut blocks = 0;
|
|
440
|
+
// The cost of breaking each run's first block; later ones cost `chunks` each.
|
|
441
|
+
let mut first_costs = Vec::new();
|
|
442
|
+
self.free_runs_each(|_, count| {
|
|
443
|
+
if count >= chunks {
|
|
444
|
+
blocks += count / chunks;
|
|
445
|
+
first_costs.push(count % chunks + 1);
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
first_costs.sort_unstable();
|
|
449
|
+
let (mut budget, mut broken) = (removed, 0);
|
|
450
|
+
for cost in first_costs {
|
|
451
|
+
if cost > budget {
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
budget -= cost;
|
|
455
|
+
broken += 1;
|
|
456
|
+
}
|
|
457
|
+
broken += budget / chunks;
|
|
458
|
+
blocks.saturating_sub(broken)
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/// [`blocks_left`](Self::blocks_left) as if every chunk were free: whether a batch could
|
|
462
|
+
/// ever find its run, judged on an empty arena (one run of all its chunks). A commit
|
|
463
|
+
/// for which this is 0 can never be admitted, so it fails at once rather than waiting
|
|
464
|
+
/// for room that freeing everything still wouldn't give (#1403).
|
|
465
|
+
pub fn blocks_left_when_empty(&self, chunks: usize, removed: usize) -> usize {
|
|
466
|
+
let chunks = chunks.max(1);
|
|
467
|
+
let n = self.free.len();
|
|
468
|
+
if n < chunks {
|
|
469
|
+
return 0;
|
|
470
|
+
}
|
|
471
|
+
let blocks = n / chunks;
|
|
472
|
+
let first_cost = n % chunks + 1;
|
|
473
|
+
if removed < first_cost {
|
|
474
|
+
return blocks;
|
|
475
|
+
}
|
|
476
|
+
blocks.saturating_sub(1 + (removed - first_cost) / chunks)
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/// Calls `f(first, count)` for each run of free chunks.
|
|
480
|
+
fn free_runs_each(&self, mut f: impl FnMut(usize, usize)) {
|
|
481
|
+
let n = self.free.len();
|
|
482
|
+
let mut first = 0;
|
|
483
|
+
while first < n {
|
|
484
|
+
if !self.free[first] {
|
|
485
|
+
first += 1;
|
|
486
|
+
continue;
|
|
487
|
+
}
|
|
488
|
+
let mut count = 1;
|
|
489
|
+
while first + count < n && self.free[first + count] {
|
|
490
|
+
count += 1;
|
|
491
|
+
}
|
|
492
|
+
f(first, count);
|
|
493
|
+
first += count;
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/// Returns a retired memtable's chunks to the free list. Call only once no reader slot
|
|
498
|
+
/// pins a view that lists it (reader processes have no other protection). Handles in
|
|
499
|
+
/// this process need no care: while any [`MemtableReader`], [`MemIter`] or
|
|
500
|
+
/// [`ArenaSlice`] of the memtable is alive, its chunks stay out of use and become free
|
|
501
|
+
/// on a later `reclaim` or allocation, after the last handle is dropped.
|
|
502
|
+
///
|
|
503
|
+
/// # Panics
|
|
504
|
+
/// If a chunk is already free (a double reclaim, or a token from another arena).
|
|
505
|
+
pub fn reclaim(&mut self, retired: Retired) {
|
|
506
|
+
self.deferred.push(retired);
|
|
507
|
+
self.release_unreferenced();
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/// Frees every deferred memtable whose token holds the last in-process reference.
|
|
511
|
+
fn release_unreferenced(&mut self) {
|
|
512
|
+
let mut i = 0;
|
|
513
|
+
while i < self.deferred.len() {
|
|
514
|
+
if Arc::strong_count(&self.deferred[i].pin) == 1 {
|
|
515
|
+
// Pairs with the release decrement of the last handle's drop, so its reads
|
|
516
|
+
// of the chunks happen before the writer reuses them.
|
|
517
|
+
mem::acquire_fence();
|
|
518
|
+
let retired = self.deferred.swap_remove(i);
|
|
519
|
+
self.free_runs(&retired);
|
|
520
|
+
} else {
|
|
521
|
+
i += 1;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
fn free_runs(&mut self, retired: &Retired) {
|
|
527
|
+
for run in &retired.runs {
|
|
528
|
+
for c in run.first..run.first + run.count {
|
|
529
|
+
let slot = &mut self.free[c as usize];
|
|
530
|
+
assert!(!*slot, "chunk {c} reclaimed twice");
|
|
531
|
+
*slot = true;
|
|
532
|
+
self.free_count += 1;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
self.region.registry.forget(retired.root, &retired.pin);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/// Usable bytes of a run of `count` chunks starting at chunk `first` (the arena's first
|
|
539
|
+
/// 64 bytes are reserved).
|
|
540
|
+
fn usable(&self, first: usize, count: usize) -> usize {
|
|
541
|
+
let bytes = count * self.chunk_size;
|
|
542
|
+
if first == 0 { bytes - RESERVED } else { bytes }
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/// Allocates the lowest run of chunks with at least `bytes` usable bytes.
|
|
546
|
+
fn allocate(&mut self, bytes: usize) -> Result<Run> {
|
|
547
|
+
self.release_unreferenced();
|
|
548
|
+
let n = self.free.len();
|
|
549
|
+
if n == 0 || bytes > self.usable(0, n) {
|
|
550
|
+
return Err(Error::EntryTooLarge);
|
|
551
|
+
}
|
|
552
|
+
let mut first = 0;
|
|
553
|
+
while first < n {
|
|
554
|
+
if !self.free[first] {
|
|
555
|
+
first += 1;
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
let mut count = 1;
|
|
559
|
+
while self.usable(first, count) < bytes && first + count < n && self.free[first + count]
|
|
560
|
+
{
|
|
561
|
+
count += 1;
|
|
562
|
+
}
|
|
563
|
+
if self.usable(first, count) >= bytes {
|
|
564
|
+
for c in first..first + count {
|
|
565
|
+
self.free[c] = false;
|
|
566
|
+
}
|
|
567
|
+
self.free_count -= count;
|
|
568
|
+
return Ok(Run {
|
|
569
|
+
first: first as u32,
|
|
570
|
+
count: count as u32,
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
first += count;
|
|
574
|
+
}
|
|
575
|
+
Err(Error::ArenaFull)
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
/// Byte range `[start, end)` of `run`, excluding the reserved prefix.
|
|
579
|
+
fn span(&self, run: Run) -> (usize, usize) {
|
|
580
|
+
let start = run.first as usize * self.chunk_size;
|
|
581
|
+
let end = start + run.count as usize * self.chunk_size;
|
|
582
|
+
(start.max(RESERVED), end)
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
/// The writer's handle to one memtable.
|
|
587
|
+
///
|
|
588
|
+
/// ```
|
|
589
|
+
/// use pigeonhole_format::{Kind, encode_key};
|
|
590
|
+
/// use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
591
|
+
///
|
|
592
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
593
|
+
/// let mut memtable = Memtable::create(&mut arena)?;
|
|
594
|
+
///
|
|
595
|
+
/// let mut key = Vec::new();
|
|
596
|
+
/// for seqno in 1..=3 {
|
|
597
|
+
/// key.clear();
|
|
598
|
+
/// encode_key(&mut key, b"row", b"q", 100 + seqno, seqno, Kind::Put).unwrap();
|
|
599
|
+
/// memtable.insert(&mut arena, &key, b"\x00v")?;
|
|
600
|
+
/// }
|
|
601
|
+
/// assert_eq!(memtable.len(), 3);
|
|
602
|
+
/// assert_eq!(memtable.seqno_range(), Some((1, 3)));
|
|
603
|
+
/// assert_eq!(memtable.allocated_bytes(), 64 * 1024); // one chunk so far
|
|
604
|
+
///
|
|
605
|
+
/// memtable.freeze();
|
|
606
|
+
/// assert!(memtable.is_frozen());
|
|
607
|
+
/// let root = memtable.root(); // goes into the published view
|
|
608
|
+
/// let retired = memtable.retire(); // once its SST is in the manifest
|
|
609
|
+
/// arena.reclaim(retired); // once no view listing `root` is pinned
|
|
610
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
611
|
+
/// ```
|
|
612
|
+
#[derive(Debug)]
|
|
613
|
+
pub struct Memtable {
|
|
614
|
+
region: ArenaRegion,
|
|
615
|
+
root: u32,
|
|
616
|
+
head: u32,
|
|
617
|
+
/// Chunk runs owned, in allocation order.
|
|
618
|
+
runs: Vec<Run>,
|
|
619
|
+
/// Next free byte of the current run and its end.
|
|
620
|
+
bump: usize,
|
|
621
|
+
limit: usize,
|
|
622
|
+
count: u32,
|
|
623
|
+
/// Node and header bytes used (the header's `bytes` field).
|
|
624
|
+
used: u64,
|
|
625
|
+
/// Bytes of chunks owned.
|
|
626
|
+
allocated: usize,
|
|
627
|
+
min_seqno: Seqno,
|
|
628
|
+
max_seqno: Seqno,
|
|
629
|
+
frozen: bool,
|
|
630
|
+
rng: u64,
|
|
631
|
+
/// The insert splice: per level, the node a key sorting right after the last one
|
|
632
|
+
/// inserted links behind. Below the last inserted node's height it is that node itself;
|
|
633
|
+
/// at and above it, the last node at that level that sorts before it (the head when
|
|
634
|
+
/// none does, and at every level before any insert). A key between the last node and its
|
|
635
|
+
/// level-0 successor has exactly these predecessors, so inserts in key order (a row's
|
|
636
|
+
/// cells, rising row keys) skip the search. Only this writer links nodes and none is
|
|
637
|
+
/// removed, so the splice stays exact.
|
|
638
|
+
splice: [u32; MAX_HEIGHT],
|
|
639
|
+
pin: Arc<Pin>,
|
|
640
|
+
/// The writer records stale tails (D194, D277): set by [`Memtable::with_tail_index`].
|
|
641
|
+
tails: bool,
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
impl Memtable {
|
|
645
|
+
/// Creates an empty memtable in `arena`.
|
|
646
|
+
///
|
|
647
|
+
/// # Errors
|
|
648
|
+
/// [`Error::ArenaFull`] if no chunk is free.
|
|
649
|
+
pub fn create(arena: &mut ShardArena) -> Result<Memtable> {
|
|
650
|
+
let run = arena.allocate(layout::HEADER_LEN + HEAD_LEN)?;
|
|
651
|
+
let (start, end) = arena.span(run);
|
|
652
|
+
let region = arena.region.clone();
|
|
653
|
+
let mem = ®ion.mem;
|
|
654
|
+
let root = start;
|
|
655
|
+
let head = root + layout::HEADER_LEN;
|
|
656
|
+
debug_assert!(root.is_multiple_of(64));
|
|
657
|
+
|
|
658
|
+
// Header. Plain writes: the root is not published until this returns.
|
|
659
|
+
mem.write_u32(root + layout::H_MAGIC, MEMTABLE_MAGIC);
|
|
660
|
+
let [v0, v1] = HEADER_VERSION.to_le_bytes();
|
|
661
|
+
mem.write(root + layout::H_VERSION, &[v0, v1, 0, 0]);
|
|
662
|
+
mem.write_u32(root + layout::H_HEAD, head as u32);
|
|
663
|
+
mem.store_u32(root + layout::H_COUNT, 0, Ordering::Relaxed);
|
|
664
|
+
let used = (layout::HEADER_LEN + HEAD_LEN) as u64;
|
|
665
|
+
mem.store_u64(root + layout::H_BYTES, used, Ordering::Relaxed);
|
|
666
|
+
mem.store_u64(root + layout::H_MAX_SEQNO, 0, Ordering::Relaxed);
|
|
667
|
+
mem.store_u64(root + layout::H_MIN_SEQNO, 0, Ordering::Relaxed);
|
|
668
|
+
mem.write(
|
|
669
|
+
root + layout::H_MIN_SEQNO + 8,
|
|
670
|
+
&[0; layout::HEADER_LEN - 40],
|
|
671
|
+
);
|
|
672
|
+
|
|
673
|
+
// Head node: no key or value, a tower of null links (the chunk may be reused memory).
|
|
674
|
+
mem.write_u32(head + layout::N_KEY_LEN, 0);
|
|
675
|
+
mem.write_u32(head + layout::N_VALUE_LEN, 0);
|
|
676
|
+
mem.write(head + layout::N_HEIGHT, &[MAX_HEIGHT as u8, 0, 0, 0]);
|
|
677
|
+
mem.write_u32(head + layout::N_TAIL, NULL);
|
|
678
|
+
for level in 0..MAX_HEIGHT {
|
|
679
|
+
mem.write_u32(tower(head as u32, level), NULL);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
let pin = Arc::new(Pin::writer());
|
|
683
|
+
region.registry.register(root as u32, &pin);
|
|
684
|
+
Ok(Memtable {
|
|
685
|
+
region,
|
|
686
|
+
root: root as u32,
|
|
687
|
+
head: head as u32,
|
|
688
|
+
runs: vec![run],
|
|
689
|
+
bump: head + HEAD_LEN,
|
|
690
|
+
limit: end,
|
|
691
|
+
count: 0,
|
|
692
|
+
used,
|
|
693
|
+
allocated: run.count as usize * arena.chunk_size,
|
|
694
|
+
min_seqno: 0,
|
|
695
|
+
max_seqno: 0,
|
|
696
|
+
frozen: false,
|
|
697
|
+
rng: 0x9E37_79B9_7F4A_7C15 ^ (root as u64),
|
|
698
|
+
splice: [head as u32; MAX_HEIGHT],
|
|
699
|
+
pin,
|
|
700
|
+
tails: false,
|
|
701
|
+
})
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/// Records stale tails (D194, ICR 0013; in the node since D277): for each entry inserted
|
|
705
|
+
/// in front of an older entry of its column, a later entry of that column, so a reader
|
|
706
|
+
/// that has finished the column passes its superseded versions in one jump
|
|
707
|
+
/// ([`Cursor::skip_column`]). The tail is a field of the node in the arena (FORMAT
|
|
708
|
+
/// §11.6), so readers from [`Memtable::reader`] and from [`MemtableReader::open`] (other
|
|
709
|
+
/// processes) jump alike; the header's flag tells them the tails are recorded. Call
|
|
710
|
+
/// before the first insert.
|
|
711
|
+
///
|
|
712
|
+
/// ```
|
|
713
|
+
/// use pigeonhole_format::{Cursor, Kind, encode_key};
|
|
714
|
+
/// use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
715
|
+
///
|
|
716
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
717
|
+
/// let mut m = Memtable::create(&mut arena)?.with_tail_index();
|
|
718
|
+
/// let key = |q: &[u8], ts| {
|
|
719
|
+
/// let mut k = Vec::new();
|
|
720
|
+
/// encode_key(&mut k, b"row", q, ts, ts, Kind::Put).unwrap();
|
|
721
|
+
/// k
|
|
722
|
+
/// };
|
|
723
|
+
/// for ts in 1..=5 {
|
|
724
|
+
/// m.insert(&mut arena, &key(b"a", ts), b"\x00v")?;
|
|
725
|
+
/// }
|
|
726
|
+
/// m.insert(&mut arena, &key(b"b", 1), b"\x00v")?;
|
|
727
|
+
/// let column = &key(b"a", 0)[..key(b"a", 0).len() - 17];
|
|
728
|
+
/// let mut it = m.reader().iter();
|
|
729
|
+
/// it.seek_to_first()?;
|
|
730
|
+
/// it.next()?; // on version 4 of `a`, after reading version 5
|
|
731
|
+
/// assert!(it.skip_column(column)?); // past versions 4..1 in one jump
|
|
732
|
+
/// assert_eq!(it.key(), &key(b"b", 1)[..]);
|
|
733
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
734
|
+
/// ```
|
|
735
|
+
///
|
|
736
|
+
/// # Panics
|
|
737
|
+
/// If the memtable already holds entries.
|
|
738
|
+
pub fn with_tail_index(mut self) -> Self {
|
|
739
|
+
assert_eq!(self.count, 0, "with_tail_index on a memtable with entries");
|
|
740
|
+
self.tails = true;
|
|
741
|
+
// Before the memtable is published (its root reaches a view only after this).
|
|
742
|
+
self.region.mem.fetch_or_u8(
|
|
743
|
+
self.root as usize + layout::H_FLAGS,
|
|
744
|
+
FLAG_TAILS,
|
|
745
|
+
Ordering::Release,
|
|
746
|
+
);
|
|
747
|
+
self
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
/// Inserts one entry. `key` is a full internal key (unique: it contains the seqno);
|
|
751
|
+
/// `value` is a stored value. Visible to readers when this returns.
|
|
752
|
+
///
|
|
753
|
+
/// A duplicate key is linked as another entry; readers see both, in unspecified order.
|
|
754
|
+
///
|
|
755
|
+
/// # Errors
|
|
756
|
+
/// [`Error::ArenaFull`] if the entry does not fit in the chunks left,
|
|
757
|
+
/// [`Error::EntryTooLarge`] if it could never fit, [`Error::Corrupt`] if `key` is shorter
|
|
758
|
+
/// than an internal key suffix.
|
|
759
|
+
///
|
|
760
|
+
/// # Panics
|
|
761
|
+
/// If the memtable is frozen, or `arena` is not the arena it was created in.
|
|
762
|
+
pub fn insert(&mut self, arena: &mut ShardArena, key: &[u8], value: &[u8]) -> Result<()> {
|
|
763
|
+
assert!(!self.frozen, "insert into a frozen memtable");
|
|
764
|
+
assert!(
|
|
765
|
+
self.region.is_same(&arena.region),
|
|
766
|
+
"memtable inserted through a different shard arena"
|
|
767
|
+
);
|
|
768
|
+
let (_, _, seqno, _) =
|
|
769
|
+
split_suffix(key).map_err(|_| Error::Corrupt("insert key is not an internal key"))?;
|
|
770
|
+
let key_len = u32::try_from(key.len()).map_err(|_| Error::EntryTooLarge)?;
|
|
771
|
+
let value_len = u32::try_from(value.len()).map_err(|_| Error::EntryTooLarge)?;
|
|
772
|
+
let height = self.random_height();
|
|
773
|
+
let node_len = (layout::N_TOWER + 4 * height)
|
|
774
|
+
.checked_add(key.len())
|
|
775
|
+
.and_then(|n| n.checked_add(value.len()))
|
|
776
|
+
.ok_or(Error::EntryTooLarge)?
|
|
777
|
+
.next_multiple_of(4);
|
|
778
|
+
|
|
779
|
+
if self.limit - self.bump < node_len {
|
|
780
|
+
let run = arena.allocate(node_len)?;
|
|
781
|
+
let (start, end) = arena.span(run);
|
|
782
|
+
self.runs.push(run);
|
|
783
|
+
self.allocated += run.count as usize * arena.chunk_size;
|
|
784
|
+
self.bump = start;
|
|
785
|
+
self.limit = end;
|
|
786
|
+
}
|
|
787
|
+
let node = self.bump as u32;
|
|
788
|
+
debug_assert!(
|
|
789
|
+
node != NULL && node.is_multiple_of(4) && (node as usize) < self.region.len()
|
|
790
|
+
);
|
|
791
|
+
|
|
792
|
+
// Predecessors at every level, kept in the splice itself: the last insert's when the
|
|
793
|
+
// key sorts right after the last key inserted (between it and its successor, two
|
|
794
|
+
// comparisons), else from a search down from the top of the head tower, which
|
|
795
|
+
// replaces them. Kept nowhere else: a copy cost the search path a second write per
|
|
796
|
+
// level (perf287 on #1315).
|
|
797
|
+
let mem = &self.region.mem;
|
|
798
|
+
let after_last = {
|
|
799
|
+
let last = self.splice[0];
|
|
800
|
+
(last == self.head || self.key_cmp(last, key) == Cmp::Less) && {
|
|
801
|
+
let next = mem.load_u32(tower(last, 0), Ordering::Relaxed);
|
|
802
|
+
next == NULL || self.key_cmp(next, key) != Cmp::Less
|
|
803
|
+
}
|
|
804
|
+
};
|
|
805
|
+
if !after_last {
|
|
806
|
+
let mut cur = self.head;
|
|
807
|
+
for level in (0..MAX_HEIGHT).rev() {
|
|
808
|
+
loop {
|
|
809
|
+
let next = mem.load_u32(tower(cur, level), Ordering::Relaxed);
|
|
810
|
+
if next == NULL || self.key_cmp(next, key) != Cmp::Less {
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
cur = next;
|
|
814
|
+
}
|
|
815
|
+
self.splice[level] = cur;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Fill the node; nothing links to it yet, so these are plain writes.
|
|
820
|
+
let off = node as usize;
|
|
821
|
+
mem.write_u32(off + layout::N_KEY_LEN, key_len);
|
|
822
|
+
mem.write_u32(off + layout::N_VALUE_LEN, value_len);
|
|
823
|
+
mem.write(off + layout::N_HEIGHT, &[height as u8, 0, 0, 0]);
|
|
824
|
+
// Always written, tails recorded or not: the chunk may hold an older memtable's bytes
|
|
825
|
+
// (D277, perf287's P2). `record_tail` overwrites it below when the node has one.
|
|
826
|
+
mem.write_u32(off + layout::N_TAIL, NULL);
|
|
827
|
+
// Level 0 first: its successor is the stale tail's too.
|
|
828
|
+
let next0 = mem.load_u32(tower(self.splice[0], 0), Ordering::Relaxed);
|
|
829
|
+
mem.write_u32(tower(node, 0), next0);
|
|
830
|
+
// An index loop: the iterator form (`enumerate().take(height).skip(1)` over the
|
|
831
|
+
// array) compiled to an out-of-line adapter, about 38 instructions per insert.
|
|
832
|
+
#[allow(clippy::needless_range_loop)]
|
|
833
|
+
for level in 1..height {
|
|
834
|
+
let next = mem.load_u32(tower(self.splice[level], level), Ordering::Relaxed);
|
|
835
|
+
mem.write_u32(tower(node, level), next);
|
|
836
|
+
}
|
|
837
|
+
let key_off = off + layout::N_TOWER + 4 * height;
|
|
838
|
+
mem.write(key_off, key);
|
|
839
|
+
mem.write(key_off + key.len(), value);
|
|
840
|
+
// Before the node is linked, so a reader that reaches it (an Acquire of the link)
|
|
841
|
+
// sees its tail, as it sees its key (D277). An insert in key order (no successor)
|
|
842
|
+
// tests one word.
|
|
843
|
+
if next0 != NULL && self.tails {
|
|
844
|
+
self.record_tail(node, next0, key);
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// Publish: link bottom-up, each with release so a reader that acquires the link
|
|
848
|
+
// sees the whole node.
|
|
849
|
+
for (level, &p) in self.splice.iter().enumerate().take(height) {
|
|
850
|
+
debug_assert!(p != NULL && p.is_multiple_of(4) && (p as usize) < self.region.len());
|
|
851
|
+
mem.store_u32(tower(p, level), node, Ordering::Release);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// The next insert's predecessors: this node below its height, the ones found above
|
|
855
|
+
// it. Only the node's own levels change (every level was rewritten per insert before,
|
|
856
|
+
// about 30 instructions, #1206).
|
|
857
|
+
self.splice[..height].fill(node);
|
|
858
|
+
self.bump += node_len;
|
|
859
|
+
self.used += node_len as u64;
|
|
860
|
+
self.count += 1;
|
|
861
|
+
if self.count == 1 || seqno < self.min_seqno {
|
|
862
|
+
self.min_seqno = seqno;
|
|
863
|
+
mem.store_u64(
|
|
864
|
+
self.root as usize + layout::H_MIN_SEQNO,
|
|
865
|
+
seqno,
|
|
866
|
+
Ordering::Relaxed,
|
|
867
|
+
);
|
|
868
|
+
}
|
|
869
|
+
if seqno > self.max_seqno {
|
|
870
|
+
self.max_seqno = seqno;
|
|
871
|
+
mem.store_u64(
|
|
872
|
+
self.root as usize + layout::H_MAX_SEQNO,
|
|
873
|
+
seqno,
|
|
874
|
+
Ordering::Relaxed,
|
|
875
|
+
);
|
|
876
|
+
}
|
|
877
|
+
mem.store_u64(
|
|
878
|
+
self.root as usize + layout::H_BYTES,
|
|
879
|
+
self.used,
|
|
880
|
+
Ordering::Relaxed,
|
|
881
|
+
);
|
|
882
|
+
// Release: a reader that sees this count sees every node counted.
|
|
883
|
+
mem.store_u32(
|
|
884
|
+
self.root as usize + layout::H_COUNT,
|
|
885
|
+
self.count,
|
|
886
|
+
Ordering::Release,
|
|
887
|
+
);
|
|
888
|
+
Ok(())
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/// Compares the key of the (writer-trusted) node at `node` with `key`.
|
|
892
|
+
#[inline]
|
|
893
|
+
fn key_cmp(&self, node: u32, key: &[u8]) -> Cmp {
|
|
894
|
+
let mem = &self.region.mem;
|
|
895
|
+
let off = node as usize;
|
|
896
|
+
let height = mem.read_u8(off + layout::N_HEIGHT) as usize;
|
|
897
|
+
let key_len = mem.read_u32(off + layout::N_KEY_LEN) as usize;
|
|
898
|
+
mem.cmp(off + layout::N_TOWER + 4 * height, key_len, key)
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
/// Records `node`'s stale tail (D194) when its successor `next` is in its column. Out of
|
|
902
|
+
/// line, so `insert` keeps its shape for the inserts that need none.
|
|
903
|
+
#[inline(never)]
|
|
904
|
+
fn record_tail(&self, node: u32, next: u32, key: &[u8]) {
|
|
905
|
+
if self.same_column(next, key) {
|
|
906
|
+
let mem = &self.region.mem;
|
|
907
|
+
// `next` is linked already, so its tail (and the tail's target) are published.
|
|
908
|
+
let tail = match mem.read_u32(next as usize + layout::N_TAIL) {
|
|
909
|
+
NULL => next,
|
|
910
|
+
t => t,
|
|
911
|
+
};
|
|
912
|
+
mem.write_u32(node as usize + layout::N_TAIL, tail);
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
/// Whether the (writer-trusted) node at `node` is in the column of internal key `key`.
|
|
917
|
+
fn same_column(&self, node: u32, key: &[u8]) -> bool {
|
|
918
|
+
let mem = &self.region.mem;
|
|
919
|
+
let off = node as usize;
|
|
920
|
+
let height = mem.read_u8(off + layout::N_HEIGHT) as usize;
|
|
921
|
+
let key_len = mem.read_u32(off + layout::N_KEY_LEN) as usize;
|
|
922
|
+
let column = key.len() - SUFFIX_LEN;
|
|
923
|
+
if key_len != key.len() {
|
|
924
|
+
return false;
|
|
925
|
+
}
|
|
926
|
+
let start = off + layout::N_TOWER + 4 * height;
|
|
927
|
+
// Neighbouring rows usually differ near the end of the row (sequential ids, time
|
|
928
|
+
// keys), past a long shared prefix: the column's last word settles most misses.
|
|
929
|
+
if column >= 8 && mem.cmp(start + column - 8, 8, &key[column - 8..column]) != Cmp::Equal {
|
|
930
|
+
return false;
|
|
931
|
+
}
|
|
932
|
+
mem.cmp(start, column, &key[..column]) == Cmp::Equal
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
/// A geometric height with ratio 1/4, from a private xorshift generator.
|
|
936
|
+
fn random_height(&mut self) -> usize {
|
|
937
|
+
let mut x = self.rng;
|
|
938
|
+
x ^= x << 13;
|
|
939
|
+
x ^= x >> 7;
|
|
940
|
+
x ^= x << 17;
|
|
941
|
+
self.rng = x;
|
|
942
|
+
let mut height = 1;
|
|
943
|
+
while height < MAX_HEIGHT && x & 3 == 0 {
|
|
944
|
+
height += 1;
|
|
945
|
+
x >>= 2;
|
|
946
|
+
}
|
|
947
|
+
height
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
/// Marks the memtable immutable (sets the frozen flag readers can see).
|
|
951
|
+
pub fn freeze(&mut self) {
|
|
952
|
+
self.frozen = true;
|
|
953
|
+
self.region.mem.fetch_or_u8(
|
|
954
|
+
self.root as usize + layout::H_FLAGS,
|
|
955
|
+
FLAG_FROZEN,
|
|
956
|
+
Ordering::Release,
|
|
957
|
+
);
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
/// Whether frozen.
|
|
961
|
+
pub fn is_frozen(&self) -> bool {
|
|
962
|
+
self.frozen
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
/// Entries inserted.
|
|
966
|
+
pub fn len(&self) -> usize {
|
|
967
|
+
self.count as usize
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
/// Whether no entry was inserted.
|
|
971
|
+
pub fn is_empty(&self) -> bool {
|
|
972
|
+
self.count == 0
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
/// Bytes allocated in the arena (drives freezing): the chunks this memtable owns, which
|
|
976
|
+
/// is what the shard's arena budget loses to it. The header's `bytes` field counts the
|
|
977
|
+
/// bytes actually written.
|
|
978
|
+
pub fn allocated_bytes(&self) -> usize {
|
|
979
|
+
self.allocated
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
/// Smallest and largest seqno inserted, or `None` if empty.
|
|
983
|
+
pub fn seqno_range(&self) -> Option<(Seqno, Seqno)> {
|
|
984
|
+
(self.count > 0).then_some((self.min_seqno, self.max_seqno))
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
/// Offset of the header within the arena; published in views.
|
|
988
|
+
pub fn root(&self) -> u32 {
|
|
989
|
+
self.root
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
/// Records that a delete marker (a family or row delete) is about to be inserted. Call
|
|
993
|
+
/// it before the marker's [`Memtable::insert`]: the store (Release) comes before the
|
|
994
|
+
/// marker is linked, so a reader that can see the marker sees this too
|
|
995
|
+
/// ([`MemtableReader::may_have_markers`], ICR 0020).
|
|
996
|
+
pub fn note_marker(&self) {
|
|
997
|
+
self.pin.markers.store(true, Ordering::Release);
|
|
998
|
+
}
|
|
999
|
+
|
|
1000
|
+
/// A reader for other threads. While it (or a cursor or slice taken from it) is alive,
|
|
1001
|
+
/// the memtable's chunks are not reused. The only reader that trusts the stale tails
|
|
1002
|
+
/// (D277): this process wrote them, so its column skips follow them unchecked, as D194's
|
|
1003
|
+
/// process-local index did. A reader from [`MemtableReader::open`] checks every tail.
|
|
1004
|
+
pub fn reader(&self) -> MemtableReader {
|
|
1005
|
+
MemtableReader {
|
|
1006
|
+
region: self.region.clone(),
|
|
1007
|
+
root: self.root,
|
|
1008
|
+
head: self.head,
|
|
1009
|
+
pin: Arc::clone(&self.pin),
|
|
1010
|
+
tails: self.tails,
|
|
1011
|
+
trusted: true,
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/// Stops using the memtable after its flush is in the manifest. The returned token goes
|
|
1016
|
+
/// to [`ShardArena::reclaim`] when no reader slot pins a view that lists it.
|
|
1017
|
+
pub fn retire(self) -> Retired {
|
|
1018
|
+
Retired {
|
|
1019
|
+
runs: self.runs,
|
|
1020
|
+
root: self.root,
|
|
1021
|
+
pin: self.pin,
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
/// A retired memtable's chunks, awaiting reclamation.
|
|
1027
|
+
#[derive(Debug)]
|
|
1028
|
+
#[must_use = "retired chunks leak unless passed to ShardArena::reclaim"]
|
|
1029
|
+
pub struct Retired {
|
|
1030
|
+
runs: Vec<Run>,
|
|
1031
|
+
root: u32,
|
|
1032
|
+
pin: Arc<Pin>,
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
/// A validated node: where its parts are.
|
|
1036
|
+
#[derive(Debug, Clone, Copy)]
|
|
1037
|
+
struct Node {
|
|
1038
|
+
off: u32,
|
|
1039
|
+
height: usize,
|
|
1040
|
+
key_off: usize,
|
|
1041
|
+
key_len: usize,
|
|
1042
|
+
value_off: usize,
|
|
1043
|
+
value_len: usize,
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/// A read handle to a memtable, usable from any thread or process. Cheap to clone.
|
|
1047
|
+
///
|
|
1048
|
+
/// ```
|
|
1049
|
+
/// use pigeonhole_format::{Cursor, Kind, encode_key};
|
|
1050
|
+
/// use pigeonhole_memtable::{ArenaRegion, Memtable, MemtableReader, ShardArena};
|
|
1051
|
+
///
|
|
1052
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
1053
|
+
/// let mut memtable = Memtable::create(&mut arena)?;
|
|
1054
|
+
/// let mut key = Vec::new();
|
|
1055
|
+
/// encode_key(&mut key, b"row", b"q", 1, 1, Kind::Put).unwrap();
|
|
1056
|
+
/// memtable.insert(&mut arena, &key, b"\x00v")?;
|
|
1057
|
+
///
|
|
1058
|
+
/// // A reader process opens the root it finds in the published view.
|
|
1059
|
+
/// let reader = MemtableReader::open(arena.region().clone(), memtable.root())?;
|
|
1060
|
+
/// assert_eq!(reader.len(), 1);
|
|
1061
|
+
/// let mut it = reader.iter();
|
|
1062
|
+
/// it.seek(&key)?;
|
|
1063
|
+
/// assert!(it.valid() && it.key() == &key[..]);
|
|
1064
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
1065
|
+
/// ```
|
|
1066
|
+
#[derive(Debug, Clone)]
|
|
1067
|
+
pub struct MemtableReader {
|
|
1068
|
+
region: ArenaRegion,
|
|
1069
|
+
root: u32,
|
|
1070
|
+
head: u32,
|
|
1071
|
+
/// Keeps the memtable's chunks from being reused while this handle lives (writer
|
|
1072
|
+
/// process only; in a reader process it pins nothing).
|
|
1073
|
+
pin: Arc<Pin>,
|
|
1074
|
+
/// The writer records stale tails in the nodes (the header's `FLAG_TAILS`, D277).
|
|
1075
|
+
tails: bool,
|
|
1076
|
+
/// The tails were written by this process: set only by [`Memtable::reader`], kept by
|
|
1077
|
+
/// clones and cursors, never set on a reader from [`MemtableReader::open`] (in the writer
|
|
1078
|
+
/// process too, whose `open` also gets a writer pin). A trusted skip follows a tail
|
|
1079
|
+
/// unchecked; an untrusted one validates it first (M1, P1).
|
|
1080
|
+
trusted: bool,
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
impl MemtableReader {
|
|
1084
|
+
/// Whether this handle reads `table`: the same memtable, not one that later took its
|
|
1085
|
+
/// root after its chunks were reclaimed (#1228's publish cache compares by this).
|
|
1086
|
+
pub fn reads(&self, table: &Memtable) -> bool {
|
|
1087
|
+
Arc::ptr_eq(&self.pin, &table.pin)
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/// Whether the memtable may hold a delete marker (ICR 0020). `false` only in the writer
|
|
1091
|
+
/// process, for a memtable whose writer never called [`Memtable::note_marker`]. Load it
|
|
1092
|
+
/// after taking the read point: a marker visible at that point was linked after its
|
|
1093
|
+
/// note (Acquire pairs with the note's Release), so it is never missed.
|
|
1094
|
+
#[inline]
|
|
1095
|
+
pub fn may_have_markers(&self) -> bool {
|
|
1096
|
+
!self.pin.writer || self.pin.markers.load(Ordering::Acquire)
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
/// Opens the memtable whose header is at `root` in `region` (reader processes use the
|
|
1100
|
+
/// root from the published view). Validates the header. In the writer process the
|
|
1101
|
+
/// reader pins the memtable like [`Memtable::reader`] does, provided `region` is a clone
|
|
1102
|
+
/// of the arena the memtable was created in.
|
|
1103
|
+
///
|
|
1104
|
+
/// # Errors
|
|
1105
|
+
/// [`Error::Corrupt`] if the header is misplaced, has the wrong magic or version, or
|
|
1106
|
+
/// names an invalid head node.
|
|
1107
|
+
pub fn open(region: ArenaRegion, root: u32) -> Result<MemtableReader> {
|
|
1108
|
+
let off = root as usize;
|
|
1109
|
+
if root == NULL || !off.is_multiple_of(8) {
|
|
1110
|
+
return Err(Error::Corrupt("memtable root is misaligned"));
|
|
1111
|
+
}
|
|
1112
|
+
if off + layout::HEADER_LEN > region.len() {
|
|
1113
|
+
return Err(Error::Corrupt("memtable header outside arena"));
|
|
1114
|
+
}
|
|
1115
|
+
let mem = ®ion.mem;
|
|
1116
|
+
if mem.read_u32(off + layout::H_MAGIC) != MEMTABLE_MAGIC {
|
|
1117
|
+
return Err(Error::Corrupt("memtable header magic"));
|
|
1118
|
+
}
|
|
1119
|
+
let version = u16::from_le_bytes([
|
|
1120
|
+
mem.read_u8(off + layout::H_VERSION),
|
|
1121
|
+
mem.read_u8(off + layout::H_VERSION + 1),
|
|
1122
|
+
]);
|
|
1123
|
+
if version != HEADER_VERSION {
|
|
1124
|
+
return Err(Error::Corrupt("memtable header version"));
|
|
1125
|
+
}
|
|
1126
|
+
let head = mem.read_u32(off + layout::H_HEAD);
|
|
1127
|
+
let pin = region.registry.pin_for(root);
|
|
1128
|
+
// Set before the memtable was published (`with_tail_index`); the frozen bit beside
|
|
1129
|
+
// it may change concurrently, hence an atomic load.
|
|
1130
|
+
let tails = mem.load_u8(off + layout::H_FLAGS, Ordering::Acquire) & FLAG_TAILS != 0;
|
|
1131
|
+
let reader = MemtableReader {
|
|
1132
|
+
region,
|
|
1133
|
+
root,
|
|
1134
|
+
head,
|
|
1135
|
+
pin,
|
|
1136
|
+
tails,
|
|
1137
|
+
trusted: false,
|
|
1138
|
+
};
|
|
1139
|
+
let node = reader.node(head)?;
|
|
1140
|
+
if node.height != MAX_HEIGHT || node.key_len != 0 || node.value_len != 0 {
|
|
1141
|
+
return Err(Error::Corrupt("memtable head node"));
|
|
1142
|
+
}
|
|
1143
|
+
Ok(reader)
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
/// Entries visible now.
|
|
1147
|
+
pub fn len(&self) -> usize {
|
|
1148
|
+
self.region
|
|
1149
|
+
.mem
|
|
1150
|
+
.load_u32(self.root as usize + layout::H_COUNT, Ordering::Acquire) as usize
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
/// Whether no entry is visible.
|
|
1154
|
+
pub fn is_empty(&self) -> bool {
|
|
1155
|
+
self.len() == 0
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
/// A cursor, initially unpositioned. Holds its own clone of the reader, so it can be
|
|
1159
|
+
/// stored beside the view that keeps the arena memory alive.
|
|
1160
|
+
pub fn iter(&self) -> MemIter {
|
|
1161
|
+
MemIter {
|
|
1162
|
+
reader: self.clone(),
|
|
1163
|
+
node: None,
|
|
1164
|
+
preds: [NULL; FINGER_LEVELS],
|
|
1165
|
+
walk: Walk::default(),
|
|
1166
|
+
#[cfg(loom)]
|
|
1167
|
+
key_buf: Vec::new(),
|
|
1168
|
+
#[cfg(loom)]
|
|
1169
|
+
value_buf: Vec::new(),
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
/// The arena this memtable lives in.
|
|
1174
|
+
pub fn region(&self) -> &ArenaRegion {
|
|
1175
|
+
&self.region
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
/// Validates the node at `off` (which must be non-null) and locates its parts, so that
|
|
1179
|
+
/// a bad link from a buggy or crashed writer surfaces as [`Error::Corrupt`], never as a
|
|
1180
|
+
/// fault.
|
|
1181
|
+
#[inline]
|
|
1182
|
+
fn node(&self, off: u32) -> Result<Node> {
|
|
1183
|
+
let len = self.region.len() as u64;
|
|
1184
|
+
let start = u64::from(off);
|
|
1185
|
+
if off == NULL || !off.is_multiple_of(4) {
|
|
1186
|
+
return Err(Error::Corrupt("node offset"));
|
|
1187
|
+
}
|
|
1188
|
+
if start + layout::N_TOWER as u64 > len {
|
|
1189
|
+
return Err(Error::Corrupt("node header outside arena"));
|
|
1190
|
+
}
|
|
1191
|
+
let mem = &self.region.mem;
|
|
1192
|
+
let height = mem.read_u8(off as usize + layout::N_HEIGHT) as usize;
|
|
1193
|
+
if height == 0 || height > MAX_HEIGHT {
|
|
1194
|
+
return Err(Error::Corrupt("node height"));
|
|
1195
|
+
}
|
|
1196
|
+
let key_len = mem.read_u32(off as usize + layout::N_KEY_LEN);
|
|
1197
|
+
let value_len = mem.read_u32(off as usize + layout::N_VALUE_LEN);
|
|
1198
|
+
let key_off = start + (layout::N_TOWER + 4 * height) as u64;
|
|
1199
|
+
let value_off = key_off + u64::from(key_len);
|
|
1200
|
+
if value_off + u64::from(value_len) > len {
|
|
1201
|
+
return Err(Error::Corrupt("node outside arena"));
|
|
1202
|
+
}
|
|
1203
|
+
Ok(Node {
|
|
1204
|
+
off,
|
|
1205
|
+
height,
|
|
1206
|
+
key_off: key_off as usize,
|
|
1207
|
+
key_len: key_len as usize,
|
|
1208
|
+
value_off: value_off as usize,
|
|
1209
|
+
value_len: value_len as usize,
|
|
1210
|
+
})
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
/// The first node whose key is `>= target`, or `None`, recording in `preds` the last
|
|
1214
|
+
/// node before `target` at each of the lowest [`FINGER_LEVELS`] levels. With `finger`,
|
|
1215
|
+
/// `preds` holds those of an earlier search, used when they are all before `target` (a
|
|
1216
|
+
/// finger search, for a forward seek; otherwise a full search): it climbs from level 0 to the first level whose next
|
|
1217
|
+
/// node is at or past `target`, and descends from there, so its cost grows with how far
|
|
1218
|
+
/// the target is, not with the memtable's size; a target past the reach of the recorded
|
|
1219
|
+
/// levels gets a full search. Only reads: nodes are never unlinked, so `preds` stay
|
|
1220
|
+
/// valid lower bounds while writers insert, and a node linked after the climb read its
|
|
1221
|
+
/// predecessor's link is met by the descent like any other.
|
|
1222
|
+
///
|
|
1223
|
+
/// Returns the level-0 node it stopped at rather than re-reading the predecessor's link:
|
|
1224
|
+
/// the writer may link a new node below `target` there between the two loads.
|
|
1225
|
+
fn search(
|
|
1226
|
+
&self,
|
|
1227
|
+
target: &[u8],
|
|
1228
|
+
preds: &mut [u32; FINGER_LEVELS],
|
|
1229
|
+
finger: bool,
|
|
1230
|
+
) -> Result<Option<Node>> {
|
|
1231
|
+
let mut walk = Walk {
|
|
1232
|
+
steps: 0,
|
|
1233
|
+
budget: self.len() + STEP_SLACK,
|
|
1234
|
+
};
|
|
1235
|
+
// The recorded predecessors are lower bounds only if they are all before `target`:
|
|
1236
|
+
// the level-0 one is the last of them, so it alone is compared. A target before the
|
|
1237
|
+
// last seek's (allowed when the cursor has moved off its current key or run out)
|
|
1238
|
+
// gets a full search.
|
|
1239
|
+
if finger && self.before(preds[0], target)? {
|
|
1240
|
+
// The lowest recorded level whose next node is at or past `target`.
|
|
1241
|
+
let mut start = None;
|
|
1242
|
+
for (l, &pred) in preds.iter().enumerate() {
|
|
1243
|
+
let next = self.region.mem.load_u32(tower(pred, l), Ordering::Acquire);
|
|
1244
|
+
let past = next == NULL || {
|
|
1245
|
+
let n = self.node(next)?;
|
|
1246
|
+
walk.steps += 1;
|
|
1247
|
+
self.region.mem.cmp(n.key_off, n.key_len, target) != Cmp::Less
|
|
1248
|
+
};
|
|
1249
|
+
if past {
|
|
1250
|
+
start = Some(l);
|
|
1251
|
+
break;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
if let Some(top) = start {
|
|
1255
|
+
// Each level starts from its recorded predecessor (every node between is
|
|
1256
|
+
// before the earlier target) until the walk first moves forward, after which
|
|
1257
|
+
// it is past every recorded predecessor below.
|
|
1258
|
+
let mut cur = preds[top];
|
|
1259
|
+
let mut moved = false;
|
|
1260
|
+
for level in (1..=top).rev() {
|
|
1261
|
+
if !moved {
|
|
1262
|
+
cur = preds[level];
|
|
1263
|
+
}
|
|
1264
|
+
let from = cur;
|
|
1265
|
+
self.walk_level(&mut walk, &mut cur, level, target)?;
|
|
1266
|
+
moved |= cur != from;
|
|
1267
|
+
preds[level] = cur;
|
|
1268
|
+
}
|
|
1269
|
+
if !moved {
|
|
1270
|
+
cur = preds[0];
|
|
1271
|
+
}
|
|
1272
|
+
let found = self.walk_level(&mut walk, &mut cur, 0, target)?;
|
|
1273
|
+
preds[0] = cur;
|
|
1274
|
+
return Ok(found);
|
|
1275
|
+
}
|
|
1276
|
+
// Farther than the recorded levels reach: a full search.
|
|
1277
|
+
}
|
|
1278
|
+
let mut cur = self.head;
|
|
1279
|
+
for level in (FINGER_LEVELS..MAX_HEIGHT).rev() {
|
|
1280
|
+
self.walk_level(&mut walk, &mut cur, level, target)?;
|
|
1281
|
+
}
|
|
1282
|
+
for level in (1..FINGER_LEVELS).rev() {
|
|
1283
|
+
self.walk_level(&mut walk, &mut cur, level, target)?;
|
|
1284
|
+
preds[level] = cur;
|
|
1285
|
+
}
|
|
1286
|
+
let found = self.walk_level(&mut walk, &mut cur, 0, target)?;
|
|
1287
|
+
preds[0] = cur;
|
|
1288
|
+
Ok(found)
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
/// Whether node `off` (the head, or a linked node) sorts before `target`.
|
|
1292
|
+
fn before(&self, off: u32, target: &[u8]) -> Result<bool> {
|
|
1293
|
+
if off == self.head {
|
|
1294
|
+
return Ok(true);
|
|
1295
|
+
}
|
|
1296
|
+
let n = self.node(off)?;
|
|
1297
|
+
Ok(self.region.mem.cmp(n.key_off, n.key_len, target) == Cmp::Less)
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
/// Advances `cur` along `level` while the next node is before `target`; returns that
|
|
1301
|
+
/// next node (the first at or past `target` on this level), or `None` at the level's end.
|
|
1302
|
+
#[inline(always)]
|
|
1303
|
+
fn walk_level(
|
|
1304
|
+
&self,
|
|
1305
|
+
walk: &mut Walk,
|
|
1306
|
+
cur: &mut u32,
|
|
1307
|
+
level: usize,
|
|
1308
|
+
target: &[u8],
|
|
1309
|
+
) -> Result<Option<Node>> {
|
|
1310
|
+
let mem = &self.region.mem;
|
|
1311
|
+
loop {
|
|
1312
|
+
let next = mem.load_u32(tower(*cur, level), Ordering::Acquire);
|
|
1313
|
+
if next == NULL {
|
|
1314
|
+
return Ok(None);
|
|
1315
|
+
}
|
|
1316
|
+
let n = self.node(next)?;
|
|
1317
|
+
if level >= n.height {
|
|
1318
|
+
return Err(Error::Corrupt("node linked above its height"));
|
|
1319
|
+
}
|
|
1320
|
+
walk.step(self)?;
|
|
1321
|
+
if mem.cmp(n.key_off, n.key_len, target) == Cmp::Less {
|
|
1322
|
+
*cur = next;
|
|
1323
|
+
} else {
|
|
1324
|
+
return Ok(Some(n));
|
|
1325
|
+
}
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
|
|
1329
|
+
/// The node after `node` at level 0, or `None`.
|
|
1330
|
+
#[inline]
|
|
1331
|
+
fn successor(&self, node: u32) -> Result<Option<Node>> {
|
|
1332
|
+
let next = self.region.mem.load_u32(tower(node, 0), Ordering::Acquire);
|
|
1333
|
+
if next == NULL {
|
|
1334
|
+
Ok(None)
|
|
1335
|
+
} else {
|
|
1336
|
+
self.node(next).map(Some)
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
/// Whether the validated node `n` is in `column` (an internal key without its suffix).
|
|
1341
|
+
#[inline]
|
|
1342
|
+
fn in_column(&self, n: &Node, column: &[u8]) -> bool {
|
|
1343
|
+
n.key_len == column.len() + SUFFIX_LEN
|
|
1344
|
+
&& self.region.mem.cmp(n.key_off, column.len(), column) == Cmp::Equal
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
/// A zero-copy cursor over a memtable: keys and values borrow arena memory, which the view
|
|
1349
|
+
/// pin keeps alive. Owns a [`MemtableReader`] clone. Sees every entry published before each
|
|
1350
|
+
/// move.
|
|
1351
|
+
///
|
|
1352
|
+
/// ```
|
|
1353
|
+
/// use pigeonhole_format::{Cursor, Kind, encode_key};
|
|
1354
|
+
/// use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
1355
|
+
///
|
|
1356
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
1357
|
+
/// let mut memtable = Memtable::create(&mut arena)?;
|
|
1358
|
+
/// let mut keys = Vec::new();
|
|
1359
|
+
/// for (row, seqno) in [(b"b", 1), (b"a", 2), (b"c", 3)] {
|
|
1360
|
+
/// let mut key = Vec::new();
|
|
1361
|
+
/// encode_key(&mut key, row, b"q", 0, seqno, Kind::Put).unwrap();
|
|
1362
|
+
/// memtable.insert(&mut arena, &key, row)?;
|
|
1363
|
+
/// keys.push(key);
|
|
1364
|
+
/// }
|
|
1365
|
+
///
|
|
1366
|
+
/// let mut it = memtable.reader().iter();
|
|
1367
|
+
/// it.seek(&keys[0])?; // row "b"
|
|
1368
|
+
/// assert_eq!(it.value(), b"b");
|
|
1369
|
+
/// it.next()?;
|
|
1370
|
+
/// assert_eq!(it.value(), b"c");
|
|
1371
|
+
/// it.next()?;
|
|
1372
|
+
/// assert!(!it.valid());
|
|
1373
|
+
///
|
|
1374
|
+
/// it.seek_to_first()?;
|
|
1375
|
+
/// let big = it.value_slice(); // outlives the cursor
|
|
1376
|
+
/// drop(it);
|
|
1377
|
+
/// assert_eq!(&*big, b"a");
|
|
1378
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
1379
|
+
/// ```
|
|
1380
|
+
#[derive(Debug)]
|
|
1381
|
+
pub struct MemIter {
|
|
1382
|
+
reader: MemtableReader,
|
|
1383
|
+
/// The current node, or `None` when unpositioned or past the end.
|
|
1384
|
+
node: Option<Node>,
|
|
1385
|
+
/// The last node before the last seek's target at each of the lowest levels, where a
|
|
1386
|
+
/// forward seek starts its finger search; `NULL` at level 0 until a seek sets them.
|
|
1387
|
+
preds: [u32; FINGER_LEVELS],
|
|
1388
|
+
/// Nodes stepped to since the last seek, and how many are plausible before the walk is
|
|
1389
|
+
/// declared a cycle.
|
|
1390
|
+
walk: Walk,
|
|
1391
|
+
#[cfg(loom)]
|
|
1392
|
+
key_buf: Vec<u8>,
|
|
1393
|
+
#[cfg(loom)]
|
|
1394
|
+
value_buf: Vec<u8>,
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
impl MemIter {
|
|
1398
|
+
/// Whether [`Cursor::skip_column`] can jump here: the memtable has a stale-tail index
|
|
1399
|
+
/// (D194) and holds entries. A reader can leave the skip off for a read whose sources
|
|
1400
|
+
/// have no such memtable, so it never pays for a try that cannot succeed.
|
|
1401
|
+
pub fn skips_columns(&self) -> bool {
|
|
1402
|
+
self.reader.tails && !self.reader.is_empty()
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
/// [`Cursor::skip_column`]'s jump: from the tail `at`, steps while the key is still in
|
|
1406
|
+
/// `column` (following later tails), and stops on the first entry past it.
|
|
1407
|
+
///
|
|
1408
|
+
/// A tail is an offset read from the arena, untrusted in a reader process (D277,
|
|
1409
|
+
/// perf287's M1): each one is validated as a node ([`MemtableReader::node`]) before its
|
|
1410
|
+
/// link is loaded, and must be in `column` (P1), so a bad tail (reused memory, a writer
|
|
1411
|
+
/// bug) is [`Error::Corrupt`], never a fault or a silent skip of live entries.
|
|
1412
|
+
fn jump(&mut self, mut at: u32, column: &[u8]) -> Result<bool> {
|
|
1413
|
+
loop {
|
|
1414
|
+
self.walk.step(&self.reader)?;
|
|
1415
|
+
if self.reader.trusted {
|
|
1416
|
+
// This process wrote the tail: checked in debug builds only, so a
|
|
1417
|
+
// `record_tail` bug still fails the tests.
|
|
1418
|
+
debug_assert!(
|
|
1419
|
+
self.reader
|
|
1420
|
+
.node(at)
|
|
1421
|
+
.is_ok_and(|t| self.reader.in_column(&t, column)),
|
|
1422
|
+
"stale tail {at} outside its column"
|
|
1423
|
+
);
|
|
1424
|
+
} else {
|
|
1425
|
+
// From shared memory: validated before its link is loaded (M1), and in the
|
|
1426
|
+
// column (P1).
|
|
1427
|
+
let t = self.reader.node(at)?;
|
|
1428
|
+
if !self.reader.in_column(&t, column) {
|
|
1429
|
+
return Err(Error::Corrupt("stale tail outside its column"));
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
let next = self.reader.successor(at)?;
|
|
1433
|
+
match next {
|
|
1434
|
+
Some(n) if self.reader.in_column(&n, column) => {
|
|
1435
|
+
at = match self
|
|
1436
|
+
.reader
|
|
1437
|
+
.region
|
|
1438
|
+
.mem
|
|
1439
|
+
.read_u32(n.off as usize + layout::N_TAIL)
|
|
1440
|
+
{
|
|
1441
|
+
NULL => n.off,
|
|
1442
|
+
t => t,
|
|
1443
|
+
};
|
|
1444
|
+
}
|
|
1445
|
+
_ => {
|
|
1446
|
+
self.set(next);
|
|
1447
|
+
return Ok(true);
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
}
|
|
1452
|
+
|
|
1453
|
+
/// The current value as an [`ArenaSlice`] that outlives the cursor, so a caller can hand
|
|
1454
|
+
/// out a large value without copying it (it must also hold the view pin that keeps the
|
|
1455
|
+
/// memtable from being reclaimed).
|
|
1456
|
+
///
|
|
1457
|
+
/// # Panics
|
|
1458
|
+
/// If the cursor is not valid.
|
|
1459
|
+
pub fn value_slice(&self) -> ArenaSlice {
|
|
1460
|
+
let node = self.node.expect("value_slice on an invalid cursor");
|
|
1461
|
+
ArenaSlice {
|
|
1462
|
+
region: self.reader.region.clone(),
|
|
1463
|
+
offset: node.value_off,
|
|
1464
|
+
len: node.value_len,
|
|
1465
|
+
_pin: Arc::clone(&self.reader.pin),
|
|
1466
|
+
#[cfg(loom)]
|
|
1467
|
+
bytes: self.value_buf.clone(),
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
#[inline]
|
|
1472
|
+
fn set(&mut self, node: Option<Node>) {
|
|
1473
|
+
self.node = node;
|
|
1474
|
+
#[cfg(loom)]
|
|
1475
|
+
if let Some(n) = node {
|
|
1476
|
+
self.key_buf = self.reader.region.mem.copy(n.key_off, n.key_len);
|
|
1477
|
+
self.value_buf = self.reader.region.mem.copy(n.value_off, n.value_len);
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
|
|
1482
|
+
/// A byte range of an arena, readable as `&[u8]`. Holds an [`ArenaRegion`] clone (keeping the
|
|
1483
|
+
/// mapping alive); the memory stays meaningful only while a view listing its memtable is
|
|
1484
|
+
/// pinned, which the holder guarantees.
|
|
1485
|
+
///
|
|
1486
|
+
/// ```
|
|
1487
|
+
/// use pigeonhole_format::{Cursor, Kind, encode_key};
|
|
1488
|
+
/// use pigeonhole_memtable::{ArenaRegion, ArenaSlice, Memtable, ShardArena};
|
|
1489
|
+
///
|
|
1490
|
+
/// let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 * 1024);
|
|
1491
|
+
/// let mut memtable = Memtable::create(&mut arena)?;
|
|
1492
|
+
/// let mut key = Vec::new();
|
|
1493
|
+
/// encode_key(&mut key, b"row", b"q", 0, 1, Kind::Put).unwrap();
|
|
1494
|
+
/// let value = vec![7u8; 4096];
|
|
1495
|
+
/// memtable.insert(&mut arena, &key, &value)?;
|
|
1496
|
+
///
|
|
1497
|
+
/// let slice: ArenaSlice = {
|
|
1498
|
+
/// let mut it = memtable.reader().iter();
|
|
1499
|
+
/// it.seek_to_first()?;
|
|
1500
|
+
/// it.value_slice()
|
|
1501
|
+
/// };
|
|
1502
|
+
/// assert_eq!(slice.len(), 4096);
|
|
1503
|
+
/// assert_eq!(&slice[..3], &[7, 7, 7]);
|
|
1504
|
+
/// # Ok::<(), pigeonhole_memtable::Error>(())
|
|
1505
|
+
/// ```
|
|
1506
|
+
#[derive(Debug, Clone)]
|
|
1507
|
+
pub struct ArenaSlice {
|
|
1508
|
+
region: ArenaRegion,
|
|
1509
|
+
offset: usize,
|
|
1510
|
+
len: usize,
|
|
1511
|
+
/// Keeps the memtable's chunks from being reused while the slice lives (held for its
|
|
1512
|
+
/// drop).
|
|
1513
|
+
_pin: Arc<Pin>,
|
|
1514
|
+
#[cfg(loom)]
|
|
1515
|
+
bytes: Vec<u8>,
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
impl std::ops::Deref for ArenaSlice {
|
|
1519
|
+
type Target = [u8];
|
|
1520
|
+
|
|
1521
|
+
#[cfg(not(loom))]
|
|
1522
|
+
fn deref(&self) -> &[u8] {
|
|
1523
|
+
self.region.mem.slice(self.offset, self.len)
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
#[cfg(loom)]
|
|
1527
|
+
fn deref(&self) -> &[u8] {
|
|
1528
|
+
let _ = (&self.region, self.offset, self.len);
|
|
1529
|
+
&self.bytes
|
|
1530
|
+
}
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
/// Entries [`MemIter::skip_row`] steps before it seeks past the row: a narrow row ends
|
|
1534
|
+
/// within them, and a step costs less than a search.
|
|
1535
|
+
const ROW_SKIP_STEPS: usize = 8;
|
|
1536
|
+
|
|
1537
|
+
impl Cursor for MemIter {
|
|
1538
|
+
type Error = Error;
|
|
1539
|
+
|
|
1540
|
+
#[inline]
|
|
1541
|
+
fn valid(&self) -> bool {
|
|
1542
|
+
self.node.is_some()
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
#[cfg(not(loom))]
|
|
1546
|
+
#[inline]
|
|
1547
|
+
fn key(&self) -> &[u8] {
|
|
1548
|
+
let node = self.node.expect("key on an invalid cursor");
|
|
1549
|
+
self.reader.region.mem.slice(node.key_off, node.key_len)
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1552
|
+
#[cfg(loom)]
|
|
1553
|
+
fn key(&self) -> &[u8] {
|
|
1554
|
+
assert!(self.node.is_some(), "key on an invalid cursor");
|
|
1555
|
+
&self.key_buf
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
#[cfg(not(loom))]
|
|
1559
|
+
#[inline]
|
|
1560
|
+
fn value(&self) -> &[u8] {
|
|
1561
|
+
let node = self.node.expect("value on an invalid cursor");
|
|
1562
|
+
self.reader.region.mem.slice(node.value_off, node.value_len)
|
|
1563
|
+
}
|
|
1564
|
+
|
|
1565
|
+
#[cfg(loom)]
|
|
1566
|
+
fn value(&self) -> &[u8] {
|
|
1567
|
+
assert!(self.node.is_some(), "value on an invalid cursor");
|
|
1568
|
+
&self.value_buf
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1571
|
+
fn seek_to_first(&mut self) -> Result<()> {
|
|
1572
|
+
let first = self.reader.successor(self.reader.head)?;
|
|
1573
|
+
self.walk.steps = 0;
|
|
1574
|
+
self.preds[0] = NULL;
|
|
1575
|
+
self.set(first);
|
|
1576
|
+
Ok(())
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
fn seek(&mut self, target: &[u8]) -> Result<()> {
|
|
1580
|
+
let found = self.reader.search(target, &mut self.preds, false)?;
|
|
1581
|
+
self.walk.steps = 0;
|
|
1582
|
+
self.set(found);
|
|
1583
|
+
Ok(())
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
/// A finger search from the last seek's position: cost grows with the distance to
|
|
1587
|
+
/// `target`. Any `target` gives the first entry `>= target`, as [`Cursor::seek`] does: one
|
|
1588
|
+
/// before the last seek's (the cursor exhausted, or moved past it) gets a full search.
|
|
1589
|
+
fn seek_forward(&mut self, target: &[u8]) -> Result<()> {
|
|
1590
|
+
let finger = self.preds[0] != NULL;
|
|
1591
|
+
let found = self.reader.search(target, &mut self.preds, finger)?;
|
|
1592
|
+
self.walk.steps = 0;
|
|
1593
|
+
self.set(found);
|
|
1594
|
+
Ok(())
|
|
1595
|
+
}
|
|
1596
|
+
|
|
1597
|
+
/// Steps a few entries, as most rows end within them, then finger-searches past the
|
|
1598
|
+
/// row: `escaped row ++ 00 02` sorts after every key of the row and before every later
|
|
1599
|
+
/// row, as the SST's row skip seeks (#1426). The default steps through the whole row, so
|
|
1600
|
+
/// a filter's `SkipRow` in a wide row (a qualifier prefix in the middle of 100,000
|
|
1601
|
+
/// cells) walked the rest of it.
|
|
1602
|
+
fn skip_row(&mut self) -> Result<()> {
|
|
1603
|
+
if !self.valid() {
|
|
1604
|
+
return Ok(());
|
|
1605
|
+
}
|
|
1606
|
+
let Ok(n) = pigeonhole_format::key::row_prefix_len(self.key()) else {
|
|
1607
|
+
return self.next();
|
|
1608
|
+
};
|
|
1609
|
+
// Copied to the stack, which holds most row prefixes (no allocation per skip).
|
|
1610
|
+
let mut inline = [0u8; 64];
|
|
1611
|
+
let mut heap = Vec::new();
|
|
1612
|
+
let row: &mut [u8] = if let Some(buf) = inline.get_mut(..n) {
|
|
1613
|
+
buf.copy_from_slice(&self.key()[..n]);
|
|
1614
|
+
buf
|
|
1615
|
+
} else {
|
|
1616
|
+
heap.extend_from_slice(&self.key()[..n]);
|
|
1617
|
+
&mut heap
|
|
1618
|
+
};
|
|
1619
|
+
for _ in 0..ROW_SKIP_STEPS {
|
|
1620
|
+
self.next()?;
|
|
1621
|
+
if !self.valid() || !self.key().starts_with(row) {
|
|
1622
|
+
return Ok(());
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
if let Some(last) = row.last_mut() {
|
|
1626
|
+
*last = 0x02;
|
|
1627
|
+
}
|
|
1628
|
+
self.seek_forward(row)
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
/// With a stale-tail index (D194): jumps to the tail recorded for the current entry,
|
|
1632
|
+
/// then steps inside the memtable while the key is still in `column`.
|
|
1633
|
+
#[inline]
|
|
1634
|
+
fn skip_column(&mut self, column: &[u8]) -> Result<bool> {
|
|
1635
|
+
let Some(node) = self.node.filter(|_| self.reader.tails) else {
|
|
1636
|
+
return Ok(false);
|
|
1637
|
+
};
|
|
1638
|
+
let at = self
|
|
1639
|
+
.reader
|
|
1640
|
+
.region
|
|
1641
|
+
.mem
|
|
1642
|
+
.read_u32(node.off as usize + layout::N_TAIL);
|
|
1643
|
+
if at == NULL {
|
|
1644
|
+
return Ok(false);
|
|
1645
|
+
}
|
|
1646
|
+
self.jump(at, column)
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1649
|
+
fn next(&mut self) -> Result<()> {
|
|
1650
|
+
let Some(node) = self.node else {
|
|
1651
|
+
return Ok(());
|
|
1652
|
+
};
|
|
1653
|
+
self.walk.step(&self.reader)?;
|
|
1654
|
+
let next = self.reader.successor(node.off)?;
|
|
1655
|
+
self.set(next);
|
|
1656
|
+
Ok(())
|
|
1657
|
+
}
|
|
1658
|
+
}
|