@nxtedition/rocksdb 8.2.8 → 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 +20 -10
- package/deps/rocksdb/rocksdb/Makefile +37 -25
- package/deps/rocksdb/rocksdb/README.md +29 -0
- package/deps/rocksdb/rocksdb/TARGETS +25 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
- 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 +58 -95
- 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 +2683 -496
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -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/crash_test.mk +14 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
- 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_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -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 +35 -10
- package/deps/rocksdb/rocksdb/db/c.cc +233 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
- package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
- package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
- package/deps/rocksdb/rocksdb/db/db_iter.h +11 -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_operand_test.cc +4 -11
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
- 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_statistics_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
- package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
- package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
- package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
- package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
- package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
- package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
- 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 +5 -2
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -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 +25 -7
- package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
- 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 +76 -54
- package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
- package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
- package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
- package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
- 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 +55 -20
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
- 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 +37 -13
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
- 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 +8 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
- 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/expected_value.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
- package/deps/rocksdb/rocksdb/env/env.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
- package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
- package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
- 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 +7 -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 +130 -22
- 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 +92 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
- 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.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -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/optimistic_transaction_db.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
- 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 +3 -2
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
- package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
- package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
- package/deps/rocksdb/rocksdb/options/options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
- package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
- package/deps/rocksdb/rocksdb/port/README +10 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +20 -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 +32 -12
- package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
- package/deps/rocksdb/rocksdb/src.mk +10 -1
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
- package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
- 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 +52 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
- 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 +50 -18
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
- 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/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/table/format.cc +175 -33
- package/deps/rocksdb/rocksdb/table/format.h +63 -10
- 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 +22 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
- package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
- package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
- 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/test_util/secondary_cache_test_util.h +19 -7
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
- package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
- package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
- package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
- package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +119 -35
- package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
- package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
- package/deps/rocksdb/rocksdb/util/hash.h +7 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
- package/deps/rocksdb/rocksdb/util/math.h +58 -6
- package/deps/rocksdb/rocksdb/util/math128.h +29 -7
- package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
- 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/single_thread_executor.h +1 -0
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
- 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 +10 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
- package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
- 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 +12 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
- 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 +111 -14
- package/deps/rocksdb/rocksdb.gyp +6 -2
- package/index.js +0 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/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,9 @@
|
|
|
9
9
|
#ifdef _MSC_VER
|
|
10
10
|
#include <intrin.h>
|
|
11
11
|
#endif
|
|
12
|
+
#ifdef __BMI2__
|
|
13
|
+
#include <immintrin.h>
|
|
14
|
+
#endif
|
|
12
15
|
|
|
13
16
|
#include <cstdint>
|
|
14
17
|
#include <type_traits>
|
|
@@ -20,11 +23,33 @@ ASSERT_FEATURE_COMPAT_HEADER();
|
|
|
20
23
|
|
|
21
24
|
namespace ROCKSDB_NAMESPACE {
|
|
22
25
|
|
|
26
|
+
// Fast implementation of extracting the bottom n bits of an integer.
|
|
27
|
+
// To ensure fast implementation, undefined if n bits is full width or more.
|
|
28
|
+
template <typename T>
|
|
29
|
+
inline T BottomNBits(T v, int nbits) {
|
|
30
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
31
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
32
|
+
assert(nbits >= 0);
|
|
33
|
+
assert(nbits < int{8 * sizeof(T)});
|
|
34
|
+
#ifdef __BMI2__
|
|
35
|
+
if constexpr (sizeof(T) <= 4) {
|
|
36
|
+
return static_cast<T>(_bzhi_u32(static_cast<uint32_t>(v), nbits));
|
|
37
|
+
}
|
|
38
|
+
if constexpr (sizeof(T) <= 8) {
|
|
39
|
+
return static_cast<T>(_bzhi_u64(static_cast<uint64_t>(v), nbits));
|
|
40
|
+
}
|
|
41
|
+
#endif
|
|
42
|
+
// Newer compilers compile this down to bzhi on x86, but some older
|
|
43
|
+
// ones don't, thus the need for the intrinsic above.
|
|
44
|
+
return static_cast<T>(v & ((T{1} << nbits) - 1));
|
|
45
|
+
}
|
|
46
|
+
|
|
23
47
|
// Fast implementation of floor(log2(v)). Undefined for 0 or negative
|
|
24
48
|
// numbers (in case of signed type).
|
|
25
49
|
template <typename T>
|
|
26
50
|
inline int FloorLog2(T v) {
|
|
27
|
-
static_assert(std::
|
|
51
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
52
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
28
53
|
assert(v > 0);
|
|
29
54
|
#ifdef _MSC_VER
|
|
30
55
|
static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
|
|
@@ -63,6 +88,8 @@ inline int FloorLog2(T v) {
|
|
|
63
88
|
// Constexpr version of FloorLog2
|
|
64
89
|
template <typename T>
|
|
65
90
|
constexpr int ConstexprFloorLog2(T v) {
|
|
91
|
+
// NOTE: not checking is_integral so that this works with Unsigned128
|
|
92
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
66
93
|
int rv = 0;
|
|
67
94
|
while (v > T{1}) {
|
|
68
95
|
++rv;
|
|
@@ -74,7 +101,8 @@ constexpr int ConstexprFloorLog2(T v) {
|
|
|
74
101
|
// Number of low-order zero bits before the first 1 bit. Undefined for 0.
|
|
75
102
|
template <typename T>
|
|
76
103
|
inline int CountTrailingZeroBits(T v) {
|
|
77
|
-
static_assert(std::
|
|
104
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
105
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
78
106
|
assert(v != 0);
|
|
79
107
|
#ifdef _MSC_VER
|
|
80
108
|
static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
|
|
@@ -115,6 +143,9 @@ namespace detail {
|
|
|
115
143
|
|
|
116
144
|
template <typename T>
|
|
117
145
|
int BitsSetToOneFallback(T v) {
|
|
146
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
147
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
148
|
+
|
|
118
149
|
const int kBits = static_cast<int>(sizeof(T)) * 8;
|
|
119
150
|
static_assert((kBits & (kBits - 1)) == 0, "must be power of two bits");
|
|
120
151
|
// we static_cast these bit patterns in order to truncate them to the correct
|
|
@@ -140,7 +171,9 @@ int BitsSetToOneFallback(T v) {
|
|
|
140
171
|
// Number of bits set to 1. Also known as "population count".
|
|
141
172
|
template <typename T>
|
|
142
173
|
inline int BitsSetToOne(T v) {
|
|
143
|
-
static_assert(std::
|
|
174
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
175
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
176
|
+
|
|
144
177
|
#ifdef _MSC_VER
|
|
145
178
|
static_assert(sizeof(T) <= sizeof(uint64_t), "type too big");
|
|
146
179
|
if (sizeof(T) < sizeof(uint32_t)) {
|
|
@@ -192,7 +225,9 @@ inline int BitsSetToOne(T v) {
|
|
|
192
225
|
|
|
193
226
|
template <typename T>
|
|
194
227
|
inline int BitParity(T v) {
|
|
195
|
-
static_assert(std::
|
|
228
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
229
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
230
|
+
|
|
196
231
|
#ifdef _MSC_VER
|
|
197
232
|
// bit parity == oddness of popcount
|
|
198
233
|
return BitsSetToOne(v) & 1;
|
|
@@ -214,7 +249,8 @@ inline int BitParity(T v) {
|
|
|
214
249
|
// encode/decode big endian.
|
|
215
250
|
template <typename T>
|
|
216
251
|
inline T EndianSwapValue(T v) {
|
|
217
|
-
static_assert(std::
|
|
252
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
253
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
218
254
|
|
|
219
255
|
#ifdef _MSC_VER
|
|
220
256
|
if (sizeof(T) == 2) {
|
|
@@ -244,6 +280,9 @@ inline T EndianSwapValue(T v) {
|
|
|
244
280
|
// Reverses the order of bits in an integral value
|
|
245
281
|
template <typename T>
|
|
246
282
|
inline T ReverseBits(T v) {
|
|
283
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
284
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
285
|
+
|
|
247
286
|
T r = EndianSwapValue(v);
|
|
248
287
|
const T kHighestByte = T{1} << ((sizeof(T) - 1) * 8);
|
|
249
288
|
const T kEveryByte = kHighestByte | (kHighestByte / 255);
|
|
@@ -277,7 +316,8 @@ inline T ReverseBits(T v) {
|
|
|
277
316
|
// is that all square sub-matrices that include the top row are invertible.
|
|
278
317
|
template <typename T>
|
|
279
318
|
inline T DownwardInvolution(T v) {
|
|
280
|
-
static_assert(std::
|
|
319
|
+
static_assert(std::is_integral_v<T>, "non-integral type");
|
|
320
|
+
static_assert(!std::is_reference_v<T>, "use std::remove_reference_t");
|
|
281
321
|
static_assert(sizeof(T) <= 8, "only supported up to 64 bits");
|
|
282
322
|
|
|
283
323
|
uint64_t r = static_cast<uint64_t>(v);
|
|
@@ -296,4 +336,16 @@ inline T DownwardInvolution(T v) {
|
|
|
296
336
|
return static_cast<T>(r);
|
|
297
337
|
}
|
|
298
338
|
|
|
339
|
+
// Bitwise-And with typing that allows you to avoid writing an explicit cast
|
|
340
|
+
// to the smaller type, or the type of the right parameter if same size.
|
|
341
|
+
template <typename A, typename B>
|
|
342
|
+
inline std::conditional_t<sizeof(A) < sizeof(B), A, B> BitwiseAnd(A a, B b) {
|
|
343
|
+
static_assert(std::is_integral_v<A>, "non-integral type");
|
|
344
|
+
static_assert(std::is_integral_v<B>, "non-integral type");
|
|
345
|
+
static_assert(!std::is_reference_v<A>, "use std::remove_reference_t");
|
|
346
|
+
static_assert(!std::is_reference_v<B>, "use std::remove_reference_t");
|
|
347
|
+
using Smaller = std::conditional_t<sizeof(A) < sizeof(B), A, B>;
|
|
348
|
+
return static_cast<Smaller>(a & b);
|
|
349
|
+
}
|
|
350
|
+
|
|
299
351
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -41,13 +41,13 @@ struct Unsigned128 {
|
|
|
41
41
|
hi = upper;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
explicit operator
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
// Convert to any integer 64 bits or less.
|
|
45
|
+
template <typename T,
|
|
46
|
+
typename = std::enable_if_t<std::is_integral_v<T> &&
|
|
47
|
+
sizeof(T) <= sizeof(uint64_t)> >
|
|
48
|
+
explicit operator T() {
|
|
49
|
+
return static_cast<T>(lo);
|
|
50
|
+
}
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
inline Unsigned128 operator<<(const Unsigned128& lhs, unsigned shift) {
|
|
@@ -190,6 +190,16 @@ inline Unsigned128 Multiply64to128(uint64_t a, uint64_t b) {
|
|
|
190
190
|
#endif
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
template <>
|
|
194
|
+
inline Unsigned128 BottomNBits(Unsigned128 v, int nbits) {
|
|
195
|
+
if (nbits < 64) {
|
|
196
|
+
return BottomNBits(Lower64of128(v), nbits);
|
|
197
|
+
} else {
|
|
198
|
+
return (Unsigned128{BottomNBits(Upper64of128(v), nbits - 64)} << 64) |
|
|
199
|
+
Lower64of128(v);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
193
203
|
template <>
|
|
194
204
|
inline int FloorLog2(Unsigned128 v) {
|
|
195
205
|
if (Upper64of128(v) == 0) {
|
|
@@ -236,6 +246,18 @@ inline Unsigned128 DownwardInvolution(Unsigned128 v) {
|
|
|
236
246
|
DownwardInvolution(Upper64of128(v) ^ Lower64of128(v));
|
|
237
247
|
}
|
|
238
248
|
|
|
249
|
+
template <typename A>
|
|
250
|
+
inline std::remove_reference_t<A> BitwiseAnd(A a, Unsigned128 b) {
|
|
251
|
+
static_assert(sizeof(A) <= sizeof(Unsigned128));
|
|
252
|
+
return static_cast<A>(a & b);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
template <typename B>
|
|
256
|
+
inline std::remove_reference_t<B> BitwiseAnd(Unsigned128 a, B b) {
|
|
257
|
+
static_assert(sizeof(B) <= sizeof(Unsigned128));
|
|
258
|
+
return static_cast<B>(a & b);
|
|
259
|
+
}
|
|
260
|
+
|
|
239
261
|
template <typename T>
|
|
240
262
|
struct IsUnsignedUpTo128
|
|
241
263
|
: std::integral_constant<bool, std::is_unsigned<T>::value ||
|
|
@@ -12,10 +12,13 @@
|
|
|
12
12
|
|
|
13
13
|
#include <atomic>
|
|
14
14
|
#include <functional>
|
|
15
|
+
#include <memory>
|
|
15
16
|
#include <mutex>
|
|
16
17
|
#include <thread>
|
|
17
18
|
|
|
18
19
|
#include "port/port.h"
|
|
20
|
+
#include "util/fastrange.h"
|
|
21
|
+
#include "util/hash.h"
|
|
19
22
|
|
|
20
23
|
namespace ROCKSDB_NAMESPACE {
|
|
21
24
|
|
|
@@ -129,10 +132,25 @@ class SpinMutex {
|
|
|
129
132
|
std::atomic<bool> locked_;
|
|
130
133
|
};
|
|
131
134
|
|
|
132
|
-
//
|
|
135
|
+
// For preventing false sharing, especially for mutexes.
|
|
136
|
+
// NOTE: if a mutex is less than half the size of a cache line, it would
|
|
137
|
+
// make more sense for Striped structure below to pack more than one mutex
|
|
138
|
+
// into each cache line, as this would only reduce contention for the same
|
|
139
|
+
// amount of space and cache sharing. However, a mutex is often 40 bytes out
|
|
140
|
+
// of a 64 byte cache line.
|
|
133
141
|
template <class T>
|
|
134
|
-
struct ALIGN_AS(CACHE_LINE_SIZE)
|
|
135
|
-
T
|
|
142
|
+
struct ALIGN_AS(CACHE_LINE_SIZE) CacheAlignedWrapper {
|
|
143
|
+
T obj_;
|
|
144
|
+
};
|
|
145
|
+
template <class T>
|
|
146
|
+
struct Unwrap {
|
|
147
|
+
using type = T;
|
|
148
|
+
static type &Go(T &t) { return t; }
|
|
149
|
+
};
|
|
150
|
+
template <class T>
|
|
151
|
+
struct Unwrap<CacheAlignedWrapper<T>> {
|
|
152
|
+
using type = T;
|
|
153
|
+
static type &Go(CacheAlignedWrapper<T> &t) { return t.obj_; }
|
|
136
154
|
};
|
|
137
155
|
|
|
138
156
|
//
|
|
@@ -144,38 +162,28 @@ struct ALIGN_AS(CACHE_LINE_SIZE) LockData {
|
|
|
144
162
|
// single lock and allowing independent operations to lock different stripes and
|
|
145
163
|
// proceed concurrently, instead of creating contention for a single lock.
|
|
146
164
|
//
|
|
147
|
-
template <class T, class
|
|
165
|
+
template <class T, class Key = Slice, class Hash = SliceNPHasher64>
|
|
148
166
|
class Striped {
|
|
149
167
|
public:
|
|
150
|
-
Striped(size_t
|
|
151
|
-
:
|
|
152
|
-
locks_ = reinterpret_cast<LockData<T> *>(
|
|
153
|
-
port::cacheline_aligned_alloc(sizeof(LockData<T>) * stripes));
|
|
154
|
-
for (size_t i = 0; i < stripes; i++) {
|
|
155
|
-
new (&locks_[i]) LockData<T>();
|
|
156
|
-
}
|
|
157
|
-
}
|
|
168
|
+
explicit Striped(size_t stripe_count)
|
|
169
|
+
: stripe_count_(stripe_count), data_(new T[stripe_count]) {}
|
|
158
170
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
locks_[i].~LockData<T>();
|
|
164
|
-
}
|
|
165
|
-
port::cacheline_aligned_free(locks_);
|
|
166
|
-
}
|
|
171
|
+
using Unwrapped = typename Unwrap<T>::type;
|
|
172
|
+
Unwrapped &Get(const Key &key, uint64_t seed = 0) {
|
|
173
|
+
size_t index = FastRangeGeneric(hash_(key, seed), stripe_count_);
|
|
174
|
+
return Unwrap<T>::Go(data_[index]);
|
|
167
175
|
}
|
|
168
176
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return
|
|
177
|
+
size_t ApproximateMemoryUsage() const {
|
|
178
|
+
// NOTE: could use malloc_usable_size() here, but that could count unmapped
|
|
179
|
+
// pages and could mess up unit test OccLockBucketsTest::CacheAligned
|
|
180
|
+
return sizeof(*this) + stripe_count_ * sizeof(T);
|
|
173
181
|
}
|
|
174
182
|
|
|
175
183
|
private:
|
|
176
|
-
size_t
|
|
177
|
-
|
|
178
|
-
|
|
184
|
+
size_t stripe_count_;
|
|
185
|
+
std::unique_ptr<T[]> data_;
|
|
186
|
+
Hash hash_;
|
|
179
187
|
};
|
|
180
188
|
|
|
181
189
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -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) {
|
|
@@ -243,6 +243,36 @@ TEST_F(SmallEnumSetTest, SmallEnumSetTest2) {
|
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
+
// ***************************************************************** //
|
|
247
|
+
// Unit test for Status
|
|
248
|
+
TEST(StatusTest, Update) {
|
|
249
|
+
const Status ok = Status::OK();
|
|
250
|
+
const Status inc = Status::Incomplete("blah");
|
|
251
|
+
const Status notf = Status::NotFound("meow");
|
|
252
|
+
|
|
253
|
+
Status s = ok;
|
|
254
|
+
ASSERT_TRUE(s.UpdateIfOk(Status::Corruption("bad")).IsCorruption());
|
|
255
|
+
ASSERT_TRUE(s.IsCorruption());
|
|
256
|
+
|
|
257
|
+
s = ok;
|
|
258
|
+
ASSERT_TRUE(s.UpdateIfOk(Status::OK()).ok());
|
|
259
|
+
ASSERT_TRUE(s.UpdateIfOk(ok).ok());
|
|
260
|
+
ASSERT_TRUE(s.ok());
|
|
261
|
+
|
|
262
|
+
ASSERT_TRUE(s.UpdateIfOk(inc).IsIncomplete());
|
|
263
|
+
ASSERT_TRUE(s.IsIncomplete());
|
|
264
|
+
|
|
265
|
+
ASSERT_TRUE(s.UpdateIfOk(notf).IsIncomplete());
|
|
266
|
+
ASSERT_TRUE(s.UpdateIfOk(ok).IsIncomplete());
|
|
267
|
+
ASSERT_TRUE(s.IsIncomplete());
|
|
268
|
+
|
|
269
|
+
// Keeps left-most non-OK status
|
|
270
|
+
s = ok;
|
|
271
|
+
ASSERT_TRUE(
|
|
272
|
+
s.UpdateIfOk(Status()).UpdateIfOk(notf).UpdateIfOk(inc).IsNotFound());
|
|
273
|
+
ASSERT_TRUE(s.IsNotFound());
|
|
274
|
+
}
|
|
275
|
+
|
|
246
276
|
} // namespace ROCKSDB_NAMESPACE
|
|
247
277
|
|
|
248
278
|
int main(int argc, char** argv) {
|