@nxtedition/rocksdb 8.2.7 → 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
|
@@ -168,46 +168,113 @@ inline void UnPackSequenceAndType(uint64_t packed, uint64_t* seq,
|
|
|
168
168
|
EntryType GetEntryType(ValueType value_type);
|
|
169
169
|
|
|
170
170
|
// Append the serialization of "key" to *result.
|
|
171
|
-
|
|
172
|
-
|
|
171
|
+
//
|
|
172
|
+
// input [internal key]: <user_key | seqno + type>
|
|
173
|
+
// output before: empty
|
|
174
|
+
// output: <user_key | seqno + type>
|
|
175
|
+
void AppendInternalKey(std::string* result, const ParsedInternalKey& key);
|
|
173
176
|
|
|
174
177
|
// Append the serialization of "key" to *result, replacing the original
|
|
175
178
|
// timestamp with argument ts.
|
|
176
|
-
|
|
177
|
-
|
|
179
|
+
//
|
|
180
|
+
// input [internal key]: <user_provided_key | original_ts | seqno + type>
|
|
181
|
+
// output before: empty
|
|
182
|
+
// output after: <user_provided_key | ts | seqno + type>
|
|
183
|
+
void AppendInternalKeyWithDifferentTimestamp(std::string* result,
|
|
184
|
+
const ParsedInternalKey& key,
|
|
185
|
+
const Slice& ts);
|
|
178
186
|
|
|
179
187
|
// Serialized internal key consists of user key followed by footer.
|
|
180
188
|
// This function appends the footer to *result, assuming that *result already
|
|
181
189
|
// contains the user key at the end.
|
|
182
|
-
|
|
183
|
-
|
|
190
|
+
//
|
|
191
|
+
// output before: <user_key>
|
|
192
|
+
// output after: <user_key | seqno + type>
|
|
193
|
+
void AppendInternalKeyFooter(std::string* result, SequenceNumber s,
|
|
194
|
+
ValueType t);
|
|
184
195
|
|
|
185
196
|
// Append the key and a minimal timestamp to *result
|
|
186
|
-
|
|
187
|
-
|
|
197
|
+
//
|
|
198
|
+
// input [user key without ts]: <user_provided_key>
|
|
199
|
+
// output before: empty
|
|
200
|
+
// output after: <user_provided_key | min_ts>
|
|
201
|
+
void AppendKeyWithMinTimestamp(std::string* result, const Slice& key,
|
|
202
|
+
size_t ts_sz);
|
|
188
203
|
|
|
189
204
|
// Append the key and a maximal timestamp to *result
|
|
190
|
-
|
|
191
|
-
|
|
205
|
+
//
|
|
206
|
+
// input [user key without ts]: <user_provided_key>
|
|
207
|
+
// output before: empty
|
|
208
|
+
// output after: <user_provided_key | max_ts>
|
|
209
|
+
void AppendKeyWithMaxTimestamp(std::string* result, const Slice& key,
|
|
210
|
+
size_t ts_sz);
|
|
211
|
+
|
|
212
|
+
// `key` is a user key with timestamp. Append the user key without timestamp
|
|
213
|
+
// and the minimum timestamp to *result.
|
|
214
|
+
//
|
|
215
|
+
// input [user key]: <user_provided_key | original_ts>
|
|
216
|
+
// output before: empty
|
|
217
|
+
// output after: <user_provided_key | min_ts>
|
|
218
|
+
void AppendUserKeyWithMinTimestamp(std::string* result, const Slice& key,
|
|
219
|
+
size_t ts_sz);
|
|
192
220
|
|
|
193
221
|
// `key` is a user key with timestamp. Append the user key without timestamp
|
|
194
222
|
// and the maximal timestamp to *result.
|
|
195
|
-
|
|
196
|
-
|
|
223
|
+
//
|
|
224
|
+
// input [user key]: <user_provided_key | original_ts>
|
|
225
|
+
// output before: empty
|
|
226
|
+
// output after: <user_provided_key | max_ts>
|
|
227
|
+
void AppendUserKeyWithMaxTimestamp(std::string* result, const Slice& key,
|
|
228
|
+
size_t ts_sz);
|
|
229
|
+
|
|
230
|
+
// `key` is an internal key containing a user key without timestamp. Create a
|
|
231
|
+
// new key in *result by padding a min timestamp of size `ts_sz` to the user key
|
|
232
|
+
// and copying the remaining internal key bytes.
|
|
233
|
+
//
|
|
234
|
+
// input [internal key]: <user_provided_key | seqno + type>
|
|
235
|
+
// output before: empty
|
|
236
|
+
// output after: <user_provided_key | min_ts | seqno + type>
|
|
237
|
+
void PadInternalKeyWithMinTimestamp(std::string* result, const Slice& key,
|
|
238
|
+
size_t ts_sz);
|
|
239
|
+
|
|
240
|
+
// `key` is an internal key containing a user key with timestamp of size
|
|
241
|
+
// `ts_sz`. Create a new internal key in *result by stripping the timestamp from
|
|
242
|
+
// the user key and copying the remaining internal key bytes.
|
|
243
|
+
//
|
|
244
|
+
// input [internal key]: <user_provided_key | original_ts | seqno + type>
|
|
245
|
+
// output before: empty
|
|
246
|
+
// output after: <user_provided_key | seqno + type>
|
|
247
|
+
void StripTimestampFromInternalKey(std::string* result, const Slice& key,
|
|
248
|
+
size_t ts_sz);
|
|
249
|
+
|
|
250
|
+
// `key` is an internal key containing a user key with timestamp of size
|
|
251
|
+
// `ts_sz`. Create a new internal key in *result while replace the original
|
|
252
|
+
// timestamp with min timestamp.
|
|
253
|
+
//
|
|
254
|
+
// input [internal key]: <user_provided_key | original_ts | seqno + type>
|
|
255
|
+
// output before: empty
|
|
256
|
+
// output after: <user_provided_key | min_ts | seqno + type>
|
|
257
|
+
void ReplaceInternalKeyWithMinTimestamp(std::string* result, const Slice& key,
|
|
258
|
+
size_t ts_sz);
|
|
197
259
|
|
|
198
260
|
// Attempt to parse an internal key from "internal_key". On success,
|
|
199
261
|
// stores the parsed data in "*result", and returns true.
|
|
200
262
|
//
|
|
201
263
|
// On error, returns false, leaves "*result" in an undefined state.
|
|
202
|
-
|
|
203
|
-
|
|
264
|
+
Status ParseInternalKey(const Slice& internal_key, ParsedInternalKey* result,
|
|
265
|
+
bool log_err_key);
|
|
204
266
|
|
|
205
267
|
// Returns the user key portion of an internal key.
|
|
268
|
+
//
|
|
269
|
+
// input [internal key]: <user_key | seqno + type>
|
|
270
|
+
// output: <user_key>
|
|
206
271
|
inline Slice ExtractUserKey(const Slice& internal_key) {
|
|
207
272
|
assert(internal_key.size() >= kNumInternalBytes);
|
|
208
273
|
return Slice(internal_key.data(), internal_key.size() - kNumInternalBytes);
|
|
209
274
|
}
|
|
210
275
|
|
|
276
|
+
// input [internal key]: <user_provided_key | ts | seqno + type>
|
|
277
|
+
// output : <user_provided_key>
|
|
211
278
|
inline Slice ExtractUserKeyAndStripTimestamp(const Slice& internal_key,
|
|
212
279
|
size_t ts_sz) {
|
|
213
280
|
Slice ret = internal_key;
|
|
@@ -215,17 +282,23 @@ inline Slice ExtractUserKeyAndStripTimestamp(const Slice& internal_key,
|
|
|
215
282
|
return ret;
|
|
216
283
|
}
|
|
217
284
|
|
|
285
|
+
// input [user key]: <user_provided_key | ts>
|
|
286
|
+
// output: <user_provided_key>
|
|
218
287
|
inline Slice StripTimestampFromUserKey(const Slice& user_key, size_t ts_sz) {
|
|
219
288
|
Slice ret = user_key;
|
|
220
289
|
ret.remove_suffix(ts_sz);
|
|
221
290
|
return ret;
|
|
222
291
|
}
|
|
223
292
|
|
|
293
|
+
// input [user key]: <user_provided_key | ts>
|
|
294
|
+
// output: <ts>
|
|
224
295
|
inline Slice ExtractTimestampFromUserKey(const Slice& user_key, size_t ts_sz) {
|
|
225
296
|
assert(user_key.size() >= ts_sz);
|
|
226
297
|
return Slice(user_key.data() + user_key.size() - ts_sz, ts_sz);
|
|
227
298
|
}
|
|
228
299
|
|
|
300
|
+
// input [internal key]: <user_provided_key | ts | seqno + type>
|
|
301
|
+
// output: <ts>
|
|
229
302
|
inline Slice ExtractTimestampFromKey(const Slice& internal_key, size_t ts_sz) {
|
|
230
303
|
const size_t key_size = internal_key.size();
|
|
231
304
|
assert(key_size >= kNumInternalBytes + ts_sz);
|
|
@@ -233,12 +306,16 @@ inline Slice ExtractTimestampFromKey(const Slice& internal_key, size_t ts_sz) {
|
|
|
233
306
|
ts_sz);
|
|
234
307
|
}
|
|
235
308
|
|
|
309
|
+
// input [internal key]: <user_provided_key | ts | seqno + type>
|
|
310
|
+
// output: <seqno + type>
|
|
236
311
|
inline uint64_t ExtractInternalKeyFooter(const Slice& internal_key) {
|
|
237
312
|
assert(internal_key.size() >= kNumInternalBytes);
|
|
238
313
|
const size_t n = internal_key.size();
|
|
239
314
|
return DecodeFixed64(internal_key.data() + n - kNumInternalBytes);
|
|
240
315
|
}
|
|
241
316
|
|
|
317
|
+
// input [internal key]: <user_provided_key | ts | seqno + type>
|
|
318
|
+
// output: <type>
|
|
242
319
|
inline ValueType ExtractValueType(const Slice& internal_key) {
|
|
243
320
|
uint64_t num = ExtractInternalKeyFooter(internal_key);
|
|
244
321
|
unsigned char c = num & 0xff;
|
|
@@ -504,6 +581,62 @@ class IterKey {
|
|
|
504
581
|
key_size_ = total_size;
|
|
505
582
|
}
|
|
506
583
|
|
|
584
|
+
// A version of `TrimAppend` assuming the last bytes of length `ts_sz` in the
|
|
585
|
+
// user key part of `key_` is not counted towards shared bytes. And the
|
|
586
|
+
// decoded key needed a min timestamp of length `ts_sz` pad to the user key.
|
|
587
|
+
void TrimAppendWithTimestamp(const size_t shared_len,
|
|
588
|
+
const char* non_shared_data,
|
|
589
|
+
const size_t non_shared_len,
|
|
590
|
+
const size_t ts_sz) {
|
|
591
|
+
std::string kTsMin(ts_sz, static_cast<unsigned char>(0));
|
|
592
|
+
std::string key_with_ts;
|
|
593
|
+
std::vector<Slice> key_parts_with_ts;
|
|
594
|
+
if (IsUserKey()) {
|
|
595
|
+
key_parts_with_ts = {Slice(key_, shared_len),
|
|
596
|
+
Slice(non_shared_data, non_shared_len),
|
|
597
|
+
Slice(kTsMin)};
|
|
598
|
+
} else {
|
|
599
|
+
assert(shared_len + non_shared_len >= kNumInternalBytes);
|
|
600
|
+
// Invaraint: shared_user_key_len + shared_internal_bytes_len = shared_len
|
|
601
|
+
// In naming below `*_len` variables, keyword `user_key` refers to the
|
|
602
|
+
// user key part of the existing key in `key_` as apposed to the new key.
|
|
603
|
+
// Similary, `internal_bytes` refers to the footer part of the existing
|
|
604
|
+
// key. These bytes potentially will move between user key part and the
|
|
605
|
+
// footer part in the new key.
|
|
606
|
+
const size_t user_key_len = key_size_ - kNumInternalBytes;
|
|
607
|
+
const size_t sharable_user_key_len = user_key_len - ts_sz;
|
|
608
|
+
const size_t shared_user_key_len =
|
|
609
|
+
std::min(shared_len, sharable_user_key_len);
|
|
610
|
+
const size_t shared_internal_bytes_len = shared_len - shared_user_key_len;
|
|
611
|
+
|
|
612
|
+
// One Slice among the three Slices will get split into two Slices, plus
|
|
613
|
+
// a timestamp slice.
|
|
614
|
+
key_parts_with_ts.reserve(5);
|
|
615
|
+
bool ts_added = false;
|
|
616
|
+
// Add slice parts and find the right location to add the min timestamp.
|
|
617
|
+
MaybeAddKeyPartsWithTimestamp(
|
|
618
|
+
key_, shared_user_key_len,
|
|
619
|
+
shared_internal_bytes_len + non_shared_len < kNumInternalBytes,
|
|
620
|
+
shared_len + non_shared_len - kNumInternalBytes, kTsMin,
|
|
621
|
+
key_parts_with_ts, &ts_added);
|
|
622
|
+
MaybeAddKeyPartsWithTimestamp(
|
|
623
|
+
key_ + user_key_len, shared_internal_bytes_len,
|
|
624
|
+
non_shared_len < kNumInternalBytes,
|
|
625
|
+
shared_internal_bytes_len + non_shared_len - kNumInternalBytes,
|
|
626
|
+
kTsMin, key_parts_with_ts, &ts_added);
|
|
627
|
+
MaybeAddKeyPartsWithTimestamp(non_shared_data, non_shared_len,
|
|
628
|
+
non_shared_len >= kNumInternalBytes,
|
|
629
|
+
non_shared_len - kNumInternalBytes, kTsMin,
|
|
630
|
+
key_parts_with_ts, &ts_added);
|
|
631
|
+
assert(ts_added);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
Slice new_key(SliceParts(&key_parts_with_ts.front(),
|
|
635
|
+
static_cast<int>(key_parts_with_ts.size())),
|
|
636
|
+
&key_with_ts);
|
|
637
|
+
SetKey(new_key);
|
|
638
|
+
}
|
|
639
|
+
|
|
507
640
|
Slice SetKey(const Slice& key, bool copy = true) {
|
|
508
641
|
// is_user_key_ expected to be set already via SetIsUserKey
|
|
509
642
|
return SetKeyImpl(key, copy);
|
|
@@ -620,7 +753,7 @@ class IterKey {
|
|
|
620
753
|
const char* key_;
|
|
621
754
|
size_t key_size_;
|
|
622
755
|
size_t buf_size_;
|
|
623
|
-
char space_[
|
|
756
|
+
char space_[39]; // Avoid allocation for short keys
|
|
624
757
|
bool is_user_key_;
|
|
625
758
|
|
|
626
759
|
Slice SetKeyImpl(const Slice& key, bool copy) {
|
|
@@ -661,6 +794,23 @@ class IterKey {
|
|
|
661
794
|
}
|
|
662
795
|
|
|
663
796
|
void EnlargeBuffer(size_t key_size);
|
|
797
|
+
|
|
798
|
+
void MaybeAddKeyPartsWithTimestamp(const char* slice_data,
|
|
799
|
+
const size_t slice_sz, bool add_timestamp,
|
|
800
|
+
const size_t left_sz,
|
|
801
|
+
const std::string& min_timestamp,
|
|
802
|
+
std::vector<Slice>& key_parts,
|
|
803
|
+
bool* ts_added) {
|
|
804
|
+
if (add_timestamp && !*ts_added) {
|
|
805
|
+
assert(slice_sz >= left_sz);
|
|
806
|
+
key_parts.emplace_back(slice_data, left_sz);
|
|
807
|
+
key_parts.emplace_back(min_timestamp);
|
|
808
|
+
key_parts.emplace_back(slice_data + left_sz, slice_sz - left_sz);
|
|
809
|
+
*ts_added = true;
|
|
810
|
+
} else {
|
|
811
|
+
key_parts.emplace_back(slice_data, slice_sz);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
664
814
|
};
|
|
665
815
|
|
|
666
816
|
// Convert from a SliceTransform of user keys, to a SliceTransform of
|
|
@@ -698,8 +848,7 @@ class InternalKeySliceTransform : public SliceTransform {
|
|
|
698
848
|
// Read the key of a record from a write batch.
|
|
699
849
|
// if this record represent the default column family then cf_record
|
|
700
850
|
// must be passed as false, otherwise it must be passed as true.
|
|
701
|
-
|
|
702
|
-
bool cf_record);
|
|
851
|
+
bool ReadKeyFromWriteBatchEntry(Slice* input, Slice* key, bool cf_record);
|
|
703
852
|
|
|
704
853
|
// Read record from a write batch piece from input.
|
|
705
854
|
// tag, column_family, key, value and blob are return values. Callers own the
|
|
@@ -708,9 +857,9 @@ extern bool ReadKeyFromWriteBatchEntry(Slice* input, Slice* key,
|
|
|
708
857
|
// input will be advanced to after the record.
|
|
709
858
|
// If user-defined timestamp is enabled for a column family, then the `key`
|
|
710
859
|
// resulting from this call will include timestamp.
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
860
|
+
Status ReadRecordFromWriteBatch(Slice* input, char* tag,
|
|
861
|
+
uint32_t* column_family, Slice* key,
|
|
862
|
+
Slice* value, Slice* blob, Slice* xid);
|
|
714
863
|
|
|
715
864
|
// When user call DeleteRange() to delete a range of keys,
|
|
716
865
|
// we will store a serialized RangeTombstone in MemTable and SST.
|
|
@@ -178,6 +178,79 @@ TEST_F(FormatTest, IterKeyOperation) {
|
|
|
178
178
|
"abcdefghijklmnopqrstuvwxyz"));
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
+
TEST_F(FormatTest, IterKeyWithTimestampOperation) {
|
|
182
|
+
IterKey k;
|
|
183
|
+
k.SetUserKey("");
|
|
184
|
+
const char p[] = "abcdefghijklmnopqrstuvwxyz";
|
|
185
|
+
const char q[] = "0123456789";
|
|
186
|
+
|
|
187
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
188
|
+
std::string(""));
|
|
189
|
+
|
|
190
|
+
size_t ts_sz = 8;
|
|
191
|
+
std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
|
|
192
|
+
k.TrimAppendWithTimestamp(0, p, 3, ts_sz);
|
|
193
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
194
|
+
"abc" + min_timestamp);
|
|
195
|
+
|
|
196
|
+
k.TrimAppendWithTimestamp(1, p, 3, ts_sz);
|
|
197
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
198
|
+
"aabc" + min_timestamp);
|
|
199
|
+
|
|
200
|
+
k.TrimAppendWithTimestamp(0, p, 26, ts_sz);
|
|
201
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
202
|
+
"abcdefghijklmnopqrstuvwxyz" + min_timestamp);
|
|
203
|
+
|
|
204
|
+
k.TrimAppendWithTimestamp(26, q, 10, ts_sz);
|
|
205
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
206
|
+
"abcdefghijklmnopqrstuvwxyz0123456789" + min_timestamp);
|
|
207
|
+
|
|
208
|
+
k.TrimAppendWithTimestamp(36, q, 1, ts_sz);
|
|
209
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
210
|
+
"abcdefghijklmnopqrstuvwxyz01234567890" + min_timestamp);
|
|
211
|
+
|
|
212
|
+
k.TrimAppendWithTimestamp(26, q, 1, ts_sz);
|
|
213
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
214
|
+
"abcdefghijklmnopqrstuvwxyz0" + min_timestamp);
|
|
215
|
+
|
|
216
|
+
k.TrimAppendWithTimestamp(27, p, 26, ts_sz);
|
|
217
|
+
ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
|
|
218
|
+
"abcdefghijklmnopqrstuvwxyz0"
|
|
219
|
+
"abcdefghijklmnopqrstuvwxyz" +
|
|
220
|
+
min_timestamp);
|
|
221
|
+
// IterKey holds an internal key, the last 8 bytes hold the key footer, the
|
|
222
|
+
// timestamp is expected to be added before the key footer.
|
|
223
|
+
std::string key_without_ts = "keywithoutts";
|
|
224
|
+
k.SetInternalKey(key_without_ts + min_timestamp + "internal");
|
|
225
|
+
|
|
226
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
227
|
+
key_without_ts + min_timestamp + "internal");
|
|
228
|
+
k.TrimAppendWithTimestamp(0, p, 10, ts_sz);
|
|
229
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
230
|
+
"ab" + min_timestamp + "cdefghij");
|
|
231
|
+
|
|
232
|
+
k.TrimAppendWithTimestamp(1, p, 8, ts_sz);
|
|
233
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
234
|
+
"a" + min_timestamp + "abcdefgh");
|
|
235
|
+
|
|
236
|
+
k.TrimAppendWithTimestamp(9, p, 3, ts_sz);
|
|
237
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
238
|
+
"aabc" + min_timestamp + "defghabc");
|
|
239
|
+
|
|
240
|
+
k.TrimAppendWithTimestamp(10, q, 10, ts_sz);
|
|
241
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
242
|
+
"aabcdefgha01" + min_timestamp + "23456789");
|
|
243
|
+
|
|
244
|
+
k.TrimAppendWithTimestamp(20, q, 1, ts_sz);
|
|
245
|
+
ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
246
|
+
"aabcdefgha012" + min_timestamp + "34567890");
|
|
247
|
+
|
|
248
|
+
k.TrimAppendWithTimestamp(21, p, 26, ts_sz);
|
|
249
|
+
ASSERT_EQ(
|
|
250
|
+
std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
|
|
251
|
+
"aabcdefgha01234567890abcdefghijklmnopqr" + min_timestamp + "stuvwxyz");
|
|
252
|
+
}
|
|
253
|
+
|
|
181
254
|
TEST_F(FormatTest, UpdateInternalKey) {
|
|
182
255
|
std::string user_key("abcdefghijklmnopqrstuvwxyz");
|
|
183
256
|
uint64_t new_seq = 0x123456;
|
|
@@ -204,6 +277,62 @@ TEST_F(FormatTest, RangeTombstoneSerializeEndKey) {
|
|
|
204
277
|
ASSERT_LT(cmp.Compare(t.SerializeEndKey(), k), 0);
|
|
205
278
|
}
|
|
206
279
|
|
|
280
|
+
TEST_F(FormatTest, PadInternalKeyWithMinTimestamp) {
|
|
281
|
+
std::string orig_user_key = "foo";
|
|
282
|
+
std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
|
|
283
|
+
size_t ts_sz = 8;
|
|
284
|
+
|
|
285
|
+
std::string key_buf;
|
|
286
|
+
PadInternalKeyWithMinTimestamp(&key_buf, orig_internal_key, ts_sz);
|
|
287
|
+
ParsedInternalKey key_with_timestamp;
|
|
288
|
+
Slice in(key_buf);
|
|
289
|
+
ASSERT_OK(ParseInternalKey(in, &key_with_timestamp, true /*log_err_key*/));
|
|
290
|
+
|
|
291
|
+
std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
|
|
292
|
+
ASSERT_EQ(orig_user_key + min_timestamp, key_with_timestamp.user_key);
|
|
293
|
+
ASSERT_EQ(100, key_with_timestamp.sequence);
|
|
294
|
+
ASSERT_EQ(kTypeValue, key_with_timestamp.type);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
TEST_F(FormatTest, StripTimestampFromInternalKey) {
|
|
298
|
+
std::string orig_user_key = "foo";
|
|
299
|
+
size_t ts_sz = 8;
|
|
300
|
+
std::string timestamp(ts_sz, static_cast<unsigned char>(0));
|
|
301
|
+
orig_user_key.append(timestamp.data(), timestamp.size());
|
|
302
|
+
std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
|
|
303
|
+
|
|
304
|
+
std::string key_buf;
|
|
305
|
+
StripTimestampFromInternalKey(&key_buf, orig_internal_key, ts_sz);
|
|
306
|
+
ParsedInternalKey key_without_timestamp;
|
|
307
|
+
Slice in(key_buf);
|
|
308
|
+
ASSERT_OK(ParseInternalKey(in, &key_without_timestamp, true /*log_err_key*/));
|
|
309
|
+
|
|
310
|
+
ASSERT_EQ("foo", key_without_timestamp.user_key);
|
|
311
|
+
ASSERT_EQ(100, key_without_timestamp.sequence);
|
|
312
|
+
ASSERT_EQ(kTypeValue, key_without_timestamp.type);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
TEST_F(FormatTest, ReplaceInternalKeyWithMinTimestamp) {
|
|
316
|
+
std::string orig_user_key = "foo";
|
|
317
|
+
size_t ts_sz = 8;
|
|
318
|
+
orig_user_key.append(ts_sz, static_cast<unsigned char>(1));
|
|
319
|
+
std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
|
|
320
|
+
|
|
321
|
+
std::string key_buf;
|
|
322
|
+
ReplaceInternalKeyWithMinTimestamp(&key_buf, orig_internal_key, ts_sz);
|
|
323
|
+
ParsedInternalKey new_key;
|
|
324
|
+
Slice in(key_buf);
|
|
325
|
+
ASSERT_OK(ParseInternalKey(in, &new_key, true /*log_err_key*/));
|
|
326
|
+
|
|
327
|
+
std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
|
|
328
|
+
size_t ukey_diff_offset = new_key.user_key.difference_offset(orig_user_key);
|
|
329
|
+
ASSERT_EQ(min_timestamp,
|
|
330
|
+
Slice(new_key.user_key.data() + ukey_diff_offset, ts_sz));
|
|
331
|
+
ASSERT_EQ(orig_user_key.size(), new_key.user_key.size());
|
|
332
|
+
ASSERT_EQ(100, new_key.sequence);
|
|
333
|
+
ASSERT_EQ(kTypeValue, new_key.type);
|
|
334
|
+
}
|
|
335
|
+
|
|
207
336
|
} // namespace ROCKSDB_NAMESPACE
|
|
208
337
|
|
|
209
338
|
int main(int argc, char** argv) {
|
|
@@ -279,6 +279,7 @@ const Status& ErrorHandler::HandleKnownErrors(const Status& bg_err,
|
|
|
279
279
|
|
|
280
280
|
if (bg_error_stats_ != nullptr) {
|
|
281
281
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
|
|
282
|
+
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
|
|
282
283
|
}
|
|
283
284
|
ROCKS_LOG_INFO(db_options_.info_log,
|
|
284
285
|
"ErrorHandler: Set regular background error\n");
|
|
@@ -416,7 +417,11 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
|
|
|
416
417
|
CheckAndSetRecoveryAndBGError(bg_err);
|
|
417
418
|
if (bg_error_stats_ != nullptr) {
|
|
418
419
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
|
|
420
|
+
RecordTick(bg_error_stats_.get(),
|
|
421
|
+
ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
|
|
419
422
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
|
|
423
|
+
RecordTick(bg_error_stats_.get(),
|
|
424
|
+
ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
|
|
420
425
|
}
|
|
421
426
|
ROCKS_LOG_INFO(
|
|
422
427
|
db_options_.info_log,
|
|
@@ -443,9 +448,15 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
|
|
|
443
448
|
&auto_recovery);
|
|
444
449
|
if (bg_error_stats_ != nullptr) {
|
|
445
450
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
|
|
451
|
+
RecordTick(bg_error_stats_.get(),
|
|
452
|
+
ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
|
|
446
453
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
|
|
454
|
+
RecordTick(bg_error_stats_.get(),
|
|
455
|
+
ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
|
|
447
456
|
RecordTick(bg_error_stats_.get(),
|
|
448
457
|
ERROR_HANDLER_BG_RETRYABLE_IO_ERROR_COUNT);
|
|
458
|
+
RecordTick(bg_error_stats_.get(),
|
|
459
|
+
ERROR_HANDLER_BG_RETRYABLE_IO_ERROR_COUNT_MISSPELLED);
|
|
449
460
|
}
|
|
450
461
|
ROCKS_LOG_INFO(db_options_.info_log,
|
|
451
462
|
"ErrorHandler: Set background retryable IO error\n");
|
|
@@ -486,6 +497,8 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
|
|
|
486
497
|
} else {
|
|
487
498
|
if (bg_error_stats_ != nullptr) {
|
|
488
499
|
RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
|
|
500
|
+
RecordTick(bg_error_stats_.get(),
|
|
501
|
+
ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
|
|
489
502
|
}
|
|
490
503
|
// HandleKnownErrors() will use recovery_error_, so ignore
|
|
491
504
|
// recovery_io_error_.
|
|
@@ -640,6 +653,7 @@ const Status& ErrorHandler::StartRecoverFromRetryableBGIOError(
|
|
|
640
653
|
}
|
|
641
654
|
|
|
642
655
|
recovery_in_prog_ = true;
|
|
656
|
+
TEST_SYNC_POINT("StartRecoverFromRetryableBGIOError::in_progress");
|
|
643
657
|
recovery_thread_.reset(
|
|
644
658
|
new port::Thread(&ErrorHandler::RecoverFromRetryableBGIOError, this));
|
|
645
659
|
|
|
@@ -654,6 +668,7 @@ const Status& ErrorHandler::StartRecoverFromRetryableBGIOError(
|
|
|
654
668
|
// mutex is released.
|
|
655
669
|
void ErrorHandler::RecoverFromRetryableBGIOError() {
|
|
656
670
|
TEST_SYNC_POINT("RecoverFromRetryableBGIOError:BeforeStart");
|
|
671
|
+
TEST_SYNC_POINT("RecoverFromRetryableBGIOError:BeforeStart2");
|
|
657
672
|
InstrumentedMutexLock l(db_mutex_);
|
|
658
673
|
if (end_recovery_) {
|
|
659
674
|
EventHelpers::NotifyOnErrorRecoveryEnd(db_options_.listeners, bg_error_,
|
|
@@ -662,6 +677,7 @@ void ErrorHandler::RecoverFromRetryableBGIOError() {
|
|
|
662
677
|
return;
|
|
663
678
|
}
|
|
664
679
|
DBRecoverContext context = recover_context_;
|
|
680
|
+
context.flush_after_recovery = true;
|
|
665
681
|
int resume_count = db_options_.max_bgerror_resume_count;
|
|
666
682
|
uint64_t wait_interval = db_options_.bgerror_resume_retry_interval;
|
|
667
683
|
uint64_t retry_count = 0;
|
|
@@ -19,10 +19,13 @@ class DBImpl;
|
|
|
19
19
|
// FlushReason, which tells the flush job why this flush is called.
|
|
20
20
|
struct DBRecoverContext {
|
|
21
21
|
FlushReason flush_reason;
|
|
22
|
+
bool flush_after_recovery;
|
|
22
23
|
|
|
23
|
-
DBRecoverContext()
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
DBRecoverContext()
|
|
25
|
+
: flush_reason(FlushReason::kErrorRecovery),
|
|
26
|
+
flush_after_recovery(false) {}
|
|
27
|
+
DBRecoverContext(FlushReason reason)
|
|
28
|
+
: flush_reason(reason), flush_after_recovery(false) {}
|
|
26
29
|
};
|
|
27
30
|
|
|
28
31
|
class ErrorHandler {
|
|
@@ -2565,8 +2565,8 @@ TEST_F(DBErrorHandlingFSTest, AtomicFlushReadError) {
|
|
|
2565
2565
|
s = dbfull()->TEST_GetBGError();
|
|
2566
2566
|
ASSERT_OK(s);
|
|
2567
2567
|
|
|
2568
|
-
TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
|
|
2569
|
-
|
|
2568
|
+
ASSERT_OK(TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
|
|
2569
|
+
GetDefaultOptions()));
|
|
2570
2570
|
ASSERT_EQ("val", Get(Key(0)));
|
|
2571
2571
|
}
|
|
2572
2572
|
|
|
@@ -2606,8 +2606,8 @@ TEST_F(DBErrorHandlingFSTest, AtomicFlushNoSpaceError) {
|
|
|
2606
2606
|
s = dbfull()->TEST_GetBGError();
|
|
2607
2607
|
ASSERT_OK(s);
|
|
2608
2608
|
|
|
2609
|
-
TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
|
|
2610
|
-
|
|
2609
|
+
ASSERT_OK(TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
|
|
2610
|
+
GetDefaultOptions()));
|
|
2611
2611
|
ASSERT_EQ("val", Get(Key(0)));
|
|
2612
2612
|
}
|
|
2613
2613
|
|
|
@@ -122,6 +122,8 @@ void EventHelpers::LogAndNotifyTableFileCreationFinished(
|
|
|
122
122
|
<< "column_family_name" << table_properties.column_family_name
|
|
123
123
|
<< "column_family_id" << table_properties.column_family_id
|
|
124
124
|
<< "comparator" << table_properties.comparator_name
|
|
125
|
+
<< "user_defined_timestamps_persisted"
|
|
126
|
+
<< table_properties.user_defined_timestamps_persisted
|
|
125
127
|
<< "merge_operator" << table_properties.merge_operator_name
|
|
126
128
|
<< "prefix_extractor_name"
|
|
127
129
|
<< table_properties.prefix_extractor_name << "property_collectors"
|
|
@@ -238,6 +240,8 @@ void EventHelpers::NotifyOnErrorRecoveryEnd(
|
|
|
238
240
|
info.new_bg_error.PermitUncheckedError();
|
|
239
241
|
}
|
|
240
242
|
db_mutex->Lock();
|
|
243
|
+
} else {
|
|
244
|
+
old_bg_error.PermitUncheckedError();
|
|
241
245
|
}
|
|
242
246
|
}
|
|
243
247
|
|
|
@@ -102,7 +102,8 @@ Status UpdateManifestForFilesState(
|
|
|
102
102
|
lf->oldest_blob_file_number, lf->oldest_ancester_time,
|
|
103
103
|
lf->file_creation_time, lf->epoch_number, lf->file_checksum,
|
|
104
104
|
lf->file_checksum_func_name, lf->unique_id,
|
|
105
|
-
lf->compensated_range_deletion_size, lf->tail_size
|
|
105
|
+
lf->compensated_range_deletion_size, lf->tail_size,
|
|
106
|
+
lf->user_defined_timestamps_persisted);
|
|
106
107
|
}
|
|
107
108
|
}
|
|
108
109
|
} else {
|
|
@@ -1346,7 +1346,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestionWithRangeDeletions) {
|
|
|
1346
1346
|
// range del [0, 50) in L6 file, [50, 100) in L0 file, [100, 150) in memtable
|
|
1347
1347
|
for (int i = 0; i < 3; i++) {
|
|
1348
1348
|
if (i != 0) {
|
|
1349
|
-
db_->Flush(FlushOptions());
|
|
1349
|
+
ASSERT_OK(db_->Flush(FlushOptions()));
|
|
1350
1350
|
if (i == 1) {
|
|
1351
1351
|
MoveFilesToLevel(kNumLevels - 1);
|
|
1352
1352
|
}
|
|
@@ -1747,11 +1747,11 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileAfterDBPut) {
|
|
|
1747
1747
|
Options options = CurrentOptions();
|
|
1748
1748
|
|
|
1749
1749
|
ASSERT_OK(Put("k", "a"));
|
|
1750
|
-
Flush();
|
|
1750
|
+
ASSERT_OK(Flush());
|
|
1751
1751
|
ASSERT_OK(Put("k", "a"));
|
|
1752
|
-
Flush();
|
|
1752
|
+
ASSERT_OK(Flush());
|
|
1753
1753
|
ASSERT_OK(Put("k", "a"));
|
|
1754
|
-
Flush();
|
|
1754
|
+
ASSERT_OK(Flush());
|
|
1755
1755
|
SstFileWriter sst_file_writer(EnvOptions(), options);
|
|
1756
1756
|
|
|
1757
1757
|
// Current file size should be 0 after sst_file_writer init and before open a
|
|
@@ -217,6 +217,8 @@ Status ExternalSstFileIngestionJob::Prepare(
|
|
|
217
217
|
std::string requested_checksum_func_name;
|
|
218
218
|
// TODO: rate limit file reads for checksum calculation during file
|
|
219
219
|
// ingestion.
|
|
220
|
+
// TODO: plumb Env::IOActivity
|
|
221
|
+
ReadOptions ro;
|
|
220
222
|
IOStatus io_s = GenerateOneFileChecksum(
|
|
221
223
|
fs_.get(), files_to_ingest_[i].internal_file_path,
|
|
222
224
|
db_options_.file_checksum_gen_factory.get(),
|
|
@@ -224,8 +226,8 @@ Status ExternalSstFileIngestionJob::Prepare(
|
|
|
224
226
|
&generated_checksum_func_name,
|
|
225
227
|
ingestion_options_.verify_checksums_readahead_size,
|
|
226
228
|
db_options_.allow_mmap_reads, io_tracer_,
|
|
227
|
-
db_options_.rate_limiter.get(),
|
|
228
|
-
|
|
229
|
+
db_options_.rate_limiter.get(), ro, db_options_.stats,
|
|
230
|
+
db_options_.clock);
|
|
229
231
|
if (!io_s.ok()) {
|
|
230
232
|
status = io_s;
|
|
231
233
|
ROCKS_LOG_WARN(db_options_.info_log,
|
|
@@ -348,7 +350,7 @@ Status ExternalSstFileIngestionJob::NeedsFlush(bool* flush_needed,
|
|
|
348
350
|
std::string end_str;
|
|
349
351
|
AppendUserKeyWithMaxTimestamp(
|
|
350
352
|
&begin_str, file_to_ingest.smallest_internal_key.user_key(), ts_sz);
|
|
351
|
-
|
|
353
|
+
AppendUserKeyWithMinTimestamp(
|
|
352
354
|
&end_str, file_to_ingest.largest_internal_key.user_key(), ts_sz);
|
|
353
355
|
keys.emplace_back(std::move(begin_str));
|
|
354
356
|
keys.emplace_back(std::move(end_str));
|
|
@@ -482,7 +484,9 @@ Status ExternalSstFileIngestionJob::Run() {
|
|
|
482
484
|
ingestion_options_.ingest_behind
|
|
483
485
|
? kReservedEpochNumberForFileIngestedBehind
|
|
484
486
|
: cfd_->NewEpochNumber(),
|
|
485
|
-
f.file_checksum, f.file_checksum_func_name, f.unique_id, 0, tail_size
|
|
487
|
+
f.file_checksum, f.file_checksum_func_name, f.unique_id, 0, tail_size,
|
|
488
|
+
static_cast<bool>(
|
|
489
|
+
f.table_properties.user_defined_timestamps_persisted));
|
|
486
490
|
f_metadata.temperature = f.file_temperature;
|
|
487
491
|
edit_.AddFile(f.picked_level, f_metadata);
|
|
488
492
|
}
|
|
@@ -684,6 +688,9 @@ Status ExternalSstFileIngestionJob::GetIngestedFileInfo(
|
|
|
684
688
|
sst_file_reader.reset(new RandomAccessFileReader(
|
|
685
689
|
std::move(sst_file), external_file, nullptr /*Env*/, io_tracer_));
|
|
686
690
|
|
|
691
|
+
// TODO(yuzhangyu): User-defined timestamps doesn't support external sst file
|
|
692
|
+
// ingestion. Pass in the correct `user_defined_timestamps_persisted` flag
|
|
693
|
+
// for creating `TableReaderOptions` when the support is there.
|
|
687
694
|
status = cfd_->ioptions()->table_factory->NewTableReader(
|
|
688
695
|
TableReaderOptions(
|
|
689
696
|
*cfd_->ioptions(), sv->mutable_cf_options.prefix_extractor,
|
|
@@ -708,9 +715,9 @@ Status ExternalSstFileIngestionJob::GetIngestedFileInfo(
|
|
|
708
715
|
ro.readahead_size = ingestion_options_.verify_checksums_readahead_size;
|
|
709
716
|
status = table_reader->VerifyChecksum(
|
|
710
717
|
ro, TableReaderCaller::kExternalSSTIngestion);
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
718
|
+
if (!status.ok()) {
|
|
719
|
+
return status;
|
|
720
|
+
}
|
|
714
721
|
}
|
|
715
722
|
|
|
716
723
|
// Get the external file properties
|
|
@@ -1053,13 +1060,15 @@ IOStatus ExternalSstFileIngestionJob::GenerateChecksumForIngestedFile(
|
|
|
1053
1060
|
std::string file_checksum_func_name;
|
|
1054
1061
|
std::string requested_checksum_func_name;
|
|
1055
1062
|
// TODO: rate limit file reads for checksum calculation during file ingestion.
|
|
1063
|
+
// TODO: plumb Env::IOActivity
|
|
1064
|
+
ReadOptions ro;
|
|
1056
1065
|
IOStatus io_s = GenerateOneFileChecksum(
|
|
1057
1066
|
fs_.get(), file_to_ingest->internal_file_path,
|
|
1058
1067
|
db_options_.file_checksum_gen_factory.get(), requested_checksum_func_name,
|
|
1059
1068
|
&file_checksum, &file_checksum_func_name,
|
|
1060
1069
|
ingestion_options_.verify_checksums_readahead_size,
|
|
1061
1070
|
db_options_.allow_mmap_reads, io_tracer_, db_options_.rate_limiter.get(),
|
|
1062
|
-
|
|
1071
|
+
ro, db_options_.stats, db_options_.clock);
|
|
1063
1072
|
if (!io_s.ok()) {
|
|
1064
1073
|
return io_s;
|
|
1065
1074
|
}
|