@nxtedition/rocksdb 7.1.20 → 7.1.21
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 +13 -6
- package/deps/rocksdb/rocksdb/Makefile +1 -1
- package/deps/rocksdb/rocksdb/TARGETS +2 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
- package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
- package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
- package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
- package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
- package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
- package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
- package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
- package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
- package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
- package/deps/rocksdb/rocksdb/src.mk +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
- package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
- package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
- package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
- package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
- package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
- package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
- package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
- package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
- package/index.js +12 -4
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -84,6 +84,7 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
|
|
|
84
84
|
// for use in flush_current_tombstones.
|
|
85
85
|
std::set<ParsedInternalKey, ParsedInternalKeyComparator> cur_end_keys(cmp);
|
|
86
86
|
|
|
87
|
+
size_t ts_sz = icmp.user_comparator()->timestamp_size();
|
|
87
88
|
// Given the next start key in unfragmented_tombstones,
|
|
88
89
|
// flush_current_tombstones writes every tombstone fragment that starts
|
|
89
90
|
// and ends with a key before next_start_key, and starts with a key greater
|
|
@@ -93,12 +94,14 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
|
|
|
93
94
|
bool reached_next_start_key = false;
|
|
94
95
|
for (; it != cur_end_keys.end() && !reached_next_start_key; ++it) {
|
|
95
96
|
Slice cur_end_key = it->user_key;
|
|
96
|
-
if (icmp.user_comparator()->
|
|
97
|
+
if (icmp.user_comparator()->CompareWithoutTimestamp(cur_start_key,
|
|
98
|
+
cur_end_key) == 0) {
|
|
97
99
|
// Empty tombstone.
|
|
98
100
|
continue;
|
|
99
101
|
}
|
|
100
|
-
if (icmp.user_comparator()->
|
|
101
|
-
|
|
102
|
+
if (icmp.user_comparator()->CompareWithoutTimestamp(next_start_key,
|
|
103
|
+
cur_end_key) <= 0) {
|
|
104
|
+
// All the end keys in [it, cur_end_keys.end()) are after
|
|
102
105
|
// next_start_key, so the tombstones they represent can be used in
|
|
103
106
|
// fragments that start with keys greater than or equal to
|
|
104
107
|
// next_start_key. However, the end keys we already passed will not be
|
|
@@ -115,22 +118,38 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
|
|
|
115
118
|
// Flush a range tombstone fragment [cur_start_key, cur_end_key), which
|
|
116
119
|
// should not overlap with the last-flushed tombstone fragment.
|
|
117
120
|
assert(tombstones_.empty() ||
|
|
118
|
-
icmp.user_comparator()->
|
|
119
|
-
|
|
121
|
+
icmp.user_comparator()->CompareWithoutTimestamp(
|
|
122
|
+
tombstones_.back().end_key, cur_start_key) <= 0);
|
|
120
123
|
|
|
121
124
|
// Sort the sequence numbers of the tombstones being fragmented in
|
|
122
125
|
// descending order, and then flush them in that order.
|
|
123
126
|
autovector<SequenceNumber> seqnums_to_flush;
|
|
127
|
+
autovector<Slice> timestamps_to_flush;
|
|
124
128
|
for (auto flush_it = it; flush_it != cur_end_keys.end(); ++flush_it) {
|
|
125
129
|
seqnums_to_flush.push_back(flush_it->sequence);
|
|
130
|
+
if (ts_sz) {
|
|
131
|
+
timestamps_to_flush.push_back(
|
|
132
|
+
ExtractTimestampFromUserKey(flush_it->user_key, ts_sz));
|
|
133
|
+
}
|
|
126
134
|
}
|
|
135
|
+
// TODO: bind the two sorting together to be more efficient
|
|
127
136
|
std::sort(seqnums_to_flush.begin(), seqnums_to_flush.end(),
|
|
128
137
|
std::greater<SequenceNumber>());
|
|
138
|
+
if (ts_sz) {
|
|
139
|
+
std::sort(timestamps_to_flush.begin(), timestamps_to_flush.end(),
|
|
140
|
+
[icmp](const Slice& ts1, const Slice& ts2) {
|
|
141
|
+
return icmp.user_comparator()->CompareTimestamp(ts1, ts2) >
|
|
142
|
+
0;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
129
145
|
|
|
130
146
|
size_t start_idx = tombstone_seqs_.size();
|
|
131
147
|
size_t end_idx = start_idx + seqnums_to_flush.size();
|
|
132
148
|
|
|
133
|
-
|
|
149
|
+
// If user-defined timestamp is enabled, we should not drop tombstones
|
|
150
|
+
// from any snapshot stripe. Garbage collection of range tombstones
|
|
151
|
+
// happens in CompactionOutputs::AddRangeDels().
|
|
152
|
+
if (for_compaction && ts_sz == 0) {
|
|
134
153
|
// Drop all tombstone seqnums that are not preserved by a snapshot.
|
|
135
154
|
SequenceNumber next_snapshot = kMaxSequenceNumber;
|
|
136
155
|
for (auto seq : seqnums_to_flush) {
|
|
@@ -155,10 +174,33 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
|
|
|
155
174
|
tombstone_seqs_.insert(tombstone_seqs_.end(), seqnums_to_flush.begin(),
|
|
156
175
|
seqnums_to_flush.end());
|
|
157
176
|
seq_set_.insert(seqnums_to_flush.begin(), seqnums_to_flush.end());
|
|
177
|
+
if (ts_sz) {
|
|
178
|
+
tombstone_timestamps_.insert(tombstone_timestamps_.end(),
|
|
179
|
+
timestamps_to_flush.begin(),
|
|
180
|
+
timestamps_to_flush.end());
|
|
181
|
+
}
|
|
158
182
|
}
|
|
159
183
|
|
|
160
184
|
assert(start_idx < end_idx);
|
|
161
|
-
|
|
185
|
+
if (ts_sz) {
|
|
186
|
+
std::string start_key_with_max_ts;
|
|
187
|
+
AppendUserKeyWithMaxTimestamp(&start_key_with_max_ts, cur_start_key,
|
|
188
|
+
ts_sz);
|
|
189
|
+
pinned_slices_.emplace_back(std::move(start_key_with_max_ts));
|
|
190
|
+
Slice start_key = pinned_slices_.back();
|
|
191
|
+
|
|
192
|
+
std::string end_key_with_max_ts;
|
|
193
|
+
AppendUserKeyWithMaxTimestamp(&end_key_with_max_ts, cur_end_key, ts_sz);
|
|
194
|
+
pinned_slices_.emplace_back(std::move(end_key_with_max_ts));
|
|
195
|
+
Slice end_key = pinned_slices_.back();
|
|
196
|
+
|
|
197
|
+
// RangeTombstoneStack expects start_key and end_key to have max
|
|
198
|
+
// timestamp.
|
|
199
|
+
tombstones_.emplace_back(start_key, end_key, start_idx, end_idx);
|
|
200
|
+
} else {
|
|
201
|
+
tombstones_.emplace_back(cur_start_key, cur_end_key, start_idx,
|
|
202
|
+
end_idx);
|
|
203
|
+
}
|
|
162
204
|
|
|
163
205
|
cur_start_key = cur_end_key;
|
|
164
206
|
}
|
|
@@ -193,8 +235,9 @@ void FragmentedRangeTombstoneList::FragmentTombstones(
|
|
|
193
235
|
tombstone_end_key.size());
|
|
194
236
|
tombstone_end_key = pinned_slices_.back();
|
|
195
237
|
}
|
|
196
|
-
if (!cur_end_keys.empty() &&
|
|
197
|
-
|
|
238
|
+
if (!cur_end_keys.empty() &&
|
|
239
|
+
icmp.user_comparator()->CompareWithoutTimestamp(
|
|
240
|
+
cur_start_key, tombstone_start_key) != 0) {
|
|
198
241
|
// The start key has changed. Flush all tombstones that start before
|
|
199
242
|
// this new start key.
|
|
200
243
|
flush_current_tombstones(tombstone_start_key);
|
|
@@ -223,14 +266,15 @@ bool FragmentedRangeTombstoneList::ContainsRange(SequenceNumber lower,
|
|
|
223
266
|
FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
224
267
|
const FragmentedRangeTombstoneList* tombstones,
|
|
225
268
|
const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
|
|
226
|
-
SequenceNumber _lower_bound)
|
|
269
|
+
const Slice* ts_upper_bound, SequenceNumber _lower_bound)
|
|
227
270
|
: tombstone_start_cmp_(icmp.user_comparator()),
|
|
228
271
|
tombstone_end_cmp_(icmp.user_comparator()),
|
|
229
272
|
icmp_(&icmp),
|
|
230
273
|
ucmp_(icmp.user_comparator()),
|
|
231
274
|
tombstones_(tombstones),
|
|
232
275
|
upper_bound_(_upper_bound),
|
|
233
|
-
lower_bound_(_lower_bound)
|
|
276
|
+
lower_bound_(_lower_bound),
|
|
277
|
+
ts_upper_bound_(ts_upper_bound) {
|
|
234
278
|
assert(tombstones_ != nullptr);
|
|
235
279
|
Invalidate();
|
|
236
280
|
}
|
|
@@ -238,7 +282,7 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
|
238
282
|
FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
239
283
|
const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
|
|
240
284
|
const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
|
|
241
|
-
SequenceNumber _lower_bound)
|
|
285
|
+
const Slice* ts_upper_bound, SequenceNumber _lower_bound)
|
|
242
286
|
: tombstone_start_cmp_(icmp.user_comparator()),
|
|
243
287
|
tombstone_end_cmp_(icmp.user_comparator()),
|
|
244
288
|
icmp_(&icmp),
|
|
@@ -246,7 +290,8 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
|
246
290
|
tombstones_ref_(tombstones),
|
|
247
291
|
tombstones_(tombstones_ref_.get()),
|
|
248
292
|
upper_bound_(_upper_bound),
|
|
249
|
-
lower_bound_(_lower_bound)
|
|
293
|
+
lower_bound_(_lower_bound),
|
|
294
|
+
ts_upper_bound_(ts_upper_bound) {
|
|
250
295
|
assert(tombstones_ != nullptr);
|
|
251
296
|
Invalidate();
|
|
252
297
|
}
|
|
@@ -254,7 +299,7 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
|
254
299
|
FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
255
300
|
const std::shared_ptr<FragmentedRangeTombstoneListCache>& tombstones_cache,
|
|
256
301
|
const InternalKeyComparator& icmp, SequenceNumber _upper_bound,
|
|
257
|
-
SequenceNumber _lower_bound)
|
|
302
|
+
const Slice* ts_upper_bound, SequenceNumber _lower_bound)
|
|
258
303
|
: tombstone_start_cmp_(icmp.user_comparator()),
|
|
259
304
|
tombstone_end_cmp_(icmp.user_comparator()),
|
|
260
305
|
icmp_(&icmp),
|
|
@@ -264,6 +309,11 @@ FragmentedRangeTombstoneIterator::FragmentedRangeTombstoneIterator(
|
|
|
264
309
|
upper_bound_(_upper_bound),
|
|
265
310
|
lower_bound_(_lower_bound) {
|
|
266
311
|
assert(tombstones_ != nullptr);
|
|
312
|
+
if (!ts_upper_bound || ts_upper_bound->empty()) {
|
|
313
|
+
ts_upper_bound_ = nullptr;
|
|
314
|
+
} else {
|
|
315
|
+
ts_upper_bound_ = ts_upper_bound;
|
|
316
|
+
}
|
|
267
317
|
Invalidate();
|
|
268
318
|
}
|
|
269
319
|
|
|
@@ -278,9 +328,7 @@ void FragmentedRangeTombstoneIterator::SeekToTopFirst() {
|
|
|
278
328
|
return;
|
|
279
329
|
}
|
|
280
330
|
pos_ = tombstones_->begin();
|
|
281
|
-
|
|
282
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
283
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
331
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
284
332
|
ScanForwardToVisibleTombstone();
|
|
285
333
|
}
|
|
286
334
|
|
|
@@ -295,12 +343,12 @@ void FragmentedRangeTombstoneIterator::SeekToTopLast() {
|
|
|
295
343
|
return;
|
|
296
344
|
}
|
|
297
345
|
pos_ = std::prev(tombstones_->end());
|
|
298
|
-
|
|
299
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
300
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
346
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
301
347
|
ScanBackwardToVisibleTombstone();
|
|
302
348
|
}
|
|
303
349
|
|
|
350
|
+
// @param `target` is a user key, with timestamp if user-defined timestamp is
|
|
351
|
+
// enabled.
|
|
304
352
|
void FragmentedRangeTombstoneIterator::Seek(const Slice& target) {
|
|
305
353
|
if (tombstones_->empty()) {
|
|
306
354
|
Invalidate();
|
|
@@ -328,9 +376,7 @@ void FragmentedRangeTombstoneIterator::SeekToCoveringTombstone(
|
|
|
328
376
|
seq_pos_ = tombstones_->seq_end();
|
|
329
377
|
return;
|
|
330
378
|
}
|
|
331
|
-
|
|
332
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
333
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
379
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
334
380
|
}
|
|
335
381
|
|
|
336
382
|
void FragmentedRangeTombstoneIterator::SeekForPrevToCoveringTombstone(
|
|
@@ -347,9 +393,7 @@ void FragmentedRangeTombstoneIterator::SeekForPrevToCoveringTombstone(
|
|
|
347
393
|
return;
|
|
348
394
|
}
|
|
349
395
|
--pos_;
|
|
350
|
-
|
|
351
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
352
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
396
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
353
397
|
}
|
|
354
398
|
|
|
355
399
|
void FragmentedRangeTombstoneIterator::ScanForwardToVisibleTombstone() {
|
|
@@ -361,9 +405,7 @@ void FragmentedRangeTombstoneIterator::ScanForwardToVisibleTombstone() {
|
|
|
361
405
|
Invalidate();
|
|
362
406
|
return;
|
|
363
407
|
}
|
|
364
|
-
|
|
365
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
366
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
408
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
367
409
|
}
|
|
368
410
|
}
|
|
369
411
|
|
|
@@ -376,9 +418,7 @@ void FragmentedRangeTombstoneIterator::ScanBackwardToVisibleTombstone() {
|
|
|
376
418
|
return;
|
|
377
419
|
}
|
|
378
420
|
--pos_;
|
|
379
|
-
|
|
380
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
381
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
421
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
382
422
|
}
|
|
383
423
|
}
|
|
384
424
|
|
|
@@ -394,9 +434,7 @@ void FragmentedRangeTombstoneIterator::TopNext() {
|
|
|
394
434
|
if (pos_ == tombstones_->end()) {
|
|
395
435
|
return;
|
|
396
436
|
}
|
|
397
|
-
|
|
398
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
399
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
437
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
400
438
|
ScanForwardToVisibleTombstone();
|
|
401
439
|
}
|
|
402
440
|
|
|
@@ -418,9 +456,7 @@ void FragmentedRangeTombstoneIterator::TopPrev() {
|
|
|
418
456
|
return;
|
|
419
457
|
}
|
|
420
458
|
--pos_;
|
|
421
|
-
|
|
422
|
-
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
423
|
-
upper_bound_, std::greater<SequenceNumber>());
|
|
459
|
+
SetMaxVisibleSeqAndTimestamp();
|
|
424
460
|
ScanBackwardToVisibleTombstone();
|
|
425
461
|
}
|
|
426
462
|
|
|
@@ -431,8 +467,10 @@ bool FragmentedRangeTombstoneIterator::Valid() const {
|
|
|
431
467
|
SequenceNumber FragmentedRangeTombstoneIterator::MaxCoveringTombstoneSeqnum(
|
|
432
468
|
const Slice& target_user_key) {
|
|
433
469
|
SeekToCoveringTombstone(target_user_key);
|
|
434
|
-
return ValidPos() && ucmp_->
|
|
435
|
-
|
|
470
|
+
return ValidPos() && ucmp_->CompareWithoutTimestamp(start_key(),
|
|
471
|
+
target_user_key) <= 0
|
|
472
|
+
? seq()
|
|
473
|
+
: 0;
|
|
436
474
|
}
|
|
437
475
|
|
|
438
476
|
std::map<SequenceNumber, std::unique_ptr<FragmentedRangeTombstoneIterator>>
|
|
@@ -449,8 +487,9 @@ FragmentedRangeTombstoneIterator::SplitBySnapshot(
|
|
|
449
487
|
upper = snapshots[i];
|
|
450
488
|
}
|
|
451
489
|
if (tombstones_->ContainsRange(lower, upper)) {
|
|
452
|
-
splits.emplace(upper,
|
|
453
|
-
|
|
490
|
+
splits.emplace(upper,
|
|
491
|
+
std::make_unique<FragmentedRangeTombstoneIterator>(
|
|
492
|
+
tombstones_, *icmp_, upper, ts_upper_bound_, lower));
|
|
454
493
|
}
|
|
455
494
|
lower = upper + 1;
|
|
456
495
|
}
|
|
@@ -33,6 +33,10 @@ struct FragmentedRangeTombstoneList {
|
|
|
33
33
|
// start and end at the same user keys but have different sequence numbers.
|
|
34
34
|
// The members seq_start_idx and seq_end_idx are intended to be parameters to
|
|
35
35
|
// seq_iter().
|
|
36
|
+
// If user-defined timestamp is enabled, `start` and `end` should be user keys
|
|
37
|
+
// with timestamp, and the timestamps are set to max timestamp to be returned
|
|
38
|
+
// by parsed_start_key()/parsed_end_key(). seq_start_idx and seq_end_idx will
|
|
39
|
+
// also be used as parameters to ts_iter().
|
|
36
40
|
struct RangeTombstoneStack {
|
|
37
41
|
RangeTombstoneStack(const Slice& start, const Slice& end, size_t start_idx,
|
|
38
42
|
size_t end_idx)
|
|
@@ -40,12 +44,13 @@ struct FragmentedRangeTombstoneList {
|
|
|
40
44
|
end_key(end),
|
|
41
45
|
seq_start_idx(start_idx),
|
|
42
46
|
seq_end_idx(end_idx) {}
|
|
43
|
-
|
|
44
47
|
Slice start_key;
|
|
45
48
|
Slice end_key;
|
|
46
49
|
size_t seq_start_idx;
|
|
47
50
|
size_t seq_end_idx;
|
|
48
51
|
};
|
|
52
|
+
// Assumes unfragmented_tombstones->key() and unfragmented_tombstones->value()
|
|
53
|
+
// both contain timestamp if enabled.
|
|
49
54
|
FragmentedRangeTombstoneList(
|
|
50
55
|
std::unique_ptr<InternalIterator> unfragmented_tombstones,
|
|
51
56
|
const InternalKeyComparator& icmp, bool for_compaction = false,
|
|
@@ -63,6 +68,10 @@ struct FragmentedRangeTombstoneList {
|
|
|
63
68
|
return std::next(tombstone_seqs_.begin(), idx);
|
|
64
69
|
}
|
|
65
70
|
|
|
71
|
+
std::vector<Slice>::const_iterator ts_iter(size_t idx) const {
|
|
72
|
+
return std::next(tombstone_timestamps_.begin(), idx);
|
|
73
|
+
}
|
|
74
|
+
|
|
66
75
|
std::vector<SequenceNumber>::const_iterator seq_begin() const {
|
|
67
76
|
return tombstone_seqs_.begin();
|
|
68
77
|
}
|
|
@@ -87,8 +96,15 @@ struct FragmentedRangeTombstoneList {
|
|
|
87
96
|
|
|
88
97
|
private:
|
|
89
98
|
// Given an ordered range tombstone iterator unfragmented_tombstones,
|
|
90
|
-
// "fragment" the tombstones into non-overlapping pieces
|
|
91
|
-
// tombstones_
|
|
99
|
+
// "fragment" the tombstones into non-overlapping pieces. Each
|
|
100
|
+
// "non-overlapping piece" is a RangeTombstoneStack in tombstones_, which
|
|
101
|
+
// contains start_key, end_key, and indices that points to sequence numbers
|
|
102
|
+
// (in tombstone_seqs_) and timestamps (in tombstone_timestamps_). If
|
|
103
|
+
// for_compaction is true, then `snapshots` should be provided. Range
|
|
104
|
+
// tombstone fragments are dropped if they are not visible in any snapshot and
|
|
105
|
+
// user-defined timestamp is not enabled. That is, for each snapshot stripe
|
|
106
|
+
// [lower, upper], the range tombstone fragment with largest seqno in [lower,
|
|
107
|
+
// upper] is preserved, and all the other range tombstones are dropped.
|
|
92
108
|
void FragmentTombstones(
|
|
93
109
|
std::unique_ptr<InternalIterator> unfragmented_tombstones,
|
|
94
110
|
const InternalKeyComparator& icmp, bool for_compaction,
|
|
@@ -96,6 +112,7 @@ struct FragmentedRangeTombstoneList {
|
|
|
96
112
|
|
|
97
113
|
std::vector<RangeTombstoneStack> tombstones_;
|
|
98
114
|
std::vector<SequenceNumber> tombstone_seqs_;
|
|
115
|
+
std::vector<Slice> tombstone_timestamps_;
|
|
99
116
|
std::set<SequenceNumber> seq_set_;
|
|
100
117
|
std::list<std::string> pinned_slices_;
|
|
101
118
|
PinnedIteratorsManager pinned_iters_mgr_;
|
|
@@ -117,15 +134,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
117
134
|
FragmentedRangeTombstoneIterator(
|
|
118
135
|
const FragmentedRangeTombstoneList* tombstones,
|
|
119
136
|
const InternalKeyComparator& icmp, SequenceNumber upper_bound,
|
|
120
|
-
SequenceNumber lower_bound = 0);
|
|
137
|
+
const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
|
|
121
138
|
FragmentedRangeTombstoneIterator(
|
|
122
139
|
const std::shared_ptr<const FragmentedRangeTombstoneList>& tombstones,
|
|
123
140
|
const InternalKeyComparator& icmp, SequenceNumber upper_bound,
|
|
124
|
-
SequenceNumber lower_bound = 0);
|
|
141
|
+
const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
|
|
125
142
|
FragmentedRangeTombstoneIterator(
|
|
126
143
|
const std::shared_ptr<FragmentedRangeTombstoneListCache>& tombstones,
|
|
127
144
|
const InternalKeyComparator& icmp, SequenceNumber upper_bound,
|
|
128
|
-
SequenceNumber lower_bound = 0);
|
|
145
|
+
const Slice* ts_upper_bound = nullptr, SequenceNumber lower_bound = 0);
|
|
129
146
|
|
|
130
147
|
void SeekToFirst() override;
|
|
131
148
|
void SeekToLast() override;
|
|
@@ -154,6 +171,8 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
154
171
|
void TopPrev();
|
|
155
172
|
|
|
156
173
|
bool Valid() const override;
|
|
174
|
+
// Note that key() and value() do not return correct timestamp.
|
|
175
|
+
// Caller should call timestamp() to get the current timestamp.
|
|
157
176
|
Slice key() const override {
|
|
158
177
|
MaybePinKey();
|
|
159
178
|
return current_start_key_.Encode();
|
|
@@ -172,11 +191,28 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
172
191
|
}
|
|
173
192
|
|
|
174
193
|
RangeTombstone Tombstone() const {
|
|
194
|
+
assert(Valid());
|
|
195
|
+
if (icmp_->user_comparator()->timestamp_size()) {
|
|
196
|
+
return RangeTombstone(start_key(), end_key(), seq(), timestamp());
|
|
197
|
+
}
|
|
175
198
|
return RangeTombstone(start_key(), end_key(), seq());
|
|
176
199
|
}
|
|
200
|
+
// Note that start_key() and end_key() are not guaranteed to have the
|
|
201
|
+
// correct timestamp. User can call timestamp() to get the correct
|
|
202
|
+
// timestamp().
|
|
177
203
|
Slice start_key() const { return pos_->start_key; }
|
|
178
204
|
Slice end_key() const { return pos_->end_key; }
|
|
179
205
|
SequenceNumber seq() const { return *seq_pos_; }
|
|
206
|
+
Slice timestamp() const {
|
|
207
|
+
// seqno and timestamp are stored in the same order.
|
|
208
|
+
return *tombstones_->ts_iter(seq_pos_ - tombstones_->seq_begin());
|
|
209
|
+
}
|
|
210
|
+
// Current use case is by CompactionRangeDelAggregator to set
|
|
211
|
+
// full_history_ts_low_.
|
|
212
|
+
void SetTimestampUpperBound(const Slice* ts_upper_bound) {
|
|
213
|
+
ts_upper_bound_ = ts_upper_bound;
|
|
214
|
+
}
|
|
215
|
+
|
|
180
216
|
ParsedInternalKey parsed_start_key() const {
|
|
181
217
|
return ParsedInternalKey(pos_->start_key, kMaxSequenceNumber,
|
|
182
218
|
kTypeRangeDeletion);
|
|
@@ -186,6 +222,9 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
186
222
|
kTypeRangeDeletion);
|
|
187
223
|
}
|
|
188
224
|
|
|
225
|
+
// Return the max sequence number of a range tombstone that covers
|
|
226
|
+
// the given user key.
|
|
227
|
+
// If there is no covering tombstone, then 0 is returned.
|
|
189
228
|
SequenceNumber MaxCoveringTombstoneSeqnum(const Slice& user_key);
|
|
190
229
|
|
|
191
230
|
// Splits the iterator into n+1 iterators (where n is the number of
|
|
@@ -218,15 +257,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
218
257
|
|
|
219
258
|
bool operator()(const RangeTombstoneStack& a,
|
|
220
259
|
const RangeTombstoneStack& b) const {
|
|
221
|
-
return cmp->
|
|
260
|
+
return cmp->CompareWithoutTimestamp(a.start_key, b.start_key) < 0;
|
|
222
261
|
}
|
|
223
262
|
|
|
224
263
|
bool operator()(const RangeTombstoneStack& a, const Slice& b) const {
|
|
225
|
-
return cmp->
|
|
264
|
+
return cmp->CompareWithoutTimestamp(a.start_key, b) < 0;
|
|
226
265
|
}
|
|
227
266
|
|
|
228
267
|
bool operator()(const Slice& a, const RangeTombstoneStack& b) const {
|
|
229
|
-
return cmp->
|
|
268
|
+
return cmp->CompareWithoutTimestamp(a, b.start_key) < 0;
|
|
230
269
|
}
|
|
231
270
|
|
|
232
271
|
const Comparator* cmp;
|
|
@@ -237,15 +276,15 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
237
276
|
|
|
238
277
|
bool operator()(const RangeTombstoneStack& a,
|
|
239
278
|
const RangeTombstoneStack& b) const {
|
|
240
|
-
return cmp->
|
|
279
|
+
return cmp->CompareWithoutTimestamp(a.end_key, b.end_key) < 0;
|
|
241
280
|
}
|
|
242
281
|
|
|
243
282
|
bool operator()(const RangeTombstoneStack& a, const Slice& b) const {
|
|
244
|
-
return cmp->
|
|
283
|
+
return cmp->CompareWithoutTimestamp(a.end_key, b) < 0;
|
|
245
284
|
}
|
|
246
285
|
|
|
247
286
|
bool operator()(const Slice& a, const RangeTombstoneStack& b) const {
|
|
248
|
-
return cmp->
|
|
287
|
+
return cmp->CompareWithoutTimestamp(a, b.end_key) < 0;
|
|
249
288
|
}
|
|
250
289
|
|
|
251
290
|
const Comparator* cmp;
|
|
@@ -277,11 +316,38 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
|
|
|
277
316
|
const FragmentedRangeTombstoneList* tombstones_;
|
|
278
317
|
SequenceNumber upper_bound_;
|
|
279
318
|
SequenceNumber lower_bound_;
|
|
319
|
+
// Only consider timestamps <= ts_upper_bound_.
|
|
320
|
+
const Slice* ts_upper_bound_;
|
|
280
321
|
std::vector<RangeTombstoneStack>::const_iterator pos_;
|
|
281
322
|
std::vector<SequenceNumber>::const_iterator seq_pos_;
|
|
282
323
|
mutable std::vector<RangeTombstoneStack>::const_iterator pinned_pos_;
|
|
283
324
|
mutable std::vector<SequenceNumber>::const_iterator pinned_seq_pos_;
|
|
284
325
|
mutable InternalKey current_start_key_;
|
|
326
|
+
|
|
327
|
+
// Check the current RangeTombstoneStack `pos_` against timestamp
|
|
328
|
+
// upper bound `ts_upper_bound_` and sequence number upper bound
|
|
329
|
+
// `upper_bound_`. Update the sequence number (and timestamp) pointer
|
|
330
|
+
// `seq_pos_` to the first valid position satisfying both bounds.
|
|
331
|
+
void SetMaxVisibleSeqAndTimestamp() {
|
|
332
|
+
seq_pos_ = std::lower_bound(tombstones_->seq_iter(pos_->seq_start_idx),
|
|
333
|
+
tombstones_->seq_iter(pos_->seq_end_idx),
|
|
334
|
+
upper_bound_, std::greater<SequenceNumber>());
|
|
335
|
+
if (ts_upper_bound_ && !ts_upper_bound_->empty()) {
|
|
336
|
+
auto ts_pos = std::lower_bound(
|
|
337
|
+
tombstones_->ts_iter(pos_->seq_start_idx),
|
|
338
|
+
tombstones_->ts_iter(pos_->seq_end_idx), *ts_upper_bound_,
|
|
339
|
+
[this](const Slice& s1, const Slice& s2) {
|
|
340
|
+
return ucmp_->CompareTimestamp(s1, s2) > 0;
|
|
341
|
+
});
|
|
342
|
+
auto ts_idx = ts_pos - tombstones_->ts_iter(pos_->seq_start_idx);
|
|
343
|
+
auto seq_idx = seq_pos_ - tombstones_->seq_iter(pos_->seq_start_idx);
|
|
344
|
+
if (seq_idx < ts_idx) {
|
|
345
|
+
// seq and ts are ordered in non-increasing order. Only updates seq_pos_
|
|
346
|
+
// to a larger index for smaller sequence number and timestamp.
|
|
347
|
+
seq_pos_ = tombstones_->seq_iter(pos_->seq_start_idx + ts_idx);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
285
351
|
};
|
|
286
352
|
|
|
287
353
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -549,6 +549,7 @@ TEST_F(RangeTombstoneFragmenterTest, SeekOutOfBounds) {
|
|
|
549
549
|
} // namespace ROCKSDB_NAMESPACE
|
|
550
550
|
|
|
551
551
|
int main(int argc, char** argv) {
|
|
552
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
552
553
|
::testing::InitGoogleTest(&argc, argv);
|
|
553
554
|
return RUN_ALL_TESTS();
|
|
554
555
|
}
|
|
@@ -427,6 +427,7 @@ TEST_F(RepairTest, DbNameContainsTrailingSlash) {
|
|
|
427
427
|
} // namespace ROCKSDB_NAMESPACE
|
|
428
428
|
|
|
429
429
|
int main(int argc, char** argv) {
|
|
430
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
430
431
|
::testing::InitGoogleTest(&argc, argv);
|
|
431
432
|
return RUN_ALL_TESTS();
|
|
432
433
|
}
|