@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
|
@@ -25,22 +25,36 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
25
25
|
const std::vector<int>& rand_column_families,
|
|
26
26
|
const std::vector<int64_t>& rand_keys,
|
|
27
27
|
char (&value)[100]) override {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
assert(!rand_column_families.empty());
|
|
29
|
+
assert(!rand_keys.empty());
|
|
30
|
+
|
|
31
|
+
const std::string k = Key(rand_keys[0]);
|
|
32
|
+
|
|
33
|
+
const uint32_t value_base = batch_id_.fetch_add(1);
|
|
34
|
+
const size_t sz = GenerateValue(value_base, value, sizeof(value));
|
|
35
|
+
const Slice v(value, sz);
|
|
36
|
+
|
|
34
37
|
WriteBatch batch;
|
|
38
|
+
|
|
39
|
+
const bool use_put_entity = !FLAGS_use_merge &&
|
|
40
|
+
FLAGS_use_put_entity_one_in > 0 &&
|
|
41
|
+
(value_base % FLAGS_use_put_entity_one_in) == 0;
|
|
42
|
+
|
|
35
43
|
for (auto cf : rand_column_families) {
|
|
36
|
-
ColumnFamilyHandle* cfh = column_families_[cf];
|
|
44
|
+
ColumnFamilyHandle* const cfh = column_families_[cf];
|
|
45
|
+
assert(cfh);
|
|
46
|
+
|
|
37
47
|
if (FLAGS_use_merge) {
|
|
38
|
-
batch.Merge(cfh,
|
|
39
|
-
} else
|
|
40
|
-
batch.
|
|
48
|
+
batch.Merge(cfh, k, v);
|
|
49
|
+
} else if (use_put_entity) {
|
|
50
|
+
batch.PutEntity(cfh, k, GenerateWideColumns(value_base, v));
|
|
51
|
+
} else {
|
|
52
|
+
batch.Put(cfh, k, v);
|
|
41
53
|
}
|
|
42
54
|
}
|
|
55
|
+
|
|
43
56
|
Status s = db_->Write(write_opts, &batch);
|
|
57
|
+
|
|
44
58
|
if (!s.ok()) {
|
|
45
59
|
fprintf(stderr, "multi put or merge error: %s\n", s.ToString().c_str());
|
|
46
60
|
thread->stats.AddErrors(1);
|
|
@@ -240,42 +254,69 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
240
254
|
Status TestPrefixScan(ThreadState* thread, const ReadOptions& readoptions,
|
|
241
255
|
const std::vector<int>& rand_column_families,
|
|
242
256
|
const std::vector<int64_t>& rand_keys) override {
|
|
243
|
-
|
|
257
|
+
assert(!rand_column_families.empty());
|
|
258
|
+
assert(!rand_keys.empty());
|
|
259
|
+
|
|
260
|
+
const std::string key = Key(rand_keys[0]);
|
|
261
|
+
|
|
262
|
+
const size_t prefix_to_use =
|
|
244
263
|
(FLAGS_prefix_size < 0) ? 7 : static_cast<size_t>(FLAGS_prefix_size);
|
|
245
264
|
|
|
246
|
-
|
|
247
|
-
Slice key = key_str;
|
|
248
|
-
Slice prefix = Slice(key.data(), prefix_to_use);
|
|
265
|
+
const Slice prefix(key.data(), prefix_to_use);
|
|
249
266
|
|
|
250
267
|
std::string upper_bound;
|
|
251
268
|
Slice ub_slice;
|
|
269
|
+
|
|
252
270
|
ReadOptions ro_copy = readoptions;
|
|
271
|
+
|
|
253
272
|
// Get the next prefix first and then see if we want to set upper bound.
|
|
254
273
|
// We'll use the next prefix in an assertion later on
|
|
255
274
|
if (GetNextPrefix(prefix, &upper_bound) && thread->rand.OneIn(2)) {
|
|
256
275
|
ub_slice = Slice(upper_bound);
|
|
257
276
|
ro_copy.iterate_upper_bound = &ub_slice;
|
|
258
277
|
}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
278
|
+
|
|
279
|
+
ColumnFamilyHandle* const cfh =
|
|
280
|
+
column_families_[rand_column_families[thread->rand.Uniform(
|
|
281
|
+
static_cast<int>(rand_column_families.size()))]];
|
|
282
|
+
assert(cfh);
|
|
283
|
+
|
|
284
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(ro_copy, cfh));
|
|
285
|
+
|
|
286
|
+
uint64_t count = 0;
|
|
287
|
+
Status s;
|
|
288
|
+
|
|
264
289
|
for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix);
|
|
265
290
|
iter->Next()) {
|
|
266
291
|
++count;
|
|
292
|
+
|
|
293
|
+
const WideColumns expected_columns = GenerateExpectedWideColumns(
|
|
294
|
+
GetValueBase(iter->value()), iter->value());
|
|
295
|
+
if (iter->columns() != expected_columns) {
|
|
296
|
+
s = Status::Corruption(
|
|
297
|
+
"Value and columns inconsistent",
|
|
298
|
+
DebugString(iter->value(), iter->columns(), expected_columns));
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
267
301
|
}
|
|
302
|
+
|
|
268
303
|
assert(prefix_to_use == 0 ||
|
|
269
304
|
count <= GetPrefixKeyCount(prefix.ToString(), upper_bound));
|
|
270
|
-
|
|
305
|
+
|
|
271
306
|
if (s.ok()) {
|
|
272
|
-
|
|
273
|
-
}
|
|
307
|
+
s = iter->status();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (!s.ok()) {
|
|
274
311
|
fprintf(stderr, "TestPrefixScan error: %s\n", s.ToString().c_str());
|
|
275
312
|
thread->stats.AddErrors(1);
|
|
313
|
+
|
|
314
|
+
return s;
|
|
276
315
|
}
|
|
277
|
-
|
|
278
|
-
|
|
316
|
+
|
|
317
|
+
thread->stats.AddPrefixes(1, count);
|
|
318
|
+
|
|
319
|
+
return Status::OK();
|
|
279
320
|
}
|
|
280
321
|
|
|
281
322
|
ColumnFamilyHandle* GetControlCfh(ThreadState* thread,
|
|
@@ -289,6 +330,7 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
289
330
|
// This `ReadOptions` is for validation purposes. Ignore
|
|
290
331
|
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
291
332
|
ReadOptions options(FLAGS_verify_checksum, true);
|
|
333
|
+
|
|
292
334
|
// We must set total_order_seek to true because we are doing a SeekToFirst
|
|
293
335
|
// on a column family whose memtables may support (by default) prefix-based
|
|
294
336
|
// iterator. In this case, NewIterator with options.total_order_seek being
|
|
@@ -297,54 +339,73 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
297
339
|
// iterate the memtable using this iterator any more, although the memtable
|
|
298
340
|
// contains the most up-to-date key-values.
|
|
299
341
|
options.total_order_seek = true;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
for (size_t i = 0; i
|
|
310
|
-
iters
|
|
311
|
-
|
|
312
|
-
for (auto& iter : iters) {
|
|
313
|
-
iter->SeekToFirst();
|
|
342
|
+
|
|
343
|
+
ManagedSnapshot snapshot_guard(db_);
|
|
344
|
+
options.snapshot = snapshot_guard.snapshot();
|
|
345
|
+
|
|
346
|
+
const size_t num = column_families_.size();
|
|
347
|
+
|
|
348
|
+
std::vector<std::unique_ptr<Iterator>> iters;
|
|
349
|
+
iters.reserve(num);
|
|
350
|
+
|
|
351
|
+
for (size_t i = 0; i < num; ++i) {
|
|
352
|
+
iters.emplace_back(db_->NewIterator(options, column_families_[i]));
|
|
353
|
+
iters.back()->SeekToFirst();
|
|
314
354
|
}
|
|
315
|
-
|
|
316
|
-
assert(num == iters.size());
|
|
355
|
+
|
|
317
356
|
std::vector<Status> statuses(num, Status::OK());
|
|
357
|
+
|
|
358
|
+
assert(thread);
|
|
359
|
+
|
|
360
|
+
auto shared = thread->shared;
|
|
361
|
+
assert(shared);
|
|
362
|
+
|
|
318
363
|
do {
|
|
319
364
|
if (shared->HasVerificationFailedYet()) {
|
|
320
365
|
break;
|
|
321
366
|
}
|
|
367
|
+
|
|
322
368
|
size_t valid_cnt = 0;
|
|
323
|
-
|
|
324
|
-
for (
|
|
369
|
+
|
|
370
|
+
for (size_t i = 0; i < num; ++i) {
|
|
371
|
+
const auto& iter = iters[i];
|
|
372
|
+
assert(iter);
|
|
373
|
+
|
|
325
374
|
if (iter->Valid()) {
|
|
326
|
-
|
|
375
|
+
const WideColumns expected_columns = GenerateExpectedWideColumns(
|
|
376
|
+
GetValueBase(iter->value()), iter->value());
|
|
377
|
+
if (iter->columns() != expected_columns) {
|
|
378
|
+
statuses[i] = Status::Corruption(
|
|
379
|
+
"Value and columns inconsistent",
|
|
380
|
+
DebugString(iter->value(), iter->columns(), expected_columns));
|
|
381
|
+
} else {
|
|
382
|
+
++valid_cnt;
|
|
383
|
+
}
|
|
327
384
|
} else {
|
|
328
|
-
statuses[
|
|
385
|
+
statuses[i] = iter->status();
|
|
329
386
|
}
|
|
330
|
-
++idx;
|
|
331
387
|
}
|
|
388
|
+
|
|
332
389
|
if (valid_cnt == 0) {
|
|
333
|
-
|
|
334
|
-
for (size_t i = 0; i != num; ++i) {
|
|
390
|
+
for (size_t i = 0; i < num; ++i) {
|
|
335
391
|
const auto& s = statuses[i];
|
|
336
392
|
if (!s.ok()) {
|
|
337
|
-
status = s;
|
|
338
393
|
fprintf(stderr, "Iterator on cf %s has error: %s\n",
|
|
339
394
|
column_families_[i]->GetName().c_str(),
|
|
340
395
|
s.ToString().c_str());
|
|
341
396
|
shared->SetVerificationFailure();
|
|
342
397
|
}
|
|
343
398
|
}
|
|
399
|
+
|
|
344
400
|
break;
|
|
345
|
-
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
if (valid_cnt < num) {
|
|
346
404
|
shared->SetVerificationFailure();
|
|
347
|
-
|
|
405
|
+
|
|
406
|
+
for (size_t i = 0; i < num; ++i) {
|
|
407
|
+
assert(iters[i]);
|
|
408
|
+
|
|
348
409
|
if (!iters[i]->Valid()) {
|
|
349
410
|
if (statuses[i].ok()) {
|
|
350
411
|
fprintf(stderr, "Finished scanning cf %s\n",
|
|
@@ -359,83 +420,105 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
359
420
|
column_families_[i]->GetName().c_str());
|
|
360
421
|
}
|
|
361
422
|
}
|
|
423
|
+
|
|
362
424
|
break;
|
|
363
425
|
}
|
|
426
|
+
|
|
364
427
|
if (shared->HasVerificationFailedYet()) {
|
|
365
428
|
break;
|
|
366
429
|
}
|
|
430
|
+
|
|
367
431
|
// If the program reaches here, then all column families' iterators are
|
|
368
432
|
// still valid.
|
|
433
|
+
assert(valid_cnt == num);
|
|
434
|
+
|
|
369
435
|
if (shared->PrintingVerificationResults()) {
|
|
370
436
|
continue;
|
|
371
437
|
}
|
|
372
|
-
|
|
373
|
-
|
|
438
|
+
|
|
439
|
+
assert(iters[0]);
|
|
440
|
+
|
|
441
|
+
const Slice key = iters[0]->key();
|
|
442
|
+
const Slice value = iters[0]->value();
|
|
443
|
+
|
|
374
444
|
int num_mismatched_cfs = 0;
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
column_families_[0]->GetName().c_str(),
|
|
389
|
-
key.ToString(true /* hex */).c_str(),
|
|
390
|
-
value.ToString(true /* hex */).c_str());
|
|
391
|
-
}
|
|
445
|
+
|
|
446
|
+
for (size_t i = 1; i < num; ++i) {
|
|
447
|
+
assert(iters[i]);
|
|
448
|
+
|
|
449
|
+
const int cmp = key.compare(iters[i]->key());
|
|
450
|
+
|
|
451
|
+
if (cmp != 0) {
|
|
452
|
+
++num_mismatched_cfs;
|
|
453
|
+
|
|
454
|
+
if (1 == num_mismatched_cfs) {
|
|
455
|
+
fprintf(stderr, "Verification failed\n");
|
|
456
|
+
fprintf(stderr, "Latest Sequence Number: %" PRIu64 "\n",
|
|
457
|
+
db_->GetLatestSequenceNumber());
|
|
392
458
|
fprintf(stderr, "[%s] %s => %s\n",
|
|
393
|
-
column_families_[
|
|
394
|
-
|
|
395
|
-
|
|
459
|
+
column_families_[0]->GetName().c_str(),
|
|
460
|
+
key.ToString(true /* hex */).c_str(),
|
|
461
|
+
value.ToString(true /* hex */).c_str());
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
fprintf(stderr, "[%s] %s => %s\n",
|
|
465
|
+
column_families_[i]->GetName().c_str(),
|
|
466
|
+
iters[i]->key().ToString(true /* hex */).c_str(),
|
|
467
|
+
iters[i]->value().ToString(true /* hex */).c_str());
|
|
468
|
+
|
|
396
469
|
#ifndef ROCKSDB_LITE
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
470
|
+
Slice begin_key;
|
|
471
|
+
Slice end_key;
|
|
472
|
+
if (cmp < 0) {
|
|
473
|
+
begin_key = key;
|
|
474
|
+
end_key = iters[i]->key();
|
|
475
|
+
} else {
|
|
476
|
+
begin_key = iters[i]->key();
|
|
477
|
+
end_key = key;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
const auto print_key_versions = [&](ColumnFamilyHandle* cfh) {
|
|
481
|
+
constexpr size_t kMaxNumIKeys = 8;
|
|
482
|
+
|
|
406
483
|
std::vector<KeyVersion> versions;
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
fprintf(stderr, "%s\n", s.ToString().c_str());
|
|
413
|
-
return;
|
|
414
|
-
}
|
|
415
|
-
assert(nullptr != cfh);
|
|
416
|
-
fprintf(stderr,
|
|
417
|
-
"Internal keys in CF '%s', [%s, %s] (max %" ROCKSDB_PRIszt
|
|
418
|
-
")\n",
|
|
419
|
-
cfh->GetName().c_str(),
|
|
420
|
-
begin_key.ToString(true /* hex */).c_str(),
|
|
421
|
-
end_key.ToString(true /* hex */).c_str(), kMaxNumIKeys);
|
|
422
|
-
for (const KeyVersion& kv : versions) {
|
|
423
|
-
fprintf(stderr, " key %s seq %" PRIu64 " type %d\n",
|
|
424
|
-
Slice(kv.user_key).ToString(true).c_str(), kv.sequence,
|
|
425
|
-
kv.type);
|
|
426
|
-
}
|
|
427
|
-
};
|
|
428
|
-
if (1 == num_mismatched_cfs) {
|
|
429
|
-
print_key_versions(column_families_[0]);
|
|
484
|
+
const Status s = GetAllKeyVersions(db_, cfh, begin_key, end_key,
|
|
485
|
+
kMaxNumIKeys, &versions);
|
|
486
|
+
if (!s.ok()) {
|
|
487
|
+
fprintf(stderr, "%s\n", s.ToString().c_str());
|
|
488
|
+
return;
|
|
430
489
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
490
|
+
|
|
491
|
+
assert(cfh);
|
|
492
|
+
|
|
493
|
+
fprintf(stderr,
|
|
494
|
+
"Internal keys in CF '%s', [%s, %s] (max %" ROCKSDB_PRIszt
|
|
495
|
+
")\n",
|
|
496
|
+
cfh->GetName().c_str(),
|
|
497
|
+
begin_key.ToString(true /* hex */).c_str(),
|
|
498
|
+
end_key.ToString(true /* hex */).c_str(), kMaxNumIKeys);
|
|
499
|
+
|
|
500
|
+
for (const KeyVersion& kv : versions) {
|
|
501
|
+
fprintf(stderr, " key %s seq %" PRIu64 " type %d\n",
|
|
502
|
+
Slice(kv.user_key).ToString(true).c_str(), kv.sequence,
|
|
503
|
+
kv.type);
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
if (1 == num_mismatched_cfs) {
|
|
508
|
+
print_key_versions(column_families_[0]);
|
|
434
509
|
}
|
|
510
|
+
|
|
511
|
+
print_key_versions(column_families_[i]);
|
|
512
|
+
#endif // ROCKSDB_LITE
|
|
513
|
+
|
|
514
|
+
shared->SetVerificationFailure();
|
|
435
515
|
}
|
|
436
516
|
}
|
|
517
|
+
|
|
437
518
|
shared->FinishPrintingVerificationResults();
|
|
519
|
+
|
|
438
520
|
for (auto& iter : iters) {
|
|
521
|
+
assert(iter);
|
|
439
522
|
iter->Next();
|
|
440
523
|
}
|
|
441
524
|
} while (true);
|
|
@@ -469,11 +552,19 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
469
552
|
const auto checksum_column_family = [](Iterator* iter,
|
|
470
553
|
uint32_t* checksum) -> Status {
|
|
471
554
|
assert(nullptr != checksum);
|
|
555
|
+
|
|
472
556
|
uint32_t ret = 0;
|
|
473
557
|
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
|
|
474
558
|
ret = crc32c::Extend(ret, iter->key().data(), iter->key().size());
|
|
475
559
|
ret = crc32c::Extend(ret, iter->value().data(), iter->value().size());
|
|
560
|
+
|
|
561
|
+
for (const auto& column : iter->columns()) {
|
|
562
|
+
ret = crc32c::Extend(ret, column.name().data(), column.name().size());
|
|
563
|
+
ret =
|
|
564
|
+
crc32c::Extend(ret, column.value().data(), column.value().size());
|
|
565
|
+
}
|
|
476
566
|
}
|
|
567
|
+
|
|
477
568
|
*checksum = ret;
|
|
478
569
|
return iter->status();
|
|
479
570
|
};
|
|
@@ -538,7 +629,7 @@ class CfConsistencyStressTest : public StressTest {
|
|
|
538
629
|
}
|
|
539
630
|
|
|
540
631
|
private:
|
|
541
|
-
std::atomic<
|
|
632
|
+
std::atomic<uint32_t> batch_id_;
|
|
542
633
|
};
|
|
543
634
|
|
|
544
635
|
StressTest* CreateCfConsistencyStressTest() {
|
|
@@ -239,6 +239,45 @@ uint32_t GetValueBase(Slice s) {
|
|
|
239
239
|
return res;
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
+
WideColumns GenerateWideColumns(uint32_t value_base, const Slice& slice) {
|
|
243
|
+
WideColumns columns;
|
|
244
|
+
|
|
245
|
+
constexpr size_t max_columns = 4;
|
|
246
|
+
const size_t num_columns = (value_base % max_columns) + 1;
|
|
247
|
+
|
|
248
|
+
columns.reserve(num_columns);
|
|
249
|
+
|
|
250
|
+
assert(slice.size() >= num_columns);
|
|
251
|
+
|
|
252
|
+
columns.emplace_back(kDefaultWideColumnName, slice);
|
|
253
|
+
|
|
254
|
+
for (size_t i = 1; i < num_columns; ++i) {
|
|
255
|
+
const Slice name(slice.data(), i);
|
|
256
|
+
const Slice value(slice.data() + i, slice.size() - i);
|
|
257
|
+
|
|
258
|
+
columns.emplace_back(name, value);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return columns;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
WideColumns GenerateExpectedWideColumns(uint32_t value_base,
|
|
265
|
+
const Slice& slice) {
|
|
266
|
+
if (FLAGS_use_put_entity_one_in == 0 ||
|
|
267
|
+
(value_base % FLAGS_use_put_entity_one_in) != 0) {
|
|
268
|
+
return WideColumns{{kDefaultWideColumnName, slice}};
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
WideColumns columns = GenerateWideColumns(value_base, slice);
|
|
272
|
+
|
|
273
|
+
std::sort(columns.begin(), columns.end(),
|
|
274
|
+
[](const WideColumn& lhs, const WideColumn& rhs) {
|
|
275
|
+
return lhs.name().compare(rhs.name()) < 0;
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
return columns;
|
|
279
|
+
}
|
|
280
|
+
|
|
242
281
|
std::string GetNowNanos() {
|
|
243
282
|
uint64_t t = db_stress_env->NowNanos();
|
|
244
283
|
std::string ret;
|
|
@@ -86,6 +86,7 @@ DECLARE_string(options_file);
|
|
|
86
86
|
DECLARE_int64(active_width);
|
|
87
87
|
DECLARE_bool(test_batches_snapshots);
|
|
88
88
|
DECLARE_bool(atomic_flush);
|
|
89
|
+
DECLARE_int32(manual_wal_flush_one_in);
|
|
89
90
|
DECLARE_bool(test_cf_consistency);
|
|
90
91
|
DECLARE_bool(test_multi_ops_txns);
|
|
91
92
|
DECLARE_int32(threads);
|
|
@@ -173,6 +174,7 @@ DECLARE_bool(mock_direct_io);
|
|
|
173
174
|
DECLARE_bool(statistics);
|
|
174
175
|
DECLARE_bool(sync);
|
|
175
176
|
DECLARE_bool(use_fsync);
|
|
177
|
+
DECLARE_uint64(stats_dump_period_sec);
|
|
176
178
|
DECLARE_uint64(bytes_per_sync);
|
|
177
179
|
DECLARE_uint64(wal_bytes_per_sync);
|
|
178
180
|
DECLARE_int32(kill_random_test);
|
|
@@ -235,6 +237,7 @@ DECLARE_bool(in_place_update);
|
|
|
235
237
|
DECLARE_string(memtablerep);
|
|
236
238
|
DECLARE_int32(prefix_size);
|
|
237
239
|
DECLARE_bool(use_merge);
|
|
240
|
+
DECLARE_uint32(use_put_entity_one_in);
|
|
238
241
|
DECLARE_bool(use_full_merge_v1);
|
|
239
242
|
DECLARE_int32(sync_wal_one_in);
|
|
240
243
|
DECLARE_bool(avoid_unnecessary_blocking_io);
|
|
@@ -311,6 +314,7 @@ DECLARE_bool(allow_data_in_errors);
|
|
|
311
314
|
// Tiered storage
|
|
312
315
|
DECLARE_bool(enable_tiered_storage); // set last_level_temperature
|
|
313
316
|
DECLARE_int64(preclude_last_level_data_seconds);
|
|
317
|
+
DECLARE_int64(preserve_internal_time_seconds);
|
|
314
318
|
|
|
315
319
|
DECLARE_int32(verify_iterator_with_expected_state_one_in);
|
|
316
320
|
DECLARE_bool(preserve_unverified_changes);
|
|
@@ -620,6 +624,10 @@ extern std::vector<int64_t> GenerateNKeys(ThreadState* thread, int num_keys,
|
|
|
620
624
|
extern size_t GenerateValue(uint32_t rand, char* v, size_t max_sz);
|
|
621
625
|
extern uint32_t GetValueBase(Slice s);
|
|
622
626
|
|
|
627
|
+
extern WideColumns GenerateWideColumns(uint32_t value_base, const Slice& slice);
|
|
628
|
+
extern WideColumns GenerateExpectedWideColumns(uint32_t value_base,
|
|
629
|
+
const Slice& slice);
|
|
630
|
+
|
|
623
631
|
extern StressTest* CreateCfConsistencyStressTest();
|
|
624
632
|
extern StressTest* CreateBatchedOpsStressTest();
|
|
625
633
|
extern StressTest* CreateNonBatchedOpsStressTest();
|
|
@@ -143,7 +143,9 @@ bool RunStressTest(StressTest* stress) {
|
|
|
143
143
|
|
|
144
144
|
// This is after the verification step to avoid making all those `Get()`s
|
|
145
145
|
// and `MultiGet()`s contend on the DB-wide trace mutex.
|
|
146
|
-
|
|
146
|
+
if (!FLAGS_expected_values_dir.empty()) {
|
|
147
|
+
stress->TrackExpectedState(&shared);
|
|
148
|
+
}
|
|
147
149
|
|
|
148
150
|
now = clock->NowMicros();
|
|
149
151
|
fprintf(stdout, "%s Starting database operations\n",
|
|
@@ -85,6 +85,13 @@ DEFINE_bool(test_batches_snapshots, false,
|
|
|
85
85
|
DEFINE_bool(atomic_flush, false,
|
|
86
86
|
"If set, enables atomic flush in the options.\n");
|
|
87
87
|
|
|
88
|
+
DEFINE_int32(
|
|
89
|
+
manual_wal_flush_one_in, 0,
|
|
90
|
+
"If non-zero, then `FlushWAL(bool sync)`, where `bool sync` is randomly "
|
|
91
|
+
"decided, will be explictly called in db stress once for every N ops "
|
|
92
|
+
"on average. Setting `manual_wal_flush_one_in` to be greater than 0 "
|
|
93
|
+
"implies `Options::manual_wal_flush = true` is set.");
|
|
94
|
+
|
|
88
95
|
DEFINE_bool(test_cf_consistency, false,
|
|
89
96
|
"If set, runs the stress test dedicated to verifying writes to "
|
|
90
97
|
"multiple column families are consistent. Setting this implies "
|
|
@@ -489,6 +496,10 @@ DEFINE_int64(preclude_last_level_data_seconds, 0,
|
|
|
489
496
|
"Preclude data from the last level. Used with tiered storage "
|
|
490
497
|
"feature to preclude new data from comacting to the last level.");
|
|
491
498
|
|
|
499
|
+
DEFINE_int64(
|
|
500
|
+
preserve_internal_time_seconds, 0,
|
|
501
|
+
"Preserve internal time information which is attached to each SST.");
|
|
502
|
+
|
|
492
503
|
static const bool FLAGS_subcompactions_dummy __attribute__((__unused__)) =
|
|
493
504
|
RegisterFlagValidator(&FLAGS_subcompactions, &ValidateUint32Range);
|
|
494
505
|
|
|
@@ -858,6 +869,10 @@ DEFINE_bool(use_merge, false,
|
|
|
858
869
|
"On true, replaces all writes with a Merge "
|
|
859
870
|
"that behaves like a Put");
|
|
860
871
|
|
|
872
|
+
DEFINE_uint32(use_put_entity_one_in, 0,
|
|
873
|
+
"If greater than zero, PutEntity will be used once per every N "
|
|
874
|
+
"write ops on average.");
|
|
875
|
+
|
|
861
876
|
DEFINE_bool(use_full_merge_v1, false,
|
|
862
877
|
"On true, use a merge operator that implement the deprecated "
|
|
863
878
|
"version of FullMerge");
|
|
@@ -1052,4 +1067,8 @@ DEFINE_bool(
|
|
|
1052
1067
|
"be preserved similarly under `FLAGS_expected_values_dir/unverified` when "
|
|
1053
1068
|
"`--expected_values_dir` is nonempty.");
|
|
1054
1069
|
|
|
1070
|
+
DEFINE_uint64(stats_dump_period_sec,
|
|
1071
|
+
ROCKSDB_NAMESPACE::Options().stats_dump_period_sec,
|
|
1072
|
+
"Gap between printing stats to log in seconds");
|
|
1073
|
+
|
|
1055
1074
|
#endif // GFLAGS
|
|
@@ -215,6 +215,32 @@ class SharedState {
|
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
+
// Returns a collection of mutex locks covering the key range [start, end) in
|
|
219
|
+
// `cf`.
|
|
220
|
+
std::vector<std::unique_ptr<MutexLock>> GetLocksForKeyRange(int cf,
|
|
221
|
+
int64_t start,
|
|
222
|
+
int64_t end) {
|
|
223
|
+
std::vector<std::unique_ptr<MutexLock>> range_locks;
|
|
224
|
+
|
|
225
|
+
if (start >= end) {
|
|
226
|
+
return range_locks;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const int64_t start_idx = start >> log2_keys_per_lock_;
|
|
230
|
+
|
|
231
|
+
int64_t end_idx = end >> log2_keys_per_lock_;
|
|
232
|
+
if ((end & ((1 << log2_keys_per_lock_) - 1)) == 0) {
|
|
233
|
+
--end_idx;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
for (int64_t idx = start_idx; idx <= end_idx; ++idx) {
|
|
237
|
+
range_locks.emplace_back(
|
|
238
|
+
std::make_unique<MutexLock>(&key_locks_[cf][idx]));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return range_locks;
|
|
242
|
+
}
|
|
243
|
+
|
|
218
244
|
Status SaveAtAndAfter(DB* db) {
|
|
219
245
|
return expected_state_manager_->SaveAtAndAfter(db);
|
|
220
246
|
}
|