@nxtedition/rocksdb 8.2.8 → 9.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/deps/rocksdb/rocksdb/CMakeLists.txt +7 -1
- package/deps/rocksdb/rocksdb/Makefile +22 -19
- package/deps/rocksdb/rocksdb/TARGETS +8 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +157 -61
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +43 -92
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +632 -455
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +244 -149
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +41 -13
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +11 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +216 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +279 -199
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +159 -8
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +28 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +3 -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 +18 -21
- 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/builder.cc +32 -7
- package/deps/rocksdb/rocksdb/db/c.cc +169 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +104 -6
- package/deps/rocksdb/rocksdb/db/column_family.cc +98 -47
- package/deps/rocksdb/rocksdb/db/column_family.h +25 -2
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +213 -2
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +93 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +33 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -6
- 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 +107 -43
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +25 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +13 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +24 -31
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +19 -19
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -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 +17 -3
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +15 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +666 -44
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +274 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -19
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +250 -116
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +51 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +354 -96
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +26 -13
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +61 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -87
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +7 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +39 -29
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +106 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +12 -3
- 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 +279 -166
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -21
- package/deps/rocksdb/rocksdb/db/db_test2.cc +81 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +40 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +13 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +233 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +143 -0
- 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/error_handler.cc +16 -0
- package/deps/rocksdb/rocksdb/db/error_handler.h +6 -3
- 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 +86 -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 +101 -11
- package/deps/rocksdb/rocksdb/db/flush_job.h +24 -1
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +88 -11
- 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 +4 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +52 -13
- package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +44 -10
- package/deps/rocksdb/rocksdb/db/memtable_list.h +32 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +90 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +21 -4
- package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/table_cache.cc +44 -35
- package/deps/rocksdb/rocksdb/db/table_cache.h +6 -6
- 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 +48 -6
- 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 +136 -41
- package/deps/rocksdb/rocksdb/db/version_set.h +28 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +25 -15
- package/deps/rocksdb/rocksdb/db/write_batch.cc +11 -0
- 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/db_stress_common.h +22 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +2 -0
- 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 +32 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -120
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +9 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +13 -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 +15 -27
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +264 -69
- package/deps/rocksdb/rocksdb/env/env.cc +1 -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 +78 -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 +52 -43
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +34 -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 +724 -79
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +64 -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 +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +153 -88
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +70 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +50 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +16 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +55 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +32 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +90 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +85 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +13 -1
- 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 +21 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +33 -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/write_batch.h +3 -0
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +16 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +10 -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 +2 -1
- package/deps/rocksdb/rocksdb/options/db_options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -3
- package/deps/rocksdb/rocksdb/options/options_test.cc +8 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +27 -12
- package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- 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 +115 -42
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +60 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +62 -44
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +36 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -15
- 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_prefetcher.cc +50 -21
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +11 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +195 -55
- 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 +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +27 -12
- 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 +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +9 -6
- 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_fetcher.cc +11 -11
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -0
- 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/merging_iterator.cc +10 -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 +12 -3
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +26 -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_test.cc +52 -22
- 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/db_bench_tool.cc +65 -26
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +0 -1
- 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/cast_util.h +14 -0
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +29 -7
- package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +110 -32
- package/deps/rocksdb/rocksdb/util/core_local.h +2 -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/single_thread_executor.h +1 -0
- package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
- package/deps/rocksdb/rocksdb/util/thread_operation.h +8 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +343 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +173 -1
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +447 -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/utilities/backup/backup_engine_test.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +69 -25
- 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_fs.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- 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/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 +231 -33
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +0 -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 +40 -23
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +13 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +41 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +71 -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 +39 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +14 -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 +2 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -29,35 +29,8 @@
|
|
|
29
29
|
namespace ROCKSDB_NAMESPACE {
|
|
30
30
|
|
|
31
31
|
Status DBImpl::FlushForGetLiveFiles() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// flush all dirty data to disk.
|
|
35
|
-
Status status;
|
|
36
|
-
if (immutable_db_options_.atomic_flush) {
|
|
37
|
-
mutex_.Unlock();
|
|
38
|
-
status = AtomicFlushMemTables(FlushOptions(), FlushReason::kGetLiveFiles);
|
|
39
|
-
if (status.IsColumnFamilyDropped()) {
|
|
40
|
-
status = Status::OK();
|
|
41
|
-
}
|
|
42
|
-
mutex_.Lock();
|
|
43
|
-
} else {
|
|
44
|
-
for (auto cfd : versions_->GetRefedColumnFamilySet()) {
|
|
45
|
-
if (cfd->IsDropped()) {
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
mutex_.Unlock();
|
|
49
|
-
status = FlushMemTable(cfd, FlushOptions(), FlushReason::kGetLiveFiles);
|
|
50
|
-
TEST_SYNC_POINT("DBImpl::GetLiveFiles:1");
|
|
51
|
-
TEST_SYNC_POINT("DBImpl::GetLiveFiles:2");
|
|
52
|
-
mutex_.Lock();
|
|
53
|
-
if (!status.ok() && !status.IsColumnFamilyDropped()) {
|
|
54
|
-
break;
|
|
55
|
-
} else if (status.IsColumnFamilyDropped()) {
|
|
56
|
-
status = Status::OK();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return status;
|
|
32
|
+
return DBImpl::FlushAllColumnFamilies(FlushOptions(),
|
|
33
|
+
FlushReason::kGetLiveFiles);
|
|
61
34
|
}
|
|
62
35
|
|
|
63
36
|
Status DBImpl::GetLiveFiles(std::vector<std::string>& ret,
|
|
@@ -222,7 +222,7 @@ TEST_F(DBFlushTest, CloseDBWhenFlushInLowPri) {
|
|
|
222
222
|
sleeping_task_low.WaitUntilDone();
|
|
223
223
|
ASSERT_EQ(0, num_flushes);
|
|
224
224
|
|
|
225
|
-
TryReopenWithColumnFamilies({"default", "cf1", "cf2"}, options);
|
|
225
|
+
ASSERT_OK(TryReopenWithColumnFamilies({"default", "cf1", "cf2"}, options));
|
|
226
226
|
ASSERT_OK(Put(0, "key3", DummyString(8192)));
|
|
227
227
|
ASSERT_OK(Flush(0));
|
|
228
228
|
ASSERT_EQ(1, num_flushes);
|
|
@@ -3193,6 +3193,279 @@ INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
|
|
|
3193
3193
|
|
|
3194
3194
|
INSTANTIATE_TEST_CASE_P(DBAtomicFlushTest, DBAtomicFlushTest, testing::Bool());
|
|
3195
3195
|
|
|
3196
|
+
TEST_F(DBFlushTest, NonAtomicFlushRollbackPendingFlushes) {
|
|
3197
|
+
// Fix a bug in when atomic_flush=false.
|
|
3198
|
+
// The bug can happen as follows:
|
|
3199
|
+
// Start Flush0 for memtable M0 to SST0
|
|
3200
|
+
// Start Flush1 for memtable M1 to SST1
|
|
3201
|
+
// Flush1 returns OK, but don't install to MANIFEST and let whoever flushes
|
|
3202
|
+
// M0 to take care of it
|
|
3203
|
+
// Flush0 finishes with a retryable IOError
|
|
3204
|
+
// - It rollbacks M0, (incorrectly) not M1
|
|
3205
|
+
// - Deletes SST1 and SST2
|
|
3206
|
+
//
|
|
3207
|
+
// Auto-recovery will start Flush2 for M0, it does not pick up M1 since it
|
|
3208
|
+
// thinks that M1 is flushed
|
|
3209
|
+
// Flush2 writes SST3 and finishes OK, tries to install SST3 and SST2
|
|
3210
|
+
// Error opening SST2 since it's already deleted
|
|
3211
|
+
//
|
|
3212
|
+
// The fix is to let Flush0 also rollback M1.
|
|
3213
|
+
Options opts = CurrentOptions();
|
|
3214
|
+
opts.atomic_flush = false;
|
|
3215
|
+
opts.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
3216
|
+
opts.max_write_buffer_number = 64;
|
|
3217
|
+
opts.max_background_flushes = 4;
|
|
3218
|
+
env_->SetBackgroundThreads(4, Env::HIGH);
|
|
3219
|
+
DestroyAndReopen(opts);
|
|
3220
|
+
std::atomic_int flush_count = 0;
|
|
3221
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3222
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3223
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3224
|
+
"FlushJob::WriteLevel0Table:s", [&](void* s_ptr) {
|
|
3225
|
+
int c = flush_count.fetch_add(1);
|
|
3226
|
+
if (c == 0) {
|
|
3227
|
+
Status* s = (Status*)(s_ptr);
|
|
3228
|
+
IOStatus io_error = IOStatus::IOError("injected foobar");
|
|
3229
|
+
io_error.SetRetryable(true);
|
|
3230
|
+
*s = io_error;
|
|
3231
|
+
TEST_SYNC_POINT("Let mem1 flush start");
|
|
3232
|
+
TEST_SYNC_POINT("Wait for mem1 flush to finish");
|
|
3233
|
+
}
|
|
3234
|
+
});
|
|
3235
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
3236
|
+
{{"Let mem1 flush start", "Mem1 flush starts"},
|
|
3237
|
+
{"DBImpl::BGWorkFlush:done", "Wait for mem1 flush to finish"},
|
|
3238
|
+
{"RecoverFromRetryableBGIOError:RecoverSuccess",
|
|
3239
|
+
"Wait for error recover"}});
|
|
3240
|
+
// Need first flush to wait for the second flush to finish
|
|
3241
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3242
|
+
ASSERT_OK(Put(Key(1), "val1"));
|
|
3243
|
+
// trigger bg flush mem0
|
|
3244
|
+
ASSERT_OK(Put(Key(2), "val2"));
|
|
3245
|
+
TEST_SYNC_POINT("Mem1 flush starts");
|
|
3246
|
+
// trigger bg flush mem1
|
|
3247
|
+
ASSERT_OK(Put(Key(3), "val3"));
|
|
3248
|
+
|
|
3249
|
+
TEST_SYNC_POINT("Wait for error recover");
|
|
3250
|
+
ASSERT_EQ(1, NumTableFilesAtLevel(0));
|
|
3251
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3252
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3253
|
+
}
|
|
3254
|
+
|
|
3255
|
+
TEST_F(DBFlushTest, AbortNonAtomicFlushWhenBGError) {
|
|
3256
|
+
// Fix a bug in when atomic_flush=false.
|
|
3257
|
+
// The bug can happen as follows:
|
|
3258
|
+
// Start Flush0 for memtable M0 to SST0
|
|
3259
|
+
// Start Flush1 for memtable M1 to SST1
|
|
3260
|
+
// Flush1 returns OK, but doesn't install output MANIFEST and let whoever
|
|
3261
|
+
// flushes M0 to take care of it
|
|
3262
|
+
// Start Flush2 for memtable M2 to SST2
|
|
3263
|
+
// Flush0 finishes with a retryable IOError
|
|
3264
|
+
// - It rollbacks M0 AND M1
|
|
3265
|
+
// - Deletes SST1 and SST2
|
|
3266
|
+
// Flush2 finishes, does not rollback M2,
|
|
3267
|
+
// - releases the pending file number that keeps SST2 alive
|
|
3268
|
+
// - deletes SST2
|
|
3269
|
+
//
|
|
3270
|
+
// Then auto-recovery starts, error opening SST2 when try to install
|
|
3271
|
+
// flush result
|
|
3272
|
+
//
|
|
3273
|
+
// The fix is to let Flush2 rollback M2 if it finds that
|
|
3274
|
+
// there is a background error.
|
|
3275
|
+
Options opts = CurrentOptions();
|
|
3276
|
+
opts.atomic_flush = false;
|
|
3277
|
+
opts.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
3278
|
+
opts.max_write_buffer_number = 64;
|
|
3279
|
+
opts.max_background_flushes = 4;
|
|
3280
|
+
env_->SetBackgroundThreads(4, Env::HIGH);
|
|
3281
|
+
DestroyAndReopen(opts);
|
|
3282
|
+
std::atomic_int flush_count = 0;
|
|
3283
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3284
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3285
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3286
|
+
"FlushJob::WriteLevel0Table:s", [&](void* s_ptr) {
|
|
3287
|
+
int c = flush_count.fetch_add(1);
|
|
3288
|
+
if (c == 0) {
|
|
3289
|
+
Status* s = (Status*)(s_ptr);
|
|
3290
|
+
IOStatus io_error = IOStatus::IOError("injected foobar");
|
|
3291
|
+
io_error.SetRetryable(true);
|
|
3292
|
+
*s = io_error;
|
|
3293
|
+
TEST_SYNC_POINT("Let mem1 flush start");
|
|
3294
|
+
TEST_SYNC_POINT("Wait for mem1 flush to finish");
|
|
3295
|
+
|
|
3296
|
+
TEST_SYNC_POINT("Let mem2 flush start");
|
|
3297
|
+
TEST_SYNC_POINT("Wait for mem2 to start writing table");
|
|
3298
|
+
}
|
|
3299
|
+
});
|
|
3300
|
+
|
|
3301
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3302
|
+
"FlushJob::WriteLevel0Table", [&](void* mems) {
|
|
3303
|
+
autovector<MemTable*>* mems_ptr = (autovector<MemTable*>*)mems;
|
|
3304
|
+
if ((*mems_ptr)[0]->GetID() == 3) {
|
|
3305
|
+
TEST_SYNC_POINT("Mem2 flush starts writing table");
|
|
3306
|
+
TEST_SYNC_POINT("Mem2 flush waits until rollback");
|
|
3307
|
+
}
|
|
3308
|
+
});
|
|
3309
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
3310
|
+
{{"Let mem1 flush start", "Mem1 flush starts"},
|
|
3311
|
+
{"DBImpl::BGWorkFlush:done", "Wait for mem1 flush to finish"},
|
|
3312
|
+
{"Let mem2 flush start", "Mem2 flush starts"},
|
|
3313
|
+
{"Mem2 flush starts writing table",
|
|
3314
|
+
"Wait for mem2 to start writing table"},
|
|
3315
|
+
{"RollbackMemtableFlush", "Mem2 flush waits until rollback"},
|
|
3316
|
+
{"RecoverFromRetryableBGIOError:RecoverSuccess",
|
|
3317
|
+
"Wait for error recover"}});
|
|
3318
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3319
|
+
|
|
3320
|
+
ASSERT_OK(Put(Key(1), "val1"));
|
|
3321
|
+
// trigger bg flush mem0
|
|
3322
|
+
ASSERT_OK(Put(Key(2), "val2"));
|
|
3323
|
+
TEST_SYNC_POINT("Mem1 flush starts");
|
|
3324
|
+
// trigger bg flush mem1
|
|
3325
|
+
ASSERT_OK(Put(Key(3), "val3"));
|
|
3326
|
+
|
|
3327
|
+
TEST_SYNC_POINT("Mem2 flush starts");
|
|
3328
|
+
ASSERT_OK(Put(Key(4), "val4"));
|
|
3329
|
+
|
|
3330
|
+
TEST_SYNC_POINT("Wait for error recover");
|
|
3331
|
+
// Recovery flush writes 3 memtables together into 1 file.
|
|
3332
|
+
ASSERT_EQ(1, NumTableFilesAtLevel(0));
|
|
3333
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3334
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3335
|
+
}
|
|
3336
|
+
|
|
3337
|
+
TEST_F(DBFlushTest, NonAtomicNormalFlushAbortWhenBGError) {
|
|
3338
|
+
Options opts = CurrentOptions();
|
|
3339
|
+
opts.atomic_flush = false;
|
|
3340
|
+
opts.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
3341
|
+
opts.max_write_buffer_number = 64;
|
|
3342
|
+
opts.max_background_flushes = 1;
|
|
3343
|
+
env_->SetBackgroundThreads(2, Env::HIGH);
|
|
3344
|
+
DestroyAndReopen(opts);
|
|
3345
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3346
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3347
|
+
std::atomic_int flush_write_table_count = 0;
|
|
3348
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3349
|
+
"FlushJob::WriteLevel0Table:s", [&](void* s_ptr) {
|
|
3350
|
+
int c = flush_write_table_count.fetch_add(1);
|
|
3351
|
+
if (c == 0) {
|
|
3352
|
+
Status* s = (Status*)(s_ptr);
|
|
3353
|
+
IOStatus io_error = IOStatus::IOError("injected foobar");
|
|
3354
|
+
io_error.SetRetryable(true);
|
|
3355
|
+
*s = io_error;
|
|
3356
|
+
}
|
|
3357
|
+
});
|
|
3358
|
+
|
|
3359
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3360
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
3361
|
+
{{"Let error recovery start",
|
|
3362
|
+
"RecoverFromRetryableBGIOError:BeforeStart"},
|
|
3363
|
+
{"RecoverFromRetryableBGIOError:RecoverSuccess",
|
|
3364
|
+
"Wait for error recover"}});
|
|
3365
|
+
|
|
3366
|
+
ASSERT_OK(Put(Key(1), "val1"));
|
|
3367
|
+
// trigger bg flush0 for mem0
|
|
3368
|
+
ASSERT_OK(Put(Key(2), "val2"));
|
|
3369
|
+
// Not checking status since this wait can finish before flush starts.
|
|
3370
|
+
dbfull()->TEST_WaitForFlushMemTable().PermitUncheckedError();
|
|
3371
|
+
|
|
3372
|
+
// trigger bg flush1 for mem1, should see bg error and abort
|
|
3373
|
+
// before picking a memtable to flush
|
|
3374
|
+
ASSERT_OK(Put(Key(3), "val3"));
|
|
3375
|
+
ASSERT_NOK(dbfull()->TEST_WaitForFlushMemTable());
|
|
3376
|
+
ASSERT_EQ(0, NumTableFilesAtLevel(0));
|
|
3377
|
+
|
|
3378
|
+
TEST_SYNC_POINT("Let error recovery start");
|
|
3379
|
+
TEST_SYNC_POINT("Wait for error recover");
|
|
3380
|
+
// Recovery flush writes 2 memtables together into 1 file.
|
|
3381
|
+
ASSERT_EQ(1, NumTableFilesAtLevel(0));
|
|
3382
|
+
// 1 for flush 0 and 1 for recovery flush
|
|
3383
|
+
ASSERT_EQ(2, flush_write_table_count);
|
|
3384
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3385
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3386
|
+
}
|
|
3387
|
+
|
|
3388
|
+
TEST_F(DBFlushTest, DBStuckAfterAtomicFlushError) {
|
|
3389
|
+
// Test for a bug with atomic flush where DB can become stuck
|
|
3390
|
+
// after a flush error. A repro timeline:
|
|
3391
|
+
//
|
|
3392
|
+
// Start Flush0 for mem0
|
|
3393
|
+
// Start Flush1 for mem1
|
|
3394
|
+
// Now Flush1 will wait for Flush0 to install mem0
|
|
3395
|
+
// Flush0 finishes with retryable IOError, rollbacks mem0
|
|
3396
|
+
// Resume starts and waits for background job to finish, i.e., Flush1
|
|
3397
|
+
// Fill memtable again, trigger Flush2 for mem0
|
|
3398
|
+
// Flush2 will get error status, and not rollback mem0, see code in
|
|
3399
|
+
// https://github.com/facebook/rocksdb/blob/b927ba5936216861c2c35ab68f50ba4a78e65747/db/db_impl/db_impl_compaction_flush.cc#L725
|
|
3400
|
+
//
|
|
3401
|
+
// DB is stuck since mem0 can never be picked now
|
|
3402
|
+
//
|
|
3403
|
+
// The fix is to rollback mem0 in Flush2, and let Flush1 also abort upon
|
|
3404
|
+
// background error besides waiting for older memtables to be installed.
|
|
3405
|
+
// The recovery flush in this case should pick up all memtables
|
|
3406
|
+
// and write them to a single L0 file.
|
|
3407
|
+
Options opts = CurrentOptions();
|
|
3408
|
+
opts.atomic_flush = true;
|
|
3409
|
+
opts.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
3410
|
+
opts.max_write_buffer_number = 64;
|
|
3411
|
+
opts.max_background_flushes = 4;
|
|
3412
|
+
env_->SetBackgroundThreads(4, Env::HIGH);
|
|
3413
|
+
DestroyAndReopen(opts);
|
|
3414
|
+
|
|
3415
|
+
std::atomic_int flush_count = 0;
|
|
3416
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3417
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3418
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3419
|
+
"FlushJob::WriteLevel0Table:s", [&](void* s_ptr) {
|
|
3420
|
+
int c = flush_count.fetch_add(1);
|
|
3421
|
+
if (c == 0) {
|
|
3422
|
+
Status* s = (Status*)(s_ptr);
|
|
3423
|
+
IOStatus io_error = IOStatus::IOError("injected foobar");
|
|
3424
|
+
io_error.SetRetryable(true);
|
|
3425
|
+
*s = io_error;
|
|
3426
|
+
TEST_SYNC_POINT("Let flush for mem1 start");
|
|
3427
|
+
// Wait for Flush1 to start waiting to install flush result
|
|
3428
|
+
TEST_SYNC_POINT("Wait for flush for mem1");
|
|
3429
|
+
}
|
|
3430
|
+
});
|
|
3431
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
3432
|
+
{{"Let flush for mem1 start", "Flush for mem1"},
|
|
3433
|
+
{"DBImpl::AtomicFlushMemTablesToOutputFiles:WaitCV",
|
|
3434
|
+
"Wait for flush for mem1"},
|
|
3435
|
+
{"RecoverFromRetryableBGIOError:BeforeStart",
|
|
3436
|
+
"Wait for resume to start"},
|
|
3437
|
+
{"Recovery should continue here",
|
|
3438
|
+
"RecoverFromRetryableBGIOError:BeforeStart2"},
|
|
3439
|
+
{"RecoverFromRetryableBGIOError:RecoverSuccess",
|
|
3440
|
+
"Wait for error recover"}});
|
|
3441
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3442
|
+
ASSERT_OK(Put(Key(1), "val1"));
|
|
3443
|
+
// trigger Flush0 for mem0
|
|
3444
|
+
ASSERT_OK(Put(Key(2), "val2"));
|
|
3445
|
+
|
|
3446
|
+
// trigger Flush1 for mem1
|
|
3447
|
+
TEST_SYNC_POINT("Flush for mem1");
|
|
3448
|
+
ASSERT_OK(Put(Key(3), "val3"));
|
|
3449
|
+
|
|
3450
|
+
// Wait until resume started to schedule another flush
|
|
3451
|
+
TEST_SYNC_POINT("Wait for resume to start");
|
|
3452
|
+
// This flush should not be scheduled due to bg error
|
|
3453
|
+
ASSERT_OK(Put(Key(4), "val4"));
|
|
3454
|
+
|
|
3455
|
+
// TEST_WaitForBackgroundWork() returns background error
|
|
3456
|
+
// after all background work is done.
|
|
3457
|
+
ASSERT_NOK(dbfull()->TEST_WaitForBackgroundWork());
|
|
3458
|
+
// Flush should abort and not writing any table
|
|
3459
|
+
ASSERT_EQ(0, NumTableFilesAtLevel(0));
|
|
3460
|
+
|
|
3461
|
+
// Wait until this flush is done.
|
|
3462
|
+
TEST_SYNC_POINT("Recovery should continue here");
|
|
3463
|
+
TEST_SYNC_POINT("Wait for error recover");
|
|
3464
|
+
// error recovery can schedule new flushes, but should not
|
|
3465
|
+
// encounter error
|
|
3466
|
+
ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
|
|
3467
|
+
ASSERT_EQ(1, NumTableFilesAtLevel(0));
|
|
3468
|
+
}
|
|
3196
3469
|
} // namespace ROCKSDB_NAMESPACE
|
|
3197
3470
|
|
|
3198
3471
|
int main(int argc, char** argv) {
|
|
@@ -43,18 +43,25 @@ Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
|
|
|
43
43
|
/*timestamp*/ nullptr);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
Status CompactedDBImpl::Get(const ReadOptions&
|
|
47
|
-
const Slice& key,
|
|
48
|
-
std::string* timestamp) {
|
|
49
|
-
if (
|
|
46
|
+
Status CompactedDBImpl::Get(const ReadOptions& _read_options,
|
|
47
|
+
ColumnFamilyHandle*, const Slice& key,
|
|
48
|
+
PinnableSlice* value, std::string* timestamp) {
|
|
49
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
50
|
+
_read_options.io_activity != Env::IOActivity::kGet) {
|
|
50
51
|
return Status::InvalidArgument(
|
|
51
|
-
"
|
|
52
|
-
"`Env::IOActivity::kUnknown`");
|
|
52
|
+
"Can only call Get with `ReadOptions::io_activity` is "
|
|
53
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kGet`");
|
|
54
|
+
}
|
|
55
|
+
ReadOptions read_options(_read_options);
|
|
56
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
57
|
+
read_options.io_activity = Env::IOActivity::kGet;
|
|
53
58
|
}
|
|
59
|
+
|
|
54
60
|
assert(user_comparator_);
|
|
55
|
-
if (
|
|
56
|
-
const Status s =
|
|
57
|
-
DefaultColumnFamily(), *(
|
|
61
|
+
if (read_options.timestamp) {
|
|
62
|
+
const Status s =
|
|
63
|
+
FailIfTsMismatchCf(DefaultColumnFamily(), *(read_options.timestamp),
|
|
64
|
+
/*ts_for_read=*/true);
|
|
58
65
|
if (!s.ok()) {
|
|
59
66
|
return s;
|
|
60
67
|
}
|
|
@@ -74,7 +81,7 @@ Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
|
|
|
74
81
|
GetWithTimestampReadCallback read_cb(kMaxSequenceNumber);
|
|
75
82
|
std::string* ts =
|
|
76
83
|
user_comparator_->timestamp_size() > 0 ? timestamp : nullptr;
|
|
77
|
-
LookupKey lkey(key, kMaxSequenceNumber,
|
|
84
|
+
LookupKey lkey(key, kMaxSequenceNumber, read_options.timestamp);
|
|
78
85
|
GetContext get_context(user_comparator_, nullptr, nullptr, nullptr,
|
|
79
86
|
GetContext::kNotFound, lkey.user_key(), value,
|
|
80
87
|
/*columns=*/nullptr, ts, nullptr, nullptr, true,
|
|
@@ -88,8 +95,8 @@ Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
|
|
|
88
95
|
/*b_has_ts=*/false) < 0) {
|
|
89
96
|
return Status::NotFound();
|
|
90
97
|
}
|
|
91
|
-
Status s = f.fd.table_reader->Get(
|
|
92
|
-
nullptr);
|
|
98
|
+
Status s = f.fd.table_reader->Get(read_options, lkey.internal_key(),
|
|
99
|
+
&get_context, nullptr);
|
|
93
100
|
if (!s.ok() && !s.IsNotFound()) {
|
|
94
101
|
return s;
|
|
95
102
|
}
|
|
@@ -106,15 +113,28 @@ std::vector<Status> CompactedDBImpl::MultiGet(
|
|
|
106
113
|
}
|
|
107
114
|
|
|
108
115
|
std::vector<Status> CompactedDBImpl::MultiGet(
|
|
109
|
-
const ReadOptions&
|
|
116
|
+
const ReadOptions& _read_options, const std::vector<ColumnFamilyHandle*>&,
|
|
110
117
|
const std::vector<Slice>& keys, std::vector<std::string>* values,
|
|
111
118
|
std::vector<std::string>* timestamps) {
|
|
112
119
|
assert(user_comparator_);
|
|
113
120
|
size_t num_keys = keys.size();
|
|
121
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
122
|
+
_read_options.io_activity != Env::IOActivity::kMultiGet) {
|
|
123
|
+
Status s = Status::InvalidArgument(
|
|
124
|
+
"Can only call MultiGet with `ReadOptions::io_activity` is "
|
|
125
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kMultiGet`");
|
|
126
|
+
return std::vector<Status>(num_keys, s);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
ReadOptions read_options(_read_options);
|
|
130
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
131
|
+
read_options.io_activity = Env::IOActivity::kMultiGet;
|
|
132
|
+
}
|
|
114
133
|
|
|
115
|
-
if (
|
|
116
|
-
Status s =
|
|
117
|
-
|
|
134
|
+
if (read_options.timestamp) {
|
|
135
|
+
Status s =
|
|
136
|
+
FailIfTsMismatchCf(DefaultColumnFamily(), *(read_options.timestamp),
|
|
137
|
+
/*ts_for_read=*/true);
|
|
118
138
|
if (!s.ok()) {
|
|
119
139
|
return std::vector<Status>(num_keys, s);
|
|
120
140
|
}
|
|
@@ -136,7 +156,7 @@ std::vector<Status> CompactedDBImpl::MultiGet(
|
|
|
136
156
|
GetWithTimestampReadCallback read_cb(kMaxSequenceNumber);
|
|
137
157
|
autovector<TableReader*, 16> reader_list;
|
|
138
158
|
for (const auto& key : keys) {
|
|
139
|
-
LookupKey lkey(key, kMaxSequenceNumber,
|
|
159
|
+
LookupKey lkey(key, kMaxSequenceNumber, read_options.timestamp);
|
|
140
160
|
const FdWithKeyRange& f = files_.files[FindFile(lkey.user_key())];
|
|
141
161
|
if (user_comparator_->CompareWithoutTimestamp(
|
|
142
162
|
key, /*a_has_ts=*/false,
|
|
@@ -159,14 +179,15 @@ std::vector<Status> CompactedDBImpl::MultiGet(
|
|
|
159
179
|
if (r != nullptr) {
|
|
160
180
|
PinnableSlice pinnable_val;
|
|
161
181
|
std::string& value = (*values)[idx];
|
|
162
|
-
LookupKey lkey(keys[idx], kMaxSequenceNumber,
|
|
182
|
+
LookupKey lkey(keys[idx], kMaxSequenceNumber, read_options.timestamp);
|
|
163
183
|
std::string* timestamp = timestamps ? &(*timestamps)[idx] : nullptr;
|
|
164
184
|
GetContext get_context(
|
|
165
185
|
user_comparator_, nullptr, nullptr, nullptr, GetContext::kNotFound,
|
|
166
186
|
lkey.user_key(), &pinnable_val, /*columns=*/nullptr,
|
|
167
187
|
user_comparator_->timestamp_size() > 0 ? timestamp : nullptr, nullptr,
|
|
168
188
|
nullptr, true, nullptr, nullptr, nullptr, nullptr, &read_cb);
|
|
169
|
-
Status s =
|
|
189
|
+
Status s =
|
|
190
|
+
r->Get(read_options, lkey.internal_key(), &get_context, nullptr);
|
|
170
191
|
assert(static_cast<size_t>(idx) < statuses.size());
|
|
171
192
|
if (!s.ok() && !s.IsNotFound()) {
|
|
172
193
|
statuses[idx] = s;
|
|
@@ -30,9 +30,9 @@ class CompactedDBImpl : public DBImpl {
|
|
|
30
30
|
ColumnFamilyHandle* column_family, const Slice& key,
|
|
31
31
|
PinnableSlice* value) override;
|
|
32
32
|
|
|
33
|
-
Status Get(const ReadOptions&
|
|
34
|
-
const Slice& key,
|
|
35
|
-
std::string* timestamp) override;
|
|
33
|
+
Status Get(const ReadOptions& _read_options,
|
|
34
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
35
|
+
PinnableSlice* value, std::string* timestamp) override;
|
|
36
36
|
|
|
37
37
|
using DB::MultiGet;
|
|
38
38
|
// Note that CompactedDBImpl::MultiGet is not the optimized version of
|
|
@@ -43,7 +43,7 @@ class CompactedDBImpl : public DBImpl {
|
|
|
43
43
|
const std::vector<Slice>& keys,
|
|
44
44
|
std::vector<std::string>* values) override;
|
|
45
45
|
|
|
46
|
-
std::vector<Status> MultiGet(const ReadOptions&
|
|
46
|
+
std::vector<Status> MultiGet(const ReadOptions& _read_options,
|
|
47
47
|
const std::vector<ColumnFamilyHandle*>&,
|
|
48
48
|
const std::vector<Slice>& keys,
|
|
49
49
|
std::vector<std::string>* values,
|
|
@@ -118,12 +118,13 @@ class CompactedDBImpl : public DBImpl {
|
|
|
118
118
|
const IngestExternalFileOptions& /*ingestion_options*/) override {
|
|
119
119
|
return Status::NotSupported("Not supported in compacted db mode.");
|
|
120
120
|
}
|
|
121
|
+
|
|
121
122
|
using DB::CreateColumnFamilyWithImport;
|
|
122
123
|
virtual Status CreateColumnFamilyWithImport(
|
|
123
124
|
const ColumnFamilyOptions& /*options*/,
|
|
124
125
|
const std::string& /*column_family_name*/,
|
|
125
126
|
const ImportColumnFamilyOptions& /*import_options*/,
|
|
126
|
-
const ExportImportFilesMetaData
|
|
127
|
+
const std::vector<const ExportImportFilesMetaData*>& /*metadatas*/,
|
|
127
128
|
ColumnFamilyHandle** /*handle*/) override {
|
|
128
129
|
return Status::NotSupported("Not supported in compacted db mode.");
|
|
129
130
|
}
|