@nxtedition/rocksdb 6.0.1 → 6.0.2
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/BUILDING.md +2 -2
- package/binding.cc +14 -17
- package/deps/rocksdb/build_version.cc +4 -10
- package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
- package/deps/rocksdb/rocksdb/Makefile +57 -86
- package/deps/rocksdb/rocksdb/TARGETS +4 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
- package/deps/rocksdb/rocksdb/common.mk +30 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
- package/deps/rocksdb/rocksdb/db/c.cc +45 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
- package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
- package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
- package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
- package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
- package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
- package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
- package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
- package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
- package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
- package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
- package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
- package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
- package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
- package/deps/rocksdb/rocksdb/env/env.cc +0 -60
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
- package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
- package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
- package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
- package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
- package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
- package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
- package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
- package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
- package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
- package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
- package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
- package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
- package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
- package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
- package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
- package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
- package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
- package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
- package/deps/rocksdb/rocksdb/src.mk +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
- package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/format.cc +22 -20
- package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
- package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
- package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
- package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
- package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
- package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
- package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
- package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
- package/deps/rocksdb/rocksdb/util/compression.h +7 -7
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
- package/deps/rocksdb/rocksdb/util/heap.h +5 -3
- package/deps/rocksdb/rocksdb/util/random.cc +1 -5
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
- package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
- package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
- package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
- package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
- package/deps/rocksdb/rocksdb.gyp +8 -2
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/python.mk +0 -9
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-arm64/node.napi.node +0 -0
|
@@ -12,9 +12,8 @@
|
|
|
12
12
|
|
|
13
13
|
#include "rocksdb/utilities/write_batch_with_index.h"
|
|
14
14
|
#include "util/defer.h"
|
|
15
|
-
#ifndef NDEBUG
|
|
16
15
|
#include "utilities/fault_injection_fs.h"
|
|
17
|
-
#
|
|
16
|
+
#include "utilities/transactions/write_prepared_txn_db.h"
|
|
18
17
|
|
|
19
18
|
namespace ROCKSDB_NAMESPACE {
|
|
20
19
|
|
|
@@ -31,6 +30,21 @@ DEFINE_int32(delay_snapshot_read_one_in, 0,
|
|
|
31
30
|
"With a chance of 1/N, inject a random delay between taking "
|
|
32
31
|
"snapshot and read.");
|
|
33
32
|
|
|
33
|
+
DEFINE_int32(rollback_one_in, 0,
|
|
34
|
+
"If non-zero, rollback non-read-only transactions with a "
|
|
35
|
+
"probability of 1/N.");
|
|
36
|
+
|
|
37
|
+
DEFINE_int32(clear_wp_commit_cache_one_in, 0,
|
|
38
|
+
"If non-zero, evict all commit entries from commit cache with a "
|
|
39
|
+
"probability of 1/N. This options applies to write-prepared and "
|
|
40
|
+
"write-unprepared transactions.");
|
|
41
|
+
|
|
42
|
+
extern "C" bool rocksdb_write_prepared_TEST_ShouldClearCommitCache(void) {
|
|
43
|
+
static Random rand(static_cast<uint32_t>(db_stress_env->NowMicros()));
|
|
44
|
+
return FLAGS_clear_wp_commit_cache_one_in > 0 &&
|
|
45
|
+
rand.OneIn(FLAGS_clear_wp_commit_cache_one_in);
|
|
46
|
+
}
|
|
47
|
+
|
|
34
48
|
// MultiOpsTxnsStressTest can either operate on a database with pre-populated
|
|
35
49
|
// data (possibly from previous ones), or create a new db and preload it with
|
|
36
50
|
// data specified via `-lb_a`, `-ub_a`, `-lb_c`, `-ub_c`, etc. Among these, we
|
|
@@ -75,8 +89,9 @@ void MultiOpsTxnsStressTest::KeyGenerator::FinishInit() {
|
|
|
75
89
|
"Cannot allocate key in [%u, %u)\nStart with a new DB or try change "
|
|
76
90
|
"the number of threads for testing via -threads=<#threads>\n",
|
|
77
91
|
static_cast<unsigned int>(low_), static_cast<unsigned int>(high_));
|
|
92
|
+
fflush(stdout);
|
|
78
93
|
fflush(stderr);
|
|
79
|
-
|
|
94
|
+
assert(false);
|
|
80
95
|
}
|
|
81
96
|
initialized_ = true;
|
|
82
97
|
}
|
|
@@ -131,33 +146,43 @@ void MultiOpsTxnsStressTest::KeyGenerator::UndoAllocation(uint32_t new_val) {
|
|
|
131
146
|
}
|
|
132
147
|
|
|
133
148
|
std::string MultiOpsTxnsStressTest::Record::EncodePrimaryKey(uint32_t a) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
149
|
+
std::string ret;
|
|
150
|
+
PutFixed32(&ret, kPrimaryIndexId);
|
|
151
|
+
PutFixed32(&ret, a);
|
|
152
|
+
|
|
153
|
+
char* const buf = &ret[0];
|
|
154
|
+
std::reverse(buf, buf + sizeof(kPrimaryIndexId));
|
|
155
|
+
std::reverse(buf + sizeof(kPrimaryIndexId),
|
|
156
|
+
buf + sizeof(kPrimaryIndexId) + sizeof(a));
|
|
157
|
+
return ret;
|
|
140
158
|
}
|
|
141
159
|
|
|
142
160
|
std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey(uint32_t c) {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
161
|
+
std::string ret;
|
|
162
|
+
PutFixed32(&ret, kSecondaryIndexId);
|
|
163
|
+
PutFixed32(&ret, c);
|
|
164
|
+
|
|
165
|
+
char* const buf = &ret[0];
|
|
166
|
+
std::reverse(buf, buf + sizeof(kSecondaryIndexId));
|
|
167
|
+
std::reverse(buf + sizeof(kSecondaryIndexId),
|
|
168
|
+
buf + sizeof(kSecondaryIndexId) + sizeof(c));
|
|
169
|
+
return ret;
|
|
149
170
|
}
|
|
150
171
|
|
|
151
172
|
std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey(uint32_t c,
|
|
152
173
|
uint32_t a) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
std::reverse(buf
|
|
160
|
-
|
|
174
|
+
std::string ret;
|
|
175
|
+
PutFixed32(&ret, kSecondaryIndexId);
|
|
176
|
+
PutFixed32(&ret, c);
|
|
177
|
+
PutFixed32(&ret, a);
|
|
178
|
+
|
|
179
|
+
char* const buf = &ret[0];
|
|
180
|
+
std::reverse(buf, buf + sizeof(kSecondaryIndexId));
|
|
181
|
+
std::reverse(buf + sizeof(kSecondaryIndexId),
|
|
182
|
+
buf + sizeof(kSecondaryIndexId) + sizeof(c));
|
|
183
|
+
std::reverse(buf + sizeof(kSecondaryIndexId) + sizeof(c),
|
|
184
|
+
buf + sizeof(kSecondaryIndexId) + sizeof(c) + sizeof(a));
|
|
185
|
+
return ret;
|
|
161
186
|
}
|
|
162
187
|
|
|
163
188
|
std::tuple<Status, uint32_t, uint32_t>
|
|
@@ -201,40 +226,26 @@ std::string MultiOpsTxnsStressTest::Record::EncodePrimaryKey() const {
|
|
|
201
226
|
}
|
|
202
227
|
|
|
203
228
|
std::string MultiOpsTxnsStressTest::Record::EncodePrimaryIndexValue() const {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return
|
|
229
|
+
std::string ret;
|
|
230
|
+
PutFixed32(&ret, b_);
|
|
231
|
+
PutFixed32(&ret, c_);
|
|
232
|
+
return ret;
|
|
208
233
|
}
|
|
209
234
|
|
|
210
235
|
std::pair<std::string, std::string>
|
|
211
236
|
MultiOpsTxnsStressTest::Record::EncodeSecondaryIndexEntry() const {
|
|
212
|
-
std::string secondary_index_key;
|
|
213
|
-
char buf[12];
|
|
214
|
-
EncodeFixed32(buf, kSecondaryIndexId);
|
|
215
|
-
std::reverse(buf, buf + 4);
|
|
216
|
-
EncodeFixed32(buf + 4, c_);
|
|
217
|
-
EncodeFixed32(buf + 8, a_);
|
|
218
|
-
std::reverse(buf + 4, buf + 8);
|
|
219
|
-
std::reverse(buf + 8, buf + 12);
|
|
220
|
-
secondary_index_key.assign(buf, sizeof(buf));
|
|
237
|
+
std::string secondary_index_key = EncodeSecondaryKey(c_, a_);
|
|
221
238
|
|
|
222
239
|
// Secondary index value is always 4-byte crc32 of the secondary key
|
|
223
240
|
std::string secondary_index_value;
|
|
224
|
-
uint32_t crc =
|
|
241
|
+
uint32_t crc =
|
|
242
|
+
crc32c::Value(secondary_index_key.data(), secondary_index_key.size());
|
|
225
243
|
PutFixed32(&secondary_index_value, crc);
|
|
226
|
-
return std::make_pair(secondary_index_key, secondary_index_value);
|
|
244
|
+
return std::make_pair(std::move(secondary_index_key), secondary_index_value);
|
|
227
245
|
}
|
|
228
246
|
|
|
229
247
|
std::string MultiOpsTxnsStressTest::Record::EncodeSecondaryKey() const {
|
|
230
|
-
|
|
231
|
-
EncodeFixed32(buf, kSecondaryIndexId);
|
|
232
|
-
std::reverse(buf, buf + 4);
|
|
233
|
-
EncodeFixed32(buf + 4, c_);
|
|
234
|
-
EncodeFixed32(buf + 8, a_);
|
|
235
|
-
std::reverse(buf + 4, buf + 8);
|
|
236
|
-
std::reverse(buf + 8, buf + 12);
|
|
237
|
-
return std::string(buf, sizeof(buf));
|
|
248
|
+
return EncodeSecondaryKey(c_, a_);
|
|
238
249
|
}
|
|
239
250
|
|
|
240
251
|
Status MultiOpsTxnsStressTest::Record::DecodePrimaryIndexEntry(
|
|
@@ -244,27 +255,22 @@ Status MultiOpsTxnsStressTest::Record::DecodePrimaryIndexEntry(
|
|
|
244
255
|
return Status::Corruption("Primary index key length is not 8");
|
|
245
256
|
}
|
|
246
257
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
<< 8;
|
|
254
|
-
index_id +=
|
|
255
|
-
static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[3]));
|
|
256
|
-
primary_index_key.remove_prefix(sizeof(uint32_t));
|
|
258
|
+
uint32_t index_id = 0;
|
|
259
|
+
|
|
260
|
+
[[maybe_unused]] bool res = GetFixed32(&primary_index_key, &index_id);
|
|
261
|
+
assert(res);
|
|
262
|
+
index_id = EndianSwapValue(index_id);
|
|
263
|
+
|
|
257
264
|
if (index_id != kPrimaryIndexId) {
|
|
258
265
|
std::ostringstream oss;
|
|
259
266
|
oss << "Unexpected primary index id: " << index_id;
|
|
260
267
|
return Status::Corruption(oss.str());
|
|
261
268
|
}
|
|
262
269
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
a_
|
|
266
|
-
|
|
267
|
-
a_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[3]));
|
|
270
|
+
res = GetFixed32(&primary_index_key, &a_);
|
|
271
|
+
assert(res);
|
|
272
|
+
a_ = EndianSwapValue(a_);
|
|
273
|
+
assert(primary_index_key.empty());
|
|
268
274
|
|
|
269
275
|
if (primary_index_value.size() != 8) {
|
|
270
276
|
return Status::Corruption("Primary index value length is not 8");
|
|
@@ -282,33 +288,28 @@ Status MultiOpsTxnsStressTest::Record::DecodeSecondaryIndexEntry(
|
|
|
282
288
|
uint32_t crc =
|
|
283
289
|
crc32c::Value(secondary_index_key.data(), secondary_index_key.size());
|
|
284
290
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
<< 8;
|
|
292
|
-
index_id +=
|
|
293
|
-
static_cast<uint32_t>(static_cast<unsigned char>(index_id_buf[3]));
|
|
294
|
-
secondary_index_key.remove_prefix(sizeof(uint32_t));
|
|
291
|
+
uint32_t index_id = 0;
|
|
292
|
+
|
|
293
|
+
[[maybe_unused]] bool res = GetFixed32(&secondary_index_key, &index_id);
|
|
294
|
+
assert(res);
|
|
295
|
+
index_id = EndianSwapValue(index_id);
|
|
296
|
+
|
|
295
297
|
if (index_id != kSecondaryIndexId) {
|
|
296
298
|
std::ostringstream oss;
|
|
297
299
|
oss << "Unexpected secondary index id: " << index_id;
|
|
298
300
|
return Status::Corruption(oss.str());
|
|
299
301
|
}
|
|
300
302
|
|
|
301
|
-
const char* const buf = secondary_index_key.data();
|
|
302
303
|
assert(secondary_index_key.size() == 8);
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
c_
|
|
306
|
-
c_ += static_cast<uint32_t>(static_cast<unsigned char>(buf[3]));
|
|
304
|
+
res = GetFixed32(&secondary_index_key, &c_);
|
|
305
|
+
assert(res);
|
|
306
|
+
c_ = EndianSwapValue(c_);
|
|
307
307
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
a_
|
|
308
|
+
assert(secondary_index_key.size() == 4);
|
|
309
|
+
res = GetFixed32(&secondary_index_key, &a_);
|
|
310
|
+
assert(res);
|
|
311
|
+
a_ = EndianSwapValue(a_);
|
|
312
|
+
assert(secondary_index_key.empty());
|
|
312
313
|
|
|
313
314
|
if (secondary_index_value.size() != 4) {
|
|
314
315
|
return Status::Corruption("Secondary index value length is not 4");
|
|
@@ -520,9 +521,35 @@ Status MultiOpsTxnsStressTest::TestCustomOperations(
|
|
|
520
521
|
// Should never reach here.
|
|
521
522
|
assert(false);
|
|
522
523
|
}
|
|
524
|
+
|
|
523
525
|
return s;
|
|
524
526
|
}
|
|
525
527
|
|
|
528
|
+
void MultiOpsTxnsStressTest::RegisterAdditionalListeners() {
|
|
529
|
+
options_.listeners.emplace_back(new MultiOpsTxnsStressListener(this));
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
#ifndef ROCKSDB_LITE
|
|
533
|
+
void MultiOpsTxnsStressTest::PrepareTxnDbOptions(
|
|
534
|
+
SharedState* /*shared*/, TransactionDBOptions& txn_db_opts) {
|
|
535
|
+
// MultiOpsTxnStressTest uses SingleDelete to delete secondary keys, thus we
|
|
536
|
+
// register this callback to let TxnDb know that when rolling back
|
|
537
|
+
// a transaction, use only SingleDelete to cancel prior Put from the same
|
|
538
|
+
// transaction if applicable.
|
|
539
|
+
txn_db_opts.rollback_deletion_type_callback =
|
|
540
|
+
[](TransactionDB* /*db*/, ColumnFamilyHandle* /*column_family*/,
|
|
541
|
+
const Slice& key) {
|
|
542
|
+
Slice ks = key;
|
|
543
|
+
uint32_t index_id = 0;
|
|
544
|
+
[[maybe_unused]] bool res = GetFixed32(&ks, &index_id);
|
|
545
|
+
assert(res);
|
|
546
|
+
index_id = EndianSwapValue(index_id);
|
|
547
|
+
assert(index_id <= Record::kSecondaryIndexId);
|
|
548
|
+
return index_id == Record::kSecondaryIndexId;
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
#endif // !ROCKSDB_LITE
|
|
552
|
+
|
|
526
553
|
Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
|
|
527
554
|
uint32_t old_a,
|
|
528
555
|
uint32_t old_a_pos,
|
|
@@ -561,8 +588,10 @@ Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
|
|
|
561
588
|
}
|
|
562
589
|
if (s.IsNotFound()) {
|
|
563
590
|
thread->stats.AddGets(/*ngets=*/1, /*nfounds=*/0);
|
|
564
|
-
} else if (s.IsBusy()) {
|
|
591
|
+
} else if (s.IsBusy() || s.IsIncomplete()) {
|
|
565
592
|
// ignore.
|
|
593
|
+
// Incomplete also means rollback by application. See the transaction
|
|
594
|
+
// implementations.
|
|
566
595
|
} else {
|
|
567
596
|
thread->stats.AddErrors(1);
|
|
568
597
|
}
|
|
@@ -631,6 +660,16 @@ Status MultiOpsTxnsStressTest::PrimaryKeyUpdateTxn(ThreadState* thread,
|
|
|
631
660
|
return s;
|
|
632
661
|
}
|
|
633
662
|
|
|
663
|
+
if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
|
|
664
|
+
s = Status::Incomplete();
|
|
665
|
+
return s;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
s = WriteToCommitTimeWriteBatch(*txn);
|
|
669
|
+
if (!s.ok()) {
|
|
670
|
+
return s;
|
|
671
|
+
}
|
|
672
|
+
|
|
634
673
|
s = txn->Commit();
|
|
635
674
|
|
|
636
675
|
auto& key_gen = key_gen_for_a_.at(thread->tid);
|
|
@@ -677,11 +716,12 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
|
|
|
677
716
|
Record::kPrimaryIndexEntrySize + Record::kSecondaryIndexEntrySize);
|
|
678
717
|
return;
|
|
679
718
|
} else if (s.IsBusy() || s.IsTimedOut() || s.IsTryAgain() ||
|
|
680
|
-
s.IsMergeInProgress()) {
|
|
719
|
+
s.IsMergeInProgress() || s.IsIncomplete()) {
|
|
681
720
|
// ww-conflict detected, or
|
|
682
721
|
// lock cannot be acquired, or
|
|
683
722
|
// memtable history is not large enough for conflict checking, or
|
|
684
|
-
// Merge operation cannot be resolved
|
|
723
|
+
// Merge operation cannot be resolved, or
|
|
724
|
+
// application rollback.
|
|
685
725
|
// TODO (yanqin) add stats for other cases?
|
|
686
726
|
} else if (s.IsNotFound()) {
|
|
687
727
|
// ignore.
|
|
@@ -727,8 +767,9 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
|
|
|
727
767
|
Record record;
|
|
728
768
|
s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
|
|
729
769
|
if (!s.ok()) {
|
|
730
|
-
fprintf(stderr, "Cannot decode secondary key: %s\n",
|
|
731
|
-
|
|
770
|
+
fprintf(stderr, "Cannot decode secondary key (%s => %s): %s\n",
|
|
771
|
+
it->key().ToString(true).c_str(),
|
|
772
|
+
it->value().ToString(true).c_str(), s.ToString().c_str());
|
|
732
773
|
assert(false);
|
|
733
774
|
break;
|
|
734
775
|
}
|
|
@@ -749,21 +790,31 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
|
|
|
749
790
|
} else if (s.IsNotFound()) {
|
|
750
791
|
// We can also fail verification here.
|
|
751
792
|
std::ostringstream oss;
|
|
752
|
-
|
|
793
|
+
auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
|
|
794
|
+
assert(dbimpl);
|
|
795
|
+
oss << "snap " << read_opts.snapshot->GetSequenceNumber()
|
|
796
|
+
<< " (published " << dbimpl->GetLastPublishedSequence()
|
|
797
|
+
<< "), pk should exist: " << Slice(pk).ToString(true);
|
|
753
798
|
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
754
799
|
assert(false);
|
|
755
800
|
break;
|
|
756
801
|
}
|
|
757
802
|
if (!s.ok()) {
|
|
758
|
-
|
|
803
|
+
std::ostringstream oss;
|
|
804
|
+
auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
|
|
805
|
+
assert(dbimpl);
|
|
806
|
+
oss << "snap " << read_opts.snapshot->GetSequenceNumber()
|
|
807
|
+
<< " (published " << dbimpl->GetLastPublishedSequence() << "), "
|
|
808
|
+
<< s.ToString();
|
|
809
|
+
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
759
810
|
assert(false);
|
|
760
811
|
break;
|
|
761
812
|
}
|
|
762
813
|
auto result = Record::DecodePrimaryIndexValue(value);
|
|
763
814
|
s = std::get<0>(result);
|
|
764
815
|
if (!s.ok()) {
|
|
765
|
-
fprintf(stderr, "Cannot decode primary index value: %s\n",
|
|
766
|
-
s.ToString().c_str());
|
|
816
|
+
fprintf(stderr, "Cannot decode primary index value %s: %s\n",
|
|
817
|
+
Slice(value).ToString(true).c_str(), s.ToString().c_str());
|
|
767
818
|
assert(false);
|
|
768
819
|
break;
|
|
769
820
|
}
|
|
@@ -771,8 +822,12 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
|
|
|
771
822
|
uint32_t c = std::get<2>(result);
|
|
772
823
|
if (c != old_c) {
|
|
773
824
|
std::ostringstream oss;
|
|
774
|
-
|
|
775
|
-
|
|
825
|
+
auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
|
|
826
|
+
assert(dbimpl);
|
|
827
|
+
oss << "snap " << read_opts.snapshot->GetSequenceNumber()
|
|
828
|
+
<< " (published " << dbimpl->GetLastPublishedSequence()
|
|
829
|
+
<< "), pk/sk mismatch. pk: (a=" << record.a_value() << ", "
|
|
830
|
+
<< "c=" << c << "), sk: (c=" << old_c << ")";
|
|
776
831
|
s = Status::Corruption();
|
|
777
832
|
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
778
833
|
assert(false);
|
|
@@ -811,6 +866,16 @@ Status MultiOpsTxnsStressTest::SecondaryKeyUpdateTxn(ThreadState* thread,
|
|
|
811
866
|
return s;
|
|
812
867
|
}
|
|
813
868
|
|
|
869
|
+
if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
|
|
870
|
+
s = Status::Incomplete();
|
|
871
|
+
return s;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
s = WriteToCommitTimeWriteBatch(*txn);
|
|
875
|
+
if (!s.ok()) {
|
|
876
|
+
return s;
|
|
877
|
+
}
|
|
878
|
+
|
|
814
879
|
s = txn->Commit();
|
|
815
880
|
|
|
816
881
|
if (s.ok()) {
|
|
@@ -856,7 +921,7 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
|
|
|
856
921
|
} else if (s.IsInvalidArgument()) {
|
|
857
922
|
// ignored.
|
|
858
923
|
} else if (s.IsBusy() || s.IsTimedOut() || s.IsTryAgain() ||
|
|
859
|
-
s.IsMergeInProgress()) {
|
|
924
|
+
s.IsMergeInProgress() || s.IsIncomplete()) {
|
|
860
925
|
// ignored.
|
|
861
926
|
} else {
|
|
862
927
|
thread->stats.AddErrors(1);
|
|
@@ -874,8 +939,8 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
|
|
|
874
939
|
auto result = Record::DecodePrimaryIndexValue(value);
|
|
875
940
|
if (!std::get<0>(result).ok()) {
|
|
876
941
|
s = std::get<0>(result);
|
|
877
|
-
fprintf(stderr, "Cannot decode primary index value: %s\n",
|
|
878
|
-
s.ToString().c_str());
|
|
942
|
+
fprintf(stderr, "Cannot decode primary index value %s: %s\n",
|
|
943
|
+
Slice(value).ToString(true).c_str(), s.ToString().c_str());
|
|
879
944
|
assert(false);
|
|
880
945
|
return s;
|
|
881
946
|
}
|
|
@@ -892,6 +957,17 @@ Status MultiOpsTxnsStressTest::UpdatePrimaryIndexValueTxn(ThreadState* thread,
|
|
|
892
957
|
if (!s.ok()) {
|
|
893
958
|
return s;
|
|
894
959
|
}
|
|
960
|
+
|
|
961
|
+
if (FLAGS_rollback_one_in > 0 && thread->rand.OneIn(FLAGS_rollback_one_in)) {
|
|
962
|
+
s = Status::Incomplete();
|
|
963
|
+
return s;
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
s = WriteToCommitTimeWriteBatch(*txn);
|
|
967
|
+
if (!s.ok()) {
|
|
968
|
+
return s;
|
|
969
|
+
}
|
|
970
|
+
|
|
895
971
|
s = txn->Commit();
|
|
896
972
|
if (s.ok()) {
|
|
897
973
|
delete txn;
|
|
@@ -1050,12 +1126,15 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1050
1126
|
// First, iterate primary index.
|
|
1051
1127
|
size_t primary_index_entries_count = 0;
|
|
1052
1128
|
{
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
std::reverse(
|
|
1056
|
-
std::string iter_ub_str(buf, sizeof(buf));
|
|
1129
|
+
std::string iter_ub_str;
|
|
1130
|
+
PutFixed32(&iter_ub_str, Record::kPrimaryIndexId + 1);
|
|
1131
|
+
std::reverse(iter_ub_str.begin(), iter_ub_str.end());
|
|
1057
1132
|
Slice iter_ub = iter_ub_str;
|
|
1058
1133
|
|
|
1134
|
+
std::string start_key;
|
|
1135
|
+
PutFixed32(&start_key, Record::kPrimaryIndexId);
|
|
1136
|
+
std::reverse(start_key.begin(), start_key.end());
|
|
1137
|
+
|
|
1059
1138
|
// This `ReadOptions` is for validation purposes. Ignore
|
|
1060
1139
|
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
1061
1140
|
ReadOptions ropts;
|
|
@@ -1064,7 +1143,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1064
1143
|
ropts.iterate_upper_bound = &iter_ub;
|
|
1065
1144
|
|
|
1066
1145
|
std::unique_ptr<Iterator> it(db_->NewIterator(ropts));
|
|
1067
|
-
for (it->
|
|
1146
|
+
for (it->Seek(start_key); it->Valid(); it->Next()) {
|
|
1068
1147
|
Record record;
|
|
1069
1148
|
Status s = record.DecodePrimaryIndexEntry(it->key(), it->value());
|
|
1070
1149
|
if (!s.ok()) {
|
|
@@ -1101,10 +1180,9 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1101
1180
|
// Second, iterate secondary index.
|
|
1102
1181
|
size_t secondary_index_entries_count = 0;
|
|
1103
1182
|
{
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
std::reverse(
|
|
1107
|
-
const std::string start_key(buf, sizeof(buf));
|
|
1183
|
+
std::string start_key;
|
|
1184
|
+
PutFixed32(&start_key, Record::kSecondaryIndexId);
|
|
1185
|
+
std::reverse(start_key.begin(), start_key.end());
|
|
1108
1186
|
|
|
1109
1187
|
// This `ReadOptions` is for validation purposes. Ignore
|
|
1110
1188
|
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
@@ -1118,7 +1196,8 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1118
1196
|
Record record;
|
|
1119
1197
|
Status s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
|
|
1120
1198
|
if (!s.ok()) {
|
|
1121
|
-
oss << "Cannot decode secondary index entry"
|
|
1199
|
+
oss << "Cannot decode secondary index entry "
|
|
1200
|
+
<< it->key().ToString(true) << "=>" << it->value().ToString(true);
|
|
1122
1201
|
VerificationAbort(thread->shared, oss.str(), s);
|
|
1123
1202
|
assert(false);
|
|
1124
1203
|
return;
|
|
@@ -1132,7 +1211,7 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1132
1211
|
s = db_->Get(ropts, pk, &value);
|
|
1133
1212
|
if (!s.ok()) {
|
|
1134
1213
|
oss << "Error searching pk " << Slice(pk).ToString(true) << ". "
|
|
1135
|
-
<< s.ToString();
|
|
1214
|
+
<< s.ToString() << ". sk " << it->key().ToString(true);
|
|
1136
1215
|
VerificationAbort(thread->shared, oss.str(), s);
|
|
1137
1216
|
assert(false);
|
|
1138
1217
|
return;
|
|
@@ -1148,8 +1227,10 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1148
1227
|
}
|
|
1149
1228
|
uint32_t c_in_primary = std::get<2>(result);
|
|
1150
1229
|
if (c_in_primary != record.c_value()) {
|
|
1151
|
-
oss << "Pk/sk mismatch. pk:
|
|
1152
|
-
<<
|
|
1230
|
+
oss << "Pk/sk mismatch. pk: " << Slice(pk).ToString(true) << "=>"
|
|
1231
|
+
<< Slice(value).ToString(true) << " (a=" << record.a_value()
|
|
1232
|
+
<< ", c=" << c_in_primary << "), sk: " << it->key().ToString(true)
|
|
1233
|
+
<< " (c=" << record.c_value() << ")";
|
|
1153
1234
|
VerificationAbort(thread->shared, oss.str(), s);
|
|
1154
1235
|
assert(false);
|
|
1155
1236
|
return;
|
|
@@ -1167,6 +1248,75 @@ void MultiOpsTxnsStressTest::VerifyDb(ThreadState* thread) const {
|
|
|
1167
1248
|
}
|
|
1168
1249
|
}
|
|
1169
1250
|
|
|
1251
|
+
void MultiOpsTxnsStressTest::VerifyPkSkFast(int job_id) {
|
|
1252
|
+
const Snapshot* const snapshot = db_->GetSnapshot();
|
|
1253
|
+
assert(snapshot);
|
|
1254
|
+
ManagedSnapshot snapshot_guard(db_, snapshot);
|
|
1255
|
+
|
|
1256
|
+
std::ostringstream oss;
|
|
1257
|
+
auto* dbimpl = static_cast_with_check<DBImpl>(db_->GetRootDB());
|
|
1258
|
+
assert(dbimpl);
|
|
1259
|
+
|
|
1260
|
+
oss << "Job " << job_id << ": [" << snapshot->GetSequenceNumber() << ","
|
|
1261
|
+
<< dbimpl->GetLastPublishedSequence() << "] ";
|
|
1262
|
+
|
|
1263
|
+
std::string start_key;
|
|
1264
|
+
PutFixed32(&start_key, Record::kSecondaryIndexId);
|
|
1265
|
+
std::reverse(start_key.begin(), start_key.end());
|
|
1266
|
+
|
|
1267
|
+
// This `ReadOptions` is for validation purposes. Ignore
|
|
1268
|
+
// `FLAGS_rate_limit_user_ops` to avoid slowing any validation.
|
|
1269
|
+
ReadOptions ropts;
|
|
1270
|
+
ropts.snapshot = snapshot;
|
|
1271
|
+
ropts.total_order_seek = true;
|
|
1272
|
+
|
|
1273
|
+
std::unique_ptr<Iterator> it(db_->NewIterator(ropts));
|
|
1274
|
+
for (it->Seek(start_key); it->Valid(); it->Next()) {
|
|
1275
|
+
Record record;
|
|
1276
|
+
Status s = record.DecodeSecondaryIndexEntry(it->key(), it->value());
|
|
1277
|
+
if (!s.ok()) {
|
|
1278
|
+
oss << "Cannot decode secondary index entry " << it->key().ToString(true)
|
|
1279
|
+
<< "=>" << it->value().ToString(true);
|
|
1280
|
+
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
1281
|
+
fflush(stderr);
|
|
1282
|
+
assert(false);
|
|
1283
|
+
}
|
|
1284
|
+
// After decoding secondary index entry, we know a and c. Crc is verified
|
|
1285
|
+
// in decoding phase.
|
|
1286
|
+
//
|
|
1287
|
+
// Form a primary key and search in the primary index.
|
|
1288
|
+
std::string pk = Record::EncodePrimaryKey(record.a_value());
|
|
1289
|
+
std::string value;
|
|
1290
|
+
s = db_->Get(ropts, pk, &value);
|
|
1291
|
+
if (!s.ok()) {
|
|
1292
|
+
oss << "Error searching pk " << Slice(pk).ToString(true) << ". "
|
|
1293
|
+
<< s.ToString() << ". sk " << it->key().ToString(true);
|
|
1294
|
+
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
1295
|
+
fflush(stderr);
|
|
1296
|
+
assert(false);
|
|
1297
|
+
}
|
|
1298
|
+
auto result = Record::DecodePrimaryIndexValue(value);
|
|
1299
|
+
s = std::get<0>(result);
|
|
1300
|
+
if (!s.ok()) {
|
|
1301
|
+
oss << "Error decoding primary index value "
|
|
1302
|
+
<< Slice(value).ToString(true) << ". " << s.ToString();
|
|
1303
|
+
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
1304
|
+
fflush(stderr);
|
|
1305
|
+
assert(false);
|
|
1306
|
+
}
|
|
1307
|
+
uint32_t c_in_primary = std::get<2>(result);
|
|
1308
|
+
if (c_in_primary != record.c_value()) {
|
|
1309
|
+
oss << "Pk/sk mismatch. pk: " << Slice(pk).ToString(true) << "=>"
|
|
1310
|
+
<< Slice(value).ToString(true) << " (a=" << record.a_value()
|
|
1311
|
+
<< ", c=" << c_in_primary << "), sk: " << it->key().ToString(true)
|
|
1312
|
+
<< " (c=" << record.c_value() << ")";
|
|
1313
|
+
fprintf(stderr, "%s\n", oss.str().c_str());
|
|
1314
|
+
fflush(stderr);
|
|
1315
|
+
assert(false);
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1170
1320
|
std::pair<uint32_t, uint32_t> MultiOpsTxnsStressTest::ChooseExistingA(
|
|
1171
1321
|
ThreadState* thread) {
|
|
1172
1322
|
uint32_t tid = thread->tid;
|
|
@@ -1193,6 +1343,22 @@ uint32_t MultiOpsTxnsStressTest::GenerateNextC(ThreadState* thread) {
|
|
|
1193
1343
|
return key_gen->Allocate();
|
|
1194
1344
|
}
|
|
1195
1345
|
|
|
1346
|
+
#ifndef ROCKSDB_LITE
|
|
1347
|
+
Status MultiOpsTxnsStressTest::WriteToCommitTimeWriteBatch(Transaction& txn) {
|
|
1348
|
+
WriteBatch* ctwb = txn.GetCommitTimeWriteBatch();
|
|
1349
|
+
assert(ctwb);
|
|
1350
|
+
// Do not change the content in key_buf.
|
|
1351
|
+
static constexpr char key_buf[sizeof(Record::kMetadataPrefix) + 4] = {
|
|
1352
|
+
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\xff'};
|
|
1353
|
+
|
|
1354
|
+
uint64_t counter_val = counter_.Next();
|
|
1355
|
+
char val_buf[sizeof(counter_val)];
|
|
1356
|
+
EncodeFixed64(val_buf, counter_val);
|
|
1357
|
+
return ctwb->Put(Slice(key_buf, sizeof(key_buf)),
|
|
1358
|
+
Slice(val_buf, sizeof(val_buf)));
|
|
1359
|
+
}
|
|
1360
|
+
#endif // !ROCKSDB_LITE
|
|
1361
|
+
|
|
1196
1362
|
std::string MultiOpsTxnsStressTest::KeySpaces::EncodeTo() const {
|
|
1197
1363
|
std::string result;
|
|
1198
1364
|
PutFixed32(&result, lb_a);
|
|
@@ -1428,8 +1594,9 @@ void MultiOpsTxnsStressTest::ScanExistingDb(SharedState* shared, int threads) {
|
|
|
1428
1594
|
Record record;
|
|
1429
1595
|
Status s = record.DecodePrimaryIndexEntry(it->key(), it->value());
|
|
1430
1596
|
if (!s.ok()) {
|
|
1431
|
-
fprintf(stderr, "Cannot decode primary index entry: %s\n",
|
|
1432
|
-
|
|
1597
|
+
fprintf(stderr, "Cannot decode primary index entry (%s => %s): %s\n",
|
|
1598
|
+
it->key().ToString(true).c_str(),
|
|
1599
|
+
it->value().ToString(true).c_str(), s.ToString().c_str());
|
|
1433
1600
|
assert(false);
|
|
1434
1601
|
}
|
|
1435
1602
|
uint32_t a = record.a_value();
|