@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
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
//
|
|
10
10
|
|
|
11
|
+
#include <ios>
|
|
12
|
+
|
|
11
13
|
#include "util/compression.h"
|
|
12
14
|
#ifdef GFLAGS
|
|
13
15
|
#include "cache/fast_lru_cache.h"
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
#include "rocksdb/sst_file_manager.h"
|
|
22
24
|
#include "rocksdb/types.h"
|
|
23
25
|
#include "rocksdb/utilities/object_registry.h"
|
|
26
|
+
#include "rocksdb/utilities/write_batch_with_index.h"
|
|
24
27
|
#include "test_util/testutil.h"
|
|
25
28
|
#include "util/cast_util.h"
|
|
26
29
|
#include "utilities/backup/backup_engine_impl.h"
|
|
@@ -309,7 +312,15 @@ void StressTest::FinishInitDb(SharedState* shared) {
|
|
|
309
312
|
exit(1);
|
|
310
313
|
}
|
|
311
314
|
}
|
|
312
|
-
|
|
315
|
+
#ifndef ROCKSDB_LITE
|
|
316
|
+
if (FLAGS_use_txn) {
|
|
317
|
+
// It's OK here without sync because unsynced data cannot be lost at this
|
|
318
|
+
// point
|
|
319
|
+
// - even with sync_fault_injection=1 as the
|
|
320
|
+
// file is still directly writable until after FinishInitDb()
|
|
321
|
+
ProcessRecoveredPreparedTxns(shared);
|
|
322
|
+
}
|
|
323
|
+
#endif
|
|
313
324
|
if (FLAGS_enable_compaction_filter) {
|
|
314
325
|
auto* compaction_filter_factory =
|
|
315
326
|
reinterpret_cast<DbStressCompactionFilterFactory*>(
|
|
@@ -325,7 +336,14 @@ void StressTest::FinishInitDb(SharedState* shared) {
|
|
|
325
336
|
}
|
|
326
337
|
|
|
327
338
|
void StressTest::TrackExpectedState(SharedState* shared) {
|
|
328
|
-
|
|
339
|
+
// For `FLAGS_manual_wal_flush_one_inWAL`
|
|
340
|
+
// data can be lost when `manual_wal_flush_one_in > 0` and `FlushWAL()` is not
|
|
341
|
+
// explictly called by users of RocksDB (in our case, db stress).
|
|
342
|
+
// Therefore recovery from such potential WAL data loss is a prefix recovery
|
|
343
|
+
// that requires tracing
|
|
344
|
+
if ((FLAGS_sync_fault_injection || FLAGS_disable_wal ||
|
|
345
|
+
FLAGS_manual_wal_flush_one_in > 0) &&
|
|
346
|
+
IsStateTracked()) {
|
|
329
347
|
Status s = shared->SaveAtAndAfter(db_);
|
|
330
348
|
if (!s.ok()) {
|
|
331
349
|
fprintf(stderr, "Error enabling history tracing: %s\n",
|
|
@@ -422,6 +440,53 @@ void StressTest::VerificationAbort(SharedState* shared, std::string msg, int cf,
|
|
|
422
440
|
shared->SetVerificationFailure();
|
|
423
441
|
}
|
|
424
442
|
|
|
443
|
+
void StressTest::VerificationAbort(SharedState* shared, int cf, int64_t key,
|
|
444
|
+
const Slice& value,
|
|
445
|
+
const WideColumns& columns,
|
|
446
|
+
const WideColumns& expected_columns) const {
|
|
447
|
+
assert(shared);
|
|
448
|
+
|
|
449
|
+
auto key_str = Key(key);
|
|
450
|
+
|
|
451
|
+
fprintf(stderr,
|
|
452
|
+
"Verification failed for column family %d key %s (%" PRIi64
|
|
453
|
+
"): Value and columns inconsistent: %s\n",
|
|
454
|
+
cf, Slice(key_str).ToString(/* hex */ true).c_str(), key,
|
|
455
|
+
DebugString(value, columns, expected_columns).c_str());
|
|
456
|
+
|
|
457
|
+
shared->SetVerificationFailure();
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
std::string StressTest::DebugString(const Slice& value,
|
|
461
|
+
const WideColumns& columns,
|
|
462
|
+
const WideColumns& expected_columns) {
|
|
463
|
+
std::ostringstream oss;
|
|
464
|
+
|
|
465
|
+
oss << "value: " << value.ToString(/* hex */ true);
|
|
466
|
+
|
|
467
|
+
auto dump = [](const WideColumns& cols, std::ostream& os) {
|
|
468
|
+
if (cols.empty()) {
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
os << std::hex;
|
|
473
|
+
|
|
474
|
+
auto it = cols.begin();
|
|
475
|
+
os << *it;
|
|
476
|
+
for (++it; it != cols.end(); ++it) {
|
|
477
|
+
os << ' ' << *it;
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
oss << ", columns: ";
|
|
482
|
+
dump(columns, oss);
|
|
483
|
+
|
|
484
|
+
oss << ", expected_columns: ";
|
|
485
|
+
dump(expected_columns, oss);
|
|
486
|
+
|
|
487
|
+
return oss.str();
|
|
488
|
+
}
|
|
489
|
+
|
|
425
490
|
void StressTest::PrintStatistics() {
|
|
426
491
|
if (dbstats) {
|
|
427
492
|
fprintf(stdout, "STATISTICS:\n%s\n", dbstats->ToString().c_str());
|
|
@@ -448,11 +513,14 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
|
|
|
448
513
|
Status s;
|
|
449
514
|
for (auto cfh : column_families_) {
|
|
450
515
|
for (int64_t k = 0; k != number_of_keys; ++k) {
|
|
451
|
-
std::string
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
516
|
+
const std::string key = Key(k);
|
|
517
|
+
|
|
518
|
+
constexpr uint32_t value_base = 0;
|
|
519
|
+
const size_t sz = GenerateValue(value_base, value, sizeof(value));
|
|
520
|
+
|
|
521
|
+
const Slice v(value, sz);
|
|
522
|
+
|
|
523
|
+
shared->Put(cf_idx, k, value_base, true /* pending */);
|
|
456
524
|
|
|
457
525
|
if (FLAGS_use_merge) {
|
|
458
526
|
if (!FLAGS_use_txn) {
|
|
@@ -469,13 +537,13 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
|
|
|
469
537
|
}
|
|
470
538
|
#endif
|
|
471
539
|
}
|
|
540
|
+
} else if (FLAGS_use_put_entity_one_in > 0) {
|
|
541
|
+
s = db_->PutEntity(write_opts, cfh, key,
|
|
542
|
+
GenerateWideColumns(value_base, v));
|
|
472
543
|
} else {
|
|
473
544
|
if (!FLAGS_use_txn) {
|
|
474
|
-
std::string ts_str;
|
|
475
|
-
Slice ts;
|
|
476
545
|
if (FLAGS_user_timestamp_size > 0) {
|
|
477
|
-
|
|
478
|
-
ts = ts_str;
|
|
546
|
+
const std::string ts = GetNowNanos();
|
|
479
547
|
s = db_->Put(write_opts, cfh, key, ts, v);
|
|
480
548
|
} else {
|
|
481
549
|
s = db_->Put(write_opts, cfh, key, v);
|
|
@@ -494,7 +562,7 @@ void StressTest::PreloadDbAndReopenAsReadOnly(int64_t number_of_keys,
|
|
|
494
562
|
}
|
|
495
563
|
}
|
|
496
564
|
|
|
497
|
-
shared->Put(cf_idx, k,
|
|
565
|
+
shared->Put(cf_idx, k, value_base, false /* pending */);
|
|
498
566
|
if (!s.ok()) {
|
|
499
567
|
break;
|
|
500
568
|
}
|
|
@@ -555,6 +623,42 @@ Status StressTest::SetOptions(ThreadState* thread) {
|
|
|
555
623
|
}
|
|
556
624
|
|
|
557
625
|
#ifndef ROCKSDB_LITE
|
|
626
|
+
void StressTest::ProcessRecoveredPreparedTxns(SharedState* shared) {
|
|
627
|
+
assert(txn_db_);
|
|
628
|
+
std::vector<Transaction*> recovered_prepared_trans;
|
|
629
|
+
txn_db_->GetAllPreparedTransactions(&recovered_prepared_trans);
|
|
630
|
+
for (Transaction* txn : recovered_prepared_trans) {
|
|
631
|
+
ProcessRecoveredPreparedTxnsHelper(txn, shared);
|
|
632
|
+
delete txn;
|
|
633
|
+
}
|
|
634
|
+
recovered_prepared_trans.clear();
|
|
635
|
+
txn_db_->GetAllPreparedTransactions(&recovered_prepared_trans);
|
|
636
|
+
assert(recovered_prepared_trans.size() == 0);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
void StressTest::ProcessRecoveredPreparedTxnsHelper(Transaction* txn,
|
|
640
|
+
SharedState* shared) {
|
|
641
|
+
thread_local Random rand(static_cast<uint32_t>(FLAGS_seed));
|
|
642
|
+
for (size_t i = 0; i < column_families_.size(); ++i) {
|
|
643
|
+
std::unique_ptr<WBWIIterator> wbwi_iter(
|
|
644
|
+
txn->GetWriteBatch()->NewIterator(column_families_[i]));
|
|
645
|
+
for (wbwi_iter->SeekToFirst(); wbwi_iter->Valid(); wbwi_iter->Next()) {
|
|
646
|
+
uint64_t key_val;
|
|
647
|
+
if (GetIntVal(wbwi_iter->Entry().key.ToString(), &key_val)) {
|
|
648
|
+
shared->Put(static_cast<int>(i) /* cf_idx */, key_val,
|
|
649
|
+
0 /* value_base */, true /* pending */);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
if (rand.OneIn(2)) {
|
|
654
|
+
Status s = txn->Commit();
|
|
655
|
+
assert(s.ok());
|
|
656
|
+
} else {
|
|
657
|
+
Status s = txn->Rollback();
|
|
658
|
+
assert(s.ok());
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
|
|
558
662
|
Status StressTest::NewTxn(WriteOptions& write_opts, Transaction** txn) {
|
|
559
663
|
if (!FLAGS_use_txn) {
|
|
560
664
|
return Status::InvalidArgument("NewTxn when FLAGS_use_txn is not set");
|
|
@@ -729,6 +833,15 @@ void StressTest::OperateDb(ThreadState* thread) {
|
|
|
729
833
|
|
|
730
834
|
MaybeClearOneColumnFamily(thread);
|
|
731
835
|
|
|
836
|
+
if (thread->rand.OneInOpt(FLAGS_manual_wal_flush_one_in)) {
|
|
837
|
+
bool sync = thread->rand.OneIn(2) ? true : false;
|
|
838
|
+
Status s = db_->FlushWAL(sync);
|
|
839
|
+
if (!s.ok() && !(sync && s.IsNotSupported())) {
|
|
840
|
+
fprintf(stderr, "FlushWAL(sync=%s) failed: %s\n",
|
|
841
|
+
(sync ? "true" : "false"), s.ToString().c_str());
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
732
845
|
if (thread->rand.OneInOpt(FLAGS_sync_wal_one_in)) {
|
|
733
846
|
Status s = db_->SyncWAL();
|
|
734
847
|
if (!s.ok() && !s.IsNotSupported()) {
|
|
@@ -871,15 +984,11 @@ void StressTest::OperateDb(ThreadState* thread) {
|
|
|
871
984
|
|
|
872
985
|
// Assign timestamps if necessary.
|
|
873
986
|
std::string read_ts_str;
|
|
874
|
-
std::string write_ts_str;
|
|
875
987
|
Slice read_ts;
|
|
876
|
-
Slice write_ts;
|
|
877
988
|
if (FLAGS_user_timestamp_size > 0) {
|
|
878
989
|
read_ts_str = GetNowNanos();
|
|
879
990
|
read_ts = read_ts_str;
|
|
880
991
|
read_opts.timestamp = &read_ts;
|
|
881
|
-
write_ts_str = GetNowNanos();
|
|
882
|
-
write_ts = write_ts_str;
|
|
883
992
|
}
|
|
884
993
|
|
|
885
994
|
int prob_op = thread->rand.Uniform(100);
|
|
@@ -1024,24 +1133,26 @@ Status StressTest::TestIterate(ThreadState* thread,
|
|
|
1024
1133
|
const ReadOptions& read_opts,
|
|
1025
1134
|
const std::vector<int>& rand_column_families,
|
|
1026
1135
|
const std::vector<int64_t>& rand_keys) {
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1136
|
+
assert(!rand_column_families.empty());
|
|
1137
|
+
assert(!rand_keys.empty());
|
|
1138
|
+
|
|
1139
|
+
ManagedSnapshot snapshot_guard(db_);
|
|
1140
|
+
|
|
1141
|
+
ReadOptions ro = read_opts;
|
|
1142
|
+
ro.snapshot = snapshot_guard.snapshot();
|
|
1031
1143
|
|
|
1032
1144
|
std::string read_ts_str;
|
|
1033
1145
|
Slice read_ts_slice;
|
|
1034
|
-
MaybeUseOlderTimestampForRangeScan(thread, read_ts_str, read_ts_slice,
|
|
1035
|
-
readoptionscopy);
|
|
1146
|
+
MaybeUseOlderTimestampForRangeScan(thread, read_ts_str, read_ts_slice, ro);
|
|
1036
1147
|
|
|
1037
1148
|
bool expect_total_order = false;
|
|
1038
1149
|
if (thread->rand.OneIn(16)) {
|
|
1039
1150
|
// When prefix extractor is used, it's useful to cover total order seek.
|
|
1040
|
-
|
|
1151
|
+
ro.total_order_seek = true;
|
|
1041
1152
|
expect_total_order = true;
|
|
1042
1153
|
} else if (thread->rand.OneIn(4)) {
|
|
1043
|
-
|
|
1044
|
-
|
|
1154
|
+
ro.total_order_seek = false;
|
|
1155
|
+
ro.auto_prefix_mode = true;
|
|
1045
1156
|
expect_total_order = true;
|
|
1046
1157
|
} else if (options_.prefix_extractor.get() == nullptr) {
|
|
1047
1158
|
expect_total_order = true;
|
|
@@ -1050,101 +1161,106 @@ Status StressTest::TestIterate(ThreadState* thread,
|
|
|
1050
1161
|
std::string upper_bound_str;
|
|
1051
1162
|
Slice upper_bound;
|
|
1052
1163
|
if (thread->rand.OneIn(16)) {
|
|
1053
|
-
//
|
|
1054
|
-
|
|
1164
|
+
// With a 1/16 chance, set an iterator upper bound.
|
|
1165
|
+
// Note: upper_bound can be smaller than the seek key.
|
|
1166
|
+
const int64_t rand_upper_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
|
|
1055
1167
|
upper_bound_str = Key(rand_upper_key);
|
|
1056
1168
|
upper_bound = Slice(upper_bound_str);
|
|
1057
|
-
|
|
1058
|
-
// should not crash either.
|
|
1059
|
-
readoptionscopy.iterate_upper_bound = &upper_bound;
|
|
1169
|
+
ro.iterate_upper_bound = &upper_bound;
|
|
1060
1170
|
}
|
|
1061
1171
|
std::string lower_bound_str;
|
|
1062
1172
|
Slice lower_bound;
|
|
1063
1173
|
if (thread->rand.OneIn(16)) {
|
|
1064
|
-
//
|
|
1065
|
-
|
|
1174
|
+
// With a 1/16 chance, enable iterator lower bound.
|
|
1175
|
+
// Note: lower_bound can be greater than the seek key.
|
|
1176
|
+
const int64_t rand_lower_key = GenerateOneKey(thread, FLAGS_ops_per_thread);
|
|
1066
1177
|
lower_bound_str = Key(rand_lower_key);
|
|
1067
1178
|
lower_bound = Slice(lower_bound_str);
|
|
1068
|
-
|
|
1069
|
-
// should not crash either.
|
|
1070
|
-
readoptionscopy.iterate_lower_bound = &lower_bound;
|
|
1179
|
+
ro.iterate_lower_bound = &lower_bound;
|
|
1071
1180
|
}
|
|
1072
1181
|
|
|
1073
|
-
|
|
1074
|
-
|
|
1182
|
+
ColumnFamilyHandle* const cfh = column_families_[rand_column_families[0]];
|
|
1183
|
+
assert(cfh);
|
|
1184
|
+
|
|
1185
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(ro, cfh));
|
|
1075
1186
|
|
|
1076
|
-
std::vector<std::string>
|
|
1187
|
+
std::vector<std::string> key_strs;
|
|
1077
1188
|
if (thread->rand.OneIn(16)) {
|
|
1078
1189
|
// Generate keys close to lower or upper bound of SST files.
|
|
1079
|
-
|
|
1190
|
+
key_strs = GetWhiteBoxKeys(thread, db_, cfh, rand_keys.size());
|
|
1080
1191
|
}
|
|
1081
|
-
if (
|
|
1082
|
-
//
|
|
1083
|
-
// Use randomized key passe in.
|
|
1192
|
+
if (key_strs.empty()) {
|
|
1193
|
+
// Use the random keys passed in.
|
|
1084
1194
|
for (int64_t rkey : rand_keys) {
|
|
1085
|
-
|
|
1195
|
+
key_strs.push_back(Key(rkey));
|
|
1086
1196
|
}
|
|
1087
1197
|
}
|
|
1088
1198
|
|
|
1089
1199
|
std::string op_logs;
|
|
1090
|
-
|
|
1200
|
+
constexpr size_t kOpLogsLimit = 10000;
|
|
1091
1201
|
|
|
1092
|
-
for (const std::string&
|
|
1202
|
+
for (const std::string& key_str : key_strs) {
|
|
1093
1203
|
if (op_logs.size() > kOpLogsLimit) {
|
|
1094
1204
|
// Shouldn't take too much memory for the history log. Clear it.
|
|
1095
1205
|
op_logs = "(cleared...)\n";
|
|
1096
1206
|
}
|
|
1097
1207
|
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
thread->rand.OneIn(2)) {
|
|
1102
|
-
// 1/2 chance, change the upper bound.
|
|
1103
|
-
// It is possible that it is changed without first use, but there is no
|
|
1208
|
+
if (ro.iterate_upper_bound != nullptr && thread->rand.OneIn(2)) {
|
|
1209
|
+
// With a 1/2 chance, change the upper bound.
|
|
1210
|
+
// It is possible that it is changed before first use, but there is no
|
|
1104
1211
|
// problem with that.
|
|
1105
|
-
int64_t rand_upper_key =
|
|
1212
|
+
const int64_t rand_upper_key =
|
|
1213
|
+
GenerateOneKey(thread, FLAGS_ops_per_thread);
|
|
1106
1214
|
upper_bound_str = Key(rand_upper_key);
|
|
1107
1215
|
upper_bound = Slice(upper_bound_str);
|
|
1108
|
-
}
|
|
1109
|
-
|
|
1110
|
-
// 1/4 chance, change the lower bound.
|
|
1111
|
-
// It is possible that it is changed
|
|
1216
|
+
}
|
|
1217
|
+
if (ro.iterate_lower_bound != nullptr && thread->rand.OneIn(4)) {
|
|
1218
|
+
// With a 1/4 chance, change the lower bound.
|
|
1219
|
+
// It is possible that it is changed before first use, but there is no
|
|
1112
1220
|
// problem with that.
|
|
1113
|
-
int64_t rand_lower_key =
|
|
1221
|
+
const int64_t rand_lower_key =
|
|
1222
|
+
GenerateOneKey(thread, FLAGS_ops_per_thread);
|
|
1114
1223
|
lower_bound_str = Key(rand_lower_key);
|
|
1115
1224
|
lower_bound = Slice(lower_bound_str);
|
|
1116
1225
|
}
|
|
1117
1226
|
|
|
1118
|
-
// Record some options to op_logs
|
|
1227
|
+
// Record some options to op_logs
|
|
1119
1228
|
op_logs += "total_order_seek: ";
|
|
1120
|
-
op_logs += (
|
|
1229
|
+
op_logs += (ro.total_order_seek ? "1 " : "0 ");
|
|
1121
1230
|
op_logs += "auto_prefix_mode: ";
|
|
1122
|
-
op_logs += (
|
|
1123
|
-
if (
|
|
1231
|
+
op_logs += (ro.auto_prefix_mode ? "1 " : "0 ");
|
|
1232
|
+
if (ro.iterate_upper_bound != nullptr) {
|
|
1124
1233
|
op_logs += "ub: " + upper_bound.ToString(true) + " ";
|
|
1125
1234
|
}
|
|
1126
|
-
if (
|
|
1235
|
+
if (ro.iterate_lower_bound != nullptr) {
|
|
1127
1236
|
op_logs += "lb: " + lower_bound.ToString(true) + " ";
|
|
1128
1237
|
}
|
|
1129
1238
|
|
|
1130
|
-
// Set up an iterator
|
|
1131
|
-
// order seek and compare the results. This is to identify bugs
|
|
1132
|
-
// to bounds, prefix extractor or reseeking. Sometimes we are
|
|
1133
|
-
// iterators with the same set-up, and it doesn't hurt to check
|
|
1134
|
-
// to be equal.
|
|
1239
|
+
// Set up an iterator, perform the same operations without bounds and with
|
|
1240
|
+
// total order seek, and compare the results. This is to identify bugs
|
|
1241
|
+
// related to bounds, prefix extractor, or reseeking. Sometimes we are
|
|
1242
|
+
// comparing iterators with the same set-up, and it doesn't hurt to check
|
|
1243
|
+
// them to be equal.
|
|
1244
|
+
//
|
|
1135
1245
|
// This `ReadOptions` is for validation purposes. Ignore
|
|
1136
1246
|
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
1137
1247
|
ReadOptions cmp_ro;
|
|
1138
|
-
cmp_ro.timestamp =
|
|
1139
|
-
cmp_ro.iter_start_ts =
|
|
1140
|
-
cmp_ro.snapshot = snapshot;
|
|
1248
|
+
cmp_ro.timestamp = ro.timestamp;
|
|
1249
|
+
cmp_ro.iter_start_ts = ro.iter_start_ts;
|
|
1250
|
+
cmp_ro.snapshot = snapshot_guard.snapshot();
|
|
1141
1251
|
cmp_ro.total_order_seek = true;
|
|
1142
|
-
|
|
1252
|
+
|
|
1253
|
+
ColumnFamilyHandle* const cmp_cfh =
|
|
1143
1254
|
GetControlCfh(thread, rand_column_families[0]);
|
|
1255
|
+
assert(cmp_cfh);
|
|
1256
|
+
|
|
1144
1257
|
std::unique_ptr<Iterator> cmp_iter(db_->NewIterator(cmp_ro, cmp_cfh));
|
|
1258
|
+
|
|
1145
1259
|
bool diverged = false;
|
|
1146
1260
|
|
|
1147
|
-
|
|
1261
|
+
Slice key(key_str);
|
|
1262
|
+
|
|
1263
|
+
const bool support_seek_first_or_last = expect_total_order;
|
|
1148
1264
|
|
|
1149
1265
|
LastIterateOp last_op;
|
|
1150
1266
|
if (support_seek_first_or_last && thread->rand.OneIn(100)) {
|
|
@@ -1168,12 +1284,13 @@ Status StressTest::TestIterate(ThreadState* thread,
|
|
|
1168
1284
|
last_op = kLastOpSeek;
|
|
1169
1285
|
op_logs += "S " + key.ToString(true) + " ";
|
|
1170
1286
|
}
|
|
1171
|
-
VerifyIterator(thread, cmp_cfh, readoptionscopy, iter.get(), cmp_iter.get(),
|
|
1172
|
-
last_op, key, op_logs, &diverged);
|
|
1173
1287
|
|
|
1174
|
-
|
|
1288
|
+
VerifyIterator(thread, cmp_cfh, ro, iter.get(), cmp_iter.get(), last_op,
|
|
1289
|
+
key, op_logs, &diverged);
|
|
1290
|
+
|
|
1291
|
+
const bool no_reverse =
|
|
1175
1292
|
(FLAGS_memtablerep == "prefix_hash" && !expect_total_order);
|
|
1176
|
-
for (uint64_t i = 0; i < FLAGS_num_iterations && iter->Valid(); i
|
|
1293
|
+
for (uint64_t i = 0; i < FLAGS_num_iterations && iter->Valid(); ++i) {
|
|
1177
1294
|
if (no_reverse || thread->rand.OneIn(2)) {
|
|
1178
1295
|
iter->Next();
|
|
1179
1296
|
if (!diverged) {
|
|
@@ -1189,25 +1306,19 @@ Status StressTest::TestIterate(ThreadState* thread,
|
|
|
1189
1306
|
}
|
|
1190
1307
|
op_logs += "P";
|
|
1191
1308
|
}
|
|
1309
|
+
|
|
1192
1310
|
last_op = kLastOpNextOrPrev;
|
|
1193
|
-
VerifyIterator(thread, cmp_cfh, readoptionscopy, iter.get(),
|
|
1194
|
-
cmp_iter.get(), last_op, key, op_logs, &diverged);
|
|
1195
|
-
}
|
|
1196
1311
|
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
} else {
|
|
1200
|
-
fprintf(stderr, "TestIterate error: %s\n", s.ToString().c_str());
|
|
1201
|
-
thread->stats.AddErrors(1);
|
|
1202
|
-
break;
|
|
1312
|
+
VerifyIterator(thread, cmp_cfh, ro, iter.get(), cmp_iter.get(), last_op,
|
|
1313
|
+
key, op_logs, &diverged);
|
|
1203
1314
|
}
|
|
1204
1315
|
|
|
1316
|
+
thread->stats.AddIterations(1);
|
|
1317
|
+
|
|
1205
1318
|
op_logs += "; ";
|
|
1206
1319
|
}
|
|
1207
1320
|
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
return s;
|
|
1321
|
+
return Status::OK();
|
|
1211
1322
|
}
|
|
1212
1323
|
|
|
1213
1324
|
#ifndef ROCKSDB_LITE
|
|
@@ -1243,6 +1354,8 @@ void StressTest::VerifyIterator(ThreadState* thread,
|
|
|
1243
1354
|
Iterator* cmp_iter, LastIterateOp op,
|
|
1244
1355
|
const Slice& seek_key,
|
|
1245
1356
|
const std::string& op_logs, bool* diverged) {
|
|
1357
|
+
assert(diverged);
|
|
1358
|
+
|
|
1246
1359
|
if (*diverged) {
|
|
1247
1360
|
return;
|
|
1248
1361
|
}
|
|
@@ -1372,6 +1485,21 @@ void StressTest::VerifyIterator(ThreadState* thread,
|
|
|
1372
1485
|
}
|
|
1373
1486
|
}
|
|
1374
1487
|
}
|
|
1488
|
+
|
|
1489
|
+
if (!*diverged && iter->Valid()) {
|
|
1490
|
+
const Slice value_base_slice = GetValueBaseSlice(iter->value());
|
|
1491
|
+
|
|
1492
|
+
const WideColumns expected_columns = GenerateExpectedWideColumns(
|
|
1493
|
+
GetValueBase(value_base_slice), iter->value());
|
|
1494
|
+
if (iter->columns() != expected_columns) {
|
|
1495
|
+
fprintf(stderr, "Value and columns inconsistent for iterator: %s\n",
|
|
1496
|
+
DebugString(iter->value(), iter->columns(), expected_columns)
|
|
1497
|
+
.c_str());
|
|
1498
|
+
|
|
1499
|
+
*diverged = true;
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1375
1503
|
if (*diverged) {
|
|
1376
1504
|
fprintf(stderr, "Control CF %s\n", cmp_cfh->GetName().c_str());
|
|
1377
1505
|
thread->stats.AddErrors(1);
|
|
@@ -2176,8 +2304,6 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
|
|
|
2176
2304
|
ColumnFamilyHandle* column_family,
|
|
2177
2305
|
const Slice& start_key,
|
|
2178
2306
|
const Slice& end_key) {
|
|
2179
|
-
const std::string kCrcCalculatorSepearator = ";";
|
|
2180
|
-
uint32_t crc = 0;
|
|
2181
2307
|
// This `ReadOptions` is for validation purposes. Ignore
|
|
2182
2308
|
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
2183
2309
|
ReadOptions ro;
|
|
@@ -2190,15 +2316,29 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
|
|
|
2190
2316
|
ts = ts_str;
|
|
2191
2317
|
ro.timestamp = &ts;
|
|
2192
2318
|
}
|
|
2319
|
+
|
|
2193
2320
|
std::unique_ptr<Iterator> it(db_->NewIterator(ro, column_family));
|
|
2321
|
+
|
|
2322
|
+
constexpr char kCrcCalculatorSepearator = ';';
|
|
2323
|
+
|
|
2324
|
+
uint32_t crc = 0;
|
|
2325
|
+
|
|
2194
2326
|
for (it->Seek(start_key);
|
|
2195
2327
|
it->Valid() && options_.comparator->Compare(it->key(), end_key) <= 0;
|
|
2196
2328
|
it->Next()) {
|
|
2197
2329
|
crc = crc32c::Extend(crc, it->key().data(), it->key().size());
|
|
2198
|
-
crc = crc32c::Extend(crc, kCrcCalculatorSepearator
|
|
2330
|
+
crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
|
|
2199
2331
|
crc = crc32c::Extend(crc, it->value().data(), it->value().size());
|
|
2200
|
-
crc = crc32c::Extend(crc, kCrcCalculatorSepearator
|
|
2332
|
+
crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
|
|
2333
|
+
|
|
2334
|
+
for (const auto& column : it->columns()) {
|
|
2335
|
+
crc = crc32c::Extend(crc, column.name().data(), column.name().size());
|
|
2336
|
+
crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
|
|
2337
|
+
crc = crc32c::Extend(crc, column.value().data(), column.value().size());
|
|
2338
|
+
crc = crc32c::Extend(crc, &kCrcCalculatorSepearator, sizeof(char));
|
|
2339
|
+
}
|
|
2201
2340
|
}
|
|
2341
|
+
|
|
2202
2342
|
if (!it->status().ok()) {
|
|
2203
2343
|
fprintf(stderr, "Iterator non-OK when calculating range CRC: %s\n",
|
|
2204
2344
|
it->status().ToString().c_str());
|
|
@@ -2206,6 +2346,7 @@ uint32_t StressTest::GetRangeHash(ThreadState* thread, const Snapshot* snapshot,
|
|
|
2206
2346
|
// Fail fast to preserve the DB state.
|
|
2207
2347
|
thread->shared->SetVerificationFailure();
|
|
2208
2348
|
}
|
|
2349
|
+
|
|
2209
2350
|
return crc;
|
|
2210
2351
|
}
|
|
2211
2352
|
|
|
@@ -2245,6 +2386,8 @@ void StressTest::PrintEnv() const {
|
|
|
2245
2386
|
FLAGS_read_only ? "true" : "false");
|
|
2246
2387
|
fprintf(stdout, "Atomic flush : %s\n",
|
|
2247
2388
|
FLAGS_atomic_flush ? "true" : "false");
|
|
2389
|
+
fprintf(stdout, "Manual WAL flush : %s\n",
|
|
2390
|
+
FLAGS_manual_wal_flush_one_in > 0 ? "true" : "false");
|
|
2248
2391
|
fprintf(stdout, "Column families : %d\n", FLAGS_column_families);
|
|
2249
2392
|
if (!FLAGS_test_batches_snapshots) {
|
|
2250
2393
|
fprintf(stdout, "Clear CFs one in : %d\n",
|
|
@@ -2648,24 +2791,6 @@ void StressTest::Open(SharedState* shared) {
|
|
|
2648
2791
|
db_ = txn_db_;
|
|
2649
2792
|
db_aptr_.store(txn_db_, std::memory_order_release);
|
|
2650
2793
|
}
|
|
2651
|
-
|
|
2652
|
-
// after a crash, rollback to commit recovered transactions
|
|
2653
|
-
std::vector<Transaction*> trans;
|
|
2654
|
-
txn_db_->GetAllPreparedTransactions(&trans);
|
|
2655
|
-
Random rand(static_cast<uint32_t>(FLAGS_seed));
|
|
2656
|
-
for (auto txn : trans) {
|
|
2657
|
-
if (rand.OneIn(2)) {
|
|
2658
|
-
s = txn->Commit();
|
|
2659
|
-
assert(s.ok());
|
|
2660
|
-
} else {
|
|
2661
|
-
s = txn->Rollback();
|
|
2662
|
-
assert(s.ok());
|
|
2663
|
-
}
|
|
2664
|
-
delete txn;
|
|
2665
|
-
}
|
|
2666
|
-
trans.clear();
|
|
2667
|
-
txn_db_->GetAllPreparedTransactions(&trans);
|
|
2668
|
-
assert(trans.size() == 0);
|
|
2669
2794
|
#endif
|
|
2670
2795
|
}
|
|
2671
2796
|
if (!s.ok()) {
|
|
@@ -2771,7 +2896,9 @@ void StressTest::Reopen(ThreadState* thread) {
|
|
|
2771
2896
|
clock_->TimeToString(now / 1000000).c_str(), num_times_reopened_);
|
|
2772
2897
|
Open(thread->shared);
|
|
2773
2898
|
|
|
2774
|
-
if ((FLAGS_sync_fault_injection || FLAGS_disable_wal
|
|
2899
|
+
if ((FLAGS_sync_fault_injection || FLAGS_disable_wal ||
|
|
2900
|
+
FLAGS_manual_wal_flush_one_in > 0) &&
|
|
2901
|
+
IsStateTracked()) {
|
|
2775
2902
|
Status s = thread->shared->SaveAtAndAfter(db_);
|
|
2776
2903
|
if (!s.ok()) {
|
|
2777
2904
|
fprintf(stderr, "Error enabling history tracing: %s\n",
|
|
@@ -2781,17 +2908,17 @@ void StressTest::Reopen(ThreadState* thread) {
|
|
|
2781
2908
|
}
|
|
2782
2909
|
}
|
|
2783
2910
|
|
|
2784
|
-
|
|
2911
|
+
bool StressTest::MaybeUseOlderTimestampForPointLookup(ThreadState* thread,
|
|
2785
2912
|
std::string& ts_str,
|
|
2786
2913
|
Slice& ts_slice,
|
|
2787
2914
|
ReadOptions& read_opts) {
|
|
2788
2915
|
if (FLAGS_user_timestamp_size == 0) {
|
|
2789
|
-
return;
|
|
2916
|
+
return false;
|
|
2790
2917
|
}
|
|
2791
2918
|
|
|
2792
2919
|
assert(thread);
|
|
2793
2920
|
if (!thread->rand.OneInOpt(3)) {
|
|
2794
|
-
return;
|
|
2921
|
+
return false;
|
|
2795
2922
|
}
|
|
2796
2923
|
|
|
2797
2924
|
const SharedState* const shared = thread->shared;
|
|
@@ -2807,6 +2934,7 @@ void StressTest::MaybeUseOlderTimestampForPointLookup(ThreadState* thread,
|
|
|
2807
2934
|
PutFixed64(&ts_str, ts);
|
|
2808
2935
|
ts_slice = ts_str;
|
|
2809
2936
|
read_opts.timestamp = &ts_slice;
|
|
2937
|
+
return true;
|
|
2810
2938
|
}
|
|
2811
2939
|
|
|
2812
2940
|
void StressTest::MaybeUseOlderTimestampForRangeScan(ThreadState* thread,
|
|
@@ -2864,10 +2992,6 @@ void CheckAndSetOptionsForUserTimestamp(Options& options) {
|
|
|
2864
2992
|
fprintf(stderr, "Merge does not support timestamp yet.\n");
|
|
2865
2993
|
exit(1);
|
|
2866
2994
|
}
|
|
2867
|
-
if (FLAGS_delrangepercent > 0) {
|
|
2868
|
-
fprintf(stderr, "DeleteRange does not support timestamp yet.\n");
|
|
2869
|
-
exit(1);
|
|
2870
|
-
}
|
|
2871
2995
|
if (FLAGS_use_txn) {
|
|
2872
2996
|
fprintf(stderr, "TransactionDB does not support timestamp yet.\n");
|
|
2873
2997
|
exit(1);
|
|
@@ -3001,6 +3125,7 @@ void InitializeOptionsFromFlags(
|
|
|
3001
3125
|
static_cast<ROCKSDB_NAMESPACE::CompactionStyle>(FLAGS_compaction_style);
|
|
3002
3126
|
options.compaction_pri =
|
|
3003
3127
|
static_cast<ROCKSDB_NAMESPACE::CompactionPri>(FLAGS_compaction_pri);
|
|
3128
|
+
options.num_levels = FLAGS_num_levels;
|
|
3004
3129
|
if (FLAGS_prefix_size >= 0) {
|
|
3005
3130
|
options.prefix_extractor.reset(NewFixedPrefixTransform(FLAGS_prefix_size));
|
|
3006
3131
|
}
|
|
@@ -3051,6 +3176,8 @@ void InitializeOptionsFromFlags(
|
|
|
3051
3176
|
options.experimental_mempurge_threshold =
|
|
3052
3177
|
FLAGS_experimental_mempurge_threshold;
|
|
3053
3178
|
options.periodic_compaction_seconds = FLAGS_periodic_compaction_seconds;
|
|
3179
|
+
options.stats_dump_period_sec =
|
|
3180
|
+
static_cast<unsigned int>(FLAGS_stats_dump_period_sec);
|
|
3054
3181
|
options.ttl = FLAGS_compaction_ttl;
|
|
3055
3182
|
options.enable_pipelined_write = FLAGS_enable_pipelined_write;
|
|
3056
3183
|
options.enable_write_thread_adaptive_yield =
|
|
@@ -3063,6 +3190,7 @@ void InitializeOptionsFromFlags(
|
|
|
3063
3190
|
options.compaction_options_universal.max_size_amplification_percent =
|
|
3064
3191
|
FLAGS_universal_max_size_amplification_percent;
|
|
3065
3192
|
options.atomic_flush = FLAGS_atomic_flush;
|
|
3193
|
+
options.manual_wal_flush = FLAGS_manual_wal_flush_one_in > 0 ? true : false;
|
|
3066
3194
|
options.avoid_unnecessary_blocking_io = FLAGS_avoid_unnecessary_blocking_io;
|
|
3067
3195
|
options.write_dbid_to_manifest = FLAGS_write_dbid_to_manifest;
|
|
3068
3196
|
options.avoid_flush_during_recovery = FLAGS_avoid_flush_during_recovery;
|
|
@@ -3127,6 +3255,7 @@ void InitializeOptionsFromFlags(
|
|
|
3127
3255
|
}
|
|
3128
3256
|
options.preclude_last_level_data_seconds =
|
|
3129
3257
|
FLAGS_preclude_last_level_data_seconds;
|
|
3258
|
+
options.preserve_internal_time_seconds = FLAGS_preserve_internal_time_seconds;
|
|
3130
3259
|
|
|
3131
3260
|
switch (FLAGS_rep_factory) {
|
|
3132
3261
|
case kSkipList:
|