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,2429 @@
|
|
|
1
|
+
//! The read path: point gets, row reads and ordered scans over a snapshot's view, through
|
|
2
|
+
//! `pigeonhole-compaction`'s `CellResolver` (snapshot visibility, deletes, TTL, versions,
|
|
3
|
+
//! filters, merge folding) over a `MergingCursor` of the engine's [`Source`]s.
|
|
4
|
+
|
|
5
|
+
use std::cell::RefCell;
|
|
6
|
+
use std::ops::Bound;
|
|
7
|
+
use std::sync::{Arc, Mutex, PoisonError};
|
|
8
|
+
|
|
9
|
+
use pigeonhole_compaction::{
|
|
10
|
+
BlobFetch, MergingCursor, ResolveOptions, ResolvedCell, ValuePredicate, blob_pointer,
|
|
11
|
+
};
|
|
12
|
+
use pigeonhole_format::key::{
|
|
13
|
+
Escaped, Kind, SUFFIX_LEN, TERMINATOR, decode_key, encode_row_prefix, row_prefix_len,
|
|
14
|
+
};
|
|
15
|
+
use pigeonhole_format::scan::ScanFilter;
|
|
16
|
+
use pigeonhole_format::value::{BlobPointer, ValueRef, decode_value};
|
|
17
|
+
use pigeonhole_format::{Cursor, FamilyId, Seqno, TableId, TabletId, Timestamp};
|
|
18
|
+
use pigeonhole_memtable::ArenaSlice;
|
|
19
|
+
use pigeonhole_sst::QualifierFilter;
|
|
20
|
+
|
|
21
|
+
use crate::catalog::{FamilyMeta, MergeKind};
|
|
22
|
+
use crate::snapshot::{Snapshot, SstSet, TabletEntry, View};
|
|
23
|
+
use crate::source::{ColumnKey, Pinned, Resolver, Source, row_prefix};
|
|
24
|
+
use crate::{Error, Result};
|
|
25
|
+
|
|
26
|
+
pub(crate) mod keys;
|
|
27
|
+
pub(crate) mod knn;
|
|
28
|
+
pub(crate) mod reduce;
|
|
29
|
+
pub(crate) mod traverse;
|
|
30
|
+
|
|
31
|
+
/// How a [`CellData`] keeps its value alive.
|
|
32
|
+
#[derive(Clone)]
|
|
33
|
+
enum CellValue {
|
|
34
|
+
/// A copy (small values, merge results, small separated values).
|
|
35
|
+
Inline {
|
|
36
|
+
len: u8,
|
|
37
|
+
bytes: [u8; CellData::INLINE_MAX],
|
|
38
|
+
},
|
|
39
|
+
/// A pinned memtable range plus the view that keeps the memtable from being reclaimed.
|
|
40
|
+
Arena { slice: ArenaSlice, _view: Arc<View> },
|
|
41
|
+
/// A pinned range of a cached SST block.
|
|
42
|
+
Block(pigeonhole_cache::Cell),
|
|
43
|
+
/// A heap copy larger than the inline limit (merge results, mid-sized values).
|
|
44
|
+
Owned(Vec<u8>),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
impl std::fmt::Debug for CellValue {
|
|
48
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
49
|
+
match self {
|
|
50
|
+
CellValue::Inline { len, .. } => write!(f, "Inline({len} bytes)"),
|
|
51
|
+
CellValue::Arena { slice, .. } => write!(f, "Arena({} bytes)", slice.len()),
|
|
52
|
+
CellValue::Block(c) => write!(f, "Block({} bytes)", c.len()),
|
|
53
|
+
CellValue::Owned(v) => write!(f, "Owned({} bytes)", v.len()),
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/// A resolved cell value that pins its storage instead of copying it: a range of a cached
|
|
59
|
+
/// block (`cache::Cell`), or a range of a memtable arena plus the view pin that keeps it alive
|
|
60
|
+
/// (`memtable::ArenaSlice` + `Arc<View>`). Values of at most [`CellData::INLINE_MAX`] bytes,
|
|
61
|
+
/// merge results and values the resolver had to buffer (up to 4 KiB, decision D81) are copied
|
|
62
|
+
/// into the cell instead (decision D29), so a hot small get never takes a view reference.
|
|
63
|
+
/// Holds no lifetime and clones cheaply.
|
|
64
|
+
#[derive(Debug, Clone)]
|
|
65
|
+
pub struct CellData {
|
|
66
|
+
ts: Timestamp,
|
|
67
|
+
value: CellValue,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
impl CellData {
|
|
71
|
+
/// Values up to this many bytes are copied rather than pinned.
|
|
72
|
+
pub const INLINE_MAX: usize = 128;
|
|
73
|
+
|
|
74
|
+
/// An empty inline value at timestamp 0, to be overwritten in place with
|
|
75
|
+
/// [`CellData::set_inline`].
|
|
76
|
+
pub const EMPTY: CellData = CellData {
|
|
77
|
+
ts: 0,
|
|
78
|
+
value: CellValue::Inline {
|
|
79
|
+
len: 0,
|
|
80
|
+
bytes: [0; Self::INLINE_MAX],
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/// A cell holding `stored` (a stored value, its tag byte first) at `ts`: inline when it
|
|
85
|
+
/// fits, else the buffer itself. For results built from values a read copied out, such
|
|
86
|
+
/// as a byte-budgeted read's (D308).
|
|
87
|
+
pub fn from_stored(ts: Timestamp, stored: Vec<u8>) -> Self {
|
|
88
|
+
if stored.len() <= Self::INLINE_MAX {
|
|
89
|
+
let mut c = Self::EMPTY;
|
|
90
|
+
c.set_inline(ts, &stored);
|
|
91
|
+
c
|
|
92
|
+
} else {
|
|
93
|
+
CellData {
|
|
94
|
+
ts,
|
|
95
|
+
value: CellValue::Owned(stored),
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/// Makes this cell a copy of `stored` (a stored value of at most
|
|
101
|
+
/// [`CellData::INLINE_MAX`] bytes) at `ts`, reusing its inline bytes when it has them.
|
|
102
|
+
#[inline]
|
|
103
|
+
pub fn set_inline(&mut self, ts: Timestamp, stored: &[u8]) {
|
|
104
|
+
debug_assert!(stored.len() <= Self::INLINE_MAX);
|
|
105
|
+
self.ts = ts;
|
|
106
|
+
match &mut self.value {
|
|
107
|
+
CellValue::Inline { len, bytes } => {
|
|
108
|
+
bytes[..stored.len()].copy_from_slice(stored);
|
|
109
|
+
*len = stored.len() as u8;
|
|
110
|
+
}
|
|
111
|
+
v => {
|
|
112
|
+
let mut bytes = [0u8; Self::INLINE_MAX];
|
|
113
|
+
bytes[..stored.len()].copy_from_slice(stored);
|
|
114
|
+
*v = CellValue::Inline {
|
|
115
|
+
len: stored.len() as u8,
|
|
116
|
+
bytes,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/// Builds a cell from a resolved one. `source` is the source the merged cursor is on
|
|
123
|
+
/// (to pin a large value without copying); `pin` is called only when the value is large
|
|
124
|
+
/// and borrowed from a memtable, so a hot small get never touches a view reference count.
|
|
125
|
+
pub(crate) fn from_cell(
|
|
126
|
+
cell: &ResolvedCell<'_>,
|
|
127
|
+
source: Option<&Source>,
|
|
128
|
+
pin: impl FnOnce() -> Arc<View>,
|
|
129
|
+
) -> Self {
|
|
130
|
+
let stored = cell.value;
|
|
131
|
+
let value = if stored.len() <= Self::INLINE_MAX {
|
|
132
|
+
let mut bytes = [0u8; Self::INLINE_MAX];
|
|
133
|
+
bytes[..stored.len()].copy_from_slice(stored);
|
|
134
|
+
CellValue::Inline {
|
|
135
|
+
len: stored.len() as u8,
|
|
136
|
+
bytes,
|
|
137
|
+
}
|
|
138
|
+
} else if cell.from_source {
|
|
139
|
+
match source.map(Source::pin_value) {
|
|
140
|
+
Some(Pinned::Arena(slice)) => CellValue::Arena {
|
|
141
|
+
slice,
|
|
142
|
+
_view: pin(),
|
|
143
|
+
},
|
|
144
|
+
Some(Pinned::Block(c)) => CellValue::Block(c),
|
|
145
|
+
None => CellValue::Owned(stored.to_vec()),
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
CellValue::Owned(stored.to_vec())
|
|
149
|
+
};
|
|
150
|
+
Self { ts: cell.ts, value }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/// A separated value read from its blob file: pinned in the block cache, or copied when
|
|
154
|
+
/// small.
|
|
155
|
+
fn from_blob(ts: Timestamp, value: pigeonhole_cache::Cell) -> Self {
|
|
156
|
+
let bytes: &[u8] = &value;
|
|
157
|
+
if bytes.len() <= Self::INLINE_MAX {
|
|
158
|
+
let mut inline = [0u8; Self::INLINE_MAX];
|
|
159
|
+
inline[..bytes.len()].copy_from_slice(bytes);
|
|
160
|
+
return Self {
|
|
161
|
+
ts,
|
|
162
|
+
value: CellValue::Inline {
|
|
163
|
+
len: bytes.len() as u8,
|
|
164
|
+
bytes: inline,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
Self {
|
|
169
|
+
ts,
|
|
170
|
+
value: CellValue::Block(value),
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/// Builds a cell from a resolved one that the caller would copy (small, or buffered by
|
|
175
|
+
/// the resolver), reading a separated value from its blob file first.
|
|
176
|
+
pub(crate) fn resolved(
|
|
177
|
+
cell: &ResolvedCell<'_>,
|
|
178
|
+
ssts: &SstSet,
|
|
179
|
+
pin: impl FnOnce() -> Arc<View>,
|
|
180
|
+
) -> Result<Self> {
|
|
181
|
+
Ok(match ssts.read_blob(cell.value)? {
|
|
182
|
+
Some(v) => Self::from_blob(cell.ts, v),
|
|
183
|
+
None => Self::from_cell(cell, None, pin),
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
fn from_pinned(ts: Timestamp, value: &LaneValue, pin: impl FnOnce() -> Arc<View>) -> Self {
|
|
188
|
+
let bytes: &[u8] = value;
|
|
189
|
+
if bytes.len() <= Self::INLINE_MAX {
|
|
190
|
+
let mut inline = [0u8; Self::INLINE_MAX];
|
|
191
|
+
inline[..bytes.len()].copy_from_slice(bytes);
|
|
192
|
+
return Self {
|
|
193
|
+
ts,
|
|
194
|
+
value: CellValue::Inline {
|
|
195
|
+
len: bytes.len() as u8,
|
|
196
|
+
bytes: inline,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
let value = match value {
|
|
201
|
+
LaneValue::Copied(v) => CellValue::Owned(v.clone()),
|
|
202
|
+
LaneValue::Pinned(Pinned::Arena(slice)) => CellValue::Arena {
|
|
203
|
+
slice: slice.clone(),
|
|
204
|
+
_view: pin(),
|
|
205
|
+
},
|
|
206
|
+
LaneValue::Pinned(Pinned::Block(c)) => CellValue::Block(c.clone()),
|
|
207
|
+
};
|
|
208
|
+
Self { ts, value }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/// A copy of `stored` at `ts` (the row cache's hits, D201).
|
|
212
|
+
pub(crate) fn copied(ts: Timestamp, stored: &[u8]) -> Self {
|
|
213
|
+
let mut data = Self::EMPTY;
|
|
214
|
+
if stored.len() <= Self::INLINE_MAX {
|
|
215
|
+
data.set_inline(ts, stored);
|
|
216
|
+
} else {
|
|
217
|
+
data.ts = ts;
|
|
218
|
+
data.value = CellValue::Owned(stored.to_vec());
|
|
219
|
+
}
|
|
220
|
+
data
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/// Timestamp of this version.
|
|
224
|
+
pub fn timestamp(&self) -> Timestamp {
|
|
225
|
+
self.ts
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/// The stored value (tag byte included).
|
|
229
|
+
pub fn stored(&self) -> &[u8] {
|
|
230
|
+
match &self.value {
|
|
231
|
+
CellValue::Inline { len, bytes } => &bytes[..usize::from(*len)],
|
|
232
|
+
CellValue::Arena { slice, .. } => slice,
|
|
233
|
+
CellValue::Block(c) => c,
|
|
234
|
+
CellValue::Owned(v) => v,
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/// The decoded value. Never [`ValueRef::Blob`]: separated values are resolved on read.
|
|
239
|
+
pub fn value(&self) -> ValueRef<'_> {
|
|
240
|
+
decode_value(self.stored()).unwrap_or(ValueRef::Bytes(&[]))
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/// What part of a row (or of each scanned row) to read. Built once per read.
|
|
245
|
+
#[derive(Debug, Clone, Default)]
|
|
246
|
+
#[non_exhaustive]
|
|
247
|
+
pub struct ReadSpec {
|
|
248
|
+
/// Families to read, in this order; empty means every family of the table.
|
|
249
|
+
pub families: Vec<FamilyId>,
|
|
250
|
+
/// Qualifier selection (pushed into the block decoder).
|
|
251
|
+
pub qualifiers: QualifierFilter,
|
|
252
|
+
/// Versions per column (1 = latest; 0 = all retained).
|
|
253
|
+
pub versions: u32,
|
|
254
|
+
/// Keep versions with `min <= ts < max` (pushed into the block decoder, or applied to
|
|
255
|
+
/// resolved versions on a family with a merge operator, decision D82).
|
|
256
|
+
pub time_range: Option<(Timestamp, Timestamp)>,
|
|
257
|
+
/// Columns per row and family (0 = unlimited); the rest of the row is skipped.
|
|
258
|
+
pub columns_per_row: u32,
|
|
259
|
+
/// Keep only cells whose value matches.
|
|
260
|
+
pub value: Option<ValuePredicate>,
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
impl ReadSpec {
|
|
264
|
+
/// The resolver options and entry filter for one family under this spec.
|
|
265
|
+
pub(crate) fn resolve_opts(
|
|
266
|
+
&self,
|
|
267
|
+
meta: &FamilyMeta,
|
|
268
|
+
snapshot: Seqno,
|
|
269
|
+
now: Timestamp,
|
|
270
|
+
) -> (ResolveOptions, ScanFilter) {
|
|
271
|
+
let mut opts = ResolveOptions::new(snapshot, now);
|
|
272
|
+
opts.ttl_micros = meta.options.ttl_micros;
|
|
273
|
+
// Decision D76: the caller folds the family's max_versions in (0 = unlimited).
|
|
274
|
+
opts.versions = match (meta.options.max_versions, self.versions) {
|
|
275
|
+
(0, v) => v,
|
|
276
|
+
(m, 0) => m,
|
|
277
|
+
(m, v) => m.min(v),
|
|
278
|
+
};
|
|
279
|
+
opts.columns_per_row = self.columns_per_row;
|
|
280
|
+
opts.value = self.value.clone();
|
|
281
|
+
opts.merge = meta.merge_op.clone();
|
|
282
|
+
opts.counter = meta.options.kind.is_aggregate();
|
|
283
|
+
let mut filter = ScanFilter::all();
|
|
284
|
+
filter.qualifiers = self.qualifiers.clone();
|
|
285
|
+
opts.route_time_range(&mut filter, self.time_range);
|
|
286
|
+
(opts, filter)
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/// Reads separated values for the resolver (`ResolveOptions::blobs`): a value predicate
|
|
291
|
+
/// tests the value, and a merge operator folds onto the value, not its pointer. The resolver
|
|
292
|
+
/// cannot fail through the hook, so the first error is kept here and the read reports it
|
|
293
|
+
/// after each resolver step ([`ResolverBlobs::check`]).
|
|
294
|
+
#[derive(Debug)]
|
|
295
|
+
pub(crate) struct ResolverBlobs {
|
|
296
|
+
ssts: Arc<SstSet>,
|
|
297
|
+
error: Mutex<Option<Error>>,
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
impl ResolverBlobs {
|
|
301
|
+
/// Sets `opts.blobs` when the resolver may need a separated value and `ssts` names blob
|
|
302
|
+
/// files; returns the handle to check after each resolver step. It may need one for a
|
|
303
|
+
/// value predicate, or to fold operands onto a separated base: under an application's
|
|
304
|
+
/// operator, or a built-in one whose kind's values may be separated (a bloom filter,
|
|
305
|
+
/// D298 §4.1; `catalog::folds_separated_bases`). The other built-in operators never see
|
|
306
|
+
/// a separated base: their kinds' values stay inline (`FamilyKind::values_stay_inline`),
|
|
307
|
+
/// and a standard family's `i64` add rejects every base that is not a stored `i64`, which
|
|
308
|
+
/// a separated value never is. Skipping it keeps their reads free of the hook.
|
|
309
|
+
pub(crate) fn attach(opts: &mut ResolveOptions, ssts: &Arc<SstSet>) -> Option<Arc<Self>> {
|
|
310
|
+
let folds = opts.merge.as_ref().is_some_and(|m| {
|
|
311
|
+
crate::catalog::builtin_kind(m.name()).is_none_or(crate::catalog::folds_separated_bases)
|
|
312
|
+
});
|
|
313
|
+
if !(opts.value.is_some() || folds) || !ssts.has_blobs() {
|
|
314
|
+
return None;
|
|
315
|
+
}
|
|
316
|
+
let blobs = Arc::new(Self {
|
|
317
|
+
ssts: Arc::clone(ssts),
|
|
318
|
+
error: Mutex::new(None),
|
|
319
|
+
});
|
|
320
|
+
opts.blobs = Some(Arc::clone(&blobs) as Arc<dyn BlobFetch>);
|
|
321
|
+
Some(blobs)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/// Fails with the first error a fetch hit.
|
|
325
|
+
pub(crate) fn check(blobs: Option<&Arc<Self>>) -> Result<()> {
|
|
326
|
+
match blobs.and_then(|b| {
|
|
327
|
+
b.error
|
|
328
|
+
.lock()
|
|
329
|
+
.unwrap_or_else(PoisonError::into_inner)
|
|
330
|
+
.take()
|
|
331
|
+
}) {
|
|
332
|
+
Some(e) => Err(e),
|
|
333
|
+
None => Ok(()),
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
impl BlobFetch for ResolverBlobs {
|
|
339
|
+
fn fetch(&self, ptr: &BlobPointer) -> Option<pigeonhole_cache::Cell> {
|
|
340
|
+
match self.ssts.read_pointer(ptr) {
|
|
341
|
+
Ok(v) => Some(v),
|
|
342
|
+
Err(e) => {
|
|
343
|
+
let mut slot = self.error.lock().unwrap_or_else(PoisonError::into_inner);
|
|
344
|
+
if slot.is_none() {
|
|
345
|
+
*slot = Some(e);
|
|
346
|
+
}
|
|
347
|
+
None
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/// A row-range scan.
|
|
354
|
+
#[derive(Debug, Clone)]
|
|
355
|
+
#[non_exhaustive]
|
|
356
|
+
pub struct ScanSpec {
|
|
357
|
+
/// Start of the row range.
|
|
358
|
+
pub start: Bound<Vec<u8>>,
|
|
359
|
+
/// End of the row range.
|
|
360
|
+
pub end: Bound<Vec<u8>>,
|
|
361
|
+
/// Per-row selection.
|
|
362
|
+
pub read: ReadSpec,
|
|
363
|
+
/// Stop after this many rows (0 = unlimited).
|
|
364
|
+
pub limit: u64,
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
impl ScanSpec {
|
|
368
|
+
/// Every row in `[start, end)` with the default projection.
|
|
369
|
+
pub fn new(start: Bound<Vec<u8>>, end: Bound<Vec<u8>>) -> Self {
|
|
370
|
+
Self {
|
|
371
|
+
start,
|
|
372
|
+
end,
|
|
373
|
+
read: ReadSpec::default(),
|
|
374
|
+
limit: 0,
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/// One cell of a row read. Its qualifier is a range of [`RowData::qualifiers`], so a row
|
|
380
|
+
/// read allocates a few buffers, not one per cell.
|
|
381
|
+
#[derive(Debug, Clone)]
|
|
382
|
+
pub struct RowCell {
|
|
383
|
+
/// Family.
|
|
384
|
+
pub family: FamilyId,
|
|
385
|
+
/// Qualifier bytes (unescaped) within [`RowData::qualifiers`].
|
|
386
|
+
pub qualifier: std::ops::Range<u32>,
|
|
387
|
+
/// Version and value.
|
|
388
|
+
pub data: CellData,
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/// The result of a row read: cells ordered by family (in [`ReadSpec::families`] order), then
|
|
392
|
+
/// qualifier, then newest version first.
|
|
393
|
+
#[derive(Debug, Clone, Default)]
|
|
394
|
+
pub struct RowData {
|
|
395
|
+
/// Row key.
|
|
396
|
+
pub row: Vec<u8>,
|
|
397
|
+
/// Every qualifier of the row, concatenated; cells refer to ranges of it.
|
|
398
|
+
pub qualifiers: Vec<u8>,
|
|
399
|
+
/// Cells.
|
|
400
|
+
pub cells: Vec<RowCell>,
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
impl RowData {
|
|
404
|
+
/// The qualifier of `cell`.
|
|
405
|
+
pub fn qualifier(&self, cell: &RowCell) -> &[u8] {
|
|
406
|
+
&self.qualifiers[cell.qualifier.start as usize..cell.qualifier.end as usize]
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/// Where a row read puts the cells it resolves ([`Engine::read_row_into_families`](crate::Engine::read_row_into_families)),
|
|
411
|
+
/// in order: by family (in [`ReadSpec::families`] order), then qualifier, newest version
|
|
412
|
+
/// first. A caller's own row buffer can take them directly, without an intermediate
|
|
413
|
+
/// [`RowData`] (#287).
|
|
414
|
+
pub trait RowSink {
|
|
415
|
+
/// The buffer qualifiers are unescaped into, one after another.
|
|
416
|
+
fn qualifiers(&mut self) -> &mut Vec<u8>;
|
|
417
|
+
/// Appends a cell of `family` whose qualifier is `qualifier` within
|
|
418
|
+
/// [`RowSink::qualifiers`].
|
|
419
|
+
fn push(&mut self, family: FamilyId, qualifier: std::ops::Range<usize>, data: CellData);
|
|
420
|
+
/// Appends a cell whose value is a copy of `stored` (at most [`CellData::INLINE_MAX`]
|
|
421
|
+
/// bytes). Sinks that store cells in a vector override this to build the cell in place
|
|
422
|
+
/// rather than move it (#287).
|
|
423
|
+
fn push_inline(
|
|
424
|
+
&mut self,
|
|
425
|
+
family: FamilyId,
|
|
426
|
+
qualifier: std::ops::Range<usize>,
|
|
427
|
+
ts: Timestamp,
|
|
428
|
+
stored: &[u8],
|
|
429
|
+
) {
|
|
430
|
+
let mut data = CellData::EMPTY;
|
|
431
|
+
data.set_inline(ts, stored);
|
|
432
|
+
self.push(family, qualifier, data);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/// Whether the sink takes no more cells: a row read stops before its next cell. The row
|
|
436
|
+
/// cache's fill uses it to stop reading a row once it is past the cache's row cap (an
|
|
437
|
+
/// oversize row is never stored, so reading it whole is waste, #1059). Never, by default.
|
|
438
|
+
#[inline]
|
|
439
|
+
fn full(&self) -> bool {
|
|
440
|
+
false
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/// How many cells this sink holds, for the row cache to read back what a read pushed
|
|
444
|
+
/// (D201). `None` (the default): the sink cannot report them, and its reads are not
|
|
445
|
+
/// stored in the row cache.
|
|
446
|
+
fn cell_count(&self) -> Option<usize> {
|
|
447
|
+
None
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/// Cell `i`: its qualifier and data (see [`RowSink::cell_count`]).
|
|
451
|
+
fn cell(&self, i: usize) -> Option<(&[u8], &CellData)> {
|
|
452
|
+
let _ = i;
|
|
453
|
+
None
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
impl RowSink for RowData {
|
|
458
|
+
fn qualifiers(&mut self) -> &mut Vec<u8> {
|
|
459
|
+
&mut self.qualifiers
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
fn push(&mut self, family: FamilyId, qualifier: std::ops::Range<usize>, data: CellData) {
|
|
463
|
+
self.cells.push(RowCell {
|
|
464
|
+
family,
|
|
465
|
+
qualifier: qualifier.start as u32..qualifier.end as u32,
|
|
466
|
+
data,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
fn push_inline(
|
|
471
|
+
&mut self,
|
|
472
|
+
family: FamilyId,
|
|
473
|
+
qualifier: std::ops::Range<usize>,
|
|
474
|
+
ts: Timestamp,
|
|
475
|
+
stored: &[u8],
|
|
476
|
+
) {
|
|
477
|
+
self.cells.push(RowCell {
|
|
478
|
+
family,
|
|
479
|
+
qualifier: qualifier.start as u32..qualifier.end as u32,
|
|
480
|
+
data: CellData::EMPTY,
|
|
481
|
+
});
|
|
482
|
+
if let Some(c) = self.cells.last_mut() {
|
|
483
|
+
c.data.set_inline(ts, stored);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
fn cell_count(&self) -> Option<usize> {
|
|
488
|
+
Some(self.cells.len())
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
fn cell(&self, i: usize) -> Option<(&[u8], &CellData)> {
|
|
492
|
+
let c = self.cells.get(i)?;
|
|
493
|
+
Some((self.qualifier(c), &c.data))
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/// The column prefix of a resolved cell's key (escaped row, terminator, escaped qualifier,
|
|
498
|
+
/// terminator).
|
|
499
|
+
pub(crate) fn column_of(key: &[u8]) -> &[u8] {
|
|
500
|
+
&key[..key.len().saturating_sub(SUFFIX_LEN)]
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/// The escaped row inside a column prefix (without its terminator).
|
|
504
|
+
pub(crate) fn row_of(column: &[u8]) -> &[u8] {
|
|
505
|
+
let n = row_prefix_len(column).unwrap_or(column.len());
|
|
506
|
+
&column[..n.saturating_sub(2)]
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/// The smallest key past every key of the row whose prefix is `prefix` (the terminator's
|
|
510
|
+
/// last byte bumped), appended to `out`.
|
|
511
|
+
pub(crate) fn past_row(prefix: &[u8], out: &mut Vec<u8>) {
|
|
512
|
+
out.extend_from_slice(prefix);
|
|
513
|
+
if let Some(last) = out.last_mut() {
|
|
514
|
+
*last += 1;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/// Maps a resolver error for `meta`: the shared resolver reports a missing operator as a
|
|
519
|
+
/// merge error; the engine promises `UnknownMergeOperator` for such reads.
|
|
520
|
+
pub(crate) fn read_error(e: Error, meta: &FamilyMeta) -> Error {
|
|
521
|
+
match (e, meta.merge) {
|
|
522
|
+
(Error::Merge(_), MergeKind::Unknown) => {
|
|
523
|
+
Error::UnknownMergeOperator(meta.options.merge_operator.clone())
|
|
524
|
+
}
|
|
525
|
+
(e, _) => e,
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/// A cell borrowed from a [`ScanCursor`]; valid until the cursor moves.
|
|
530
|
+
#[derive(Debug, Clone, Copy)]
|
|
531
|
+
pub struct ScanCell<'a> {
|
|
532
|
+
/// Family.
|
|
533
|
+
pub family: FamilyId,
|
|
534
|
+
/// Qualifier (unescaped; may borrow the cursor's scratch buffer).
|
|
535
|
+
pub qualifier: &'a [u8],
|
|
536
|
+
/// Timestamp.
|
|
537
|
+
pub ts: Timestamp,
|
|
538
|
+
/// Stored value (tag byte included).
|
|
539
|
+
pub stored: &'a [u8],
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/// A scan's `[start, end)` as encoded row prefixes (`None` = unbounded).
|
|
543
|
+
type RowBounds = (Option<Vec<u8>>, Option<Vec<u8>>);
|
|
544
|
+
|
|
545
|
+
/// A lane's held value.
|
|
546
|
+
#[derive(Debug)]
|
|
547
|
+
enum LaneValue {
|
|
548
|
+
Copied(Vec<u8>),
|
|
549
|
+
Pinned(Pinned),
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
impl std::ops::Deref for LaneValue {
|
|
553
|
+
type Target = [u8];
|
|
554
|
+
|
|
555
|
+
fn deref(&self) -> &[u8] {
|
|
556
|
+
match self {
|
|
557
|
+
LaneValue::Copied(v) => v,
|
|
558
|
+
LaneValue::Pinned(p) => p,
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/// The resolver of one family within one tablet, plus the cell it holds but has not handed
|
|
564
|
+
/// out yet.
|
|
565
|
+
struct Lane {
|
|
566
|
+
family: FamilyId,
|
|
567
|
+
/// The family's merge operator name when the build does not know it (to name it in the
|
|
568
|
+
/// error a merge then fails with), `None` otherwise: no copy of the family's metadata.
|
|
569
|
+
unknown_merge: Option<String>,
|
|
570
|
+
resolver: Resolver,
|
|
571
|
+
/// A value the resolver buffered was too large to keep its buffers for the next scan.
|
|
572
|
+
grew: bool,
|
|
573
|
+
/// The view's SSTs and blob files, to read separated values.
|
|
574
|
+
ssts: Arc<SstSet>,
|
|
575
|
+
/// The resolver's blob reads, if it may need any.
|
|
576
|
+
resolver_blobs: Option<Arc<ResolverBlobs>>,
|
|
577
|
+
/// The held cell is the resolver's current one (`CellResolver::current`, valid while
|
|
578
|
+
/// `pending`), not a copy: its timestamp, and its value pinned when it is separated or a
|
|
579
|
+
/// large value borrowed from a source.
|
|
580
|
+
ts: Timestamp,
|
|
581
|
+
pinned: Option<LaneValue>,
|
|
582
|
+
pending: bool,
|
|
583
|
+
done: bool,
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
impl std::fmt::Debug for Lane {
|
|
587
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
588
|
+
f.debug_struct("Lane")
|
|
589
|
+
.field("family", &self.family)
|
|
590
|
+
.field("pending", &self.pending)
|
|
591
|
+
.finish()
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
impl Lane {
|
|
596
|
+
/// Moves to the next visible cell. The lane holds it where the resolver has it; only a
|
|
597
|
+
/// separated value (read from its blob file) or a large one borrowed from a source is
|
|
598
|
+
/// pinned.
|
|
599
|
+
fn fetch(&mut self) -> Result<()> {
|
|
600
|
+
self.pending = false;
|
|
601
|
+
self.pinned = None;
|
|
602
|
+
if self.done {
|
|
603
|
+
return Ok(());
|
|
604
|
+
}
|
|
605
|
+
let (from_source, len) = {
|
|
606
|
+
let next = self.resolver.next_cell();
|
|
607
|
+
ResolverBlobs::check(self.resolver_blobs.as_ref())?;
|
|
608
|
+
let Some(cell) = next.map_err(|e| match (e, &self.unknown_merge) {
|
|
609
|
+
(Error::Merge(_), Some(name)) => Error::UnknownMergeOperator(name.clone()),
|
|
610
|
+
(e, _) => e,
|
|
611
|
+
})?
|
|
612
|
+
else {
|
|
613
|
+
self.done = true;
|
|
614
|
+
return Ok(());
|
|
615
|
+
};
|
|
616
|
+
self.ts = cell.ts;
|
|
617
|
+
if let Some(v) = self.ssts.read_blob(cell.value)? {
|
|
618
|
+
self.pinned = Some(LaneValue::Pinned(Pinned::Block(v)));
|
|
619
|
+
}
|
|
620
|
+
(cell.from_source, cell.value.len())
|
|
621
|
+
};
|
|
622
|
+
// Large values only (one branch per cell): a source's is pinned where it lies; one
|
|
623
|
+
// the resolver buffered marks its buffers too large to keep for the next scan.
|
|
624
|
+
if len > CellData::INLINE_MAX {
|
|
625
|
+
if !from_source {
|
|
626
|
+
self.grew |= len > KEEP_BUFFERS_BELOW;
|
|
627
|
+
} else if self.pinned.is_none() {
|
|
628
|
+
let src = self
|
|
629
|
+
.resolver
|
|
630
|
+
.cursor()
|
|
631
|
+
.current()
|
|
632
|
+
.expect("the merged cursor is on the returned entry");
|
|
633
|
+
self.pinned = Some(LaneValue::Pinned(src.pin_value()));
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
self.pending = true;
|
|
637
|
+
Ok(())
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/// The held cell's column prefix (only while `pending`).
|
|
641
|
+
fn col(&self) -> &[u8] {
|
|
642
|
+
self.resolver.current().map_or(&[], |c| column_of(c.key))
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/// The held cell's stored value (only while `pending`).
|
|
646
|
+
fn value(&self) -> &[u8] {
|
|
647
|
+
match &self.pinned {
|
|
648
|
+
Some(v) => v,
|
|
649
|
+
None => self.resolver.current().map_or(&[], |c| c.value),
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/// The held cell as a [`CellData`]: a large value stays pinned when it is, and is
|
|
654
|
+
/// copied otherwise (a large merge result the resolver buffered).
|
|
655
|
+
fn data(&self, pin: impl FnOnce() -> Arc<View>) -> CellData {
|
|
656
|
+
match &self.pinned {
|
|
657
|
+
Some(v) => CellData::from_pinned(self.ts, v, pin),
|
|
658
|
+
None => CellData::from_pinned(self.ts, &LaneValue::Copied(self.value().to_vec()), pin),
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
/// An ordered scan over a snapshot: walks tablets in key order and, per family, a resolver
|
|
664
|
+
/// over a merge of the owning sources (memtables and SSTs) stored inside the cursor beside
|
|
665
|
+
/// the snapshot that keeps them valid. Rows come out in order; within a row, cells come out
|
|
666
|
+
/// by family, qualifier, newest first.
|
|
667
|
+
#[derive(Debug)]
|
|
668
|
+
pub struct ScanCursor {
|
|
669
|
+
snapshot: Snapshot,
|
|
670
|
+
spec: ScanSpec,
|
|
671
|
+
families: Vec<FamilyId>,
|
|
672
|
+
now: Timestamp,
|
|
673
|
+
table: TableId,
|
|
674
|
+
/// Index of the next tablet to scan among the table's tablets in the snapshot's view.
|
|
675
|
+
next_tablet: usize,
|
|
676
|
+
/// The scan's start and end as row-prefix bounds, encoded on the first tablet.
|
|
677
|
+
bounds: Option<RowBounds>,
|
|
678
|
+
/// The bounds clamped to the current tablet (reused buffers).
|
|
679
|
+
lo: Vec<u8>,
|
|
680
|
+
hi: Vec<u8>,
|
|
681
|
+
lanes: Vec<Lane>,
|
|
682
|
+
/// Escaped and unescaped current row.
|
|
683
|
+
row_esc: Vec<u8>,
|
|
684
|
+
row: Vec<u8>,
|
|
685
|
+
in_row: bool,
|
|
686
|
+
rows_emitted: u64,
|
|
687
|
+
/// Next lane to look at for the current row.
|
|
688
|
+
lane_idx: usize,
|
|
689
|
+
/// The lane whose cell was handed out last (advanced before the next cell).
|
|
690
|
+
last_lane: Option<usize>,
|
|
691
|
+
qual_buf: Vec<u8>,
|
|
692
|
+
done: bool,
|
|
693
|
+
/// An async scan's state (`Engine::scan_async`), `None` for a sync one.
|
|
694
|
+
nb: Option<Box<AsyncScan>>,
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/// What an async scan keeps between polls (D196, #398).
|
|
698
|
+
struct AsyncScan {
|
|
699
|
+
shared: Arc<crate::shard::Shared>,
|
|
700
|
+
fetch: Option<(pigeonhole_io::Completion, Box<pigeonhole_sst::Fetch>)>,
|
|
701
|
+
/// Blocks it fetched and has not stepped past yet.
|
|
702
|
+
pinned: Vec<pigeonhole_cache::BlockHandle>,
|
|
703
|
+
/// Fetches while positioning the current tablet: past `MAX_POSITION_FETCHES`, or when
|
|
704
|
+
/// the cache keeps nothing, it positions synchronously (counted).
|
|
705
|
+
fetches: u32,
|
|
706
|
+
sync: bool,
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
impl std::fmt::Debug for AsyncScan {
|
|
710
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
711
|
+
f.debug_struct("AsyncScan")
|
|
712
|
+
.field("fetching", &self.fetch.is_some())
|
|
713
|
+
.field("pinned", &self.pinned.len())
|
|
714
|
+
.field("sync", &self.sync)
|
|
715
|
+
.finish()
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/// Fetches an async scan makes positioning one tablet before it positions synchronously.
|
|
720
|
+
const MAX_POSITION_FETCHES: u32 = 64;
|
|
721
|
+
|
|
722
|
+
impl ScanCursor {
|
|
723
|
+
pub(crate) fn new(
|
|
724
|
+
snapshot: Snapshot,
|
|
725
|
+
table: TableId,
|
|
726
|
+
spec: ScanSpec,
|
|
727
|
+
families: Vec<FamilyId>,
|
|
728
|
+
now: Timestamp,
|
|
729
|
+
) -> Self {
|
|
730
|
+
Self {
|
|
731
|
+
snapshot,
|
|
732
|
+
spec,
|
|
733
|
+
families,
|
|
734
|
+
now,
|
|
735
|
+
table,
|
|
736
|
+
next_tablet: 0,
|
|
737
|
+
bounds: None,
|
|
738
|
+
lo: Vec::new(),
|
|
739
|
+
hi: Vec::new(),
|
|
740
|
+
lanes: Vec::new(),
|
|
741
|
+
row_esc: Vec::new(),
|
|
742
|
+
row: Vec::new(),
|
|
743
|
+
in_row: false,
|
|
744
|
+
rows_emitted: 0,
|
|
745
|
+
lane_idx: 0,
|
|
746
|
+
last_lane: None,
|
|
747
|
+
qual_buf: Vec::new(),
|
|
748
|
+
done: false,
|
|
749
|
+
nb: None,
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/// The next row of an async scan ([`Engine::scan_async`](crate::Engine::scan_async)):
|
|
754
|
+
/// `Ready(Ok(true))` when the cursor is on a row (read its cells, inside
|
|
755
|
+
/// [`ScanCursor::counted`]), `Ready(Ok(false))` at the end.
|
|
756
|
+
///
|
|
757
|
+
/// Each tablet is positioned cache-only: its cursors' seeks and first cells read only
|
|
758
|
+
/// cached blocks, and what they miss is fetched asynchronously before positioning again
|
|
759
|
+
/// (a position can be redone, as a get can). Then each step first fetches the blocks the
|
|
760
|
+
/// SST cursors will read next, if uncached (one ahead per cursor, only as the scan is
|
|
761
|
+
/// polled), and steps synchronously: a block it still misses (not predicted) is read
|
|
762
|
+
/// synchronously and counted in `Metrics::async_sync_reads` (D196, #398). On a sync
|
|
763
|
+
/// cursor this is `next_row`.
|
|
764
|
+
pub fn poll_next_row(
|
|
765
|
+
&mut self,
|
|
766
|
+
cx: &mut std::task::Context<'_>,
|
|
767
|
+
) -> std::task::Poll<Result<bool>> {
|
|
768
|
+
let _poll = pigeonhole_io::async_poll_scope();
|
|
769
|
+
use std::future::Future;
|
|
770
|
+
use std::sync::atomic::Ordering;
|
|
771
|
+
use std::task::Poll;
|
|
772
|
+
let Some(mut nb) = self.nb.take() else {
|
|
773
|
+
return Poll::Ready(self.next_row());
|
|
774
|
+
};
|
|
775
|
+
let out = loop {
|
|
776
|
+
if let Some((completion, fetch)) = &mut nb.fetch {
|
|
777
|
+
let buf = match std::pin::Pin::new(completion).poll(cx) {
|
|
778
|
+
Poll::Pending => {
|
|
779
|
+
self.nb = Some(nb);
|
|
780
|
+
return Poll::Pending;
|
|
781
|
+
}
|
|
782
|
+
Poll::Ready(r) => r,
|
|
783
|
+
};
|
|
784
|
+
let admitted = buf.map_err(Error::from).and_then(|b| Ok(fetch.admit(b)?));
|
|
785
|
+
let kept = fetch.is_kept();
|
|
786
|
+
nb.fetch = None;
|
|
787
|
+
match admitted {
|
|
788
|
+
Ok(h) => nb.pinned.extend(h),
|
|
789
|
+
Err(e) => break Err(e),
|
|
790
|
+
}
|
|
791
|
+
if !kept {
|
|
792
|
+
// The cache keeps nothing: prefetching or positioning cache-only would
|
|
793
|
+
// fetch the same block again; read synchronously from now on (counted).
|
|
794
|
+
nb.sync = true;
|
|
795
|
+
nb.shared.async_sync_reads.fetch_add(1, Ordering::Relaxed);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if self.done {
|
|
799
|
+
break Ok(false);
|
|
800
|
+
}
|
|
801
|
+
if self.lanes.is_empty() && !self.in_row && !nb.sync {
|
|
802
|
+
// Position the next tablet cache-only; on a miss, undo and fetch.
|
|
803
|
+
let tablet = self.next_tablet;
|
|
804
|
+
let positioned = self.open_next_tablet::<true>().and_then(|more| {
|
|
805
|
+
if more {
|
|
806
|
+
self.fill_lanes()?;
|
|
807
|
+
}
|
|
808
|
+
Ok(more)
|
|
809
|
+
});
|
|
810
|
+
match positioned {
|
|
811
|
+
Err(Error::WouldBlock(mut fetch)) => {
|
|
812
|
+
self.recycle_lanes();
|
|
813
|
+
self.next_tablet = tablet;
|
|
814
|
+
nb.fetches += 1;
|
|
815
|
+
if nb.fetches > MAX_POSITION_FETCHES {
|
|
816
|
+
nb.sync = true;
|
|
817
|
+
nb.shared.async_sync_reads.fetch_add(1, Ordering::Relaxed);
|
|
818
|
+
} else {
|
|
819
|
+
let completion = fetch.start();
|
|
820
|
+
nb.fetch = Some((completion, fetch));
|
|
821
|
+
}
|
|
822
|
+
continue;
|
|
823
|
+
}
|
|
824
|
+
Err(e) => break Err(e),
|
|
825
|
+
Ok(false) => {
|
|
826
|
+
self.done = true;
|
|
827
|
+
break Ok(false);
|
|
828
|
+
}
|
|
829
|
+
Ok(true) => {
|
|
830
|
+
nb.fetches = 0;
|
|
831
|
+
nb.pinned.clear();
|
|
832
|
+
for lane in &mut self.lanes {
|
|
833
|
+
for source in lane.resolver.cursor_mut().sources_mut() {
|
|
834
|
+
source.set_cache_only(false);
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
if !nb.sync {
|
|
841
|
+
// One block ahead per cursor; fetched one at a time.
|
|
842
|
+
let mut upcoming = Vec::new();
|
|
843
|
+
for lane in &self.lanes {
|
|
844
|
+
for source in lane.resolver.cursor().sources() {
|
|
845
|
+
source.upcoming(1, &mut upcoming);
|
|
846
|
+
if !upcoming.is_empty() {
|
|
847
|
+
break;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
if !upcoming.is_empty() {
|
|
851
|
+
break;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
if let Some(fetch) = upcoming.into_iter().next() {
|
|
855
|
+
let completion = fetch.submit();
|
|
856
|
+
nb.fetch = Some((completion, Box::new(fetch)));
|
|
857
|
+
continue;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
let ((stepped, blob_reads), file_reads) = pigeonhole_sst::counting_file_reads(|| {
|
|
861
|
+
as_async_read(false, || {
|
|
862
|
+
if nb.sync {
|
|
863
|
+
self.advance_row_impl::<true>()
|
|
864
|
+
} else {
|
|
865
|
+
self.advance_row_impl::<false>()
|
|
866
|
+
}
|
|
867
|
+
})
|
|
868
|
+
});
|
|
869
|
+
if blob_reads + file_reads > 0 {
|
|
870
|
+
nb.shared
|
|
871
|
+
.async_sync_reads
|
|
872
|
+
.fetch_add(blob_reads + file_reads, Ordering::Relaxed);
|
|
873
|
+
}
|
|
874
|
+
match stepped {
|
|
875
|
+
// The tablet ran out: position the next one.
|
|
876
|
+
Ok(None) => continue,
|
|
877
|
+
Ok(Some(row)) => {
|
|
878
|
+
// Blocks stepped past need not stay pinned.
|
|
879
|
+
nb.pinned.clear();
|
|
880
|
+
break Ok(row);
|
|
881
|
+
}
|
|
882
|
+
Err(e) => break Err(e),
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
self.nb = Some(nb);
|
|
886
|
+
Poll::Ready(self.snapshot.checked(out))
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/// Runs `f` on this cursor counting the file reads it makes synchronously into
|
|
890
|
+
/// `Metrics::async_sync_reads` (an async scan reading a row's cells after
|
|
891
|
+
/// [`ScanCursor::poll_next_row`]); on a sync cursor it just runs `f`.
|
|
892
|
+
pub fn counted<T>(&mut self, f: impl FnOnce(&mut Self) -> T) -> T {
|
|
893
|
+
let Some(shared) = self.nb.as_ref().map(|nb| Arc::clone(&nb.shared)) else {
|
|
894
|
+
return f(self);
|
|
895
|
+
};
|
|
896
|
+
let ((out, blob_reads), file_reads) =
|
|
897
|
+
pigeonhole_sst::counting_file_reads(|| as_async_read(false, || f(self)));
|
|
898
|
+
if blob_reads + file_reads > 0 {
|
|
899
|
+
shared.async_sync_reads.fetch_add(
|
|
900
|
+
blob_reads + file_reads,
|
|
901
|
+
std::sync::atomic::Ordering::Relaxed,
|
|
902
|
+
);
|
|
903
|
+
}
|
|
904
|
+
out
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
/// The cursor of an async scan ([`ScanCursor::poll_next_row`]).
|
|
908
|
+
pub(crate) fn into_async(mut self, shared: Arc<crate::shard::Shared>) -> Self {
|
|
909
|
+
self.nb = Some(Box::new(AsyncScan {
|
|
910
|
+
shared,
|
|
911
|
+
fetch: None,
|
|
912
|
+
pinned: Vec::new(),
|
|
913
|
+
fetches: 0,
|
|
914
|
+
sync: false,
|
|
915
|
+
}));
|
|
916
|
+
self
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
/// The scan's start and end as row-prefix bounds (`None` = unbounded).
|
|
920
|
+
fn bounds(&self) -> Result<RowBounds> {
|
|
921
|
+
let start = match &self.spec.start {
|
|
922
|
+
Bound::Included(s) | Bound::Excluded(s) => {
|
|
923
|
+
let mut k = Vec::new();
|
|
924
|
+
encode_row_prefix(&mut k, s)?;
|
|
925
|
+
Some(k)
|
|
926
|
+
}
|
|
927
|
+
Bound::Unbounded => None,
|
|
928
|
+
};
|
|
929
|
+
let end = match &self.spec.end {
|
|
930
|
+
Bound::Excluded(e) => {
|
|
931
|
+
let mut k = Vec::new();
|
|
932
|
+
encode_row_prefix(&mut k, e)?;
|
|
933
|
+
Some(k)
|
|
934
|
+
}
|
|
935
|
+
Bound::Included(e) => {
|
|
936
|
+
let mut k = Vec::new();
|
|
937
|
+
encode_row_prefix(&mut k, e)?;
|
|
938
|
+
let mut past = Vec::new();
|
|
939
|
+
past_row(&k, &mut past);
|
|
940
|
+
Some(past)
|
|
941
|
+
}
|
|
942
|
+
Bound::Unbounded => None,
|
|
943
|
+
};
|
|
944
|
+
Ok((start, end))
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
/// Builds the lanes for the next tablet, seeking each to the scan start. Returns false
|
|
948
|
+
/// when no tablet is left.
|
|
949
|
+
fn open_next_tablet<const CACHE_ONLY: bool>(&mut self) -> Result<bool> {
|
|
950
|
+
// A cursor taken before a fork stops in the child at its next tablet (#901).
|
|
951
|
+
self.snapshot.check_process()?;
|
|
952
|
+
self.recycle_lanes();
|
|
953
|
+
let view = Arc::clone(&self.snapshot.view);
|
|
954
|
+
let Some(tablet) = view.tablets().tablets_of(self.table).get(self.next_tablet) else {
|
|
955
|
+
return Ok(false);
|
|
956
|
+
};
|
|
957
|
+
self.next_tablet += 1;
|
|
958
|
+
if self.bounds.is_none() {
|
|
959
|
+
self.bounds = Some(self.bounds()?);
|
|
960
|
+
}
|
|
961
|
+
let (start, end) = self.bounds.as_ref().expect("encoded above");
|
|
962
|
+
// Clamp to the tablet: after a split, children share their parent's SSTs (D13), which
|
|
963
|
+
// hold rows of the sibling too.
|
|
964
|
+
let (has_lo, has_hi) = clamp_into(
|
|
965
|
+
tablet,
|
|
966
|
+
start.as_deref(),
|
|
967
|
+
end.as_deref(),
|
|
968
|
+
&mut self.lo,
|
|
969
|
+
&mut self.hi,
|
|
970
|
+
)?;
|
|
971
|
+
let (start, end) = (
|
|
972
|
+
has_lo.then_some(&self.lo[..]),
|
|
973
|
+
has_hi.then_some(&self.hi[..]),
|
|
974
|
+
);
|
|
975
|
+
if matches!((start, end), (Some(s), Some(e)) if s >= e) {
|
|
976
|
+
// No row of the scan is in this tablet: it opens with no lanes.
|
|
977
|
+
return Ok(true);
|
|
978
|
+
}
|
|
979
|
+
// A scan its limit leaves short starts its readahead later (D293). `.max(1)`: a scan
|
|
980
|
+
// that reached its limit opens no tablet (`advance_row_impl` stops first), so a 0
|
|
981
|
+
// here would only mean "no limit".
|
|
982
|
+
let short = crate::source::scan_is_short(if self.spec.limit == 0 {
|
|
983
|
+
0
|
|
984
|
+
} else {
|
|
985
|
+
self.spec.limit.saturating_sub(self.rows_emitted).max(1)
|
|
986
|
+
});
|
|
987
|
+
for &family in &self.families {
|
|
988
|
+
// Nothing of this family in the tablet: no resolver, options or sources for it (a
|
|
989
|
+
// table's empty families, #406). Located once, for the sources below too.
|
|
990
|
+
let located = view.locate(tablet.shard, tablet.id, family);
|
|
991
|
+
if !located.has_data() {
|
|
992
|
+
continue;
|
|
993
|
+
}
|
|
994
|
+
let Some(meta) = view.catalog.family(family) else {
|
|
995
|
+
continue;
|
|
996
|
+
};
|
|
997
|
+
let (mut opts, filter) =
|
|
998
|
+
self.spec
|
|
999
|
+
.read
|
|
1000
|
+
.resolve_opts(meta, self.snapshot.seqno, self.now);
|
|
1001
|
+
let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
|
|
1002
|
+
let mut resolver = take_scan_resolver();
|
|
1003
|
+
let filled = view.scan_sources_located::<CACHE_ONLY>(
|
|
1004
|
+
&located,
|
|
1005
|
+
&filter,
|
|
1006
|
+
start,
|
|
1007
|
+
end,
|
|
1008
|
+
short,
|
|
1009
|
+
resolver.cursor_mut().sources_mut(),
|
|
1010
|
+
);
|
|
1011
|
+
if let Err(e) = filled {
|
|
1012
|
+
// The sources filled so far go now, so the resolver pins nothing.
|
|
1013
|
+
give_back(resolver);
|
|
1014
|
+
return Err(e);
|
|
1015
|
+
}
|
|
1016
|
+
if resolver.cursor_mut().sources().is_empty() {
|
|
1017
|
+
// Nothing of this family in the tablet's range: no lane, so the scan does not
|
|
1018
|
+
// set one up, seek it or poll it per row (a table's empty families, #406).
|
|
1019
|
+
give_back(resolver);
|
|
1020
|
+
continue;
|
|
1021
|
+
}
|
|
1022
|
+
opts.skip_columns = skips_columns(resolver.cursor_mut().sources());
|
|
1023
|
+
resolver.cursor_mut().reset();
|
|
1024
|
+
resolver.reset(opts);
|
|
1025
|
+
resolver.set_upper_bound(end);
|
|
1026
|
+
self.lanes.push(Lane {
|
|
1027
|
+
family,
|
|
1028
|
+
unknown_merge: (meta.merge == MergeKind::Unknown)
|
|
1029
|
+
.then(|| meta.options.merge_operator.clone()),
|
|
1030
|
+
resolver,
|
|
1031
|
+
grew: false,
|
|
1032
|
+
ssts: Arc::clone(&view.ssts),
|
|
1033
|
+
resolver_blobs,
|
|
1034
|
+
ts: 0,
|
|
1035
|
+
pinned: None,
|
|
1036
|
+
pending: false,
|
|
1037
|
+
done: false,
|
|
1038
|
+
});
|
|
1039
|
+
// A failed seek leaves the lane in place; its sources go with the others.
|
|
1040
|
+
let lane = self.lanes.last_mut().expect("pushed above");
|
|
1041
|
+
match start {
|
|
1042
|
+
Some(s) => lane.resolver.seek(s)?,
|
|
1043
|
+
None => lane.resolver.seek(&[])?,
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
Ok(true)
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
/// Ends the current lanes: each resolver goes back to the thread's pool for the next
|
|
1050
|
+
/// lanes, unless a large value grew its buffers.
|
|
1051
|
+
fn recycle_lanes(&mut self) {
|
|
1052
|
+
for lane in self.lanes.drain(..) {
|
|
1053
|
+
if !lane.grew {
|
|
1054
|
+
give_back(lane.resolver);
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
/// Makes sure every lane either holds a pending cell or is exhausted.
|
|
1060
|
+
fn fill_lanes(&mut self) -> Result<()> {
|
|
1061
|
+
for lane in &mut self.lanes {
|
|
1062
|
+
if !lane.pending && !lane.done {
|
|
1063
|
+
lane.fetch()?;
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
Ok(())
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
/// Whether `row` (unescaped) is past the end bound.
|
|
1070
|
+
fn past_end(&self, row: &[u8]) -> bool {
|
|
1071
|
+
match &self.spec.end {
|
|
1072
|
+
Bound::Included(e) => row > e.as_slice(),
|
|
1073
|
+
Bound::Excluded(e) => row >= e.as_slice(),
|
|
1074
|
+
Bound::Unbounded => false,
|
|
1075
|
+
}
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
/// Drops the rest of the current row in every lane.
|
|
1079
|
+
fn skip_current_row(&mut self) -> Result<()> {
|
|
1080
|
+
// A column of the current row starts with its escaped row and the terminator (which
|
|
1081
|
+
// never occurs inside an escaped row): a prefix compare, no walk to find the row.
|
|
1082
|
+
let row_len = self.row_esc.len() + TERMINATOR.len();
|
|
1083
|
+
for lane in &mut self.lanes {
|
|
1084
|
+
let col = if lane.pending { lane.col() } else { &[] };
|
|
1085
|
+
if lane.pending
|
|
1086
|
+
&& col.len() >= row_len
|
|
1087
|
+
&& col.starts_with(&self.row_esc)
|
|
1088
|
+
&& col[self.row_esc.len()..row_len] == TERMINATOR
|
|
1089
|
+
{
|
|
1090
|
+
lane.pending = false;
|
|
1091
|
+
lane.resolver.skip_row()?;
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
Ok(())
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
/// Advances to the next row with at least one visible cell. Returns `false` at the end.
|
|
1098
|
+
/// In a reader process, fails with [`Error::SnapshotExpired`] once a writer restarted
|
|
1099
|
+
/// after the snapshot was taken.
|
|
1100
|
+
pub fn next_row(&mut self) -> Result<bool> {
|
|
1101
|
+
let advanced = self.advance_row();
|
|
1102
|
+
self.snapshot.checked(advanced)
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
fn advance_row(&mut self) -> Result<bool> {
|
|
1106
|
+
Ok(self.advance_row_impl::<true>()?.unwrap_or(false))
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
/// Advances to the next row; with `OPEN`, opening the next tablets as it needs them;
|
|
1110
|
+
/// without, `None` where it would open one (an async scan positions it cache-only first).
|
|
1111
|
+
// Inlined: as a separate function a sync scan measured about 3.5 instructions more per
|
|
1112
|
+
// row (#42).
|
|
1113
|
+
#[inline(always)]
|
|
1114
|
+
fn advance_row_impl<const OPEN: bool>(&mut self) -> Result<Option<bool>> {
|
|
1115
|
+
if self.done {
|
|
1116
|
+
return Ok(Some(false));
|
|
1117
|
+
}
|
|
1118
|
+
// A scan at its row limit is done: never read the next row just to stop there.
|
|
1119
|
+
if self.spec.limit != 0 && self.rows_emitted >= self.spec.limit {
|
|
1120
|
+
self.done = true;
|
|
1121
|
+
self.recycle_lanes();
|
|
1122
|
+
return Ok(Some(false));
|
|
1123
|
+
}
|
|
1124
|
+
// Drop whatever is left of the current row.
|
|
1125
|
+
if self.in_row {
|
|
1126
|
+
if let Some(i) = self.last_lane.take() {
|
|
1127
|
+
self.lanes[i].pending = false;
|
|
1128
|
+
}
|
|
1129
|
+
self.skip_current_row()?;
|
|
1130
|
+
self.in_row = false;
|
|
1131
|
+
}
|
|
1132
|
+
loop {
|
|
1133
|
+
if self.lanes.is_empty() {
|
|
1134
|
+
if !OPEN {
|
|
1135
|
+
return Ok(None);
|
|
1136
|
+
}
|
|
1137
|
+
if !self.open_next_tablet::<false>()? {
|
|
1138
|
+
self.done = true;
|
|
1139
|
+
return Ok(Some(false));
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
self.fill_lanes()?;
|
|
1143
|
+
// The smallest pending row across lanes.
|
|
1144
|
+
let mut best: Option<&[u8]> = None;
|
|
1145
|
+
for lane in &self.lanes {
|
|
1146
|
+
if !lane.pending {
|
|
1147
|
+
continue;
|
|
1148
|
+
}
|
|
1149
|
+
let row = row_of(lane.col());
|
|
1150
|
+
if best.is_none_or(|b| row < b) {
|
|
1151
|
+
best = Some(row);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
let Some(best) = best else {
|
|
1155
|
+
// This tablet is exhausted.
|
|
1156
|
+
self.recycle_lanes();
|
|
1157
|
+
continue;
|
|
1158
|
+
};
|
|
1159
|
+
self.row_esc.clear();
|
|
1160
|
+
self.row_esc.extend_from_slice(best);
|
|
1161
|
+
self.row.clear();
|
|
1162
|
+
Escaped::new(&self.row_esc).unescape_long_into(&mut self.row);
|
|
1163
|
+
if matches!(&self.spec.start, Bound::Excluded(s) if s.as_slice() == self.row.as_slice())
|
|
1164
|
+
{
|
|
1165
|
+
self.skip_current_row()?;
|
|
1166
|
+
continue;
|
|
1167
|
+
}
|
|
1168
|
+
if self.past_end(&self.row)
|
|
1169
|
+
|| (self.spec.limit != 0 && self.rows_emitted >= self.spec.limit)
|
|
1170
|
+
{
|
|
1171
|
+
self.done = true;
|
|
1172
|
+
self.recycle_lanes();
|
|
1173
|
+
return Ok(Some(false));
|
|
1174
|
+
}
|
|
1175
|
+
self.rows_emitted += 1;
|
|
1176
|
+
// Inside a tablet, a cursor created before a fork stops in the child within
|
|
1177
|
+
// `FORK_CHECK_ROWS` rows (#901, perf287's residual): not per row, which cost the
|
|
1178
|
+
// scan shapes 0.5%.
|
|
1179
|
+
if self.rows_emitted & (FORK_CHECK_ROWS - 1) == 0 {
|
|
1180
|
+
self.check_fork()?;
|
|
1181
|
+
}
|
|
1182
|
+
self.in_row = true;
|
|
1183
|
+
self.lane_idx = 0;
|
|
1184
|
+
self.last_lane = None;
|
|
1185
|
+
return Ok(Some(true));
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/// The writer-process snapshot's fork check (#901), out of line: it runs once every
|
|
1190
|
+
/// [`FORK_CHECK_ROWS`] rows.
|
|
1191
|
+
#[cold]
|
|
1192
|
+
#[inline(never)]
|
|
1193
|
+
fn check_fork(&self) -> Result<()> {
|
|
1194
|
+
self.snapshot.check_process()
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
/// The current row key.
|
|
1198
|
+
pub fn row(&self) -> &[u8] {
|
|
1199
|
+
&self.row
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
/// The next cell of the current row, or `None` when the row is done.
|
|
1203
|
+
pub fn next_cell(&mut self) -> Result<Option<ScanCell<'_>>> {
|
|
1204
|
+
let mut qual = std::mem::take(&mut self.qual_buf);
|
|
1205
|
+
qual.clear();
|
|
1206
|
+
let next = self.next_cell_into(&mut qual);
|
|
1207
|
+
self.qual_buf = qual;
|
|
1208
|
+
Ok(next?.map(|family| {
|
|
1209
|
+
let lane = &self.lanes[self.last_lane.expect("set by next_cell_into")];
|
|
1210
|
+
ScanCell {
|
|
1211
|
+
family,
|
|
1212
|
+
qualifier: &self.qual_buf,
|
|
1213
|
+
ts: lane.ts,
|
|
1214
|
+
stored: lane.value(),
|
|
1215
|
+
}
|
|
1216
|
+
}))
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/// Like [`ScanCursor::next_cell`], but appends the cell's unescaped qualifier to
|
|
1220
|
+
/// `qualifiers` (a caller's row buffer, saving a copy) and returns only its family;
|
|
1221
|
+
/// [`ScanCursor::current_data`] has its version and value.
|
|
1222
|
+
pub fn next_cell_into(&mut self, qualifiers: &mut Vec<u8>) -> Result<Option<FamilyId>> {
|
|
1223
|
+
if !self.in_row {
|
|
1224
|
+
return Ok(None);
|
|
1225
|
+
}
|
|
1226
|
+
if let Some(i) = self.last_lane.take() {
|
|
1227
|
+
let fetched = self.lanes[i].fetch();
|
|
1228
|
+
self.snapshot.checked(fetched)?;
|
|
1229
|
+
}
|
|
1230
|
+
// A column of the current row starts with its escaped row and the terminator (which
|
|
1231
|
+
// never occurs inside an escaped row).
|
|
1232
|
+
let row_len = self.row_esc.len() + TERMINATOR.len();
|
|
1233
|
+
while self.lane_idx < self.lanes.len() {
|
|
1234
|
+
let i = self.lane_idx;
|
|
1235
|
+
let lane = &self.lanes[i];
|
|
1236
|
+
let col = if lane.pending { lane.col() } else { &[] };
|
|
1237
|
+
if lane.pending
|
|
1238
|
+
&& col.len() >= row_len
|
|
1239
|
+
&& col.starts_with(&self.row_esc)
|
|
1240
|
+
&& col[self.row_esc.len()..row_len] == TERMINATOR
|
|
1241
|
+
{
|
|
1242
|
+
self.last_lane = Some(i);
|
|
1243
|
+
let end = col.len().saturating_sub(2).max(row_len);
|
|
1244
|
+
Escaped::new(&col[row_len..end]).unescape_into(qualifiers);
|
|
1245
|
+
return Ok(Some(lane.family));
|
|
1246
|
+
}
|
|
1247
|
+
self.lane_idx += 1;
|
|
1248
|
+
}
|
|
1249
|
+
Ok(None)
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
/// Appends the current row's next cell to `sink`, its qualifier unescaped into
|
|
1253
|
+
/// [`RowSink::qualifiers`]: [`ScanCursor::next_cell_into`] and pushing the cell in one
|
|
1254
|
+
/// step, which reads the resolver's cell once rather than once for its column and again
|
|
1255
|
+
/// for its value (#287). Returns `false` when the row
|
|
1256
|
+
/// is done.
|
|
1257
|
+
pub fn push_next_cell(&mut self, sink: &mut impl RowSink) -> Result<bool> {
|
|
1258
|
+
if !self.in_row {
|
|
1259
|
+
return Ok(false);
|
|
1260
|
+
}
|
|
1261
|
+
if let Some(i) = self.last_lane.take() {
|
|
1262
|
+
let fetched = self.lanes[i].fetch();
|
|
1263
|
+
self.snapshot.checked(fetched)?;
|
|
1264
|
+
}
|
|
1265
|
+
// A column of the current row starts with its escaped row and the terminator (which
|
|
1266
|
+
// never occurs inside an escaped row).
|
|
1267
|
+
let row_len = self.row_esc.len() + TERMINATOR.len();
|
|
1268
|
+
while self.lane_idx < self.lanes.len() {
|
|
1269
|
+
let i = self.lane_idx;
|
|
1270
|
+
let lane = &self.lanes[i];
|
|
1271
|
+
let pushed = match lane.resolver.current().filter(|_| lane.pending) {
|
|
1272
|
+
Some(cell) => {
|
|
1273
|
+
let col = column_of(cell.key);
|
|
1274
|
+
let in_row = col.len() >= row_len
|
|
1275
|
+
&& col.starts_with(&self.row_esc)
|
|
1276
|
+
&& col[self.row_esc.len()..row_len] == TERMINATOR;
|
|
1277
|
+
if in_row {
|
|
1278
|
+
let end = col.len().saturating_sub(2).max(row_len);
|
|
1279
|
+
let qualifiers = sink.qualifiers();
|
|
1280
|
+
let start = qualifiers.len();
|
|
1281
|
+
Escaped::new(&col[row_len..end]).unescape_into(qualifiers);
|
|
1282
|
+
let qualifier = start..qualifiers.len();
|
|
1283
|
+
let bytes = match &lane.pinned {
|
|
1284
|
+
Some(v) => v,
|
|
1285
|
+
None => cell.value,
|
|
1286
|
+
};
|
|
1287
|
+
if bytes.len() <= CellData::INLINE_MAX {
|
|
1288
|
+
sink.push_inline(lane.family, qualifier, lane.ts, bytes);
|
|
1289
|
+
} else {
|
|
1290
|
+
sink.push(
|
|
1291
|
+
lane.family,
|
|
1292
|
+
qualifier,
|
|
1293
|
+
lane.data(|| Arc::clone(&self.snapshot.view)),
|
|
1294
|
+
);
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
in_row
|
|
1298
|
+
}
|
|
1299
|
+
None => false,
|
|
1300
|
+
};
|
|
1301
|
+
if pushed {
|
|
1302
|
+
self.last_lane = Some(i);
|
|
1303
|
+
return Ok(true);
|
|
1304
|
+
}
|
|
1305
|
+
self.lane_idx += 1;
|
|
1306
|
+
}
|
|
1307
|
+
Ok(false)
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
/// The cell last returned by [`ScanCursor::next_cell`], as a pinned [`CellData`] (no
|
|
1311
|
+
/// copy of a large value).
|
|
1312
|
+
///
|
|
1313
|
+
/// # Panics
|
|
1314
|
+
/// If no cell has been returned for the current row.
|
|
1315
|
+
pub fn current_data(&self) -> CellData {
|
|
1316
|
+
let i = self.last_lane.expect("current_data before next_cell");
|
|
1317
|
+
self.lanes[i].data(|| Arc::clone(&self.snapshot.view))
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
impl Drop for ScanCursor {
|
|
1322
|
+
fn drop(&mut self) {
|
|
1323
|
+
self.recycle_lanes();
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
/// Rows between a scan cursor's fork checks inside a tablet (#901): a power of two.
|
|
1328
|
+
const FORK_CHECK_ROWS: u64 = 256;
|
|
1329
|
+
|
|
1330
|
+
thread_local! {
|
|
1331
|
+
/// Resolvers scans refill in place, kept by each scanning thread (#287) as row reads and
|
|
1332
|
+
/// point gets keep theirs: a scan takes one per lane and gives it back when the lane ends
|
|
1333
|
+
/// (its tablet or the scan does, or the cursor is dropped). Each comes back with no source
|
|
1334
|
+
/// and default options, so the pool pins no memtable, SST or blob reader.
|
|
1335
|
+
static SCAN_RESOLVERS: RefCell<Vec<Resolver>> = const { RefCell::new(Vec::new()) };
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
/// Resolvers a thread keeps for its scans (one per family a scan reads, for a few families).
|
|
1339
|
+
const SCAN_RESOLVERS_KEPT: usize = 4;
|
|
1340
|
+
|
|
1341
|
+
/// A resolver for a scan lane: one of the thread's, or a new one. The pool is sized here,
|
|
1342
|
+
/// when a scan starts, so giving a resolver back (at its end) never allocates.
|
|
1343
|
+
pub(crate) fn take_scan_resolver() -> Resolver {
|
|
1344
|
+
SCAN_RESOLVERS
|
|
1345
|
+
.try_with(|pool| {
|
|
1346
|
+
let mut pool = pool.borrow_mut();
|
|
1347
|
+
pool.reserve(SCAN_RESOLVERS_KEPT);
|
|
1348
|
+
pool.pop()
|
|
1349
|
+
})
|
|
1350
|
+
.ok()
|
|
1351
|
+
.flatten()
|
|
1352
|
+
.unwrap_or_else(point_resolver)
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
/// Returns a lane's resolver to the thread's pool: its sources (each pins its memtable or
|
|
1356
|
+
/// SST) and options (merge operator, blob reader) go now, its allocations stay. Past
|
|
1357
|
+
/// [`SCAN_RESOLVERS_KEPT`] it is dropped.
|
|
1358
|
+
pub(crate) fn give_back(mut resolver: Resolver) {
|
|
1359
|
+
let cursor = resolver.cursor_mut();
|
|
1360
|
+
cursor.sources_mut().clear();
|
|
1361
|
+
cursor.reset();
|
|
1362
|
+
resolver.reset(ResolveOptions::new(0, 0));
|
|
1363
|
+
let _ = SCAN_RESOLVERS.try_with(|pool| {
|
|
1364
|
+
let mut pool = pool.borrow_mut();
|
|
1365
|
+
if pool.len() < SCAN_RESOLVERS_KEPT {
|
|
1366
|
+
pool.push(resolver);
|
|
1367
|
+
}
|
|
1368
|
+
});
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
/// `clamp_to_tablet` into reused buffers: `lo` and `hi` receive the clamped start and end,
|
|
1372
|
+
/// and the result says which are set (`false` = unbounded).
|
|
1373
|
+
fn clamp_into(
|
|
1374
|
+
tablet: &TabletEntry,
|
|
1375
|
+
start: Option<&[u8]>,
|
|
1376
|
+
end: Option<&[u8]>,
|
|
1377
|
+
lo: &mut Vec<u8>,
|
|
1378
|
+
hi: &mut Vec<u8>,
|
|
1379
|
+
) -> Result<(bool, bool)> {
|
|
1380
|
+
lo.clear();
|
|
1381
|
+
let has_lo = if tablet.start.is_empty() {
|
|
1382
|
+
if let Some(s) = start {
|
|
1383
|
+
lo.extend_from_slice(s);
|
|
1384
|
+
}
|
|
1385
|
+
start.is_some()
|
|
1386
|
+
} else {
|
|
1387
|
+
encode_row_prefix(lo, &tablet.start)?;
|
|
1388
|
+
if let Some(s) = start
|
|
1389
|
+
&& s > lo.as_slice()
|
|
1390
|
+
{
|
|
1391
|
+
lo.clear();
|
|
1392
|
+
lo.extend_from_slice(s);
|
|
1393
|
+
}
|
|
1394
|
+
true
|
|
1395
|
+
};
|
|
1396
|
+
hi.clear();
|
|
1397
|
+
let has_hi = match &tablet.end {
|
|
1398
|
+
None => {
|
|
1399
|
+
if let Some(e) = end {
|
|
1400
|
+
hi.extend_from_slice(e);
|
|
1401
|
+
}
|
|
1402
|
+
end.is_some()
|
|
1403
|
+
}
|
|
1404
|
+
Some(e) => {
|
|
1405
|
+
encode_row_prefix(hi, e)?;
|
|
1406
|
+
if let Some(x) = end
|
|
1407
|
+
&& x < hi.as_slice()
|
|
1408
|
+
{
|
|
1409
|
+
hi.clear();
|
|
1410
|
+
hi.extend_from_slice(x);
|
|
1411
|
+
}
|
|
1412
|
+
true
|
|
1413
|
+
}
|
|
1414
|
+
};
|
|
1415
|
+
Ok((has_lo, has_hi))
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/// Narrows `[start, end)` (row prefixes, `None` = unbounded) to the rows of `tablet` (the
|
|
1419
|
+
/// test hooks' slot scans).
|
|
1420
|
+
#[cfg(feature = "test-hooks")]
|
|
1421
|
+
pub(crate) fn clamp_to_tablet(
|
|
1422
|
+
tablet: &TabletEntry,
|
|
1423
|
+
start: Option<Vec<u8>>,
|
|
1424
|
+
end: Option<Vec<u8>>,
|
|
1425
|
+
) -> Result<RowBounds> {
|
|
1426
|
+
let start = if tablet.start.is_empty() {
|
|
1427
|
+
start
|
|
1428
|
+
} else {
|
|
1429
|
+
let mut k = Vec::new();
|
|
1430
|
+
encode_row_prefix(&mut k, &tablet.start)?;
|
|
1431
|
+
Some(match start {
|
|
1432
|
+
Some(s) if s > k => s,
|
|
1433
|
+
_ => k,
|
|
1434
|
+
})
|
|
1435
|
+
};
|
|
1436
|
+
let end = match &tablet.end {
|
|
1437
|
+
None => end,
|
|
1438
|
+
Some(e) => {
|
|
1439
|
+
let mut k = Vec::new();
|
|
1440
|
+
encode_row_prefix(&mut k, e)?;
|
|
1441
|
+
Some(match end {
|
|
1442
|
+
Some(x) if x < k => x,
|
|
1443
|
+
_ => k,
|
|
1444
|
+
})
|
|
1445
|
+
}
|
|
1446
|
+
};
|
|
1447
|
+
Ok((start, end))
|
|
1448
|
+
}
|
|
1449
|
+
|
|
1450
|
+
/// Reads one row through `view`: every family in `families` order.
|
|
1451
|
+
pub(crate) fn read_row(
|
|
1452
|
+
snapshot: &Snapshot,
|
|
1453
|
+
table: TableId,
|
|
1454
|
+
row: &[u8],
|
|
1455
|
+
families: &[FamilyId],
|
|
1456
|
+
spec: &ReadSpec,
|
|
1457
|
+
now: Timestamp,
|
|
1458
|
+
) -> Result<Option<RowData>> {
|
|
1459
|
+
let mut out = RowData {
|
|
1460
|
+
row: row.to_vec(),
|
|
1461
|
+
..RowData::default()
|
|
1462
|
+
};
|
|
1463
|
+
let any = read_row_into(
|
|
1464
|
+
&snapshot.view,
|
|
1465
|
+
snapshot.seqno,
|
|
1466
|
+
table,
|
|
1467
|
+
row,
|
|
1468
|
+
families,
|
|
1469
|
+
spec,
|
|
1470
|
+
now,
|
|
1471
|
+
false,
|
|
1472
|
+
&mut out,
|
|
1473
|
+
)?;
|
|
1474
|
+
Ok(any.then_some(out))
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
thread_local! {
|
|
1478
|
+
/// The resolver row reads refill in place, one per reading thread (#287), as point gets
|
|
1479
|
+
/// refill theirs: its merging cursor's source list and heap and its scratch are reused.
|
|
1480
|
+
/// Between reads it holds no source and default options, so it pins no memtable, SST or
|
|
1481
|
+
/// blob reader. Taken while in use, so a read nested in another gets a resolver of its
|
|
1482
|
+
/// own.
|
|
1483
|
+
static ROW_RESOLVER: std::cell::Cell<Option<Resolver>> = const { std::cell::Cell::new(None) };
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
/// Reads one row through `view` at `seqno` into `sink`: every family in `families` order.
|
|
1487
|
+
/// Returns whether any cell was found. A value pinned rather than copied pins `view`.
|
|
1488
|
+
#[allow(clippy::too_many_arguments)]
|
|
1489
|
+
///
|
|
1490
|
+
/// `cache_only` (an async read, ICR 0014) changes only how each family's sources are
|
|
1491
|
+
/// gathered, so it is a runtime flag rather than a second instance: with two instances the
|
|
1492
|
+
/// per-cell loop stopped inlining `CellResolver::next_cell` into the sync one (#430, +2%
|
|
1493
|
+
/// instructions per row).
|
|
1494
|
+
pub(crate) fn read_row_into(
|
|
1495
|
+
view: &Arc<View>,
|
|
1496
|
+
seqno: Seqno,
|
|
1497
|
+
table: TableId,
|
|
1498
|
+
row: &[u8],
|
|
1499
|
+
families: &[FamilyId],
|
|
1500
|
+
spec: &ReadSpec,
|
|
1501
|
+
now: Timestamp,
|
|
1502
|
+
cache_only: bool,
|
|
1503
|
+
sink: &mut impl RowSink,
|
|
1504
|
+
) -> Result<bool> {
|
|
1505
|
+
let mut resolver = ROW_RESOLVER
|
|
1506
|
+
.try_with(std::cell::Cell::take)
|
|
1507
|
+
.ok()
|
|
1508
|
+
.flatten()
|
|
1509
|
+
.unwrap_or_else(point_resolver);
|
|
1510
|
+
let mut large = false;
|
|
1511
|
+
let read = read_row_with(
|
|
1512
|
+
&mut resolver,
|
|
1513
|
+
view,
|
|
1514
|
+
seqno,
|
|
1515
|
+
table,
|
|
1516
|
+
row,
|
|
1517
|
+
families,
|
|
1518
|
+
spec,
|
|
1519
|
+
now,
|
|
1520
|
+
cache_only,
|
|
1521
|
+
sink,
|
|
1522
|
+
&mut large,
|
|
1523
|
+
);
|
|
1524
|
+
// Whatever happened, the sources (each pins its memtable or SST) and the options (merge
|
|
1525
|
+
// operator, blob reader) go now; only the allocations stay, unless a large value grew
|
|
1526
|
+
// them.
|
|
1527
|
+
let cursor = resolver.cursor_mut();
|
|
1528
|
+
cursor.sources_mut().clear();
|
|
1529
|
+
cursor.reset();
|
|
1530
|
+
resolver.reset(ResolveOptions::new(0, 0));
|
|
1531
|
+
if !large {
|
|
1532
|
+
let _ = ROW_RESOLVER.try_with(|slot| slot.set(Some(resolver)));
|
|
1533
|
+
}
|
|
1534
|
+
read
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
/// [`read_row_into`] with the thread's resolver. Sets `large` when a value the resolver
|
|
1538
|
+
/// buffered was too large to keep its buffers for.
|
|
1539
|
+
#[allow(clippy::too_many_arguments)]
|
|
1540
|
+
// Inlined into `read_row_into`: called through a separate frame, a hot row's per-cell loop
|
|
1541
|
+
// measured about 1.5% more instructions.
|
|
1542
|
+
#[inline(always)]
|
|
1543
|
+
fn read_row_with(
|
|
1544
|
+
resolver: &mut Resolver,
|
|
1545
|
+
view: &Arc<View>,
|
|
1546
|
+
seqno: Seqno,
|
|
1547
|
+
table: TableId,
|
|
1548
|
+
row: &[u8],
|
|
1549
|
+
families: &[FamilyId],
|
|
1550
|
+
spec: &ReadSpec,
|
|
1551
|
+
now: Timestamp,
|
|
1552
|
+
cache_only: bool,
|
|
1553
|
+
sink: &mut impl RowSink,
|
|
1554
|
+
large: &mut bool,
|
|
1555
|
+
) -> Result<bool> {
|
|
1556
|
+
let Some((tablet, shard)) = view.tablets().route(table, row) else {
|
|
1557
|
+
return Err(Error::TableNotFound(format!("table {}", table.0)));
|
|
1558
|
+
};
|
|
1559
|
+
// Inline for rows of usual length: the setup allocates nothing per read.
|
|
1560
|
+
let prefix = row_prefix(row)?;
|
|
1561
|
+
let mut past = prefix.clone();
|
|
1562
|
+
if let Some(last) = past.last_mut() {
|
|
1563
|
+
*last += 1;
|
|
1564
|
+
}
|
|
1565
|
+
let mut any = false;
|
|
1566
|
+
#[cfg(feature = "test-hooks")]
|
|
1567
|
+
let mut first = true;
|
|
1568
|
+
for &family in families {
|
|
1569
|
+
#[cfg(feature = "test-hooks")]
|
|
1570
|
+
{
|
|
1571
|
+
if !first {
|
|
1572
|
+
run_between_row_families();
|
|
1573
|
+
}
|
|
1574
|
+
first = false;
|
|
1575
|
+
}
|
|
1576
|
+
let Some(meta) = view.catalog.family(family) else {
|
|
1577
|
+
continue;
|
|
1578
|
+
};
|
|
1579
|
+
let (mut opts, filter) = spec.resolve_opts(meta, seqno, now);
|
|
1580
|
+
let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
|
|
1581
|
+
let cursor = resolver.cursor_mut();
|
|
1582
|
+
cursor.sources_mut().clear();
|
|
1583
|
+
if cache_only {
|
|
1584
|
+
row_sources_cache_only(
|
|
1585
|
+
view,
|
|
1586
|
+
shard,
|
|
1587
|
+
tablet,
|
|
1588
|
+
family,
|
|
1589
|
+
&filter,
|
|
1590
|
+
&prefix,
|
|
1591
|
+
cursor.sources_mut(),
|
|
1592
|
+
)?;
|
|
1593
|
+
} else {
|
|
1594
|
+
view.row_sources_into::<false>(
|
|
1595
|
+
shard,
|
|
1596
|
+
tablet,
|
|
1597
|
+
family,
|
|
1598
|
+
&filter,
|
|
1599
|
+
&prefix,
|
|
1600
|
+
cursor.sources_mut(),
|
|
1601
|
+
)?;
|
|
1602
|
+
}
|
|
1603
|
+
if cursor.sources().is_empty() {
|
|
1604
|
+
continue;
|
|
1605
|
+
}
|
|
1606
|
+
opts.skip_columns = skips_columns(cursor.sources());
|
|
1607
|
+
cursor.reset();
|
|
1608
|
+
resolver.reset(opts);
|
|
1609
|
+
resolver.set_upper_bound(Some(&past));
|
|
1610
|
+
resolver.seek(&prefix)?;
|
|
1611
|
+
loop {
|
|
1612
|
+
if sink.full() {
|
|
1613
|
+
break;
|
|
1614
|
+
}
|
|
1615
|
+
let (data, qualifier) = {
|
|
1616
|
+
let next = resolver.next_cell();
|
|
1617
|
+
ResolverBlobs::check(resolver_blobs.as_ref())?;
|
|
1618
|
+
let Some(cell) = next.map_err(|e| read_error(e, meta))? else {
|
|
1619
|
+
break;
|
|
1620
|
+
};
|
|
1621
|
+
if !cell.key.starts_with(&prefix) {
|
|
1622
|
+
break;
|
|
1623
|
+
}
|
|
1624
|
+
*large |= !cell.from_source && cell.value.len() > KEEP_BUFFERS_BELOW;
|
|
1625
|
+
// The qualifier goes straight into the sink, unescaped from the key.
|
|
1626
|
+
let column = column_of(cell.key);
|
|
1627
|
+
let end = column.len().saturating_sub(2).max(prefix.len());
|
|
1628
|
+
let qualifiers = sink.qualifiers();
|
|
1629
|
+
let start = qualifiers.len();
|
|
1630
|
+
Escaped::new(&column[prefix.len()..end]).unescape_into(qualifiers);
|
|
1631
|
+
let qualifier = start..qualifiers.len();
|
|
1632
|
+
let data = if cell.from_source && cell.value.len() > CellData::INLINE_MAX {
|
|
1633
|
+
// Pinned below, once the borrow of the resolver ends.
|
|
1634
|
+
None
|
|
1635
|
+
} else if cell.value.len() <= CellData::INLINE_MAX
|
|
1636
|
+
&& blob_pointer(cell.value).is_none()
|
|
1637
|
+
{
|
|
1638
|
+
// Small and not separated: copied straight into the sink's cell.
|
|
1639
|
+
sink.push_inline(family, qualifier, cell.ts, cell.value);
|
|
1640
|
+
any = true;
|
|
1641
|
+
continue;
|
|
1642
|
+
} else {
|
|
1643
|
+
Some(CellData::resolved(&cell, &view.ssts, || Arc::clone(view))?)
|
|
1644
|
+
};
|
|
1645
|
+
(data, qualifier)
|
|
1646
|
+
};
|
|
1647
|
+
let data = match data {
|
|
1648
|
+
Some(d) => d,
|
|
1649
|
+
None => {
|
|
1650
|
+
let src = resolver
|
|
1651
|
+
.cursor()
|
|
1652
|
+
.current()
|
|
1653
|
+
.expect("the merged cursor is on the returned entry");
|
|
1654
|
+
let ts = {
|
|
1655
|
+
let (_, ts, _, _) = pigeonhole_format::key::split_suffix(src.key())?;
|
|
1656
|
+
ts
|
|
1657
|
+
};
|
|
1658
|
+
let value = LaneValue::Pinned(src.pin_value());
|
|
1659
|
+
CellData::from_pinned(ts, &value, || Arc::clone(view))
|
|
1660
|
+
}
|
|
1661
|
+
};
|
|
1662
|
+
sink.push(family, qualifier, data);
|
|
1663
|
+
any = true;
|
|
1664
|
+
}
|
|
1665
|
+
}
|
|
1666
|
+
Ok(any)
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1669
|
+
/// A row read's sources for one family, gathered cache-only (an async read): out of the
|
|
1670
|
+
/// sync row read's way.
|
|
1671
|
+
#[cold]
|
|
1672
|
+
#[inline(never)]
|
|
1673
|
+
fn row_sources_cache_only(
|
|
1674
|
+
view: &View,
|
|
1675
|
+
shard: pigeonhole_runtime::ShardId,
|
|
1676
|
+
tablet: pigeonhole_format::TabletId,
|
|
1677
|
+
family: FamilyId,
|
|
1678
|
+
filter: &ScanFilter,
|
|
1679
|
+
prefix: &[u8],
|
|
1680
|
+
out: &mut Vec<Source>,
|
|
1681
|
+
) -> Result<()> {
|
|
1682
|
+
view.row_sources_into::<true>(shard, tablet, family, filter, prefix, out)
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
#[cfg(feature = "test-hooks")]
|
|
1686
|
+
thread_local! {
|
|
1687
|
+
/// Runs once on this thread, in the next row read, before it reads its second family
|
|
1688
|
+
/// (`Engine::between_row_read_families`; test hook).
|
|
1689
|
+
pub(crate) static BETWEEN_ROW_FAMILIES: std::cell::RefCell<Option<Box<dyn FnOnce()>>> =
|
|
1690
|
+
const { std::cell::RefCell::new(None) };
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
#[cfg(feature = "test-hooks")]
|
|
1694
|
+
fn run_between_row_families() {
|
|
1695
|
+
let f = BETWEEN_ROW_FAMILIES.with(|h| h.borrow_mut().take());
|
|
1696
|
+
if let Some(f) = f {
|
|
1697
|
+
f();
|
|
1698
|
+
}
|
|
1699
|
+
}
|
|
1700
|
+
|
|
1701
|
+
thread_local! {
|
|
1702
|
+
/// The resolver point gets refill in place, one per reading thread (#46): its merging
|
|
1703
|
+
/// cursor's source list and heap and its scratch are reused, and nothing is moved. Between
|
|
1704
|
+
/// gets it holds no source and default options, so it pins no memtable, SST or blob
|
|
1705
|
+
/// reader.
|
|
1706
|
+
static POINT_RESOLVER: RefCell<Option<Resolver>> = const { RefCell::new(None) };
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
/// A point get returning a longer value drops the thread's resolver (and the buffers that
|
|
1710
|
+
/// value may have grown) instead of keeping it for the next get.
|
|
1711
|
+
const KEEP_BUFFERS_BELOW: usize = 64 << 10;
|
|
1712
|
+
|
|
1713
|
+
/// An empty resolver for point gets.
|
|
1714
|
+
fn point_resolver() -> Resolver {
|
|
1715
|
+
Resolver::new(MergingCursor::new(Vec::new()), ResolveOptions::new(0, 0))
|
|
1716
|
+
}
|
|
1717
|
+
|
|
1718
|
+
/// Entries a counter get folds before it leaves its result behind as a checkpoint (D291,
|
|
1719
|
+
/// the default of `EngineOptions::counter_checkpoint_steps`): a hot counter's reads then fold
|
|
1720
|
+
/// about this many entries, and the shard keeps at most one checkpoint per this many
|
|
1721
|
+
/// operands.
|
|
1722
|
+
pub(crate) const CHECKPOINT_STEPS: u64 = 128;
|
|
1723
|
+
|
|
1724
|
+
/// A counter get's result, to be kept as a base (D291): `Put` at `(column, ts, seqno)` of
|
|
1725
|
+
/// `stored`, the column's value at `seqno`, the newest entry the get's fold read. Sent to the
|
|
1726
|
+
/// row's shard, which inserts it only while that entry is in its active memtable.
|
|
1727
|
+
#[derive(Debug)]
|
|
1728
|
+
pub(crate) struct CounterCheckpoint {
|
|
1729
|
+
pub shard: pigeonhole_runtime::ShardId,
|
|
1730
|
+
pub table: TableId,
|
|
1731
|
+
pub tablet: TabletId,
|
|
1732
|
+
pub family: FamilyId,
|
|
1733
|
+
pub row: Vec<u8>,
|
|
1734
|
+
pub qualifier: Vec<u8>,
|
|
1735
|
+
pub ts: Timestamp,
|
|
1736
|
+
pub seqno: Seqno,
|
|
1737
|
+
pub stored: Vec<u8>,
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
/// A point get through `view` at `seqno`.
|
|
1741
|
+
#[allow(clippy::too_many_arguments)]
|
|
1742
|
+
pub(crate) fn get_in<const CACHE_ONLY: bool>(
|
|
1743
|
+
view: &View,
|
|
1744
|
+
seqno: Seqno,
|
|
1745
|
+
now: impl FnOnce() -> Timestamp,
|
|
1746
|
+
table: TableId,
|
|
1747
|
+
family: FamilyId,
|
|
1748
|
+
row: &[u8],
|
|
1749
|
+
qualifier: &[u8],
|
|
1750
|
+
pin: impl FnOnce() -> Arc<View>,
|
|
1751
|
+
) -> Result<Option<CellData>> {
|
|
1752
|
+
let mut run = Some(|resolver: &mut Resolver| {
|
|
1753
|
+
let got = get_with::<CACHE_ONLY>(
|
|
1754
|
+
resolver, view, seqno, now, table, family, row, qualifier, pin,
|
|
1755
|
+
);
|
|
1756
|
+
// A counter group's fold (D291): only counter families set it, and every get takes
|
|
1757
|
+
// it, so it is always this get's.
|
|
1758
|
+
if let Some(fold) = resolver.take_counter_fold() {
|
|
1759
|
+
let op_bytes = resolver.counter_fold_operand_bytes();
|
|
1760
|
+
note_checkpoint(view, fold, op_bytes, &got, table, family, row, qualifier);
|
|
1761
|
+
}
|
|
1762
|
+
// Whatever happened, the sources (each pins its memtable or SST) and the options
|
|
1763
|
+
// (merge operator, blob reader) go now; only the allocations stay.
|
|
1764
|
+
let cursor = resolver.cursor_mut();
|
|
1765
|
+
cursor.sources_mut().clear();
|
|
1766
|
+
cursor.reset();
|
|
1767
|
+
resolver.reset(ResolveOptions::new(0, 0));
|
|
1768
|
+
got
|
|
1769
|
+
});
|
|
1770
|
+
// A get nested in another on the same thread, or one during thread teardown, uses a
|
|
1771
|
+
// resolver of its own.
|
|
1772
|
+
let in_place = POINT_RESOLVER.try_with(|cell| {
|
|
1773
|
+
let mut slot = cell.try_borrow_mut().ok()?;
|
|
1774
|
+
let run = run.take().expect("not run yet");
|
|
1775
|
+
let got = run(slot.get_or_insert_with(point_resolver));
|
|
1776
|
+
// A large result may have been folded in the resolver's buffers (merge operands are
|
|
1777
|
+
// copied whatever their size): not worth keeping that much per thread.
|
|
1778
|
+
if got.as_ref().is_ok_and(|c| {
|
|
1779
|
+
c.as_ref()
|
|
1780
|
+
.is_some_and(|c| c.stored().len() > KEEP_BUFFERS_BELOW)
|
|
1781
|
+
}) {
|
|
1782
|
+
*slot = None;
|
|
1783
|
+
}
|
|
1784
|
+
Some(got)
|
|
1785
|
+
});
|
|
1786
|
+
match in_place {
|
|
1787
|
+
Ok(Some(got)) => got,
|
|
1788
|
+
_ => (run.take().expect("not run yet"))(&mut point_resolver()),
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
|
|
1792
|
+
/// Whether a read over `sources` should pass finished columns with `skip_column`: when an
|
|
1793
|
+
/// SST source can (ICR 0041), or a memtable source with the stale-tail index (D194), so a
|
|
1794
|
+
/// read of index-less memtables alone never pays for a try that cannot succeed.
|
|
1795
|
+
fn skips_columns(sources: &[Source]) -> bool {
|
|
1796
|
+
sources.iter().any(|s| match s {
|
|
1797
|
+
Source::Mem(m) => m.inner().skips_columns(),
|
|
1798
|
+
Source::Sst(_) => true,
|
|
1799
|
+
})
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
/// A point get's resolver options: as `ReadSpec { versions: 1, .. }.resolve_opts`, built
|
|
1803
|
+
/// directly (no spec, filter or time range to make and drop on every get).
|
|
1804
|
+
fn point_opts(meta: &FamilyMeta, seqno: Seqno, now: Timestamp) -> ResolveOptions {
|
|
1805
|
+
let mut opts = ResolveOptions::new(seqno, now);
|
|
1806
|
+
opts.ttl_micros = meta.options.ttl_micros;
|
|
1807
|
+
// `versions: 1` folded with the family's `max_versions` (0 = unlimited): always 1.
|
|
1808
|
+
opts.versions = 1;
|
|
1809
|
+
opts.merge = meta.merge_op.clone();
|
|
1810
|
+
opts.counter = meta.options.kind.is_aggregate();
|
|
1811
|
+
opts
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
/// How a point get's resolution ended.
|
|
1815
|
+
enum Resolved {
|
|
1816
|
+
Done(Option<CellData>),
|
|
1817
|
+
/// A large put the resolver copied: re-found by its key (in the caller's buffers) and
|
|
1818
|
+
/// pinned, at this timestamp.
|
|
1819
|
+
Refind(Timestamp),
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
#[allow(clippy::too_many_arguments)]
|
|
1823
|
+
fn get_with<const CACHE_ONLY: bool>(
|
|
1824
|
+
resolver: &mut Resolver,
|
|
1825
|
+
view: &View,
|
|
1826
|
+
seqno: Seqno,
|
|
1827
|
+
now: impl FnOnce() -> Timestamp,
|
|
1828
|
+
table: TableId,
|
|
1829
|
+
family: FamilyId,
|
|
1830
|
+
row: &[u8],
|
|
1831
|
+
qualifier: &[u8],
|
|
1832
|
+
pin: impl FnOnce() -> Arc<View>,
|
|
1833
|
+
) -> Result<Option<CellData>> {
|
|
1834
|
+
let Some((tablet, shard)) = view.tablets().route(table, row) else {
|
|
1835
|
+
return Err(Error::TableNotFound(format!("table {}", table.0)));
|
|
1836
|
+
};
|
|
1837
|
+
let Some(meta) = view.catalog.family(family) else {
|
|
1838
|
+
return Err(Error::FamilyNotFound(format!("family {}", family.0)));
|
|
1839
|
+
};
|
|
1840
|
+
if meta.table != table {
|
|
1841
|
+
return Err(Error::FamilyNotFound(format!("family {}", family.0)));
|
|
1842
|
+
}
|
|
1843
|
+
// Encoded once, for the filter probes and the resolver.
|
|
1844
|
+
let mut key = ColumnKey::new(row, qualifier);
|
|
1845
|
+
// The caller clears the sources afterwards, whatever this returns.
|
|
1846
|
+
let sources = resolver.cursor_mut().sources_mut();
|
|
1847
|
+
let markers = match view.point_sources::<CACHE_ONLY>(shard, tablet, family, &mut key, sources) {
|
|
1848
|
+
Ok(_) if sources.is_empty() => return Ok(None),
|
|
1849
|
+
Ok(markers) => markers,
|
|
1850
|
+
Err(e) => return Err(e),
|
|
1851
|
+
};
|
|
1852
|
+
// The clock only for a family with a TTL, the one thing a point get uses it for.
|
|
1853
|
+
let now = if meta.options.ttl_micros == 0 {
|
|
1854
|
+
0
|
|
1855
|
+
} else {
|
|
1856
|
+
now()
|
|
1857
|
+
};
|
|
1858
|
+
let mut opts = point_opts(meta, seqno, now);
|
|
1859
|
+
let resolver_blobs = ResolverBlobs::attach(&mut opts, &view.ssts);
|
|
1860
|
+
resolver.cursor_mut().reset();
|
|
1861
|
+
resolver.reset(opts);
|
|
1862
|
+
let mut key_buf = [0u8; 512];
|
|
1863
|
+
let mut key_vec: Vec<u8> = Vec::new();
|
|
1864
|
+
let mut key_len = 0;
|
|
1865
|
+
let mut pin = Some(pin);
|
|
1866
|
+
let resolved = resolve_point(
|
|
1867
|
+
resolver,
|
|
1868
|
+
view,
|
|
1869
|
+
meta,
|
|
1870
|
+
resolver_blobs.as_ref(),
|
|
1871
|
+
&key,
|
|
1872
|
+
markers,
|
|
1873
|
+
(&mut key_buf, &mut key_vec, &mut key_len),
|
|
1874
|
+
&mut pin,
|
|
1875
|
+
);
|
|
1876
|
+
let cursor = resolver.cursor_mut();
|
|
1877
|
+
match resolved {
|
|
1878
|
+
Ok(Resolved::Done(cell)) => Ok(cell),
|
|
1879
|
+
Err(e) => Err(e),
|
|
1880
|
+
Ok(Resolved::Refind(ts)) => {
|
|
1881
|
+
let key: &[u8] = if key_vec.is_empty() {
|
|
1882
|
+
&key_buf[..key_len]
|
|
1883
|
+
} else {
|
|
1884
|
+
&key_vec
|
|
1885
|
+
};
|
|
1886
|
+
match cursor.seek(key) {
|
|
1887
|
+
Err(e) => Err(e),
|
|
1888
|
+
Ok(()) if cursor.valid() && cursor.key() == key => match cursor.current() {
|
|
1889
|
+
Some(src) => {
|
|
1890
|
+
let value = LaneValue::Pinned(src.pin_value());
|
|
1891
|
+
let pin = pin.take().expect("not used yet");
|
|
1892
|
+
Ok(Some(CellData::from_pinned(ts, &value, pin)))
|
|
1893
|
+
}
|
|
1894
|
+
None => Err(missing_entry()),
|
|
1895
|
+
},
|
|
1896
|
+
Ok(()) => Err(missing_entry()),
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
}
|
|
1900
|
+
}
|
|
1901
|
+
|
|
1902
|
+
/// The checkpoint bound's ratio R (D298 §4.3, amended): a fold is kept as a checkpoint only
|
|
1903
|
+
/// when the operands it read sum to at least `1 / R` of the value it produced. The memtable
|
|
1904
|
+
/// then takes at most R checkpoint bytes per operand byte written, whatever the value's size,
|
|
1905
|
+
/// and a read folds under `S / R` operand bytes onto its checkpoint. The base the fold started
|
|
1906
|
+
/// from is not an operand, or every fold from a large checkpoint would pass and checkpoint
|
|
1907
|
+
/// again.
|
|
1908
|
+
pub(crate) const CHECKPOINT_BYTES_RATIO: u64 = 4;
|
|
1909
|
+
|
|
1910
|
+
/// Hands a counter get's result to its row's shard as a checkpoint (D291), when its fold
|
|
1911
|
+
/// read at least the writer's checkpoint steps. Out of line: a get pays only for taking the
|
|
1912
|
+
/// resolver's fold record, which only a counter group sets.
|
|
1913
|
+
#[cold]
|
|
1914
|
+
#[inline(never)]
|
|
1915
|
+
#[allow(clippy::too_many_arguments)]
|
|
1916
|
+
fn note_checkpoint(
|
|
1917
|
+
view: &View,
|
|
1918
|
+
(steps, top): (u64, Seqno),
|
|
1919
|
+
op_bytes: u64,
|
|
1920
|
+
got: &Result<Option<CellData>>,
|
|
1921
|
+
table: TableId,
|
|
1922
|
+
family: FamilyId,
|
|
1923
|
+
row: &[u8],
|
|
1924
|
+
qualifier: &[u8],
|
|
1925
|
+
) {
|
|
1926
|
+
let Some(sink) = view.checkpoint_sink() else {
|
|
1927
|
+
return;
|
|
1928
|
+
};
|
|
1929
|
+
let Ok(Some(cell)) = got else {
|
|
1930
|
+
return;
|
|
1931
|
+
};
|
|
1932
|
+
if steps < sink.steps {
|
|
1933
|
+
return;
|
|
1934
|
+
}
|
|
1935
|
+
if op_bytes < cell.stored().len() as u64 / CHECKPOINT_BYTES_RATIO {
|
|
1936
|
+
return;
|
|
1937
|
+
}
|
|
1938
|
+
debug_assert_ne!(
|
|
1939
|
+
cell.stored().first(),
|
|
1940
|
+
Some(&pigeonhole_format::value::TRANSIENT_TAG),
|
|
1941
|
+
"a working accumulator reached a checkpoint"
|
|
1942
|
+
);
|
|
1943
|
+
let Some((tablet, shard)) = view.tablets().route(table, row) else {
|
|
1944
|
+
return;
|
|
1945
|
+
};
|
|
1946
|
+
(sink.send)(CounterCheckpoint {
|
|
1947
|
+
shard,
|
|
1948
|
+
table,
|
|
1949
|
+
tablet,
|
|
1950
|
+
family,
|
|
1951
|
+
row: row.to_vec(),
|
|
1952
|
+
qualifier: qualifier.to_vec(),
|
|
1953
|
+
ts: cell.timestamp(),
|
|
1954
|
+
seqno: top,
|
|
1955
|
+
stored: cell.stored().to_vec(),
|
|
1956
|
+
});
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
fn missing_entry() -> Error {
|
|
1960
|
+
Error::Corruption("point get: a resolved entry is not in its sources".into())
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
/// Resolves a point get's column. A value above the inline threshold is pinned, not copied
|
|
1964
|
+
/// (D29). The resolver copies values up to its own limit while it reads the group; a copy of
|
|
1965
|
+
/// a put (the output key names exactly that entry; a fold's key is an operand's) is re-found
|
|
1966
|
+
/// with one seek and pinned, so the pinned bytes are the version itself: its key goes to
|
|
1967
|
+
/// `key` and the caller seeks.
|
|
1968
|
+
#[allow(clippy::too_many_arguments)]
|
|
1969
|
+
fn resolve_point<P: FnOnce() -> Arc<View>>(
|
|
1970
|
+
resolver: &mut Resolver,
|
|
1971
|
+
view: &View,
|
|
1972
|
+
meta: &FamilyMeta,
|
|
1973
|
+
resolver_blobs: Option<&Arc<ResolverBlobs>>,
|
|
1974
|
+
column: &ColumnKey,
|
|
1975
|
+
markers: bool,
|
|
1976
|
+
key: (&mut [u8; 512], &mut Vec<u8>, &mut usize),
|
|
1977
|
+
pin: &mut Option<P>,
|
|
1978
|
+
) -> Result<Resolved> {
|
|
1979
|
+
let (key_buf, key_vec, key_len) = key;
|
|
1980
|
+
if markers {
|
|
1981
|
+
resolver.seek_column_encoded(column.prefix(), column.row_len())?;
|
|
1982
|
+
} else {
|
|
1983
|
+
// No source can hold a delete marker: straight to the column (ICR 0020).
|
|
1984
|
+
resolver.seek_column_encoded_unmarked(column.prefix(), column.row_len())?;
|
|
1985
|
+
}
|
|
1986
|
+
let (ts, refind) = {
|
|
1987
|
+
let next = resolver.next_cell();
|
|
1988
|
+
ResolverBlobs::check(resolver_blobs)?;
|
|
1989
|
+
let Some(cell) = next.map_err(|e| read_error(e, meta))? else {
|
|
1990
|
+
return Ok(Resolved::Done(None));
|
|
1991
|
+
};
|
|
1992
|
+
if cell.value.len() <= CellData::INLINE_MAX {
|
|
1993
|
+
let pin = pin.take().expect("not used yet");
|
|
1994
|
+
return Ok(Resolved::Done(Some(CellData::resolved(
|
|
1995
|
+
&cell, &view.ssts, pin,
|
|
1996
|
+
)?)));
|
|
1997
|
+
}
|
|
1998
|
+
if cell.from_source {
|
|
1999
|
+
(cell.ts, false)
|
|
2000
|
+
} else if decode_key(cell.key).is_ok_and(|k| k.kind == Kind::Put) {
|
|
2001
|
+
*key_len = cell.key.len();
|
|
2002
|
+
if *key_len <= key_buf.len() {
|
|
2003
|
+
key_buf[..*key_len].copy_from_slice(cell.key);
|
|
2004
|
+
} else {
|
|
2005
|
+
key_vec.extend_from_slice(cell.key);
|
|
2006
|
+
}
|
|
2007
|
+
(cell.ts, true)
|
|
2008
|
+
} else {
|
|
2009
|
+
let pin = pin.take().expect("not used yet");
|
|
2010
|
+
return Ok(Resolved::Done(Some(CellData::from_cell(&cell, None, pin))));
|
|
2011
|
+
}
|
|
2012
|
+
};
|
|
2013
|
+
if refind {
|
|
2014
|
+
return Ok(Resolved::Refind(ts));
|
|
2015
|
+
}
|
|
2016
|
+
let src = resolver
|
|
2017
|
+
.cursor()
|
|
2018
|
+
.current()
|
|
2019
|
+
.expect("the merged cursor is on the returned entry");
|
|
2020
|
+
let value = LaneValue::Pinned(src.pin_value());
|
|
2021
|
+
let pin = pin.take().expect("not used yet");
|
|
2022
|
+
Ok(Resolved::Done(Some(CellData::from_pinned(ts, &value, pin))))
|
|
2023
|
+
}
|
|
2024
|
+
|
|
2025
|
+
/// Whether a stored value satisfies a predicate (decision D77).
|
|
2026
|
+
pub(crate) fn predicate_matches(p: &ValuePredicate, stored: &[u8]) -> bool {
|
|
2027
|
+
p.matches(stored)
|
|
2028
|
+
}
|
|
2029
|
+
|
|
2030
|
+
#[cfg(test)]
|
|
2031
|
+
mod tests {
|
|
2032
|
+
//! The resolver rules as the engine relies on them (snapshot visibility, the delete rules
|
|
2033
|
+
//! D9/D38, TTL, merge folding D41, limits and filters), run through the engine's
|
|
2034
|
+
//! `Source` enum against `pigeonhole-compaction`'s shared `CellResolver`.
|
|
2035
|
+
|
|
2036
|
+
use std::sync::Arc;
|
|
2037
|
+
|
|
2038
|
+
use pigeonhole_compaction::{I64Add, MergingCursor, ResolveOptions, VecCursor};
|
|
2039
|
+
use pigeonhole_format::key::{Kind, decode_key, encode_key, encode_marker_key};
|
|
2040
|
+
use pigeonhole_format::value::{ValueRef, decode_value, encode_value};
|
|
2041
|
+
|
|
2042
|
+
use pigeonhole_format::scan::ScanFilter;
|
|
2043
|
+
use pigeonhole_memtable::{ArenaRegion, Memtable, ShardArena};
|
|
2044
|
+
|
|
2045
|
+
use crate::source::{Resolver, mem_sources_from};
|
|
2046
|
+
use crate::{Error, ValuePredicate};
|
|
2047
|
+
|
|
2048
|
+
fn put(row: &str, q: &str, ts: u64, seqno: u64, v: &[u8]) -> (Vec<u8>, Vec<u8>) {
|
|
2049
|
+
let mut k = Vec::new();
|
|
2050
|
+
encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, Kind::Put).unwrap();
|
|
2051
|
+
let mut val = Vec::new();
|
|
2052
|
+
// Eight raw bytes are written as a tagged `i64` (what `put_i64` does).
|
|
2053
|
+
match <[u8; 8]>::try_from(v) {
|
|
2054
|
+
Ok(b) => encode_value(&mut val, ValueRef::I64(i64::from_le_bytes(b))),
|
|
2055
|
+
Err(_) => encode_value(&mut val, ValueRef::Bytes(v)),
|
|
2056
|
+
}
|
|
2057
|
+
(k, val)
|
|
2058
|
+
}
|
|
2059
|
+
|
|
2060
|
+
fn incr(row: &str, q: &str, ts: u64, seqno: u64, d: i64) -> (Vec<u8>, Vec<u8>) {
|
|
2061
|
+
let mut k = Vec::new();
|
|
2062
|
+
encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, Kind::Merge).unwrap();
|
|
2063
|
+
let mut val = Vec::new();
|
|
2064
|
+
encode_value(&mut val, ValueRef::I64(d));
|
|
2065
|
+
(k, val)
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
fn del(row: &str, q: &str, ts: u64, seqno: u64, kind: Kind) -> (Vec<u8>, Vec<u8>) {
|
|
2069
|
+
let mut k = Vec::new();
|
|
2070
|
+
encode_key(&mut k, row.as_bytes(), q.as_bytes(), ts, seqno, kind).unwrap();
|
|
2071
|
+
(k, Vec::new())
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
fn marker(row: &str, ts: u64, seqno: u64) -> (Vec<u8>, Vec<u8>) {
|
|
2075
|
+
let mut k = Vec::new();
|
|
2076
|
+
encode_marker_key(&mut k, row.as_bytes(), ts, seqno).unwrap();
|
|
2077
|
+
(k, Vec::new())
|
|
2078
|
+
}
|
|
2079
|
+
|
|
2080
|
+
type Cell = (String, String, u64, Vec<u8>);
|
|
2081
|
+
|
|
2082
|
+
fn cell(key: &[u8], ts: u64, value: &[u8]) -> Cell {
|
|
2083
|
+
let parts = decode_key(key).unwrap();
|
|
2084
|
+
let (mut r, mut q) = (Vec::new(), Vec::new());
|
|
2085
|
+
parts.row.unescape_into(&mut r);
|
|
2086
|
+
parts.qualifier.unwrap().unescape_into(&mut q);
|
|
2087
|
+
let v = match decode_value(value).unwrap() {
|
|
2088
|
+
ValueRef::Bytes(b) => b.to_vec(),
|
|
2089
|
+
ValueRef::I64(x) => x.to_le_bytes().to_vec(),
|
|
2090
|
+
other => panic!("{other:?}"),
|
|
2091
|
+
};
|
|
2092
|
+
(
|
|
2093
|
+
String::from_utf8(r).unwrap(),
|
|
2094
|
+
String::from_utf8(q).unwrap(),
|
|
2095
|
+
ts,
|
|
2096
|
+
v,
|
|
2097
|
+
)
|
|
2098
|
+
}
|
|
2099
|
+
|
|
2100
|
+
/// A resolver over one memtable per entry list, built as a read builds its memtable
|
|
2101
|
+
/// sources (`mem_sources_from`, unfiltered).
|
|
2102
|
+
fn resolver(sources: Vec<Vec<(Vec<u8>, Vec<u8>)>>, opts: ResolveOptions) -> Resolver {
|
|
2103
|
+
let readers: Vec<_> = sources
|
|
2104
|
+
.into_iter()
|
|
2105
|
+
.map(|entries| {
|
|
2106
|
+
let mut arena = ShardArena::new(ArenaRegion::heap(1 << 20), 64 << 10);
|
|
2107
|
+
let mut mem = Memtable::create(&mut arena).unwrap();
|
|
2108
|
+
for (k, v) in &entries {
|
|
2109
|
+
mem.insert(&mut arena, k, v).unwrap();
|
|
2110
|
+
}
|
|
2111
|
+
mem.reader()
|
|
2112
|
+
})
|
|
2113
|
+
.collect();
|
|
2114
|
+
let mut out = Vec::new();
|
|
2115
|
+
mem_sources_from(&readers, &ScanFilter::all(), &mut out);
|
|
2116
|
+
Resolver::new(MergingCursor::new(out), opts)
|
|
2117
|
+
}
|
|
2118
|
+
|
|
2119
|
+
fn collect(src: Vec<(Vec<u8>, Vec<u8>)>, opts: ResolveOptions) -> Vec<Cell> {
|
|
2120
|
+
let mut r = resolver(vec![src], opts);
|
|
2121
|
+
r.seek(b"").unwrap();
|
|
2122
|
+
let mut out = Vec::new();
|
|
2123
|
+
while let Some(c) = r.next_cell().unwrap() {
|
|
2124
|
+
out.push(cell(c.key, c.ts, c.value));
|
|
2125
|
+
}
|
|
2126
|
+
out
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
fn opts(snapshot: u64) -> ResolveOptions {
|
|
2130
|
+
let mut o = ResolveOptions::new(snapshot, 1_000);
|
|
2131
|
+
o.versions = 0;
|
|
2132
|
+
o.merge = Some(Arc::new(I64Add));
|
|
2133
|
+
o
|
|
2134
|
+
}
|
|
2135
|
+
|
|
2136
|
+
fn c(row: &str, q: &str, ts: u64, v: &[u8]) -> Cell {
|
|
2137
|
+
(row.into(), q.into(), ts, v.to_vec())
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2140
|
+
#[test]
|
|
2141
|
+
fn newest_first_and_snapshot() {
|
|
2142
|
+
let src = vec![
|
|
2143
|
+
put("r", "q", 10, 1, b"a"),
|
|
2144
|
+
put("r", "q", 20, 2, b"b"),
|
|
2145
|
+
put("r", "q", 15, 3, b"c"),
|
|
2146
|
+
];
|
|
2147
|
+
assert_eq!(
|
|
2148
|
+
collect(src.clone(), opts(3)),
|
|
2149
|
+
vec![
|
|
2150
|
+
c("r", "q", 20, b"b"),
|
|
2151
|
+
c("r", "q", 15, b"c"),
|
|
2152
|
+
c("r", "q", 10, b"a")
|
|
2153
|
+
]
|
|
2154
|
+
);
|
|
2155
|
+
assert_eq!(collect(src.clone(), opts(1)), vec![c("r", "q", 10, b"a")]);
|
|
2156
|
+
let mut one = opts(3);
|
|
2157
|
+
one.versions = 1;
|
|
2158
|
+
assert_eq!(collect(src, one), vec![c("r", "q", 20, b"b")]);
|
|
2159
|
+
}
|
|
2160
|
+
|
|
2161
|
+
#[test]
|
|
2162
|
+
fn cell_delete_hides_exact_timestamp_whatever_the_seqno() {
|
|
2163
|
+
let src = vec![
|
|
2164
|
+
put("r", "q", 10, 1, b"a"),
|
|
2165
|
+
del("r", "q", 10, 2, Kind::CellDelete),
|
|
2166
|
+
put("r", "q", 10, 3, b"later"),
|
|
2167
|
+
put("r", "q", 9, 4, b"old"),
|
|
2168
|
+
];
|
|
2169
|
+
assert_eq!(collect(src.clone(), opts(4)), vec![c("r", "q", 9, b"old")]);
|
|
2170
|
+
assert_eq!(collect(src, opts(1)), vec![c("r", "q", 10, b"a")]);
|
|
2171
|
+
}
|
|
2172
|
+
|
|
2173
|
+
#[test]
|
|
2174
|
+
fn column_delete_hides_by_timestamp_not_seqno() {
|
|
2175
|
+
let src = vec![
|
|
2176
|
+
put("r", "q", 10, 1, b"a"),
|
|
2177
|
+
put("r", "q", 30, 2, b"c"),
|
|
2178
|
+
del("r", "q", 20, 3, Kind::ColumnDelete),
|
|
2179
|
+
put("r", "q", 15, 4, b"late-old"),
|
|
2180
|
+
put("r", "q", 20, 5, b"at-delete"),
|
|
2181
|
+
put("r", "z", 1, 6, b"next-column"),
|
|
2182
|
+
];
|
|
2183
|
+
assert_eq!(
|
|
2184
|
+
collect(src, opts(6)),
|
|
2185
|
+
vec![c("r", "q", 30, b"c"), c("r", "z", 1, b"next-column")]
|
|
2186
|
+
);
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2189
|
+
#[test]
|
|
2190
|
+
fn family_marker_hides_row_cells_at_or_below_it() {
|
|
2191
|
+
let src = vec![
|
|
2192
|
+
put("r", "a", 10, 1, b"a"),
|
|
2193
|
+
put("r", "b", 30, 1, b"b"),
|
|
2194
|
+
marker("r", 20, 2),
|
|
2195
|
+
put("r", "a", 20, 3, b"a2"),
|
|
2196
|
+
put("s", "a", 5, 1, b"other-row"),
|
|
2197
|
+
];
|
|
2198
|
+
assert_eq!(
|
|
2199
|
+
collect(src.clone(), opts(3)),
|
|
2200
|
+
vec![c("r", "b", 30, b"b"), c("s", "a", 5, b"other-row")]
|
|
2201
|
+
);
|
|
2202
|
+
assert_eq!(
|
|
2203
|
+
collect(src, opts(1)),
|
|
2204
|
+
vec![
|
|
2205
|
+
c("r", "a", 10, b"a"),
|
|
2206
|
+
c("r", "b", 30, b"b"),
|
|
2207
|
+
c("s", "a", 5, b"other-row")
|
|
2208
|
+
]
|
|
2209
|
+
);
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
#[test]
|
|
2213
|
+
fn ttl_expires_at_the_boundary() {
|
|
2214
|
+
let src = vec![put("r", "q", 900, 1, b"old"), put("r", "q", 950, 2, b"new")];
|
|
2215
|
+
let mut o = opts(2);
|
|
2216
|
+
o.ttl_micros = 100; // now = 1000: 900 + 100 <= 1000 expired, 950 lives
|
|
2217
|
+
assert_eq!(collect(src, o), vec![c("r", "q", 950, b"new")]);
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
#[test]
|
|
2221
|
+
fn merge_folds_onto_base_and_runs() {
|
|
2222
|
+
let base = 5i64.to_le_bytes();
|
|
2223
|
+
let src = vec![
|
|
2224
|
+
put("r", "c", 10, 1, &base),
|
|
2225
|
+
incr("r", "c", 20, 2, 3),
|
|
2226
|
+
incr("r", "c", 30, 3, 4),
|
|
2227
|
+
put("r", "d", 10, 1, &base),
|
|
2228
|
+
incr("r", "d", 10, 2, 1),
|
|
2229
|
+
incr("r", "e", 7, 1, 2),
|
|
2230
|
+
];
|
|
2231
|
+
assert_eq!(
|
|
2232
|
+
collect(src.clone(), opts(3)),
|
|
2233
|
+
vec![
|
|
2234
|
+
c("r", "c", 30, &12i64.to_le_bytes()),
|
|
2235
|
+
c("r", "d", 10, &6i64.to_le_bytes()),
|
|
2236
|
+
c("r", "e", 7, &2i64.to_le_bytes()),
|
|
2237
|
+
]
|
|
2238
|
+
);
|
|
2239
|
+
// A snapshot before the operands returns the base as written.
|
|
2240
|
+
assert_eq!(collect(src, opts(1))[0], c("r", "c", 10, &base));
|
|
2241
|
+
}
|
|
2242
|
+
|
|
2243
|
+
#[test]
|
|
2244
|
+
fn merge_onto_non_i64_base_fails_only_when_returned() {
|
|
2245
|
+
let src = vec![
|
|
2246
|
+
put("r", "c", 10, 1, b"bad"),
|
|
2247
|
+
incr("r", "c", 20, 2, 3),
|
|
2248
|
+
put("r", "c", 30, 3, b"newest"),
|
|
2249
|
+
];
|
|
2250
|
+
let mut o = opts(3);
|
|
2251
|
+
o.versions = 1;
|
|
2252
|
+
assert_eq!(collect(src.clone(), o), vec![c("r", "c", 30, b"newest")]);
|
|
2253
|
+
let mut r = resolver(vec![src], opts(3));
|
|
2254
|
+
r.seek(b"").unwrap();
|
|
2255
|
+
assert!(r.next_cell().unwrap().is_some());
|
|
2256
|
+
assert!(matches!(r.next_cell(), Err(Error::Merge(_))));
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2259
|
+
#[test]
|
|
2260
|
+
fn point_get_sees_markers_before_the_column() {
|
|
2261
|
+
let src = vec![
|
|
2262
|
+
put("r", "q", 10, 1, b"a"),
|
|
2263
|
+
marker("r", 10, 2),
|
|
2264
|
+
put("r", "q", 11, 3, b"b"),
|
|
2265
|
+
put("r", "q", 9, 4, b"hidden"),
|
|
2266
|
+
put("r", "r", 50, 5, b"other-column"),
|
|
2267
|
+
];
|
|
2268
|
+
let mut r = resolver(vec![src], opts(5));
|
|
2269
|
+
r.seek_column(b"r", b"q").unwrap();
|
|
2270
|
+
let ts = r.next_cell().unwrap().unwrap().ts;
|
|
2271
|
+
assert_eq!(ts, 11);
|
|
2272
|
+
assert!(r.next_cell().unwrap().is_none());
|
|
2273
|
+
assert!(r.next_cell().unwrap().is_none());
|
|
2274
|
+
r.seek_column(b"r", b"zz").unwrap();
|
|
2275
|
+
assert!(r.next_cell().unwrap().is_none());
|
|
2276
|
+
r.seek_column(b"r", b"r").unwrap();
|
|
2277
|
+
assert_eq!(r.next_cell().unwrap().unwrap().ts, 50);
|
|
2278
|
+
}
|
|
2279
|
+
|
|
2280
|
+
#[test]
|
|
2281
|
+
fn columns_per_row_and_max_versions() {
|
|
2282
|
+
let src = vec![
|
|
2283
|
+
put("r", "a", 1, 1, b"1"),
|
|
2284
|
+
put("r", "a", 2, 2, b"2"),
|
|
2285
|
+
put("r", "b", 1, 1, b"x"),
|
|
2286
|
+
put("r", "c", 1, 1, b"y"),
|
|
2287
|
+
put("s", "a", 1, 1, b"s"),
|
|
2288
|
+
];
|
|
2289
|
+
let mut o = opts(2);
|
|
2290
|
+
o.versions = 1; // the family's max_versions folded in (D76)
|
|
2291
|
+
o.columns_per_row = 2;
|
|
2292
|
+
assert_eq!(
|
|
2293
|
+
collect(src, o),
|
|
2294
|
+
vec![
|
|
2295
|
+
c("r", "a", 2, b"2"),
|
|
2296
|
+
c("r", "b", 1, b"x"),
|
|
2297
|
+
c("s", "a", 1, b"s")
|
|
2298
|
+
]
|
|
2299
|
+
);
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
#[test]
|
|
2303
|
+
fn value_predicate_tests_the_newest_version() {
|
|
2304
|
+
let src = vec![
|
|
2305
|
+
put("r", "a", 1, 1, b"yes"),
|
|
2306
|
+
put("r", "a", 2, 2, b"no"),
|
|
2307
|
+
put("r", "b", 1, 1, b"yes"),
|
|
2308
|
+
];
|
|
2309
|
+
let mut o = opts(2);
|
|
2310
|
+
o.value = Some(ValuePredicate::Equals(b"yes".to_vec()));
|
|
2311
|
+
assert_eq!(collect(src, o), vec![c("r", "b", 1, b"yes")]);
|
|
2312
|
+
}
|
|
2313
|
+
|
|
2314
|
+
#[test]
|
|
2315
|
+
fn qualifier_filter_skips_columns() {
|
|
2316
|
+
let src = vec![
|
|
2317
|
+
put("r", "a", 1, 1, b"1"),
|
|
2318
|
+
put("r", "meta:x", 1, 1, b"2"),
|
|
2319
|
+
put("r", "meta:y", 1, 1, b"3"),
|
|
2320
|
+
put("r", "z", 1, 1, b"4"),
|
|
2321
|
+
put("s", "meta:z", 1, 1, b"5"),
|
|
2322
|
+
];
|
|
2323
|
+
// The filter is applied by the sources (FilteredCursor / SstIter), not the resolver:
|
|
2324
|
+
// wrap the in-memory source the way memtables are wrapped.
|
|
2325
|
+
let mut filter = pigeonhole_format::scan::ScanFilter::all();
|
|
2326
|
+
filter.qualifiers = pigeonhole_format::scan::QualifierFilter::Prefix(b"meta:".to_vec());
|
|
2327
|
+
let filtered = pigeonhole_compaction::FilteredCursor::new(VecCursor::new(src), filter);
|
|
2328
|
+
let mut out = Vec::new();
|
|
2329
|
+
let mut r = pigeonhole_compaction::CellResolver::new(filtered, opts(2));
|
|
2330
|
+
r.seek(b"").unwrap();
|
|
2331
|
+
while let Some(cell_) = r.next_cell().unwrap() {
|
|
2332
|
+
out.push(cell(cell_.key, cell_.ts, cell_.value));
|
|
2333
|
+
}
|
|
2334
|
+
assert_eq!(
|
|
2335
|
+
out,
|
|
2336
|
+
vec![
|
|
2337
|
+
c("r", "meta:x", 1, b"2"),
|
|
2338
|
+
c("r", "meta:y", 1, b"3"),
|
|
2339
|
+
c("s", "meta:z", 1, b"5")
|
|
2340
|
+
]
|
|
2341
|
+
);
|
|
2342
|
+
}
|
|
2343
|
+
|
|
2344
|
+
#[test]
|
|
2345
|
+
fn merged_sources_interleave_in_key_order() {
|
|
2346
|
+
let a = vec![put("r", "q", 20, 2, b"new"), put("s", "q", 1, 4, b"s")];
|
|
2347
|
+
let b = vec![put("r", "q", 10, 1, b"old"), put("r", "z", 5, 3, b"z")];
|
|
2348
|
+
let mut r = resolver(vec![a, b], opts(4));
|
|
2349
|
+
r.seek(b"").unwrap();
|
|
2350
|
+
let mut out = Vec::new();
|
|
2351
|
+
while let Some(c) = r.next_cell().unwrap() {
|
|
2352
|
+
out.push(cell(c.key, c.ts, c.value));
|
|
2353
|
+
}
|
|
2354
|
+
assert_eq!(
|
|
2355
|
+
out,
|
|
2356
|
+
vec![
|
|
2357
|
+
c("r", "q", 20, b"new"),
|
|
2358
|
+
c("r", "q", 10, b"old"),
|
|
2359
|
+
c("r", "z", 5, b"z"),
|
|
2360
|
+
c("s", "q", 1, b"s")
|
|
2361
|
+
]
|
|
2362
|
+
);
|
|
2363
|
+
}
|
|
2364
|
+
|
|
2365
|
+
#[test]
|
|
2366
|
+
fn set_inline_overwrites_any_cell_in_place() {
|
|
2367
|
+
use super::{CellData, CellValue};
|
|
2368
|
+
let stored = |v: &[u8]| {
|
|
2369
|
+
let mut out = Vec::new();
|
|
2370
|
+
encode_value(&mut out, ValueRef::Bytes(v));
|
|
2371
|
+
out
|
|
2372
|
+
};
|
|
2373
|
+
// From the empty cell, as `RowSink::push_inline` builds it.
|
|
2374
|
+
let mut d = CellData::EMPTY;
|
|
2375
|
+
d.set_inline(7, &stored(b"abc"));
|
|
2376
|
+
assert_eq!((d.timestamp(), d.value()), (7, ValueRef::Bytes(b"abc")));
|
|
2377
|
+
// A shorter value over a longer one keeps only its own bytes.
|
|
2378
|
+
d.set_inline(8, &stored(b"x"));
|
|
2379
|
+
assert_eq!((d.timestamp(), d.value()), (8, ValueRef::Bytes(b"x")));
|
|
2380
|
+
// Over a cell that held a heap value.
|
|
2381
|
+
let mut d = CellData {
|
|
2382
|
+
ts: 1,
|
|
2383
|
+
value: CellValue::Owned(stored(&[9; 300])),
|
|
2384
|
+
};
|
|
2385
|
+
let full = vec![5; CellData::INLINE_MAX - 1];
|
|
2386
|
+
d.set_inline(2, &stored(&full));
|
|
2387
|
+
assert!(matches!(d.value, CellValue::Inline { .. }));
|
|
2388
|
+
assert_eq!((d.timestamp(), d.value()), (2, ValueRef::Bytes(&full[..])));
|
|
2389
|
+
}
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
thread_local! {
|
|
2393
|
+
/// While an async read's attempt runs on this thread: whether it is cache-only, and the
|
|
2394
|
+
/// file reads it made synchronously so far (D196), counted into
|
|
2395
|
+
/// `Metrics::async_sync_reads`.
|
|
2396
|
+
static ASYNC_READ: std::cell::Cell<Option<(bool, u64)>> =
|
|
2397
|
+
const { std::cell::Cell::new(None) };
|
|
2398
|
+
}
|
|
2399
|
+
|
|
2400
|
+
/// The running async read's mode on this thread: `Some(cache_only)`, or `None` outside one.
|
|
2401
|
+
pub(crate) fn async_read_mode() -> Option<bool> {
|
|
2402
|
+
ASYNC_READ.with(|c| c.get().map(|(cache_only, _)| cache_only))
|
|
2403
|
+
}
|
|
2404
|
+
|
|
2405
|
+
/// Counts a file read the running async read makes synchronously.
|
|
2406
|
+
pub(crate) fn note_sync_read() {
|
|
2407
|
+
ASYNC_READ.with(|c| {
|
|
2408
|
+
if let Some((cache_only, n)) = c.get() {
|
|
2409
|
+
c.set(Some((cache_only, n + 1)));
|
|
2410
|
+
}
|
|
2411
|
+
});
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2414
|
+
/// Runs `f` as an async read's attempt (`cache_only`, or a synchronous fallback); returns
|
|
2415
|
+
/// its result and the file reads it made synchronously. The flag is restored even if `f`
|
|
2416
|
+
/// panics.
|
|
2417
|
+
pub(crate) fn as_async_read<T>(cache_only: bool, f: impl FnOnce() -> T) -> (T, u64) {
|
|
2418
|
+
struct Restore(Option<(bool, u64)>);
|
|
2419
|
+
impl Drop for Restore {
|
|
2420
|
+
fn drop(&mut self) {
|
|
2421
|
+
ASYNC_READ.with(|c| c.set(self.0));
|
|
2422
|
+
}
|
|
2423
|
+
}
|
|
2424
|
+
let restore = Restore(ASYNC_READ.with(|c| c.replace(Some((cache_only, 0)))));
|
|
2425
|
+
let out = f();
|
|
2426
|
+
let n = ASYNC_READ.with(|c| c.get()).map_or(0, |(_, n)| n);
|
|
2427
|
+
drop(restore);
|
|
2428
|
+
(out, n)
|
|
2429
|
+
}
|