@nxtedition/rocksdb 8.2.8 → 9.0.0
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 +7 -1
- package/deps/rocksdb/rocksdb/Makefile +22 -19
- package/deps/rocksdb/rocksdb/TARGETS +8 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +157 -61
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +43 -92
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +632 -455
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +244 -149
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +41 -13
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +11 -1
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +216 -17
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +279 -199
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +159 -8
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +28 -2
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +1 -1
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +3 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -21
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/builder.cc +32 -7
- package/deps/rocksdb/rocksdb/db/c.cc +169 -6
- package/deps/rocksdb/rocksdb/db/c_test.c +104 -6
- package/deps/rocksdb/rocksdb/db/column_family.cc +98 -47
- package/deps/rocksdb/rocksdb/db/column_family.h +25 -2
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +213 -2
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +93 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +33 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +107 -43
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +25 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +13 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +29 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +24 -31
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +19 -19
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
- package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -3
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +15 -15
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +666 -44
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +274 -1
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -19
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +250 -116
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +51 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +354 -96
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +26 -13
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +61 -21
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -87
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +7 -1
- package/deps/rocksdb/rocksdb/db/db_iter.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +39 -29
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +106 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +12 -3
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +279 -166
- package/deps/rocksdb/rocksdb/db/db_test.cc +48 -21
- package/deps/rocksdb/rocksdb/db/db_test2.cc +81 -12
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +40 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +13 -1
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +233 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +16 -0
- package/deps/rocksdb/rocksdb/db/error_handler.h +6 -3
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -4
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
- package/deps/rocksdb/rocksdb/db/flush_job.cc +101 -11
- package/deps/rocksdb/rocksdb/db/flush_job.h +24 -1
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +88 -11
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
- package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
- package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
- package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -3
- package/deps/rocksdb/rocksdb/db/memtable.cc +52 -13
- package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +44 -10
- package/deps/rocksdb/rocksdb/db/memtable_list.h +32 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +90 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -2
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +21 -4
- package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -4
- package/deps/rocksdb/rocksdb/db/table_cache.cc +44 -35
- package/deps/rocksdb/rocksdb/db/table_cache.h +6 -6
- package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
- package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
- package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
- package/deps/rocksdb/rocksdb/db/version_edit.h +48 -6
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
- package/deps/rocksdb/rocksdb/db/version_set.cc +136 -41
- package/deps/rocksdb/rocksdb/db/version_set.h +28 -7
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +25 -15
- package/deps/rocksdb/rocksdb/db/write_batch.cc +11 -0
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +22 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +32 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -120
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +9 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +13 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +15 -27
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +264 -69
- package/deps/rocksdb/rocksdb/env/env.cc +1 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
- package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +78 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +52 -43
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +34 -18
- package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
- package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +724 -79
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +64 -33
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +153 -88
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +70 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +50 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +16 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +55 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +32 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +90 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +85 -17
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +13 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +21 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +33 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -0
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -1
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +16 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +10 -0
- package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
- package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +2 -1
- package/deps/rocksdb/rocksdb/options/db_options.cc +7 -0
- package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
- package/deps/rocksdb/rocksdb/options/options.cc +15 -1
- package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -3
- package/deps/rocksdb/rocksdb/options/options_test.cc +8 -0
- package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +27 -12
- package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
- package/deps/rocksdb/rocksdb/src.mk +3 -0
- package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
- package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +115 -42
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +60 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +62 -44
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +36 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -15
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -21
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +11 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +195 -55
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +27 -12
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +9 -6
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +11 -11
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -0
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
- package/deps/rocksdb/rocksdb/table/format.cc +175 -33
- package/deps/rocksdb/rocksdb/table/format.h +63 -10
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -2
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
- package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +12 -3
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +26 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
- package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
- package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +65 -26
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
- package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
- package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
- package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
- package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
- package/deps/rocksdb/rocksdb/util/cast_util.h +14 -0
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +29 -7
- package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
- package/deps/rocksdb/rocksdb/util/compression.h +110 -32
- package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
- package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
- package/deps/rocksdb/rocksdb/util/hash.h +7 -3
- package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
- package/deps/rocksdb/rocksdb/util/math.h +58 -6
- package/deps/rocksdb/rocksdb/util/math128.h +29 -7
- package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
- package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
- package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
- package/deps/rocksdb/rocksdb/util/thread_operation.h +8 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +343 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +173 -1
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +447 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
- package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +69 -25
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +231 -33
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +40 -23
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +13 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +41 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +71 -24
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +39 -11
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +14 -8
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
- package/deps/rocksdb/rocksdb.gyp +2 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
// COPYING file in the root directory) and Apache 2.0 License
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
#include <cstdint>
|
|
7
7
|
#include <functional>
|
|
8
|
+
#include <memory>
|
|
8
9
|
#include <string>
|
|
9
10
|
#include <thread>
|
|
10
11
|
|
|
@@ -27,49 +28,54 @@ class OptimisticTransactionTest
|
|
|
27
28
|
: public testing::Test,
|
|
28
29
|
public testing::WithParamInterface<OccValidationPolicy> {
|
|
29
30
|
public:
|
|
30
|
-
OptimisticTransactionDB
|
|
31
|
+
std::unique_ptr<OptimisticTransactionDB> txn_db;
|
|
31
32
|
std::string dbname;
|
|
32
33
|
Options options;
|
|
34
|
+
OptimisticTransactionDBOptions occ_opts;
|
|
33
35
|
|
|
34
36
|
OptimisticTransactionTest() {
|
|
35
37
|
options.create_if_missing = true;
|
|
36
38
|
options.max_write_buffer_number = 2;
|
|
37
39
|
options.max_write_buffer_size_to_maintain = 2 * Arena::kInlineSize;
|
|
38
40
|
options.merge_operator.reset(new TestPutOperator());
|
|
41
|
+
occ_opts.validate_policy = GetParam();
|
|
39
42
|
dbname = test::PerThreadDBPath("optimistic_transaction_testdb");
|
|
40
43
|
|
|
41
44
|
EXPECT_OK(DestroyDB(dbname, options));
|
|
42
45
|
Open();
|
|
43
46
|
}
|
|
44
47
|
~OptimisticTransactionTest() override {
|
|
45
|
-
|
|
48
|
+
EXPECT_OK(txn_db->Close());
|
|
49
|
+
txn_db.reset();
|
|
46
50
|
EXPECT_OK(DestroyDB(dbname, options));
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
void Reopen() {
|
|
50
|
-
|
|
51
|
-
txn_db = nullptr;
|
|
54
|
+
txn_db.reset();
|
|
52
55
|
Open();
|
|
53
56
|
}
|
|
54
57
|
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
static void OpenImpl(const Options& options,
|
|
59
|
+
const OptimisticTransactionDBOptions& occ_opts,
|
|
60
|
+
const std::string& dbname,
|
|
61
|
+
std::unique_ptr<OptimisticTransactionDB>* txn_db) {
|
|
57
62
|
ColumnFamilyOptions cf_options(options);
|
|
58
|
-
OptimisticTransactionDBOptions occ_opts;
|
|
59
|
-
occ_opts.validate_policy = GetParam();
|
|
60
63
|
std::vector<ColumnFamilyDescriptor> column_families;
|
|
61
64
|
std::vector<ColumnFamilyHandle*> handles;
|
|
62
65
|
column_families.push_back(
|
|
63
66
|
ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
OptimisticTransactionDB* raw_txn_db = nullptr;
|
|
68
|
+
Status s = OptimisticTransactionDB::Open(
|
|
69
|
+
options, occ_opts, dbname, column_families, &handles, &raw_txn_db);
|
|
68
70
|
ASSERT_OK(s);
|
|
69
|
-
ASSERT_NE(
|
|
71
|
+
ASSERT_NE(raw_txn_db, nullptr);
|
|
72
|
+
txn_db->reset(raw_txn_db);
|
|
70
73
|
ASSERT_EQ(handles.size(), 1);
|
|
71
74
|
delete handles[0];
|
|
72
75
|
}
|
|
76
|
+
|
|
77
|
+
private:
|
|
78
|
+
void Open() { OpenImpl(options, occ_opts, dbname, &txn_db); }
|
|
73
79
|
};
|
|
74
80
|
|
|
75
81
|
TEST_P(OptimisticTransactionTest, SuccessTest) {
|
|
@@ -316,17 +322,11 @@ TEST_P(OptimisticTransactionTest, FlushTest) {
|
|
|
316
322
|
delete txn;
|
|
317
323
|
}
|
|
318
324
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
ReadOptions
|
|
325
|
+
namespace {
|
|
326
|
+
void FlushTest2PopulateTxn(Transaction* txn) {
|
|
327
|
+
ReadOptions snapshot_read_options;
|
|
322
328
|
std::string value;
|
|
323
329
|
|
|
324
|
-
ASSERT_OK(txn_db->Put(write_options, Slice("foo"), Slice("bar")));
|
|
325
|
-
ASSERT_OK(txn_db->Put(write_options, Slice("foo2"), Slice("bar")));
|
|
326
|
-
|
|
327
|
-
Transaction* txn = txn_db->BeginTransaction(write_options);
|
|
328
|
-
ASSERT_NE(txn, nullptr);
|
|
329
|
-
|
|
330
330
|
snapshot_read_options.snapshot = txn->GetSnapshot();
|
|
331
331
|
|
|
332
332
|
ASSERT_OK(txn->GetForUpdate(snapshot_read_options, "foo", &value));
|
|
@@ -336,6 +336,21 @@ TEST_P(OptimisticTransactionTest, FlushTest2) {
|
|
|
336
336
|
|
|
337
337
|
ASSERT_OK(txn->GetForUpdate(snapshot_read_options, "foo", &value));
|
|
338
338
|
ASSERT_EQ(value, "bar2");
|
|
339
|
+
}
|
|
340
|
+
} // namespace
|
|
341
|
+
|
|
342
|
+
TEST_P(OptimisticTransactionTest, FlushTest2) {
|
|
343
|
+
WriteOptions write_options;
|
|
344
|
+
ReadOptions read_options;
|
|
345
|
+
std::string value;
|
|
346
|
+
|
|
347
|
+
ASSERT_OK(txn_db->Put(write_options, Slice("foo"), Slice("bar")));
|
|
348
|
+
ASSERT_OK(txn_db->Put(write_options, Slice("foo2"), Slice("bar")));
|
|
349
|
+
|
|
350
|
+
Transaction* txn = txn_db->BeginTransaction(write_options);
|
|
351
|
+
ASSERT_NE(txn, nullptr);
|
|
352
|
+
|
|
353
|
+
FlushTest2PopulateTxn(txn);
|
|
339
354
|
|
|
340
355
|
// Put a random key so we have a MemTable to flush
|
|
341
356
|
ASSERT_OK(txn_db->Put(write_options, "dummy", "dummy"));
|
|
@@ -361,9 +376,23 @@ TEST_P(OptimisticTransactionTest, FlushTest2) {
|
|
|
361
376
|
// txn should not commit since MemTableList History is not large enough
|
|
362
377
|
ASSERT_TRUE(s.IsTryAgain());
|
|
363
378
|
|
|
379
|
+
// simply trying Commit again doesn't help
|
|
380
|
+
s = txn->Commit();
|
|
381
|
+
ASSERT_TRUE(s.IsTryAgain());
|
|
382
|
+
|
|
364
383
|
ASSERT_OK(txn_db->Get(read_options, "foo", &value));
|
|
365
384
|
ASSERT_EQ(value, "bar");
|
|
366
385
|
|
|
386
|
+
// But rolling back and redoing does
|
|
387
|
+
ASSERT_OK(txn->Rollback());
|
|
388
|
+
|
|
389
|
+
FlushTest2PopulateTxn(txn);
|
|
390
|
+
|
|
391
|
+
ASSERT_OK(txn->Commit());
|
|
392
|
+
|
|
393
|
+
ASSERT_OK(txn_db->Get(read_options, "foo", &value));
|
|
394
|
+
ASSERT_EQ(value, "bar2");
|
|
395
|
+
|
|
367
396
|
delete txn;
|
|
368
397
|
}
|
|
369
398
|
|
|
@@ -616,8 +645,11 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
|
|
|
616
645
|
|
|
617
646
|
delete cfa;
|
|
618
647
|
delete cfb;
|
|
619
|
-
|
|
620
|
-
|
|
648
|
+
txn_db.reset();
|
|
649
|
+
|
|
650
|
+
OptimisticTransactionDBOptions my_occ_opts = occ_opts;
|
|
651
|
+
const size_t bucket_count = 500;
|
|
652
|
+
my_occ_opts.shared_lock_buckets = MakeSharedOccLockBuckets(bucket_count);
|
|
621
653
|
|
|
622
654
|
// open DB with three column families
|
|
623
655
|
std::vector<ColumnFamilyDescriptor> column_families;
|
|
@@ -630,10 +662,11 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
|
|
|
630
662
|
column_families.push_back(
|
|
631
663
|
ColumnFamilyDescriptor("CFB", ColumnFamilyOptions()));
|
|
632
664
|
std::vector<ColumnFamilyHandle*> handles;
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
ASSERT_NE(
|
|
665
|
+
OptimisticTransactionDB* raw_txn_db = nullptr;
|
|
666
|
+
ASSERT_OK(OptimisticTransactionDB::Open(
|
|
667
|
+
options, my_occ_opts, dbname, column_families, &handles, &raw_txn_db));
|
|
668
|
+
ASSERT_NE(raw_txn_db, nullptr);
|
|
669
|
+
txn_db.reset(raw_txn_db);
|
|
637
670
|
|
|
638
671
|
Transaction* txn = txn_db->BeginTransaction(write_options);
|
|
639
672
|
ASSERT_NE(txn, nullptr);
|
|
@@ -671,6 +704,7 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
|
|
|
671
704
|
s = txn_db->Get(read_options, "AAA", &value);
|
|
672
705
|
ASSERT_TRUE(s.IsNotFound());
|
|
673
706
|
s = txn_db->Get(read_options, handles[2], "AAAZZZ", &value);
|
|
707
|
+
ASSERT_OK(s);
|
|
674
708
|
ASSERT_EQ(value, "barbar");
|
|
675
709
|
|
|
676
710
|
Slice key_slices[3] = {Slice("AAA"), Slice("ZZ"), Slice("Z")};
|
|
@@ -694,6 +728,7 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
|
|
|
694
728
|
delete txn;
|
|
695
729
|
delete txn2;
|
|
696
730
|
|
|
731
|
+
// ** MultiGet **
|
|
697
732
|
txn = txn_db->BeginTransaction(write_options, txn_options);
|
|
698
733
|
snapshot_read_options.snapshot = txn->GetSnapshot();
|
|
699
734
|
|
|
@@ -745,11 +780,162 @@ TEST_P(OptimisticTransactionTest, ColumnFamiliesTest) {
|
|
|
745
780
|
s = txn2->Commit();
|
|
746
781
|
ASSERT_TRUE(s.IsBusy());
|
|
747
782
|
|
|
783
|
+
delete txn;
|
|
784
|
+
delete txn2;
|
|
785
|
+
|
|
786
|
+
// ** Test independence and/or sharing of lock buckets across CFs and DBs **
|
|
787
|
+
if (my_occ_opts.validate_policy == OccValidationPolicy::kValidateParallel) {
|
|
788
|
+
struct SeenStat {
|
|
789
|
+
uint64_t rolling_hash = 0;
|
|
790
|
+
uintptr_t min = 0;
|
|
791
|
+
uintptr_t max = 0;
|
|
792
|
+
};
|
|
793
|
+
SeenStat cur_seen;
|
|
794
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
795
|
+
"OptimisticTransaction::CommitWithParallelValidate::lock_bucket_ptr",
|
|
796
|
+
[&](void* arg) {
|
|
797
|
+
// Hash the pointer
|
|
798
|
+
cur_seen.rolling_hash = Hash64(reinterpret_cast<char*>(&arg),
|
|
799
|
+
sizeof(arg), cur_seen.rolling_hash);
|
|
800
|
+
uintptr_t val = reinterpret_cast<uintptr_t>(arg);
|
|
801
|
+
if (cur_seen.min == 0 || val < cur_seen.min) {
|
|
802
|
+
cur_seen.min = val;
|
|
803
|
+
}
|
|
804
|
+
if (cur_seen.max == 0 || val > cur_seen.max) {
|
|
805
|
+
cur_seen.max = val;
|
|
806
|
+
}
|
|
807
|
+
});
|
|
808
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
809
|
+
|
|
810
|
+
// Another db sharing lock buckets
|
|
811
|
+
auto shared_dbname =
|
|
812
|
+
test::PerThreadDBPath("optimistic_transaction_testdb_shared");
|
|
813
|
+
std::unique_ptr<OptimisticTransactionDB> shared_txn_db = nullptr;
|
|
814
|
+
OpenImpl(options, my_occ_opts, shared_dbname, &shared_txn_db);
|
|
815
|
+
|
|
816
|
+
// Another db not sharing lock buckets
|
|
817
|
+
auto nonshared_dbname =
|
|
818
|
+
test::PerThreadDBPath("optimistic_transaction_testdb_nonshared");
|
|
819
|
+
std::unique_ptr<OptimisticTransactionDB> nonshared_txn_db = nullptr;
|
|
820
|
+
my_occ_opts.occ_lock_buckets = bucket_count;
|
|
821
|
+
my_occ_opts.shared_lock_buckets = nullptr;
|
|
822
|
+
OpenImpl(options, my_occ_opts, nonshared_dbname, &nonshared_txn_db);
|
|
823
|
+
|
|
824
|
+
// Plenty of keys to avoid randomly hitting the same hash sequence
|
|
825
|
+
std::array<std::string, 30> keys;
|
|
826
|
+
for (size_t i = 0; i < keys.size(); ++i) {
|
|
827
|
+
keys[i] = std::to_string(i);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// Get a baseline pattern of bucket accesses
|
|
831
|
+
cur_seen = {};
|
|
832
|
+
txn = txn_db->BeginTransaction(write_options, txn_options);
|
|
833
|
+
for (const auto& key : keys) {
|
|
834
|
+
ASSERT_OK(txn->Put(handles[0], key, "blah"));
|
|
835
|
+
}
|
|
836
|
+
ASSERT_OK(txn->Commit());
|
|
837
|
+
// Sufficiently large hash coverage of the space
|
|
838
|
+
const uintptr_t min_span_bytes = sizeof(port::Mutex) * bucket_count / 2;
|
|
839
|
+
ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
|
|
840
|
+
// Save
|
|
841
|
+
SeenStat base_seen = cur_seen;
|
|
842
|
+
|
|
843
|
+
// Verify it is repeatable
|
|
844
|
+
cur_seen = {};
|
|
845
|
+
txn = txn_db->BeginTransaction(write_options, txn_options, txn);
|
|
846
|
+
for (const auto& key : keys) {
|
|
847
|
+
ASSERT_OK(txn->Put(handles[0], key, "moo"));
|
|
848
|
+
}
|
|
849
|
+
ASSERT_OK(txn->Commit());
|
|
850
|
+
ASSERT_EQ(cur_seen.rolling_hash, base_seen.rolling_hash);
|
|
851
|
+
ASSERT_EQ(cur_seen.min, base_seen.min);
|
|
852
|
+
ASSERT_EQ(cur_seen.max, base_seen.max);
|
|
853
|
+
|
|
854
|
+
// Try another CF
|
|
855
|
+
cur_seen = {};
|
|
856
|
+
txn = txn_db->BeginTransaction(write_options, txn_options, txn);
|
|
857
|
+
for (const auto& key : keys) {
|
|
858
|
+
ASSERT_OK(txn->Put(handles[1], key, "blah"));
|
|
859
|
+
}
|
|
860
|
+
ASSERT_OK(txn->Commit());
|
|
861
|
+
// Different access pattern (different hash seed)
|
|
862
|
+
ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
|
|
863
|
+
// Same pointer space
|
|
864
|
+
ASSERT_LT(cur_seen.min, base_seen.max);
|
|
865
|
+
ASSERT_GT(cur_seen.max, base_seen.min);
|
|
866
|
+
// Sufficiently large hash coverage of the space
|
|
867
|
+
ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
|
|
868
|
+
// Save
|
|
869
|
+
SeenStat cf1_seen = cur_seen;
|
|
870
|
+
|
|
871
|
+
// And another CF
|
|
872
|
+
cur_seen = {};
|
|
873
|
+
txn = txn_db->BeginTransaction(write_options, txn_options, txn);
|
|
874
|
+
for (const auto& key : keys) {
|
|
875
|
+
ASSERT_OK(txn->Put(handles[2], key, "blah"));
|
|
876
|
+
}
|
|
877
|
+
ASSERT_OK(txn->Commit());
|
|
878
|
+
// Different access pattern (different hash seed)
|
|
879
|
+
ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
|
|
880
|
+
ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
|
|
881
|
+
// Same pointer space
|
|
882
|
+
ASSERT_LT(cur_seen.min, base_seen.max);
|
|
883
|
+
ASSERT_GT(cur_seen.max, base_seen.min);
|
|
884
|
+
// Sufficiently large hash coverage of the space
|
|
885
|
+
ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
|
|
886
|
+
|
|
887
|
+
// And DB with shared lock buckets
|
|
888
|
+
cur_seen = {};
|
|
889
|
+
delete txn;
|
|
890
|
+
txn = shared_txn_db->BeginTransaction(write_options, txn_options);
|
|
891
|
+
for (const auto& key : keys) {
|
|
892
|
+
ASSERT_OK(txn->Put(key, "blah"));
|
|
893
|
+
}
|
|
894
|
+
ASSERT_OK(txn->Commit());
|
|
895
|
+
// Different access pattern (different hash seed)
|
|
896
|
+
ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
|
|
897
|
+
ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
|
|
898
|
+
// Same pointer space
|
|
899
|
+
ASSERT_LT(cur_seen.min, base_seen.max);
|
|
900
|
+
ASSERT_GT(cur_seen.max, base_seen.min);
|
|
901
|
+
// Sufficiently large hash coverage of the space
|
|
902
|
+
ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
|
|
903
|
+
|
|
904
|
+
// And DB with distinct lock buckets
|
|
905
|
+
cur_seen = {};
|
|
906
|
+
delete txn;
|
|
907
|
+
txn = nonshared_txn_db->BeginTransaction(write_options, txn_options);
|
|
908
|
+
for (const auto& key : keys) {
|
|
909
|
+
ASSERT_OK(txn->Put(key, "blah"));
|
|
910
|
+
}
|
|
911
|
+
ASSERT_OK(txn->Commit());
|
|
912
|
+
// Different access pattern (different hash seed)
|
|
913
|
+
ASSERT_NE(cur_seen.rolling_hash, base_seen.rolling_hash);
|
|
914
|
+
ASSERT_NE(cur_seen.rolling_hash, cf1_seen.rolling_hash);
|
|
915
|
+
// Different pointer space
|
|
916
|
+
ASSERT_TRUE(cur_seen.min > base_seen.max || cur_seen.max < base_seen.min);
|
|
917
|
+
// Sufficiently large hash coverage of the space
|
|
918
|
+
ASSERT_GT(cur_seen.max - cur_seen.min, min_span_bytes);
|
|
919
|
+
|
|
920
|
+
delete txn;
|
|
921
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
// ** Test dropping column family before committing, or even creating txn **
|
|
925
|
+
txn = txn_db->BeginTransaction(write_options, txn_options);
|
|
926
|
+
ASSERT_OK(txn->Delete(handles[1], "AAA"));
|
|
927
|
+
|
|
748
928
|
s = txn_db->DropColumnFamily(handles[1]);
|
|
749
929
|
ASSERT_OK(s);
|
|
750
930
|
s = txn_db->DropColumnFamily(handles[2]);
|
|
751
931
|
ASSERT_OK(s);
|
|
752
932
|
|
|
933
|
+
ASSERT_NOK(txn->Commit());
|
|
934
|
+
|
|
935
|
+
txn2 = txn_db->BeginTransaction(write_options, txn_options);
|
|
936
|
+
ASSERT_OK(txn2->Delete(handles[2], "AAA"));
|
|
937
|
+
ASSERT_NOK(txn2->Commit());
|
|
938
|
+
|
|
753
939
|
delete txn;
|
|
754
940
|
delete txn2;
|
|
755
941
|
|
|
@@ -1237,7 +1423,7 @@ TEST_P(OptimisticTransactionTest, UndoGetForUpdateTest) {
|
|
|
1237
1423
|
txn1->UndoGetForUpdate("A");
|
|
1238
1424
|
|
|
1239
1425
|
Transaction* txn2 = txn_db->BeginTransaction(write_options);
|
|
1240
|
-
txn2->Put("A", "x");
|
|
1426
|
+
ASSERT_OK(txn2->Put("A", "x"));
|
|
1241
1427
|
ASSERT_OK(txn2->Commit());
|
|
1242
1428
|
delete txn2;
|
|
1243
1429
|
|
|
@@ -1402,7 +1588,7 @@ TEST_P(OptimisticTransactionTest, OptimisticTransactionStressTest) {
|
|
|
1402
1588
|
|
|
1403
1589
|
std::function<void()> call_inserter = [&] {
|
|
1404
1590
|
ASSERT_OK(OptimisticTransactionStressTestInserter(
|
|
1405
|
-
txn_db, num_transactions_per_thread, num_sets, num_keys_per_set));
|
|
1591
|
+
txn_db.get(), num_transactions_per_thread, num_sets, num_keys_per_set));
|
|
1406
1592
|
};
|
|
1407
1593
|
|
|
1408
1594
|
// Create N threads that use RandomTransactionInserter to write
|
|
@@ -1417,7 +1603,7 @@ TEST_P(OptimisticTransactionTest, OptimisticTransactionStressTest) {
|
|
|
1417
1603
|
}
|
|
1418
1604
|
|
|
1419
1605
|
// Verify that data is consistent
|
|
1420
|
-
Status s = RandomTransactionInserter::Verify(txn_db, num_sets);
|
|
1606
|
+
Status s = RandomTransactionInserter::Verify(txn_db.get(), num_sets);
|
|
1421
1607
|
ASSERT_OK(s);
|
|
1422
1608
|
}
|
|
1423
1609
|
|
|
@@ -1469,6 +1655,19 @@ INSTANTIATE_TEST_CASE_P(
|
|
|
1469
1655
|
testing::Values(OccValidationPolicy::kValidateSerial,
|
|
1470
1656
|
OccValidationPolicy::kValidateParallel));
|
|
1471
1657
|
|
|
1658
|
+
TEST(OccLockBucketsTest, CacheAligned) {
|
|
1659
|
+
// Typical x86_64 is 40 byte mutex, 64 byte cache line
|
|
1660
|
+
if (sizeof(port::Mutex) >= sizeof(CacheAlignedWrapper<port::Mutex>)) {
|
|
1661
|
+
ROCKSDB_GTEST_BYPASS("Test requires mutex smaller than cache line");
|
|
1662
|
+
return;
|
|
1663
|
+
}
|
|
1664
|
+
auto buckets_unaligned = MakeSharedOccLockBuckets(100, false);
|
|
1665
|
+
auto buckets_aligned = MakeSharedOccLockBuckets(100, true);
|
|
1666
|
+
// Save at least one byte per bucket
|
|
1667
|
+
ASSERT_LE(buckets_unaligned->ApproximateMemoryUsage() + 100,
|
|
1668
|
+
buckets_aligned->ApproximateMemoryUsage());
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1472
1671
|
} // namespace ROCKSDB_NAMESPACE
|
|
1473
1672
|
|
|
1474
1673
|
int main(int argc, char** argv) {
|
|
@@ -1476,4 +1675,3 @@ int main(int argc, char** argv) {
|
|
|
1476
1675
|
::testing::InitGoogleTest(&argc, argv);
|
|
1477
1676
|
return RUN_ALL_TESTS();
|
|
1478
1677
|
}
|
|
1479
|
-
|
|
@@ -110,6 +110,8 @@ void TransactionBaseImpl::Reinitialize(DB* db,
|
|
|
110
110
|
start_time_ = dbimpl_->GetSystemClock()->NowMicros();
|
|
111
111
|
indexing_enabled_ = true;
|
|
112
112
|
cmp_ = GetColumnFamilyUserComparator(db_->DefaultColumnFamily());
|
|
113
|
+
WriteBatchInternal::SetDefaultColumnFamilyTimestampSize(
|
|
114
|
+
write_batch_.GetWriteBatch(), cmp_->timestamp_size());
|
|
113
115
|
WriteBatchInternal::UpdateProtectionInfo(
|
|
114
116
|
write_batch_.GetWriteBatch(), write_options_.protection_bytes_per_key)
|
|
115
117
|
.PermitUncheckedError();
|
|
@@ -232,27 +234,56 @@ Status TransactionBaseImpl::PopSavePoint() {
|
|
|
232
234
|
return write_batch_.PopSavePoint();
|
|
233
235
|
}
|
|
234
236
|
|
|
235
|
-
Status TransactionBaseImpl::Get(const ReadOptions&
|
|
237
|
+
Status TransactionBaseImpl::Get(const ReadOptions& _read_options,
|
|
236
238
|
ColumnFamilyHandle* column_family,
|
|
237
239
|
const Slice& key, std::string* value) {
|
|
238
|
-
if (
|
|
240
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
241
|
+
_read_options.io_activity != Env::IOActivity::kGet) {
|
|
239
242
|
return Status::InvalidArgument(
|
|
240
|
-
"
|
|
241
|
-
"`Env::IOActivity::kUnknown`");
|
|
243
|
+
"Can only call Get with `ReadOptions::io_activity` is "
|
|
244
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kGet`");
|
|
242
245
|
}
|
|
246
|
+
ReadOptions read_options(_read_options);
|
|
247
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
248
|
+
read_options.io_activity = Env::IOActivity::kGet;
|
|
249
|
+
}
|
|
250
|
+
auto s = GetImpl(read_options, column_family, key, value);
|
|
251
|
+
return s;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
Status TransactionBaseImpl::GetImpl(const ReadOptions& read_options,
|
|
255
|
+
ColumnFamilyHandle* column_family,
|
|
256
|
+
const Slice& key, std::string* value) {
|
|
243
257
|
assert(value != nullptr);
|
|
244
258
|
PinnableSlice pinnable_val(value);
|
|
245
259
|
assert(!pinnable_val.IsPinned());
|
|
246
|
-
auto s =
|
|
260
|
+
auto s = GetImpl(read_options, column_family, key, &pinnable_val);
|
|
247
261
|
if (s.ok() && pinnable_val.IsPinned()) {
|
|
248
262
|
value->assign(pinnable_val.data(), pinnable_val.size());
|
|
249
263
|
} // else value is already assigned
|
|
250
264
|
return s;
|
|
251
265
|
}
|
|
252
266
|
|
|
253
|
-
Status TransactionBaseImpl::Get(const ReadOptions&
|
|
267
|
+
Status TransactionBaseImpl::Get(const ReadOptions& _read_options,
|
|
254
268
|
ColumnFamilyHandle* column_family,
|
|
255
269
|
const Slice& key, PinnableSlice* pinnable_val) {
|
|
270
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
271
|
+
_read_options.io_activity != Env::IOActivity::kGet) {
|
|
272
|
+
return Status::InvalidArgument(
|
|
273
|
+
"Can only call Get with `ReadOptions::io_activity` is "
|
|
274
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kGet`");
|
|
275
|
+
}
|
|
276
|
+
ReadOptions read_options(_read_options);
|
|
277
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
278
|
+
read_options.io_activity = Env::IOActivity::kGet;
|
|
279
|
+
}
|
|
280
|
+
return GetImpl(read_options, column_family, key, pinnable_val);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
Status TransactionBaseImpl::GetImpl(const ReadOptions& read_options,
|
|
284
|
+
ColumnFamilyHandle* column_family,
|
|
285
|
+
const Slice& key,
|
|
286
|
+
PinnableSlice* pinnable_val) {
|
|
256
287
|
return write_batch_.GetFromBatchAndDB(db_, read_options, column_family, key,
|
|
257
288
|
pinnable_val);
|
|
258
289
|
}
|
|
@@ -279,7 +310,7 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
|
|
|
279
310
|
assert(value != nullptr);
|
|
280
311
|
PinnableSlice pinnable_val(value);
|
|
281
312
|
assert(!pinnable_val.IsPinned());
|
|
282
|
-
s =
|
|
313
|
+
s = GetImpl(read_options, column_family, key, &pinnable_val);
|
|
283
314
|
if (s.ok() && pinnable_val.IsPinned()) {
|
|
284
315
|
value->assign(pinnable_val.data(), pinnable_val.size());
|
|
285
316
|
} // else value is already assigned
|
|
@@ -307,39 +338,63 @@ Status TransactionBaseImpl::GetForUpdate(const ReadOptions& read_options,
|
|
|
307
338
|
TryLock(column_family, key, true /* read_only */, exclusive, do_validate);
|
|
308
339
|
|
|
309
340
|
if (s.ok() && pinnable_val != nullptr) {
|
|
310
|
-
s =
|
|
341
|
+
s = GetImpl(read_options, column_family, key, pinnable_val);
|
|
311
342
|
}
|
|
312
343
|
return s;
|
|
313
344
|
}
|
|
314
345
|
|
|
315
346
|
std::vector<Status> TransactionBaseImpl::MultiGet(
|
|
316
|
-
const ReadOptions&
|
|
347
|
+
const ReadOptions& _read_options,
|
|
317
348
|
const std::vector<ColumnFamilyHandle*>& column_family,
|
|
318
349
|
const std::vector<Slice>& keys, std::vector<std::string>* values) {
|
|
319
350
|
size_t num_keys = keys.size();
|
|
320
|
-
|
|
351
|
+
std::vector<Status> stat_list(num_keys);
|
|
352
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
353
|
+
_read_options.io_activity != Env::IOActivity::kMultiGet) {
|
|
321
354
|
Status s = Status::InvalidArgument(
|
|
322
|
-
"
|
|
323
|
-
"`Env::IOActivity::kUnknown`");
|
|
324
|
-
|
|
355
|
+
"Can only call MultiGet with `ReadOptions::io_activity` is "
|
|
356
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kMultiGet`");
|
|
357
|
+
|
|
358
|
+
for (size_t i = 0; i < num_keys; ++i) {
|
|
359
|
+
stat_list[i] = s;
|
|
360
|
+
}
|
|
361
|
+
return stat_list;
|
|
362
|
+
}
|
|
363
|
+
ReadOptions read_options(_read_options);
|
|
364
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
365
|
+
read_options.io_activity = Env::IOActivity::kMultiGet;
|
|
325
366
|
}
|
|
326
367
|
|
|
327
368
|
values->resize(num_keys);
|
|
328
|
-
|
|
329
|
-
std::vector<Status> stat_list(num_keys);
|
|
330
369
|
for (size_t i = 0; i < num_keys; ++i) {
|
|
331
|
-
stat_list[i] =
|
|
370
|
+
stat_list[i] =
|
|
371
|
+
GetImpl(read_options, column_family[i], keys[i], &(*values)[i]);
|
|
332
372
|
}
|
|
333
373
|
|
|
334
374
|
return stat_list;
|
|
335
375
|
}
|
|
336
376
|
|
|
337
|
-
void TransactionBaseImpl::MultiGet(const ReadOptions&
|
|
377
|
+
void TransactionBaseImpl::MultiGet(const ReadOptions& _read_options,
|
|
338
378
|
ColumnFamilyHandle* column_family,
|
|
339
379
|
const size_t num_keys, const Slice* keys,
|
|
340
380
|
PinnableSlice* values, Status* statuses,
|
|
341
381
|
const bool sorted_input) {
|
|
342
|
-
|
|
382
|
+
if (_read_options.io_activity != Env::IOActivity::kUnknown &&
|
|
383
|
+
_read_options.io_activity != Env::IOActivity::kMultiGet) {
|
|
384
|
+
Status s = Status::InvalidArgument(
|
|
385
|
+
"Can only call MultiGet with `ReadOptions::io_activity` is "
|
|
386
|
+
"`Env::IOActivity::kUnknown` or `Env::IOActivity::kMultiGet`");
|
|
387
|
+
for (size_t i = 0; i < num_keys; ++i) {
|
|
388
|
+
if (statuses[i].ok()) {
|
|
389
|
+
statuses[i] = s;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
ReadOptions read_options(_read_options);
|
|
395
|
+
if (read_options.io_activity == Env::IOActivity::kUnknown) {
|
|
396
|
+
read_options.io_activity = Env::IOActivity::kMultiGet;
|
|
397
|
+
}
|
|
343
398
|
write_batch_.MultiGetFromBatchAndDB(db_, read_options, column_family,
|
|
344
399
|
num_keys, keys, values, statuses,
|
|
345
400
|
sorted_input);
|
|
@@ -349,7 +404,6 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
|
|
|
349
404
|
const ReadOptions& read_options,
|
|
350
405
|
const std::vector<ColumnFamilyHandle*>& column_family,
|
|
351
406
|
const std::vector<Slice>& keys, std::vector<std::string>* values) {
|
|
352
|
-
// Regardless of whether the MultiGet succeeded, track these keys.
|
|
353
407
|
size_t num_keys = keys.size();
|
|
354
408
|
if (read_options.io_activity != Env::IOActivity::kUnknown) {
|
|
355
409
|
Status s = Status::InvalidArgument(
|
|
@@ -357,6 +411,7 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
|
|
|
357
411
|
"`Env::IOActivity::kUnknown`");
|
|
358
412
|
return std::vector<Status>(num_keys, s);
|
|
359
413
|
}
|
|
414
|
+
// Regardless of whether the MultiGet succeeded, track these keys.
|
|
360
415
|
values->resize(num_keys);
|
|
361
416
|
|
|
362
417
|
// Lock all keys
|
|
@@ -372,7 +427,8 @@ std::vector<Status> TransactionBaseImpl::MultiGetForUpdate(
|
|
|
372
427
|
// TODO(agiardullo): optimize multiget?
|
|
373
428
|
std::vector<Status> stat_list(num_keys);
|
|
374
429
|
for (size_t i = 0; i < num_keys; ++i) {
|
|
375
|
-
stat_list[i] =
|
|
430
|
+
stat_list[i] =
|
|
431
|
+
GetImpl(read_options, column_family[i], keys[i], &(*values)[i]);
|
|
376
432
|
}
|
|
377
433
|
|
|
378
434
|
return stat_list;
|
|
@@ -53,11 +53,13 @@ class TransactionBaseImpl : public Transaction {
|
|
|
53
53
|
Status PopSavePoint() override;
|
|
54
54
|
|
|
55
55
|
using Transaction::Get;
|
|
56
|
-
Status Get(const ReadOptions&
|
|
57
|
-
const Slice& key,
|
|
56
|
+
Status Get(const ReadOptions& _read_options,
|
|
57
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
58
|
+
std::string* value) override;
|
|
58
59
|
|
|
59
|
-
Status Get(const ReadOptions&
|
|
60
|
-
const Slice& key,
|
|
60
|
+
Status Get(const ReadOptions& _read_options,
|
|
61
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
62
|
+
PinnableSlice* value) override;
|
|
61
63
|
|
|
62
64
|
Status Get(const ReadOptions& options, const Slice& key,
|
|
63
65
|
std::string* value) override {
|
|
@@ -84,7 +86,7 @@ class TransactionBaseImpl : public Transaction {
|
|
|
84
86
|
|
|
85
87
|
using Transaction::MultiGet;
|
|
86
88
|
std::vector<Status> MultiGet(
|
|
87
|
-
const ReadOptions&
|
|
89
|
+
const ReadOptions& _read_options,
|
|
88
90
|
const std::vector<ColumnFamilyHandle*>& column_family,
|
|
89
91
|
const std::vector<Slice>& keys,
|
|
90
92
|
std::vector<std::string>* values) override;
|
|
@@ -98,9 +100,10 @@ class TransactionBaseImpl : public Transaction {
|
|
|
98
100
|
keys, values);
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
void MultiGet(const ReadOptions&
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
void MultiGet(const ReadOptions& _read_options,
|
|
104
|
+
ColumnFamilyHandle* column_family, const size_t num_keys,
|
|
105
|
+
const Slice* keys, PinnableSlice* values, Status* statuses,
|
|
106
|
+
const bool sorted_input = false) override;
|
|
104
107
|
|
|
105
108
|
using Transaction::MultiGetForUpdate;
|
|
106
109
|
std::vector<Status> MultiGetForUpdate(
|
|
@@ -260,6 +263,13 @@ class TransactionBaseImpl : public Transaction {
|
|
|
260
263
|
LockTracker& GetTrackedLocks() { return *tracked_locks_; }
|
|
261
264
|
|
|
262
265
|
protected:
|
|
266
|
+
Status GetImpl(const ReadOptions& options, ColumnFamilyHandle* column_family,
|
|
267
|
+
const Slice& key, std::string* value) override;
|
|
268
|
+
|
|
269
|
+
virtual Status GetImpl(const ReadOptions& options,
|
|
270
|
+
ColumnFamilyHandle* column_family, const Slice& key,
|
|
271
|
+
PinnableSlice* value) override;
|
|
272
|
+
|
|
263
273
|
// Add a key to the list of tracked keys.
|
|
264
274
|
//
|
|
265
275
|
// seqno is the earliest seqno this key was involved with this transaction.
|
|
@@ -379,4 +389,3 @@ class TransactionBaseImpl : public Transaction {
|
|
|
379
389
|
};
|
|
380
390
|
|
|
381
391
|
} // namespace ROCKSDB_NAMESPACE
|
|
382
|
-
|