@nxtedition/rocksdb 9.0.0 → 9.0.1
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.
- package/binding.cc +0 -21
- package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
- package/deps/rocksdb/rocksdb/Makefile +15 -6
- package/deps/rocksdb/rocksdb/README.md +29 -0
- package/deps/rocksdb/rocksdb/TARGETS +17 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +182 -7
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +293 -17
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +21 -5
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
- package/deps/rocksdb/rocksdb/db/c.cc +64 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
- package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
- package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
- package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
- package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
- package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
- package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
- package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
- package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
- package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
- package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
- package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
- package/deps/rocksdb/rocksdb/env/env.cc +5 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
- package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
- package/deps/rocksdb/rocksdb/port/README +10 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
- package/deps/rocksdb/rocksdb/src.mk +7 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
- package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
- package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
- package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
- package/deps/rocksdb/rocksdb/util/compression.h +9 -3
- package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/util/overload.h +23 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
- package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
- package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
- package/deps/rocksdb/rocksdb.gyp +4 -2
- package/index.js +0 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
#include <stdint.h>
|
|
11
11
|
|
|
12
|
+
#include "db/wide/wide_column_serialization.h"
|
|
12
13
|
#include "file/random_access_file_reader.h"
|
|
13
14
|
#include "port/stack_trace.h"
|
|
14
15
|
#include "rocksdb/convenience.h"
|
|
@@ -24,10 +25,11 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
24
25
|
const uint32_t kOptLength = 1024;
|
|
25
26
|
|
|
26
27
|
namespace {
|
|
27
|
-
static std::string MakeKey(int i
|
|
28
|
+
static std::string MakeKey(int i,
|
|
29
|
+
ValueType value_type = ValueType::kTypeValue) {
|
|
28
30
|
char buf[100];
|
|
29
31
|
snprintf(buf, sizeof(buf), "k_%04d", i);
|
|
30
|
-
InternalKey key(std::string(buf), 0,
|
|
32
|
+
InternalKey key(std::string(buf), 0, value_type);
|
|
31
33
|
return key.Encode().ToString();
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -44,6 +46,16 @@ static std::string MakeValue(int i) {
|
|
|
44
46
|
return key.Encode().ToString();
|
|
45
47
|
}
|
|
46
48
|
|
|
49
|
+
static std::string MakeWideColumn(int i) {
|
|
50
|
+
std::string val = MakeValue(i);
|
|
51
|
+
std::string val1 = "attr_1_val_" + val;
|
|
52
|
+
std::string val2 = "attr_2_val_" + val;
|
|
53
|
+
WideColumns columns{{"attr_1", val1}, {"attr_2", val2}};
|
|
54
|
+
std::string entity;
|
|
55
|
+
EXPECT_OK(WideColumnSerialization::Serialize(columns, entity));
|
|
56
|
+
return entity;
|
|
57
|
+
}
|
|
58
|
+
|
|
47
59
|
void cleanup(const Options& opts, const std::string& file_name) {
|
|
48
60
|
Env* env = opts.env;
|
|
49
61
|
ASSERT_OK(env->DeleteFile(file_name));
|
|
@@ -94,7 +106,8 @@ class SSTDumpToolTest : public testing::Test {
|
|
|
94
106
|
snprintf(usage[2], kOptLength, "--file=%s", file_path.c_str());
|
|
95
107
|
}
|
|
96
108
|
|
|
97
|
-
void createSST(const Options& opts, const std::string& file_name
|
|
109
|
+
void createSST(const Options& opts, const std::string& file_name,
|
|
110
|
+
uint32_t wide_column_one_in = 0) {
|
|
98
111
|
Env* test_env = opts.env;
|
|
99
112
|
FileOptions file_options(opts);
|
|
100
113
|
ReadOptions read_options;
|
|
@@ -123,7 +136,12 @@ class SSTDumpToolTest : public testing::Test {
|
|
|
123
136
|
const char* comparator_name = ikc.user_comparator()->Name();
|
|
124
137
|
if (strcmp(comparator_name, ReverseBytewiseComparator()->Name()) == 0) {
|
|
125
138
|
for (int32_t i = num_keys; i >= 0; i--) {
|
|
126
|
-
|
|
139
|
+
if (wide_column_one_in == 0 || i % wide_column_one_in != 0) {
|
|
140
|
+
tb->Add(MakeKey(i), MakeValue(i));
|
|
141
|
+
} else {
|
|
142
|
+
tb->Add(MakeKey(i, ValueType::kTypeWideColumnEntity),
|
|
143
|
+
MakeWideColumn(i));
|
|
144
|
+
}
|
|
127
145
|
}
|
|
128
146
|
} else if (strcmp(comparator_name,
|
|
129
147
|
test::BytewiseComparatorWithU64TsWrapper()->Name()) ==
|
|
@@ -133,7 +151,12 @@ class SSTDumpToolTest : public testing::Test {
|
|
|
133
151
|
}
|
|
134
152
|
} else {
|
|
135
153
|
for (uint32_t i = 0; i < num_keys; i++) {
|
|
136
|
-
|
|
154
|
+
if (wide_column_one_in == 0 || i % wide_column_one_in != 0) {
|
|
155
|
+
tb->Add(MakeKey(i), MakeValue(i));
|
|
156
|
+
} else {
|
|
157
|
+
tb->Add(MakeKey(i, ValueType::kTypeWideColumnEntity),
|
|
158
|
+
MakeWideColumn(i));
|
|
159
|
+
}
|
|
137
160
|
}
|
|
138
161
|
}
|
|
139
162
|
ASSERT_OK(tb->Finish());
|
|
@@ -164,7 +187,7 @@ TEST_F(SSTDumpToolTest, EmptyFilter) {
|
|
|
164
187
|
Options opts;
|
|
165
188
|
opts.env = env();
|
|
166
189
|
std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
|
|
167
|
-
createSST(opts, file_path);
|
|
190
|
+
createSST(opts, file_path, 10);
|
|
168
191
|
|
|
169
192
|
char* usage[3];
|
|
170
193
|
PopulateCommandArgs(file_path, "--command=raw", usage);
|
|
@@ -212,7 +235,7 @@ TEST_F(SSTDumpToolTest, SstDumpComparatorWithU64Ts) {
|
|
|
212
235
|
opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
|
|
213
236
|
std::string file_path =
|
|
214
237
|
MakeFilePath("rocksdb_sst_comparator_with_u64_ts.sst");
|
|
215
|
-
createSST(opts, file_path);
|
|
238
|
+
createSST(opts, file_path, 10);
|
|
216
239
|
|
|
217
240
|
char* usage[3];
|
|
218
241
|
PopulateCommandArgs(file_path, "--command=raw", usage);
|
|
@@ -234,7 +257,7 @@ TEST_F(SSTDumpToolTest, FilterBlock) {
|
|
|
234
257
|
ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10, true));
|
|
235
258
|
opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
|
|
236
259
|
std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
|
|
237
|
-
createSST(opts, file_path);
|
|
260
|
+
createSST(opts, file_path, 10);
|
|
238
261
|
|
|
239
262
|
char* usage[3];
|
|
240
263
|
PopulateCommandArgs(file_path, "--command=raw", usage);
|
|
@@ -300,7 +323,7 @@ TEST_F(SSTDumpToolTest, CompressedSizes) {
|
|
|
300
323
|
ROCKSDB_NAMESPACE::NewBloomFilterPolicy(10, false));
|
|
301
324
|
opts.table_factory.reset(new BlockBasedTableFactory(table_opts));
|
|
302
325
|
std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
|
|
303
|
-
createSST(opts, file_path);
|
|
326
|
+
createSST(opts, file_path, 10);
|
|
304
327
|
|
|
305
328
|
char* usage[3];
|
|
306
329
|
PopulateCommandArgs(file_path, "--command=recompress", usage);
|
|
@@ -426,7 +449,7 @@ TEST_F(SSTDumpToolTest, RawOutput) {
|
|
|
426
449
|
Options opts;
|
|
427
450
|
opts.env = env();
|
|
428
451
|
std::string file_path = MakeFilePath("rocksdb_sst_test.sst");
|
|
429
|
-
createSST(opts, file_path);
|
|
452
|
+
createSST(opts, file_path, 10);
|
|
430
453
|
|
|
431
454
|
char* usage[3];
|
|
432
455
|
PopulateCommandArgs(file_path, "--command=raw", usage);
|
|
@@ -23,6 +23,7 @@ int main() {
|
|
|
23
23
|
#include "cache/cache_reservation_manager.h"
|
|
24
24
|
#include "memory/arena.h"
|
|
25
25
|
#include "port/jemalloc_helper.h"
|
|
26
|
+
#include "rocksdb/convenience.h"
|
|
26
27
|
#include "rocksdb/filter_policy.h"
|
|
27
28
|
#include "table/block_based/filter_policy_internal.h"
|
|
28
29
|
#include "test_util/testharness.h"
|
|
@@ -1109,12 +1110,16 @@ static void SetTestingLevel(int levelish, FilterBuildingContext* ctx) {
|
|
|
1109
1110
|
TEST(RibbonTest, RibbonTestLevelThreshold) {
|
|
1110
1111
|
BlockBasedTableOptions opts;
|
|
1111
1112
|
FilterBuildingContext ctx(opts);
|
|
1113
|
+
|
|
1114
|
+
std::shared_ptr<FilterPolicy> reused{NewRibbonFilterPolicy(10)};
|
|
1115
|
+
|
|
1112
1116
|
// A few settings
|
|
1113
1117
|
for (CompactionStyle cs : {kCompactionStyleLevel, kCompactionStyleUniversal,
|
|
1114
1118
|
kCompactionStyleFIFO, kCompactionStyleNone}) {
|
|
1115
1119
|
ctx.compaction_style = cs;
|
|
1116
|
-
for (int bloom_before_level : {-1, 0, 1, 10}) {
|
|
1117
|
-
std::
|
|
1120
|
+
for (int bloom_before_level : {-1, 0, 1, 10, INT_MAX - 1, INT_MAX}) {
|
|
1121
|
+
SCOPED_TRACE("bloom_before_level=" + std::to_string(bloom_before_level));
|
|
1122
|
+
std::vector<std::shared_ptr<FilterPolicy> > policies;
|
|
1118
1123
|
policies.emplace_back(NewRibbonFilterPolicy(10, bloom_before_level));
|
|
1119
1124
|
|
|
1120
1125
|
if (bloom_before_level == 0) {
|
|
@@ -1122,16 +1127,22 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
|
|
|
1122
1127
|
policies.emplace_back(NewRibbonFilterPolicy(10));
|
|
1123
1128
|
}
|
|
1124
1129
|
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
SetTestingLevel(bloom_before_level, &ctx);
|
|
1130
|
+
ASSERT_OK(reused->ConfigureOption({}, "bloom_before_level",
|
|
1131
|
+
std::to_string(bloom_before_level)));
|
|
1128
1132
|
|
|
1129
|
-
|
|
1130
|
-
policy->GetBuilderWithContext(ctx)};
|
|
1133
|
+
policies.push_back(reused);
|
|
1131
1134
|
|
|
1132
|
-
|
|
1133
|
-
|
|
1135
|
+
for (auto& policy : policies) {
|
|
1136
|
+
std::unique_ptr<FilterBitsBuilder> builder;
|
|
1137
|
+
if (bloom_before_level < INT_MAX) {
|
|
1138
|
+
// Claim to be generating filter for this level
|
|
1139
|
+
SetTestingLevel(bloom_before_level, &ctx);
|
|
1140
|
+
|
|
1141
|
+
builder.reset(policy->GetBuilderWithContext(ctx));
|
|
1134
1142
|
|
|
1143
|
+
// Must be Ribbon (more space efficient than 10 bits per key)
|
|
1144
|
+
ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
|
|
1145
|
+
}
|
|
1135
1146
|
if (bloom_before_level >= 0) {
|
|
1136
1147
|
// Claim to be generating filter for previous level
|
|
1137
1148
|
SetTestingLevel(bloom_before_level - 1, &ctx);
|
|
@@ -1142,6 +1153,10 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
|
|
|
1142
1153
|
// Level is considered.
|
|
1143
1154
|
// Must be Bloom (~ 10 bits per key)
|
|
1144
1155
|
ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
|
|
1156
|
+
} else if (bloom_before_level == INT_MAX) {
|
|
1157
|
+
// Force bloom option
|
|
1158
|
+
// Must be Bloom (~ 10 bits per key)
|
|
1159
|
+
ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
|
|
1145
1160
|
} else {
|
|
1146
1161
|
// Level is ignored under non-traditional compaction styles.
|
|
1147
1162
|
// Must be Ribbon (more space efficient than 10 bits per key)
|
|
@@ -1155,8 +1170,14 @@ TEST(RibbonTest, RibbonTestLevelThreshold) {
|
|
|
1155
1170
|
|
|
1156
1171
|
builder.reset(policy->GetBuilderWithContext(ctx));
|
|
1157
1172
|
|
|
1158
|
-
|
|
1159
|
-
|
|
1173
|
+
if (bloom_before_level < INT_MAX) {
|
|
1174
|
+
// Must be Ribbon (more space efficient than 10 bits per key)
|
|
1175
|
+
ASSERT_LT(GetEffectiveBitsPerKey(builder.get()), 8);
|
|
1176
|
+
} else {
|
|
1177
|
+
// Force bloom option
|
|
1178
|
+
// Must be Bloom (~ 10 bits per key)
|
|
1179
|
+
ASSERT_GT(GetEffectiveBitsPerKey(builder.get()), 9);
|
|
1180
|
+
}
|
|
1160
1181
|
}
|
|
1161
1182
|
}
|
|
1162
1183
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
#pragma once
|
|
7
7
|
|
|
8
|
+
#include <initializer_list>
|
|
8
9
|
#include <memory>
|
|
9
10
|
#include <type_traits>
|
|
10
11
|
|
|
@@ -53,4 +54,13 @@ inline To lossless_cast(From x) {
|
|
|
53
54
|
return static_cast<To>(x);
|
|
54
55
|
}
|
|
55
56
|
|
|
57
|
+
// For disambiguating a potentially heterogeneous aggregate as a homogeneous
|
|
58
|
+
// initializer list. E.g. might be able to write List({x, y}) in some cases
|
|
59
|
+
// instead of std::vector<const Widget&>({x, y}).
|
|
60
|
+
template <typename T>
|
|
61
|
+
inline const std::initializer_list<T>& List(
|
|
62
|
+
const std::initializer_list<T>& list) {
|
|
63
|
+
return list;
|
|
64
|
+
}
|
|
65
|
+
|
|
56
66
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#include "rocksdb/slice.h"
|
|
24
24
|
#include "rocksdb/utilities/customizable_util.h"
|
|
25
25
|
#include "rocksdb/utilities/object_registry.h"
|
|
26
|
+
#include "util/coding.h"
|
|
26
27
|
|
|
27
28
|
namespace ROCKSDB_NAMESPACE {
|
|
28
29
|
|
|
@@ -230,7 +231,6 @@ class ReverseBytewiseComparatorImpl : public BytewiseComparatorImpl {
|
|
|
230
231
|
}
|
|
231
232
|
};
|
|
232
233
|
|
|
233
|
-
// EXPERIMENTAL
|
|
234
234
|
// Comparator with 64-bit integer timestamp.
|
|
235
235
|
// We did not performance test this yet.
|
|
236
236
|
template <typename TComparator>
|
|
@@ -328,6 +328,31 @@ const Comparator* ReverseBytewiseComparatorWithU64Ts() {
|
|
|
328
328
|
return &comp_with_u64_ts;
|
|
329
329
|
}
|
|
330
330
|
|
|
331
|
+
Status DecodeU64Ts(const Slice& ts, uint64_t* int_ts) {
|
|
332
|
+
if (ts.size() != sizeof(uint64_t)) {
|
|
333
|
+
return Status::InvalidArgument("U64Ts timestamp size mismatch.");
|
|
334
|
+
}
|
|
335
|
+
*int_ts = DecodeFixed64(ts.data());
|
|
336
|
+
return Status::OK();
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
Slice EncodeU64Ts(uint64_t ts, std::string* ts_buf) {
|
|
340
|
+
char buf[sizeof(ts)];
|
|
341
|
+
EncodeFixed64(buf, ts);
|
|
342
|
+
ts_buf->assign(buf, sizeof(buf));
|
|
343
|
+
return Slice(*ts_buf);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
Slice MaxU64Ts() {
|
|
347
|
+
static constexpr char kTsMax[] = "\xff\xff\xff\xff\xff\xff\xff\xff";
|
|
348
|
+
return Slice(kTsMax, sizeof(uint64_t));
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
Slice MinU64Ts() {
|
|
352
|
+
static constexpr char kTsMin[] = "\x00\x00\x00\x00\x00\x00\x00\x00";
|
|
353
|
+
return Slice(kTsMin, sizeof(uint64_t));
|
|
354
|
+
}
|
|
355
|
+
|
|
331
356
|
static int RegisterBuiltinComparators(ObjectLibrary& library,
|
|
332
357
|
const std::string& /*arg*/) {
|
|
333
358
|
library.AddFactory<const Comparator>(
|
|
@@ -1153,9 +1153,15 @@ inline bool LZ4_Compress(const CompressionInfo& info,
|
|
|
1153
1153
|
static_cast<int>(compression_dict.size()));
|
|
1154
1154
|
}
|
|
1155
1155
|
#if LZ4_VERSION_NUMBER >= 10700 // r129+
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1156
|
+
int acceleration;
|
|
1157
|
+
if (info.options().level < 0) {
|
|
1158
|
+
acceleration = -info.options().level;
|
|
1159
|
+
} else {
|
|
1160
|
+
acceleration = 1;
|
|
1161
|
+
}
|
|
1162
|
+
outlen = LZ4_compress_fast_continue(
|
|
1163
|
+
stream, input, &(*output)[output_header_len], static_cast<int>(length),
|
|
1164
|
+
compress_bound, acceleration);
|
|
1159
1165
|
#else // up to r128
|
|
1160
1166
|
outlen = LZ4_compress_limitedOutput_continue(
|
|
1161
1167
|
stream, input, &(*output)[output_header_len], static_cast<int>(length),
|
|
@@ -1117,7 +1117,13 @@ static inline Function Choose_Extend() {
|
|
|
1117
1117
|
}
|
|
1118
1118
|
#elif defined(__SSE4_2__) && defined(__PCLMUL__) && !defined NO_THREEWAY_CRC32C
|
|
1119
1119
|
// NOTE: runtime detection no longer supported on x86
|
|
1120
|
-
|
|
1120
|
+
#ifdef _MSC_VER
|
|
1121
|
+
#pragma warning(disable: 4551)
|
|
1122
|
+
#endif
|
|
1123
|
+
(void)ExtendImpl<DefaultCRC32>; // suppress unused warning
|
|
1124
|
+
#ifdef _MSC_VER
|
|
1125
|
+
#pragma warning(default: 4551)
|
|
1126
|
+
#endif
|
|
1121
1127
|
return crc32c_3way;
|
|
1122
1128
|
#else
|
|
1123
1129
|
return ExtendImpl<DefaultCRC32>;
|
|
@@ -28,7 +28,7 @@ class DMutex : public folly::DistributedMutex {
|
|
|
28
28
|
explicit DMutex(bool IGNORED_adaptive = false) { (void)IGNORED_adaptive; }
|
|
29
29
|
|
|
30
30
|
// currently no-op
|
|
31
|
-
void AssertHeld() {}
|
|
31
|
+
void AssertHeld() const {}
|
|
32
32
|
};
|
|
33
33
|
using DMutexLock = std::lock_guard<folly::DistributedMutex>;
|
|
34
34
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
3
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
5
|
+
|
|
6
|
+
#pragma once
|
|
7
|
+
|
|
8
|
+
#include "rocksdb/rocksdb_namespace.h"
|
|
9
|
+
|
|
10
|
+
namespace ROCKSDB_NAMESPACE {
|
|
11
|
+
|
|
12
|
+
// A helper template that can combine multiple functors into a single one to be
|
|
13
|
+
// used with std::visit for example. It also works with lambdas, since it
|
|
14
|
+
// comes with an explicit deduction guide.
|
|
15
|
+
template <typename... Ts>
|
|
16
|
+
struct overload : Ts... {
|
|
17
|
+
using Ts::operator()...;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
template <typename... Ts>
|
|
21
|
+
overload(Ts...) -> overload<Ts...>;
|
|
22
|
+
|
|
23
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -107,6 +107,23 @@ void GenericRateLimiter::SetBytesPerSecondLocked(int64_t bytes_per_second) {
|
|
|
107
107
|
std::memory_order_relaxed);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
Status GenericRateLimiter::SetSingleBurstBytes(int64_t single_burst_bytes) {
|
|
111
|
+
if (single_burst_bytes <= 0) {
|
|
112
|
+
return Status::InvalidArgument(
|
|
113
|
+
"`single_burst_bytes` must be greater than 0");
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
MutexLock g(&request_mutex_);
|
|
117
|
+
SetSingleBurstBytesLocked(single_burst_bytes);
|
|
118
|
+
return Status::OK();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
void GenericRateLimiter::SetSingleBurstBytesLocked(int64_t single_burst_bytes) {
|
|
122
|
+
refill_bytes_per_period_.store(single_burst_bytes, std::memory_order_relaxed);
|
|
123
|
+
refill_period_us_.store(CalculateRefillPeriodUsLocked(single_burst_bytes),
|
|
124
|
+
std::memory_order_relaxed);
|
|
125
|
+
}
|
|
126
|
+
|
|
110
127
|
void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
|
|
111
128
|
Statistics* stats) {
|
|
112
129
|
assert(bytes <= refill_bytes_per_period_.load(std::memory_order_relaxed));
|
|
@@ -120,7 +137,8 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
|
|
|
120
137
|
static const int kRefillsPerTune = 100;
|
|
121
138
|
std::chrono::microseconds now(NowMicrosMonotonicLocked());
|
|
122
139
|
if (now - tuned_time_ >=
|
|
123
|
-
kRefillsPerTune * std::chrono::microseconds(refill_period_us_
|
|
140
|
+
kRefillsPerTune * std::chrono::microseconds(refill_period_us_.load(
|
|
141
|
+
std::memory_order_relaxed))) {
|
|
124
142
|
Status s = TuneLocked();
|
|
125
143
|
s.PermitUncheckedError(); //**TODO: What to do on error?
|
|
126
144
|
}
|
|
@@ -170,7 +188,7 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
|
|
|
170
188
|
RecordTick(stats, NUMBER_RATE_LIMITER_DRAINS);
|
|
171
189
|
++num_drains_;
|
|
172
190
|
wait_until_refill_pending_ = true;
|
|
173
|
-
r.cv
|
|
191
|
+
clock_->TimedWait(&r.cv, std::chrono::microseconds(wait_until));
|
|
174
192
|
TEST_SYNC_POINT_CALLBACK("GenericRateLimiter::Request:PostTimedWait",
|
|
175
193
|
&time_until_refill_us);
|
|
176
194
|
wait_until_refill_pending_ = false;
|
|
@@ -179,16 +197,16 @@ void GenericRateLimiter::Request(int64_t bytes, const Env::IOPriority pri,
|
|
|
179
197
|
// Whichever thread reaches here first performs duty (2) as described
|
|
180
198
|
// above.
|
|
181
199
|
RefillBytesAndGrantRequestsLocked();
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
200
|
+
}
|
|
201
|
+
if (r.request_bytes == 0) {
|
|
202
|
+
// If there is any remaining requests, make sure there exists at least
|
|
203
|
+
// one candidate is awake for future duties by signaling a front request
|
|
204
|
+
// of a queue.
|
|
205
|
+
for (int i = Env::IO_TOTAL - 1; i >= Env::IO_LOW; --i) {
|
|
206
|
+
auto& queue = queue_[i];
|
|
207
|
+
if (!queue.empty()) {
|
|
208
|
+
queue.front()->cv.Signal();
|
|
209
|
+
break;
|
|
192
210
|
}
|
|
193
211
|
}
|
|
194
212
|
}
|
|
@@ -261,7 +279,8 @@ GenericRateLimiter::GeneratePriorityIterationOrderLocked() {
|
|
|
261
279
|
void GenericRateLimiter::RefillBytesAndGrantRequestsLocked() {
|
|
262
280
|
TEST_SYNC_POINT_CALLBACK(
|
|
263
281
|
"GenericRateLimiter::RefillBytesAndGrantRequestsLocked", &request_mutex_);
|
|
264
|
-
next_refill_us_ = NowMicrosMonotonicLocked() +
|
|
282
|
+
next_refill_us_ = NowMicrosMonotonicLocked() +
|
|
283
|
+
refill_period_us_.load(std::memory_order_relaxed);
|
|
265
284
|
// Carry over the left over quota from the last period
|
|
266
285
|
auto refill_bytes_per_period =
|
|
267
286
|
refill_bytes_per_period_.load(std::memory_order_relaxed);
|
|
@@ -299,13 +318,28 @@ void GenericRateLimiter::RefillBytesAndGrantRequestsLocked() {
|
|
|
299
318
|
|
|
300
319
|
int64_t GenericRateLimiter::CalculateRefillBytesPerPeriodLocked(
|
|
301
320
|
int64_t rate_bytes_per_sec) {
|
|
321
|
+
int64_t refill_period_us = refill_period_us_.load(std::memory_order_relaxed);
|
|
302
322
|
if (std::numeric_limits<int64_t>::max() / rate_bytes_per_sec <
|
|
303
|
-
|
|
323
|
+
refill_period_us) {
|
|
324
|
+
// Avoid unexpected result in the overflow case. The result now is still
|
|
325
|
+
// inaccurate but is a number that is large enough.
|
|
326
|
+
return std::numeric_limits<int64_t>::max() / kMicrosecondsPerSecond;
|
|
327
|
+
} else {
|
|
328
|
+
return rate_bytes_per_sec * refill_period_us / kMicrosecondsPerSecond;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
int64_t GenericRateLimiter::CalculateRefillPeriodUsLocked(
|
|
333
|
+
int64_t single_burst_bytes) {
|
|
334
|
+
int64_t rate_bytes_per_sec =
|
|
335
|
+
rate_bytes_per_sec_.load(std::memory_order_relaxed);
|
|
336
|
+
if (std::numeric_limits<int64_t>::max() / single_burst_bytes <
|
|
337
|
+
kMicrosecondsPerSecond) {
|
|
304
338
|
// Avoid unexpected result in the overflow case. The result now is still
|
|
305
339
|
// inaccurate but is a number that is large enough.
|
|
306
|
-
return std::numeric_limits<int64_t>::max() /
|
|
340
|
+
return std::numeric_limits<int64_t>::max() / rate_bytes_per_sec;
|
|
307
341
|
} else {
|
|
308
|
-
return
|
|
342
|
+
return single_burst_bytes * kMicrosecondsPerSecond / rate_bytes_per_sec;
|
|
309
343
|
}
|
|
310
344
|
}
|
|
311
345
|
|
|
@@ -320,10 +354,11 @@ Status GenericRateLimiter::TuneLocked() {
|
|
|
320
354
|
std::chrono::microseconds prev_tuned_time = tuned_time_;
|
|
321
355
|
tuned_time_ = std::chrono::microseconds(NowMicrosMonotonicLocked());
|
|
322
356
|
|
|
357
|
+
int64_t refill_period_us = refill_period_us_.load(std::memory_order_relaxed);
|
|
323
358
|
int64_t elapsed_intervals = (tuned_time_ - prev_tuned_time +
|
|
324
|
-
std::chrono::microseconds(
|
|
359
|
+
std::chrono::microseconds(refill_period_us) -
|
|
325
360
|
std::chrono::microseconds(1)) /
|
|
326
|
-
std::chrono::microseconds(
|
|
361
|
+
std::chrono::microseconds(refill_period_us);
|
|
327
362
|
// We tune every kRefillsPerTune intervals, so the overflow and division-by-
|
|
328
363
|
// zero conditions should never happen.
|
|
329
364
|
assert(num_drains_ <= std::numeric_limits<int64_t>::max() / 100);
|
|
@@ -36,6 +36,8 @@ class GenericRateLimiter : public RateLimiter {
|
|
|
36
36
|
// This API allows user to dynamically change rate limiter's bytes per second.
|
|
37
37
|
virtual void SetBytesPerSecond(int64_t bytes_per_second) override;
|
|
38
38
|
|
|
39
|
+
virtual Status SetSingleBurstBytes(int64_t single_burst_bytes) override;
|
|
40
|
+
|
|
39
41
|
// Request for token to write bytes. If this request can not be satisfied,
|
|
40
42
|
// the call is blocked. Caller is responsible to make sure
|
|
41
43
|
// bytes <= GetSingleBurstBytes() and bytes >= 0. Negative bytes
|
|
@@ -102,11 +104,14 @@ class GenericRateLimiter : public RateLimiter {
|
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
private:
|
|
107
|
+
static constexpr int kMicrosecondsPerSecond = 1000000;
|
|
105
108
|
void RefillBytesAndGrantRequestsLocked();
|
|
106
109
|
std::vector<Env::IOPriority> GeneratePriorityIterationOrderLocked();
|
|
107
110
|
int64_t CalculateRefillBytesPerPeriodLocked(int64_t rate_bytes_per_sec);
|
|
111
|
+
int64_t CalculateRefillPeriodUsLocked(int64_t single_burst_bytes);
|
|
108
112
|
Status TuneLocked();
|
|
109
113
|
void SetBytesPerSecondLocked(int64_t bytes_per_second);
|
|
114
|
+
void SetSingleBurstBytesLocked(int64_t single_burst_bytes);
|
|
110
115
|
|
|
111
116
|
uint64_t NowMicrosMonotonicLocked() {
|
|
112
117
|
return clock_->NowNanos() / std::milli::den;
|
|
@@ -115,7 +120,7 @@ class GenericRateLimiter : public RateLimiter {
|
|
|
115
120
|
// This mutex guard all internal states
|
|
116
121
|
mutable port::Mutex request_mutex_;
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
std::atomic<int64_t> refill_period_us_;
|
|
119
124
|
|
|
120
125
|
std::atomic<int64_t> rate_bytes_per_sec_;
|
|
121
126
|
std::atomic<int64_t> refill_bytes_per_period_;
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
#include "db/db_test_util.h"
|
|
16
16
|
#include "port/port.h"
|
|
17
17
|
#include "rocksdb/system_clock.h"
|
|
18
|
+
#include "test_util/mock_time_env.h"
|
|
18
19
|
#include "test_util/sync_point.h"
|
|
19
20
|
#include "test_util/testharness.h"
|
|
20
21
|
#include "util/random.h"
|
|
@@ -464,31 +465,21 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
|
|
|
464
465
|
const std::chrono::seconds kTimePerRefill(1);
|
|
465
466
|
const int kRefillsPerTune = 100; // needs to match util/rate_limiter.cc
|
|
466
467
|
|
|
467
|
-
|
|
468
|
+
auto mock_clock =
|
|
469
|
+
std::make_shared<MockSystemClock>(Env::Default()->GetSystemClock());
|
|
468
470
|
|
|
469
471
|
auto stats = CreateDBStatistics();
|
|
470
472
|
std::unique_ptr<RateLimiter> rate_limiter(new GenericRateLimiter(
|
|
471
473
|
1000 /* rate_bytes_per_sec */,
|
|
472
474
|
std::chrono::microseconds(kTimePerRefill).count(), 10 /* fairness */,
|
|
473
|
-
RateLimiter::Mode::kWritesOnly,
|
|
474
|
-
true /* auto_tuned */));
|
|
475
|
-
|
|
476
|
-
// Rate limiter uses `CondVar::TimedWait()`, which does not have access to the
|
|
477
|
-
// `Env` to advance its time according to the fake wait duration. The
|
|
478
|
-
// workaround is to install a callback that advance the `Env`'s mock time.
|
|
479
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
480
|
-
"GenericRateLimiter::Request:PostTimedWait", [&](void* arg) {
|
|
481
|
-
int64_t time_waited_us = *static_cast<int64_t*>(arg);
|
|
482
|
-
special_env.SleepForMicroseconds(static_cast<int>(time_waited_us));
|
|
483
|
-
});
|
|
484
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
475
|
+
RateLimiter::Mode::kWritesOnly, mock_clock, true /* auto_tuned */));
|
|
485
476
|
|
|
486
477
|
// verify rate limit increases after a sequence of periods where rate limiter
|
|
487
478
|
// is always drained
|
|
488
479
|
int64_t orig_bytes_per_sec = rate_limiter->GetSingleBurstBytes();
|
|
489
480
|
rate_limiter->Request(orig_bytes_per_sec, Env::IO_HIGH, stats.get(),
|
|
490
481
|
RateLimiter::OpType::kWrite);
|
|
491
|
-
while (std::chrono::microseconds(
|
|
482
|
+
while (std::chrono::microseconds(mock_clock->NowMicros()) <=
|
|
492
483
|
kRefillsPerTune * kTimePerRefill) {
|
|
493
484
|
rate_limiter->Request(orig_bytes_per_sec, Env::IO_HIGH, stats.get(),
|
|
494
485
|
RateLimiter::OpType::kWrite);
|
|
@@ -496,13 +487,9 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
|
|
|
496
487
|
int64_t new_bytes_per_sec = rate_limiter->GetSingleBurstBytes();
|
|
497
488
|
ASSERT_GT(new_bytes_per_sec, orig_bytes_per_sec);
|
|
498
489
|
|
|
499
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
|
500
|
-
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearCallBack(
|
|
501
|
-
"GenericRateLimiter::Request:PostTimedWait");
|
|
502
|
-
|
|
503
490
|
// decreases after a sequence of periods where rate limiter is not drained
|
|
504
491
|
orig_bytes_per_sec = new_bytes_per_sec;
|
|
505
|
-
|
|
492
|
+
mock_clock->SleepForMicroseconds(static_cast<int>(
|
|
506
493
|
kRefillsPerTune * std::chrono::microseconds(kTimePerRefill).count()));
|
|
507
494
|
// make a request so tuner can be triggered
|
|
508
495
|
rate_limiter->Request(1 /* bytes */, Env::IO_HIGH, stats.get(),
|
|
@@ -511,6 +498,90 @@ TEST_F(RateLimiterTest, AutoTuneIncreaseWhenFull) {
|
|
|
511
498
|
ASSERT_LT(new_bytes_per_sec, orig_bytes_per_sec);
|
|
512
499
|
}
|
|
513
500
|
|
|
501
|
+
TEST_F(RateLimiterTest, WaitHangingBug) {
|
|
502
|
+
// At t=0: Threads 0 and 1 request `kBytesPerRefill` bytes at low-pri. One
|
|
503
|
+
// will be granted immediately and the other will enter `TimedWait()`.
|
|
504
|
+
//
|
|
505
|
+
// At t=`kMicrosPerRefill`: Thread 2 requests `kBytesPerRefill` bytes at
|
|
506
|
+
// low-pri. Thread 2's request enters the queue. To expose the bug scenario,
|
|
507
|
+
// `SyncPoint`s ensure this happens while the lock is temporarily released in
|
|
508
|
+
// `TimedWait()`. Before the bug fix, Thread 2's request would then hang in
|
|
509
|
+
// `Wait()` interminably.
|
|
510
|
+
const int kBytesPerSecond = 100;
|
|
511
|
+
const int kMicrosPerSecond = 1000 * 1000;
|
|
512
|
+
const int kMicrosPerRefill = kMicrosPerSecond;
|
|
513
|
+
const int kBytesPerRefill =
|
|
514
|
+
kBytesPerSecond * kMicrosPerRefill / kMicrosPerSecond;
|
|
515
|
+
|
|
516
|
+
auto mock_clock =
|
|
517
|
+
std::make_shared<MockSystemClock>(Env::Default()->GetSystemClock());
|
|
518
|
+
std::unique_ptr<RateLimiter> limiter(new GenericRateLimiter(
|
|
519
|
+
kBytesPerSecond, kMicrosPerRefill, 10 /* fairness */,
|
|
520
|
+
RateLimiter::Mode::kWritesOnly, mock_clock, false /* auto_tuned */));
|
|
521
|
+
std::array<std::thread, 3> request_threads;
|
|
522
|
+
|
|
523
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
|
|
524
|
+
{{"RateLimiterTest::WaitHangingBug:InitialRequestsReady",
|
|
525
|
+
"MockSystemClock::TimedWait:UnlockedPreSleep"},
|
|
526
|
+
{"MockSystemClock::TimedWait:UnlockedPostSleep1",
|
|
527
|
+
"RateLimiterTest::WaitHangingBug:TestThreadRequestBegin"},
|
|
528
|
+
{"RateLimiterTest::WaitHangingBug:TestThreadRequestEnd",
|
|
529
|
+
"MockSystemClock::TimedWait:UnlockedPostSleep2"}});
|
|
530
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
531
|
+
|
|
532
|
+
for (int i = 0; i < 2; i++) {
|
|
533
|
+
request_threads[i] = std::thread([&]() {
|
|
534
|
+
limiter->Request(kBytesPerRefill /* bytes */, Env::IOPriority::IO_LOW,
|
|
535
|
+
nullptr /* stats */, RateLimiter::OpType::kWrite);
|
|
536
|
+
});
|
|
537
|
+
}
|
|
538
|
+
while (limiter->GetTotalRequests() < 2) {
|
|
539
|
+
}
|
|
540
|
+
TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:InitialRequestsReady");
|
|
541
|
+
|
|
542
|
+
TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:TestThreadRequestBegin");
|
|
543
|
+
request_threads[2] = std::thread([&]() {
|
|
544
|
+
limiter->Request(kBytesPerRefill /* bytes */, Env::IOPriority::IO_LOW,
|
|
545
|
+
nullptr /* stats */, RateLimiter::OpType::kWrite);
|
|
546
|
+
});
|
|
547
|
+
while (limiter->GetTotalRequests() < 3) {
|
|
548
|
+
}
|
|
549
|
+
TEST_SYNC_POINT("RateLimiterTest::WaitHangingBug:TestThreadRequestEnd");
|
|
550
|
+
|
|
551
|
+
for (int i = 0; i < 3; i++) {
|
|
552
|
+
request_threads[i].join();
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
TEST_F(RateLimiterTest, RuntimeSingleBurstBytesChange) {
|
|
557
|
+
constexpr int kMicrosecondsPerSecond = 1000000;
|
|
558
|
+
|
|
559
|
+
const int64_t kRateBytesPerSec = 400;
|
|
560
|
+
|
|
561
|
+
const int64_t kOldSingleBurstBytes = 100;
|
|
562
|
+
const int64_t kOldRefillPeriodUs =
|
|
563
|
+
kOldSingleBurstBytes * kMicrosecondsPerSecond / kRateBytesPerSec;
|
|
564
|
+
const int64_t kNewSingleBurstBytes = kOldSingleBurstBytes * 2;
|
|
565
|
+
|
|
566
|
+
SpecialEnv special_env(Env::Default(), /*time_elapse_only_sleep*/ true);
|
|
567
|
+
std::unique_ptr<RateLimiter> limiter(new GenericRateLimiter(
|
|
568
|
+
kRateBytesPerSec, kOldRefillPeriodUs, 10 /* fairness */,
|
|
569
|
+
RateLimiter::Mode::kWritesOnly, special_env.GetSystemClock(),
|
|
570
|
+
false /* auto_tuned */));
|
|
571
|
+
|
|
572
|
+
ASSERT_EQ(kOldSingleBurstBytes, limiter->GetSingleBurstBytes());
|
|
573
|
+
|
|
574
|
+
ASSERT_TRUE(limiter->SetSingleBurstBytes(0).IsInvalidArgument());
|
|
575
|
+
ASSERT_OK(limiter->SetSingleBurstBytes(kNewSingleBurstBytes));
|
|
576
|
+
ASSERT_EQ(kNewSingleBurstBytes, limiter->GetSingleBurstBytes());
|
|
577
|
+
|
|
578
|
+
// If the updated single burst bytes is not reflected in the bytes
|
|
579
|
+
// granting process, this request will hang forever.
|
|
580
|
+
limiter->Request(limiter->GetSingleBurstBytes() /* bytes */,
|
|
581
|
+
Env::IOPriority::IO_USER, nullptr /* stats */,
|
|
582
|
+
RateLimiter::OpType::kWrite);
|
|
583
|
+
}
|
|
584
|
+
|
|
514
585
|
} // namespace ROCKSDB_NAMESPACE
|
|
515
586
|
|
|
516
587
|
int main(int argc, char** argv) {
|