@nxtedition/rocksdb 8.2.8 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +0 -21
- package/deps/rocksdb/rocksdb/CMakeLists.txt +20 -10
- package/deps/rocksdb/rocksdb/Makefile +37 -25
- package/deps/rocksdb/rocksdb/README.md +29 -0
- package/deps/rocksdb/rocksdb/TARGETS +25 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -95
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2683 -496
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -3
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
- package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/builder.cc +35 -10
- package/deps/rocksdb/rocksdb/db/c.cc +233 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
- package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
- package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
- package/deps/rocksdb/rocksdb/db/db_iter.h +11 -2
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
- package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
- package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
- package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
- package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
- package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
- package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
- package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
- package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -2
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +25 -7
- package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
- package/deps/rocksdb/rocksdb/db/table_cache.cc +76 -54
- package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
- package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
- package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
- package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +55 -20
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +37 -13
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
- package/deps/rocksdb/rocksdb/env/env.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
- package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
- package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +130 -22
- package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +92 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -2
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
- package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
- package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
- package/deps/rocksdb/rocksdb/options/options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
- package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
- package/deps/rocksdb/rocksdb/port/README +10 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +32 -12
- package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
- package/deps/rocksdb/rocksdb/src.mk +10 -1
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
- package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +52 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -18
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/table/format.cc +175 -33
- package/deps/rocksdb/rocksdb/table/format.h +63 -10
- package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
- package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +22 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
- package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
- package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
- package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
- package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
- package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
- package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +119 -35
- package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
- package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
- package/deps/rocksdb/rocksdb/util/hash.h +7 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
- package/deps/rocksdb/rocksdb/util/math.h +58 -6
- package/deps/rocksdb/rocksdb/util/math128.h +29 -7
- package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
- package/deps/rocksdb/rocksdb/util/overload.h +23 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
- package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
- package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +10 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
- package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +12 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +111 -14
- package/deps/rocksdb/rocksdb.gyp +6 -2
- package/index.js +0 -8
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
// Copyright (c)
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
2
3
|
// This source code is licensed under both the GPLv2 (found in the
|
|
3
4
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
5
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
6
|
|
|
6
7
|
#pragma once
|
|
8
|
+
#include <memory>
|
|
9
|
+
#include <optional>
|
|
7
10
|
#include <sstream>
|
|
11
|
+
#include <unordered_map>
|
|
8
12
|
#include <vector>
|
|
9
13
|
|
|
14
|
+
#include "db/write_batch_internal.h"
|
|
10
15
|
#include "rocksdb/slice.h"
|
|
11
16
|
#include "rocksdb/status.h"
|
|
17
|
+
#include "rocksdb/write_batch.h"
|
|
12
18
|
#include "util/coding.h"
|
|
19
|
+
#include "util/hash_containers.h"
|
|
13
20
|
|
|
14
21
|
namespace ROCKSDB_NAMESPACE {
|
|
15
22
|
|
|
@@ -74,4 +81,188 @@ class UserDefinedTimestampSizeRecord {
|
|
|
74
81
|
std::vector<std::pair<uint32_t, size_t>> cf_to_ts_sz_;
|
|
75
82
|
};
|
|
76
83
|
|
|
84
|
+
// This handler is used to recover a WriteBatch read from WAL logs during
|
|
85
|
+
// recovery. It does a best-effort recovery if the column families contained in
|
|
86
|
+
// the WriteBatch have inconsistency between the recorded timestamp size and the
|
|
87
|
+
// running timestamp size. And creates a new WriteBatch that are consistent with
|
|
88
|
+
// the running timestamp size with entries from the original WriteBatch.
|
|
89
|
+
//
|
|
90
|
+
// Note that for a WriteBatch with no inconsistency, a new WriteBatch is created
|
|
91
|
+
// nonetheless, and it should be exactly the same as the original WriteBatch.
|
|
92
|
+
//
|
|
93
|
+
// To access the new WriteBatch, invoke `TransferNewBatch` after calling
|
|
94
|
+
// `Iterate`. The handler becomes invalid afterwards.
|
|
95
|
+
//
|
|
96
|
+
// For the user key in each entry, the best effort recovery means:
|
|
97
|
+
// 1) If recorded timestamp size is 0, running timestamp size is > 0, a min
|
|
98
|
+
// timestamp of length running timestamp size is padded to the user key.
|
|
99
|
+
// 2) If recorded timestamp size is > 0, running timestamp size is 0, the last
|
|
100
|
+
// bytes of length recorded timestamp size is stripped from user key.
|
|
101
|
+
// 3) If recorded timestamp size is the same as running timestamp size, no-op.
|
|
102
|
+
// 4) If recorded timestamp size and running timestamp size are both non-zero
|
|
103
|
+
// but not equal, return Status::InvalidArgument.
|
|
104
|
+
class TimestampRecoveryHandler : public WriteBatch::Handler {
|
|
105
|
+
public:
|
|
106
|
+
TimestampRecoveryHandler(const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
107
|
+
const UnorderedMap<uint32_t, size_t>& record_ts_sz);
|
|
108
|
+
|
|
109
|
+
~TimestampRecoveryHandler() override {}
|
|
110
|
+
|
|
111
|
+
// No copy or move.
|
|
112
|
+
TimestampRecoveryHandler(const TimestampRecoveryHandler&) = delete;
|
|
113
|
+
TimestampRecoveryHandler(TimestampRecoveryHandler&&) = delete;
|
|
114
|
+
TimestampRecoveryHandler& operator=(const TimestampRecoveryHandler&) = delete;
|
|
115
|
+
TimestampRecoveryHandler& operator=(TimestampRecoveryHandler&&) = delete;
|
|
116
|
+
|
|
117
|
+
Status PutCF(uint32_t cf, const Slice& key, const Slice& value) override;
|
|
118
|
+
|
|
119
|
+
Status DeleteCF(uint32_t cf, const Slice& key) override;
|
|
120
|
+
|
|
121
|
+
Status SingleDeleteCF(uint32_t cf, const Slice& key) override;
|
|
122
|
+
|
|
123
|
+
Status DeleteRangeCF(uint32_t cf, const Slice& begin_key,
|
|
124
|
+
const Slice& end_key) override;
|
|
125
|
+
|
|
126
|
+
Status MergeCF(uint32_t cf, const Slice& key, const Slice& value) override;
|
|
127
|
+
|
|
128
|
+
Status PutBlobIndexCF(uint32_t cf, const Slice& key,
|
|
129
|
+
const Slice& value) override;
|
|
130
|
+
|
|
131
|
+
Status MarkBeginPrepare(bool) override { return Status::OK(); }
|
|
132
|
+
|
|
133
|
+
Status MarkEndPrepare(const Slice&) override { return Status::OK(); }
|
|
134
|
+
|
|
135
|
+
Status MarkCommit(const Slice&) override { return Status::OK(); }
|
|
136
|
+
|
|
137
|
+
Status MarkCommitWithTimestamp(const Slice&, const Slice&) override {
|
|
138
|
+
return Status::OK();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
Status MarkRollback(const Slice&) override { return Status::OK(); }
|
|
142
|
+
|
|
143
|
+
Status MarkNoop(bool /*empty_batch*/) override { return Status::OK(); }
|
|
144
|
+
|
|
145
|
+
std::unique_ptr<WriteBatch>&& TransferNewBatch() {
|
|
146
|
+
assert(new_batch_diff_from_orig_batch_);
|
|
147
|
+
handler_valid_ = false;
|
|
148
|
+
return std::move(new_batch_);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private:
|
|
152
|
+
Status ReconcileTimestampDiscrepancy(uint32_t cf, const Slice& key,
|
|
153
|
+
std::string* new_key_buf,
|
|
154
|
+
Slice* new_key);
|
|
155
|
+
|
|
156
|
+
// Mapping from column family id to user-defined timestamp size for all
|
|
157
|
+
// running column families including the ones with zero timestamp size.
|
|
158
|
+
const UnorderedMap<uint32_t, size_t>& running_ts_sz_;
|
|
159
|
+
|
|
160
|
+
// Mapping from column family id to user-defined timestamp size as recorded
|
|
161
|
+
// in the WAL. This only contains non-zero user-defined timestamp size.
|
|
162
|
+
const UnorderedMap<uint32_t, size_t>& record_ts_sz_;
|
|
163
|
+
|
|
164
|
+
std::unique_ptr<WriteBatch> new_batch_;
|
|
165
|
+
// Handler is valid upon creation and becomes invalid after its `new_batch_`
|
|
166
|
+
// is transferred.
|
|
167
|
+
bool handler_valid_;
|
|
168
|
+
|
|
169
|
+
// False upon creation, and become true if at least one user key from the
|
|
170
|
+
// original batch is updated when creating the new batch.
|
|
171
|
+
bool new_batch_diff_from_orig_batch_;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// Mode for checking and handling timestamp size inconsistency encountered in a
|
|
175
|
+
// WriteBatch read from WAL log.
|
|
176
|
+
enum class TimestampSizeConsistencyMode {
|
|
177
|
+
// Verified that the recorded user-defined timestamp size is consistent with
|
|
178
|
+
// the running one for all the column families involved in a WriteBatch.
|
|
179
|
+
// Column families referred to in the WriteBatch but are dropped are ignored.
|
|
180
|
+
kVerifyConsistency,
|
|
181
|
+
// Verified that if any inconsistency exists in a WriteBatch, it's all
|
|
182
|
+
// tolerable by a best-effort reconciliation. And optionally creates a new
|
|
183
|
+
// WriteBatch from the original WriteBatch that is consistent with the running
|
|
184
|
+
// timestamp size. Column families referred to in the WriteBatch but are
|
|
185
|
+
// dropped are ignored. If a new WriteBatch is created, such entries are
|
|
186
|
+
// copied over as is.
|
|
187
|
+
kReconcileInconsistency,
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Handles the inconsistency between recorded timestamp sizes and running
|
|
191
|
+
// timestamp sizes for a WriteBatch. A non-OK `status` indicates there are
|
|
192
|
+
// intolerable inconsistency with the specified `check_mode`.
|
|
193
|
+
//
|
|
194
|
+
// If `check_mode` is `kVerifyConsistency`, intolerable inconsistency means any
|
|
195
|
+
// running column family has an inconsistent user-defined timestamp size.
|
|
196
|
+
//
|
|
197
|
+
// If `check_mode` is `kReconcileInconsistency`, intolerable inconsistency means
|
|
198
|
+
// any running column family has an inconsistent user-defined timestamp size
|
|
199
|
+
// that cannot be reconciled with a best-effort recovery. Check
|
|
200
|
+
// `TimestampRecoveryHandler` for what a best-effort recovery is capable of. In
|
|
201
|
+
// this mode, output argument `new_batch` should be set, a new WriteBatch is
|
|
202
|
+
// created on the heap and transferred to `new_batch` if there is tolerable
|
|
203
|
+
// inconsistency.
|
|
204
|
+
//
|
|
205
|
+
// An invariant that WAL logging ensures is that all timestamp size info
|
|
206
|
+
// is logged prior to a WriteBatch that needed this info. And zero timestamp
|
|
207
|
+
// size is skipped. So `record_ts_sz` only contains column family with non-zero
|
|
208
|
+
// timestamp size and a column family id absent from `record_ts_sz` will be
|
|
209
|
+
// interpreted as that column family has zero timestamp size. On the other hand,
|
|
210
|
+
// `running_ts_sz` should contain the timestamp size for all running column
|
|
211
|
+
// families including the ones with zero timestamp size.
|
|
212
|
+
Status HandleWriteBatchTimestampSizeDifference(
|
|
213
|
+
const WriteBatch* batch,
|
|
214
|
+
const UnorderedMap<uint32_t, size_t>& running_ts_sz,
|
|
215
|
+
const UnorderedMap<uint32_t, size_t>& record_ts_sz,
|
|
216
|
+
TimestampSizeConsistencyMode check_mode,
|
|
217
|
+
std::unique_ptr<WriteBatch>* new_batch = nullptr);
|
|
218
|
+
|
|
219
|
+
// This util function is used when opening an existing column family and
|
|
220
|
+
// processing its VersionEdit. It does a sanity check for the column family's
|
|
221
|
+
// old user comparator and the persist_user_defined_timestamps flag as recorded
|
|
222
|
+
// in the VersionEdit, against its new settings from the column family's
|
|
223
|
+
// ImmutableCFOptions.
|
|
224
|
+
//
|
|
225
|
+
// Valid settings change include:
|
|
226
|
+
// 1) no user comparator change and no effective persist_user_defined_timestamp
|
|
227
|
+
// flag change.
|
|
228
|
+
// 2) switch user comparator to enable user-defined timestamps feature provided
|
|
229
|
+
// the immediately effective persist_user_defined_timestamps flag is false.
|
|
230
|
+
// 3) switch user comparator to disable user-defined timestamps feature provided
|
|
231
|
+
// that the before-change persist_user_defined_timestamps is already false.
|
|
232
|
+
//
|
|
233
|
+
// Switch user comparator to disable/enable UDT is only sanity checked by a user
|
|
234
|
+
// comparator name comparison. The full check includes enforcing the new user
|
|
235
|
+
// comparator ranks user keys exactly the same as the old user comparator and
|
|
236
|
+
// only add / remove the user-defined timestamp comparison. We don't have ways
|
|
237
|
+
// to strictly enforce this so currently only the RocksDB builtin comparator
|
|
238
|
+
// wrapper `ComparatorWithU64TsImpl` is supported to enable / disable
|
|
239
|
+
// user-defined timestamps. It formats user-defined timestamps as uint64_t.
|
|
240
|
+
//
|
|
241
|
+
// When the settings indicate a legit change to enable user-defined timestamps
|
|
242
|
+
// feature on a column family, `mark_sst_files_has_no_udt` will be set to true
|
|
243
|
+
// to indicate marking all existing SST files has no user-defined timestamps
|
|
244
|
+
// when re-writing the manifest.
|
|
245
|
+
Status ValidateUserDefinedTimestampsOptions(
|
|
246
|
+
const Comparator* new_comparator, const std::string& old_comparator_name,
|
|
247
|
+
bool new_persist_udt, bool old_persist_udt,
|
|
248
|
+
bool* mark_sst_files_has_no_udt);
|
|
249
|
+
|
|
250
|
+
// Given a cutoff user-defined timestamp formatted as uint64_t, get the
|
|
251
|
+
// effective `full_history_ts_low` timestamp, which is the next immediately
|
|
252
|
+
// bigger timestamp. Used by the UDT in memtable only feature when flushing
|
|
253
|
+
// memtables and remove timestamps. This process collapses history and increase
|
|
254
|
+
// the effective `full_history_ts_low`.
|
|
255
|
+
void GetFullHistoryTsLowFromU64CutoffTs(Slice* cutoff_ts,
|
|
256
|
+
std::string* full_history_ts_low);
|
|
257
|
+
|
|
258
|
+
// `start` is the inclusive lower user key bound without user-defined timestamp.
|
|
259
|
+
// `end` is the upper user key bound without user-defined timestamp.
|
|
260
|
+
// By default, `end` is treated as being exclusive. If `exclusive_end` is set to
|
|
261
|
+
// false, it's treated as an inclusive upper bound.
|
|
262
|
+
// If any of these two bounds is nullptr, an empty std::optional<Slice> is
|
|
263
|
+
// returned for that bound.
|
|
264
|
+
std::tuple<std::optional<Slice>, std::optional<Slice>>
|
|
265
|
+
MaybeAddTimestampsToRange(const Slice* start, const Slice* end, size_t ts_sz,
|
|
266
|
+
std::string* start_with_ts, std::string* end_with_ts,
|
|
267
|
+
bool exclusive_end = true);
|
|
77
268
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
//
|
|
3
|
+
// This source code is licensed under both the GPLv2 (found in the
|
|
4
|
+
// COPYING file in the root directory) and Apache 2.0 License
|
|
5
|
+
// (found in the LICENSE.Apache file in the root directory).
|
|
6
|
+
|
|
7
|
+
#include "util/udt_util.h"
|
|
8
|
+
|
|
9
|
+
#include <gtest/gtest.h>
|
|
10
|
+
|
|
11
|
+
#include "db/dbformat.h"
|
|
12
|
+
#include "test_util/testharness.h"
|
|
13
|
+
#include "test_util/testutil.h"
|
|
14
|
+
|
|
15
|
+
namespace ROCKSDB_NAMESPACE {
|
|
16
|
+
namespace {
|
|
17
|
+
static const std::string kTestKeyWithoutTs = "key";
|
|
18
|
+
static const std::string kValuePlaceHolder = "value";
|
|
19
|
+
} // namespace
|
|
20
|
+
|
|
21
|
+
class HandleTimestampSizeDifferenceTest : public testing::Test {
|
|
22
|
+
public:
|
|
23
|
+
HandleTimestampSizeDifferenceTest() {}
|
|
24
|
+
|
|
25
|
+
// Test handler used to collect the column family id and user keys contained
|
|
26
|
+
// in a WriteBatch for test verification. And verifies the value part stays
|
|
27
|
+
// the same if it's available.
|
|
28
|
+
class KeyCollector : public WriteBatch::Handler {
|
|
29
|
+
public:
|
|
30
|
+
explicit KeyCollector() {}
|
|
31
|
+
|
|
32
|
+
~KeyCollector() override {}
|
|
33
|
+
|
|
34
|
+
Status PutCF(uint32_t cf, const Slice& key, const Slice& value) override {
|
|
35
|
+
if (value.compare(kValuePlaceHolder) != 0) {
|
|
36
|
+
return Status::InvalidArgument();
|
|
37
|
+
}
|
|
38
|
+
return AddKey(cf, key);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
Status DeleteCF(uint32_t cf, const Slice& key) override {
|
|
42
|
+
return AddKey(cf, key);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Status SingleDeleteCF(uint32_t cf, const Slice& key) override {
|
|
46
|
+
return AddKey(cf, key);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Status DeleteRangeCF(uint32_t cf, const Slice& begin_key,
|
|
50
|
+
const Slice& end_key) override {
|
|
51
|
+
Status status = AddKey(cf, begin_key);
|
|
52
|
+
if (!status.ok()) {
|
|
53
|
+
return status;
|
|
54
|
+
}
|
|
55
|
+
return AddKey(cf, end_key);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
Status MergeCF(uint32_t cf, const Slice& key, const Slice& value) override {
|
|
59
|
+
if (value.compare(kValuePlaceHolder) != 0) {
|
|
60
|
+
return Status::InvalidArgument();
|
|
61
|
+
}
|
|
62
|
+
return AddKey(cf, key);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
Status PutBlobIndexCF(uint32_t cf, const Slice& key,
|
|
66
|
+
const Slice& value) override {
|
|
67
|
+
if (value.compare(kValuePlaceHolder) != 0) {
|
|
68
|
+
return Status::InvalidArgument();
|
|
69
|
+
}
|
|
70
|
+
return AddKey(cf, key);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Status MarkBeginPrepare(bool) override { return Status::OK(); }
|
|
74
|
+
|
|
75
|
+
Status MarkEndPrepare(const Slice&) override { return Status::OK(); }
|
|
76
|
+
|
|
77
|
+
Status MarkRollback(const Slice&) override { return Status::OK(); }
|
|
78
|
+
|
|
79
|
+
Status MarkCommit(const Slice&) override { return Status::OK(); }
|
|
80
|
+
|
|
81
|
+
Status MarkCommitWithTimestamp(const Slice&, const Slice&) override {
|
|
82
|
+
return Status::OK();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
Status MarkNoop(bool) override { return Status::OK(); }
|
|
86
|
+
|
|
87
|
+
const std::vector<std::pair<uint32_t, const Slice>>& GetKeys() const {
|
|
88
|
+
return keys_;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private:
|
|
92
|
+
Status AddKey(uint32_t cf, const Slice& key) {
|
|
93
|
+
keys_.push_back(std::make_pair(cf, key));
|
|
94
|
+
return Status::OK();
|
|
95
|
+
}
|
|
96
|
+
std::vector<std::pair<uint32_t, const Slice>> keys_;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
void CreateKey(std::string* key_buf, size_t ts_sz) {
|
|
100
|
+
if (ts_sz > 0) {
|
|
101
|
+
AppendKeyWithMinTimestamp(key_buf, kTestKeyWithoutTs, ts_sz);
|
|
102
|
+
} else {
|
|
103
|
+
key_buf->assign(kTestKeyWithoutTs);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
void CreateWriteBatch(const UnorderedMap<uint32_t, size_t>& ts_sz_for_batch,
|
|
108
|
+
WriteBatch* batch) {
|
|
109
|
+
for (const auto& [cf_id, ts_sz] : ts_sz_for_batch) {
|
|
110
|
+
std::string key;
|
|
111
|
+
CreateKey(&key, ts_sz);
|
|
112
|
+
ASSERT_OK(WriteBatchInternal::Put(batch, cf_id, key, kValuePlaceHolder));
|
|
113
|
+
ASSERT_OK(WriteBatchInternal::Delete(batch, cf_id, key));
|
|
114
|
+
ASSERT_OK(WriteBatchInternal::SingleDelete(batch, cf_id, key));
|
|
115
|
+
ASSERT_OK(WriteBatchInternal::DeleteRange(batch, cf_id, key, key));
|
|
116
|
+
ASSERT_OK(
|
|
117
|
+
WriteBatchInternal::Merge(batch, cf_id, key, kValuePlaceHolder));
|
|
118
|
+
ASSERT_OK(WriteBatchInternal::PutBlobIndex(batch, cf_id, key,
|
|
119
|
+
kValuePlaceHolder));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
void CheckSequenceEqual(const WriteBatch& orig_batch,
|
|
124
|
+
const WriteBatch& new_batch) {
|
|
125
|
+
ASSERT_EQ(WriteBatchInternal::Sequence(&orig_batch),
|
|
126
|
+
WriteBatchInternal::Sequence(&new_batch));
|
|
127
|
+
}
|
|
128
|
+
void CheckCountEqual(const WriteBatch& orig_batch,
|
|
129
|
+
const WriteBatch& new_batch) {
|
|
130
|
+
ASSERT_EQ(WriteBatchInternal::Count(&orig_batch),
|
|
131
|
+
WriteBatchInternal::Count(&new_batch));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void VerifyKeys(
|
|
135
|
+
const std::vector<std::pair<uint32_t, const Slice>>& keys_with_ts,
|
|
136
|
+
const std::vector<std::pair<uint32_t, const Slice>>& keys_without_ts,
|
|
137
|
+
size_t ts_sz, std::optional<uint32_t> dropped_cf) {
|
|
138
|
+
ASSERT_EQ(keys_with_ts.size(), keys_without_ts.size());
|
|
139
|
+
const std::string kTsMin(ts_sz, static_cast<unsigned char>(0));
|
|
140
|
+
for (size_t i = 0; i < keys_with_ts.size(); i++) {
|
|
141
|
+
// TimestampRecoveryHandler ignores dropped column family and copy it over
|
|
142
|
+
// as is. Check the keys stay the same.
|
|
143
|
+
if (dropped_cf.has_value() &&
|
|
144
|
+
keys_with_ts[i].first == dropped_cf.value()) {
|
|
145
|
+
ASSERT_EQ(keys_with_ts[i].first, keys_without_ts[i].first);
|
|
146
|
+
ASSERT_EQ(keys_with_ts[i].second, keys_without_ts[i].second);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const Slice& key_with_ts = keys_with_ts[i].second;
|
|
150
|
+
const Slice& key_without_ts = keys_without_ts[i].second;
|
|
151
|
+
ASSERT_TRUE(key_with_ts.starts_with(key_without_ts));
|
|
152
|
+
ASSERT_EQ(key_with_ts.size() - key_without_ts.size(), ts_sz);
|
|
153
|
+
ASSERT_TRUE(key_with_ts.ends_with(kTsMin));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
void CheckContentsWithTimestampStripping(const WriteBatch& orig_batch,
|
|
158
|
+
const WriteBatch& new_batch,
|
|
159
|
+
size_t ts_sz,
|
|
160
|
+
std::optional<uint32_t> dropped_cf) {
|
|
161
|
+
CheckSequenceEqual(orig_batch, new_batch);
|
|
162
|
+
CheckCountEqual(orig_batch, new_batch);
|
|
163
|
+
KeyCollector collector_for_orig_batch;
|
|
164
|
+
ASSERT_OK(orig_batch.Iterate(&collector_for_orig_batch));
|
|
165
|
+
KeyCollector collector_for_new_batch;
|
|
166
|
+
ASSERT_OK(new_batch.Iterate(&collector_for_new_batch));
|
|
167
|
+
VerifyKeys(collector_for_orig_batch.GetKeys(),
|
|
168
|
+
collector_for_new_batch.GetKeys(), ts_sz, dropped_cf);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
void CheckContentsWithTimestampPadding(const WriteBatch& orig_batch,
|
|
172
|
+
const WriteBatch& new_batch,
|
|
173
|
+
size_t ts_sz) {
|
|
174
|
+
CheckSequenceEqual(orig_batch, new_batch);
|
|
175
|
+
CheckCountEqual(orig_batch, new_batch);
|
|
176
|
+
KeyCollector collector_for_orig_batch;
|
|
177
|
+
ASSERT_OK(orig_batch.Iterate(&collector_for_orig_batch));
|
|
178
|
+
KeyCollector collector_for_new_batch;
|
|
179
|
+
ASSERT_OK(new_batch.Iterate(&collector_for_new_batch));
|
|
180
|
+
VerifyKeys(collector_for_new_batch.GetKeys(),
|
|
181
|
+
collector_for_orig_batch.GetKeys(), ts_sz,
|
|
182
|
+
std::nullopt /* dropped_cf */);
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
TEST_F(HandleTimestampSizeDifferenceTest, AllColumnFamiliesConsistent) {
|
|
187
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)},
|
|
188
|
+
{2, 0}};
|
|
189
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
|
|
190
|
+
WriteBatch batch;
|
|
191
|
+
CreateWriteBatch(running_ts_sz, &batch);
|
|
192
|
+
|
|
193
|
+
// All `check_mode` pass with OK status and `batch` not checked or updated.
|
|
194
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
195
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
196
|
+
TimestampSizeConsistencyMode::kVerifyConsistency));
|
|
197
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
198
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
199
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
200
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
201
|
+
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
TEST_F(HandleTimestampSizeDifferenceTest,
|
|
205
|
+
AllInconsistentColumnFamiliesDropped) {
|
|
206
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{2, 0}};
|
|
207
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)},
|
|
208
|
+
{3, sizeof(char)}};
|
|
209
|
+
WriteBatch batch;
|
|
210
|
+
CreateWriteBatch(record_ts_sz, &batch);
|
|
211
|
+
|
|
212
|
+
// All `check_mode` pass with OK status and `batch` not checked or updated.
|
|
213
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
214
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
215
|
+
TimestampSizeConsistencyMode::kVerifyConsistency));
|
|
216
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
217
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
218
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
219
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
220
|
+
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
TEST_F(HandleTimestampSizeDifferenceTest, InvolvedColumnFamiliesConsistent) {
|
|
224
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)},
|
|
225
|
+
{2, sizeof(char)}};
|
|
226
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
|
|
227
|
+
WriteBatch batch;
|
|
228
|
+
CreateWriteBatch(record_ts_sz, &batch);
|
|
229
|
+
|
|
230
|
+
// All `check_mode` pass with OK status and `batch` not updated.
|
|
231
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
232
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
233
|
+
TimestampSizeConsistencyMode::kVerifyConsistency));
|
|
234
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
235
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
236
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
237
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
238
|
+
ASSERT_TRUE(new_batch.get() == nullptr);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
TEST_F(HandleTimestampSizeDifferenceTest,
|
|
242
|
+
InconsistentColumnFamilyNeedsTimestampStripping) {
|
|
243
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, 0}, {2, sizeof(char)}};
|
|
244
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
|
|
245
|
+
WriteBatch batch;
|
|
246
|
+
CreateWriteBatch(record_ts_sz, &batch);
|
|
247
|
+
|
|
248
|
+
// kVerifyConsistency doesn't tolerate inconsistency for running column
|
|
249
|
+
// families.
|
|
250
|
+
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
251
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
252
|
+
TimestampSizeConsistencyMode::kVerifyConsistency)
|
|
253
|
+
.IsInvalidArgument());
|
|
254
|
+
|
|
255
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
256
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
257
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
258
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
259
|
+
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
260
|
+
CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
|
|
261
|
+
std::nullopt /* dropped_cf */);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
TEST_F(HandleTimestampSizeDifferenceTest,
|
|
265
|
+
InconsistentColumnFamilyNeedsTimestampPadding) {
|
|
266
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)}};
|
|
267
|
+
// Make `record_ts_sz` not contain zero timestamp size entries to follow the
|
|
268
|
+
// behavior of actual WAL log timestamp size record.
|
|
269
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz;
|
|
270
|
+
WriteBatch batch;
|
|
271
|
+
CreateWriteBatch({{1, 0}}, &batch);
|
|
272
|
+
|
|
273
|
+
// kVerifyConsistency doesn't tolerate inconsistency for running column
|
|
274
|
+
// families.
|
|
275
|
+
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
276
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
277
|
+
TimestampSizeConsistencyMode::kVerifyConsistency)
|
|
278
|
+
.IsInvalidArgument());
|
|
279
|
+
|
|
280
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
281
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
282
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
283
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
284
|
+
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
285
|
+
CheckContentsWithTimestampPadding(batch, *new_batch, sizeof(uint64_t));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
TEST_F(HandleTimestampSizeDifferenceTest,
|
|
289
|
+
InconsistencyReconcileCopyOverDroppedColumnFamily) {
|
|
290
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, 0}};
|
|
291
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)},
|
|
292
|
+
{2, sizeof(char)}};
|
|
293
|
+
WriteBatch batch;
|
|
294
|
+
CreateWriteBatch(record_ts_sz, &batch);
|
|
295
|
+
std::unique_ptr<WriteBatch> new_batch(nullptr);
|
|
296
|
+
|
|
297
|
+
// kReconcileInconsistency tolerate inconsistency for dropped column family
|
|
298
|
+
// and all related entries copied over to the new WriteBatch.
|
|
299
|
+
ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
|
|
300
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
301
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
|
|
302
|
+
|
|
303
|
+
ASSERT_TRUE(new_batch.get() != nullptr);
|
|
304
|
+
CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
|
|
305
|
+
std::optional<uint32_t>(2));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
TEST_F(HandleTimestampSizeDifferenceTest, UnrecoverableInconsistency) {
|
|
309
|
+
UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(char)}};
|
|
310
|
+
UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
|
|
311
|
+
WriteBatch batch;
|
|
312
|
+
CreateWriteBatch(record_ts_sz, &batch);
|
|
313
|
+
|
|
314
|
+
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
315
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
316
|
+
TimestampSizeConsistencyMode::kVerifyConsistency)
|
|
317
|
+
.IsInvalidArgument());
|
|
318
|
+
|
|
319
|
+
ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
|
|
320
|
+
&batch, running_ts_sz, record_ts_sz,
|
|
321
|
+
TimestampSizeConsistencyMode::kReconcileInconsistency)
|
|
322
|
+
.IsInvalidArgument());
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest, EnableUserDefinedTimestamps) {
|
|
326
|
+
bool mark_sst_files = false;
|
|
327
|
+
const Comparator* new_comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
328
|
+
const Comparator* old_comparator = BytewiseComparator();
|
|
329
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
330
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
331
|
+
false /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
|
|
332
|
+
ASSERT_TRUE(mark_sst_files);
|
|
333
|
+
|
|
334
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
335
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
336
|
+
false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
337
|
+
ASSERT_TRUE(mark_sst_files);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest,
|
|
341
|
+
EnableUserDefinedTimestampsNewPersistUDTFlagIncorrect) {
|
|
342
|
+
bool mark_sst_files = false;
|
|
343
|
+
const Comparator* new_comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
344
|
+
const Comparator* old_comparator = BytewiseComparator();
|
|
345
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
346
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
347
|
+
true /*new_persist_udt*/, true /*old_persist_udt*/,
|
|
348
|
+
&mark_sst_files)
|
|
349
|
+
.IsInvalidArgument());
|
|
350
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
351
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
352
|
+
true /*new_persist_udt*/, false /*old_persist_udt*/,
|
|
353
|
+
&mark_sst_files)
|
|
354
|
+
.IsInvalidArgument());
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest, DisableUserDefinedTimestamps) {
|
|
358
|
+
bool mark_sst_files = false;
|
|
359
|
+
const Comparator* new_comparator = ReverseBytewiseComparator();
|
|
360
|
+
const Comparator* old_comparator =
|
|
361
|
+
test::ReverseBytewiseComparatorWithU64TsWrapper();
|
|
362
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
363
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
364
|
+
false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
365
|
+
ASSERT_FALSE(mark_sst_files);
|
|
366
|
+
|
|
367
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
368
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
369
|
+
true /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
370
|
+
ASSERT_FALSE(mark_sst_files);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest,
|
|
374
|
+
DisableUserDefinedTimestampsOldPersistUDTFlagIncorrect) {
|
|
375
|
+
bool mark_sst_files = false;
|
|
376
|
+
const Comparator* new_comparator = BytewiseComparator();
|
|
377
|
+
const Comparator* old_comparator = test::BytewiseComparatorWithU64TsWrapper();
|
|
378
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
379
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
380
|
+
false /*new_persist_udt*/, true /*old_persist_udt*/,
|
|
381
|
+
&mark_sst_files)
|
|
382
|
+
.IsInvalidArgument());
|
|
383
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
384
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
385
|
+
true /*new_persist_udt*/, true /*old_persist_udt*/,
|
|
386
|
+
&mark_sst_files)
|
|
387
|
+
.IsInvalidArgument());
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest, UserComparatorUnchanged) {
|
|
391
|
+
bool mark_sst_files = false;
|
|
392
|
+
const Comparator* ucmp_without_ts = BytewiseComparator();
|
|
393
|
+
const Comparator* ucmp_with_ts = test::BytewiseComparatorWithU64TsWrapper();
|
|
394
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
395
|
+
ucmp_without_ts, std::string(ucmp_without_ts->Name()),
|
|
396
|
+
false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
397
|
+
ASSERT_FALSE(mark_sst_files);
|
|
398
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
399
|
+
ucmp_without_ts, std::string(ucmp_without_ts->Name()),
|
|
400
|
+
true /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
|
|
401
|
+
ASSERT_FALSE(mark_sst_files);
|
|
402
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
403
|
+
ucmp_without_ts, std::string(ucmp_without_ts->Name()),
|
|
404
|
+
true /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
405
|
+
ASSERT_FALSE(mark_sst_files);
|
|
406
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
407
|
+
ucmp_without_ts, std::string(ucmp_without_ts->Name()),
|
|
408
|
+
false /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
|
|
409
|
+
ASSERT_FALSE(mark_sst_files);
|
|
410
|
+
|
|
411
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
412
|
+
ucmp_with_ts, std::string(ucmp_with_ts->Name()), true /*new_persist_udt*/,
|
|
413
|
+
true /*old_persist_udt*/, &mark_sst_files));
|
|
414
|
+
ASSERT_FALSE(mark_sst_files);
|
|
415
|
+
ASSERT_OK(ValidateUserDefinedTimestampsOptions(
|
|
416
|
+
ucmp_with_ts, std::string(ucmp_with_ts->Name()),
|
|
417
|
+
false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
|
|
418
|
+
ASSERT_FALSE(mark_sst_files);
|
|
419
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
420
|
+
ucmp_with_ts, std::string(ucmp_with_ts->Name()),
|
|
421
|
+
true /*new_persist_udt*/, false /*old_persist_udt*/,
|
|
422
|
+
&mark_sst_files)
|
|
423
|
+
.IsInvalidArgument());
|
|
424
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
425
|
+
ucmp_with_ts, std::string(ucmp_with_ts->Name()),
|
|
426
|
+
false /*new_persist_udt*/, true /*old_persist_udt*/,
|
|
427
|
+
&mark_sst_files)
|
|
428
|
+
.IsInvalidArgument());
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
TEST(ValidateUserDefinedTimestampsOptionsTest, InvalidUserComparatorChange) {
|
|
432
|
+
bool mark_sst_files = false;
|
|
433
|
+
const Comparator* new_comparator = BytewiseComparator();
|
|
434
|
+
const Comparator* old_comparator = ReverseBytewiseComparator();
|
|
435
|
+
ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
|
|
436
|
+
new_comparator, std::string(old_comparator->Name()),
|
|
437
|
+
false /*new_persist_udt*/, true /*old_persist_udt*/,
|
|
438
|
+
&mark_sst_files)
|
|
439
|
+
.IsInvalidArgument());
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
TEST(GetFullHistoryTsLowFromU64CutoffTsTest, Success) {
|
|
443
|
+
std::string cutoff_ts;
|
|
444
|
+
uint64_t cutoff_ts_int = 3;
|
|
445
|
+
PutFixed64(&cutoff_ts, 3);
|
|
446
|
+
Slice cutoff_ts_slice = cutoff_ts;
|
|
447
|
+
std::string actual_full_history_ts_low;
|
|
448
|
+
GetFullHistoryTsLowFromU64CutoffTs(&cutoff_ts_slice,
|
|
449
|
+
&actual_full_history_ts_low);
|
|
450
|
+
|
|
451
|
+
std::string expected_ts_low;
|
|
452
|
+
PutFixed64(&expected_ts_low, cutoff_ts_int + 1);
|
|
453
|
+
ASSERT_EQ(expected_ts_low, actual_full_history_ts_low);
|
|
454
|
+
}
|
|
455
|
+
} // namespace ROCKSDB_NAMESPACE
|
|
456
|
+
|
|
457
|
+
int main(int argc, char** argv) {
|
|
458
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
459
|
+
::testing::InitGoogleTest(&argc, argv);
|
|
460
|
+
return RUN_ALL_TESTS();
|
|
461
|
+
}
|