@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
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
#include "db/seqno_to_time_mapping.h"
|
|
10
10
|
#include "port/stack_trace.h"
|
|
11
11
|
#include "rocksdb/iostats_context.h"
|
|
12
|
+
#include "rocksdb/utilities/debug.h"
|
|
12
13
|
#include "test_util/mock_time_env.h"
|
|
13
14
|
|
|
14
15
|
#ifndef ROCKSDB_LITE
|
|
@@ -37,7 +38,7 @@ class SeqnoTimeTest : public DBTestBase {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
// make sure the file is not in cache, otherwise it won't have IO info
|
|
40
|
-
void
|
|
41
|
+
void AssertKeyTemperature(int key_id, Temperature expected_temperature) {
|
|
41
42
|
get_iostats_context()->Reset();
|
|
42
43
|
IOStatsContext* iostats = get_iostats_context();
|
|
43
44
|
std::string result = Get(Key(key_id));
|
|
@@ -101,7 +102,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
|
|
|
101
102
|
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
102
103
|
|
|
103
104
|
// read a random key, which should be hot (kUnknown)
|
|
104
|
-
|
|
105
|
+
AssertKeyTemperature(20, Temperature::kUnknown);
|
|
105
106
|
|
|
106
107
|
// Write more data, but still all hot until the 10th SST, as:
|
|
107
108
|
// write a key every 10 seconds, 100 keys per SST, each SST takes 1000 seconds
|
|
@@ -139,7 +140,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
|
|
|
139
140
|
ASSERT_GT(hot_data_size, 0);
|
|
140
141
|
ASSERT_GT(cold_data_size, 0);
|
|
141
142
|
// the first a few key should be cold
|
|
142
|
-
|
|
143
|
+
AssertKeyTemperature(20, Temperature::kCold);
|
|
143
144
|
|
|
144
145
|
for (int i = 0; i < 30; i++) {
|
|
145
146
|
dbfull()->TEST_WaitForPeridicTaskRun([&] {
|
|
@@ -148,8 +149,8 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
|
|
|
148
149
|
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
149
150
|
|
|
150
151
|
// the hot/cold data cut off range should be between i * 20 + 200 -> 250
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
AssertKeyTemperature(i * 20 + 250, Temperature::kUnknown);
|
|
153
|
+
AssertKeyTemperature(i * 20 + 200, Temperature::kCold);
|
|
153
154
|
}
|
|
154
155
|
|
|
155
156
|
ASSERT_LT(GetSstSizeHelper(Temperature::kUnknown), hot_data_size);
|
|
@@ -166,7 +167,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
|
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
// any random data close to the end should be cold
|
|
169
|
-
|
|
170
|
+
AssertKeyTemperature(1000, Temperature::kCold);
|
|
170
171
|
|
|
171
172
|
// close explicitly, because the env is local variable which will be released
|
|
172
173
|
// first.
|
|
@@ -215,7 +216,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
|
|
|
215
216
|
ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
|
|
216
217
|
|
|
217
218
|
// read a random key, which should be hot (kUnknown)
|
|
218
|
-
|
|
219
|
+
AssertKeyTemperature(20, Temperature::kUnknown);
|
|
219
220
|
|
|
220
221
|
// Adding more data to have mixed hot and cold data
|
|
221
222
|
for (; sst_num < 14; sst_num++) {
|
|
@@ -237,7 +238,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
|
|
|
237
238
|
ASSERT_GT(hot_data_size, 0);
|
|
238
239
|
ASSERT_GT(cold_data_size, 0);
|
|
239
240
|
// the first a few key should be cold
|
|
240
|
-
|
|
241
|
+
AssertKeyTemperature(20, Temperature::kCold);
|
|
241
242
|
|
|
242
243
|
// Wait some time, with each wait, the cold data is increasing and hot data is
|
|
243
244
|
// decreasing
|
|
@@ -253,8 +254,8 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
|
|
|
253
254
|
ASSERT_GT(cold_data_size, pre_cold);
|
|
254
255
|
|
|
255
256
|
// the hot/cold cut_off key should be around i * 20 + 400 -> 450
|
|
256
|
-
|
|
257
|
-
|
|
257
|
+
AssertKeyTemperature(i * 20 + 450, Temperature::kUnknown);
|
|
258
|
+
AssertKeyTemperature(i * 20 + 400, Temperature::kCold);
|
|
258
259
|
}
|
|
259
260
|
|
|
260
261
|
// Wait again, the most of the data should be cold after that
|
|
@@ -267,14 +268,53 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
|
|
|
267
268
|
}
|
|
268
269
|
|
|
269
270
|
// any random data close to the end should be cold
|
|
270
|
-
|
|
271
|
+
AssertKeyTemperature(1000, Temperature::kCold);
|
|
271
272
|
|
|
272
273
|
Close();
|
|
273
274
|
}
|
|
274
275
|
|
|
275
|
-
|
|
276
|
+
enum class SeqnoTimeTestType : char {
|
|
277
|
+
kTrackInternalTimeSeconds = 0,
|
|
278
|
+
kPrecludeLastLevel = 1,
|
|
279
|
+
kBothSetTrackSmaller = 2,
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
class SeqnoTimeTablePropTest
|
|
283
|
+
: public SeqnoTimeTest,
|
|
284
|
+
public ::testing::WithParamInterface<SeqnoTimeTestType> {
|
|
285
|
+
public:
|
|
286
|
+
SeqnoTimeTablePropTest() : SeqnoTimeTest() {}
|
|
287
|
+
|
|
288
|
+
void SetTrackTimeDurationOptions(uint64_t track_time_duration,
|
|
289
|
+
Options& options) const {
|
|
290
|
+
// either option set will enable the time tracking feature
|
|
291
|
+
switch (GetParam()) {
|
|
292
|
+
case SeqnoTimeTestType::kTrackInternalTimeSeconds:
|
|
293
|
+
options.preclude_last_level_data_seconds = 0;
|
|
294
|
+
options.preserve_internal_time_seconds = track_time_duration;
|
|
295
|
+
break;
|
|
296
|
+
case SeqnoTimeTestType::kPrecludeLastLevel:
|
|
297
|
+
options.preclude_last_level_data_seconds = track_time_duration;
|
|
298
|
+
options.preserve_internal_time_seconds = 0;
|
|
299
|
+
break;
|
|
300
|
+
case SeqnoTimeTestType::kBothSetTrackSmaller:
|
|
301
|
+
options.preclude_last_level_data_seconds = track_time_duration;
|
|
302
|
+
options.preserve_internal_time_seconds = track_time_duration / 10;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
INSTANTIATE_TEST_CASE_P(
|
|
309
|
+
SeqnoTimeTablePropTest, SeqnoTimeTablePropTest,
|
|
310
|
+
::testing::Values(SeqnoTimeTestType::kTrackInternalTimeSeconds,
|
|
311
|
+
SeqnoTimeTestType::kPrecludeLastLevel,
|
|
312
|
+
SeqnoTimeTestType::kBothSetTrackSmaller));
|
|
313
|
+
|
|
314
|
+
TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
|
|
276
315
|
Options options = CurrentOptions();
|
|
277
|
-
options
|
|
316
|
+
SetTrackTimeDurationOptions(10000, options);
|
|
317
|
+
|
|
278
318
|
options.env = mock_env_.get();
|
|
279
319
|
options.disable_auto_compactions = true;
|
|
280
320
|
DestroyAndReopen(options);
|
|
@@ -297,6 +337,8 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
|
|
|
297
337
|
ASSERT_OK(tp_mapping.Sort());
|
|
298
338
|
ASSERT_FALSE(tp_mapping.Empty());
|
|
299
339
|
auto seqs = tp_mapping.TEST_GetInternalMapping();
|
|
340
|
+
// about ~20 seqs->time entries, because the sample rate is 10000/100, and it
|
|
341
|
+
// passes 2k time.
|
|
300
342
|
ASSERT_GE(seqs.size(), 19);
|
|
301
343
|
ASSERT_LE(seqs.size(), 21);
|
|
302
344
|
SequenceNumber seq_end = dbfull()->GetLatestSequenceNumber();
|
|
@@ -444,7 +486,8 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
|
|
|
444
486
|
ASSERT_LE(seqs.size(), 101);
|
|
445
487
|
for (auto i = start_seq; i < seq_end - 99; i++) {
|
|
446
488
|
// likely the first 100 entries reports 0
|
|
447
|
-
ASSERT_LE(tp_mapping.GetOldestApproximateTime(i),
|
|
489
|
+
ASSERT_LE(tp_mapping.GetOldestApproximateTime(i),
|
|
490
|
+
(i - start_seq) * 100 + 50000);
|
|
448
491
|
}
|
|
449
492
|
start_seq += 101;
|
|
450
493
|
|
|
@@ -457,9 +500,10 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
|
|
|
457
500
|
ASSERT_OK(db_->Close());
|
|
458
501
|
}
|
|
459
502
|
|
|
460
|
-
|
|
503
|
+
TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
|
|
461
504
|
Options options = CurrentOptions();
|
|
462
505
|
options.preclude_last_level_data_seconds = 0;
|
|
506
|
+
options.preserve_internal_time_seconds = 0;
|
|
463
507
|
options.env = mock_env_.get();
|
|
464
508
|
options.stats_dump_period_sec = 0;
|
|
465
509
|
options.stats_persist_period_sec = 0;
|
|
@@ -485,7 +529,7 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
|
|
|
485
529
|
ASSERT_TRUE(dbfull()->TEST_GetSeqnoToTimeMapping().Empty());
|
|
486
530
|
|
|
487
531
|
Options options_1 = options;
|
|
488
|
-
options_1
|
|
532
|
+
SetTrackTimeDurationOptions(10000, options_1);
|
|
489
533
|
CreateColumnFamilies({"one"}, options_1);
|
|
490
534
|
ASSERT_TRUE(scheduler.TEST_HasTask(PeriodicTaskType::kRecordSeqnoTime));
|
|
491
535
|
|
|
@@ -514,11 +558,11 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
|
|
|
514
558
|
ASSERT_FALSE(tp_mapping.Empty());
|
|
515
559
|
auto seqs = tp_mapping.TEST_GetInternalMapping();
|
|
516
560
|
ASSERT_GE(seqs.size(), 1);
|
|
517
|
-
ASSERT_LE(seqs.size(),
|
|
561
|
+
ASSERT_LE(seqs.size(), 4);
|
|
518
562
|
|
|
519
563
|
// Create one more CF with larger preclude_last_level time
|
|
520
564
|
Options options_2 = options;
|
|
521
|
-
options_2
|
|
565
|
+
SetTrackTimeDurationOptions(1000000, options_2); // 1m
|
|
522
566
|
CreateColumnFamilies({"two"}, options_2);
|
|
523
567
|
|
|
524
568
|
// Add more data to CF "two" to fill the in memory mapping
|
|
@@ -618,11 +662,11 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
|
|
|
618
662
|
Close();
|
|
619
663
|
}
|
|
620
664
|
|
|
621
|
-
|
|
665
|
+
TEST_P(SeqnoTimeTablePropTest, MultiInstancesBasic) {
|
|
622
666
|
const int kInstanceNum = 2;
|
|
623
667
|
|
|
624
668
|
Options options = CurrentOptions();
|
|
625
|
-
options
|
|
669
|
+
SetTrackTimeDurationOptions(10000, options);
|
|
626
670
|
options.env = mock_env_.get();
|
|
627
671
|
options.stats_dump_period_sec = 0;
|
|
628
672
|
options.stats_persist_period_sec = 0;
|
|
@@ -650,17 +694,32 @@ TEST_F(SeqnoTimeTest, MultiInstancesBasic) {
|
|
|
650
694
|
}
|
|
651
695
|
}
|
|
652
696
|
|
|
653
|
-
|
|
697
|
+
TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
|
|
698
|
+
const int kNumTrigger = 4;
|
|
699
|
+
const int kNumLevels = 7;
|
|
700
|
+
const int kNumKeys = 100;
|
|
701
|
+
|
|
654
702
|
Options options = CurrentOptions();
|
|
703
|
+
SetTrackTimeDurationOptions(10000, options);
|
|
655
704
|
options.compaction_style = kCompactionStyleUniversal;
|
|
656
|
-
options.
|
|
705
|
+
options.num_levels = kNumLevels;
|
|
657
706
|
options.env = mock_env_.get();
|
|
658
707
|
|
|
659
708
|
DestroyAndReopen(options);
|
|
660
709
|
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
710
|
+
std::atomic_uint64_t num_seqno_zeroing{0};
|
|
711
|
+
|
|
712
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
713
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
714
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
715
|
+
"CompactionIterator::PrepareOutput:ZeroingSeq",
|
|
716
|
+
[&](void* /*arg*/) { num_seqno_zeroing++; });
|
|
717
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
718
|
+
|
|
719
|
+
int sst_num = 0;
|
|
720
|
+
for (; sst_num < kNumTrigger - 1; sst_num++) {
|
|
721
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
722
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
664
723
|
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
665
724
|
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
|
|
666
725
|
}
|
|
@@ -681,11 +740,12 @@ TEST_F(SeqnoTimeTest, SeqnoToTimeMappingUniversal) {
|
|
|
681
740
|
}
|
|
682
741
|
|
|
683
742
|
// Trigger a compaction
|
|
684
|
-
for (int i = 0; i <
|
|
685
|
-
ASSERT_OK(Put(Key(i), "value"));
|
|
743
|
+
for (int i = 0; i < kNumKeys; i++) {
|
|
744
|
+
ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
|
|
686
745
|
dbfull()->TEST_WaitForPeridicTaskRun(
|
|
687
746
|
[&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
|
|
688
747
|
}
|
|
748
|
+
sst_num++;
|
|
689
749
|
ASSERT_OK(Flush());
|
|
690
750
|
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
691
751
|
tables_props.clear();
|
|
@@ -696,6 +756,73 @@ TEST_F(SeqnoTimeTest, SeqnoToTimeMappingUniversal) {
|
|
|
696
756
|
SeqnoToTimeMapping tp_mapping;
|
|
697
757
|
ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
|
|
698
758
|
ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
|
|
759
|
+
|
|
760
|
+
// compact to the last level
|
|
761
|
+
CompactRangeOptions cro;
|
|
762
|
+
cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
|
|
763
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
764
|
+
// make sure the data is all compacted to penultimate level if the feature is
|
|
765
|
+
// on, otherwise, compacted to the last level.
|
|
766
|
+
if (options.preclude_last_level_data_seconds > 0) {
|
|
767
|
+
ASSERT_GT(NumTableFilesAtLevel(5), 0);
|
|
768
|
+
ASSERT_EQ(NumTableFilesAtLevel(6), 0);
|
|
769
|
+
} else {
|
|
770
|
+
ASSERT_EQ(NumTableFilesAtLevel(5), 0);
|
|
771
|
+
ASSERT_GT(NumTableFilesAtLevel(6), 0);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// regardless the file is on the last level or not, it should keep the time
|
|
775
|
+
// information and sequence number are not set
|
|
776
|
+
tables_props.clear();
|
|
777
|
+
tp_mapping.Clear();
|
|
778
|
+
ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
|
|
779
|
+
|
|
780
|
+
ASSERT_EQ(tables_props.size(), 1);
|
|
781
|
+
ASSERT_EQ(num_seqno_zeroing, 0);
|
|
782
|
+
|
|
783
|
+
it = tables_props.begin();
|
|
784
|
+
ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
|
|
785
|
+
ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
|
|
786
|
+
|
|
787
|
+
// make half of the data expired
|
|
788
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(8000));
|
|
789
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
790
|
+
|
|
791
|
+
tables_props.clear();
|
|
792
|
+
tp_mapping.Clear();
|
|
793
|
+
ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
|
|
794
|
+
|
|
795
|
+
if (options.preclude_last_level_data_seconds > 0) {
|
|
796
|
+
ASSERT_EQ(tables_props.size(), 2);
|
|
797
|
+
} else {
|
|
798
|
+
ASSERT_EQ(tables_props.size(), 1);
|
|
799
|
+
}
|
|
800
|
+
ASSERT_GT(num_seqno_zeroing, 0);
|
|
801
|
+
std::vector<KeyVersion> key_versions;
|
|
802
|
+
ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
|
|
803
|
+
std::numeric_limits<size_t>::max(),
|
|
804
|
+
&key_versions));
|
|
805
|
+
// make sure there're more than 300 keys and first 100 keys are having seqno
|
|
806
|
+
// zeroed out, the last 100 key seqno not zeroed out
|
|
807
|
+
ASSERT_GT(key_versions.size(), 300);
|
|
808
|
+
for (int i = 0; i < 100; i++) {
|
|
809
|
+
ASSERT_EQ(key_versions[i].sequence, 0);
|
|
810
|
+
}
|
|
811
|
+
auto rit = key_versions.rbegin();
|
|
812
|
+
for (int i = 0; i < 100; i++) {
|
|
813
|
+
ASSERT_GT(rit->sequence, 0);
|
|
814
|
+
rit++;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// make all data expired and compact again to push it to the last level
|
|
818
|
+
// regardless if the tiering feature is enabled or not
|
|
819
|
+
mock_clock_->MockSleepForSeconds(static_cast<int>(20000));
|
|
820
|
+
|
|
821
|
+
ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
|
|
822
|
+
|
|
823
|
+
ASSERT_GT(num_seqno_zeroing, 0);
|
|
824
|
+
ASSERT_GT(NumTableFilesAtLevel(6), 0);
|
|
825
|
+
|
|
699
826
|
Close();
|
|
700
827
|
}
|
|
701
828
|
|
|
@@ -31,11 +31,11 @@ void SeqnoToTimeMapping::Add(SequenceNumber seqno, uint64_t time) {
|
|
|
31
31
|
seqno_time_mapping_.emplace_back(seqno, time);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
void SeqnoToTimeMapping::TruncateOldEntries(const uint64_t now) {
|
|
35
35
|
assert(is_sorted_);
|
|
36
36
|
|
|
37
37
|
if (max_time_duration_ == 0) {
|
|
38
|
-
return
|
|
38
|
+
return;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const uint64_t cut_off_time =
|
|
@@ -48,12 +48,25 @@ SequenceNumber SeqnoToTimeMapping::TruncateOldEntries(const uint64_t now) {
|
|
|
48
48
|
return target < other.time;
|
|
49
49
|
});
|
|
50
50
|
if (it == seqno_time_mapping_.begin()) {
|
|
51
|
-
return
|
|
51
|
+
return;
|
|
52
52
|
}
|
|
53
53
|
it--;
|
|
54
54
|
seqno_time_mapping_.erase(seqno_time_mapping_.begin(), it);
|
|
55
|
+
}
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
SequenceNumber SeqnoToTimeMapping::GetOldestSequenceNum(uint64_t time) {
|
|
58
|
+
assert(is_sorted_);
|
|
59
|
+
|
|
60
|
+
auto it = std::upper_bound(
|
|
61
|
+
seqno_time_mapping_.begin(), seqno_time_mapping_.end(), time,
|
|
62
|
+
[](uint64_t target, const SeqnoTimePair& other) -> bool {
|
|
63
|
+
return target < other.time;
|
|
64
|
+
});
|
|
65
|
+
if (it == seqno_time_mapping_.begin()) {
|
|
66
|
+
return 0;
|
|
67
|
+
}
|
|
68
|
+
it--;
|
|
69
|
+
return it->seqno;
|
|
57
70
|
}
|
|
58
71
|
|
|
59
72
|
// The encoded format is:
|
|
@@ -94,6 +107,10 @@ void SeqnoToTimeMapping::Encode(std::string& dest, const SequenceNumber start,
|
|
|
94
107
|
start_it++;
|
|
95
108
|
}
|
|
96
109
|
}
|
|
110
|
+
// to include the first element
|
|
111
|
+
if (start_it != seqno_time_mapping_.begin()) {
|
|
112
|
+
start_it--;
|
|
113
|
+
}
|
|
97
114
|
|
|
98
115
|
// If there are more data than needed, pick the entries for encoding.
|
|
99
116
|
// It's not the most optimized algorithm for selecting the best representative
|
|
@@ -107,7 +107,10 @@ class SeqnoToTimeMapping {
|
|
|
107
107
|
uint64_t GetOldestApproximateTime(SequenceNumber seqno) const;
|
|
108
108
|
|
|
109
109
|
// Truncate the old entries based on the current time and max_time_duration_
|
|
110
|
-
|
|
110
|
+
void TruncateOldEntries(uint64_t now);
|
|
111
|
+
|
|
112
|
+
// Given a time, return it's oldest possible sequence number
|
|
113
|
+
SequenceNumber GetOldestSequenceNum(uint64_t time);
|
|
111
114
|
|
|
112
115
|
// Encode to a binary string
|
|
113
116
|
void Encode(std::string& des, SequenceNumber start, SequenceNumber end,
|
|
@@ -490,9 +490,15 @@ Status TableCache::Get(
|
|
|
490
490
|
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
|
|
491
491
|
t->NewRangeTombstoneIterator(options));
|
|
492
492
|
if (range_del_iter != nullptr) {
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
493
|
+
SequenceNumber seq =
|
|
494
|
+
range_del_iter->MaxCoveringTombstoneSeqnum(ExtractUserKey(k));
|
|
495
|
+
if (seq > *max_covering_tombstone_seq) {
|
|
496
|
+
*max_covering_tombstone_seq = seq;
|
|
497
|
+
if (get_context->NeedTimestamp()) {
|
|
498
|
+
get_context->SetTimestampFromRangeTombstone(
|
|
499
|
+
range_del_iter->timestamp());
|
|
500
|
+
}
|
|
501
|
+
}
|
|
496
502
|
}
|
|
497
503
|
}
|
|
498
504
|
if (s.ok()) {
|
|
@@ -535,9 +541,15 @@ void TableCache::UpdateRangeTombstoneSeqnums(
|
|
|
535
541
|
for (auto iter = table_range.begin(); iter != table_range.end(); ++iter) {
|
|
536
542
|
SequenceNumber* max_covering_tombstone_seq =
|
|
537
543
|
iter->get_context->max_covering_tombstone_seq();
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
544
|
+
SequenceNumber seq =
|
|
545
|
+
range_del_iter->MaxCoveringTombstoneSeqnum(iter->ukey_with_ts);
|
|
546
|
+
if (seq > *max_covering_tombstone_seq) {
|
|
547
|
+
*max_covering_tombstone_seq = seq;
|
|
548
|
+
if (iter->get_context->NeedTimestamp()) {
|
|
549
|
+
iter->get_context->SetTimestampFromRangeTombstone(
|
|
550
|
+
range_del_iter->timestamp());
|
|
551
|
+
}
|
|
552
|
+
}
|
|
541
553
|
}
|
|
542
554
|
}
|
|
543
555
|
}
|
|
@@ -507,6 +507,7 @@ INSTANTIATE_TEST_CASE_P(CustomizedTablePropertiesCollector, TablePropertiesTest,
|
|
|
507
507
|
} // namespace ROCKSDB_NAMESPACE
|
|
508
508
|
|
|
509
509
|
int main(int argc, char** argv) {
|
|
510
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
510
511
|
::testing::InitGoogleTest(&argc, argv);
|
|
511
512
|
return RUN_ALL_TESTS();
|
|
512
513
|
}
|
|
@@ -1689,6 +1689,7 @@ TEST_F(VersionBuilderTest, EstimatedActiveKeys) {
|
|
|
1689
1689
|
} // namespace ROCKSDB_NAMESPACE
|
|
1690
1690
|
|
|
1691
1691
|
int main(int argc, char** argv) {
|
|
1692
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
1692
1693
|
::testing::InitGoogleTest(&argc, argv);
|
|
1693
1694
|
return RUN_ALL_TESTS();
|
|
1694
1695
|
}
|
|
@@ -724,6 +724,7 @@ TEST(FileMetaDataTest, UpdateBoundariesBlobIndex) {
|
|
|
724
724
|
} // namespace ROCKSDB_NAMESPACE
|
|
725
725
|
|
|
726
726
|
int main(int argc, char** argv) {
|
|
727
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
727
728
|
::testing::InitGoogleTest(&argc, argv);
|
|
728
729
|
return RUN_ALL_TESTS();
|
|
729
730
|
}
|
|
@@ -1632,6 +1632,7 @@ Status Version::TablesRangeTombstoneSummary(int max_entries_to_print,
|
|
|
1632
1632
|
if (tombstone_iter) {
|
|
1633
1633
|
tombstone_iter->SeekToFirst();
|
|
1634
1634
|
|
|
1635
|
+
// TODO: print timestamp
|
|
1635
1636
|
while (tombstone_iter->Valid() && num_entries_left > 0) {
|
|
1636
1637
|
ss << "start: " << tombstone_iter->start_key().ToString(true)
|
|
1637
1638
|
<< " end: " << tombstone_iter->end_key().ToString(true)
|
|
@@ -2914,7 +2915,9 @@ void VersionStorageInfo::PrepareForVersionAppend(
|
|
|
2914
2915
|
GenerateFileIndexer();
|
|
2915
2916
|
GenerateLevelFilesBrief();
|
|
2916
2917
|
GenerateLevel0NonOverlapping();
|
|
2917
|
-
|
|
2918
|
+
if (!immutable_options.allow_ingest_behind) {
|
|
2919
|
+
GenerateBottommostFiles();
|
|
2920
|
+
}
|
|
2918
2921
|
GenerateFileLocationIndex();
|
|
2919
2922
|
}
|
|
2920
2923
|
|
|
@@ -3354,7 +3357,9 @@ void VersionStorageInfo::ComputeCompactionScore(
|
|
|
3354
3357
|
}
|
|
3355
3358
|
}
|
|
3356
3359
|
ComputeFilesMarkedForCompaction();
|
|
3357
|
-
|
|
3360
|
+
if (!immutable_options.allow_ingest_behind) {
|
|
3361
|
+
ComputeBottommostFilesMarkedForCompaction();
|
|
3362
|
+
}
|
|
3358
3363
|
if (mutable_cf_options.ttl > 0) {
|
|
3359
3364
|
ComputeExpiredTtlFiles(immutable_options, mutable_cf_options.ttl);
|
|
3360
3365
|
}
|
|
@@ -4560,6 +4565,10 @@ std::string Version::DebugString(bool hex, bool print_stats) const {
|
|
|
4560
4565
|
AppendNumberTo(&r, level);
|
|
4561
4566
|
r.append(" --- version# ");
|
|
4562
4567
|
AppendNumberTo(&r, version_number_);
|
|
4568
|
+
if (storage_info_.compact_cursor_[level].Valid()) {
|
|
4569
|
+
r.append(" --- compact_cursor: ");
|
|
4570
|
+
r.append(storage_info_.compact_cursor_[level].DebugString(hex));
|
|
4571
|
+
}
|
|
4563
4572
|
r.append(" ---\n");
|
|
4564
4573
|
const std::vector<FileMetaData*>& files = storage_info_.files_[level];
|
|
4565
4574
|
for (size_t i = 0; i < files.size(); i++) {
|
|
@@ -5514,7 +5523,7 @@ Status VersionSet::GetCurrentManifestPath(const std::string& dbname,
|
|
|
5514
5523
|
|
|
5515
5524
|
Status VersionSet::Recover(
|
|
5516
5525
|
const std::vector<ColumnFamilyDescriptor>& column_families, bool read_only,
|
|
5517
|
-
std::string* db_id) {
|
|
5526
|
+
std::string* db_id, bool no_error_if_files_missing) {
|
|
5518
5527
|
// Read "CURRENT" file, which contains a pointer to the current manifest file
|
|
5519
5528
|
std::string manifest_path;
|
|
5520
5529
|
Status s = GetCurrentManifestPath(dbname_, fs_.get(), &manifest_path,
|
|
@@ -5547,10 +5556,9 @@ Status VersionSet::Recover(
|
|
|
5547
5556
|
reporter.status = &log_read_status;
|
|
5548
5557
|
log::Reader reader(nullptr, std::move(manifest_file_reader), &reporter,
|
|
5549
5558
|
true /* checksum */, 0 /* log_number */);
|
|
5550
|
-
VersionEditHandler handler(
|
|
5551
|
-
|
|
5552
|
-
|
|
5553
|
-
/*no_error_if_files_missing=*/false, io_tracer_);
|
|
5559
|
+
VersionEditHandler handler(
|
|
5560
|
+
read_only, column_families, const_cast<VersionSet*>(this),
|
|
5561
|
+
/*track_missing_files=*/false, no_error_if_files_missing, io_tracer_);
|
|
5554
5562
|
handler.Iterate(reader, &log_read_status);
|
|
5555
5563
|
s = handler.status();
|
|
5556
5564
|
if (s.ok()) {
|
|
@@ -1175,7 +1175,8 @@ class VersionSet {
|
|
|
1175
1175
|
// If read_only == true, Recover() will not complain if some column families
|
|
1176
1176
|
// are not opened
|
|
1177
1177
|
Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families,
|
|
1178
|
-
bool read_only = false, std::string* db_id = nullptr
|
|
1178
|
+
bool read_only = false, std::string* db_id = nullptr,
|
|
1179
|
+
bool no_error_if_files_missing = false);
|
|
1179
1180
|
|
|
1180
1181
|
Status TryRecover(const std::vector<ColumnFamilyDescriptor>& column_families,
|
|
1181
1182
|
bool read_only,
|
|
@@ -3579,6 +3579,7 @@ TEST_P(ChargeFileMetadataTestWithParam, Basic) {
|
|
|
3579
3579
|
} // namespace ROCKSDB_NAMESPACE
|
|
3580
3580
|
|
|
3581
3581
|
int main(int argc, char** argv) {
|
|
3582
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
3582
3583
|
::testing::InitGoogleTest(&argc, argv);
|
|
3583
3584
|
return RUN_ALL_TESTS();
|
|
3584
3585
|
}
|
|
@@ -28,7 +28,9 @@ class OfflineManifestWriter {
|
|
|
28
28
|
/*db_id*/ "", /*db_session_id*/ "") {}
|
|
29
29
|
|
|
30
30
|
Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families) {
|
|
31
|
-
return versions_.Recover(column_families
|
|
31
|
+
return versions_.Recover(column_families, /*read_only*/ false,
|
|
32
|
+
/*db_id*/ nullptr,
|
|
33
|
+
/*no_error_if_files_missing*/ true);
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
Status LogAndApply(ColumnFamilyData* cfd, VersionEdit* edit,
|
|
@@ -329,6 +329,7 @@ TEST_F(WalManagerTest, TransactionLogIteratorNewFileWhileScanning) {
|
|
|
329
329
|
} // namespace ROCKSDB_NAMESPACE
|
|
330
330
|
|
|
331
331
|
int main(int argc, char** argv) {
|
|
332
|
+
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
332
333
|
::testing::InitGoogleTest(&argc, argv);
|
|
333
334
|
return RUN_ALL_TESTS();
|
|
334
335
|
}
|
|
@@ -15,20 +15,32 @@
|
|
|
15
15
|
|
|
16
16
|
namespace ROCKSDB_NAMESPACE {
|
|
17
17
|
|
|
18
|
-
const Slice
|
|
18
|
+
Status WideColumnSerialization::SerializeImpl(const Slice* value_of_default,
|
|
19
|
+
const WideColumns& columns,
|
|
20
|
+
std::string& output) {
|
|
21
|
+
const size_t num_columns =
|
|
22
|
+
value_of_default ? columns.size() + 1 : columns.size();
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
23
|
-
std::string& output) {
|
|
24
|
-
if (columns.size() >
|
|
25
|
-
static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
24
|
+
if (num_columns > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
26
25
|
return Status::InvalidArgument("Too many wide columns");
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
PutVarint32(&output, kCurrentVersion);
|
|
30
29
|
|
|
31
|
-
PutVarint32(&output, static_cast<uint32_t>(
|
|
30
|
+
PutVarint32(&output, static_cast<uint32_t>(num_columns));
|
|
31
|
+
|
|
32
|
+
const Slice* prev_name = nullptr;
|
|
33
|
+
if (value_of_default) {
|
|
34
|
+
if (value_of_default->size() >
|
|
35
|
+
static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
36
|
+
return Status::InvalidArgument("Wide column value too long");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
PutLengthPrefixedSlice(&output, kDefaultWideColumnName);
|
|
40
|
+
PutVarint32(&output, static_cast<uint32_t>(value_of_default->size()));
|
|
41
|
+
|
|
42
|
+
prev_name = &kDefaultWideColumnName;
|
|
43
|
+
}
|
|
32
44
|
|
|
33
45
|
for (size_t i = 0; i < columns.size(); ++i) {
|
|
34
46
|
const WideColumn& column = columns[i];
|
|
@@ -38,7 +50,8 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
|
38
50
|
static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
39
51
|
return Status::InvalidArgument("Wide column name too long");
|
|
40
52
|
}
|
|
41
|
-
|
|
53
|
+
|
|
54
|
+
if (prev_name && prev_name->compare(name) >= 0) {
|
|
42
55
|
return Status::Corruption("Wide columns out of order");
|
|
43
56
|
}
|
|
44
57
|
|
|
@@ -50,6 +63,12 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
|
50
63
|
|
|
51
64
|
PutLengthPrefixedSlice(&output, name);
|
|
52
65
|
PutVarint32(&output, static_cast<uint32_t>(value.size()));
|
|
66
|
+
|
|
67
|
+
prev_name = &name;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (value_of_default) {
|
|
71
|
+
output.append(value_of_default->data(), value_of_default->size());
|
|
53
72
|
}
|
|
54
73
|
|
|
55
74
|
for (const auto& column : columns) {
|
|
@@ -44,6 +44,10 @@ class Slice;
|
|
|
44
44
|
class WideColumnSerialization {
|
|
45
45
|
public:
|
|
46
46
|
static Status Serialize(const WideColumns& columns, std::string& output);
|
|
47
|
+
static Status Serialize(const Slice& value_of_default,
|
|
48
|
+
const WideColumns& other_columns,
|
|
49
|
+
std::string& output);
|
|
50
|
+
|
|
47
51
|
static Status Deserialize(Slice& input, WideColumns& columns);
|
|
48
52
|
|
|
49
53
|
static WideColumns::const_iterator Find(const WideColumns& columns,
|
|
@@ -51,6 +55,23 @@ class WideColumnSerialization {
|
|
|
51
55
|
static Status GetValueOfDefaultColumn(Slice& input, Slice& value);
|
|
52
56
|
|
|
53
57
|
static constexpr uint32_t kCurrentVersion = 1;
|
|
58
|
+
|
|
59
|
+
private:
|
|
60
|
+
static Status SerializeImpl(const Slice* value_of_default,
|
|
61
|
+
const WideColumns& columns, std::string& output);
|
|
54
62
|
};
|
|
55
63
|
|
|
64
|
+
inline Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
65
|
+
std::string& output) {
|
|
66
|
+
constexpr Slice* value_of_default = nullptr;
|
|
67
|
+
|
|
68
|
+
return SerializeImpl(value_of_default, columns, output);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
inline Status WideColumnSerialization::Serialize(
|
|
72
|
+
const Slice& value_of_default, const WideColumns& other_columns,
|
|
73
|
+
std::string& output) {
|
|
74
|
+
return SerializeImpl(&value_of_default, other_columns, output);
|
|
75
|
+
}
|
|
76
|
+
|
|
56
77
|
} // namespace ROCKSDB_NAMESPACE
|