@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
|
@@ -170,13 +170,16 @@ class DBBlockCacheTest : public DBTestBase {
|
|
|
170
170
|
#ifndef ROCKSDB_LITE
|
|
171
171
|
const std::array<size_t, kNumCacheEntryRoles> GetCacheEntryRoleCountsBg() {
|
|
172
172
|
// Verify in cache entry role stats
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
173
|
+
std::array<size_t, kNumCacheEntryRoles> cache_entry_role_counts;
|
|
174
|
+
std::map<std::string, std::string> values;
|
|
175
|
+
EXPECT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
|
|
176
|
+
&values));
|
|
177
|
+
for (size_t i = 0; i < kNumCacheEntryRoles; ++i) {
|
|
178
|
+
auto role = static_cast<CacheEntryRole>(i);
|
|
179
|
+
cache_entry_role_counts[i] =
|
|
180
|
+
ParseSizeT(values[BlockCacheEntryStatsMapKeys::EntryCount(role)]);
|
|
181
|
+
}
|
|
182
|
+
return cache_entry_role_counts;
|
|
180
183
|
}
|
|
181
184
|
#endif // ROCKSDB_LITE
|
|
182
185
|
};
|
|
@@ -1500,23 +1503,38 @@ TEST_F(DBBlockCacheTest, CacheEntryRoleStats) {
|
|
|
1500
1503
|
dbfull()->DumpStats();
|
|
1501
1504
|
ASSERT_EQ(scan_count, 1);
|
|
1502
1505
|
|
|
1503
|
-
env_->MockSleepForSeconds(
|
|
1506
|
+
env_->MockSleepForSeconds(60);
|
|
1507
|
+
ASSERT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
|
|
1508
|
+
&values));
|
|
1509
|
+
ASSERT_EQ(scan_count, 1);
|
|
1504
1510
|
ASSERT_TRUE(
|
|
1505
1511
|
db_->GetMapProperty(DB::Properties::kBlockCacheEntryStats, &values));
|
|
1506
1512
|
ASSERT_EQ(scan_count, 2);
|
|
1507
1513
|
|
|
1508
1514
|
env_->MockSleepForSeconds(10000);
|
|
1515
|
+
ASSERT_TRUE(db_->GetMapProperty(DB::Properties::kFastBlockCacheEntryStats,
|
|
1516
|
+
&values));
|
|
1517
|
+
ASSERT_EQ(scan_count, 3);
|
|
1518
|
+
|
|
1519
|
+
env_->MockSleepForSeconds(60);
|
|
1509
1520
|
std::string value_str;
|
|
1521
|
+
ASSERT_TRUE(db_->GetProperty(DB::Properties::kFastBlockCacheEntryStats,
|
|
1522
|
+
&value_str));
|
|
1523
|
+
ASSERT_EQ(scan_count, 3);
|
|
1510
1524
|
ASSERT_TRUE(
|
|
1511
1525
|
db_->GetProperty(DB::Properties::kBlockCacheEntryStats, &value_str));
|
|
1512
|
-
ASSERT_EQ(scan_count,
|
|
1526
|
+
ASSERT_EQ(scan_count, 4);
|
|
1513
1527
|
|
|
1514
1528
|
env_->MockSleepForSeconds(10000);
|
|
1529
|
+
ASSERT_TRUE(db_->GetProperty(DB::Properties::kFastBlockCacheEntryStats,
|
|
1530
|
+
&value_str));
|
|
1531
|
+
ASSERT_EQ(scan_count, 5);
|
|
1532
|
+
|
|
1515
1533
|
ASSERT_TRUE(db_->GetProperty(DB::Properties::kCFStats, &value_str));
|
|
1516
1534
|
// To match historical speed, querying this property no longer triggers
|
|
1517
1535
|
// a scan, even if results are old. But periodic dump stats should keep
|
|
1518
1536
|
// things reasonably updated.
|
|
1519
|
-
ASSERT_EQ(scan_count, /*unchanged*/
|
|
1537
|
+
ASSERT_EQ(scan_count, /*unchanged*/ 5);
|
|
1520
1538
|
|
|
1521
1539
|
SyncPoint::GetInstance()->DisableProcessing();
|
|
1522
1540
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
@@ -1706,7 +1706,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
1706
1706
|
ASSERT_OK(Put(1, Key(maxKey + 55555), Key(maxKey + 55555)));
|
|
1707
1707
|
Flush(1);
|
|
1708
1708
|
EXPECT_EQ(policy->DumpTestReport(),
|
|
1709
|
-
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=
|
|
1709
|
+
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
|
|
1710
1710
|
: "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
|
|
1711
1711
|
|
|
1712
1712
|
for (int i = maxKey / 2; i < maxKey; i++) {
|
|
@@ -1714,7 +1714,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
1714
1714
|
}
|
|
1715
1715
|
Flush(1);
|
|
1716
1716
|
EXPECT_EQ(policy->DumpTestReport(),
|
|
1717
|
-
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=
|
|
1717
|
+
fifo ? "cf=abe,s=kCompactionStyleFIFO,n=7,l=0,b=0,r=kFlush\n"
|
|
1718
1718
|
: "cf=bob,s=kCompactionStyleLevel,n=7,l=0,b=0,r=kFlush\n");
|
|
1719
1719
|
|
|
1720
1720
|
// Check that they can be found
|
|
@@ -1738,7 +1738,7 @@ TEST_F(DBBloomFilterTest, ContextCustomFilterPolicy) {
|
|
|
1738
1738
|
EXPECT_LE(useful_count, maxKey * 2 * (fifo ? 0.9995 : 0.98));
|
|
1739
1739
|
}
|
|
1740
1740
|
|
|
1741
|
-
if (!fifo) { // FIFO
|
|
1741
|
+
if (!fifo) { // FIFO doesn't fully support CompactRange
|
|
1742
1742
|
// Full compaction
|
|
1743
1743
|
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), handles_[1], nullptr,
|
|
1744
1744
|
nullptr));
|
|
@@ -2496,7 +2496,7 @@ TEST_F(DBBloomFilterTest, OptimizeFiltersForHits) {
|
|
|
2496
2496
|
for (int i = 0; i < numkeys; i += 2) {
|
|
2497
2497
|
keys.push_back(i);
|
|
2498
2498
|
}
|
|
2499
|
-
RandomShuffle(std::begin(keys), std::end(keys));
|
|
2499
|
+
RandomShuffle(std::begin(keys), std::end(keys), /*seed*/ 42);
|
|
2500
2500
|
int num_inserted = 0;
|
|
2501
2501
|
for (int key : keys) {
|
|
2502
2502
|
ASSERT_OK(Put(1, Key(key), "val"));
|
|
@@ -3824,6 +3824,242 @@ TEST_F(DBCompactionTest, NoCompactBottomLevelFilesWithDeletions) {
|
|
|
3824
3824
|
}
|
|
3825
3825
|
}
|
|
3826
3826
|
|
|
3827
|
+
TEST_F(DBCompactionTest, RoundRobinTtlCompactionNormal) {
|
|
3828
|
+
Options options = CurrentOptions();
|
|
3829
|
+
options.compression = kNoCompression;
|
|
3830
|
+
options.level0_file_num_compaction_trigger = 20;
|
|
3831
|
+
options.ttl = 24 * 60 * 60; // 24 hours
|
|
3832
|
+
options.compaction_pri = kRoundRobin;
|
|
3833
|
+
env_->now_cpu_count_.store(0);
|
|
3834
|
+
env_->SetMockSleep();
|
|
3835
|
+
options.env = env_;
|
|
3836
|
+
|
|
3837
|
+
// add a small second for each wait time, to make sure the file is expired
|
|
3838
|
+
int small_seconds = 1;
|
|
3839
|
+
|
|
3840
|
+
std::atomic_int ttl_compactions{0};
|
|
3841
|
+
std::atomic_int round_robin_ttl_compactions{0};
|
|
3842
|
+
std::atomic_int other_compactions{0};
|
|
3843
|
+
|
|
3844
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3845
|
+
"LevelCompactionPicker::PickCompaction:Return", [&](void* arg) {
|
|
3846
|
+
Compaction* compaction = reinterpret_cast<Compaction*>(arg);
|
|
3847
|
+
auto compaction_reason = compaction->compaction_reason();
|
|
3848
|
+
if (compaction_reason == CompactionReason::kTtl) {
|
|
3849
|
+
ttl_compactions++;
|
|
3850
|
+
} else if (compaction_reason == CompactionReason::kRoundRobinTtl) {
|
|
3851
|
+
round_robin_ttl_compactions++;
|
|
3852
|
+
} else {
|
|
3853
|
+
other_compactions++;
|
|
3854
|
+
}
|
|
3855
|
+
});
|
|
3856
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3857
|
+
|
|
3858
|
+
DestroyAndReopen(options);
|
|
3859
|
+
|
|
3860
|
+
// Setup the files from lower level to up level, each file is 1 hour's older
|
|
3861
|
+
// than the next one.
|
|
3862
|
+
// create 10 files on the last level (L6)
|
|
3863
|
+
for (int i = 0; i < 10; i++) {
|
|
3864
|
+
for (int j = 0; j < 100; j++) {
|
|
3865
|
+
ASSERT_OK(Put(Key(i * 100 + j), "value" + std::to_string(i * 100 + j)));
|
|
3866
|
+
}
|
|
3867
|
+
ASSERT_OK(Flush());
|
|
3868
|
+
env_->MockSleepForSeconds(60 * 60); // generate 1 file per hour
|
|
3869
|
+
}
|
|
3870
|
+
MoveFilesToLevel(6);
|
|
3871
|
+
|
|
3872
|
+
// create 5 files on L5
|
|
3873
|
+
for (int i = 0; i < 5; i++) {
|
|
3874
|
+
for (int j = 0; j < 200; j++) {
|
|
3875
|
+
ASSERT_OK(Put(Key(i * 200 + j), "value" + std::to_string(i * 200 + j)));
|
|
3876
|
+
}
|
|
3877
|
+
ASSERT_OK(Flush());
|
|
3878
|
+
env_->MockSleepForSeconds(60 * 60);
|
|
3879
|
+
}
|
|
3880
|
+
MoveFilesToLevel(5);
|
|
3881
|
+
|
|
3882
|
+
// create 3 files on L4
|
|
3883
|
+
for (int i = 0; i < 3; i++) {
|
|
3884
|
+
for (int j = 0; j < 300; j++) {
|
|
3885
|
+
ASSERT_OK(Put(Key(i * 300 + j), "value" + std::to_string(i * 300 + j)));
|
|
3886
|
+
}
|
|
3887
|
+
ASSERT_OK(Flush());
|
|
3888
|
+
env_->MockSleepForSeconds(60 * 60);
|
|
3889
|
+
}
|
|
3890
|
+
MoveFilesToLevel(4);
|
|
3891
|
+
|
|
3892
|
+
// The LSM tree should be like:
|
|
3893
|
+
// L4: [0, 299], [300, 599], [600, 899]
|
|
3894
|
+
// L5: [0, 199] [200, 399]...............[800, 999]
|
|
3895
|
+
// L6: [0,99][100,199][200,299][300,399]...............[800,899][900,999]
|
|
3896
|
+
ASSERT_EQ("0,0,0,0,3,5,10", FilesPerLevel());
|
|
3897
|
+
|
|
3898
|
+
// make sure the first L5 file is expired
|
|
3899
|
+
env_->MockSleepForSeconds(16 * 60 * 60 + small_seconds++);
|
|
3900
|
+
|
|
3901
|
+
// trigger TTL compaction
|
|
3902
|
+
ASSERT_OK(Put(Key(4), "value" + std::to_string(1)));
|
|
3903
|
+
ASSERT_OK(Put(Key(5), "value" + std::to_string(1)));
|
|
3904
|
+
ASSERT_OK(Flush());
|
|
3905
|
+
|
|
3906
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
3907
|
+
|
|
3908
|
+
// verify there's a RoundRobin TTL compaction
|
|
3909
|
+
ASSERT_EQ(1, round_robin_ttl_compactions);
|
|
3910
|
+
round_robin_ttl_compactions = 0;
|
|
3911
|
+
|
|
3912
|
+
// expire 2 more files
|
|
3913
|
+
env_->MockSleepForSeconds(2 * 60 * 60 + small_seconds++);
|
|
3914
|
+
// trigger TTL compaction
|
|
3915
|
+
ASSERT_OK(Put(Key(4), "value" + std::to_string(2)));
|
|
3916
|
+
ASSERT_OK(Put(Key(5), "value" + std::to_string(2)));
|
|
3917
|
+
ASSERT_OK(Flush());
|
|
3918
|
+
|
|
3919
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
3920
|
+
|
|
3921
|
+
ASSERT_EQ(2, round_robin_ttl_compactions);
|
|
3922
|
+
round_robin_ttl_compactions = 0;
|
|
3923
|
+
|
|
3924
|
+
// expire 4 more files, 2 out of 3 files on L4 are expired
|
|
3925
|
+
env_->MockSleepForSeconds(4 * 60 * 60 + small_seconds++);
|
|
3926
|
+
// trigger TTL compaction
|
|
3927
|
+
ASSERT_OK(Put(Key(6), "value" + std::to_string(3)));
|
|
3928
|
+
ASSERT_OK(Put(Key(7), "value" + std::to_string(3)));
|
|
3929
|
+
ASSERT_OK(Flush());
|
|
3930
|
+
|
|
3931
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
3932
|
+
|
|
3933
|
+
ASSERT_EQ(1, NumTableFilesAtLevel(4));
|
|
3934
|
+
ASSERT_EQ(0, NumTableFilesAtLevel(5));
|
|
3935
|
+
|
|
3936
|
+
ASSERT_GT(round_robin_ttl_compactions, 0);
|
|
3937
|
+
round_robin_ttl_compactions = 0;
|
|
3938
|
+
|
|
3939
|
+
// make the first L0 file expired, which triggers a normal TTL compaction
|
|
3940
|
+
// instead of roundrobin TTL compaction, it will also include an extra file
|
|
3941
|
+
// from L0 because of overlap
|
|
3942
|
+
ASSERT_EQ(0, ttl_compactions);
|
|
3943
|
+
env_->MockSleepForSeconds(19 * 60 * 60 + small_seconds++);
|
|
3944
|
+
|
|
3945
|
+
// trigger TTL compaction
|
|
3946
|
+
ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
|
|
3947
|
+
ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
|
|
3948
|
+
ASSERT_OK(Flush());
|
|
3949
|
+
|
|
3950
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
3951
|
+
|
|
3952
|
+
// L0 -> L1 compaction is normal TTL compaction, L1 -> next levels compactions
|
|
3953
|
+
// are RoundRobin TTL compaction.
|
|
3954
|
+
ASSERT_GT(ttl_compactions, 0);
|
|
3955
|
+
ttl_compactions = 0;
|
|
3956
|
+
ASSERT_GT(round_robin_ttl_compactions, 0);
|
|
3957
|
+
round_robin_ttl_compactions = 0;
|
|
3958
|
+
|
|
3959
|
+
// All files are expired, so only the last level has data
|
|
3960
|
+
env_->MockSleepForSeconds(24 * 60 * 60);
|
|
3961
|
+
// trigger TTL compaction
|
|
3962
|
+
ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
|
|
3963
|
+
ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
|
|
3964
|
+
ASSERT_OK(Flush());
|
|
3965
|
+
|
|
3966
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
3967
|
+
ASSERT_EQ("0,0,0,0,0,0,2", FilesPerLevel());
|
|
3968
|
+
|
|
3969
|
+
ASSERT_GT(ttl_compactions, 0);
|
|
3970
|
+
ttl_compactions = 0;
|
|
3971
|
+
ASSERT_GT(round_robin_ttl_compactions, 0);
|
|
3972
|
+
round_robin_ttl_compactions = 0;
|
|
3973
|
+
|
|
3974
|
+
ASSERT_EQ(0, other_compactions);
|
|
3975
|
+
}
|
|
3976
|
+
|
|
3977
|
+
TEST_F(DBCompactionTest, RoundRobinTtlCompactionUnsortedTime) {
|
|
3978
|
+
// This is to test the case that the RoundRobin compaction cursor not pointing
|
|
3979
|
+
// to the oldest file, RoundRobin compaction should still compact the file
|
|
3980
|
+
// after cursor until all expired files are compacted.
|
|
3981
|
+
Options options = CurrentOptions();
|
|
3982
|
+
options.compression = kNoCompression;
|
|
3983
|
+
options.level0_file_num_compaction_trigger = 20;
|
|
3984
|
+
options.ttl = 24 * 60 * 60; // 24 hours
|
|
3985
|
+
options.compaction_pri = kRoundRobin;
|
|
3986
|
+
env_->now_cpu_count_.store(0);
|
|
3987
|
+
env_->SetMockSleep();
|
|
3988
|
+
options.env = env_;
|
|
3989
|
+
|
|
3990
|
+
std::atomic_int ttl_compactions{0};
|
|
3991
|
+
std::atomic_int round_robin_ttl_compactions{0};
|
|
3992
|
+
std::atomic_int other_compactions{0};
|
|
3993
|
+
|
|
3994
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
3995
|
+
"LevelCompactionPicker::PickCompaction:Return", [&](void* arg) {
|
|
3996
|
+
Compaction* compaction = reinterpret_cast<Compaction*>(arg);
|
|
3997
|
+
auto compaction_reason = compaction->compaction_reason();
|
|
3998
|
+
if (compaction_reason == CompactionReason::kTtl) {
|
|
3999
|
+
ttl_compactions++;
|
|
4000
|
+
} else if (compaction_reason == CompactionReason::kRoundRobinTtl) {
|
|
4001
|
+
round_robin_ttl_compactions++;
|
|
4002
|
+
} else {
|
|
4003
|
+
other_compactions++;
|
|
4004
|
+
}
|
|
4005
|
+
});
|
|
4006
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
4007
|
+
|
|
4008
|
+
DestroyAndReopen(options);
|
|
4009
|
+
|
|
4010
|
+
// create 10 files on the last level (L6)
|
|
4011
|
+
for (int i = 0; i < 10; i++) {
|
|
4012
|
+
for (int j = 0; j < 100; j++) {
|
|
4013
|
+
ASSERT_OK(Put(Key(i * 100 + j), "value" + std::to_string(i * 100 + j)));
|
|
4014
|
+
}
|
|
4015
|
+
ASSERT_OK(Flush());
|
|
4016
|
+
env_->MockSleepForSeconds(60 * 60); // generate 1 file per hour
|
|
4017
|
+
}
|
|
4018
|
+
MoveFilesToLevel(6);
|
|
4019
|
+
|
|
4020
|
+
// create 5 files on L5
|
|
4021
|
+
for (int i = 0; i < 5; i++) {
|
|
4022
|
+
for (int j = 0; j < 200; j++) {
|
|
4023
|
+
ASSERT_OK(Put(Key(i * 200 + j), "value" + std::to_string(i * 200 + j)));
|
|
4024
|
+
}
|
|
4025
|
+
ASSERT_OK(Flush());
|
|
4026
|
+
env_->MockSleepForSeconds(60 * 60); // 1 hour
|
|
4027
|
+
}
|
|
4028
|
+
MoveFilesToLevel(5);
|
|
4029
|
+
|
|
4030
|
+
// The LSM tree should be like:
|
|
4031
|
+
// L5: [0, 199] [200, 399] [400,599] [600,799] [800, 999]
|
|
4032
|
+
// L6: [0,99][100,199][200,299][300,399]....................[800,899][900,999]
|
|
4033
|
+
ASSERT_EQ("0,0,0,0,0,5,10", FilesPerLevel());
|
|
4034
|
+
|
|
4035
|
+
// point the compaction cursor to the 4th file on L5
|
|
4036
|
+
VersionSet* const versions = dbfull()->GetVersionSet();
|
|
4037
|
+
assert(versions);
|
|
4038
|
+
ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
|
|
4039
|
+
ASSERT_NE(cfd, nullptr);
|
|
4040
|
+
Version* const current = cfd->current();
|
|
4041
|
+
ASSERT_NE(current, nullptr);
|
|
4042
|
+
VersionStorageInfo* storage_info = current->storage_info();
|
|
4043
|
+
ASSERT_NE(storage_info, nullptr);
|
|
4044
|
+
const InternalKey split_cursor = InternalKey(Key(600), 100000, kTypeValue);
|
|
4045
|
+
storage_info->AddCursorForOneLevel(5, split_cursor);
|
|
4046
|
+
|
|
4047
|
+
// make the first file on L5 expired, there should be 3 TTL compactions:
|
|
4048
|
+
// 4th one, 5th one, then 1st one.
|
|
4049
|
+
env_->MockSleepForSeconds(19 * 60 * 60 + 1);
|
|
4050
|
+
// trigger TTL compaction
|
|
4051
|
+
ASSERT_OK(Put(Key(6), "value" + std::to_string(4)));
|
|
4052
|
+
ASSERT_OK(Put(Key(7), "value" + std::to_string(4)));
|
|
4053
|
+
ASSERT_OK(Flush());
|
|
4054
|
+
|
|
4055
|
+
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
|
4056
|
+
ASSERT_EQ(2, NumTableFilesAtLevel(5));
|
|
4057
|
+
|
|
4058
|
+
ASSERT_EQ(3, round_robin_ttl_compactions);
|
|
4059
|
+
ASSERT_EQ(0, ttl_compactions);
|
|
4060
|
+
ASSERT_EQ(0, other_compactions);
|
|
4061
|
+
}
|
|
4062
|
+
|
|
3827
4063
|
TEST_F(DBCompactionTest, LevelCompactExpiredTtlFiles) {
|
|
3828
4064
|
const int kNumKeysPerFile = 32;
|
|
3829
4065
|
const int kNumLevelFiles = 2;
|
|
@@ -7958,6 +8194,42 @@ TEST_F(DBCompactionTest, BottomPriCompactionCountsTowardConcurrencyLimit) {
|
|
|
7958
8194
|
compact_range_thread.join();
|
|
7959
8195
|
}
|
|
7960
8196
|
|
|
8197
|
+
TEST_F(DBCompactionTest, BottommostFileCompactionAllowIngestBehind) {
|
|
8198
|
+
// allow_ingest_behind prevents seqnum zeroing, and could cause
|
|
8199
|
+
// compaction loop with reason kBottommostFiles.
|
|
8200
|
+
Options options = CurrentOptions();
|
|
8201
|
+
options.env = env_;
|
|
8202
|
+
options.compaction_style = kCompactionStyleLevel;
|
|
8203
|
+
options.allow_ingest_behind = true;
|
|
8204
|
+
options.comparator = BytewiseComparator();
|
|
8205
|
+
DestroyAndReopen(options);
|
|
8206
|
+
|
|
8207
|
+
WriteOptions write_opts;
|
|
8208
|
+
ASSERT_OK(db_->Put(write_opts, "infinite", "compaction loop"));
|
|
8209
|
+
ASSERT_OK(db_->Put(write_opts, "infinite", "loop"));
|
|
8210
|
+
|
|
8211
|
+
ASSERT_OK(Flush());
|
|
8212
|
+
MoveFilesToLevel(1);
|
|
8213
|
+
ASSERT_OK(db_->Put(write_opts, "bumpseqnum", ""));
|
|
8214
|
+
ASSERT_OK(Flush());
|
|
8215
|
+
auto snapshot = db_->GetSnapshot();
|
|
8216
|
+
// Bump up oldest_snapshot_seqnum_ in VersionStorageInfo.
|
|
8217
|
+
db_->ReleaseSnapshot(snapshot);
|
|
8218
|
+
bool compacted = false;
|
|
8219
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
8220
|
+
"LevelCompactionPicker::PickCompaction:Return", [&](void* /* arg */) {
|
|
8221
|
+
// There should not be a compaction.
|
|
8222
|
+
compacted = true;
|
|
8223
|
+
});
|
|
8224
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
8225
|
+
// Wait for compaction to be scheduled.
|
|
8226
|
+
env_->SleepForMicroseconds(2000000);
|
|
8227
|
+
ASSERT_FALSE(compacted);
|
|
8228
|
+
// The following assert can be used to check for compaction loop:
|
|
8229
|
+
// it used to wait forever before the fix.
|
|
8230
|
+
// ASSERT_OK(dbfull()->TEST_WaitForCompact(true /* wait_unscheduled */));
|
|
8231
|
+
}
|
|
8232
|
+
|
|
7961
8233
|
#endif // !defined(ROCKSDB_LITE)
|
|
7962
8234
|
|
|
7963
8235
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -3032,6 +3032,44 @@ TEST_P(DBAtomicFlushTest, BgThreadNoWaitAfterManifestError) {
|
|
|
3032
3032
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
3033
3033
|
}
|
|
3034
3034
|
|
|
3035
|
+
TEST_P(DBAtomicFlushTest, NoWaitWhenWritesStopped) {
|
|
3036
|
+
Options options = GetDefaultOptions();
|
|
3037
|
+
options.create_if_missing = true;
|
|
3038
|
+
options.atomic_flush = GetParam();
|
|
3039
|
+
options.max_write_buffer_number = 2;
|
|
3040
|
+
options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
3041
|
+
|
|
3042
|
+
Reopen(options);
|
|
3043
|
+
|
|
3044
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3045
|
+
SyncPoint::GetInstance()->LoadDependency(
|
|
3046
|
+
{{"DBImpl::DelayWrite:Start",
|
|
3047
|
+
"DBAtomicFlushTest::NoWaitWhenWritesStopped:0"}});
|
|
3048
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
3049
|
+
|
|
3050
|
+
ASSERT_OK(dbfull()->PauseBackgroundWork());
|
|
3051
|
+
for (int i = 0; i < options.max_write_buffer_number; ++i) {
|
|
3052
|
+
ASSERT_OK(Put("k" + std::to_string(i), "v" + std::to_string(i)));
|
|
3053
|
+
}
|
|
3054
|
+
std::thread stalled_writer([&]() { ASSERT_OK(Put("k", "v")); });
|
|
3055
|
+
|
|
3056
|
+
TEST_SYNC_POINT("DBAtomicFlushTest::NoWaitWhenWritesStopped:0");
|
|
3057
|
+
|
|
3058
|
+
{
|
|
3059
|
+
FlushOptions flush_opts;
|
|
3060
|
+
flush_opts.wait = false;
|
|
3061
|
+
flush_opts.allow_write_stall = true;
|
|
3062
|
+
ASSERT_TRUE(db_->Flush(flush_opts).IsTryAgain());
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
ASSERT_OK(dbfull()->ContinueBackgroundWork());
|
|
3066
|
+
ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
|
|
3067
|
+
|
|
3068
|
+
stalled_writer.join();
|
|
3069
|
+
|
|
3070
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
3071
|
+
}
|
|
3072
|
+
|
|
3035
3073
|
INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
|
|
3036
3074
|
testing::Bool());
|
|
3037
3075
|
|
|
@@ -847,11 +847,13 @@ Status DBImpl::RegisterRecordSeqnoTimeWorker() {
|
|
|
847
847
|
InstrumentedMutexLock l(&mutex_);
|
|
848
848
|
|
|
849
849
|
for (auto cfd : *versions_->GetColumnFamilySet()) {
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
850
|
+
// preserve time is the max of 2 options.
|
|
851
|
+
uint64_t preserve_time_duration =
|
|
852
|
+
std::max(cfd->ioptions()->preserve_internal_time_seconds,
|
|
853
|
+
cfd->ioptions()->preclude_last_level_data_seconds);
|
|
854
|
+
if (!cfd->IsDropped() && preserve_time_duration > 0) {
|
|
855
|
+
min_time_duration = std::min(preserve_time_duration, min_time_duration);
|
|
856
|
+
max_time_duration = std::max(preserve_time_duration, max_time_duration);
|
|
855
857
|
}
|
|
856
858
|
}
|
|
857
859
|
if (min_time_duration == std::numeric_limits<uint64_t>::max()) {
|
|
@@ -863,8 +865,11 @@ Status DBImpl::RegisterRecordSeqnoTimeWorker() {
|
|
|
863
865
|
|
|
864
866
|
uint64_t seqno_time_cadence = 0;
|
|
865
867
|
if (min_time_duration != std::numeric_limits<uint64_t>::max()) {
|
|
868
|
+
// round up to 1 when the time_duration is smaller than
|
|
869
|
+
// kMaxSeqnoTimePairsPerCF
|
|
866
870
|
seqno_time_cadence =
|
|
867
|
-
min_time_duration
|
|
871
|
+
(min_time_duration + SeqnoToTimeMapping::kMaxSeqnoTimePairsPerCF - 1) /
|
|
872
|
+
SeqnoToTimeMapping::kMaxSeqnoTimePairsPerCF;
|
|
868
873
|
}
|
|
869
874
|
|
|
870
875
|
Status s;
|
|
@@ -1453,6 +1458,18 @@ Status DBImpl::FlushWAL(bool sync) {
|
|
|
1453
1458
|
return SyncWAL();
|
|
1454
1459
|
}
|
|
1455
1460
|
|
|
1461
|
+
bool DBImpl::WALBufferIsEmpty(bool lock) {
|
|
1462
|
+
if (lock) {
|
|
1463
|
+
log_write_mutex_.Lock();
|
|
1464
|
+
}
|
|
1465
|
+
log::Writer* cur_log_writer = logs_.back().writer;
|
|
1466
|
+
auto res = cur_log_writer->BufferIsEmpty();
|
|
1467
|
+
if (lock) {
|
|
1468
|
+
log_write_mutex_.Unlock();
|
|
1469
|
+
}
|
|
1470
|
+
return res;
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1456
1473
|
Status DBImpl::SyncWAL() {
|
|
1457
1474
|
TEST_SYNC_POINT("DBImpl::SyncWAL:Begin");
|
|
1458
1475
|
autovector<log::Writer*, 1> logs_to_sync;
|
|
@@ -3091,7 +3108,8 @@ Status DBImpl::CreateColumnFamilyImpl(const ColumnFamilyOptions& cf_options,
|
|
|
3091
3108
|
}
|
|
3092
3109
|
} // InstrumentedMutexLock l(&mutex_)
|
|
3093
3110
|
|
|
3094
|
-
if (cf_options.
|
|
3111
|
+
if (cf_options.preserve_internal_time_seconds > 0 ||
|
|
3112
|
+
cf_options.preclude_last_level_data_seconds > 0) {
|
|
3095
3113
|
s = RegisterRecordSeqnoTimeWorker();
|
|
3096
3114
|
}
|
|
3097
3115
|
sv_context.Clean();
|
|
@@ -3182,7 +3200,8 @@ Status DBImpl::DropColumnFamilyImpl(ColumnFamilyHandle* column_family) {
|
|
|
3182
3200
|
bg_cv_.SignalAll();
|
|
3183
3201
|
}
|
|
3184
3202
|
|
|
3185
|
-
if (cfd->ioptions()->
|
|
3203
|
+
if (cfd->ioptions()->preserve_internal_time_seconds > 0 ||
|
|
3204
|
+
cfd->ioptions()->preclude_last_level_data_seconds > 0) {
|
|
3186
3205
|
s = RegisterRecordSeqnoTimeWorker();
|
|
3187
3206
|
}
|
|
3188
3207
|
|
|
@@ -3662,14 +3681,16 @@ void DBImpl::ReleaseSnapshot(const Snapshot* s) {
|
|
|
3662
3681
|
if (oldest_snapshot > bottommost_files_mark_threshold_) {
|
|
3663
3682
|
CfdList cf_scheduled;
|
|
3664
3683
|
for (auto* cfd : *versions_->GetColumnFamilySet()) {
|
|
3665
|
-
cfd->
|
|
3666
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
3671
|
-
|
|
3672
|
-
|
|
3684
|
+
if (!cfd->ioptions()->allow_ingest_behind) {
|
|
3685
|
+
cfd->current()->storage_info()->UpdateOldestSnapshot(oldest_snapshot);
|
|
3686
|
+
if (!cfd->current()
|
|
3687
|
+
->storage_info()
|
|
3688
|
+
->BottommostFilesMarkedForCompaction()
|
|
3689
|
+
.empty()) {
|
|
3690
|
+
SchedulePendingCompaction(cfd);
|
|
3691
|
+
MaybeScheduleFlushOrCompaction();
|
|
3692
|
+
cf_scheduled.push_back(cfd);
|
|
3693
|
+
}
|
|
3673
3694
|
}
|
|
3674
3695
|
}
|
|
3675
3696
|
|
|
@@ -3678,7 +3699,8 @@ void DBImpl::ReleaseSnapshot(const Snapshot* s) {
|
|
|
3678
3699
|
// mutex might be unlocked during the loop, making the result inaccurate.
|
|
3679
3700
|
SequenceNumber new_bottommost_files_mark_threshold = kMaxSequenceNumber;
|
|
3680
3701
|
for (auto* cfd : *versions_->GetColumnFamilySet()) {
|
|
3681
|
-
if (CfdListContains(cf_scheduled, cfd)
|
|
3702
|
+
if (CfdListContains(cf_scheduled, cfd) ||
|
|
3703
|
+
cfd->ioptions()->allow_ingest_behind) {
|
|
3682
3704
|
continue;
|
|
3683
3705
|
}
|
|
3684
3706
|
new_bottommost_files_mark_threshold = std::min(
|
|
@@ -4391,10 +4413,14 @@ Status DBImpl::CheckConsistency() {
|
|
|
4391
4413
|
}
|
|
4392
4414
|
files_by_directory[md.db_path].push_back(fname);
|
|
4393
4415
|
}
|
|
4416
|
+
|
|
4417
|
+
IOOptions io_opts;
|
|
4418
|
+
io_opts.do_not_recurse = true;
|
|
4394
4419
|
for (const auto& dir_files : files_by_directory) {
|
|
4395
4420
|
std::string directory = dir_files.first;
|
|
4396
4421
|
std::vector<std::string> existing_files;
|
|
4397
|
-
Status s =
|
|
4422
|
+
Status s = fs_->GetChildren(directory, io_opts, &existing_files,
|
|
4423
|
+
/*IODebugContext*=*/nullptr);
|
|
4398
4424
|
if (!s.ok()) {
|
|
4399
4425
|
corruption_messages +=
|
|
4400
4426
|
"Can't list files in " + directory + ": " + s.ToString() + "\n";
|
|
@@ -4576,8 +4602,12 @@ Status DestroyDB(const std::string& dbname, const Options& options,
|
|
|
4576
4602
|
// Reset the logger because it holds a handle to the
|
|
4577
4603
|
// log file and prevents cleanup and directory removal
|
|
4578
4604
|
soptions.info_log.reset();
|
|
4605
|
+
IOOptions io_opts;
|
|
4579
4606
|
// Ignore error in case directory does not exist
|
|
4580
|
-
|
|
4607
|
+
soptions.fs
|
|
4608
|
+
->GetChildren(dbname, io_opts, &filenames,
|
|
4609
|
+
/*IODebugContext*=*/nullptr)
|
|
4610
|
+
.PermitUncheckedError();
|
|
4581
4611
|
|
|
4582
4612
|
FileLock* lock;
|
|
4583
4613
|
const std::string lockname = LockFileName(dbname);
|
|
@@ -4617,8 +4647,12 @@ Status DestroyDB(const std::string& dbname, const Options& options,
|
|
|
4617
4647
|
paths.insert(cf_path.path);
|
|
4618
4648
|
}
|
|
4619
4649
|
}
|
|
4650
|
+
|
|
4620
4651
|
for (const auto& path : paths) {
|
|
4621
|
-
if (
|
|
4652
|
+
if (soptions.fs
|
|
4653
|
+
->GetChildren(path, io_opts, &filenames,
|
|
4654
|
+
/*IODebugContext*=*/nullptr)
|
|
4655
|
+
.ok()) {
|
|
4622
4656
|
for (const auto& fname : filenames) {
|
|
4623
4657
|
if (ParseFileName(fname, &number, &type) &&
|
|
4624
4658
|
(type == kTableFile ||
|
|
@@ -4640,7 +4674,11 @@ Status DestroyDB(const std::string& dbname, const Options& options,
|
|
|
4640
4674
|
std::string archivedir = ArchivalDirectory(dbname);
|
|
4641
4675
|
bool wal_dir_exists = false;
|
|
4642
4676
|
if (!soptions.IsWalDirSameAsDBPath(dbname)) {
|
|
4643
|
-
wal_dir_exists =
|
|
4677
|
+
wal_dir_exists =
|
|
4678
|
+
soptions.fs
|
|
4679
|
+
->GetChildren(soptions.wal_dir, io_opts, &walDirFiles,
|
|
4680
|
+
/*IODebugContext*=*/nullptr)
|
|
4681
|
+
.ok();
|
|
4644
4682
|
archivedir = ArchivalDirectory(soptions.wal_dir);
|
|
4645
4683
|
}
|
|
4646
4684
|
|
|
@@ -4648,7 +4686,10 @@ Status DestroyDB(const std::string& dbname, const Options& options,
|
|
|
4648
4686
|
// processed and removed before those otherwise we have issues
|
|
4649
4687
|
// removing them
|
|
4650
4688
|
std::vector<std::string> archiveFiles;
|
|
4651
|
-
if (
|
|
4689
|
+
if (soptions.fs
|
|
4690
|
+
->GetChildren(archivedir, io_opts, &archiveFiles,
|
|
4691
|
+
/*IODebugContext*=*/nullptr)
|
|
4692
|
+
.ok()) {
|
|
4652
4693
|
// Delete archival files.
|
|
4653
4694
|
for (const auto& file : archiveFiles) {
|
|
4654
4695
|
if (ParseFileName(file, &number, &type) && type == kWalFile) {
|
|
@@ -4789,7 +4830,10 @@ Status DBImpl::DeleteObsoleteOptionsFiles() {
|
|
|
4789
4830
|
// to the oldest.
|
|
4790
4831
|
std::map<uint64_t, std::string> options_filenames;
|
|
4791
4832
|
Status s;
|
|
4792
|
-
|
|
4833
|
+
IOOptions io_opts;
|
|
4834
|
+
io_opts.do_not_recurse = true;
|
|
4835
|
+
s = fs_->GetChildren(GetName(), io_opts, &filenames,
|
|
4836
|
+
/*IODebugContext*=*/nullptr);
|
|
4793
4837
|
if (!s.ok()) {
|
|
4794
4838
|
return s;
|
|
4795
4839
|
}
|
|
@@ -5247,7 +5291,7 @@ Status DBImpl::IngestExternalFiles(
|
|
|
5247
5291
|
mutex_.Unlock();
|
|
5248
5292
|
status = AtomicFlushMemTables(cfds_to_flush, flush_opts,
|
|
5249
5293
|
FlushReason::kExternalFileIngestion,
|
|
5250
|
-
true /*
|
|
5294
|
+
true /* entered_write_thread */);
|
|
5251
5295
|
mutex_.Lock();
|
|
5252
5296
|
} else {
|
|
5253
5297
|
for (size_t i = 0; i != num_cfs; ++i) {
|
|
@@ -5258,7 +5302,7 @@ Status DBImpl::IngestExternalFiles(
|
|
|
5258
5302
|
->cfd();
|
|
5259
5303
|
status = FlushMemTable(cfd, flush_opts,
|
|
5260
5304
|
FlushReason::kExternalFileIngestion,
|
|
5261
|
-
true /*
|
|
5305
|
+
true /* entered_write_thread */);
|
|
5262
5306
|
mutex_.Lock();
|
|
5263
5307
|
if (!status.ok()) {
|
|
5264
5308
|
break;
|
|
@@ -222,6 +222,9 @@ class DBImpl : public DB {
|
|
|
222
222
|
Status DeleteRange(const WriteOptions& options,
|
|
223
223
|
ColumnFamilyHandle* column_family, const Slice& begin_key,
|
|
224
224
|
const Slice& end_key) override;
|
|
225
|
+
Status DeleteRange(const WriteOptions& options,
|
|
226
|
+
ColumnFamilyHandle* column_family, const Slice& begin_key,
|
|
227
|
+
const Slice& end_key, const Slice& ts) override;
|
|
225
228
|
|
|
226
229
|
using DB::Write;
|
|
227
230
|
virtual Status Write(const WriteOptions& options,
|
|
@@ -423,7 +426,7 @@ class DBImpl : public DB {
|
|
|
423
426
|
const FlushOptions& options,
|
|
424
427
|
const std::vector<ColumnFamilyHandle*>& column_families) override;
|
|
425
428
|
virtual Status FlushWAL(bool sync) override;
|
|
426
|
-
bool
|
|
429
|
+
bool WALBufferIsEmpty(bool lock = true);
|
|
427
430
|
virtual Status SyncWAL() override;
|
|
428
431
|
virtual Status LockWAL() override;
|
|
429
432
|
virtual Status UnlockWAL() override;
|
|
@@ -1877,12 +1880,13 @@ class DBImpl : public DB {
|
|
|
1877
1880
|
|
|
1878
1881
|
// Force current memtable contents to be flushed.
|
|
1879
1882
|
Status FlushMemTable(ColumnFamilyData* cfd, const FlushOptions& options,
|
|
1880
|
-
FlushReason flush_reason,
|
|
1883
|
+
FlushReason flush_reason,
|
|
1884
|
+
bool entered_write_thread = false);
|
|
1881
1885
|
|
|
1882
1886
|
Status AtomicFlushMemTables(
|
|
1883
1887
|
const autovector<ColumnFamilyData*>& column_family_datas,
|
|
1884
1888
|
const FlushOptions& options, FlushReason flush_reason,
|
|
1885
|
-
bool
|
|
1889
|
+
bool entered_write_thread = false);
|
|
1886
1890
|
|
|
1887
1891
|
// Wait until flushing this column family won't stall writes
|
|
1888
1892
|
Status WaitUntilFlushWouldNotStallWrites(ColumnFamilyData* cfd,
|