@nxtedition/rocksdb 15.4.1 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +70 -23
- package/deps/rocksdb/rocksdb/.clang-tidy +86 -0
- package/deps/rocksdb/rocksdb/BUCK +42 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +11 -0
- package/deps/rocksdb/rocksdb/Makefile +59 -32
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -5
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +9 -9
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +3 -3
- package/deps/rocksdb/rocksdb/cache/cache_key.h +5 -5
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +16 -16
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +258 -294
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +98 -49
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +1 -5
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +18 -18
- package/deps/rocksdb/rocksdb/crash_test.mk +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -22
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +14 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +38 -26
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +101 -18
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +12 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +6 -9
- package/deps/rocksdb/rocksdb/db/builder.cc +23 -0
- package/deps/rocksdb/rocksdb/db/builder.h +7 -0
- package/deps/rocksdb/rocksdb/db/c.cc +373 -57
- package/deps/rocksdb/rocksdb/db/c_test.c +101 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +31 -3
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +10 -13
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +35 -48
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +13 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +201 -39
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -455
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +19 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +72 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +405 -83
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +25 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1410 -106
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +12 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +19 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +505 -45
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +9 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +7 -9
- package/deps/rocksdb/rocksdb/db/convenience.cc +4 -4
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +60 -88
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +10 -12
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +471 -40
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +116 -2
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +5 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_abort_test.cc +993 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +329 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +155 -13
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +54 -31
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +232 -70
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +57 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +224 -31
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +4 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +164 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +47 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +22 -9
- package/deps/rocksdb/rocksdb/db/db_iter.cc +9 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +371 -6
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +7 -5
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +22 -23
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +40 -0
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +32 -13
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +68 -15
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +644 -128
- package/deps/rocksdb/rocksdb/db/db_test2.cc +198 -81
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +35 -10
- package/deps/rocksdb/rocksdb/db/db_test_util.h +8 -2
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +36 -32
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +11 -7
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +499 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +284 -20
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/dbformat.h +0 -5
- package/deps/rocksdb/rocksdb/db/error_handler.cc +24 -0
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +12 -14
- package/deps/rocksdb/rocksdb/db/experimental.cc +13 -10
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +22 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +21 -15
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +4 -6
- package/deps/rocksdb/rocksdb/db/flush_job.cc +11 -3
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +5 -6
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +4 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +17 -17
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/memtable.cc +197 -51
- package/deps/rocksdb/rocksdb/db/memtable.h +6 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/merge_test.cc +37 -35
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +9 -11
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +10 -1
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +292 -15
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +10 -17
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +6 -8
- package/deps/rocksdb/rocksdb/db/repair.cc +10 -10
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/table_cache.cc +142 -135
- package/deps/rocksdb/rocksdb/db/table_cache.h +30 -6
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_builder.cc +11 -50
- package/deps/rocksdb/rocksdb/db/version_builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/version_edit.cc +51 -2
- package/deps/rocksdb/rocksdb/db/version_edit.h +91 -29
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -7
- package/deps/rocksdb/rocksdb/db/version_set.cc +211 -50
- package/deps/rocksdb/rocksdb/db/version_set.h +40 -3
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +5 -0
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/version_util.cc +96 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +24 -0
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +647 -31
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +219 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +549 -12
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +21 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +32 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +74 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +9 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -61
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +76 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +92 -72
- package/deps/rocksdb/rocksdb/env/env.cc +1 -0
- package/deps/rocksdb/rocksdb/env/env_test.cc +365 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +31 -30
- package/deps/rocksdb/rocksdb/env/io_posix.cc +8 -11
- package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +43 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +108 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +32 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +4 -4
- package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +331 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +52 -35
- package/deps/rocksdb/rocksdb/folly.mk +22 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +100 -54
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +67 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +149 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +78 -97
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/io_dispatcher.h +358 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +43 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +20 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +63 -21
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +10 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +2 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +49 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +77 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +16 -10
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +5 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +2 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +106 -46
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +14 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +7 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +226 -8
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +490 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +3 -3
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +11 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +4 -12
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +5 -5
- package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +21 -4
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +9 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +21 -2
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +21 -1
- package/deps/rocksdb/rocksdb/options/cf_options.h +2 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +0 -2
- package/deps/rocksdb/rocksdb/options/db_options.cc +26 -5
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -1
- package/deps/rocksdb/rocksdb/options/options.cc +5 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +7 -2
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +109 -103
- package/deps/rocksdb/rocksdb/options/options_test.cc +14 -0
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +15 -17
- package/deps/rocksdb/rocksdb/port/lang.h +4 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +0 -23
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +36 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +9 -0
- package/deps/rocksdb/rocksdb/src.mk +12 -0
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +571 -292
- package/deps/rocksdb/rocksdb/table/block_based/block.h +143 -53
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +154 -90
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +5 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +51 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +0 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +147 -734
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +30 -233
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +178 -108
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +13 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +17 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +70 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +168 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +9 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +548 -169
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_util.h +156 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +73 -30
- package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +74 -7
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +20 -14
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +22 -12
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.cc +332 -0
- package/deps/rocksdb/rocksdb/table/block_based/multi_scan_index_iterator.h +133 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +126 -46
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +31 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cleanable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +25 -4
- package/deps/rocksdb/rocksdb/table/format.cc +27 -15
- package/deps/rocksdb/rocksdb/table/format.h +41 -15
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +22 -12
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +7 -21
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +88 -13
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +53 -42
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +3 -12
- package/deps/rocksdb/rocksdb/table/table_builder.h +0 -4
- package/deps/rocksdb/rocksdb/table/table_properties.cc +18 -0
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +2 -3
- package/deps/rocksdb/rocksdb/table/table_test.cc +848 -172
- package/deps/rocksdb/rocksdb/table/unique_id.cc +24 -20
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +8 -8
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +5 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +2 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.h +2 -2
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +238 -120
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +2 -4
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +4 -8
- package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +2 -3
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +82 -20
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +41 -47
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +5 -6
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +6 -5
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +4 -4
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +1 -3
- package/deps/rocksdb/rocksdb/util/atomic.h +30 -23
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +6 -7
- package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +3 -3
- package/deps/rocksdb/rocksdb/util/bit_fields.h +68 -46
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +16 -16
- package/deps/rocksdb/rocksdb/util/coding.h +14 -27
- package/deps/rocksdb/rocksdb/util/compression.cc +365 -207
- package/deps/rocksdb/rocksdb/util/compression.h +16 -1298
- package/deps/rocksdb/rocksdb/util/compression_test.cc +347 -61
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +8 -9
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +1 -1
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -3
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +18 -18
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +3 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +19 -7
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.cc +1099 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_imp.h +36 -0
- package/deps/rocksdb/rocksdb/util/io_dispatcher_test.cc +1919 -0
- package/deps/rocksdb/rocksdb/util/math.h +3 -1
- package/deps/rocksdb/rocksdb/util/mutexlock.h +19 -19
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +25 -25
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +5 -7
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -5
- package/deps/rocksdb/rocksdb/util/slice.cc +0 -10
- package/deps/rocksdb/rocksdb/util/slice_test.cc +35 -1
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +5 -7
- package/deps/rocksdb/rocksdb/util/status.cc +3 -1
- package/deps/rocksdb/rocksdb/util/stop_watch.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +4 -1
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -78
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +12 -93
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +1 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +0 -21
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +6 -48
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +94 -307
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +12 -58
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +2 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +205 -811
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +18 -9
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +2 -7
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +1 -9
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +17 -11
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +68 -61
- package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +105 -59
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs_test.cc +94 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +13 -17
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +16 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +25 -25
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +40 -40
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +2 -5
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +17 -19
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +4 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_seqno_test.cc +431 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +91 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.cc +562 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/bitvector.h +615 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.cc +2575 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/louds_trie.h +685 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_db_test.cc +2843 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.cc +567 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_factory.h +275 -0
- package/deps/rocksdb/rocksdb/utilities/trie_index/trie_index_test.cc +5183 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +3 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +93 -88
- package/deps/rocksdb/rocksdb.gyp +7 -0
- package/index.js +70 -10
- package/iterator.js +25 -3
- package/max_rev_operator.h +9 -5
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +0 -43
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +0 -55
|
@@ -17,11 +17,28 @@
|
|
|
17
17
|
#pragma once
|
|
18
18
|
|
|
19
19
|
#include <algorithm>
|
|
20
|
+
#include <atomic>
|
|
21
|
+
#include <chrono>
|
|
22
|
+
#include <cstdarg>
|
|
23
|
+
#include <functional>
|
|
20
24
|
#include <map>
|
|
21
25
|
#include <set>
|
|
22
26
|
#include <string>
|
|
27
|
+
#include <thread>
|
|
28
|
+
|
|
29
|
+
#ifndef OS_WIN
|
|
30
|
+
#include <fcntl.h>
|
|
31
|
+
#include <limits.h>
|
|
32
|
+
#include <unistd.h>
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
// PATH_MAX may not be defined on all platforms
|
|
36
|
+
#ifndef PATH_MAX
|
|
37
|
+
#define PATH_MAX 4096
|
|
38
|
+
#endif
|
|
23
39
|
|
|
24
40
|
#include "file/filename.h"
|
|
41
|
+
#include "port/lang.h"
|
|
25
42
|
#include "rocksdb/file_system.h"
|
|
26
43
|
#include "util/mutexlock.h"
|
|
27
44
|
#include "util/random.h"
|
|
@@ -29,9 +46,240 @@
|
|
|
29
46
|
|
|
30
47
|
namespace ROCKSDB_NAMESPACE {
|
|
31
48
|
|
|
49
|
+
// A fixed-size circular buffer that records recently injected errors.
|
|
50
|
+
// Thread-safe for concurrent writes. Designed to be safe to read from a
|
|
51
|
+
// signal handler (PrintAll uses only fprintf to stderr).
|
|
52
|
+
class InjectedErrorLog {
|
|
53
|
+
public:
|
|
54
|
+
static constexpr size_t kMaxEntries = 1000;
|
|
55
|
+
static constexpr size_t kMaxMessageLen = 256;
|
|
56
|
+
|
|
57
|
+
struct Entry {
|
|
58
|
+
uint64_t timestamp_us;
|
|
59
|
+
uint64_t thread_id;
|
|
60
|
+
char context[kMaxMessageLen];
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
InjectedErrorLog() : head_(0), entries_{} { log_path_[0] = '\0'; }
|
|
64
|
+
|
|
65
|
+
// Set the file path for PrintAll() output. Must be called before any
|
|
66
|
+
// signal handler invocation (not async-signal-safe itself due to string
|
|
67
|
+
// copy, but called once at setup time). If not set, PrintAll() falls
|
|
68
|
+
// back to writing to stderr.
|
|
69
|
+
void SetLogFilePath(const std::string& path) {
|
|
70
|
+
size_t len = std::min(path.size(), sizeof(log_path_) - 1);
|
|
71
|
+
memcpy(log_path_, path.data(), len);
|
|
72
|
+
log_path_[len] = '\0';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
TSAN_SUPPRESSION void Record(const char* fmt, ...)
|
|
76
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
77
|
+
__attribute__((format(printf, 2, 3)))
|
|
78
|
+
#endif
|
|
79
|
+
{
|
|
80
|
+
size_t idx = head_.fetch_add(1, std::memory_order_relaxed) % kMaxEntries;
|
|
81
|
+
Entry& e = entries_[idx];
|
|
82
|
+
e.thread_id = std::hash<std::thread::id>{}(std::this_thread::get_id());
|
|
83
|
+
auto now = std::chrono::system_clock::now();
|
|
84
|
+
e.timestamp_us = std::chrono::duration_cast<std::chrono::microseconds>(
|
|
85
|
+
now.time_since_epoch())
|
|
86
|
+
.count();
|
|
87
|
+
// Format into a local buffer first, then copy into the shared entry.
|
|
88
|
+
// This avoids calling the TSAN-intercepted vsnprintf directly on shared
|
|
89
|
+
// memory. We use a byte-by-byte loop instead of memcpy because
|
|
90
|
+
// TSAN_SUPPRESSION (no_sanitize("thread")) only suppresses
|
|
91
|
+
// compiler-inserted instrumentation -- it does NOT suppress TSAN's
|
|
92
|
+
// runtime interceptors for libc functions like memcpy, vsnprintf, and
|
|
93
|
+
// snprintf. Plain store instructions are always suppressed regardless
|
|
94
|
+
// of optimization level. The volatile source pointer prevents the
|
|
95
|
+
// compiler from recognizing this as a memcpy idiom and replacing it
|
|
96
|
+
// with a memcpy call.
|
|
97
|
+
char local_buf[kMaxMessageLen];
|
|
98
|
+
va_list args;
|
|
99
|
+
va_start(args, fmt);
|
|
100
|
+
vsnprintf(local_buf, kMaxMessageLen, fmt, args);
|
|
101
|
+
va_end(args);
|
|
102
|
+
const volatile char* src = local_buf;
|
|
103
|
+
for (size_t i = 0; i < kMaxMessageLen; i++) {
|
|
104
|
+
e.context[i] = src[i];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Format the first few bytes of a buffer as hex for logging.
|
|
109
|
+
// Returns a string like "ab cd ef 01 02 ..."
|
|
110
|
+
static std::string HexHead(const char* data, size_t size,
|
|
111
|
+
size_t max_bytes = 8) {
|
|
112
|
+
std::string result;
|
|
113
|
+
size_t n = std::min(size, max_bytes);
|
|
114
|
+
char buf[4];
|
|
115
|
+
for (size_t i = 0; i < n; i++) {
|
|
116
|
+
snprintf(buf, sizeof(buf), "%02x ", (unsigned char)data[i]);
|
|
117
|
+
result += buf;
|
|
118
|
+
}
|
|
119
|
+
if (size > max_bytes) result += "...";
|
|
120
|
+
if (!result.empty() && result.back() == ' ') result.pop_back();
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Print all recorded entries to a log file (or stderr as fallback).
|
|
125
|
+
// Async-signal-safe: uses only open/write/close/snprintf (no fprintf,
|
|
126
|
+
// no malloc). Safe to call from a signal handler.
|
|
127
|
+
//
|
|
128
|
+
// Note: entries may be read while being written by another thread.
|
|
129
|
+
// This is a benign race -- at worst, one entry may appear garbled.
|
|
130
|
+
// We accept this trade-off to keep PrintAll() free of locks and safe
|
|
131
|
+
// for use in signal handlers.
|
|
132
|
+
TSAN_SUPPRESSION void PrintAll() const {
|
|
133
|
+
#ifndef OS_WIN
|
|
134
|
+
int fd = -1;
|
|
135
|
+
if (log_path_[0] != '\0') {
|
|
136
|
+
fd = open(log_path_, O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
|
137
|
+
}
|
|
138
|
+
// Fall back to stdout if open failed or no path was set.
|
|
139
|
+
// We avoid stderr because db_crashtest.py treats any stderr output
|
|
140
|
+
// as a test failure.
|
|
141
|
+
if (fd < 0) {
|
|
142
|
+
fd = STDOUT_FILENO;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
auto write_str = [fd](const char* buf, int len) {
|
|
146
|
+
if (len > 0) {
|
|
147
|
+
// Ignore return value in signal handler -- nothing we can do
|
|
148
|
+
auto unused __attribute__((unused)) = write(fd, buf, len);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
char buf[512];
|
|
153
|
+
int len = snprintf(buf, sizeof(buf),
|
|
154
|
+
"\n=== Recently Injected Fault Injection Errors "
|
|
155
|
+
"(most recent last) ===\n");
|
|
156
|
+
write_str(buf, len);
|
|
157
|
+
|
|
158
|
+
size_t total = head_.load(std::memory_order_relaxed);
|
|
159
|
+
if (total == 0) {
|
|
160
|
+
len = snprintf(buf, sizeof(buf), "(none)\n");
|
|
161
|
+
write_str(buf, len);
|
|
162
|
+
if (fd != STDOUT_FILENO) close(fd);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
size_t count = std::min(total, kMaxEntries);
|
|
166
|
+
size_t start = (total >= kMaxEntries) ? (total % kMaxEntries) : 0;
|
|
167
|
+
for (size_t i = 0; i < count; i++) {
|
|
168
|
+
size_t idx = (start + i) % kMaxEntries;
|
|
169
|
+
// Copy entry fields to locals to avoid passing shared memory through
|
|
170
|
+
// TSAN-intercepted snprintf. See comment in Record() for why we use a
|
|
171
|
+
// volatile pointer to prevent loop-to-memcpy optimization.
|
|
172
|
+
const Entry& e = entries_[idx];
|
|
173
|
+
uint64_t local_ts = e.timestamp_us;
|
|
174
|
+
uint64_t local_tid = e.thread_id;
|
|
175
|
+
char local_ctx[kMaxMessageLen];
|
|
176
|
+
const volatile char* ctx_src = e.context;
|
|
177
|
+
for (size_t j = 0; j < kMaxMessageLen; j++) {
|
|
178
|
+
local_ctx[j] = ctx_src[j];
|
|
179
|
+
}
|
|
180
|
+
if (local_ts == 0) continue;
|
|
181
|
+
uint64_t secs = local_ts / 1000000;
|
|
182
|
+
uint64_t usecs = local_ts % 1000000;
|
|
183
|
+
len = snprintf(buf, sizeof(buf), "[%llu.%06llu] thread=%llu: %s\n",
|
|
184
|
+
(unsigned long long)secs, (unsigned long long)usecs,
|
|
185
|
+
(unsigned long long)local_tid, local_ctx);
|
|
186
|
+
write_str(buf, len);
|
|
187
|
+
}
|
|
188
|
+
len = snprintf(buf, sizeof(buf),
|
|
189
|
+
"=== End of injected error log (%zu entries) ===\n", count);
|
|
190
|
+
write_str(buf, len);
|
|
191
|
+
if (fd != STDOUT_FILENO) close(fd);
|
|
192
|
+
#else
|
|
193
|
+
// On Windows, crash callbacks via signal handlers are not used,
|
|
194
|
+
// so PrintAll() is a no-op.
|
|
195
|
+
#endif
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private:
|
|
199
|
+
std::atomic<size_t> head_;
|
|
200
|
+
Entry entries_[kMaxEntries];
|
|
201
|
+
char log_path_[PATH_MAX];
|
|
202
|
+
};
|
|
203
|
+
|
|
32
204
|
class TestFSWritableFile;
|
|
33
205
|
class FaultInjectionTestFS;
|
|
34
206
|
|
|
207
|
+
// Deferred detail builders for injected error logging.
|
|
208
|
+
// These return lambdas that are only evaluated when a fault is actually
|
|
209
|
+
// injected, avoiding string formatting overhead on the common (no-fault) path.
|
|
210
|
+
// Captured references are safe because the lambda is called synchronously
|
|
211
|
+
// within MaybeInjectThreadLocalError before the caller returns.
|
|
212
|
+
namespace fault_injection_detail {
|
|
213
|
+
|
|
214
|
+
inline std::function<std::string()> NoDetail() { return {}; }
|
|
215
|
+
|
|
216
|
+
inline std::function<std::string()> TwoFiles(const std::string& /*f1*/,
|
|
217
|
+
const std::string& f2) {
|
|
218
|
+
return [&f2]() -> std::string {
|
|
219
|
+
char buf[160];
|
|
220
|
+
snprintf(buf, sizeof(buf), "\"%.128s\"", f2.c_str());
|
|
221
|
+
return std::string(buf);
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
inline std::function<std::string()> SizeAndHead(const Slice& data) {
|
|
226
|
+
return [data]() -> std::string {
|
|
227
|
+
char buf[128];
|
|
228
|
+
snprintf(buf, sizeof(buf), "size=%zu, head=[%s]", data.size(),
|
|
229
|
+
InjectedErrorLog::HexHead(data.data(), data.size()).c_str());
|
|
230
|
+
return std::string(buf);
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
inline std::function<std::string()> OffsetSizeAndHead(uint64_t offset,
|
|
235
|
+
const Slice& data) {
|
|
236
|
+
return [offset, data]() -> std::string {
|
|
237
|
+
char buf[160];
|
|
238
|
+
snprintf(buf, sizeof(buf), "offset=%llu, size=%zu, head=[%s]",
|
|
239
|
+
(unsigned long long)offset, data.size(),
|
|
240
|
+
InjectedErrorLog::HexHead(data.data(), data.size()).c_str());
|
|
241
|
+
return std::string(buf);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
inline std::function<std::string()> OffsetAndSize(uint64_t offset, size_t n) {
|
|
246
|
+
return [offset, n]() -> std::string {
|
|
247
|
+
char buf[64];
|
|
248
|
+
snprintf(buf, sizeof(buf), "offset=%llu, size=%zu",
|
|
249
|
+
(unsigned long long)offset, n);
|
|
250
|
+
return std::string(buf);
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
inline std::function<std::string()> Size(uint64_t size) {
|
|
255
|
+
return [size]() -> std::string {
|
|
256
|
+
char buf[32];
|
|
257
|
+
snprintf(buf, sizeof(buf), "size=%llu", (unsigned long long)size);
|
|
258
|
+
return std::string(buf);
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
inline std::function<std::string()> Count(size_t count) {
|
|
263
|
+
return [count]() -> std::string {
|
|
264
|
+
char buf[32];
|
|
265
|
+
snprintf(buf, sizeof(buf), "num_reqs=%zu", count);
|
|
266
|
+
return std::string(buf);
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
inline std::function<std::string()> ReqOffsetAndSize(size_t req_idx,
|
|
271
|
+
uint64_t offset,
|
|
272
|
+
size_t n) {
|
|
273
|
+
return [req_idx, offset, n]() -> std::string {
|
|
274
|
+
char buf[96];
|
|
275
|
+
snprintf(buf, sizeof(buf), "req[%zu], offset=%llu, size=%zu", req_idx,
|
|
276
|
+
(unsigned long long)offset, n);
|
|
277
|
+
return std::string(buf);
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
} // namespace fault_injection_detail
|
|
282
|
+
|
|
35
283
|
enum class FaultInjectionIOType {
|
|
36
284
|
kRead = 0,
|
|
37
285
|
kWrite,
|
|
@@ -161,6 +409,7 @@ class TestFSRandomAccessFile : public FSRandomAccessFile {
|
|
|
161
409
|
IOStatus GetFileSize(uint64_t* file_size) override;
|
|
162
410
|
|
|
163
411
|
private:
|
|
412
|
+
std::string fname_;
|
|
164
413
|
std::unique_ptr<FSRandomAccessFile> target_;
|
|
165
414
|
FaultInjectionTestFS* fs_;
|
|
166
415
|
const bool is_sst_;
|
|
@@ -332,7 +581,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
|
|
|
332
581
|
*disk_free = 0;
|
|
333
582
|
} else {
|
|
334
583
|
io_s = MaybeInjectThreadLocalError(FaultInjectionIOType::kMetadataRead,
|
|
335
|
-
options);
|
|
584
|
+
options, "GetFreeSpace", path);
|
|
336
585
|
if (io_s.ok()) {
|
|
337
586
|
io_s = target()->GetFreeSpace(path, options, disk_free, dbg);
|
|
338
587
|
}
|
|
@@ -545,7 +794,8 @@ class FaultInjectionTestFS : public FileSystemWrapper {
|
|
|
545
794
|
|
|
546
795
|
IOStatus MaybeInjectThreadLocalError(
|
|
547
796
|
FaultInjectionIOType type, const IOOptions& io_options,
|
|
548
|
-
const std::string& file_name
|
|
797
|
+
const char* op_name, const std::string& file_name,
|
|
798
|
+
std::function<std::string()> detail_fn = {}, ErrorOperation op = kUnknown,
|
|
549
799
|
Slice* slice = nullptr, bool direct_io = false, char* scratch = nullptr,
|
|
550
800
|
bool need_count_increase = false, bool* fault_injected = nullptr);
|
|
551
801
|
|
|
@@ -610,6 +860,22 @@ class FaultInjectionTestFS : public FileSystemWrapper {
|
|
|
610
860
|
void ReadUnsynced(const std::string& fname, uint64_t offset, size_t n,
|
|
611
861
|
Slice* result, char* scratch, int64_t* pos_at_last_sync);
|
|
612
862
|
|
|
863
|
+
// Access the injected error log for printing on crash or test failure.
|
|
864
|
+
InjectedErrorLog& GetInjectedErrorLog() { return injected_error_log_; }
|
|
865
|
+
const InjectedErrorLog& GetInjectedErrorLog() const {
|
|
866
|
+
return injected_error_log_;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// Print recently injected errors to stderr. Call this on test failure
|
|
870
|
+
// to see what errors were injected leading up to the failure.
|
|
871
|
+
void PrintRecentInjectedErrors() const { injected_error_log_.PrintAll(); }
|
|
872
|
+
|
|
873
|
+
// Set the file path where PrintAll() will write its output.
|
|
874
|
+
// Must be called before any signal handler invocation.
|
|
875
|
+
void SetInjectedErrorLogPath(const std::string& path) {
|
|
876
|
+
injected_error_log_.SetLogFilePath(path);
|
|
877
|
+
}
|
|
878
|
+
|
|
613
879
|
inline static const std::string kInjected = "injected";
|
|
614
880
|
|
|
615
881
|
private:
|
|
@@ -676,6 +942,7 @@ class FaultInjectionTestFS : public FileSystemWrapper {
|
|
|
676
942
|
bool fail_get_file_unique_id_ = false;
|
|
677
943
|
bool fail_random_access_get_file_size_sst_ = false;
|
|
678
944
|
bool fail_fs_get_file_size_sst_ = false;
|
|
945
|
+
InjectedErrorLog injected_error_log_;
|
|
679
946
|
|
|
680
947
|
// Inject an error. For a READ operation, a status of IOError(), a
|
|
681
948
|
// corruption in the contents of scratch, or truncation of slice
|
|
@@ -683,11 +950,11 @@ class FaultInjectionTestFS : public FileSystemWrapper {
|
|
|
683
950
|
// its always an IOError.
|
|
684
951
|
// fault_injected returns whether a fault is injected. It is needed
|
|
685
952
|
// because some fault is inected with IOStatus to be OK.
|
|
686
|
-
IOStatus MaybeInjectThreadLocalReadError(
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
953
|
+
IOStatus MaybeInjectThreadLocalReadError(
|
|
954
|
+
const IOOptions& io_options, const char* op_name,
|
|
955
|
+
const std::string& file_name, std::function<std::string()> detail_fn,
|
|
956
|
+
ErrorOperation op, Slice* slice, bool direct_io, char* scratch,
|
|
957
|
+
bool need_count_increase, bool* fault_injected);
|
|
691
958
|
|
|
692
959
|
bool ShouldExcludeFromWriteFaultInjection(const std::string& file_name) {
|
|
693
960
|
MutexLock l(&mutex_);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
|
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
|
+
#include "utilities/fault_injection_fs.h"
|
|
7
|
+
|
|
8
|
+
#include <atomic>
|
|
9
|
+
#include <thread>
|
|
10
|
+
#include <vector>
|
|
11
|
+
|
|
12
|
+
#include "test_util/testharness.h"
|
|
13
|
+
|
|
14
|
+
namespace ROCKSDB_NAMESPACE {
|
|
15
|
+
|
|
16
|
+
class InjectedErrorLogTest : public testing::Test {};
|
|
17
|
+
|
|
18
|
+
// Test basic Record and PrintAll functionality.
|
|
19
|
+
TEST_F(InjectedErrorLogTest, BasicRecordAndPrint) {
|
|
20
|
+
InjectedErrorLog log;
|
|
21
|
+
log.SetLogFilePath("/dev/null");
|
|
22
|
+
|
|
23
|
+
// Record some entries.
|
|
24
|
+
log.Record("op=Get key=0x%08x status=%s", 0x12345678, "OK");
|
|
25
|
+
log.Record("op=Put key=0x%08x value_size=%d", 0xABCDEF00, 100);
|
|
26
|
+
log.Record("op=Delete key=0x%08x", 0x00000001);
|
|
27
|
+
|
|
28
|
+
// PrintAll should not crash.
|
|
29
|
+
log.PrintAll();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Test that the circular buffer wraps correctly.
|
|
33
|
+
TEST_F(InjectedErrorLogTest, CircularBufferWrap) {
|
|
34
|
+
InjectedErrorLog log;
|
|
35
|
+
log.SetLogFilePath("/dev/null");
|
|
36
|
+
|
|
37
|
+
// Fill beyond kMaxEntries to trigger wraparound.
|
|
38
|
+
for (size_t i = 0; i < InjectedErrorLog::kMaxEntries + 100; i++) {
|
|
39
|
+
log.Record("entry=%zu", i);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// PrintAll should handle the wrapped buffer without crashing.
|
|
43
|
+
log.PrintAll();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Test concurrent Record() from multiple threads.
|
|
47
|
+
// Keep total records (kNumThreads * kRecordsPerThread) under kMaxEntries
|
|
48
|
+
// to avoid write-write races from buffer wraparound, which are benign but
|
|
49
|
+
// would trigger TSAN warnings.
|
|
50
|
+
TEST_F(InjectedErrorLogTest, ConcurrentRecord) {
|
|
51
|
+
InjectedErrorLog log;
|
|
52
|
+
constexpr int kNumThreads = 4;
|
|
53
|
+
constexpr int kRecordsPerThread = 200;
|
|
54
|
+
static_assert(kNumThreads * kRecordsPerThread <
|
|
55
|
+
static_cast<int>(InjectedErrorLog::kMaxEntries),
|
|
56
|
+
"total records must stay within buffer to avoid TSAN-visible "
|
|
57
|
+
"write-write races on overlapping slots");
|
|
58
|
+
|
|
59
|
+
std::vector<std::thread> threads;
|
|
60
|
+
threads.reserve(kNumThreads);
|
|
61
|
+
for (int t = 0; t < kNumThreads; t++) {
|
|
62
|
+
threads.emplace_back([&log, t]() {
|
|
63
|
+
for (int i = 0; i < kRecordsPerThread; i++) {
|
|
64
|
+
log.Record("thread=%d iter=%d op=Get key=0x%08x", t, i, i * 17);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
for (auto& t : threads) {
|
|
70
|
+
t.join();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// PrintAll after all threads are done -- no race.
|
|
74
|
+
log.SetLogFilePath("/dev/null");
|
|
75
|
+
log.PrintAll();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Test HexHead utility.
|
|
79
|
+
TEST_F(InjectedErrorLogTest, HexHead) {
|
|
80
|
+
const char data[] = "\x01\x02\xAB\xCD";
|
|
81
|
+
std::string result = InjectedErrorLog::HexHead(data, 4);
|
|
82
|
+
ASSERT_EQ(result, "01 02 ab cd");
|
|
83
|
+
|
|
84
|
+
result = InjectedErrorLog::HexHead(data, 4, 2);
|
|
85
|
+
ASSERT_EQ(result, "01 02 ...");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
89
|
+
|
|
90
|
+
int main(int argc, char** argv) {
|
|
91
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
92
|
+
::testing::InitGoogleTest(&argc, argv);
|
|
93
|
+
return RUN_ALL_TESTS();
|
|
94
|
+
}
|
|
@@ -24,7 +24,9 @@ class MemoryTest : public testing::Test {
|
|
|
24
24
|
|
|
25
25
|
std::string GetDBName(int id) { return kDbDir + "db_" + std::to_string(id); }
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
using DBVec = std::vector<std::unique_ptr<DB>>;
|
|
28
|
+
|
|
29
|
+
void UpdateUsagesHistory(const DBVec& dbs) {
|
|
28
30
|
std::map<MemoryUtil::UsageType, uint64_t> usage_by_type;
|
|
29
31
|
ASSERT_OK(GetApproximateMemoryUsageByType(dbs, &usage_by_type));
|
|
30
32
|
for (int i = 0; i < MemoryUtil::kNumUsageTypes; ++i) {
|
|
@@ -33,16 +35,17 @@ class MemoryTest : public testing::Test {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
|
|
36
|
-
void GetCachePointers(const
|
|
38
|
+
void GetCachePointers(const DBVec& dbs,
|
|
37
39
|
std::unordered_set<const Cache*>* cache_set) {
|
|
38
40
|
cache_set->clear();
|
|
39
41
|
|
|
40
|
-
for (auto
|
|
42
|
+
for (auto& db : dbs) {
|
|
41
43
|
assert(db);
|
|
42
44
|
|
|
43
45
|
// Cache from DBImpl
|
|
44
|
-
StackableDB* sdb = dynamic_cast<StackableDB*>(db);
|
|
45
|
-
DBImpl* db_impl =
|
|
46
|
+
StackableDB* sdb = dynamic_cast<StackableDB*>(db.get());
|
|
47
|
+
DBImpl* db_impl =
|
|
48
|
+
dynamic_cast<DBImpl*>(sdb ? sdb->GetBaseDB() : db.get());
|
|
46
49
|
if (db_impl != nullptr) {
|
|
47
50
|
cache_set->insert(db_impl->TEST_table_cache());
|
|
48
51
|
}
|
|
@@ -58,7 +61,7 @@ class MemoryTest : public testing::Test {
|
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
Status GetApproximateMemoryUsageByType(
|
|
61
|
-
const
|
|
64
|
+
const DBVec& dbs,
|
|
62
65
|
std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type) {
|
|
63
66
|
std::unordered_set<const Cache*> cache_set;
|
|
64
67
|
GetCachePointers(dbs, &cache_set);
|
|
@@ -73,7 +76,7 @@ class MemoryTest : public testing::Test {
|
|
|
73
76
|
};
|
|
74
77
|
|
|
75
78
|
TEST_F(MemoryTest, SharedBlockCacheTotal) {
|
|
76
|
-
std::vector<DB
|
|
79
|
+
std::vector<std::unique_ptr<DB>> dbs;
|
|
77
80
|
std::vector<uint64_t> usage_by_type;
|
|
78
81
|
const int kNumDBs = 10;
|
|
79
82
|
const int kKeySize = 100;
|
|
@@ -88,9 +91,7 @@ TEST_F(MemoryTest, SharedBlockCacheTotal) {
|
|
|
88
91
|
bbt_opts.block_cache = NewLRUCache(4096 * 1000 * 10);
|
|
89
92
|
for (int i = 0; i < kNumDBs; ++i) {
|
|
90
93
|
ASSERT_OK(DestroyDB(GetDBName(i), opt));
|
|
91
|
-
DB
|
|
92
|
-
ASSERT_OK(DB::Open(opt, GetDBName(i), &db));
|
|
93
|
-
dbs.push_back(db);
|
|
94
|
+
ASSERT_OK(DB::Open(opt, GetDBName(i), &dbs.emplace_back()));
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
std::vector<std::string> keys_by_db[kNumDBs];
|
|
@@ -119,13 +120,10 @@ TEST_F(MemoryTest, SharedBlockCacheTotal) {
|
|
|
119
120
|
ASSERT_EQ(usage_history_[MemoryUtil::kTableReadersTotal][i],
|
|
120
121
|
usage_history_[MemoryUtil::kTableReadersTotal][i - 1]);
|
|
121
122
|
}
|
|
122
|
-
for (int i = 0; i < kNumDBs; ++i) {
|
|
123
|
-
delete dbs[i];
|
|
124
|
-
}
|
|
125
123
|
}
|
|
126
124
|
|
|
127
125
|
TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
|
|
128
|
-
std::vector<DB
|
|
126
|
+
std::vector<std::unique_ptr<DB>> dbs;
|
|
129
127
|
std::vector<uint64_t> usage_by_type;
|
|
130
128
|
std::vector<std::vector<ColumnFamilyHandle*>> vec_handles;
|
|
131
129
|
const int kNumDBs = 10;
|
|
@@ -150,10 +148,9 @@ TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
|
|
|
150
148
|
for (int i = 0; i < kNumDBs; ++i) {
|
|
151
149
|
ASSERT_OK(DestroyDB(GetDBName(i), opt));
|
|
152
150
|
std::vector<ColumnFamilyHandle*> handles;
|
|
153
|
-
dbs.emplace_back();
|
|
154
151
|
vec_handles.emplace_back();
|
|
155
152
|
ASSERT_OK(DB::Open(DBOptions(opt), GetDBName(i), cf_descs,
|
|
156
|
-
&vec_handles.back(), &dbs.
|
|
153
|
+
&vec_handles.back(), &dbs.emplace_back()));
|
|
157
154
|
}
|
|
158
155
|
|
|
159
156
|
// Fill one memtable per Put to make memtable use more memory.
|
|
@@ -237,7 +234,6 @@ TEST_F(MemoryTest, MemTableAndTableReadersTotal) {
|
|
|
237
234
|
for (auto* handle : vec_handles[i]) {
|
|
238
235
|
delete handle;
|
|
239
236
|
}
|
|
240
|
-
delete dbs[i];
|
|
241
237
|
}
|
|
242
238
|
}
|
|
243
239
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -9,14 +9,15 @@
|
|
|
9
9
|
|
|
10
10
|
namespace ROCKSDB_NAMESPACE {
|
|
11
11
|
|
|
12
|
+
template <typename DBPtr>
|
|
12
13
|
Status MemoryUtil::GetApproximateMemoryUsageByType(
|
|
13
|
-
const std::vector<
|
|
14
|
+
const std::vector<DBPtr>& dbs,
|
|
14
15
|
const std::unordered_set<const Cache*> cache_set,
|
|
15
16
|
std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type) {
|
|
16
17
|
usage_by_type->clear();
|
|
17
18
|
|
|
18
19
|
// MemTable
|
|
19
|
-
for (auto
|
|
20
|
+
for (auto& db : dbs) {
|
|
20
21
|
uint64_t usage = 0;
|
|
21
22
|
if (db->GetAggregatedIntProperty(DB::Properties::kSizeAllMemTables,
|
|
22
23
|
&usage)) {
|
|
@@ -29,7 +30,7 @@ Status MemoryUtil::GetApproximateMemoryUsageByType(
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
// Table Readers
|
|
32
|
-
for (auto
|
|
33
|
+
for (auto& db : dbs) {
|
|
33
34
|
uint64_t usage = 0;
|
|
34
35
|
if (db->GetAggregatedIntProperty(DB::Properties::kEstimateTableReadersMem,
|
|
35
36
|
&usage)) {
|
|
@@ -46,4 +47,16 @@ Status MemoryUtil::GetApproximateMemoryUsageByType(
|
|
|
46
47
|
|
|
47
48
|
return Status::OK();
|
|
48
49
|
}
|
|
50
|
+
|
|
51
|
+
template Status MemoryUtil::GetApproximateMemoryUsageByType<DB*>(
|
|
52
|
+
const std::vector<DB*>& dbs,
|
|
53
|
+
const std::unordered_set<const Cache*> cache_set,
|
|
54
|
+
std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type);
|
|
55
|
+
|
|
56
|
+
template Status
|
|
57
|
+
MemoryUtil::GetApproximateMemoryUsageByType<std::unique_ptr<DB>>(
|
|
58
|
+
const std::vector<std::unique_ptr<DB>>& dbs,
|
|
59
|
+
const std::unordered_set<const Cache*> cache_set,
|
|
60
|
+
std::map<MemoryUtil::UsageType, uint64_t>* usage_by_type);
|
|
61
|
+
|
|
49
62
|
} // namespace ROCKSDB_NAMESPACE
|