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,1600 @@
|
|
|
1
|
+
//! The change feed's reader in the writer process (D310 PR 3, #1248; rev 3 §2.4–§2.6).
|
|
2
|
+
//!
|
|
3
|
+
//! A [`FeedReader`] merges every WAL stream's records into whole commits in seqno order, up
|
|
4
|
+
//! to the feed's frontier ([`Engine::feed_frontier`](crate::Engine::feed_frontier)). It
|
|
5
|
+
//! reads the stream files (through [`FeedCursor`]), never the writer's memory: by the M1
|
|
6
|
+
//! invariant (concurrency.md, the written-hold protocol) every record at or below the
|
|
7
|
+
//! frontier is in its file, so a poll that loads the frontier and then reads every stream to
|
|
8
|
+
//! its end has every commit up to it.
|
|
9
|
+
//!
|
|
10
|
+
//! - **Keys.** A single is ordered by its seqno, a cross-shard commit by its Decision's apply
|
|
11
|
+
//! seqno; its PREPAREs are held by id until the Decision is read (FORMAT §10.3, D263).
|
|
12
|
+
//! - **An aborted round's PREPARE** is dropped once its own stream's checkpoint passed it
|
|
13
|
+
//! with no Decision read (simp724's rule): a checkpoint passes a PREPARE only once it is
|
|
14
|
+
//! aborted, or decided and settled, and then its Decision was in its file before the
|
|
15
|
+
//! checkpoint moved. The checkpoints are loaded before the frontier. The stream's floor
|
|
16
|
+
//! is the backstop.
|
|
17
|
+
//! - **The mark rule** (§2.2): a record counts only in a segment whose session fed every
|
|
18
|
+
//! table the feed follows, within sessions that chain with no other root commit between
|
|
19
|
+
//! them (the sidecar, FORMAT §10.4).
|
|
20
|
+
//! - **Tokens** fall between seqnos (§2.5): the last delivered seqno, and per stream where to
|
|
21
|
+
//! read again and how far the delivered records reached.
|
|
22
|
+
//! - **Expiry** ([`Expiry`]) is sticky.
|
|
23
|
+
|
|
24
|
+
use std::collections::{BTreeMap, HashMap};
|
|
25
|
+
use std::sync::Arc;
|
|
26
|
+
use std::sync::atomic::{AtomicU64, Ordering};
|
|
27
|
+
use std::time::{Duration, Instant};
|
|
28
|
+
|
|
29
|
+
use pigeonhole_compaction::blob_pointer;
|
|
30
|
+
use pigeonhole_format::feed::{FeedEntry, FeedHeader, FeedTables, decode_entries};
|
|
31
|
+
use pigeonhole_format::wal::{BatchRef, WalRecord};
|
|
32
|
+
use pigeonhole_format::{FamilyId, Kind, Lsn, Seqno, StreamId, TableId, Timestamp};
|
|
33
|
+
use pigeonhole_io::OpenOptions;
|
|
34
|
+
use pigeonhole_wal::{FeedCursor, Step};
|
|
35
|
+
|
|
36
|
+
use crate::shard::{Shared, Wake};
|
|
37
|
+
use crate::{Error, Result};
|
|
38
|
+
use pigeonhole_shm::ShmRegion;
|
|
39
|
+
|
|
40
|
+
/// The token's format version.
|
|
41
|
+
const TOKEN_VERSION: u8 = 1;
|
|
42
|
+
|
|
43
|
+
/// How long a waiting reader sleeps when the frontier is held by the change feed's own
|
|
44
|
+
/// holds (a lazy flush or background sync to come) or a stream's next segment header is not
|
|
45
|
+
/// on disk yet: the wait is bounded, never a spin.
|
|
46
|
+
const HELD_BACKOFF: Duration = Duration::from_millis(1);
|
|
47
|
+
|
|
48
|
+
/// Where a feed starts.
|
|
49
|
+
#[derive(Debug, Clone)]
|
|
50
|
+
pub enum FeedStart {
|
|
51
|
+
/// With the commits after the frontier at subscription.
|
|
52
|
+
Now,
|
|
53
|
+
/// With the oldest commit retained history still holds for the feed's tables. Under load
|
|
54
|
+
/// that history may be recycled before the reader reaches it, which expires the feed at
|
|
55
|
+
/// once; [`FeedStart::After`] from a snapshot is the way to bootstrap.
|
|
56
|
+
Oldest,
|
|
57
|
+
/// With the commits after `seqno` (a snapshot's seqno).
|
|
58
|
+
After(Seqno),
|
|
59
|
+
/// Where a token left off ([`FeedReader::token`]).
|
|
60
|
+
Token(Vec<u8>),
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/// What a feed follows.
|
|
64
|
+
#[derive(Debug, Clone)]
|
|
65
|
+
pub struct FeedSpec {
|
|
66
|
+
/// The tables (at least one), each fed by the session.
|
|
67
|
+
pub tables: Vec<TableId>,
|
|
68
|
+
/// Only mutations of rows starting with these bytes (empty: every row).
|
|
69
|
+
pub prefix: Vec<u8>,
|
|
70
|
+
/// The durable frontier (the default, §2.4 S3) rather than the visible one.
|
|
71
|
+
pub durable: bool,
|
|
72
|
+
/// Where to start.
|
|
73
|
+
pub start: FeedStart,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// One mutation of a delivered commit.
|
|
77
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
78
|
+
pub struct Change {
|
|
79
|
+
/// Its table.
|
|
80
|
+
pub table: TableId,
|
|
81
|
+
/// Its family.
|
|
82
|
+
pub family: FamilyId,
|
|
83
|
+
/// Put, Merge, or one of the delete kinds.
|
|
84
|
+
pub kind: Kind,
|
|
85
|
+
/// Its timestamp: explicit, or the commit's.
|
|
86
|
+
pub ts: Timestamp,
|
|
87
|
+
/// The row.
|
|
88
|
+
pub row: Vec<u8>,
|
|
89
|
+
/// The qualifier (empty for a family delete).
|
|
90
|
+
pub qualifier: Vec<u8>,
|
|
91
|
+
/// The stored value (FORMAT §3), with a separated value resolved; empty for deletes.
|
|
92
|
+
pub value: Vec<u8>,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// One whole commit (§2.5): every mutation of it the feed follows.
|
|
96
|
+
#[derive(Debug, Clone, Default, PartialEq, Eq)]
|
|
97
|
+
pub struct Commit {
|
|
98
|
+
/// The seqno it applied at.
|
|
99
|
+
pub seqno: Seqno,
|
|
100
|
+
/// Its commit timestamp.
|
|
101
|
+
pub ts: Timestamp,
|
|
102
|
+
/// Its mutations in the feed's tables and prefix, in record order (shares in their
|
|
103
|
+
/// participants' order).
|
|
104
|
+
pub changes: Vec<Change>,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// Why a feed ended (§2.6): the feed can't deliver what follows its position.
|
|
108
|
+
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
109
|
+
pub struct Expiry {
|
|
110
|
+
/// What happened, for people.
|
|
111
|
+
pub reason: String,
|
|
112
|
+
/// The oldest seqno history still holds, when known.
|
|
113
|
+
pub oldest_retained: Option<Seqno>,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// What [`FeedReader::try_next`] found.
|
|
117
|
+
#[derive(Debug)]
|
|
118
|
+
pub enum Next<'a> {
|
|
119
|
+
/// The next whole commit.
|
|
120
|
+
Commit(&'a Commit),
|
|
121
|
+
/// Nothing past the frontier yet.
|
|
122
|
+
Pending,
|
|
123
|
+
/// The feed has expired (and stays so).
|
|
124
|
+
Expired(&'a Expiry),
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// A mutation as read, before its commit's timestamp is known.
|
|
128
|
+
#[derive(Debug, Clone)]
|
|
129
|
+
struct Raw {
|
|
130
|
+
table: TableId,
|
|
131
|
+
family: FamilyId,
|
|
132
|
+
kind: Kind,
|
|
133
|
+
ts: Option<Timestamp>,
|
|
134
|
+
row: Vec<u8>,
|
|
135
|
+
qualifier: Vec<u8>,
|
|
136
|
+
value: Vec<u8>,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// A record as read, owned.
|
|
140
|
+
enum Item {
|
|
141
|
+
Single {
|
|
142
|
+
seqno: Seqno,
|
|
143
|
+
ts: Timestamp,
|
|
144
|
+
changes: Vec<Raw>,
|
|
145
|
+
},
|
|
146
|
+
Prepare {
|
|
147
|
+
id: Seqno,
|
|
148
|
+
changes: Vec<Raw>,
|
|
149
|
+
},
|
|
150
|
+
Decision {
|
|
151
|
+
id: Seqno,
|
|
152
|
+
apply: Seqno,
|
|
153
|
+
ts: Timestamp,
|
|
154
|
+
participants: Vec<StreamId>,
|
|
155
|
+
},
|
|
156
|
+
Other,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/// A record read but not yet delivered, by key.
|
|
160
|
+
#[derive(Debug)]
|
|
161
|
+
enum Pending {
|
|
162
|
+
Single {
|
|
163
|
+
ts: Timestamp,
|
|
164
|
+
changes: Vec<Raw>,
|
|
165
|
+
stream: usize,
|
|
166
|
+
start: Lsn,
|
|
167
|
+
end: Lsn,
|
|
168
|
+
},
|
|
169
|
+
Decided {
|
|
170
|
+
id: Seqno,
|
|
171
|
+
ts: Timestamp,
|
|
172
|
+
participants: Vec<StreamId>,
|
|
173
|
+
stream: usize,
|
|
174
|
+
start: Lsn,
|
|
175
|
+
end: Lsn,
|
|
176
|
+
/// The session that wrote the Decision.
|
|
177
|
+
session: u64,
|
|
178
|
+
},
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/// A PREPARE waiting for its Decision.
|
|
182
|
+
#[derive(Debug)]
|
|
183
|
+
struct Held {
|
|
184
|
+
stream: usize,
|
|
185
|
+
start: Lsn,
|
|
186
|
+
end: Lsn,
|
|
187
|
+
changes: Vec<Raw>,
|
|
188
|
+
/// Read in a segment outside the feed's history (the mark rule): delivering it expires.
|
|
189
|
+
outside: bool,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/// One stream's reading state.
|
|
193
|
+
#[derive(Debug)]
|
|
194
|
+
struct StreamRead {
|
|
195
|
+
cursor: FeedCursor,
|
|
196
|
+
/// Just past the last delivered (or skipped) record of this stream.
|
|
197
|
+
delivered_end: Lsn,
|
|
198
|
+
/// From a token: the delivered records reached here, so the stream must too.
|
|
199
|
+
must_reach: Option<Lsn>,
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/// The sessions whose segments the feed's history runs through (the mark rule).
|
|
203
|
+
#[derive(Debug)]
|
|
204
|
+
struct History {
|
|
205
|
+
sessions: Vec<u64>,
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
impl History {
|
|
209
|
+
fn holds(&self, session: u64) -> bool {
|
|
210
|
+
session != 0 && self.sessions.contains(&session)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/// Distinguishes feed readers' entries in the watermark registries from commits' and
|
|
215
|
+
/// shards' (`watermark_waiters`): the top two bits set.
|
|
216
|
+
static NEXT_KEY: AtomicU64 = AtomicU64::new(0);
|
|
217
|
+
|
|
218
|
+
/// A thread-unparking waker for a blocking wait.
|
|
219
|
+
struct Unpark(std::thread::Thread);
|
|
220
|
+
|
|
221
|
+
impl std::task::Wake for Unpark {
|
|
222
|
+
fn wake(self: Arc<Self>) {
|
|
223
|
+
self.0.unpark();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/// A subscription to the committed changes of some tables (D310): see the module docs.
|
|
228
|
+
pub struct FeedReader {
|
|
229
|
+
shared: Arc<Shared>,
|
|
230
|
+
/// The shared-memory region the frontier and the streams' marks are read from: the
|
|
231
|
+
/// writer's own, or a reader process's attachment (D310 PR 4). Stale once the writer
|
|
232
|
+
/// that made it is gone: the feed then fails with `SnapshotExpired` and the caller
|
|
233
|
+
/// subscribes again from its token.
|
|
234
|
+
shm: ShmRegion,
|
|
235
|
+
/// The writer's feed, in the writer process (its checkpoint history serves start
|
|
236
|
+
/// positions and its intervals bound waits); `None` in a reader process.
|
|
237
|
+
writer: Option<Arc<crate::feed::Feed>>,
|
|
238
|
+
/// The view blob values are resolved through: the writer's current one, or a reader
|
|
239
|
+
/// process's view of its attachment.
|
|
240
|
+
view: ViewFn,
|
|
241
|
+
/// A reader process's wait between polls, doubling while nothing arrives.
|
|
242
|
+
backoff: Duration,
|
|
243
|
+
/// Since when a reader process has waited for a view listing the next commit's blob
|
|
244
|
+
/// files.
|
|
245
|
+
blob_wait: Option<Instant>,
|
|
246
|
+
tables: Vec<TableId>,
|
|
247
|
+
prefix: Vec<u8>,
|
|
248
|
+
durable: bool,
|
|
249
|
+
streams: Vec<StreamRead>,
|
|
250
|
+
history: History,
|
|
251
|
+
/// Every commit with a key at or below this was delivered, skipped or precedes the
|
|
252
|
+
/// start.
|
|
253
|
+
delivered: Seqno,
|
|
254
|
+
/// The frontier as of the last poll.
|
|
255
|
+
frontier: Seqno,
|
|
256
|
+
/// The frontier the streams were last read to their ends under (#1448): while the
|
|
257
|
+
/// frontier stays there, no commit happened since, and every record at or below it was
|
|
258
|
+
/// read then, so a poll reads nothing.
|
|
259
|
+
read_through: Option<Seqno>,
|
|
260
|
+
/// Polls that read the streams (an inspection count for tests).
|
|
261
|
+
stream_reads: u64,
|
|
262
|
+
/// The newest session of any record read (the token's anchor).
|
|
263
|
+
session: u64,
|
|
264
|
+
ready: BTreeMap<Seqno, Pending>,
|
|
265
|
+
held: HashMap<Seqno, Vec<Held>>,
|
|
266
|
+
/// Rounds whose shares rule C dropped (no Decision read, the checkpoint passed): id →
|
|
267
|
+
/// (stream, epoch) of a dropped share. A Decision for one later expires the feed rather
|
|
268
|
+
/// than passing over its commit as recovery's all-or-nothing (simp724's H1 on #1316).
|
|
269
|
+
/// An entry goes once the floor passes its segment.
|
|
270
|
+
dropped: HashMap<Seqno, (usize, u32)>,
|
|
271
|
+
out: Commit,
|
|
272
|
+
expired: Option<Expiry>,
|
|
273
|
+
/// An error that ended the reader once a commit was already taken (a blob value that
|
|
274
|
+
/// couldn't be read): every later call fails, since going on would skip that commit.
|
|
275
|
+
failed: Option<String>,
|
|
276
|
+
key: u64,
|
|
277
|
+
/// This open's session.
|
|
278
|
+
current: u64,
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
impl Drop for FeedReader {
|
|
282
|
+
fn drop(&mut self) {
|
|
283
|
+
// An async reader may have left a waker for the feed's holds.
|
|
284
|
+
if let Some(feed) = &self.writer {
|
|
285
|
+
feed.forget_hold_waiter(self.key);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
impl std::fmt::Debug for FeedReader {
|
|
291
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
292
|
+
f.debug_struct("FeedReader")
|
|
293
|
+
.field("tables", &self.tables)
|
|
294
|
+
.field("durable", &self.durable)
|
|
295
|
+
.field("delivered", &self.delivered)
|
|
296
|
+
.field("frontier", &self.frontier)
|
|
297
|
+
.field("expired", &self.expired)
|
|
298
|
+
.finish_non_exhaustive()
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/// The current view, for resolving blob values: the writer's, or a reader process's view of
|
|
303
|
+
/// its attachment.
|
|
304
|
+
pub(crate) type ViewFn = Box<dyn Fn() -> Result<Arc<crate::snapshot::View>> + Send + Sync>;
|
|
305
|
+
|
|
306
|
+
/// Where a feed reads from (D310 PR 4): the shared-memory region of the writer it follows,
|
|
307
|
+
/// how to get the current view, and the writer's feed when this is the writer process.
|
|
308
|
+
pub(crate) struct Origin {
|
|
309
|
+
pub(crate) shm: ShmRegion,
|
|
310
|
+
pub(crate) view: ViewFn,
|
|
311
|
+
pub(crate) writer: Option<Arc<crate::feed::Feed>>,
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/// A reader process's first and longest waits between polls: it watches the writer's
|
|
315
|
+
/// watermarks in shared memory, so the writer does no per-commit work for it.
|
|
316
|
+
const READER_BACKOFF_MIN: Duration = Duration::from_micros(50);
|
|
317
|
+
const READER_BACKOFF_MAX: Duration = Duration::from_millis(5);
|
|
318
|
+
/// How long a reader process waits for a view that lists a commit's blob files before it
|
|
319
|
+
/// takes them as removed (the bound a reader snapshot waits for its view too).
|
|
320
|
+
const READER_BLOB_WAIT: Duration = Duration::from_secs(1);
|
|
321
|
+
|
|
322
|
+
/// What one poll left.
|
|
323
|
+
enum Polled {
|
|
324
|
+
Commit,
|
|
325
|
+
Pending { held: bool },
|
|
326
|
+
Expired,
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
fn expiry(reason: impl Into<String>) -> Expiry {
|
|
330
|
+
Expiry {
|
|
331
|
+
reason: reason.into(),
|
|
332
|
+
oldest_retained: None,
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
impl FeedReader {
|
|
337
|
+
pub(crate) fn open(shared: Arc<Shared>, spec: FeedSpec, origin: Origin) -> Result<FeedReader> {
|
|
338
|
+
// The session and fed tables of the writer followed: the writer's own feed, or in a
|
|
339
|
+
// reader process the writer's session entry, the sidecar's last (it is written before
|
|
340
|
+
// the writer's shared memory exists, so the attachment's writer wrote it).
|
|
341
|
+
let (session, fed) = match &origin.writer {
|
|
342
|
+
Some(feed) => (feed.session, feed.tables.clone()),
|
|
343
|
+
None => writer_session(&shared)?,
|
|
344
|
+
};
|
|
345
|
+
let mut tables = spec.tables;
|
|
346
|
+
tables.sort_unstable();
|
|
347
|
+
tables.dedup();
|
|
348
|
+
if tables.is_empty() {
|
|
349
|
+
return Err(Error::InvalidArgument(
|
|
350
|
+
"a change feed follows at least one table".into(),
|
|
351
|
+
));
|
|
352
|
+
}
|
|
353
|
+
if let Some(t) = tables.iter().find(|&&t| !fed.contains(t)) {
|
|
354
|
+
return Err(Error::InvalidArgument(format!(
|
|
355
|
+
"table {} is not fed: name it in the feed's tables at open",
|
|
356
|
+
t.0
|
|
357
|
+
)));
|
|
358
|
+
}
|
|
359
|
+
let history = read_history(&shared, session, &tables)?;
|
|
360
|
+
let key = (3 << 62) | NEXT_KEY.fetch_add(1, Ordering::Relaxed);
|
|
361
|
+
let db_id = shared.pager.db_id();
|
|
362
|
+
let mut this = FeedReader {
|
|
363
|
+
tables,
|
|
364
|
+
prefix: spec.prefix,
|
|
365
|
+
durable: spec.durable,
|
|
366
|
+
streams: Vec::with_capacity(shared.shards),
|
|
367
|
+
history,
|
|
368
|
+
delivered: 0,
|
|
369
|
+
frontier: 0,
|
|
370
|
+
read_through: None,
|
|
371
|
+
stream_reads: 0,
|
|
372
|
+
session: 0,
|
|
373
|
+
ready: BTreeMap::new(),
|
|
374
|
+
held: HashMap::new(),
|
|
375
|
+
dropped: HashMap::new(),
|
|
376
|
+
out: Commit::default(),
|
|
377
|
+
expired: None,
|
|
378
|
+
failed: None,
|
|
379
|
+
key,
|
|
380
|
+
current: session,
|
|
381
|
+
shared,
|
|
382
|
+
shm: origin.shm,
|
|
383
|
+
writer: origin.writer,
|
|
384
|
+
view: origin.view,
|
|
385
|
+
backoff: READER_BACKOFF_MIN,
|
|
386
|
+
blob_wait: None,
|
|
387
|
+
};
|
|
388
|
+
// `Oldest` from an earlier session still kept whole (#1465), when there is one.
|
|
389
|
+
let earlier = match spec.start {
|
|
390
|
+
FeedStart::Oldest => this.earlier_start(db_id),
|
|
391
|
+
_ => None,
|
|
392
|
+
};
|
|
393
|
+
// Where each stream starts, and the bound below which nothing is delivered.
|
|
394
|
+
let starts: Vec<(Lsn, Option<Lsn>)> = match (spec.start, earlier) {
|
|
395
|
+
(_, Some((bound, at))) => {
|
|
396
|
+
this.delivered = bound;
|
|
397
|
+
at.into_iter().map(|a| (a, None)).collect()
|
|
398
|
+
}
|
|
399
|
+
(FeedStart::Token(bytes), None) => match this.decode_token(&bytes, db_id)? {
|
|
400
|
+
Ok(starts) => starts,
|
|
401
|
+
Err(e) => {
|
|
402
|
+
this.expired = Some(e);
|
|
403
|
+
return Ok(this);
|
|
404
|
+
}
|
|
405
|
+
},
|
|
406
|
+
(start, None) => {
|
|
407
|
+
let mut reader_starts: Vec<Lsn> = Vec::new();
|
|
408
|
+
// A reader process's view of each stream's floor and lost bound, loaded once
|
|
409
|
+
// (the floor first, so the bound is at least that floor's).
|
|
410
|
+
let marks: Vec<pigeonhole_shm::FeedMarksView> = (0..this.shared.shards)
|
|
411
|
+
.map(|s| this.shm.feed_marks(s as u32))
|
|
412
|
+
.collect();
|
|
413
|
+
let bound = match start {
|
|
414
|
+
FeedStart::Now => {
|
|
415
|
+
// A reader process starts each stream at its checkpoint, loaded
|
|
416
|
+
// first: every record before it was applied and visible when the
|
|
417
|
+
// checkpoint moved, so its key is at or below the bound loaded next.
|
|
418
|
+
if this.writer.is_none() {
|
|
419
|
+
reader_starts = (0..this.shared.shards)
|
|
420
|
+
.map(|s| Lsn(this.shm.feed_marks(s as u32).checkpoint))
|
|
421
|
+
.collect();
|
|
422
|
+
}
|
|
423
|
+
this.shm
|
|
424
|
+
.visible_seqno()
|
|
425
|
+
.max(this.shm.written_seqno(this.durable))
|
|
426
|
+
.max(this.writer.as_ref().map_or(0, |f| f.checkpoint_key()))
|
|
427
|
+
}
|
|
428
|
+
FeedStart::After(seqno) => seqno,
|
|
429
|
+
FeedStart::Oldest => {
|
|
430
|
+
// The largest bound every stream's retained history serves: from the
|
|
431
|
+
// writer's checkpoint history, or in a reader process from the
|
|
432
|
+
// bounds it mirrors (`FEED_BOUND`).
|
|
433
|
+
match &this.writer {
|
|
434
|
+
Some(feed) => (0..this.shared.shards)
|
|
435
|
+
.map(|s| feed.oldest_bound(s, this.floor(s)))
|
|
436
|
+
.max()
|
|
437
|
+
.unwrap_or(0),
|
|
438
|
+
None => marks.iter().map(|m| m.bound).max().unwrap_or(0),
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
FeedStart::Token(_) => unreachable!("handled above"),
|
|
442
|
+
};
|
|
443
|
+
this.delivered = bound;
|
|
444
|
+
let mut starts = Vec::with_capacity(this.shared.shards);
|
|
445
|
+
for (s, m) in marks.iter().enumerate() {
|
|
446
|
+
// A reader process has no checkpoint history: from its checkpoint for
|
|
447
|
+
// `Now`, else from the stream's floor, skipping keys at or below the
|
|
448
|
+
// bound (correct, and slower to start).
|
|
449
|
+
let at = match &this.writer {
|
|
450
|
+
Some(feed) => feed.start_at(s, bound, this.floor(s)),
|
|
451
|
+
// A record dropped below the floor may have a key above the bound:
|
|
452
|
+
// that history is gone (simp724's B1), as `start_at` says for the
|
|
453
|
+
// writer.
|
|
454
|
+
None if reader_starts.is_empty() && m.bound > bound => None,
|
|
455
|
+
None => Some(
|
|
456
|
+
reader_starts
|
|
457
|
+
.get(s)
|
|
458
|
+
.copied()
|
|
459
|
+
.unwrap_or(Lsn::new(m.floor, 0)),
|
|
460
|
+
),
|
|
461
|
+
};
|
|
462
|
+
match at {
|
|
463
|
+
Some(at) => starts.push((at, None)),
|
|
464
|
+
None => {
|
|
465
|
+
this.expired = Some(expiry(format!(
|
|
466
|
+
"history past seqno {bound} is no longer retained"
|
|
467
|
+
)));
|
|
468
|
+
return Ok(this);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
starts
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
for (s, (at, must_reach)) in starts.into_iter().enumerate() {
|
|
476
|
+
let mut cursor = FeedCursor::open(
|
|
477
|
+
&this.shared.vfs,
|
|
478
|
+
&this.shared.path,
|
|
479
|
+
StreamId(s as u32),
|
|
480
|
+
db_id,
|
|
481
|
+
at,
|
|
482
|
+
)?;
|
|
483
|
+
// In the writer's process a stop in the head segment reads no segment headers
|
|
484
|
+
// (D310 PR 5b's subscriber cost; a reader process has no marks to follow).
|
|
485
|
+
if let Some(marks) = this.writer.as_ref().and_then(|f| f.marks(s)) {
|
|
486
|
+
cursor.follow_head(Arc::clone(marks));
|
|
487
|
+
}
|
|
488
|
+
this.streams.push(StreamRead {
|
|
489
|
+
cursor,
|
|
490
|
+
delivered_end: at,
|
|
491
|
+
must_reach,
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
Ok(this)
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/// The next whole commit, without waiting.
|
|
498
|
+
pub fn try_next(&mut self) -> Result<Next<'_>> {
|
|
499
|
+
let polled = self.poll()?;
|
|
500
|
+
Ok(self.lend(polled))
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/// The next whole commit, waiting up to `timeout` for one. Waits on the watermark the
|
|
504
|
+
/// feed follows (never spins): a commit wakes it once its seqno passes; where the feed's
|
|
505
|
+
/// own holds keep the frontier back, it looks again every millisecond.
|
|
506
|
+
pub fn wait(&mut self, timeout: Duration) -> Result<Next<'_>> {
|
|
507
|
+
let deadline = Instant::now() + timeout;
|
|
508
|
+
loop {
|
|
509
|
+
let polled = self.poll()?;
|
|
510
|
+
let Polled::Pending { held } = polled else {
|
|
511
|
+
self.backoff = READER_BACKOFF_MIN;
|
|
512
|
+
return Ok(self.lend(polled));
|
|
513
|
+
};
|
|
514
|
+
let now = Instant::now();
|
|
515
|
+
if now >= deadline {
|
|
516
|
+
return Ok(Next::Pending);
|
|
517
|
+
}
|
|
518
|
+
let mut park = deadline - now;
|
|
519
|
+
if self.writer.is_none() {
|
|
520
|
+
// A reader process watches shared memory: a bounded backoff, never a spin.
|
|
521
|
+
park = park.min(self.backoff);
|
|
522
|
+
self.backoff = (self.backoff * 2).min(READER_BACKOFF_MAX);
|
|
523
|
+
} else if held {
|
|
524
|
+
park = park.min(HELD_BACKOFF);
|
|
525
|
+
} else {
|
|
526
|
+
let waker = std::task::Waker::from(Arc::new(Unpark(std::thread::current())));
|
|
527
|
+
let target = self.frontier.saturating_add(1);
|
|
528
|
+
let waiters = if self.durable {
|
|
529
|
+
&self.shared.durable_waiters
|
|
530
|
+
} else {
|
|
531
|
+
&self.shared.waiters
|
|
532
|
+
};
|
|
533
|
+
waiters.register(self.key, target, Wake::Task(waker));
|
|
534
|
+
// A publish that missed the registration is seen here.
|
|
535
|
+
if self.shm.written_seqno(self.durable) >= target {
|
|
536
|
+
continue;
|
|
537
|
+
}
|
|
538
|
+
// The feed's holds may pass the watermark later than the publish that
|
|
539
|
+
// wakes this: bound the sleep by the hold's interval.
|
|
540
|
+
if let Some(feed) = &self.writer {
|
|
541
|
+
let hold = if self.durable {
|
|
542
|
+
feed.sync_interval_nanos
|
|
543
|
+
} else {
|
|
544
|
+
feed.flush_interval_nanos
|
|
545
|
+
};
|
|
546
|
+
park = park.min(Duration::from_nanos(hold));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
std::thread::park_timeout(park);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/// The next whole commit, for an async caller (D310 PR 5a): `Poll::Ready` with what
|
|
554
|
+
/// [`try_next`](Self::try_next) would return once there is a commit or an expiry,
|
|
555
|
+
/// `Poll::Pending` otherwise, with `cx`'s waker registered so the task is woken (never
|
|
556
|
+
/// spinning) when the frontier can move: by the watermark the feed follows, or, where
|
|
557
|
+
/// the feed's own holds keep it back, by the shard as it lets a hold go.
|
|
558
|
+
///
|
|
559
|
+
/// The writer process only: in a reader process nothing in this process learns of the
|
|
560
|
+
/// writer's progress, so it is `Unsupported` there; use [`wait`](Self::wait) on a thread
|
|
561
|
+
/// of its own (#1407 tracks an async form).
|
|
562
|
+
pub fn poll_next(
|
|
563
|
+
&mut self,
|
|
564
|
+
cx: &mut std::task::Context<'_>,
|
|
565
|
+
) -> std::task::Poll<Result<Next<'_>>> {
|
|
566
|
+
use std::task::Poll;
|
|
567
|
+
let Some(feed) = self.writer.clone() else {
|
|
568
|
+
return Poll::Ready(Err(Error::Unsupported(
|
|
569
|
+
"an async change feed in a reader process: call the feed's blocking `next` on a \
|
|
570
|
+
thread of its own (#1407)",
|
|
571
|
+
)));
|
|
572
|
+
};
|
|
573
|
+
// Whether this call left a waker on the hold list: a poll that then finds a commit
|
|
574
|
+
// takes it back, so releases don't keep paying for a waiter that isn't waiting
|
|
575
|
+
// (simp724's P1 on #1408).
|
|
576
|
+
let mut on_hold_list = false;
|
|
577
|
+
loop {
|
|
578
|
+
let polled = match self.poll() {
|
|
579
|
+
Ok(p) => p,
|
|
580
|
+
Err(e) => {
|
|
581
|
+
if on_hold_list {
|
|
582
|
+
feed.forget_hold_waiter(self.key);
|
|
583
|
+
}
|
|
584
|
+
return Poll::Ready(Err(e));
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
let Polled::Pending { held } = polled else {
|
|
588
|
+
if on_hold_list {
|
|
589
|
+
feed.forget_hold_waiter(self.key);
|
|
590
|
+
}
|
|
591
|
+
return Poll::Ready(Ok(self.lend(polled)));
|
|
592
|
+
};
|
|
593
|
+
let target = self.frontier.saturating_add(1);
|
|
594
|
+
if held {
|
|
595
|
+
// The feed's own holds keep the frontier below the watermark: the shard wakes
|
|
596
|
+
// this when it lets one go.
|
|
597
|
+
feed.wait_for_hold(self.key, cx.waker());
|
|
598
|
+
on_hold_list = true;
|
|
599
|
+
} else {
|
|
600
|
+
let waiters = if self.durable {
|
|
601
|
+
&self.shared.durable_waiters
|
|
602
|
+
} else {
|
|
603
|
+
&self.shared.waiters
|
|
604
|
+
};
|
|
605
|
+
waiters.register(self.key, target, Wake::Task(cx.waker().clone()));
|
|
606
|
+
}
|
|
607
|
+
// A publish or a release that missed the registration is seen here.
|
|
608
|
+
if self.shm.written_seqno(self.durable) < target {
|
|
609
|
+
return Poll::Pending;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
fn lend(&self, polled: Polled) -> Next<'_> {
|
|
615
|
+
match polled {
|
|
616
|
+
Polled::Commit => Next::Commit(&self.out),
|
|
617
|
+
Polled::Pending { .. } => Next::Pending,
|
|
618
|
+
Polled::Expired => Next::Expired(self.expired.as_ref().expect("set")),
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/// PREPAREs read and held for their Decision (an inspection helper for tests).
|
|
623
|
+
#[cfg(feature = "test-hooks")]
|
|
624
|
+
#[doc(hidden)]
|
|
625
|
+
pub fn held_prepares(&self) -> usize {
|
|
626
|
+
self.held.values().map(Vec::len).sum()
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/// The frontier as of the last poll.
|
|
630
|
+
pub fn frontier(&self) -> Seqno {
|
|
631
|
+
self.frontier
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/// The last delivered seqno: every commit at or below it was delivered (or precedes the
|
|
635
|
+
/// feed's start).
|
|
636
|
+
pub fn delivered(&self) -> Seqno {
|
|
637
|
+
self.delivered
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/// Where this feed is, to resume it with [`FeedStart::Token`]: just past the last
|
|
641
|
+
/// commit [`FeedReader::try_next`] returned, never inside one (§2.5).
|
|
642
|
+
pub fn token(&self) -> Vec<u8> {
|
|
643
|
+
let mut t = Vec::with_capacity(1 + 16 + 4 + 8 + 8 + 16 * self.streams.len());
|
|
644
|
+
t.push(TOKEN_VERSION);
|
|
645
|
+
t.extend_from_slice(&self.shared.pager.db_id());
|
|
646
|
+
t.extend_from_slice(&(self.streams.len() as u32).to_le_bytes());
|
|
647
|
+
t.extend_from_slice(&self.delivered.to_le_bytes());
|
|
648
|
+
t.extend_from_slice(&self.session.to_le_bytes());
|
|
649
|
+
for (s, st) in self.streams.iter().enumerate() {
|
|
650
|
+
t.extend_from_slice(&self.hint(s).0.to_le_bytes());
|
|
651
|
+
t.extend_from_slice(&st.delivered_end.0.to_le_bytes());
|
|
652
|
+
}
|
|
653
|
+
t
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
/// Where stream `s` must be read again from to deliver everything after `delivered`:
|
|
657
|
+
/// the earliest record of it read but not delivered (held or pending), else the
|
|
658
|
+
/// cursor.
|
|
659
|
+
fn hint(&self, s: usize) -> Lsn {
|
|
660
|
+
let mut at = self.streams[s].cursor.position();
|
|
661
|
+
for p in self.ready.values() {
|
|
662
|
+
let (stream, start) = match p {
|
|
663
|
+
Pending::Single { stream, start, .. } | Pending::Decided { stream, start, .. } => {
|
|
664
|
+
(*stream, *start)
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
if stream == s {
|
|
668
|
+
at = at.min(start);
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
for h in self.held.values().flatten() {
|
|
672
|
+
if h.stream == s {
|
|
673
|
+
at = at.min(h.start);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
at
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/// Decodes a token into each stream's start and must-reach position, or the reason it
|
|
680
|
+
/// can't resume.
|
|
681
|
+
#[allow(clippy::type_complexity)]
|
|
682
|
+
fn decode_token(
|
|
683
|
+
&mut self,
|
|
684
|
+
bytes: &[u8],
|
|
685
|
+
db_id: [u8; 16],
|
|
686
|
+
) -> Result<std::result::Result<Vec<(Lsn, Option<Lsn>)>, Expiry>> {
|
|
687
|
+
let bad = || Error::InvalidArgument("not a change feed token".into());
|
|
688
|
+
let (&version, rest) = bytes.split_first().ok_or_else(bad)?;
|
|
689
|
+
if version != TOKEN_VERSION || rest.len() < 16 + 4 + 8 + 8 {
|
|
690
|
+
return Err(bad());
|
|
691
|
+
}
|
|
692
|
+
let u64_at = |b: &[u8], at: usize| u64::from_le_bytes(b[at..at + 8].try_into().unwrap());
|
|
693
|
+
if rest[..16] != db_id {
|
|
694
|
+
return Err(Error::InvalidArgument(
|
|
695
|
+
"the token is another database's".into(),
|
|
696
|
+
));
|
|
697
|
+
}
|
|
698
|
+
let streams = u32::from_le_bytes(rest[16..20].try_into().unwrap()) as usize;
|
|
699
|
+
let delivered = u64_at(rest, 20);
|
|
700
|
+
let session = u64_at(rest, 28);
|
|
701
|
+
let per = &rest[36..];
|
|
702
|
+
if per.len() != streams * 16 {
|
|
703
|
+
return Err(bad());
|
|
704
|
+
}
|
|
705
|
+
self.delivered = delivered;
|
|
706
|
+
self.session = session;
|
|
707
|
+
if streams != self.shared.shards {
|
|
708
|
+
return Ok(Err(expiry(format!(
|
|
709
|
+
"the shard count changed ({streams} to {})",
|
|
710
|
+
self.shared.shards
|
|
711
|
+
))));
|
|
712
|
+
}
|
|
713
|
+
if session != 0 && !self.history.holds(session) {
|
|
714
|
+
return Ok(Err(expiry(
|
|
715
|
+
"another session wrote without feeding these tables since the token",
|
|
716
|
+
)));
|
|
717
|
+
}
|
|
718
|
+
let mut starts = Vec::with_capacity(streams);
|
|
719
|
+
for s in 0..streams {
|
|
720
|
+
let hint = Lsn(u64_at(per, s * 16));
|
|
721
|
+
let reached = Lsn(u64_at(per, s * 16 + 8));
|
|
722
|
+
if hint.epoch() != 0 && hint.epoch() < self.floor(s) {
|
|
723
|
+
return Ok(Err(expiry("retention passed the token")));
|
|
724
|
+
}
|
|
725
|
+
starts.push((hint, (reached > hint).then_some(reached)));
|
|
726
|
+
}
|
|
727
|
+
Ok(Ok(starts))
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
fn poll(&mut self) -> Result<Polled> {
|
|
731
|
+
if let Some(e) = &self.failed {
|
|
732
|
+
return Err(Error::Corruption(format!(
|
|
733
|
+
"the change feed stopped at an earlier error: {e}"
|
|
734
|
+
)));
|
|
735
|
+
}
|
|
736
|
+
if self.expired.is_some() {
|
|
737
|
+
return Ok(Polled::Expired);
|
|
738
|
+
}
|
|
739
|
+
// The writer this region belongs to is gone (a reader process's attachment after a
|
|
740
|
+
// writer restart, D310 M2): seqnos may be reissued, so nothing more is read here.
|
|
741
|
+
// The caller subscribes again from its token, which the new writer checks.
|
|
742
|
+
if self.shm.is_stale() {
|
|
743
|
+
return Err(Error::SnapshotExpired);
|
|
744
|
+
}
|
|
745
|
+
// A commit already read and below the frontier goes first.
|
|
746
|
+
if self.emit()? {
|
|
747
|
+
return Ok(Polled::Commit);
|
|
748
|
+
}
|
|
749
|
+
if self.expired.is_some() {
|
|
750
|
+
return Ok(Polled::Expired);
|
|
751
|
+
}
|
|
752
|
+
// simp724's order: the checkpoints, then the frontier, each Acquire from the
|
|
753
|
+
// shared-memory marks the writer mirrors (layout version 8), then every stream read
|
|
754
|
+
// to its readable end. By M1 every record at or below F is then read: F never passes
|
|
755
|
+
// a record behind a held segment header (FORMAT §10.1 rule 1), since D200 hides its
|
|
756
|
+
// group until a sync writes that header and the feed's holds settle on
|
|
757
|
+
// `Wal::written` (which excludes it). `it::feed_head` pins this; no head mark is
|
|
758
|
+
// needed (D310 PR 4).
|
|
759
|
+
let checkpoints: Vec<Lsn> = (0..self.streams.len())
|
|
760
|
+
.map(|s| Lsn(self.shm.feed_marks(s as u32).checkpoint))
|
|
761
|
+
.collect();
|
|
762
|
+
let frontier = self.shm.written_seqno(self.durable);
|
|
763
|
+
// Reader processes: where a test restarts the writer between the stale check above
|
|
764
|
+
// and the reads below (simp724's B2).
|
|
765
|
+
#[cfg(feature = "test-hooks")]
|
|
766
|
+
self.shared
|
|
767
|
+
.hooks
|
|
768
|
+
.sites
|
|
769
|
+
.run(crate::engine::hooks::HookSite::ReaderFeedReads);
|
|
770
|
+
// Nothing committed since the streams were last read to their ends under this
|
|
771
|
+
// frontier (it rises with every commit): by M1 every record at or below it was read
|
|
772
|
+
// then, and `emit` above found none left to deliver. Reading again would only find
|
|
773
|
+
// the same ends, which costs a stream's segment headers and a chunk of frames each
|
|
774
|
+
// (#1448: an idle reader process spent 1-1.7 ms of CPU per poll there). Not while a
|
|
775
|
+
// PREPARE is held: a checkpoint or floor can move without a commit (a flush), and
|
|
776
|
+
// `drop_aborted` (rule C) must see it, or the commits behind an aborted round wait
|
|
777
|
+
// for an unrelated one (feed1248's P1 on #1449). A writer restart since the stale
|
|
778
|
+
// check above is seen here, as after the reads below.
|
|
779
|
+
if self.read_through == Some(frontier) && self.held.is_empty() {
|
|
780
|
+
if self.shm.is_stale() {
|
|
781
|
+
return Err(Error::SnapshotExpired);
|
|
782
|
+
}
|
|
783
|
+
return Ok(self.pending_state());
|
|
784
|
+
}
|
|
785
|
+
self.stream_reads += 1;
|
|
786
|
+
for s in 0..self.streams.len() {
|
|
787
|
+
if !self.read_stream(s)? {
|
|
788
|
+
return Ok(Polled::Expired);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
// The writer may have restarted while the streams were read (simp724's B2): the new
|
|
792
|
+
// session's records are then in, read as outside the history, and the frontier is
|
|
793
|
+
// the old one's. Nothing read here is delivered: the caller resubscribes from the
|
|
794
|
+
// token. A new writer's segments are written after its shared memory exists, so this
|
|
795
|
+
// check sees every such restart.
|
|
796
|
+
if self.shm.is_stale() {
|
|
797
|
+
return Err(Error::SnapshotExpired);
|
|
798
|
+
}
|
|
799
|
+
// Only now: simp724's rule holds once every stream was read to its end after the
|
|
800
|
+
// checkpoints were loaded.
|
|
801
|
+
let floors: Vec<u32> = (0..self.streams.len()).map(|s| self.floor(s)).collect();
|
|
802
|
+
if let Some(e) = self.drop_aborted(&checkpoints, &floors) {
|
|
803
|
+
self.expired = Some(e);
|
|
804
|
+
return Ok(Polled::Expired);
|
|
805
|
+
}
|
|
806
|
+
self.frontier = self.frontier.max(frontier);
|
|
807
|
+
self.read_through = Some(frontier);
|
|
808
|
+
if self.emit()? {
|
|
809
|
+
return Ok(Polled::Commit);
|
|
810
|
+
}
|
|
811
|
+
if self.expired.is_some() {
|
|
812
|
+
return Ok(Polled::Expired);
|
|
813
|
+
}
|
|
814
|
+
Ok(self.pending_state())
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/// Nothing to deliver now: whether the feed's own holds keep the frontier below the
|
|
818
|
+
/// watermark it follows (the visible watermark may be past the frontier).
|
|
819
|
+
fn pending_state(&self) -> Polled {
|
|
820
|
+
let watermark = if self.durable {
|
|
821
|
+
self.shm.durable_seqno()
|
|
822
|
+
} else {
|
|
823
|
+
self.shm.visible_seqno()
|
|
824
|
+
};
|
|
825
|
+
Polled::Pending {
|
|
826
|
+
held: watermark > self.frontier,
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
/// Polls that read the streams to their ends since the reader opened (#1448).
|
|
831
|
+
#[cfg(feature = "test-hooks")]
|
|
832
|
+
pub fn stream_reads(&self) -> u64 {
|
|
833
|
+
self.stream_reads
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/// Reads stream `s` to its readable end. Returns `false` once the feed expired.
|
|
837
|
+
fn read_stream(&mut self, s: usize) -> Result<bool> {
|
|
838
|
+
loop {
|
|
839
|
+
let before = self.streams[s].cursor.position();
|
|
840
|
+
let Some((start, end, session, item)) = self.read_one(s)? else {
|
|
841
|
+
return Ok(self.expired.is_none());
|
|
842
|
+
};
|
|
843
|
+
// A token's delivered records must still be there (a torn tail or a restart
|
|
844
|
+
// that lost them expires it, M2).
|
|
845
|
+
if let Some(m) = self.streams[s].must_reach {
|
|
846
|
+
if start.epoch() != m.epoch() && before.epoch() == m.epoch() && before < m {
|
|
847
|
+
self.expired = Some(expiry(
|
|
848
|
+
"records the feed delivered were lost (a torn tail or a writer restart)",
|
|
849
|
+
));
|
|
850
|
+
return Ok(false);
|
|
851
|
+
}
|
|
852
|
+
if end >= m {
|
|
853
|
+
self.streams[s].must_reach = None;
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
let inside = self.history.holds(session);
|
|
857
|
+
if inside {
|
|
858
|
+
self.session = self.session.max(session);
|
|
859
|
+
}
|
|
860
|
+
match item {
|
|
861
|
+
Item::Single { seqno, ts, changes } => {
|
|
862
|
+
if seqno <= self.delivered {
|
|
863
|
+
let st = &mut self.streams[s];
|
|
864
|
+
st.delivered_end = st.delivered_end.max(end);
|
|
865
|
+
continue;
|
|
866
|
+
}
|
|
867
|
+
if !inside {
|
|
868
|
+
// A writer restart, not a gap: the caller resubscribes (B2).
|
|
869
|
+
if self.shm.is_stale() {
|
|
870
|
+
return Err(Error::SnapshotExpired);
|
|
871
|
+
}
|
|
872
|
+
self.expired = Some(gap(seqno));
|
|
873
|
+
return Ok(false);
|
|
874
|
+
}
|
|
875
|
+
self.ready.insert(
|
|
876
|
+
seqno,
|
|
877
|
+
Pending::Single {
|
|
878
|
+
ts,
|
|
879
|
+
changes,
|
|
880
|
+
stream: s,
|
|
881
|
+
start,
|
|
882
|
+
end,
|
|
883
|
+
},
|
|
884
|
+
);
|
|
885
|
+
}
|
|
886
|
+
Item::Prepare { id, changes } => {
|
|
887
|
+
self.held.entry(id).or_default().push(Held {
|
|
888
|
+
stream: s,
|
|
889
|
+
start,
|
|
890
|
+
end,
|
|
891
|
+
changes,
|
|
892
|
+
outside: !inside,
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
Item::Decision {
|
|
896
|
+
id,
|
|
897
|
+
apply,
|
|
898
|
+
ts,
|
|
899
|
+
participants,
|
|
900
|
+
} => {
|
|
901
|
+
if apply <= self.delivered {
|
|
902
|
+
self.held.remove(&id);
|
|
903
|
+
let st = &mut self.streams[s];
|
|
904
|
+
st.delivered_end = st.delivered_end.max(end);
|
|
905
|
+
continue;
|
|
906
|
+
}
|
|
907
|
+
if !inside {
|
|
908
|
+
// A writer restart, not a gap: the caller resubscribes (B2).
|
|
909
|
+
if self.shm.is_stale() {
|
|
910
|
+
return Err(Error::SnapshotExpired);
|
|
911
|
+
}
|
|
912
|
+
self.expired = Some(gap(apply));
|
|
913
|
+
return Ok(false);
|
|
914
|
+
}
|
|
915
|
+
self.ready.insert(
|
|
916
|
+
apply,
|
|
917
|
+
Pending::Decided {
|
|
918
|
+
id,
|
|
919
|
+
ts,
|
|
920
|
+
participants,
|
|
921
|
+
stream: s,
|
|
922
|
+
start,
|
|
923
|
+
end,
|
|
924
|
+
session,
|
|
925
|
+
},
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
Item::Other => {
|
|
929
|
+
// A format 2 COMMIT is never in a fed session's segments (only this
|
|
930
|
+
// build writes feed marks); any other type is newer than this build.
|
|
931
|
+
if inside {
|
|
932
|
+
return Err(Error::Corruption(
|
|
933
|
+
"a change feed segment holds a record this build does not write".into(),
|
|
934
|
+
));
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/// Stream `s`'s next record as an owned item, its mutations filtered to the feed's
|
|
942
|
+
/// tables and prefix; `None` at the readable end, or once its segment is gone (which
|
|
943
|
+
/// expires the feed).
|
|
944
|
+
fn read_one(&mut self, s: usize) -> Result<Option<(Lsn, Lsn, u64, Item)>> {
|
|
945
|
+
let (tables, prefix) = (&self.tables, &self.prefix);
|
|
946
|
+
let filter = |batch: BatchRef<'_>| -> Result<Vec<Raw>> {
|
|
947
|
+
let mut out = Vec::new();
|
|
948
|
+
for m in batch.iter() {
|
|
949
|
+
let m = m?;
|
|
950
|
+
// The table first, then the row: a mutation outside is skipped by its
|
|
951
|
+
// lengths, never copied (§2.7).
|
|
952
|
+
if tables.binary_search(&m.table).is_err() || !m.row.starts_with(prefix) {
|
|
953
|
+
continue;
|
|
954
|
+
}
|
|
955
|
+
out.push(Raw {
|
|
956
|
+
table: m.table,
|
|
957
|
+
family: m.family,
|
|
958
|
+
kind: m.kind,
|
|
959
|
+
ts: m.ts,
|
|
960
|
+
row: m.row.to_vec(),
|
|
961
|
+
qualifier: m.qualifier.to_vec(),
|
|
962
|
+
value: m.value.to_vec(),
|
|
963
|
+
});
|
|
964
|
+
}
|
|
965
|
+
Ok(out)
|
|
966
|
+
};
|
|
967
|
+
let (start, end, session, record) = match self.streams[s].cursor.step()? {
|
|
968
|
+
Step::Record {
|
|
969
|
+
start,
|
|
970
|
+
end,
|
|
971
|
+
session,
|
|
972
|
+
record,
|
|
973
|
+
} => (start, end, session, record),
|
|
974
|
+
Step::End => return Ok(None),
|
|
975
|
+
Step::Gone => {
|
|
976
|
+
self.expired = Some(expiry(
|
|
977
|
+
"retention passed the feed: a segment it was reading was recycled",
|
|
978
|
+
));
|
|
979
|
+
return Ok(None);
|
|
980
|
+
}
|
|
981
|
+
Step::Cut => {
|
|
982
|
+
self.expired = Some(expiry(
|
|
983
|
+
"records the feed read were lost: a power loss cut the log before them",
|
|
984
|
+
));
|
|
985
|
+
return Ok(None);
|
|
986
|
+
}
|
|
987
|
+
};
|
|
988
|
+
let item = match record {
|
|
989
|
+
WalRecord::Batch {
|
|
990
|
+
seqno,
|
|
991
|
+
commit_ts,
|
|
992
|
+
batch,
|
|
993
|
+
} => Item::Single {
|
|
994
|
+
seqno,
|
|
995
|
+
ts: commit_ts,
|
|
996
|
+
changes: filter(batch)?,
|
|
997
|
+
},
|
|
998
|
+
WalRecord::Prepare { seqno, batch, .. } => Item::Prepare {
|
|
999
|
+
id: seqno,
|
|
1000
|
+
changes: filter(batch)?,
|
|
1001
|
+
},
|
|
1002
|
+
WalRecord::Decision {
|
|
1003
|
+
seqno,
|
|
1004
|
+
apply_seqno,
|
|
1005
|
+
commit_ts,
|
|
1006
|
+
participants,
|
|
1007
|
+
} => Item::Decision {
|
|
1008
|
+
id: seqno,
|
|
1009
|
+
apply: apply_seqno,
|
|
1010
|
+
ts: commit_ts,
|
|
1011
|
+
participants: participants.iter().collect(),
|
|
1012
|
+
},
|
|
1013
|
+
_ => Item::Other,
|
|
1014
|
+
};
|
|
1015
|
+
Ok(Some((start, end, session, item)))
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
/// Drops held PREPAREs of rounds that ended without a Decision: their stream's
|
|
1019
|
+
/// checkpoint (loaded before the frontier) passed them and no Decision for them was read
|
|
1020
|
+
/// (rule C). A held share the floor passed but the checkpoint didn't expires the feed:
|
|
1021
|
+
/// the floor never passes the checkpoint's segment, so that is a bound broken, and
|
|
1022
|
+
/// dropping it could pass over a committed round (fail closed, simp724's H1 on #1316).
|
|
1023
|
+
fn drop_aborted(&mut self, checkpoints: &[Lsn], floors: &[u32]) -> Option<Expiry> {
|
|
1024
|
+
let decided: std::collections::HashSet<Seqno> = self
|
|
1025
|
+
.ready
|
|
1026
|
+
.values()
|
|
1027
|
+
.filter_map(|p| match p {
|
|
1028
|
+
Pending::Decided { id, .. } => Some(*id),
|
|
1029
|
+
Pending::Single { .. } => None,
|
|
1030
|
+
})
|
|
1031
|
+
.collect();
|
|
1032
|
+
drop_undecided(
|
|
1033
|
+
&mut self.held,
|
|
1034
|
+
&mut self.dropped,
|
|
1035
|
+
&decided,
|
|
1036
|
+
checkpoints,
|
|
1037
|
+
floors,
|
|
1038
|
+
)
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/// Delivers the smallest pending commit at or below the frontier into `out`. Returns
|
|
1042
|
+
/// whether it did; a commit with nothing the feed follows is passed over.
|
|
1043
|
+
fn emit(&mut self) -> Result<bool> {
|
|
1044
|
+
loop {
|
|
1045
|
+
let Some((&key, _)) = self.ready.first_key_value() else {
|
|
1046
|
+
return Ok(false);
|
|
1047
|
+
};
|
|
1048
|
+
if key > self.frontier {
|
|
1049
|
+
return Ok(false);
|
|
1050
|
+
}
|
|
1051
|
+
// Before anything is taken: the view can fail (a reader process's attachment
|
|
1052
|
+
// whose writer is gone, or whose view is being republished), and a failure here
|
|
1053
|
+
// leaves the commit to the next call.
|
|
1054
|
+
let view = (self.view)()?;
|
|
1055
|
+
// A reader process's view can lag the writer's manifest: a value separated at
|
|
1056
|
+
// commit time names a blob file the manifest committed before the commit was
|
|
1057
|
+
// logged, which a view record of an older manifest version doesn't list yet
|
|
1058
|
+
// (simp724's question on #1352). Wait for a newer view, up to a bound, rather
|
|
1059
|
+
// than take the commit and expire; past the bound, the take below expires as for
|
|
1060
|
+
// a file retention removed.
|
|
1061
|
+
if self.writer.is_none() {
|
|
1062
|
+
let listed = self
|
|
1063
|
+
.ready
|
|
1064
|
+
.first_key_value()
|
|
1065
|
+
.is_some_and(|(_, p)| self.blobs_listed(&view, p));
|
|
1066
|
+
if !listed {
|
|
1067
|
+
let since = *self.blob_wait.get_or_insert_with(Instant::now);
|
|
1068
|
+
if since.elapsed() < READER_BLOB_WAIT {
|
|
1069
|
+
return Ok(false);
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
self.blob_wait = None;
|
|
1074
|
+
let (_, p) = self.ready.pop_first().expect("checked");
|
|
1075
|
+
let (ts, raws) = match p {
|
|
1076
|
+
Pending::Single {
|
|
1077
|
+
ts,
|
|
1078
|
+
changes,
|
|
1079
|
+
stream,
|
|
1080
|
+
end,
|
|
1081
|
+
..
|
|
1082
|
+
} => {
|
|
1083
|
+
let st = &mut self.streams[stream];
|
|
1084
|
+
st.delivered_end = st.delivered_end.max(end);
|
|
1085
|
+
(ts, changes)
|
|
1086
|
+
}
|
|
1087
|
+
Pending::Decided {
|
|
1088
|
+
id,
|
|
1089
|
+
ts,
|
|
1090
|
+
participants,
|
|
1091
|
+
stream,
|
|
1092
|
+
end,
|
|
1093
|
+
session,
|
|
1094
|
+
..
|
|
1095
|
+
} => {
|
|
1096
|
+
let st = &mut self.streams[stream];
|
|
1097
|
+
st.delivered_end = st.delivered_end.max(end);
|
|
1098
|
+
let shares = self.held.remove(&id).unwrap_or_default();
|
|
1099
|
+
// A round rule C dropped a share of: never passed over silently.
|
|
1100
|
+
let dropped = self.dropped.remove(&id).is_some();
|
|
1101
|
+
// Every participant's PREPARE was in its file before the Decision was
|
|
1102
|
+
// written, so it has been read; one missing was lost under the reader.
|
|
1103
|
+
let complete = participants
|
|
1104
|
+
.iter()
|
|
1105
|
+
.all(|p| shares.iter().any(|h| h.stream == p.0 as usize));
|
|
1106
|
+
if !complete && session != self.current && !dropped {
|
|
1107
|
+
// A power loss took a share of a `Buffered` commit an earlier session
|
|
1108
|
+
// wrote, and that session's recovery dropped it whole, as replay
|
|
1109
|
+
// does (all or nothing): it never happened, so it isn't delivered.
|
|
1110
|
+
for h in &shares {
|
|
1111
|
+
let st = &mut self.streams[h.stream];
|
|
1112
|
+
st.delivered_end = st.delivered_end.max(h.end);
|
|
1113
|
+
}
|
|
1114
|
+
self.delivered = key;
|
|
1115
|
+
continue;
|
|
1116
|
+
}
|
|
1117
|
+
if !complete || shares.iter().any(|h| h.outside) {
|
|
1118
|
+
self.expired = Some(gap(key));
|
|
1119
|
+
return Ok(false);
|
|
1120
|
+
}
|
|
1121
|
+
let mut raws = Vec::new();
|
|
1122
|
+
for h in shares {
|
|
1123
|
+
let st = &mut self.streams[h.stream];
|
|
1124
|
+
st.delivered_end = st.delivered_end.max(h.end);
|
|
1125
|
+
raws.extend(h.changes);
|
|
1126
|
+
}
|
|
1127
|
+
(ts, raws)
|
|
1128
|
+
}
|
|
1129
|
+
};
|
|
1130
|
+
self.delivered = key;
|
|
1131
|
+
if raws.is_empty() {
|
|
1132
|
+
continue;
|
|
1133
|
+
}
|
|
1134
|
+
self.out.seqno = key;
|
|
1135
|
+
self.out.ts = ts;
|
|
1136
|
+
self.out.changes.clear();
|
|
1137
|
+
for r in raws {
|
|
1138
|
+
let value = match blob_pointer(&r.value) {
|
|
1139
|
+
None => r.value,
|
|
1140
|
+
// The blob GC horizon follows the oldest retained segment, not readers: a
|
|
1141
|
+
// file the view no longer lists under a slow reader means retention
|
|
1142
|
+
// passed it (S1). Any other failure, a checksum's included, is an error.
|
|
1143
|
+
Some(ptr) if view.ssts.blob_reader(ptr.blob_file).is_none() => {
|
|
1144
|
+
self.expired = Some(expiry(
|
|
1145
|
+
"a blob value the feed was delivering is gone: retention passed the feed",
|
|
1146
|
+
));
|
|
1147
|
+
return Ok(false);
|
|
1148
|
+
}
|
|
1149
|
+
Some(ptr) => match view.ssts.read_pointer(&ptr) {
|
|
1150
|
+
Ok(cell) => cell.to_vec(),
|
|
1151
|
+
// The commit is taken: going on would skip it, so the reader stops
|
|
1152
|
+
// here for good.
|
|
1153
|
+
Err(e) => {
|
|
1154
|
+
self.failed = Some(e.to_string());
|
|
1155
|
+
return Err(e);
|
|
1156
|
+
}
|
|
1157
|
+
},
|
|
1158
|
+
};
|
|
1159
|
+
self.out.changes.push(Change {
|
|
1160
|
+
table: r.table,
|
|
1161
|
+
family: r.family,
|
|
1162
|
+
kind: r.kind,
|
|
1163
|
+
ts: r.ts.unwrap_or(ts),
|
|
1164
|
+
row: r.row,
|
|
1165
|
+
qualifier: r.qualifier,
|
|
1166
|
+
value,
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
return Ok(true);
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
fn gap(key: Seqno) -> Expiry {
|
|
1175
|
+
expiry(format!(
|
|
1176
|
+
"history has a gap before seqno {key}: a session that did not feed these tables wrote the database"
|
|
1177
|
+
))
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
/// [`FeedReader::drop_aborted`]'s rule over the held shares: drops each undecided share its
|
|
1181
|
+
/// stream's checkpoint passed, noting its round in `dropped`, and expires on one only the
|
|
1182
|
+
/// floor passed. Forgets dropped rounds whose segment is below the floor.
|
|
1183
|
+
fn drop_undecided(
|
|
1184
|
+
held: &mut HashMap<Seqno, Vec<Held>>,
|
|
1185
|
+
dropped: &mut HashMap<Seqno, (usize, u32)>,
|
|
1186
|
+
decided: &std::collections::HashSet<Seqno>,
|
|
1187
|
+
checkpoints: &[Lsn],
|
|
1188
|
+
floors: &[u32],
|
|
1189
|
+
) -> Option<Expiry> {
|
|
1190
|
+
let floor_of = |s: usize| floors.get(s).copied().unwrap_or(0);
|
|
1191
|
+
for (id, shares) in held.iter() {
|
|
1192
|
+
if decided.contains(id) {
|
|
1193
|
+
continue;
|
|
1194
|
+
}
|
|
1195
|
+
for h in shares {
|
|
1196
|
+
let passed = checkpoints.get(h.stream).is_some_and(|&c| c > h.start);
|
|
1197
|
+
if !passed && h.start.epoch() < floor_of(h.stream) {
|
|
1198
|
+
return Some(expiry(
|
|
1199
|
+
"retention passed a held cross-shard share the checkpoint had not",
|
|
1200
|
+
));
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
held.retain(|id, shares| {
|
|
1205
|
+
if decided.contains(id) {
|
|
1206
|
+
return true;
|
|
1207
|
+
}
|
|
1208
|
+
shares.retain(|h| {
|
|
1209
|
+
let passed = checkpoints.get(h.stream).is_some_and(|&c| c > h.start);
|
|
1210
|
+
if passed {
|
|
1211
|
+
dropped.insert(*id, (h.stream, h.start.epoch()));
|
|
1212
|
+
}
|
|
1213
|
+
!passed
|
|
1214
|
+
});
|
|
1215
|
+
!shares.is_empty()
|
|
1216
|
+
});
|
|
1217
|
+
dropped.retain(|_, &mut (s, epoch)| epoch >= floor_of(s));
|
|
1218
|
+
None
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
impl FeedReader {
|
|
1222
|
+
/// Whether `view` lists every blob file pending commit `p`'s values point into.
|
|
1223
|
+
fn blobs_listed(&self, view: &crate::snapshot::View, p: &Pending) -> bool {
|
|
1224
|
+
let listed = |raws: &[Raw]| {
|
|
1225
|
+
raws.iter().all(|r| {
|
|
1226
|
+
blob_pointer(&r.value)
|
|
1227
|
+
.is_none_or(|ptr| view.ssts.blob_reader(ptr.blob_file).is_some())
|
|
1228
|
+
})
|
|
1229
|
+
};
|
|
1230
|
+
match p {
|
|
1231
|
+
Pending::Single { changes, .. } => listed(changes),
|
|
1232
|
+
Pending::Decided { id, .. } => self
|
|
1233
|
+
.held
|
|
1234
|
+
.get(id)
|
|
1235
|
+
.is_none_or(|shares| shares.iter().all(|h| listed(&h.changes))),
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
/// `FeedStart::Oldest` from before this open (#1465): the oldest earlier session of the
|
|
1240
|
+
/// feed's history whose first segment every stream still keeps, and the bound to start
|
|
1241
|
+
/// there. The writer's checkpoint history (`Feed::oldest_bound`) starts at this open,
|
|
1242
|
+
/// since it is rebuilt at each one, so without this `Oldest` after a reopen was `Now`.
|
|
1243
|
+
///
|
|
1244
|
+
/// The bound is `K = m - 1`, `m` the smallest id in any stream's first record of the
|
|
1245
|
+
/// session: a single's seqno, a round's id, or a decision's id or apply seqno, the lower.
|
|
1246
|
+
/// One bound for every stream, so none starts past another's earliest commit.
|
|
1247
|
+
/// - **It bounds what is before the start positions.** Every record before the
|
|
1248
|
+
/// session's first segment was logged before the session opened, so its key is at
|
|
1249
|
+
/// most the allocator's start then. Every id in the session's records was allocated
|
|
1250
|
+
/// in it, above that start: replay applies a round only whole and writes nothing, and
|
|
1251
|
+
/// nothing re-logs a record. So `K` is at least the start (the rule `start_at` keeps
|
|
1252
|
+
/// for the writer's history).
|
|
1253
|
+
/// - **It skips none of the session's commits.** A single's seqno is allocated in the
|
|
1254
|
+
/// group that logs it, after that stream's first record. A cross-shard commit is keyed
|
|
1255
|
+
/// by its apply seqno, reserved once every participant logged its PREPARE: after each
|
|
1256
|
+
/// participant's first record. This assumes a participant reports PREPARED only after
|
|
1257
|
+
/// its PREPARE was appended to its stream (the group settles after its WAL write); a
|
|
1258
|
+
/// change that answers before the append breaks this bound. So every commit's key is
|
|
1259
|
+
/// at least `m`. Taking only
|
|
1260
|
+
/// singles' seqnos would skip that commit when a session opens with a cross-shard one
|
|
1261
|
+
/// (simp724).
|
|
1262
|
+
///
|
|
1263
|
+
/// A session's first segment is the one an open started (`prev_epoch` 0, or an epoch
|
|
1264
|
+
/// more than one above it: FORMAT §10.1 rule 2), so a session partly recycled at a floor
|
|
1265
|
+
/// is passed over, not started in its middle.
|
|
1266
|
+
///
|
|
1267
|
+
/// `None` (the current history decides) when no earlier session qualifies or anything
|
|
1268
|
+
/// read fails: a later start only has a larger bound, so it is always safe (simp724).
|
|
1269
|
+
fn earlier_start(&self, db_id: [u8; 16]) -> Option<(Seqno, Vec<Lsn>)> {
|
|
1270
|
+
let shards = self.shared.shards;
|
|
1271
|
+
let open = |s: usize, at: Lsn| {
|
|
1272
|
+
FeedCursor::open(
|
|
1273
|
+
&self.shared.vfs,
|
|
1274
|
+
&self.shared.path,
|
|
1275
|
+
StreamId(s as u32),
|
|
1276
|
+
db_id,
|
|
1277
|
+
at,
|
|
1278
|
+
)
|
|
1279
|
+
.ok()
|
|
1280
|
+
};
|
|
1281
|
+
// Each stream's first retained segment of every earlier session in the history.
|
|
1282
|
+
let mut firsts: Vec<HashMap<u64, u32>> = Vec::with_capacity(shards);
|
|
1283
|
+
for s in 0..shards {
|
|
1284
|
+
let floor = self.floor(s);
|
|
1285
|
+
let mut f = HashMap::new();
|
|
1286
|
+
for (epoch, prev, session) in open(s, Lsn::default())?.segments() {
|
|
1287
|
+
let opened = prev == 0 || epoch != prev.wrapping_add(1);
|
|
1288
|
+
if opened
|
|
1289
|
+
&& epoch >= floor
|
|
1290
|
+
&& session != self.current
|
|
1291
|
+
&& self.history.holds(session)
|
|
1292
|
+
{
|
|
1293
|
+
f.entry(session).or_insert(epoch);
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
firsts.push(f);
|
|
1297
|
+
}
|
|
1298
|
+
let mut sessions: Vec<(u32, u64)> = firsts
|
|
1299
|
+
.first()?
|
|
1300
|
+
.iter()
|
|
1301
|
+
.filter(|(id, _)| firsts.iter().all(|f| f.contains_key(id)))
|
|
1302
|
+
.map(|(&id, &epoch)| (epoch, id))
|
|
1303
|
+
.collect();
|
|
1304
|
+
sessions.sort_unstable();
|
|
1305
|
+
'sessions: for (_, session) in sessions {
|
|
1306
|
+
let mut first = None::<Seqno>;
|
|
1307
|
+
for (s, f) in firsts.iter().enumerate() {
|
|
1308
|
+
let Some(mut c) = open(s, Lsn::new(f[&session], 0)) else {
|
|
1309
|
+
continue 'sessions;
|
|
1310
|
+
};
|
|
1311
|
+
let id = match c.step() {
|
|
1312
|
+
// The stream logged nothing in the session: no id from it.
|
|
1313
|
+
Ok(Step::End) => continue,
|
|
1314
|
+
Ok(Step::Record {
|
|
1315
|
+
session: of,
|
|
1316
|
+
record,
|
|
1317
|
+
..
|
|
1318
|
+
}) if of == session => match record {
|
|
1319
|
+
WalRecord::Batch { seqno, .. }
|
|
1320
|
+
| WalRecord::Prepare { seqno, .. }
|
|
1321
|
+
| WalRecord::Commit { seqno, .. } => seqno,
|
|
1322
|
+
WalRecord::Decision {
|
|
1323
|
+
seqno, apply_seqno, ..
|
|
1324
|
+
} => seqno.min(apply_seqno),
|
|
1325
|
+
// A kind this build can't key: the session can't be started in.
|
|
1326
|
+
_ => continue 'sessions,
|
|
1327
|
+
},
|
|
1328
|
+
// The segment gone (recycled since the headers were read) or cut,
|
|
1329
|
+
// another session's record there, or a read that failed: this session
|
|
1330
|
+
// can't be started in (simp724's B1), so a later one or the history
|
|
1331
|
+
// decides. Dropping only this stream would start it at a gone or foreign
|
|
1332
|
+
// segment, or take `m` too high and skip its earliest commits.
|
|
1333
|
+
_ => continue 'sessions,
|
|
1334
|
+
};
|
|
1335
|
+
first = Some(first.map_or(id, |f| f.min(id)));
|
|
1336
|
+
}
|
|
1337
|
+
// A session that logged nothing: the next one decides.
|
|
1338
|
+
let Some(first) = first else { continue };
|
|
1339
|
+
let at = firsts.iter().map(|f| Lsn::new(f[&session], 0)).collect();
|
|
1340
|
+
return Some((first.saturating_sub(1), at));
|
|
1341
|
+
}
|
|
1342
|
+
None
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
/// Stream `s`'s floor: no segment of a smaller epoch is kept (the writer's shared-memory
|
|
1346
|
+
/// mark).
|
|
1347
|
+
fn floor(&self, s: usize) -> u32 {
|
|
1348
|
+
self.shm.feed_marks(s as u32).floor
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
/// In a reader process: the writer's session and fed tables, from its entry in the sidecar
|
|
1353
|
+
/// (the last session entry: a writer writes it before its shared memory exists).
|
|
1354
|
+
/// `InvalidArgument` when the writer doesn't feed (its open recorded `fed: none`).
|
|
1355
|
+
fn writer_session(shared: &Shared) -> Result<(u64, FeedTables)> {
|
|
1356
|
+
let off = || {
|
|
1357
|
+
Error::InvalidArgument(
|
|
1358
|
+
"the writer's change feed is off: subscribe to a writer that feeds".into(),
|
|
1359
|
+
)
|
|
1360
|
+
};
|
|
1361
|
+
let path = crate::feed::sidecar_path(&shared.path);
|
|
1362
|
+
let file = match shared.vfs.open(&path, OpenOptions::read()) {
|
|
1363
|
+
Ok(f) => f,
|
|
1364
|
+
Err(e) if e.kind == pigeonhole_io::ErrorKind::NotFound => return Err(off()),
|
|
1365
|
+
Err(e) => return Err(e.into()),
|
|
1366
|
+
};
|
|
1367
|
+
let mut bytes = vec![0u8; file.len()? as usize];
|
|
1368
|
+
file.read_at(&mut bytes, 0)?;
|
|
1369
|
+
match FeedHeader::decode(&bytes) {
|
|
1370
|
+
Ok(h) if h.db_id == shared.pager.db_id() => {}
|
|
1371
|
+
_ => return Err(off()),
|
|
1372
|
+
}
|
|
1373
|
+
let entries = decode_entries(&bytes[FeedHeader::LEN..]).0;
|
|
1374
|
+
for e in entries.iter().rev() {
|
|
1375
|
+
match e {
|
|
1376
|
+
FeedEntry::Session {
|
|
1377
|
+
session,
|
|
1378
|
+
streams,
|
|
1379
|
+
tables,
|
|
1380
|
+
..
|
|
1381
|
+
} => {
|
|
1382
|
+
if *streams as usize != shared.shards {
|
|
1383
|
+
// A new writer with another shard count is starting: this attachment is
|
|
1384
|
+
// the old one's (simp724's nit). Subscribe again once it runs.
|
|
1385
|
+
return Err(Error::SnapshotExpired);
|
|
1386
|
+
}
|
|
1387
|
+
return Ok((*session, tables.clone()));
|
|
1388
|
+
}
|
|
1389
|
+
FeedEntry::Unfed { .. } => return Err(off()),
|
|
1390
|
+
_ => {}
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
Err(off())
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1396
|
+
/// The sessions whose segments hold the feed's history: the current one, and each one
|
|
1397
|
+
/// before it while it fed every table in `tables`, had the same stream count, and chains.
|
|
1398
|
+
/// A session chains when its `opened_at` is the previous session's last recorded
|
|
1399
|
+
/// `sequence` and every sequence between was recorded: the previous session's Root
|
|
1400
|
+
/// entries run contiguously from its own `opened_at` (simp724 on fix A: a lost middle
|
|
1401
|
+
/// entry could hide another session's root commits, so a gap breaks the chain), with no
|
|
1402
|
+
/// feed-off open between.
|
|
1403
|
+
fn read_history(shared: &Shared, current: u64, tables: &[TableId]) -> Result<History> {
|
|
1404
|
+
let path = crate::feed::sidecar_path(&shared.path);
|
|
1405
|
+
let file = shared.vfs.open(&path, OpenOptions::read())?;
|
|
1406
|
+
let len = file.len()?;
|
|
1407
|
+
let mut bytes = vec![0u8; len as usize];
|
|
1408
|
+
file.read_at(&mut bytes, 0)?;
|
|
1409
|
+
let entries = match FeedHeader::decode(&bytes) {
|
|
1410
|
+
Ok(h) if h.db_id == shared.pager.db_id() => decode_entries(&bytes[FeedHeader::LEN..]).0,
|
|
1411
|
+
_ => Vec::new(),
|
|
1412
|
+
};
|
|
1413
|
+
Ok(History {
|
|
1414
|
+
sessions: chain(&entries, current, tables),
|
|
1415
|
+
})
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/// [`read_history`]'s rule over the sidecar's entries.
|
|
1419
|
+
fn chain(entries: &[FeedEntry], current: u64, tables: &[TableId]) -> Vec<u64> {
|
|
1420
|
+
// (id, feeds the tables, streams, chained to the previous)
|
|
1421
|
+
let mut sessions: Vec<(u64, bool, u32, bool)> = Vec::new();
|
|
1422
|
+
let mut last_seq: Option<u64> = None;
|
|
1423
|
+
let mut broken = true;
|
|
1424
|
+
for e in entries {
|
|
1425
|
+
match e {
|
|
1426
|
+
FeedEntry::Session {
|
|
1427
|
+
session,
|
|
1428
|
+
opened_at,
|
|
1429
|
+
streams,
|
|
1430
|
+
tables: fed,
|
|
1431
|
+
..
|
|
1432
|
+
} => {
|
|
1433
|
+
let feeds = tables.iter().all(|&t| match fed {
|
|
1434
|
+
FeedTables::All => true,
|
|
1435
|
+
FeedTables::Only(_) => fed.contains(t),
|
|
1436
|
+
});
|
|
1437
|
+
let chained = !broken && last_seq == Some(*opened_at);
|
|
1438
|
+
sessions.push((*session, feeds, *streams, chained));
|
|
1439
|
+
last_seq = Some(*opened_at);
|
|
1440
|
+
broken = false;
|
|
1441
|
+
}
|
|
1442
|
+
FeedEntry::Root { session, sequence } => {
|
|
1443
|
+
let ours = sessions.last().is_some_and(|s| s.0 == *session);
|
|
1444
|
+
if !ours || last_seq.map(|l| l + 1) != Some(*sequence) {
|
|
1445
|
+
broken = true;
|
|
1446
|
+
}
|
|
1447
|
+
last_seq = Some(*sequence);
|
|
1448
|
+
}
|
|
1449
|
+
FeedEntry::Unfed { .. } => broken = true,
|
|
1450
|
+
// A newer build's entry may mean a break: fail closed (simp724's nit on #1316).
|
|
1451
|
+
FeedEntry::Unknown(_) => broken = true,
|
|
1452
|
+
}
|
|
1453
|
+
}
|
|
1454
|
+
let Some(pos) = sessions.iter().rposition(|s| s.0 == current) else {
|
|
1455
|
+
return vec![current];
|
|
1456
|
+
};
|
|
1457
|
+
let streams = sessions[pos].2;
|
|
1458
|
+
let mut run = Vec::new();
|
|
1459
|
+
for (i, s) in sessions[..=pos].iter().enumerate().rev() {
|
|
1460
|
+
if !s.1 || s.2 != streams {
|
|
1461
|
+
break;
|
|
1462
|
+
}
|
|
1463
|
+
run.push(s.0);
|
|
1464
|
+
if !s.3 || i == 0 {
|
|
1465
|
+
break;
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
run
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
#[cfg(test)]
|
|
1472
|
+
mod tests {
|
|
1473
|
+
use super::*;
|
|
1474
|
+
|
|
1475
|
+
fn session(session: u64, opened_at: u64) -> FeedEntry {
|
|
1476
|
+
FeedEntry::Session {
|
|
1477
|
+
session,
|
|
1478
|
+
opened_at,
|
|
1479
|
+
retention_bytes: 1 << 20,
|
|
1480
|
+
retention_age_secs: 0,
|
|
1481
|
+
streams: 2,
|
|
1482
|
+
tables: FeedTables::All,
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
fn root(session: u64, sequence: u64) -> FeedEntry {
|
|
1487
|
+
FeedEntry::Root { session, sequence }
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
#[test]
|
|
1491
|
+
fn sessions_chain_only_through_contiguous_sequences() {
|
|
1492
|
+
let t = [TableId(1)];
|
|
1493
|
+
let whole = [
|
|
1494
|
+
session(1, 1),
|
|
1495
|
+
root(1, 2),
|
|
1496
|
+
root(1, 3),
|
|
1497
|
+
root(1, 4),
|
|
1498
|
+
session(2, 4),
|
|
1499
|
+
root(2, 5),
|
|
1500
|
+
];
|
|
1501
|
+
assert_eq!(chain(&whole, 2, &t), [2, 1]);
|
|
1502
|
+
// A lost middle entry: the last still matches the next open, but the root commit at
|
|
1503
|
+
// 3 is unaccounted for, so session 1's history ends there (simp724 on fix A).
|
|
1504
|
+
let gap = [
|
|
1505
|
+
session(1, 1),
|
|
1506
|
+
root(1, 2),
|
|
1507
|
+
root(1, 4),
|
|
1508
|
+
session(2, 4),
|
|
1509
|
+
root(2, 5),
|
|
1510
|
+
];
|
|
1511
|
+
assert_eq!(chain(&gap, 2, &t), [2]);
|
|
1512
|
+
// A lost last entry: the next open is ahead.
|
|
1513
|
+
let ahead = [session(1, 1), root(1, 2), session(2, 3)];
|
|
1514
|
+
assert_eq!(chain(&ahead, 2, &t), [2]);
|
|
1515
|
+
// A feed-off open between.
|
|
1516
|
+
let unfed = [
|
|
1517
|
+
session(1, 1),
|
|
1518
|
+
root(1, 2),
|
|
1519
|
+
FeedEntry::Unfed { sequence: 2 },
|
|
1520
|
+
session(2, 2),
|
|
1521
|
+
];
|
|
1522
|
+
assert_eq!(chain(&unfed, 2, &t), [2]);
|
|
1523
|
+
// A session with another stream count, or not feeding the table, ends it too.
|
|
1524
|
+
let narrower = [
|
|
1525
|
+
FeedEntry::Session {
|
|
1526
|
+
session: 1,
|
|
1527
|
+
opened_at: 1,
|
|
1528
|
+
retention_bytes: 1 << 20,
|
|
1529
|
+
retention_age_secs: 0,
|
|
1530
|
+
streams: 2,
|
|
1531
|
+
tables: FeedTables::Only(vec![TableId(9)]),
|
|
1532
|
+
},
|
|
1533
|
+
session(2, 1),
|
|
1534
|
+
];
|
|
1535
|
+
assert_eq!(chain(&narrower, 2, &t), [2]);
|
|
1536
|
+
// An entry this build doesn't know may be a break: it ends the chain too.
|
|
1537
|
+
let unknown = [
|
|
1538
|
+
session(1, 1),
|
|
1539
|
+
root(1, 2),
|
|
1540
|
+
FeedEntry::Unknown(0xee),
|
|
1541
|
+
session(2, 2),
|
|
1542
|
+
];
|
|
1543
|
+
assert_eq!(chain(&unknown, 2, &t), [2]);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
fn held(stream: usize, epoch: u32) -> Held {
|
|
1547
|
+
Held {
|
|
1548
|
+
stream,
|
|
1549
|
+
start: Lsn::new(epoch, 64),
|
|
1550
|
+
end: Lsn::new(epoch, 128),
|
|
1551
|
+
changes: Vec::new(),
|
|
1552
|
+
outside: false,
|
|
1553
|
+
}
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
/// simp724's H1 on #1316: rule C drops an undecided share its checkpoint passed and
|
|
1557
|
+
/// remembers its round; one only the floor passed expires the feed, never a drop.
|
|
1558
|
+
#[test]
|
|
1559
|
+
fn a_share_only_the_floor_passed_expires_and_never_drops() {
|
|
1560
|
+
let decided = std::collections::HashSet::from([7]);
|
|
1561
|
+
// Stream 0's checkpoint is in epoch 5, stream 1's in epoch 3; the floors are 4 and 2.
|
|
1562
|
+
let checkpoints = [Lsn::new(5, 0), Lsn::new(3, 0)];
|
|
1563
|
+
let floors = [4, 2];
|
|
1564
|
+
let mut held_map = HashMap::from([
|
|
1565
|
+
// Undecided, passed on stream 0: dropped, and remembered.
|
|
1566
|
+
(1, vec![held(0, 4)]),
|
|
1567
|
+
// Undecided, not passed (epoch 5 at offset 64 is after the checkpoint): kept.
|
|
1568
|
+
(2, vec![held(0, 5)]),
|
|
1569
|
+
// Decided: kept whatever the marks say.
|
|
1570
|
+
(7, vec![held(0, 1), held(1, 1)]),
|
|
1571
|
+
]);
|
|
1572
|
+
let mut dropped = HashMap::new();
|
|
1573
|
+
let e = drop_undecided(&mut held_map, &mut dropped, &decided, &checkpoints, &floors);
|
|
1574
|
+
assert!(e.is_none());
|
|
1575
|
+
assert!(!held_map.contains_key(&1));
|
|
1576
|
+
assert!(held_map.contains_key(&2) && held_map.contains_key(&7));
|
|
1577
|
+
assert_eq!(dropped.get(&1), Some(&(0, 4)));
|
|
1578
|
+
|
|
1579
|
+
// A share below its stream's floor that the checkpoint didn't pass: a bound broken,
|
|
1580
|
+
// so the feed expires and nothing is dropped.
|
|
1581
|
+
let mut held_map = HashMap::from([(3, vec![held(1, 1)])]);
|
|
1582
|
+
let mut dropped = HashMap::new();
|
|
1583
|
+
let checkpoints = [Lsn::new(5, 0), Lsn::new(1, 0)];
|
|
1584
|
+
let e = drop_undecided(&mut held_map, &mut dropped, &decided, &checkpoints, &floors);
|
|
1585
|
+
assert!(e.is_some_and(|e| e.reason.contains("retention passed a held")));
|
|
1586
|
+
assert!(held_map.contains_key(&3) && dropped.is_empty());
|
|
1587
|
+
|
|
1588
|
+
// A remembered round is forgotten once the floor passes its segment.
|
|
1589
|
+
let mut dropped = HashMap::from([(1, (0, 3)), (2, (0, 4))]);
|
|
1590
|
+
let e = drop_undecided(
|
|
1591
|
+
&mut HashMap::new(),
|
|
1592
|
+
&mut dropped,
|
|
1593
|
+
&decided,
|
|
1594
|
+
&checkpoints,
|
|
1595
|
+
&floors,
|
|
1596
|
+
);
|
|
1597
|
+
assert!(e.is_none());
|
|
1598
|
+
assert_eq!(dropped.keys().copied().collect::<Vec<_>>(), [2]);
|
|
1599
|
+
}
|
|
1600
|
+
}
|