@nxtedition/rocksdb 13.5.8 → 13.5.9
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/binding.cc +209 -2
- package/deps/rocksdb/rocksdb/BUCK +12 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
- package/deps/rocksdb/rocksdb/Makefile +28 -23
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
- package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
- package/deps/rocksdb/rocksdb/db/builder.h +5 -4
- package/deps/rocksdb/rocksdb/db/c.cc +556 -15
- package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
- package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
- package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
- package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
- package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
- package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
- package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
- package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
- package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
- package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
- package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
- package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
- package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
- package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
- package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
- package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
- package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
- package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
- package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
- package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
- package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
- package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
- package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
- package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
- package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
- package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
- package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
- package/deps/rocksdb/rocksdb/env/env.cc +32 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
- package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
- package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
- package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
- package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
- package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
- package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
- package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
- package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
- package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
- package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
- package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
- package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
- package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
- package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
- package/deps/rocksdb/rocksdb/options/options.cc +296 -305
- package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
- package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
- package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
- package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
- package/deps/rocksdb/rocksdb/port/lang.h +2 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
- package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
- package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
- package/deps/rocksdb/rocksdb/src.mk +17 -11
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
- package/deps/rocksdb/rocksdb/table/format.cc +62 -44
- package/deps/rocksdb/rocksdb/table/format.h +35 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
- package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
- package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
- package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
- package/deps/rocksdb/rocksdb/util/compression.h +348 -232
- package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
- package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
- package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
- package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
- package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
- package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
- package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
- package/deps/rocksdb/rocksdb.gyp +5 -0
- package/index.js +47 -2
- package/package.json +8 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
#include "rocksdb/options.h"
|
|
20
20
|
#include "rocksdb/perf_context.h"
|
|
21
21
|
#include "rocksdb/utilities/secondary_index.h"
|
|
22
|
+
#include "rocksdb/utilities/secondary_index_simple.h"
|
|
22
23
|
#include "rocksdb/utilities/transaction.h"
|
|
23
24
|
#include "rocksdb/utilities/transaction_db.h"
|
|
24
25
|
#include "table/mock_table.h"
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
#include "util/random.h"
|
|
30
31
|
#include "util/string_util.h"
|
|
31
32
|
#include "utilities/merge_operators.h"
|
|
32
|
-
#include "utilities/
|
|
33
|
+
#include "utilities/secondary_index/secondary_index_helper.h"
|
|
33
34
|
#include "utilities/transactions/pessimistic_transaction_db.h"
|
|
34
35
|
|
|
35
36
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -3911,16 +3912,16 @@ TEST_P(TransactionTest, LockLimitTest) {
|
|
|
3911
3912
|
|
|
3912
3913
|
// lock limit reached
|
|
3913
3914
|
s = txn->Put("W", "w");
|
|
3914
|
-
ASSERT_TRUE(s.
|
|
3915
|
+
ASSERT_TRUE(s.IsLockLimit());
|
|
3915
3916
|
|
|
3916
3917
|
// re-locking same key shouldn't put us over the limit
|
|
3917
3918
|
s = txn->Put("X", "xx");
|
|
3918
3919
|
ASSERT_OK(s);
|
|
3919
3920
|
|
|
3920
3921
|
s = txn->GetForUpdate(read_options, "W", &value);
|
|
3921
|
-
ASSERT_TRUE(s.
|
|
3922
|
+
ASSERT_TRUE(s.IsLockLimit());
|
|
3922
3923
|
s = txn->GetForUpdate(read_options, "V", &value);
|
|
3923
|
-
ASSERT_TRUE(s.
|
|
3924
|
+
ASSERT_TRUE(s.IsLockLimit());
|
|
3924
3925
|
|
|
3925
3926
|
// re-locking same key shouldn't put us over the limit
|
|
3926
3927
|
s = txn->GetForUpdate(read_options, "Y", &value);
|
|
@@ -3939,7 +3940,7 @@ TEST_P(TransactionTest, LockLimitTest) {
|
|
|
3939
3940
|
|
|
3940
3941
|
// lock limit reached
|
|
3941
3942
|
s = txn2->Put("M", "m");
|
|
3942
|
-
ASSERT_TRUE(s.
|
|
3943
|
+
ASSERT_TRUE(s.IsLockLimit());
|
|
3943
3944
|
|
|
3944
3945
|
s = txn->Commit();
|
|
3945
3946
|
ASSERT_OK(s);
|
|
@@ -3966,7 +3967,7 @@ TEST_P(TransactionTest, LockLimitTest) {
|
|
|
3966
3967
|
|
|
3967
3968
|
// lock limit reached
|
|
3968
3969
|
s = txn2->Delete("Y");
|
|
3969
|
-
ASSERT_TRUE(s.
|
|
3970
|
+
ASSERT_TRUE(s.IsLockLimit());
|
|
3970
3971
|
|
|
3971
3972
|
s = txn2->Commit();
|
|
3972
3973
|
ASSERT_OK(s);
|
|
@@ -3986,6 +3987,44 @@ TEST_P(TransactionTest, LockLimitTest) {
|
|
|
3986
3987
|
delete txn2;
|
|
3987
3988
|
}
|
|
3988
3989
|
|
|
3990
|
+
TEST_P(TransactionTest, LockLimitWithTimeoutHangTest) {
|
|
3991
|
+
// Tests a bug where transaction can infinite-loop during lock acquiry.
|
|
3992
|
+
// This happens when lock limit is reached and user specifies a positive
|
|
3993
|
+
// timeout which is reached before the transaction start waiting for it.
|
|
3994
|
+
WriteOptions write_options;
|
|
3995
|
+
TransactionOptions txn_options;
|
|
3996
|
+
|
|
3997
|
+
txn_db_options.max_num_locks = 3;
|
|
3998
|
+
txn_db_options.transaction_lock_timeout = 10; // 10ms
|
|
3999
|
+
ASSERT_OK(ReOpen());
|
|
4000
|
+
|
|
4001
|
+
Transaction* txn = db->BeginTransaction(write_options, txn_options);
|
|
4002
|
+
ASSERT_TRUE(txn);
|
|
4003
|
+
|
|
4004
|
+
ASSERT_OK(txn->Put("X", "x"));
|
|
4005
|
+
ASSERT_OK(txn->Put("Y", "y"));
|
|
4006
|
+
ASSERT_OK(txn->Put("Z", "z"));
|
|
4007
|
+
|
|
4008
|
+
TransactionOptions txn2_options;
|
|
4009
|
+
txn2_options.lock_timeout = 1; // 1ms short timeout
|
|
4010
|
+
Transaction* txn2 = db->BeginTransaction(write_options, txn2_options);
|
|
4011
|
+
|
|
4012
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
4013
|
+
"PointLockManager::AcquireWithTimeout:WaitingTxn", [&](void*) {
|
|
4014
|
+
// Sleep for 2ms, so timeout is already passed for txn2 before waiting.
|
|
4015
|
+
// txn2 should fail instead of waiting forever.
|
|
4016
|
+
env->SleepForMicroseconds(2 * 1000);
|
|
4017
|
+
});
|
|
4018
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
4019
|
+
|
|
4020
|
+
// This lock attempt should fail and return
|
|
4021
|
+
ASSERT_TRUE(txn2->Put("W", "w").IsLockLimit());
|
|
4022
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
4023
|
+
|
|
4024
|
+
delete txn;
|
|
4025
|
+
delete txn2;
|
|
4026
|
+
}
|
|
4027
|
+
|
|
3989
4028
|
TEST_P(TransactionTest, IteratorTest) {
|
|
3990
4029
|
// This test does writes without snapshot validation, and then tries to create
|
|
3991
4030
|
// iterator later, which is unsupported in write unprepared.
|
|
@@ -5651,13 +5690,13 @@ TEST_P(TransactionTest, ToggleAutoCompactionTest) {
|
|
|
5651
5690
|
ASSERT_OK(s);
|
|
5652
5691
|
|
|
5653
5692
|
auto cfh_default = static_cast_with_check<ColumnFamilyHandleImpl>(handles[0]);
|
|
5654
|
-
auto opt_default =
|
|
5693
|
+
auto& opt_default = cfh_default->cfd()->GetLatestMutableCFOptions();
|
|
5655
5694
|
|
|
5656
5695
|
auto cfh_a = static_cast_with_check<ColumnFamilyHandleImpl>(handles[1]);
|
|
5657
|
-
auto opt_a =
|
|
5696
|
+
auto& opt_a = cfh_a->cfd()->GetLatestMutableCFOptions();
|
|
5658
5697
|
|
|
5659
5698
|
auto cfh_b = static_cast_with_check<ColumnFamilyHandleImpl>(handles[2]);
|
|
5660
|
-
auto opt_b =
|
|
5699
|
+
auto& opt_b = cfh_b->cfd()->GetLatestMutableCFOptions();
|
|
5661
5700
|
|
|
5662
5701
|
ASSERT_EQ(opt_default.disable_auto_compactions, false);
|
|
5663
5702
|
ASSERT_EQ(opt_a.disable_auto_compactions, true);
|
|
@@ -6291,8 +6330,8 @@ TEST_P(TransactionTest, DuplicateKeys) {
|
|
|
6291
6330
|
}
|
|
6292
6331
|
delete cf_handle;
|
|
6293
6332
|
} // with_commit_batch
|
|
6294
|
-
}
|
|
6295
|
-
}
|
|
6333
|
+
} // do_rollback
|
|
6334
|
+
} // do_prepare
|
|
6296
6335
|
|
|
6297
6336
|
if (!options.unordered_write) {
|
|
6298
6337
|
// Also test with max_successive_merges > 0. max_successive_merges will not
|
|
@@ -8008,7 +8047,270 @@ TEST_P(TransactionTest, AttributeGroupIteratorSanityChecks) {
|
|
|
8008
8047
|
}
|
|
8009
8048
|
}
|
|
8010
8049
|
|
|
8011
|
-
TEST_P(TransactionTest,
|
|
8050
|
+
TEST_P(TransactionTest, SecondaryIndexPutDelete) {
|
|
8051
|
+
const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
|
|
8052
|
+
if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
|
|
8053
|
+
ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
|
|
8054
|
+
return;
|
|
8055
|
+
}
|
|
8056
|
+
|
|
8057
|
+
txn_db_options.secondary_indices.emplace_back(
|
|
8058
|
+
std::make_shared<SimpleSecondaryIndex>(
|
|
8059
|
+
kDefaultWideColumnName.ToString()));
|
|
8060
|
+
|
|
8061
|
+
ASSERT_OK(ReOpen());
|
|
8062
|
+
|
|
8063
|
+
ColumnFamilyOptions cf1_opts;
|
|
8064
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
8065
|
+
ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
8066
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
8067
|
+
|
|
8068
|
+
ColumnFamilyOptions cf2_opts;
|
|
8069
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
8070
|
+
ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
8071
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
8072
|
+
|
|
8073
|
+
auto& index = txn_db_options.secondary_indices.back();
|
|
8074
|
+
index->SetPrimaryColumnFamily(cfh1);
|
|
8075
|
+
index->SetSecondaryColumnFamily(cfh2);
|
|
8076
|
+
|
|
8077
|
+
{
|
|
8078
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
8079
|
+
|
|
8080
|
+
// Default CF => OK but not indexed
|
|
8081
|
+
ASSERT_OK(txn->Put(db->DefaultColumnFamily(), "key0", "foo"));
|
|
8082
|
+
|
|
8083
|
+
// CF1 but no default column => OK but not indexed
|
|
8084
|
+
ASSERT_OK(txn->PutEntity(cfh1, "key1", {{"hello", "world"}}));
|
|
8085
|
+
|
|
8086
|
+
// CF1, "bar" in the default column => OK and indexed
|
|
8087
|
+
ASSERT_OK(txn->Put(cfh1, "key2", "bar"));
|
|
8088
|
+
|
|
8089
|
+
// CF1, "baz" in the default column => OK and indexed
|
|
8090
|
+
ASSERT_OK(txn->Put(cfh1, "key3", "baz"));
|
|
8091
|
+
|
|
8092
|
+
ASSERT_OK(txn->Commit());
|
|
8093
|
+
}
|
|
8094
|
+
|
|
8095
|
+
// Expected keys: "key0" in the default CF; "key1", "key2", "key3" in CF1;
|
|
8096
|
+
// secondary index entries for "key2" and "key3" in CF2
|
|
8097
|
+
{
|
|
8098
|
+
std::unique_ptr<Iterator> it(
|
|
8099
|
+
db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
|
|
8100
|
+
|
|
8101
|
+
it->SeekToFirst();
|
|
8102
|
+
ASSERT_TRUE(it->Valid());
|
|
8103
|
+
ASSERT_EQ(it->key(), "key0");
|
|
8104
|
+
ASSERT_EQ(it->value(), "foo");
|
|
8105
|
+
|
|
8106
|
+
it->Next();
|
|
8107
|
+
ASSERT_FALSE(it->Valid());
|
|
8108
|
+
ASSERT_OK(it->status());
|
|
8109
|
+
}
|
|
8110
|
+
|
|
8111
|
+
{
|
|
8112
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
|
|
8113
|
+
|
|
8114
|
+
it->SeekToFirst();
|
|
8115
|
+
ASSERT_TRUE(it->Valid());
|
|
8116
|
+
ASSERT_EQ(it->key(), "key1");
|
|
8117
|
+
WideColumns expected1{{"hello", "world"}};
|
|
8118
|
+
ASSERT_EQ(it->columns(), expected1);
|
|
8119
|
+
|
|
8120
|
+
it->Next();
|
|
8121
|
+
ASSERT_TRUE(it->Valid());
|
|
8122
|
+
ASSERT_EQ(it->key(), "key2");
|
|
8123
|
+
ASSERT_EQ(it->value(), "bar");
|
|
8124
|
+
|
|
8125
|
+
it->Next();
|
|
8126
|
+
ASSERT_TRUE(it->Valid());
|
|
8127
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8128
|
+
ASSERT_EQ(it->value(), "baz");
|
|
8129
|
+
|
|
8130
|
+
it->Next();
|
|
8131
|
+
ASSERT_FALSE(it->Valid());
|
|
8132
|
+
ASSERT_OK(it->status());
|
|
8133
|
+
}
|
|
8134
|
+
|
|
8135
|
+
{
|
|
8136
|
+
// Read the raw secondary index entries from CF2
|
|
8137
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
8138
|
+
|
|
8139
|
+
it->SeekToFirst();
|
|
8140
|
+
ASSERT_TRUE(it->Valid());
|
|
8141
|
+
ASSERT_EQ(it->key(), "\3barkey2");
|
|
8142
|
+
ASSERT_TRUE(it->value().empty());
|
|
8143
|
+
|
|
8144
|
+
it->Next();
|
|
8145
|
+
ASSERT_TRUE(it->Valid());
|
|
8146
|
+
ASSERT_EQ(it->key(), "\3bazkey3");
|
|
8147
|
+
ASSERT_TRUE(it->value().empty());
|
|
8148
|
+
|
|
8149
|
+
it->Next();
|
|
8150
|
+
ASSERT_FALSE(it->Valid());
|
|
8151
|
+
ASSERT_OK(it->status());
|
|
8152
|
+
}
|
|
8153
|
+
|
|
8154
|
+
{
|
|
8155
|
+
// Query the secondary index
|
|
8156
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
8157
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
8158
|
+
auto it = std::make_unique<SecondaryIndexIterator>(
|
|
8159
|
+
index.get(), std::move(underlying_it));
|
|
8160
|
+
|
|
8161
|
+
it->Seek("bar");
|
|
8162
|
+
ASSERT_TRUE(it->Valid());
|
|
8163
|
+
ASSERT_OK(it->status());
|
|
8164
|
+
ASSERT_EQ(it->key(), "key2");
|
|
8165
|
+
ASSERT_TRUE(it->value().empty());
|
|
8166
|
+
|
|
8167
|
+
it->Next();
|
|
8168
|
+
ASSERT_FALSE(it->Valid());
|
|
8169
|
+
ASSERT_OK(it->status());
|
|
8170
|
+
|
|
8171
|
+
it->Seek("baz");
|
|
8172
|
+
ASSERT_TRUE(it->Valid());
|
|
8173
|
+
ASSERT_OK(it->status());
|
|
8174
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8175
|
+
ASSERT_TRUE(it->value().empty());
|
|
8176
|
+
|
|
8177
|
+
it->Next();
|
|
8178
|
+
ASSERT_FALSE(it->Valid());
|
|
8179
|
+
ASSERT_OK(it->status());
|
|
8180
|
+
}
|
|
8181
|
+
|
|
8182
|
+
// Make some updates to the key-values indexed above through the database
|
|
8183
|
+
// interface (i.e. using implicit transactions)
|
|
8184
|
+
|
|
8185
|
+
// Add a default column to "key1" which previously had none
|
|
8186
|
+
ASSERT_OK(
|
|
8187
|
+
db->PutEntity(WriteOptions(), cfh1, "key1",
|
|
8188
|
+
{{"hello", "world"}, {kDefaultWideColumnName, "quux"}}));
|
|
8189
|
+
|
|
8190
|
+
// Change the value of the default column in "key2"
|
|
8191
|
+
ASSERT_OK(db->Put(WriteOptions(), cfh1, "key2", "quux"));
|
|
8192
|
+
|
|
8193
|
+
// Remove the default column from "key3"
|
|
8194
|
+
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3", {{"1", "2"}}));
|
|
8195
|
+
|
|
8196
|
+
// Expected keys: "key0" in the default CF; "key1", "key2", "key3" in CF1;
|
|
8197
|
+
// secondary index entries for "key1" and "key2" in CF2
|
|
8198
|
+
{
|
|
8199
|
+
std::unique_ptr<Iterator> it(
|
|
8200
|
+
db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
|
|
8201
|
+
|
|
8202
|
+
it->SeekToFirst();
|
|
8203
|
+
ASSERT_TRUE(it->Valid());
|
|
8204
|
+
ASSERT_EQ(it->key(), "key0");
|
|
8205
|
+
ASSERT_EQ(it->value(), "foo");
|
|
8206
|
+
|
|
8207
|
+
it->Next();
|
|
8208
|
+
ASSERT_FALSE(it->Valid());
|
|
8209
|
+
ASSERT_OK(it->status());
|
|
8210
|
+
}
|
|
8211
|
+
|
|
8212
|
+
{
|
|
8213
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
|
|
8214
|
+
|
|
8215
|
+
it->SeekToFirst();
|
|
8216
|
+
ASSERT_TRUE(it->Valid());
|
|
8217
|
+
ASSERT_EQ(it->key(), "key1");
|
|
8218
|
+
WideColumns expected1{{kDefaultWideColumnName, "quux"}, {"hello", "world"}};
|
|
8219
|
+
ASSERT_EQ(it->columns(), expected1);
|
|
8220
|
+
|
|
8221
|
+
it->Next();
|
|
8222
|
+
ASSERT_TRUE(it->Valid());
|
|
8223
|
+
ASSERT_EQ(it->key(), "key2");
|
|
8224
|
+
ASSERT_EQ(it->value(), "quux");
|
|
8225
|
+
|
|
8226
|
+
it->Next();
|
|
8227
|
+
ASSERT_TRUE(it->Valid());
|
|
8228
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8229
|
+
WideColumns expected3{{"1", "2"}};
|
|
8230
|
+
ASSERT_EQ(it->columns(), expected3);
|
|
8231
|
+
|
|
8232
|
+
it->Next();
|
|
8233
|
+
ASSERT_FALSE(it->Valid());
|
|
8234
|
+
ASSERT_OK(it->status());
|
|
8235
|
+
}
|
|
8236
|
+
|
|
8237
|
+
{
|
|
8238
|
+
// Read the raw secondary index entries from CF2
|
|
8239
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
8240
|
+
|
|
8241
|
+
it->SeekToFirst();
|
|
8242
|
+
ASSERT_TRUE(it->Valid());
|
|
8243
|
+
ASSERT_EQ(it->key(), "\4quuxkey1");
|
|
8244
|
+
ASSERT_TRUE(it->value().empty());
|
|
8245
|
+
|
|
8246
|
+
it->Next();
|
|
8247
|
+
ASSERT_TRUE(it->Valid());
|
|
8248
|
+
ASSERT_EQ(it->key(), "\4quuxkey2");
|
|
8249
|
+
ASSERT_TRUE(it->value().empty());
|
|
8250
|
+
|
|
8251
|
+
it->Next();
|
|
8252
|
+
ASSERT_FALSE(it->Valid());
|
|
8253
|
+
ASSERT_OK(it->status());
|
|
8254
|
+
}
|
|
8255
|
+
|
|
8256
|
+
{
|
|
8257
|
+
// Query the secondary index
|
|
8258
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
8259
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
8260
|
+
auto it = std::make_unique<SecondaryIndexIterator>(
|
|
8261
|
+
index.get(), std::move(underlying_it));
|
|
8262
|
+
|
|
8263
|
+
it->Seek("quux");
|
|
8264
|
+
ASSERT_TRUE(it->Valid());
|
|
8265
|
+
ASSERT_OK(it->status());
|
|
8266
|
+
ASSERT_EQ(it->key(), "key1");
|
|
8267
|
+
ASSERT_TRUE(it->value().empty());
|
|
8268
|
+
|
|
8269
|
+
it->Next();
|
|
8270
|
+
ASSERT_TRUE(it->Valid());
|
|
8271
|
+
ASSERT_OK(it->status());
|
|
8272
|
+
ASSERT_EQ(it->key(), "key2");
|
|
8273
|
+
ASSERT_TRUE(it->value().empty());
|
|
8274
|
+
|
|
8275
|
+
it->Next();
|
|
8276
|
+
ASSERT_FALSE(it->Valid());
|
|
8277
|
+
ASSERT_OK(it->status());
|
|
8278
|
+
}
|
|
8279
|
+
|
|
8280
|
+
// Delete/SingleDelete "key1" and "key3" via an explicit transaction and
|
|
8281
|
+
// "key2" and a non-existing "key4" via the DB interface (i.e. an implicit
|
|
8282
|
+
// transaction)
|
|
8283
|
+
{
|
|
8284
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
8285
|
+
|
|
8286
|
+
ASSERT_OK(txn->Delete(cfh1, "key1"));
|
|
8287
|
+
ASSERT_OK(txn->SingleDelete(cfh1, "key3"));
|
|
8288
|
+
|
|
8289
|
+
ASSERT_OK(txn->Commit());
|
|
8290
|
+
}
|
|
8291
|
+
|
|
8292
|
+
ASSERT_OK(db->SingleDelete(WriteOptions(), cfh1, "key2"));
|
|
8293
|
+
ASSERT_OK(db->Delete(WriteOptions(), cfh1, "key4"));
|
|
8294
|
+
|
|
8295
|
+
// cfh1 and cfh2 are expected to be empty
|
|
8296
|
+
{
|
|
8297
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh1));
|
|
8298
|
+
|
|
8299
|
+
it->SeekToFirst();
|
|
8300
|
+
ASSERT_FALSE(it->Valid());
|
|
8301
|
+
ASSERT_OK(it->status());
|
|
8302
|
+
}
|
|
8303
|
+
|
|
8304
|
+
{
|
|
8305
|
+
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
8306
|
+
|
|
8307
|
+
it->SeekToFirst();
|
|
8308
|
+
ASSERT_FALSE(it->Valid());
|
|
8309
|
+
ASSERT_OK(it->status());
|
|
8310
|
+
}
|
|
8311
|
+
}
|
|
8312
|
+
|
|
8313
|
+
TEST_P(TransactionTest, SecondaryIndexPutEntity) {
|
|
8012
8314
|
const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
|
|
8013
8315
|
if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
|
|
8014
8316
|
ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
|
|
@@ -8068,6 +8370,15 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8068
8370
|
return Status::OK();
|
|
8069
8371
|
}
|
|
8070
8372
|
|
|
8373
|
+
Status FinalizeSecondaryKeyPrefix(
|
|
8374
|
+
std::variant<Slice, std::string>* secondary_key_prefix) const override {
|
|
8375
|
+
if (SecondaryIndexHelper::AsSlice(*secondary_key_prefix) == "!") {
|
|
8376
|
+
return Status::Corruption();
|
|
8377
|
+
}
|
|
8378
|
+
|
|
8379
|
+
return Status::OK();
|
|
8380
|
+
}
|
|
8381
|
+
|
|
8071
8382
|
Status GetSecondaryValue(const Slice& /* primary_key */,
|
|
8072
8383
|
const Slice& primary_column_value,
|
|
8073
8384
|
const Slice& previous_column_value,
|
|
@@ -8131,9 +8442,12 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8131
8442
|
// CF1, empty value in the "foo" column => GetSecondaryKeyPrefix errors out
|
|
8132
8443
|
ASSERT_TRUE(txn->PutEntity(cfh1, "key5", {{"foo", ""}}).IsNotFound());
|
|
8133
8444
|
|
|
8445
|
+
// CF1, "!!!" in the "foo" column => FinalizeSecondaryKeyPrefix errors out
|
|
8446
|
+
ASSERT_TRUE(txn->PutEntity(cfh1, "key6", {{"foo", "!!!"}}).IsCorruption());
|
|
8447
|
+
|
|
8134
8448
|
// CF1, "corge" in the "foo" column => GetSecondaryValue errors out
|
|
8135
8449
|
ASSERT_TRUE(
|
|
8136
|
-
txn->PutEntity(cfh1, "
|
|
8450
|
+
txn->PutEntity(cfh1, "key7", {{"foo", "corge"}}).IsNotSupported());
|
|
8137
8451
|
|
|
8138
8452
|
ASSERT_OK(txn->Commit());
|
|
8139
8453
|
}
|
|
@@ -8182,6 +8496,7 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8182
8496
|
}
|
|
8183
8497
|
|
|
8184
8498
|
{
|
|
8499
|
+
// Read the raw secondary index entries from CF2
|
|
8185
8500
|
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
8186
8501
|
|
|
8187
8502
|
it->SeekToFirst();
|
|
@@ -8199,34 +8514,74 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8199
8514
|
ASSERT_OK(it->status());
|
|
8200
8515
|
}
|
|
8201
8516
|
|
|
8202
|
-
// Make some updates to the key-values indexed above through the database
|
|
8203
|
-
// interface (i.e. using implicit transactions)
|
|
8204
|
-
|
|
8205
|
-
// Add a "foo" column to "key1" which previously had none
|
|
8206
|
-
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key1",
|
|
8207
|
-
{{"hello", "world"}, {"foo", "grault"}}));
|
|
8208
|
-
|
|
8209
|
-
// Change the value of the "foo" column in "key3"
|
|
8210
|
-
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3",
|
|
8211
|
-
{{"foo", "garply"}, {"x", "y"}}));
|
|
8212
|
-
|
|
8213
|
-
// Remove the "foo" column from "key4"
|
|
8214
|
-
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key4", {{"1", "2"}}));
|
|
8215
|
-
|
|
8216
|
-
// Expected keys: "key0" in the default CF; "key1", "key3", "key4" in CF1;
|
|
8217
|
-
// secondary index entries for "key1" and "key3" in CF2
|
|
8218
8517
|
{
|
|
8219
|
-
|
|
8220
|
-
|
|
8518
|
+
// Query the secondary index
|
|
8519
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
8520
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
8521
|
+
auto it = std::make_unique<SecondaryIndexIterator>(
|
|
8522
|
+
index.get(), std::move(underlying_it));
|
|
8221
8523
|
|
|
8222
|
-
it->
|
|
8524
|
+
it->Seek("x");
|
|
8223
8525
|
ASSERT_TRUE(it->Valid());
|
|
8224
|
-
|
|
8225
|
-
|
|
8226
|
-
ASSERT_EQ(it->
|
|
8526
|
+
ASSERT_OK(it->status());
|
|
8527
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8528
|
+
ASSERT_EQ(it->value(), "zab");
|
|
8227
8529
|
|
|
8228
8530
|
it->Next();
|
|
8229
|
-
|
|
8531
|
+
ASSERT_TRUE(it->Valid());
|
|
8532
|
+
ASSERT_OK(it->status());
|
|
8533
|
+
ASSERT_EQ(it->key(), "key4");
|
|
8534
|
+
ASSERT_EQ(it->value(), "xuuq");
|
|
8535
|
+
|
|
8536
|
+
it->Prev();
|
|
8537
|
+
ASSERT_TRUE(it->Valid());
|
|
8538
|
+
ASSERT_OK(it->status());
|
|
8539
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8540
|
+
ASSERT_EQ(it->value(), "zab");
|
|
8541
|
+
|
|
8542
|
+
it->Next();
|
|
8543
|
+
ASSERT_TRUE(it->Valid());
|
|
8544
|
+
ASSERT_OK(it->status());
|
|
8545
|
+
ASSERT_EQ(it->key(), "key4");
|
|
8546
|
+
ASSERT_EQ(it->value(), "xuuq");
|
|
8547
|
+
|
|
8548
|
+
it->Next();
|
|
8549
|
+
ASSERT_FALSE(it->Valid());
|
|
8550
|
+
ASSERT_OK(it->status());
|
|
8551
|
+
|
|
8552
|
+
it->Seek("y");
|
|
8553
|
+
ASSERT_FALSE(it->Valid());
|
|
8554
|
+
ASSERT_OK(it->status());
|
|
8555
|
+
}
|
|
8556
|
+
|
|
8557
|
+
// Make some updates to the key-values indexed above through the database
|
|
8558
|
+
// interface (i.e. using implicit transactions)
|
|
8559
|
+
|
|
8560
|
+
// Add a "foo" column to "key1" which previously had none
|
|
8561
|
+
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key1",
|
|
8562
|
+
{{"hello", "world"}, {"foo", "grault"}}));
|
|
8563
|
+
|
|
8564
|
+
// Change the value of the "foo" column in "key3"
|
|
8565
|
+
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key3",
|
|
8566
|
+
{{"foo", "garply"}, {"x", "y"}}));
|
|
8567
|
+
|
|
8568
|
+
// Remove the "foo" column from "key4"
|
|
8569
|
+
ASSERT_OK(db->PutEntity(WriteOptions(), cfh1, "key4", {{"1", "2"}}));
|
|
8570
|
+
|
|
8571
|
+
// Expected keys: "key0" in the default CF; "key1", "key3", "key4" in CF1;
|
|
8572
|
+
// secondary index entries for "key1" and "key3" in CF2
|
|
8573
|
+
{
|
|
8574
|
+
std::unique_ptr<Iterator> it(
|
|
8575
|
+
db->NewIterator(ReadOptions(), db->DefaultColumnFamily()));
|
|
8576
|
+
|
|
8577
|
+
it->SeekToFirst();
|
|
8578
|
+
ASSERT_TRUE(it->Valid());
|
|
8579
|
+
ASSERT_EQ(it->key(), "key0");
|
|
8580
|
+
WideColumns expected0{{"a", "b"}, {"foo", "c"}};
|
|
8581
|
+
ASSERT_EQ(it->columns(), expected0);
|
|
8582
|
+
|
|
8583
|
+
it->Next();
|
|
8584
|
+
ASSERT_FALSE(it->Valid());
|
|
8230
8585
|
ASSERT_OK(it->status());
|
|
8231
8586
|
}
|
|
8232
8587
|
|
|
@@ -8257,6 +8612,7 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8257
8612
|
}
|
|
8258
8613
|
|
|
8259
8614
|
{
|
|
8615
|
+
// Read the raw secondary index entries from CF2
|
|
8260
8616
|
std::unique_ptr<Iterator> it(db->NewIterator(ReadOptions(), cfh2));
|
|
8261
8617
|
|
|
8262
8618
|
it->SeekToFirst();
|
|
@@ -8273,6 +8629,227 @@ TEST_P(TransactionTest, SecondaryIndex) {
|
|
|
8273
8629
|
ASSERT_FALSE(it->Valid());
|
|
8274
8630
|
ASSERT_OK(it->status());
|
|
8275
8631
|
}
|
|
8632
|
+
|
|
8633
|
+
{
|
|
8634
|
+
// Query the secondary index
|
|
8635
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
8636
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
8637
|
+
auto it = std::make_unique<SecondaryIndexIterator>(
|
|
8638
|
+
index.get(), std::move(underlying_it));
|
|
8639
|
+
|
|
8640
|
+
it->Seek("t");
|
|
8641
|
+
ASSERT_TRUE(it->Valid());
|
|
8642
|
+
ASSERT_OK(it->status());
|
|
8643
|
+
ASSERT_EQ(it->key(), "key1");
|
|
8644
|
+
ASSERT_EQ(it->value(), "tluarg");
|
|
8645
|
+
|
|
8646
|
+
it->Next();
|
|
8647
|
+
ASSERT_FALSE(it->Valid());
|
|
8648
|
+
ASSERT_OK(it->status());
|
|
8649
|
+
|
|
8650
|
+
it->Seek("y");
|
|
8651
|
+
ASSERT_TRUE(it->Valid());
|
|
8652
|
+
ASSERT_OK(it->status());
|
|
8653
|
+
ASSERT_EQ(it->key(), "key3");
|
|
8654
|
+
ASSERT_EQ(it->value(), "ylprag");
|
|
8655
|
+
|
|
8656
|
+
it->Next();
|
|
8657
|
+
ASSERT_FALSE(it->Valid());
|
|
8658
|
+
ASSERT_OK(it->status());
|
|
8659
|
+
}
|
|
8660
|
+
}
|
|
8661
|
+
|
|
8662
|
+
TEST_P(TransactionTest, SecondaryIndexOnKey) {
|
|
8663
|
+
const TxnDBWritePolicy write_policy = std::get<2>(GetParam());
|
|
8664
|
+
if (write_policy != TxnDBWritePolicy::WRITE_COMMITTED) {
|
|
8665
|
+
ROCKSDB_GTEST_BYPASS("Test only WriteCommitted for now");
|
|
8666
|
+
return;
|
|
8667
|
+
}
|
|
8668
|
+
|
|
8669
|
+
// A secondary index that removes the first three characters of the primary
|
|
8670
|
+
// key and indexes the rest.
|
|
8671
|
+
class KeySecondaryIndex : public SecondaryIndex {
|
|
8672
|
+
public:
|
|
8673
|
+
void SetPrimaryColumnFamily(ColumnFamilyHandle* cfh) override {
|
|
8674
|
+
primary_cfh_ = cfh;
|
|
8675
|
+
}
|
|
8676
|
+
|
|
8677
|
+
void SetSecondaryColumnFamily(ColumnFamilyHandle* cfh) override {
|
|
8678
|
+
secondary_cfh_ = cfh;
|
|
8679
|
+
}
|
|
8680
|
+
|
|
8681
|
+
ColumnFamilyHandle* GetPrimaryColumnFamily() const override {
|
|
8682
|
+
return primary_cfh_;
|
|
8683
|
+
}
|
|
8684
|
+
|
|
8685
|
+
ColumnFamilyHandle* GetSecondaryColumnFamily() const override {
|
|
8686
|
+
return secondary_cfh_;
|
|
8687
|
+
}
|
|
8688
|
+
|
|
8689
|
+
Slice GetPrimaryColumnName() const override {
|
|
8690
|
+
return kDefaultWideColumnName;
|
|
8691
|
+
}
|
|
8692
|
+
|
|
8693
|
+
Status UpdatePrimaryColumnValue(
|
|
8694
|
+
const Slice& /* primary_key */, const Slice& /* primary_column_value */,
|
|
8695
|
+
std::optional<
|
|
8696
|
+
std::variant<Slice, std::string>>* /* updated_column_value */)
|
|
8697
|
+
const override {
|
|
8698
|
+
return Status::OK();
|
|
8699
|
+
}
|
|
8700
|
+
|
|
8701
|
+
Status GetSecondaryKeyPrefix(
|
|
8702
|
+
const Slice& primary_key, const Slice& /* primary_column_value */,
|
|
8703
|
+
std::variant<Slice, std::string>* secondary_key_prefix) const override {
|
|
8704
|
+
assert(secondary_key_prefix);
|
|
8705
|
+
|
|
8706
|
+
constexpr size_t prefix_len = 3;
|
|
8707
|
+
|
|
8708
|
+
if (primary_key.size() < prefix_len) {
|
|
8709
|
+
return Status::InvalidArgument();
|
|
8710
|
+
}
|
|
8711
|
+
|
|
8712
|
+
Slice transformed_key = primary_key;
|
|
8713
|
+
transformed_key.remove_prefix(prefix_len);
|
|
8714
|
+
|
|
8715
|
+
*secondary_key_prefix = transformed_key;
|
|
8716
|
+
|
|
8717
|
+
return Status::OK();
|
|
8718
|
+
}
|
|
8719
|
+
|
|
8720
|
+
Status FinalizeSecondaryKeyPrefix(
|
|
8721
|
+
std::variant<Slice, std::string>* /* secondary_key_prefix */)
|
|
8722
|
+
const override {
|
|
8723
|
+
return Status::OK();
|
|
8724
|
+
}
|
|
8725
|
+
|
|
8726
|
+
Status GetSecondaryValue(const Slice& primary_key,
|
|
8727
|
+
const Slice& /* primary_column_value */,
|
|
8728
|
+
const Slice& /* previous_column_value */,
|
|
8729
|
+
std::optional<std::variant<Slice, std::string>>*
|
|
8730
|
+
secondary_value) const override {
|
|
8731
|
+
assert(secondary_value);
|
|
8732
|
+
|
|
8733
|
+
std::string index_value = primary_key.ToString();
|
|
8734
|
+
std::reverse(index_value.begin(), index_value.end());
|
|
8735
|
+
|
|
8736
|
+
*secondary_value = std::move(index_value);
|
|
8737
|
+
|
|
8738
|
+
return Status::OK();
|
|
8739
|
+
}
|
|
8740
|
+
|
|
8741
|
+
private:
|
|
8742
|
+
ColumnFamilyHandle* primary_cfh_{};
|
|
8743
|
+
ColumnFamilyHandle* secondary_cfh_{};
|
|
8744
|
+
};
|
|
8745
|
+
|
|
8746
|
+
txn_db_options.secondary_indices.emplace_back(
|
|
8747
|
+
std::make_shared<KeySecondaryIndex>());
|
|
8748
|
+
|
|
8749
|
+
ASSERT_OK(ReOpen());
|
|
8750
|
+
|
|
8751
|
+
ColumnFamilyOptions cf1_opts;
|
|
8752
|
+
ColumnFamilyHandle* cfh1 = nullptr;
|
|
8753
|
+
ASSERT_OK(db->CreateColumnFamily(cf1_opts, "cf1", &cfh1));
|
|
8754
|
+
std::unique_ptr<ColumnFamilyHandle> cfh1_guard(cfh1);
|
|
8755
|
+
|
|
8756
|
+
ColumnFamilyOptions cf2_opts;
|
|
8757
|
+
ColumnFamilyHandle* cfh2 = nullptr;
|
|
8758
|
+
ASSERT_OK(db->CreateColumnFamily(cf2_opts, "cf2", &cfh2));
|
|
8759
|
+
std::unique_ptr<ColumnFamilyHandle> cfh2_guard(cfh2);
|
|
8760
|
+
|
|
8761
|
+
auto& index = txn_db_options.secondary_indices.back();
|
|
8762
|
+
index->SetPrimaryColumnFamily(cfh1);
|
|
8763
|
+
index->SetSecondaryColumnFamily(cfh2);
|
|
8764
|
+
|
|
8765
|
+
{
|
|
8766
|
+
std::unique_ptr<Transaction> txn(db->BeginTransaction(WriteOptions()));
|
|
8767
|
+
|
|
8768
|
+
ASSERT_OK(txn->Put(cfh1, "123foo", "a"));
|
|
8769
|
+
ASSERT_OK(txn->Put(cfh1, "123bar", "b"));
|
|
8770
|
+
ASSERT_OK(txn->Put(cfh1, "123baz", "c"));
|
|
8771
|
+
ASSERT_OK(txn->Put(cfh1, "456foo", "d"));
|
|
8772
|
+
ASSERT_OK(txn->Put(cfh1, "456bar", "e"));
|
|
8773
|
+
ASSERT_OK(txn->Put(cfh1, "456baz", "f"));
|
|
8774
|
+
ASSERT_OK(txn->Put(cfh1, "789foo", "g"));
|
|
8775
|
+
ASSERT_OK(txn->Put(cfh1, "789bar", "h"));
|
|
8776
|
+
ASSERT_OK(txn->Put(cfh1, "789baz", "i"));
|
|
8777
|
+
|
|
8778
|
+
ASSERT_OK(txn->Commit());
|
|
8779
|
+
}
|
|
8780
|
+
|
|
8781
|
+
{
|
|
8782
|
+
std::unique_ptr<Iterator> underlying_it(
|
|
8783
|
+
db->NewIterator(ReadOptions(), cfh2));
|
|
8784
|
+
auto it = std::make_unique<SecondaryIndexIterator>(
|
|
8785
|
+
index.get(), std::move(underlying_it));
|
|
8786
|
+
|
|
8787
|
+
it->Seek("foo");
|
|
8788
|
+
ASSERT_TRUE(it->Valid());
|
|
8789
|
+
ASSERT_OK(it->status());
|
|
8790
|
+
ASSERT_EQ(it->key(), "123foo");
|
|
8791
|
+
ASSERT_EQ(it->value(), "oof321");
|
|
8792
|
+
|
|
8793
|
+
it->Next();
|
|
8794
|
+
ASSERT_TRUE(it->Valid());
|
|
8795
|
+
ASSERT_OK(it->status());
|
|
8796
|
+
ASSERT_EQ(it->key(), "456foo");
|
|
8797
|
+
ASSERT_EQ(it->value(), "oof654");
|
|
8798
|
+
|
|
8799
|
+
it->Next();
|
|
8800
|
+
ASSERT_TRUE(it->Valid());
|
|
8801
|
+
ASSERT_OK(it->status());
|
|
8802
|
+
ASSERT_EQ(it->key(), "789foo");
|
|
8803
|
+
ASSERT_EQ(it->value(), "oof987");
|
|
8804
|
+
|
|
8805
|
+
it->Next();
|
|
8806
|
+
ASSERT_FALSE(it->Valid());
|
|
8807
|
+
ASSERT_OK(it->status());
|
|
8808
|
+
|
|
8809
|
+
it->Seek("bar");
|
|
8810
|
+
ASSERT_TRUE(it->Valid());
|
|
8811
|
+
ASSERT_OK(it->status());
|
|
8812
|
+
ASSERT_EQ(it->key(), "123bar");
|
|
8813
|
+
ASSERT_EQ(it->value(), "rab321");
|
|
8814
|
+
|
|
8815
|
+
it->Next();
|
|
8816
|
+
ASSERT_TRUE(it->Valid());
|
|
8817
|
+
ASSERT_OK(it->status());
|
|
8818
|
+
ASSERT_EQ(it->key(), "456bar");
|
|
8819
|
+
ASSERT_EQ(it->value(), "rab654");
|
|
8820
|
+
|
|
8821
|
+
it->Next();
|
|
8822
|
+
ASSERT_TRUE(it->Valid());
|
|
8823
|
+
ASSERT_OK(it->status());
|
|
8824
|
+
ASSERT_EQ(it->key(), "789bar");
|
|
8825
|
+
ASSERT_EQ(it->value(), "rab987");
|
|
8826
|
+
|
|
8827
|
+
it->Next();
|
|
8828
|
+
ASSERT_FALSE(it->Valid());
|
|
8829
|
+
ASSERT_OK(it->status());
|
|
8830
|
+
|
|
8831
|
+
it->Seek("baz");
|
|
8832
|
+
ASSERT_TRUE(it->Valid());
|
|
8833
|
+
ASSERT_OK(it->status());
|
|
8834
|
+
ASSERT_EQ(it->key(), "123baz");
|
|
8835
|
+
ASSERT_EQ(it->value(), "zab321");
|
|
8836
|
+
|
|
8837
|
+
it->Next();
|
|
8838
|
+
ASSERT_TRUE(it->Valid());
|
|
8839
|
+
ASSERT_OK(it->status());
|
|
8840
|
+
ASSERT_EQ(it->key(), "456baz");
|
|
8841
|
+
ASSERT_EQ(it->value(), "zab654");
|
|
8842
|
+
|
|
8843
|
+
it->Next();
|
|
8844
|
+
ASSERT_TRUE(it->Valid());
|
|
8845
|
+
ASSERT_OK(it->status());
|
|
8846
|
+
ASSERT_EQ(it->key(), "789baz");
|
|
8847
|
+
ASSERT_EQ(it->value(), "zab987");
|
|
8848
|
+
|
|
8849
|
+
it->Next();
|
|
8850
|
+
ASSERT_FALSE(it->Valid());
|
|
8851
|
+
ASSERT_OK(it->status());
|
|
8852
|
+
}
|
|
8276
8853
|
}
|
|
8277
8854
|
|
|
8278
8855
|
TEST_F(TransactionDBTest, CollapseKey) {
|
|
@@ -8381,13 +8958,15 @@ class CommitBypassMemtableTest : public DBTestBase,
|
|
|
8381
8958
|
Options options;
|
|
8382
8959
|
TransactionDBOptions txn_db_opts;
|
|
8383
8960
|
|
|
8384
|
-
void SetUpTransactionDB(
|
|
8961
|
+
void SetUpTransactionDB(
|
|
8962
|
+
bool atomic_flush = false) {
|
|
8385
8963
|
options = CurrentOptions();
|
|
8386
8964
|
options.create_if_missing = true;
|
|
8387
8965
|
options.allow_2pc = true;
|
|
8388
8966
|
options.two_write_queues = GetParam();
|
|
8389
8967
|
// Avoid write stall
|
|
8390
8968
|
options.max_write_buffer_number = 8;
|
|
8969
|
+
options.atomic_flush = atomic_flush;
|
|
8391
8970
|
// Destroy the DB to recreate as a TransactionDB.
|
|
8392
8971
|
Close();
|
|
8393
8972
|
Destroy(options, true);
|
|
@@ -8848,6 +9427,508 @@ TEST_P(CommitBypassMemtableTest, Recovery) {
|
|
|
8848
9427
|
VerifyDBFromMap(expected);
|
|
8849
9428
|
}
|
|
8850
9429
|
|
|
9430
|
+
TEST_P(CommitBypassMemtableTest, OptimizeLargeTxnCommitThreshold) {
|
|
9431
|
+
// Tests TransactionOptions::large_txn_commit_optimize_threshold
|
|
9432
|
+
const uint32_t threshold = 10;
|
|
9433
|
+
SetUpTransactionDB();
|
|
9434
|
+
bool commit_bypass_memtable = false;
|
|
9435
|
+
// TODO: add and use stats for this
|
|
9436
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
9437
|
+
"WriteCommittedTxn::CommitInternal:bypass_memtable",
|
|
9438
|
+
[&](void* arg) { commit_bypass_memtable = *(static_cast<bool*>(arg)); });
|
|
9439
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
9440
|
+
|
|
9441
|
+
WriteOptions wopts;
|
|
9442
|
+
// Test default (disabled)
|
|
9443
|
+
TransactionOptions txn_opts;
|
|
9444
|
+
auto txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9445
|
+
ASSERT_OK(txn1->SetName("xid0"));
|
|
9446
|
+
for (int i = 0; i < 100; ++i) {
|
|
9447
|
+
ASSERT_OK(
|
|
9448
|
+
txn1->Put("key" + std::to_string(i), "value" + std::to_string(i)));
|
|
9449
|
+
}
|
|
9450
|
+
ASSERT_OK(txn1->Prepare());
|
|
9451
|
+
ASSERT_OK(txn1->Commit());
|
|
9452
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9453
|
+
delete txn1;
|
|
9454
|
+
|
|
9455
|
+
// Test with transaction option only
|
|
9456
|
+
txn_opts.large_txn_commit_optimize_threshold = threshold;
|
|
9457
|
+
|
|
9458
|
+
// Test with transaction below threshold
|
|
9459
|
+
txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9460
|
+
ASSERT_OK(txn1->SetName("xid1"));
|
|
9461
|
+
ASSERT_OK(txn1->Put("k1", "v1"));
|
|
9462
|
+
ASSERT_OK(txn1->Prepare());
|
|
9463
|
+
ASSERT_OK(txn1->Commit());
|
|
9464
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9465
|
+
delete txn1;
|
|
9466
|
+
|
|
9467
|
+
// Test with transaction at threshold
|
|
9468
|
+
txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9469
|
+
ASSERT_OK(txn1->SetName("xid2"));
|
|
9470
|
+
for (uint32_t i = 0; i < threshold; ++i) {
|
|
9471
|
+
ASSERT_OK(
|
|
9472
|
+
txn1->Put("key" + std::to_string(i), "value" + std::to_string(i)));
|
|
9473
|
+
}
|
|
9474
|
+
ASSERT_OK(txn1->Prepare());
|
|
9475
|
+
ASSERT_OK(txn1->Commit());
|
|
9476
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9477
|
+
delete txn1;
|
|
9478
|
+
|
|
9479
|
+
SetUpTransactionDB();
|
|
9480
|
+
// Test with multiple column families
|
|
9481
|
+
std::vector<std::string> cfs = {"pk", "sk"};
|
|
9482
|
+
CreateColumnFamilies(cfs, options);
|
|
9483
|
+
|
|
9484
|
+
txn_opts.large_txn_commit_optimize_threshold = threshold;
|
|
9485
|
+
|
|
9486
|
+
// Below threshold
|
|
9487
|
+
auto txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9488
|
+
ASSERT_OK(txn_cf->SetName("xid_cf_below"));
|
|
9489
|
+
for (uint32_t i = 0; i < threshold - 1; ++i) {
|
|
9490
|
+
ASSERT_OK(txn_cf->Put(handles_[i % 2], "key" + std::to_string(i),
|
|
9491
|
+
"value" + std::to_string(i)));
|
|
9492
|
+
}
|
|
9493
|
+
ASSERT_OK(txn_cf->Prepare());
|
|
9494
|
+
commit_bypass_memtable = false;
|
|
9495
|
+
ASSERT_OK(txn_cf->Commit());
|
|
9496
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9497
|
+
delete txn_cf;
|
|
9498
|
+
|
|
9499
|
+
// At threshold
|
|
9500
|
+
txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9501
|
+
ASSERT_OK(txn_cf->SetName("xid_cf_at_threshold"));
|
|
9502
|
+
for (uint32_t i = 0; i < threshold; ++i) {
|
|
9503
|
+
ASSERT_OK(txn_cf->Put(handles_[i % 2], "key" + std::to_string(i),
|
|
9504
|
+
"value" + std::to_string(i)));
|
|
9505
|
+
}
|
|
9506
|
+
ASSERT_OK(txn_cf->Prepare());
|
|
9507
|
+
commit_bypass_memtable = false;
|
|
9508
|
+
ASSERT_OK(txn_cf->Commit());
|
|
9509
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9510
|
+
delete txn_cf;
|
|
9511
|
+
|
|
9512
|
+
// Test that commit_bypass_memtable takes precedence over
|
|
9513
|
+
// large_txn_commit_optimize_threshold
|
|
9514
|
+
txn_opts.large_txn_commit_optimize_threshold =
|
|
9515
|
+
threshold * 10; // High threshold
|
|
9516
|
+
txn_opts.commit_bypass_memtable = true; // Should override threshold
|
|
9517
|
+
|
|
9518
|
+
txn_cf = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9519
|
+
ASSERT_OK(txn_cf->SetName("xid_cf_precedence"));
|
|
9520
|
+
ASSERT_OK(txn_cf->Put(handles_[0], "key1", "value1")); // Just one operation
|
|
9521
|
+
ASSERT_OK(txn_cf->Prepare());
|
|
9522
|
+
commit_bypass_memtable = false;
|
|
9523
|
+
ASSERT_OK(txn_cf->Commit());
|
|
9524
|
+
ASSERT_TRUE(commit_bypass_memtable); // Should be true because of
|
|
9525
|
+
// commit_bypass_memtable
|
|
9526
|
+
delete txn_cf;
|
|
9527
|
+
}
|
|
9528
|
+
|
|
9529
|
+
TEST_P(CommitBypassMemtableTest, AtomicFlushTest) {
|
|
9530
|
+
const uint32_t threshold = 10;
|
|
9531
|
+
SetUpTransactionDB(/*atomic_flush=*/true);
|
|
9532
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
9533
|
+
|
|
9534
|
+
std::vector<std::string> cfs = {"cf0", "cf1", "cf2"};
|
|
9535
|
+
CreateColumnFamilies(cfs, options);
|
|
9536
|
+
|
|
9537
|
+
// Seed data in CF1 and 2 as atomic flush picks CFs with non-empty memtable
|
|
9538
|
+
ASSERT_OK(db_->Put({}, handles_[1], "key1", "val1"));
|
|
9539
|
+
ASSERT_OK(db_->Put({}, handles_[2], "key2", "val2"));
|
|
9540
|
+
|
|
9541
|
+
// Write to cf 0, should see cf1 and cf2 flushed too
|
|
9542
|
+
TransactionOptions txn_opts;
|
|
9543
|
+
txn_opts.large_txn_commit_optimize_threshold = threshold;
|
|
9544
|
+
auto txn = txn_db->BeginTransaction({}, txn_opts, nullptr);
|
|
9545
|
+
for (uint32_t i = 0; i <= threshold; ++i) {
|
|
9546
|
+
ASSERT_OK(txn->Put(handles_[0], "key" + std::to_string(i),
|
|
9547
|
+
"cf0" + std::to_string(i)));
|
|
9548
|
+
}
|
|
9549
|
+
ASSERT_OK(txn->SetName("cf0"));
|
|
9550
|
+
ASSERT_OK(txn->Prepare());
|
|
9551
|
+
ASSERT_OK(txn->Commit());
|
|
9552
|
+
delete txn;
|
|
9553
|
+
|
|
9554
|
+
ASSERT_OK(db_->WaitForCompact({}));
|
|
9555
|
+
for (size_t i = 0; i < 3; ++i) {
|
|
9556
|
+
auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
|
|
9557
|
+
ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
|
|
9558
|
+
ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
|
|
9559
|
+
}
|
|
9560
|
+
}
|
|
9561
|
+
|
|
9562
|
+
TEST_P(CommitBypassMemtableTest, MergeAndMultiCF) {
|
|
9563
|
+
// disable_flush allows testing Get path with memtables.
|
|
9564
|
+
for (bool disable_flush : {false, true}) {
|
|
9565
|
+
SCOPED_TRACE("disable_flush: " + std::to_string(disable_flush));
|
|
9566
|
+
SetUpTransactionDB();
|
|
9567
|
+
if (disable_flush) {
|
|
9568
|
+
ASSERT_OK(txn_db->PauseBackgroundWork());
|
|
9569
|
+
}
|
|
9570
|
+
|
|
9571
|
+
std::vector<std::string> cfs = {"appendmerge"};
|
|
9572
|
+
Options opts;
|
|
9573
|
+
opts.max_write_buffer_number = 8;
|
|
9574
|
+
opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
|
|
9575
|
+
CreateColumnFamilies(cfs, opts);
|
|
9576
|
+
|
|
9577
|
+
cfs = {"uint64addmerge"};
|
|
9578
|
+
opts.merge_operator = MergeOperators::CreateFromStringId("uint64add");
|
|
9579
|
+
CreateColumnFamilies(cfs, opts);
|
|
9580
|
+
|
|
9581
|
+
cfs = {"data"};
|
|
9582
|
+
opts.merge_operator = nullptr;
|
|
9583
|
+
CreateColumnFamilies(cfs, opts);
|
|
9584
|
+
ASSERT_TRUE(handles_.size() == 3);
|
|
9585
|
+
|
|
9586
|
+
std::string buf_count;
|
|
9587
|
+
PutFixed64(&buf_count, 1);
|
|
9588
|
+
// Some base data in SST or memtable
|
|
9589
|
+
ASSERT_OK(db_->Merge({}, handles_[1], "count", buf_count));
|
|
9590
|
+
ASSERT_OK(db_->Put({}, handles_[0], "k5", "5v1"));
|
|
9591
|
+
ASSERT_OK(db_->Merge({}, handles_[0], "k7", "7v1"));
|
|
9592
|
+
if (!disable_flush) {
|
|
9593
|
+
ASSERT_OK(db_->Flush({}, handles_[1]));
|
|
9594
|
+
}
|
|
9595
|
+
|
|
9596
|
+
WriteOptions wopts;
|
|
9597
|
+
TransactionOptions txn_opts;
|
|
9598
|
+
txn_opts.commit_bypass_memtable = true;
|
|
9599
|
+
Transaction* txn = txn_db->BeginTransaction(wopts, txn_opts);
|
|
9600
|
+
ASSERT_OK(txn->SetName("xid1"));
|
|
9601
|
+
ASSERT_OK(txn->Put(handles_[0], "k1", "v1"));
|
|
9602
|
+
ASSERT_OK(txn->Merge(handles_[0], "k1", "v2"));
|
|
9603
|
+
|
|
9604
|
+
ASSERT_OK(txn->Delete(handles_[0], "k2"));
|
|
9605
|
+
ASSERT_OK(txn->Merge(handles_[0], "k2", "v1"));
|
|
9606
|
+
|
|
9607
|
+
ASSERT_OK(txn->Merge(handles_[0], "k3", "v1"));
|
|
9608
|
+
ASSERT_OK(txn->Delete(handles_[0], "k3"));
|
|
9609
|
+
|
|
9610
|
+
ASSERT_OK(txn->Merge(handles_[0], "k4", "v1"));
|
|
9611
|
+
ASSERT_OK(txn->Put(handles_[0], "k4", "v4"));
|
|
9612
|
+
|
|
9613
|
+
ASSERT_OK(txn->Merge(handles_[0], "k5", "5v2"));
|
|
9614
|
+
|
|
9615
|
+
ASSERT_OK(txn->Merge(handles_[0], "k6", "6v1"));
|
|
9616
|
+
ASSERT_OK(txn->Merge(handles_[0], "k6", "6v2"));
|
|
9617
|
+
|
|
9618
|
+
ASSERT_OK(txn->Merge(handles_[0], "k7", "7v2"));
|
|
9619
|
+
ASSERT_OK(txn->Merge(handles_[0], "k7", "7v3"));
|
|
9620
|
+
|
|
9621
|
+
ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
|
|
9622
|
+
ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
|
|
9623
|
+
|
|
9624
|
+
ASSERT_OK(txn->Put(handles_[2], "a", "a1"));
|
|
9625
|
+
ASSERT_OK(txn->Put(handles_[2], "c", "c1"));
|
|
9626
|
+
|
|
9627
|
+
ASSERT_OK(txn->Prepare());
|
|
9628
|
+
ASSERT_OK(txn->Commit());
|
|
9629
|
+
|
|
9630
|
+
// Data in mutable memtable
|
|
9631
|
+
txn_opts.commit_bypass_memtable = false;
|
|
9632
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
|
|
9633
|
+
ASSERT_OK(txn->SetName("xid2"));
|
|
9634
|
+
ASSERT_OK(txn->Merge(handles_[0], "k1", "v3"));
|
|
9635
|
+
ASSERT_OK(txn->Merge(handles_[1], "count", buf_count));
|
|
9636
|
+
ASSERT_OK(txn->Prepare());
|
|
9637
|
+
ASSERT_OK(txn->Commit());
|
|
9638
|
+
delete txn;
|
|
9639
|
+
|
|
9640
|
+
std::map<std::string, std::string> expected_cf0 = {
|
|
9641
|
+
{"k1", "v1,v2,v3"}, {"k2", "v1"}, {"k4", "v4"},
|
|
9642
|
+
{"k5", "5v1,5v2"}, {"k6", "6v1,6v2"}, {"k7", "7v1,7v2,7v3"},
|
|
9643
|
+
};
|
|
9644
|
+
std::unordered_set<std::string> not_found_cf0 = {"k3"};
|
|
9645
|
+
VerifyDBFromMap(expected_cf0, nullptr, false, nullptr, handles_[0],
|
|
9646
|
+
¬_found_cf0);
|
|
9647
|
+
|
|
9648
|
+
std::string count;
|
|
9649
|
+
PutFixed64(&count, 4);
|
|
9650
|
+
std::map<std::string, std::string> expected_cf1 = {
|
|
9651
|
+
{"count", count},
|
|
9652
|
+
};
|
|
9653
|
+
VerifyDBFromMap(expected_cf1, nullptr, false, nullptr, handles_[1]);
|
|
9654
|
+
|
|
9655
|
+
std::map<std::string, std::string> expected_cf2 = {
|
|
9656
|
+
{"a", "a1"},
|
|
9657
|
+
{"c", "c1"},
|
|
9658
|
+
};
|
|
9659
|
+
VerifyDBFromMap(expected_cf2, nullptr, false, nullptr, handles_[2]);
|
|
9660
|
+
|
|
9661
|
+
// Verify all data is flushed
|
|
9662
|
+
if (disable_flush) {
|
|
9663
|
+
uint64_t num_imm_mems = 0;
|
|
9664
|
+
ASSERT_TRUE(txn_db->GetIntProperty(
|
|
9665
|
+
handles_[0], DB::Properties::kNumImmutableMemTable, &num_imm_mems));
|
|
9666
|
+
ASSERT_EQ(2,
|
|
9667
|
+
num_imm_mems); // 1 imm mem before WBWI, 1 imm is WBWI itself
|
|
9668
|
+
|
|
9669
|
+
// Test GetMergeOperands() for CF0
|
|
9670
|
+
std::vector<PinnableSlice> merge_operands(4);
|
|
9671
|
+
GetMergeOperandsOptions merge_operand_opts;
|
|
9672
|
+
merge_operand_opts.expected_max_number_of_operands = 4;
|
|
9673
|
+
int num_operands = 0;
|
|
9674
|
+
ASSERT_OK(db_->GetMergeOperands({}, handles_[0], "k1",
|
|
9675
|
+
merge_operands.data(),
|
|
9676
|
+
&merge_operand_opts, &num_operands));
|
|
9677
|
+
ASSERT_EQ(num_operands, 3);
|
|
9678
|
+
ASSERT_EQ(merge_operands[0], "v1");
|
|
9679
|
+
ASSERT_EQ(merge_operands[1], "v2");
|
|
9680
|
+
ASSERT_EQ(merge_operands[2], "v3");
|
|
9681
|
+
|
|
9682
|
+
ASSERT_OK(db_->ContinueBackgroundWork());
|
|
9683
|
+
ASSERT_OK(db_->Flush({}, {handles_[0], handles_[1], handles_[2]}));
|
|
9684
|
+
} else {
|
|
9685
|
+
ASSERT_OK(db_->WaitForCompact({}));
|
|
9686
|
+
}
|
|
9687
|
+
|
|
9688
|
+
VerifyDBFromMap(expected_cf0, nullptr, false, nullptr, handles_[0],
|
|
9689
|
+
¬_found_cf0);
|
|
9690
|
+
VerifyDBFromMap(expected_cf1, nullptr, false, nullptr, handles_[1]);
|
|
9691
|
+
VerifyDBFromMap(expected_cf2, nullptr, false, nullptr, handles_[2]);
|
|
9692
|
+
}
|
|
9693
|
+
}
|
|
9694
|
+
|
|
9695
|
+
TEST_P(CommitBypassMemtableTest, MergeMiniStress) {
|
|
9696
|
+
// To test the merge path with various LSM shapes
|
|
9697
|
+
std::string key_prefix = "key";
|
|
9698
|
+
std::string value_prefix = "val";
|
|
9699
|
+
Random* rnd = Random::GetTLSInstance();
|
|
9700
|
+
const int kBatchSize = 50;
|
|
9701
|
+
for (int num_memtable_to_merge : {1, 4}) {
|
|
9702
|
+
SetUpTransactionDB();
|
|
9703
|
+
std::vector<std::string> cfs = {"appendmerge"};
|
|
9704
|
+
Options opts;
|
|
9705
|
+
opts.max_write_buffer_number = 10;
|
|
9706
|
+
// Exercise read path of memtables.
|
|
9707
|
+
opts.min_write_buffer_number_to_merge = num_memtable_to_merge;
|
|
9708
|
+
opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
|
|
9709
|
+
CreateColumnFamilies(cfs, opts);
|
|
9710
|
+
ASSERT_TRUE(handles_.size() == 1);
|
|
9711
|
+
|
|
9712
|
+
std::map<std::string, std::string> expected_cf;
|
|
9713
|
+
std::unordered_set<std::string> not_found_cf;
|
|
9714
|
+
for (int i = 0; i < 10000; i += kBatchSize) {
|
|
9715
|
+
WriteOptions wopts;
|
|
9716
|
+
TransactionOptions txn_opts;
|
|
9717
|
+
txn_opts.commit_bypass_memtable = rnd->OneIn(2);
|
|
9718
|
+
std::unique_ptr<Transaction> txn{
|
|
9719
|
+
txn_db->BeginTransaction(wopts, txn_opts)};
|
|
9720
|
+
const int txn_count = i / kBatchSize;
|
|
9721
|
+
ASSERT_OK(txn->SetName("xid" + std::to_string(txn_count)));
|
|
9722
|
+
|
|
9723
|
+
const Snapshot* snapshot = txn_db->GetSnapshot();
|
|
9724
|
+
// Remember the state for the snapshot
|
|
9725
|
+
auto expected_cf_snapshot = expected_cf;
|
|
9726
|
+
auto not_found_cf_snapshot = not_found_cf;
|
|
9727
|
+
|
|
9728
|
+
for (int j = 0; j < kBatchSize; ++j) {
|
|
9729
|
+
std::string key = key_prefix + std::to_string(rnd->Uniform(1000));
|
|
9730
|
+
std::string value = value_prefix + std::to_string(i + j);
|
|
9731
|
+
int operation = rnd->Uniform(10);
|
|
9732
|
+
if (operation < 8) { // 80% probability for Merge
|
|
9733
|
+
ASSERT_OK(txn->Merge(handles_[0], key, value));
|
|
9734
|
+
if (expected_cf.find(key) != expected_cf.end()) {
|
|
9735
|
+
expected_cf[key] += "," + value;
|
|
9736
|
+
} else {
|
|
9737
|
+
expected_cf[key] = value;
|
|
9738
|
+
}
|
|
9739
|
+
not_found_cf.erase(key);
|
|
9740
|
+
} else if (operation == 8) { // 10% probability for PUT
|
|
9741
|
+
ASSERT_OK(txn->Put(handles_[0], key, value));
|
|
9742
|
+
expected_cf[key] = value;
|
|
9743
|
+
not_found_cf.erase(key);
|
|
9744
|
+
} else { // 10% probability for DEL
|
|
9745
|
+
ASSERT_OK(txn->Delete(handles_[0], key));
|
|
9746
|
+
expected_cf.erase(key);
|
|
9747
|
+
not_found_cf.insert(key);
|
|
9748
|
+
}
|
|
9749
|
+
}
|
|
9750
|
+
ASSERT_OK(txn->Prepare());
|
|
9751
|
+
ASSERT_OK(txn->Commit());
|
|
9752
|
+
|
|
9753
|
+
if (txn_count % 10 == 0) {
|
|
9754
|
+
VerifyDBFromMap(expected_cf, nullptr, false, nullptr, handles_[0],
|
|
9755
|
+
¬_found_cf);
|
|
9756
|
+
// Verify read at snapshot
|
|
9757
|
+
ReadOptions ro;
|
|
9758
|
+
ro.snapshot = snapshot;
|
|
9759
|
+
VerifyDBFromMap(expected_cf_snapshot, nullptr, false, &ro, handles_[0],
|
|
9760
|
+
¬_found_cf_snapshot);
|
|
9761
|
+
}
|
|
9762
|
+
txn_db->ReleaseSnapshot(snapshot);
|
|
9763
|
+
}
|
|
9764
|
+
|
|
9765
|
+
VerifyDBFromMap(expected_cf, nullptr, false, nullptr, handles_[0]);
|
|
9766
|
+
}
|
|
9767
|
+
}
|
|
9768
|
+
|
|
9769
|
+
TEST_F(TransactionDBTest, SelfDeadlockBug) {
|
|
9770
|
+
ASSERT_OK(ReOpen());
|
|
9771
|
+
|
|
9772
|
+
// Create two transactions
|
|
9773
|
+
WriteOptions write_options;
|
|
9774
|
+
TransactionOptions txn_options;
|
|
9775
|
+
txn_options.lock_timeout = 50; // 50ms
|
|
9776
|
+
txn_options.deadlock_detect = true;
|
|
9777
|
+
|
|
9778
|
+
ASSERT_OK(db->Put({}, "shared_key", "shared_value"));
|
|
9779
|
+
|
|
9780
|
+
// First transaction
|
|
9781
|
+
Transaction* txn1 = db->BeginTransaction(write_options, txn_options);
|
|
9782
|
+
ASSERT_TRUE(txn1);
|
|
9783
|
+
ASSERT_OK(txn1->SetName("txn1"));
|
|
9784
|
+
|
|
9785
|
+
// Second transaction
|
|
9786
|
+
Transaction* txn2 = db->BeginTransaction(write_options, txn_options);
|
|
9787
|
+
ASSERT_TRUE(txn2);
|
|
9788
|
+
ASSERT_OK(txn2->SetName("txn2"));
|
|
9789
|
+
|
|
9790
|
+
// Both transactions acquire shared lock on the same key.
|
|
9791
|
+
std::string value;
|
|
9792
|
+
ASSERT_OK(txn1->GetForUpdate(ReadOptions(), "shared_key", &value,
|
|
9793
|
+
/*exclusive=*/false));
|
|
9794
|
+
ASSERT_OK(txn2->GetForUpdate(ReadOptions(), "shared_key", &value,
|
|
9795
|
+
/*exclusive=*/false));
|
|
9796
|
+
|
|
9797
|
+
// Second transaction tries to upgrade to exclusive lock, which should
|
|
9798
|
+
// timeout.
|
|
9799
|
+
Status s = txn1->Put({}, "shared_key", "val");
|
|
9800
|
+
// Print out the deadlock info buffer
|
|
9801
|
+
ASSERT_TRUE(db->GetDeadlockInfoBuffer().empty());
|
|
9802
|
+
ASSERT_TRUE(s.IsTimedOut());
|
|
9803
|
+
ASSERT_EQ(s.ToString(), "Operation timed out: Timeout waiting to lock key");
|
|
9804
|
+
|
|
9805
|
+
// After release lock from txn2, txn1 should be able to proceed.
|
|
9806
|
+
ASSERT_OK(txn2->Rollback());
|
|
9807
|
+
ASSERT_OK(txn1->Put({}, "shared_key", "val"));
|
|
9808
|
+
ASSERT_OK(txn1->Rollback());
|
|
9809
|
+
delete txn1;
|
|
9810
|
+
delete txn2;
|
|
9811
|
+
}
|
|
9812
|
+
|
|
9813
|
+
TEST_P(CommitBypassMemtableTest,
|
|
9814
|
+
OptimizeLargeTxnCommitWriteBatchSizeThreshold) {
|
|
9815
|
+
// Tests TransactionOptions::large_txn_commit_optimize_byte_threshold
|
|
9816
|
+
const uint64_t threshold = 100;
|
|
9817
|
+
SetUpTransactionDB();
|
|
9818
|
+
bool commit_bypass_memtable = false;
|
|
9819
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
9820
|
+
"WriteCommittedTxn::CommitInternal:bypass_memtable",
|
|
9821
|
+
[&](void* arg) { commit_bypass_memtable = *(static_cast<bool*>(arg)); });
|
|
9822
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
9823
|
+
|
|
9824
|
+
Random rnd(301);
|
|
9825
|
+
|
|
9826
|
+
WriteOptions wopts;
|
|
9827
|
+
TransactionOptions txn_opts;
|
|
9828
|
+
// Test default
|
|
9829
|
+
auto txn = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
|
|
9830
|
+
ASSERT_OK(txn->SetName("xid0"));
|
|
9831
|
+
ASSERT_OK(txn->Put("k1", rnd.RandomString(1000)));
|
|
9832
|
+
ASSERT_OK(txn->Prepare());
|
|
9833
|
+
ASSERT_OK(txn->Commit());
|
|
9834
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9835
|
+
|
|
9836
|
+
// Test with transaction option only
|
|
9837
|
+
txn_opts.large_txn_commit_optimize_byte_threshold = threshold;
|
|
9838
|
+
// Above threshold
|
|
9839
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
|
|
9840
|
+
ASSERT_OK(txn->SetName("xid1"));
|
|
9841
|
+
ASSERT_OK(txn->Put("k1", rnd.RandomString(threshold)));
|
|
9842
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() >= threshold);
|
|
9843
|
+
ASSERT_OK(txn->Prepare());
|
|
9844
|
+
ASSERT_OK(txn->Commit());
|
|
9845
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9846
|
+
|
|
9847
|
+
// Below threshold
|
|
9848
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts, txn);
|
|
9849
|
+
ASSERT_OK(txn->SetName("xid2"));
|
|
9850
|
+
ASSERT_OK(txn->Put("k2", "v2"));
|
|
9851
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
|
|
9852
|
+
ASSERT_OK(txn->Prepare());
|
|
9853
|
+
ASSERT_OK(txn->Commit());
|
|
9854
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9855
|
+
delete txn;
|
|
9856
|
+
|
|
9857
|
+
// With commit_bypass_memtbale
|
|
9858
|
+
TransactionOptions txn_opts2;
|
|
9859
|
+
txn_opts2.commit_bypass_memtable = true;
|
|
9860
|
+
txn_opts2.large_txn_commit_optimize_byte_threshold = threshold;
|
|
9861
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts2, nullptr);
|
|
9862
|
+
ASSERT_OK(txn->SetName("xid3"));
|
|
9863
|
+
ASSERT_OK(txn->Put("k3", "v3"));
|
|
9864
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
|
|
9865
|
+
ASSERT_OK(txn->Prepare());
|
|
9866
|
+
ASSERT_OK(txn->Commit());
|
|
9867
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9868
|
+
delete txn;
|
|
9869
|
+
|
|
9870
|
+
// With count based threshold `large_txn_commit_optimize_threshold`
|
|
9871
|
+
TransactionOptions txn_opts3;
|
|
9872
|
+
txn_opts3.commit_bypass_memtable = false;
|
|
9873
|
+
txn_opts3.large_txn_commit_optimize_byte_threshold = threshold;
|
|
9874
|
+
txn_opts3.large_txn_commit_optimize_threshold = 3;
|
|
9875
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts3, nullptr);
|
|
9876
|
+
ASSERT_OK(txn->SetName("xid4"));
|
|
9877
|
+
ASSERT_OK(txn->Put("k3", "v3"));
|
|
9878
|
+
ASSERT_OK(txn->Delete("k2"));
|
|
9879
|
+
ASSERT_OK(txn->Delete("k1"));
|
|
9880
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
|
|
9881
|
+
ASSERT_OK(txn->Prepare());
|
|
9882
|
+
ASSERT_OK(txn->Commit());
|
|
9883
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9884
|
+
|
|
9885
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts3, txn);
|
|
9886
|
+
ASSERT_OK(txn->SetName("xid4"));
|
|
9887
|
+
ASSERT_OK(txn->Put("k3", "v3"));
|
|
9888
|
+
ASSERT_OK(txn->Delete("k2"));
|
|
9889
|
+
ASSERT_OK(txn->Delete("k1"));
|
|
9890
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
|
|
9891
|
+
ASSERT_OK(txn->Prepare());
|
|
9892
|
+
ASSERT_OK(txn->Commit());
|
|
9893
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9894
|
+
|
|
9895
|
+
txn = txn_db->BeginTransaction(wopts, txn_opts3, txn);
|
|
9896
|
+
ASSERT_OK(txn->SetName("xid5"));
|
|
9897
|
+
ASSERT_OK(txn->Put("k5", "v5"));
|
|
9898
|
+
ASSERT_TRUE(txn->GetWriteBatch()->GetDataSize() < threshold);
|
|
9899
|
+
ASSERT_OK(txn->Prepare());
|
|
9900
|
+
ASSERT_OK(txn->Commit());
|
|
9901
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9902
|
+
delete txn;
|
|
9903
|
+
|
|
9904
|
+
// Test with multiple column families
|
|
9905
|
+
std::vector<std::string> cfs = {"pk", "sk"};
|
|
9906
|
+
CreateColumnFamilies(cfs, options);
|
|
9907
|
+
TransactionOptions txn_opts_cf;
|
|
9908
|
+
|
|
9909
|
+
txn_opts_cf.large_txn_commit_optimize_byte_threshold = threshold;
|
|
9910
|
+
|
|
9911
|
+
// Below threshold
|
|
9912
|
+
auto txn_cf = txn_db->BeginTransaction(wopts, txn_opts_cf, nullptr);
|
|
9913
|
+
ASSERT_OK(txn_cf->SetName("xid_cf_above"));
|
|
9914
|
+
ASSERT_OK(txn_cf->Put(handles_[0], "k1", rnd.RandomString(threshold / 2)));
|
|
9915
|
+
ASSERT_OK(txn_cf->Put(handles_[1], "k2", rnd.RandomString(threshold / 2)));
|
|
9916
|
+
ASSERT_TRUE(txn_cf->GetWriteBatch()->GetDataSize() >= threshold);
|
|
9917
|
+
ASSERT_OK(txn_cf->Prepare());
|
|
9918
|
+
ASSERT_OK(txn_cf->Commit());
|
|
9919
|
+
ASSERT_TRUE(commit_bypass_memtable);
|
|
9920
|
+
|
|
9921
|
+
txn_cf = txn_db->BeginTransaction(wopts, txn_opts_cf, txn_cf);
|
|
9922
|
+
ASSERT_OK(txn_cf->SetName("xid_cf_below"));
|
|
9923
|
+
ASSERT_OK(txn_cf->Put(handles_[0], "k1", rnd.RandomString(10)));
|
|
9924
|
+
ASSERT_OK(txn_cf->Put(handles_[1], "k2", rnd.RandomString(10)));
|
|
9925
|
+
ASSERT_TRUE(txn_cf->GetWriteBatch()->GetDataSize() < threshold);
|
|
9926
|
+
ASSERT_OK(txn_cf->Prepare());
|
|
9927
|
+
ASSERT_OK(txn_cf->Commit());
|
|
9928
|
+
ASSERT_FALSE(commit_bypass_memtable);
|
|
9929
|
+
|
|
9930
|
+
delete txn_cf;
|
|
9931
|
+
}
|
|
8851
9932
|
} // namespace ROCKSDB_NAMESPACE
|
|
8852
9933
|
|
|
8853
9934
|
int main(int argc, char** argv) {
|