@nxtedition/rocksdb 13.5.7 → 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 +248 -70
- package/binding.gyp +2 -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 +9 -4
- package/index.js +50 -9
- package/package.json +8 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc
CHANGED
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
#include <memory>
|
|
16
16
|
|
|
17
17
|
#include "db/column_family.h"
|
|
18
|
-
#include "db/wide/wide_columns_helper.h"
|
|
19
18
|
#include "memtable/wbwi_memtable.h"
|
|
20
19
|
#include "port/stack_trace.h"
|
|
21
20
|
#include "test_util/testharness.h"
|
|
@@ -23,7 +22,6 @@
|
|
|
23
22
|
#include "util/random.h"
|
|
24
23
|
#include "util/string_util.h"
|
|
25
24
|
#include "utilities/merge_operators.h"
|
|
26
|
-
#include "utilities/merge_operators/string_append/stringappend.h"
|
|
27
25
|
#include "utilities/write_batch_with_index/write_batch_with_index_internal.h"
|
|
28
26
|
|
|
29
27
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -51,6 +49,7 @@ struct Entry {
|
|
|
51
49
|
|
|
52
50
|
struct TestHandler : public WriteBatch::Handler {
|
|
53
51
|
std::map<uint32_t, std::vector<Entry>> seen;
|
|
52
|
+
std::map<uint32_t, std::map<std::string, uint32_t>> cf_key_count;
|
|
54
53
|
Status PutCF(uint32_t column_family_id, const Slice& key,
|
|
55
54
|
const Slice& value) override {
|
|
56
55
|
Entry e;
|
|
@@ -58,6 +57,7 @@ struct TestHandler : public WriteBatch::Handler {
|
|
|
58
57
|
e.value = value.ToString();
|
|
59
58
|
e.type = kPutRecord;
|
|
60
59
|
seen[column_family_id].push_back(e);
|
|
60
|
+
cf_key_count[column_family_id][e.key]++;
|
|
61
61
|
return Status::OK();
|
|
62
62
|
}
|
|
63
63
|
Status MergeCF(uint32_t column_family_id, const Slice& key,
|
|
@@ -67,6 +67,7 @@ struct TestHandler : public WriteBatch::Handler {
|
|
|
67
67
|
e.value = value.ToString();
|
|
68
68
|
e.type = kMergeRecord;
|
|
69
69
|
seen[column_family_id].push_back(e);
|
|
70
|
+
cf_key_count[column_family_id][e.key]++;
|
|
70
71
|
return Status::OK();
|
|
71
72
|
}
|
|
72
73
|
void LogData(const Slice& /*blob*/) override {}
|
|
@@ -76,6 +77,16 @@ struct TestHandler : public WriteBatch::Handler {
|
|
|
76
77
|
e.value = "";
|
|
77
78
|
e.type = kDeleteRecord;
|
|
78
79
|
seen[column_family_id].push_back(e);
|
|
80
|
+
cf_key_count[column_family_id][e.key]++;
|
|
81
|
+
return Status::OK();
|
|
82
|
+
}
|
|
83
|
+
Status SingleDeleteCF(uint32_t column_family_id, const Slice& key) override {
|
|
84
|
+
Entry e;
|
|
85
|
+
e.key = key.ToString();
|
|
86
|
+
e.value = "";
|
|
87
|
+
e.type = kDeleteRecord;
|
|
88
|
+
seen[column_family_id].push_back(e);
|
|
89
|
+
cf_key_count[column_family_id][e.key]++;
|
|
79
90
|
return Status::OK();
|
|
80
91
|
}
|
|
81
92
|
};
|
|
@@ -390,6 +401,33 @@ class WBWIBaseTest : public testing::Test {
|
|
|
390
401
|
}
|
|
391
402
|
}
|
|
392
403
|
|
|
404
|
+
void VerifyWBWIIterUpdateCount(ColumnFamilyHandle* cfh = nullptr) {
|
|
405
|
+
TestHandler handler;
|
|
406
|
+
ASSERT_OK(batch_->GetWriteBatch()->Iterate(&handler));
|
|
407
|
+
auto& count_map = handler.cf_key_count[GetColumnFamilyID(cfh)];
|
|
408
|
+
// handler for going through write batch
|
|
409
|
+
std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(cfh));
|
|
410
|
+
iter->SeekToFirst();
|
|
411
|
+
size_t key_seen = 0;
|
|
412
|
+
while (iter->Valid()) {
|
|
413
|
+
ASSERT_OK(iter->status());
|
|
414
|
+
std::string key = iter->Entry().key.ToString();
|
|
415
|
+
auto count = count_map[key];
|
|
416
|
+
ASSERT_EQ(iter->GetUpdateCount(), count);
|
|
417
|
+
iter->Next();
|
|
418
|
+
// Merge is not overwritten when WBWI is created with overrwite_key
|
|
419
|
+
// We can only check for decreasing update count since the update before
|
|
420
|
+
// Merge can be overwritten multiple times.
|
|
421
|
+
while (iter->Valid() && key == iter->Entry().key.ToString()) {
|
|
422
|
+
ASSERT_GT(count, iter->GetUpdateCount());
|
|
423
|
+
count = iter->GetUpdateCount();
|
|
424
|
+
iter->Next();
|
|
425
|
+
}
|
|
426
|
+
++key_seen;
|
|
427
|
+
}
|
|
428
|
+
ASSERT_EQ(key_seen, count_map.size());
|
|
429
|
+
}
|
|
430
|
+
|
|
393
431
|
public:
|
|
394
432
|
DB* db_;
|
|
395
433
|
std::string dbname_;
|
|
@@ -415,7 +453,8 @@ class WriteBatchWithIndexTest : public WBWIBaseTest,
|
|
|
415
453
|
};
|
|
416
454
|
|
|
417
455
|
void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
|
|
418
|
-
WriteBatchWithIndex* batch
|
|
456
|
+
WriteBatchWithIndex* batch,
|
|
457
|
+
bool overwrite) {
|
|
419
458
|
// In this test, we insert <key, value> to column family `data`, and
|
|
420
459
|
// <value, key> to column family `index`. Then iterator them in order
|
|
421
460
|
// and seek them by key.
|
|
@@ -425,8 +464,25 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
|
|
|
425
464
|
// Sort entries by value
|
|
426
465
|
std::map<std::string, std::vector<Entry*>> index_map;
|
|
427
466
|
for (auto& e : entries) {
|
|
428
|
-
data_map[e.key].
|
|
429
|
-
|
|
467
|
+
if (overwrite && e.type != kMergeRecord && data_map[e.key].size() > 0) {
|
|
468
|
+
data_map[e.key].back() = &e;
|
|
469
|
+
} else {
|
|
470
|
+
data_map[e.key].push_back(&e);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// index does not use Merge, so we overwrite the expected value
|
|
474
|
+
if (overwrite && index_map[e.value].size() > 0) {
|
|
475
|
+
index_map[e.value].back() = &e;
|
|
476
|
+
} else {
|
|
477
|
+
index_map[e.value].push_back(&e);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// Most recent update for the same key is ordered first.
|
|
481
|
+
for (auto& [_, v] : data_map) {
|
|
482
|
+
std::reverse(v.begin(), v.end());
|
|
483
|
+
}
|
|
484
|
+
for (auto& [_, v] : index_map) {
|
|
485
|
+
std::reverse(v.begin(), v.end());
|
|
430
486
|
}
|
|
431
487
|
|
|
432
488
|
ColumnFamilyHandleImplDummy data(6, BytewiseComparator());
|
|
@@ -554,6 +610,25 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
|
|
|
554
610
|
ASSERT_OK(iter->status());
|
|
555
611
|
}
|
|
556
612
|
}
|
|
613
|
+
|
|
614
|
+
// SeekForPrev
|
|
615
|
+
for (auto pair = data_map.begin(); pair != data_map.end(); ++pair) {
|
|
616
|
+
iter->SeekForPrev(pair->first);
|
|
617
|
+
ASSERT_OK(iter->status());
|
|
618
|
+
// SeekForPrev positions iter at the last entry <= target.
|
|
619
|
+
// So we iterate updates from oldest to most recent.
|
|
620
|
+
for (auto v = pair->second.rbegin(); v != pair->second.rend(); ++v) {
|
|
621
|
+
ASSERT_TRUE(iter->Valid());
|
|
622
|
+
auto write_entry = iter->Entry();
|
|
623
|
+
ASSERT_EQ(pair->first, write_entry.key.ToString());
|
|
624
|
+
ASSERT_EQ((*v)->type, write_entry.type);
|
|
625
|
+
if (write_entry.type != kDeleteRecord) {
|
|
626
|
+
ASSERT_EQ((*v)->value, write_entry.value.ToString());
|
|
627
|
+
}
|
|
628
|
+
iter->Prev();
|
|
629
|
+
ASSERT_OK(iter->status());
|
|
630
|
+
}
|
|
631
|
+
}
|
|
557
632
|
}
|
|
558
633
|
|
|
559
634
|
// Seek to every index
|
|
@@ -576,6 +651,24 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
|
|
|
576
651
|
ASSERT_OK(iter->status());
|
|
577
652
|
}
|
|
578
653
|
}
|
|
654
|
+
|
|
655
|
+
// SeekForPrev
|
|
656
|
+
for (auto pair = index_map.begin(); pair != index_map.end(); ++pair) {
|
|
657
|
+
iter->SeekForPrev(pair->first);
|
|
658
|
+
ASSERT_OK(iter->status());
|
|
659
|
+
// SeekForPrev positions iter at the last entry <= target.
|
|
660
|
+
// So we iterate updates from oldest to most recent.
|
|
661
|
+
for (auto v = pair->second.rbegin(); v != pair->second.rend(); ++v) {
|
|
662
|
+
ASSERT_TRUE(iter->Valid());
|
|
663
|
+
auto write_entry = iter->Entry();
|
|
664
|
+
ASSERT_EQ(pair->first, write_entry.key.ToString());
|
|
665
|
+
if ((*v)->type != kDeleteRecord) {
|
|
666
|
+
ASSERT_EQ((*v)->key, write_entry.value.ToString());
|
|
667
|
+
}
|
|
668
|
+
iter->Prev();
|
|
669
|
+
ASSERT_OK(iter->status());
|
|
670
|
+
}
|
|
671
|
+
}
|
|
579
672
|
}
|
|
580
673
|
|
|
581
674
|
// Verify WriteBatch can be iterated
|
|
@@ -610,7 +703,7 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
|
|
|
610
703
|
}
|
|
611
704
|
}
|
|
612
705
|
|
|
613
|
-
|
|
706
|
+
TEST_P(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
|
|
614
707
|
Entry entries[] = {
|
|
615
708
|
{"aaa", "0005", kPutRecord}, {"b", "0002", kPutRecord},
|
|
616
709
|
{"cdd", "0002", kMergeRecord}, {"aab", "00001", kPutRecord},
|
|
@@ -619,23 +712,141 @@ TEST_F(WBWIKeepTest, TestValueAsSecondaryIndex) {
|
|
|
619
712
|
};
|
|
620
713
|
std::vector<Entry> entries_list(entries, entries + 8);
|
|
621
714
|
|
|
622
|
-
batch_.reset(new WriteBatchWithIndex(nullptr, 20,
|
|
715
|
+
batch_.reset(new WriteBatchWithIndex(nullptr, 20, GetParam()));
|
|
623
716
|
|
|
624
|
-
TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
|
|
717
|
+
TestValueAsSecondaryIndexHelper(entries_list, batch_.get(), GetParam());
|
|
625
718
|
|
|
626
719
|
// Clear batch and re-run test with new values
|
|
627
720
|
batch_->Clear();
|
|
628
721
|
|
|
629
722
|
Entry new_entries[] = {
|
|
630
|
-
{"aaa", "0005", kPutRecord},
|
|
631
|
-
{"add", "0002",
|
|
632
|
-
{"zz", "00005", kPutRecord},
|
|
633
|
-
{"aab", "0003", kPutRecord},
|
|
723
|
+
{"aaa", "0005", kPutRecord}, {"e", "0002", kPutRecord},
|
|
724
|
+
{"add", "0002", kPutRecord}, {"aab", "00001", kPutRecord},
|
|
725
|
+
{"zz", "00005", kPutRecord}, {"add", "0002", kMergeRecord},
|
|
726
|
+
{"aab", "0003", kPutRecord}, {"zz", "00005", kDeleteRecord},
|
|
634
727
|
};
|
|
635
728
|
|
|
636
729
|
entries_list = std::vector<Entry>(new_entries, new_entries + 8);
|
|
637
730
|
|
|
638
|
-
TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
|
|
731
|
+
TestValueAsSecondaryIndexHelper(entries_list, batch_.get(), GetParam());
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
TEST_P(WriteBatchWithIndexTest, WBWIIteratorImpl) {
|
|
735
|
+
// Tests methods of WBWIIteratorImpl, with some overwrites and merges.
|
|
736
|
+
ASSERT_OK(batch_->Merge("k0", "k0m0"));
|
|
737
|
+
ASSERT_OK(batch_->Put("k0", "k0p1"));
|
|
738
|
+
|
|
739
|
+
// a merge and a non-merge
|
|
740
|
+
ASSERT_OK(batch_->Merge("k1", "k1m0"));
|
|
741
|
+
ASSERT_OK(batch_->Merge("k1", "k1m1"));
|
|
742
|
+
|
|
743
|
+
ASSERT_OK(batch_->SingleDelete("k2"));
|
|
744
|
+
|
|
745
|
+
// put then merge
|
|
746
|
+
ASSERT_OK(batch_->Put("k3", "k3p0"));
|
|
747
|
+
ASSERT_OK(batch_->Merge("k3", "k3m1"));
|
|
748
|
+
if (GetParam()) {
|
|
749
|
+
VerifyWBWIIterUpdateCount();
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
std::unique_ptr<WBWIIteratorImpl> iter(
|
|
753
|
+
static_cast<WBWIIteratorImpl*>(batch_->NewIterator()));
|
|
754
|
+
|
|
755
|
+
auto verify_iter = [&iter](const std::string& k, const std::string& v,
|
|
756
|
+
WriteType t, int line) {
|
|
757
|
+
SCOPED_TRACE("Called from line " + std::to_string(line));
|
|
758
|
+
ASSERT_TRUE(iter->Valid());
|
|
759
|
+
ASSERT_OK(iter->status());
|
|
760
|
+
const auto entry = iter->Entry();
|
|
761
|
+
ASSERT_EQ(entry.key, k);
|
|
762
|
+
if (t != kDeleteRecord && t != kSingleDeleteRecord) {
|
|
763
|
+
ASSERT_EQ(entry.value, v);
|
|
764
|
+
}
|
|
765
|
+
ASSERT_EQ(entry.type, t);
|
|
766
|
+
};
|
|
767
|
+
|
|
768
|
+
// Should land on first key >= k0, recent update is ordered first
|
|
769
|
+
iter->Seek("k0");
|
|
770
|
+
verify_iter("k0", "k0p1", kPutRecord, __LINE__);
|
|
771
|
+
// Should land on the first update of the next key
|
|
772
|
+
iter->NextKey();
|
|
773
|
+
verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
|
|
774
|
+
iter->NextKey();
|
|
775
|
+
verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
|
|
776
|
+
iter->NextKey();
|
|
777
|
+
verify_iter("k3", "k3m1", kMergeRecord, __LINE__);
|
|
778
|
+
iter->PrevKey();
|
|
779
|
+
verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
|
|
780
|
+
|
|
781
|
+
// Should land on last key <= k0, recent update is ordered first
|
|
782
|
+
iter->SeekForPrev("k3");
|
|
783
|
+
verify_iter("k3", "k3p0", kPutRecord, __LINE__);
|
|
784
|
+
iter->PrevKey();
|
|
785
|
+
verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
|
|
786
|
+
iter->PrevKey();
|
|
787
|
+
verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
|
|
788
|
+
iter->PrevKey();
|
|
789
|
+
verify_iter("k0", "k0p1", kPutRecord, __LINE__);
|
|
790
|
+
iter->NextKey();
|
|
791
|
+
verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
|
|
792
|
+
|
|
793
|
+
// test FindLatestUpdate
|
|
794
|
+
iter->SeekToFirst();
|
|
795
|
+
verify_iter("k0", "k0p1", kPutRecord, __LINE__);
|
|
796
|
+
MergeContext merge_context;
|
|
797
|
+
// iterator is not at k1
|
|
798
|
+
ASSERT_EQ(iter->FindLatestUpdate("k1", &merge_context),
|
|
799
|
+
WBWIIteratorImpl::Result::kNotFound);
|
|
800
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 0);
|
|
801
|
+
// iterator was not moved
|
|
802
|
+
verify_iter("k0", "k0p1", kPutRecord, __LINE__);
|
|
803
|
+
|
|
804
|
+
// k0's most recent update is a Put
|
|
805
|
+
ASSERT_EQ(iter->FindLatestUpdate("k0", &merge_context),
|
|
806
|
+
WBWIIteratorImpl::Result::kFound);
|
|
807
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 0);
|
|
808
|
+
verify_iter("k0", "k0p1", kPutRecord, __LINE__);
|
|
809
|
+
|
|
810
|
+
iter->NextKey();
|
|
811
|
+
verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
|
|
812
|
+
ASSERT_EQ(iter->FindLatestUpdate("k1", &merge_context),
|
|
813
|
+
WBWIIteratorImpl::Result::kMergeInProgress);
|
|
814
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 2);
|
|
815
|
+
auto operands = merge_context.GetOperands();
|
|
816
|
+
// oldest merge is ordered first
|
|
817
|
+
ASSERT_EQ(operands[0], "k1m0");
|
|
818
|
+
ASSERT_EQ(operands[1], "k1m1");
|
|
819
|
+
// iterator moved to last merge
|
|
820
|
+
verify_iter("k1", "k1m0", kMergeRecord, __LINE__);
|
|
821
|
+
merge_context.Clear();
|
|
822
|
+
|
|
823
|
+
iter->Next();
|
|
824
|
+
verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
|
|
825
|
+
ASSERT_EQ(iter->FindLatestUpdate("k2", &merge_context),
|
|
826
|
+
WBWIIteratorImpl::Result::kDeleted);
|
|
827
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 0);
|
|
828
|
+
verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
|
|
829
|
+
|
|
830
|
+
iter->Next();
|
|
831
|
+
verify_iter("k3", "k3m1", kMergeRecord, __LINE__);
|
|
832
|
+
// This will find latest updated of the current key
|
|
833
|
+
ASSERT_EQ(iter->FindLatestUpdate(&merge_context),
|
|
834
|
+
WBWIIteratorImpl::Result::kFound);
|
|
835
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 1);
|
|
836
|
+
operands = merge_context.GetOperands();
|
|
837
|
+
ASSERT_EQ(operands[0], "k3m1");
|
|
838
|
+
// iterator moved to last merge
|
|
839
|
+
verify_iter("k3", "k3p0", kPutRecord, __LINE__);
|
|
840
|
+
|
|
841
|
+
// SeekToLast
|
|
842
|
+
iter->SeekToLast();
|
|
843
|
+
verify_iter("k3", "k3p0", kPutRecord, __LINE__);
|
|
844
|
+
// FindLatestUpdate() while we are at the older update of k3
|
|
845
|
+
ASSERT_EQ(iter->FindLatestUpdate(&merge_context),
|
|
846
|
+
WBWIIteratorImpl::Result::kFound);
|
|
847
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 1);
|
|
848
|
+
operands = merge_context.GetOperands();
|
|
849
|
+
ASSERT_EQ(operands[0], "k3m1");
|
|
639
850
|
}
|
|
640
851
|
|
|
641
852
|
TEST_P(WriteBatchWithIndexTest, TestComparatorForCF) {
|
|
@@ -851,6 +1062,9 @@ TEST_P(WriteBatchWithIndexTest, TestWBWIIterator) {
|
|
|
851
1062
|
ASSERT_OK(batch_->Delete(&cf2, "f"));
|
|
852
1063
|
AssertIterEqual(iter1.get(), {"a", "c", "e"});
|
|
853
1064
|
AssertIterEqual(iter2.get(), {"a", "b", "d", "f"});
|
|
1065
|
+
if (GetParam()) {
|
|
1066
|
+
VerifyWBWIIterUpdateCount();
|
|
1067
|
+
}
|
|
854
1068
|
}
|
|
855
1069
|
|
|
856
1070
|
TEST_P(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
|
|
@@ -972,6 +1186,11 @@ TEST_P(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
|
|
|
972
1186
|
}
|
|
973
1187
|
|
|
974
1188
|
ASSERT_OK(iter->status());
|
|
1189
|
+
if (GetParam()) {
|
|
1190
|
+
VerifyWBWIIterUpdateCount(&cf1);
|
|
1191
|
+
VerifyWBWIIterUpdateCount(&cf2);
|
|
1192
|
+
VerifyWBWIIterUpdateCount(&cf3);
|
|
1193
|
+
}
|
|
975
1194
|
}
|
|
976
1195
|
}
|
|
977
1196
|
|
|
@@ -1220,6 +1439,12 @@ TEST_P(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
|
|
|
1220
1439
|
iter->Seek("0");
|
|
1221
1440
|
AssertIter(iter.get(), "a", "b");
|
|
1222
1441
|
}
|
|
1442
|
+
|
|
1443
|
+
if (GetParam()) {
|
|
1444
|
+
VerifyWBWIIterUpdateCount();
|
|
1445
|
+
VerifyWBWIIterUpdateCount(&cf1);
|
|
1446
|
+
VerifyWBWIIterUpdateCount(&cf2);
|
|
1447
|
+
}
|
|
1223
1448
|
}
|
|
1224
1449
|
|
|
1225
1450
|
TEST_P(WriteBatchWithIndexTest, TestGetFromBatch) {
|
|
@@ -1726,6 +1951,7 @@ TEST_F(WBWIOverwriteTest, MutateWhileIteratingBaseStressTest) {
|
|
|
1726
1951
|
}
|
|
1727
1952
|
}
|
|
1728
1953
|
ASSERT_OK(iter->status());
|
|
1954
|
+
VerifyWBWIIterUpdateCount();
|
|
1729
1955
|
}
|
|
1730
1956
|
|
|
1731
1957
|
TEST_P(WriteBatchWithIndexTest, TestNewIteratorWithBaseFromWbwi) {
|
|
@@ -2476,8 +2702,8 @@ TEST_P(WriteBatchWithIndexTest, MultiGetTest2) {
|
|
|
2476
2702
|
default:
|
|
2477
2703
|
assert(false);
|
|
2478
2704
|
} // end switch
|
|
2479
|
-
}
|
|
2480
|
-
}
|
|
2705
|
+
} // End for each key
|
|
2706
|
+
} // end for passes
|
|
2481
2707
|
}
|
|
2482
2708
|
|
|
2483
2709
|
// This test has merges, but the merge does not play into the final result
|
|
@@ -2599,7 +2825,7 @@ TEST_P(WriteBatchWithIndexTest, GetFromBatchAndDBAfterMerge) {
|
|
|
2599
2825
|
ASSERT_EQ(value, "cc");
|
|
2600
2826
|
}
|
|
2601
2827
|
|
|
2602
|
-
|
|
2828
|
+
TEST_P(WriteBatchWithIndexTest, GetAfterPut) {
|
|
2603
2829
|
std::string value;
|
|
2604
2830
|
ASSERT_OK(OpenDB());
|
|
2605
2831
|
ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
|
|
@@ -2691,7 +2917,7 @@ TEST_P(WriteBatchWithIndexTest, GetAfterMergeDelete) {
|
|
|
2691
2917
|
ASSERT_EQ(value, "cc,dd");
|
|
2692
2918
|
}
|
|
2693
2919
|
|
|
2694
|
-
|
|
2920
|
+
TEST_P(WriteBatchWithIndexTest, TestBadMergeOperator) {
|
|
2695
2921
|
class FailingMergeOperator : public MergeOperator {
|
|
2696
2922
|
public:
|
|
2697
2923
|
FailingMergeOperator() = default;
|
|
@@ -2837,16 +3063,17 @@ TEST_P(WriteBatchWithIndexTest, ColumnFamilyWithTimestamp) {
|
|
|
2837
3063
|
std::string key;
|
|
2838
3064
|
PutFixed32(&key, start);
|
|
2839
3065
|
ASSERT_EQ(key, it->Entry().key);
|
|
2840
|
-
|
|
2841
|
-
ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
|
|
2842
|
-
it->Next();
|
|
2843
|
-
ASSERT_TRUE(it->Valid());
|
|
2844
|
-
}
|
|
3066
|
+
// For each key, most recent update (Del) is ordered first.
|
|
2845
3067
|
if (0 == (start % 2)) {
|
|
2846
3068
|
ASSERT_EQ(WriteType::kDeleteRecord, it->Entry().type);
|
|
2847
3069
|
} else {
|
|
2848
3070
|
ASSERT_EQ(WriteType::kSingleDeleteRecord, it->Entry().type);
|
|
2849
3071
|
}
|
|
3072
|
+
if (!overwrite) {
|
|
3073
|
+
it->Next();
|
|
3074
|
+
ASSERT_TRUE(it->Valid());
|
|
3075
|
+
ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
|
|
3076
|
+
}
|
|
2850
3077
|
}
|
|
2851
3078
|
}
|
|
2852
3079
|
}
|
|
@@ -3419,7 +3646,6 @@ TEST_P(WriteBatchWithIndexTest, EntityReadSanityChecks) {
|
|
|
3419
3646
|
|
|
3420
3647
|
TEST_P(WriteBatchWithIndexTest, TrackAndClearCFStats) {
|
|
3421
3648
|
std::string value;
|
|
3422
|
-
batch_->SetTrackPerCFStat(true);
|
|
3423
3649
|
ASSERT_OK(batch_->Put("A", "val"));
|
|
3424
3650
|
ASSERT_OK(batch_->SingleDelete("B"));
|
|
3425
3651
|
|
|
@@ -3466,15 +3692,20 @@ TEST_P(WriteBatchWithIndexTest, TrackAndClearCFStats) {
|
|
|
3466
3692
|
INSTANTIATE_TEST_CASE_P(WBWI, WriteBatchWithIndexTest, testing::Bool());
|
|
3467
3693
|
|
|
3468
3694
|
std::string Get(const std::string& k, std::unique_ptr<WBWIMemTable>& wbwi_mem,
|
|
3469
|
-
SequenceNumber snapshot_seq, bool* found_final_value
|
|
3695
|
+
SequenceNumber snapshot_seq, bool* found_final_value,
|
|
3696
|
+
MergeContext* merge_context = nullptr) {
|
|
3470
3697
|
LookupKey lkey(k, snapshot_seq);
|
|
3471
3698
|
std::string val;
|
|
3472
3699
|
SequenceNumber max_range_del_seqno = 0;
|
|
3473
3700
|
SequenceNumber out_seqno = 0;
|
|
3474
3701
|
bool is_blob_index = false;
|
|
3475
3702
|
Status s;
|
|
3703
|
+
std::unique_ptr<MergeContext> merge_context_guard{new MergeContext};
|
|
3704
|
+
if (merge_context == nullptr) {
|
|
3705
|
+
merge_context = merge_context_guard.get();
|
|
3706
|
+
}
|
|
3476
3707
|
*found_final_value = wbwi_mem->Get(
|
|
3477
|
-
lkey, &val, nullptr, nullptr, &s,
|
|
3708
|
+
lkey, &val, nullptr, nullptr, &s, merge_context, &max_range_del_seqno,
|
|
3478
3709
|
&out_seqno, ReadOptions(), true, nullptr, &is_blob_index, true);
|
|
3479
3710
|
if (s.ok()) {
|
|
3480
3711
|
if (*found_final_value) {
|
|
@@ -3482,10 +3713,11 @@ std::string Get(const std::string& k, std::unique_ptr<WBWIMemTable>& wbwi_mem,
|
|
|
3482
3713
|
return val;
|
|
3483
3714
|
}
|
|
3484
3715
|
return "NOT_FOUND";
|
|
3716
|
+
} else if (s.IsNotFound()) {
|
|
3717
|
+
EXPECT_TRUE(*found_final_value);
|
|
3718
|
+
return "NOT_FOUND";
|
|
3485
3719
|
}
|
|
3486
|
-
|
|
3487
|
-
EXPECT_TRUE(*found_final_value);
|
|
3488
|
-
return "NOT_FOUND";
|
|
3720
|
+
return s.ToString();
|
|
3489
3721
|
}
|
|
3490
3722
|
|
|
3491
3723
|
class WBWIMemTableTest : public testing::Test {};
|
|
@@ -3502,18 +3734,17 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3502
3734
|
Random& rnd = *Random::GetTLSInstance();
|
|
3503
3735
|
auto wbwi = std::make_shared<WriteBatchWithIndex>(
|
|
3504
3736
|
cmp, 0, /*overwrite_key=*/true, 0, 0);
|
|
3505
|
-
wbwi->SetTrackPerCFStat(true);
|
|
3506
3737
|
std::vector<std::pair<std::string, std::string>> expected;
|
|
3507
|
-
|
|
3508
|
-
|
|
3738
|
+
const int kNumUpdate = 10000;
|
|
3739
|
+
expected.resize(kNumUpdate);
|
|
3740
|
+
for (int i = 0; i < kNumUpdate; ++i) {
|
|
3509
3741
|
// Leave a non-existing key 9999 in between existing keys to test read.
|
|
3510
3742
|
std::string key = i < 9999 ? DBTestBase::Key(i) : DBTestBase::Key(i + 1);
|
|
3511
3743
|
bool del = rnd.OneIn(2);
|
|
3512
3744
|
std::string val = del ? "NOT_FOUND" : rnd.RandomString(50);
|
|
3513
3745
|
expected[i] = std::make_pair(key, val);
|
|
3514
3746
|
}
|
|
3515
|
-
|
|
3516
|
-
RandomShuffle(expected.begin(), expected.end());
|
|
3747
|
+
|
|
3517
3748
|
std::unique_ptr<WBWIMemTable> wbwi_mem{
|
|
3518
3749
|
new WBWIMemTable(wbwi, cmp,
|
|
3519
3750
|
/*cf_id=*/0, &immutable_opts, &mutable_cf_options,
|
|
@@ -3522,9 +3753,13 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3522
3753
|
ASSERT_TRUE(wbwi_mem->IsEmpty());
|
|
3523
3754
|
constexpr SequenceNumber visible_seq = 10002;
|
|
3524
3755
|
constexpr SequenceNumber non_visible_seq = 1;
|
|
3525
|
-
|
|
3756
|
+
const SequenceNumber seqno_lb = 2;
|
|
3757
|
+
constexpr WBWIMemTable::SeqnoRange assigned_seq = {seqno_lb,
|
|
3758
|
+
seqno_lb + kNumUpdate - 1};
|
|
3526
3759
|
wbwi_mem->AssignSequenceNumbers(assigned_seq);
|
|
3527
3760
|
|
|
3761
|
+
// Random insertion order
|
|
3762
|
+
RandomShuffle(expected.begin(), expected.end());
|
|
3528
3763
|
bool found_final_value = false;
|
|
3529
3764
|
for (const auto& [key, val] : expected) {
|
|
3530
3765
|
if (val == "NOT_FOUND") {
|
|
@@ -3548,28 +3783,38 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3548
3783
|
ColumnFamilyHandleImplDummy meta_cf(/*id=*/1, BytewiseComparator());
|
|
3549
3784
|
ASSERT_OK(wbwi->Put(&meta_cf, DBTestBase::Key(0), "foo"));
|
|
3550
3785
|
|
|
3551
|
-
|
|
3786
|
+
// Sort keys to compare with iterator
|
|
3787
|
+
std::sort(expected.begin(), expected.end(),
|
|
3788
|
+
[](const std::pair<std::string, std::string>& a,
|
|
3789
|
+
const std::pair<std::string, std::string>& b) {
|
|
3790
|
+
return a.first < b.first;
|
|
3791
|
+
});
|
|
3792
|
+
|
|
3552
3793
|
// overwrites
|
|
3794
|
+
std::vector<SequenceNumber> expected_seqno(kNumUpdate, seqno_lb);
|
|
3553
3795
|
for (size_t i = 0; i < 2000; ++i) {
|
|
3554
3796
|
// We don't expect to mix SD and DEL, or issue multiple SD consecutively in
|
|
3555
3797
|
// a DB. Read from WBWI should still work so we do it here to keep the test
|
|
3556
3798
|
// simple.
|
|
3799
|
+
size_t idx = rnd.Uniform(kNumUpdate);
|
|
3557
3800
|
if (rnd.OneIn(2)) {
|
|
3558
3801
|
std::string val = rnd.RandomString(100);
|
|
3559
|
-
expected[
|
|
3560
|
-
ASSERT_OK(wbwi->Put(expected[
|
|
3802
|
+
expected[idx].second = val;
|
|
3803
|
+
ASSERT_OK(wbwi->Put(expected[idx].first, val));
|
|
3561
3804
|
} else {
|
|
3562
|
-
expected[
|
|
3805
|
+
expected[idx].second = "NOT_FOUND";
|
|
3563
3806
|
if (rnd.OneIn(2)) {
|
|
3564
|
-
ASSERT_OK(wbwi->SingleDelete(expected[
|
|
3807
|
+
ASSERT_OK(wbwi->SingleDelete(expected[idx].first));
|
|
3565
3808
|
} else {
|
|
3566
|
-
ASSERT_OK(wbwi->Delete(expected[
|
|
3809
|
+
ASSERT_OK(wbwi->Delete(expected[idx].first));
|
|
3567
3810
|
}
|
|
3568
3811
|
}
|
|
3569
3812
|
found_final_value = false;
|
|
3570
|
-
ASSERT_TRUE(expected[
|
|
3571
|
-
|
|
3813
|
+
ASSERT_TRUE(expected[idx].second == Get(expected[idx].first, wbwi_mem,
|
|
3814
|
+
visible_seq, &found_final_value));
|
|
3572
3815
|
ASSERT_TRUE(found_final_value);
|
|
3816
|
+
// See comment for WBWIMemTable for sequence number assignment method.
|
|
3817
|
+
expected_seqno[idx]++;
|
|
3573
3818
|
}
|
|
3574
3819
|
// Get a non-existing key
|
|
3575
3820
|
found_final_value = false;
|
|
@@ -3584,7 +3829,6 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3584
3829
|
&found_final_value));
|
|
3585
3830
|
ASSERT_FALSE(found_final_value);
|
|
3586
3831
|
// Get existing keys
|
|
3587
|
-
RandomShuffle(expected.begin(), expected.end());
|
|
3588
3832
|
for (const auto& [key, val] : expected) {
|
|
3589
3833
|
found_final_value = false;
|
|
3590
3834
|
ASSERT_TRUE(val == Get(key, wbwi_mem, visible_seq, &found_final_value));
|
|
@@ -3643,12 +3887,6 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3643
3887
|
}
|
|
3644
3888
|
}
|
|
3645
3889
|
|
|
3646
|
-
// Sort keys to compare with iterator
|
|
3647
|
-
std::sort(expected.begin(), expected.end(),
|
|
3648
|
-
[](const std::pair<std::string, std::string>& a,
|
|
3649
|
-
const std::pair<std::string, std::string>& b) {
|
|
3650
|
-
return a.first < b.first;
|
|
3651
|
-
});
|
|
3652
3890
|
Arena arena;
|
|
3653
3891
|
InternalIterator* iter = wbwi_mem->NewIterator(
|
|
3654
3892
|
ReadOptions(), /*seqno_to_time_mapping=*/nullptr, &arena,
|
|
@@ -3664,7 +3902,7 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
|
|
|
3664
3902
|
ValueType val_type;
|
|
3665
3903
|
UnPackSequenceAndType(ExtractInternalKeyFooter(iter->key()), &seq,
|
|
3666
3904
|
&val_type);
|
|
3667
|
-
ASSERT_EQ(seq,
|
|
3905
|
+
ASSERT_EQ(seq, expected_seqno[idx]);
|
|
3668
3906
|
if (expected[idx].second == "NOT_FOUND") {
|
|
3669
3907
|
ASSERT_TRUE(val_type == kTypeDeletion || val_type == kTypeSingleDeletion);
|
|
3670
3908
|
} else {
|
|
@@ -3759,15 +3997,19 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
|
|
|
3759
3997
|
|
|
3760
3998
|
auto wbwi = std::make_shared<WriteBatchWithIndex>(
|
|
3761
3999
|
cmp, 0, /*overwrite_key=*/true, 0, 0);
|
|
3762
|
-
wbwi->SetTrackPerCFStat(true);
|
|
3763
4000
|
|
|
3764
4001
|
ASSERT_OK(wbwi->Put(DBTestBase::Key(0), "val0"));
|
|
3765
4002
|
ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(0)));
|
|
3766
4003
|
ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(1)));
|
|
3767
4004
|
ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(2)));
|
|
3768
|
-
ASSERT_OK(wbwi->Put(DBTestBase::Key(3), "val3"));
|
|
3769
4005
|
// SD at key1 overwritten
|
|
3770
4006
|
ASSERT_OK(wbwi->Put(DBTestBase::Key(1), "val1"));
|
|
4007
|
+
// For key3, most recent update is SD, and a SD is overwritten,
|
|
4008
|
+
// here we test that these two SD get assigned different seqnos.
|
|
4009
|
+
// FIXME: ideally we should only emit at most one SD per key.
|
|
4010
|
+
ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(3)));
|
|
4011
|
+
ASSERT_OK(wbwi->Put(DBTestBase::Key(3), "val3"));
|
|
4012
|
+
ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(3)));
|
|
3771
4013
|
|
|
3772
4014
|
std::unique_ptr<WBWIMemTable> wbwi_mem{
|
|
3773
4015
|
new WBWIMemTable(wbwi, cmp,
|
|
@@ -3790,16 +4032,23 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
|
|
|
3790
4032
|
ASSERT_TRUE(iter_for_flush->Valid());
|
|
3791
4033
|
ASSERT_EQ(iter->key(), iter_for_flush->key());
|
|
3792
4034
|
|
|
3793
|
-
|
|
3794
|
-
|
|
3795
|
-
|
|
3796
|
-
|
|
4035
|
+
if (i == 1 || i == 3) {
|
|
4036
|
+
// Most recent update should have a higher seqno than the overwritten SD
|
|
4037
|
+
SequenceNumber current_seq;
|
|
4038
|
+
ValueType _;
|
|
4039
|
+
UnPackSequenceAndType(ExtractInternalKeyFooter(iter->key()), ¤t_seq,
|
|
4040
|
+
&_);
|
|
4041
|
+
ASSERT_GT(current_seq, assigned_seqno.lower_bound);
|
|
4042
|
+
|
|
4043
|
+
iter_for_flush->Next();
|
|
4044
|
+
// overwritten SD at key1 and key3
|
|
3797
4045
|
// See WBWIMemTableIterator::UpdateSingleDeleteKey() for seqno assignment
|
|
3798
|
-
InternalKey ikey(DBTestBase::Key(
|
|
4046
|
+
InternalKey ikey(DBTestBase::Key(i), assigned_seqno.lower_bound,
|
|
3799
4047
|
kTypeSingleDeletion);
|
|
3800
4048
|
ASSERT_EQ(ikey.Encode(), iter_for_flush->key());
|
|
3801
|
-
iter_for_flush->Next();
|
|
3802
4049
|
}
|
|
4050
|
+
iter->Next();
|
|
4051
|
+
iter_for_flush->Next();
|
|
3803
4052
|
}
|
|
3804
4053
|
ASSERT_FALSE(iter->Valid());
|
|
3805
4054
|
ASSERT_FALSE(iter_for_flush->Valid());
|
|
@@ -3808,6 +4057,176 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
|
|
|
3808
4057
|
iter->~InternalIterator();
|
|
3809
4058
|
iter_for_flush->~InternalIteratorBase();
|
|
3810
4059
|
}
|
|
4060
|
+
|
|
4061
|
+
void VerifyIterator(
|
|
4062
|
+
InternalIterator* iter,
|
|
4063
|
+
const std::vector<std::pair<std::string, std::string>>& expected) {
|
|
4064
|
+
// Verify SeekToFirst and Next
|
|
4065
|
+
iter->SeekToFirst();
|
|
4066
|
+
auto k = expected.begin();
|
|
4067
|
+
while (iter->Valid()) {
|
|
4068
|
+
ASSERT_TRUE(iter->Valid());
|
|
4069
|
+
ASSERT_OK(iter->status());
|
|
4070
|
+
|
|
4071
|
+
ASSERT_EQ(iter->key(), k->first);
|
|
4072
|
+
ASSERT_EQ(iter->value(), k->second);
|
|
4073
|
+
|
|
4074
|
+
iter->Next();
|
|
4075
|
+
++k;
|
|
4076
|
+
}
|
|
4077
|
+
ASSERT_OK(iter->status());
|
|
4078
|
+
ASSERT_TRUE(k == expected.end());
|
|
4079
|
+
|
|
4080
|
+
// Verify SeekToLast and Prev
|
|
4081
|
+
iter->SeekToLast();
|
|
4082
|
+
k = expected.end();
|
|
4083
|
+
while (iter->Valid()) {
|
|
4084
|
+
--k;
|
|
4085
|
+
ASSERT_TRUE(iter->Valid());
|
|
4086
|
+
ASSERT_OK(iter->status());
|
|
4087
|
+
|
|
4088
|
+
ASSERT_EQ(iter->key(), k->first);
|
|
4089
|
+
ASSERT_EQ(iter->value(), k->second);
|
|
4090
|
+
|
|
4091
|
+
iter->Prev();
|
|
4092
|
+
}
|
|
4093
|
+
ASSERT_OK(iter->status());
|
|
4094
|
+
ASSERT_TRUE(k == expected.begin());
|
|
4095
|
+
|
|
4096
|
+
// Verify Seek and SeekForPrev
|
|
4097
|
+
for (auto exp = expected.begin(); exp != expected.end(); ++exp) {
|
|
4098
|
+
iter->Seek(exp->first);
|
|
4099
|
+
ASSERT_TRUE(iter->Valid());
|
|
4100
|
+
ASSERT_OK(iter->status());
|
|
4101
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4102
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4103
|
+
|
|
4104
|
+
iter->Next();
|
|
4105
|
+
if (iter->Valid()) {
|
|
4106
|
+
ASSERT_OK(iter->status());
|
|
4107
|
+
++exp;
|
|
4108
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4109
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4110
|
+
iter->Prev();
|
|
4111
|
+
--exp;
|
|
4112
|
+
ASSERT_TRUE(iter->Valid());
|
|
4113
|
+
ASSERT_OK(iter->status());
|
|
4114
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4115
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4116
|
+
} else {
|
|
4117
|
+
iter->SeekToLast();
|
|
4118
|
+
}
|
|
4119
|
+
|
|
4120
|
+
iter->SeekForPrev(exp->first);
|
|
4121
|
+
ASSERT_TRUE(iter->Valid());
|
|
4122
|
+
ASSERT_OK(iter->status());
|
|
4123
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4124
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4125
|
+
|
|
4126
|
+
iter->Prev();
|
|
4127
|
+
if (iter->Valid()) {
|
|
4128
|
+
ASSERT_OK(iter->status());
|
|
4129
|
+
--exp;
|
|
4130
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4131
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4132
|
+
iter->Next();
|
|
4133
|
+
++exp;
|
|
4134
|
+
ASSERT_TRUE(iter->Valid());
|
|
4135
|
+
ASSERT_OK(iter->status());
|
|
4136
|
+
ASSERT_EQ(iter->key(), exp->first);
|
|
4137
|
+
ASSERT_EQ(iter->value(), exp->second);
|
|
4138
|
+
} else {
|
|
4139
|
+
iter->SeekToFirst();
|
|
4140
|
+
}
|
|
4141
|
+
}
|
|
4142
|
+
}
|
|
4143
|
+
|
|
4144
|
+
TEST_F(WBWIMemTableTest, WBWIMemTableWithMerge) {
|
|
4145
|
+
const Comparator* cmp = BytewiseComparator();
|
|
4146
|
+
Options opts;
|
|
4147
|
+
opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
|
|
4148
|
+
ImmutableOptions immutable_opts(opts);
|
|
4149
|
+
MutableCFOptions mutable_cf_options(opts);
|
|
4150
|
+
|
|
4151
|
+
auto wbwi = std::make_shared<WriteBatchWithIndex>(
|
|
4152
|
+
cmp, 0, /*overwrite_key=*/true, 0, 0);
|
|
4153
|
+
std::unique_ptr<WBWIMemTable> wbwi_mem{
|
|
4154
|
+
new WBWIMemTable(wbwi, cmp,
|
|
4155
|
+
/*cf_id=*/0, &immutable_opts, &mutable_cf_options,
|
|
4156
|
+
// stats is inaccurate but read path should still work
|
|
4157
|
+
/*stat=*/{})};
|
|
4158
|
+
ASSERT_TRUE(wbwi_mem->IsEmpty());
|
|
4159
|
+
constexpr SequenceNumber seqno_lb = 10;
|
|
4160
|
+
constexpr SequenceNumber seqno_ub = 100;
|
|
4161
|
+
constexpr WBWIMemTable::SeqnoRange assigned_seq = {seqno_lb, seqno_ub};
|
|
4162
|
+
wbwi_mem->AssignSequenceNumbers(assigned_seq);
|
|
4163
|
+
|
|
4164
|
+
// Update then Merge
|
|
4165
|
+
ASSERT_OK(wbwi->Put("a", "a1"));
|
|
4166
|
+
ASSERT_OK(wbwi->Merge("a", "a2"));
|
|
4167
|
+
ASSERT_OK(wbwi->Merge("a", "a3"));
|
|
4168
|
+
ASSERT_OK(wbwi->Delete("b"));
|
|
4169
|
+
ASSERT_OK(wbwi->Merge("b", "b1"));
|
|
4170
|
+
|
|
4171
|
+
// Merge then Update
|
|
4172
|
+
ASSERT_OK(wbwi->Merge("c", "c1"));
|
|
4173
|
+
ASSERT_OK(wbwi->Put("c", "c2"));
|
|
4174
|
+
ASSERT_OK(wbwi->Merge("d", "d1"));
|
|
4175
|
+
ASSERT_OK(wbwi->Merge("d", "d2"));
|
|
4176
|
+
ASSERT_OK(wbwi->Delete("d"));
|
|
4177
|
+
|
|
4178
|
+
// Just Merge
|
|
4179
|
+
ASSERT_OK(wbwi->Merge("e", "e1"));
|
|
4180
|
+
ASSERT_OK(wbwi->Merge("f", "f1"));
|
|
4181
|
+
ASSERT_OK(wbwi->Merge("f", "f2"));
|
|
4182
|
+
|
|
4183
|
+
// Just Update
|
|
4184
|
+
ASSERT_OK(wbwi->SingleDelete("g"));
|
|
4185
|
+
|
|
4186
|
+
// key <-> val
|
|
4187
|
+
// Refer to the sequence number assignment method described in the comments
|
|
4188
|
+
// above the WBWIMemTable class.
|
|
4189
|
+
std::vector<std::pair<std::string, std::string>> expected = {
|
|
4190
|
+
{InternalKey("a", seqno_lb + 2, kTypeMerge).Encode().ToString(), "a3"},
|
|
4191
|
+
{InternalKey("a", seqno_lb + 1, kTypeMerge).Encode().ToString(), "a2"},
|
|
4192
|
+
{InternalKey("a", seqno_lb, kTypeValue).Encode().ToString(), "a1"},
|
|
4193
|
+
{InternalKey("b", seqno_lb + 1, kTypeMerge).Encode().ToString(), "b1"},
|
|
4194
|
+
{InternalKey("b", seqno_lb, kTypeDeletion).Encode().ToString(), ""},
|
|
4195
|
+
{InternalKey("c", seqno_lb + 1, kTypeValue).Encode().ToString(), "c2"},
|
|
4196
|
+
{InternalKey("d", seqno_lb + 2, kTypeDeletion).Encode().ToString(), ""},
|
|
4197
|
+
{InternalKey("d", seqno_lb, kTypeMerge).Encode().ToString(), "d1"},
|
|
4198
|
+
{InternalKey("e", seqno_lb, kTypeMerge).Encode().ToString(), "e1"},
|
|
4199
|
+
{InternalKey("f", seqno_lb + 1, kTypeMerge).Encode().ToString(), "f2"},
|
|
4200
|
+
{InternalKey("f", seqno_lb, kTypeMerge).Encode().ToString(), "f1"},
|
|
4201
|
+
{InternalKey("g", seqno_lb, kTypeSingleDeletion).Encode().ToString(), ""},
|
|
4202
|
+
};
|
|
4203
|
+
|
|
4204
|
+
Arena arena;
|
|
4205
|
+
InternalIterator* iter = wbwi_mem->NewIterator(
|
|
4206
|
+
ReadOptions(), /*seqno_to_time_mapping=*/nullptr, &arena,
|
|
4207
|
+
/*prefix_extractor=*/nullptr, /*for_flush=*/false);
|
|
4208
|
+
VerifyIterator(iter, expected);
|
|
4209
|
+
iter->~InternalIterator();
|
|
4210
|
+
|
|
4211
|
+
// Test Get
|
|
4212
|
+
bool found_final_value = false;
|
|
4213
|
+
ASSERT_EQ("a1,a2,a3", Get("a", wbwi_mem, seqno_ub, &found_final_value));
|
|
4214
|
+
ASSERT_EQ("b1", Get("b", wbwi_mem, seqno_ub, &found_final_value));
|
|
4215
|
+
ASSERT_EQ("c2", Get("c", wbwi_mem, seqno_ub, &found_final_value));
|
|
4216
|
+
ASSERT_EQ("NOT_FOUND", Get("d", wbwi_mem, seqno_ub, &found_final_value));
|
|
4217
|
+
MergeContext merge_context;
|
|
4218
|
+
ASSERT_EQ(Status::MergeInProgress().ToString(),
|
|
4219
|
+
Get("e", wbwi_mem, seqno_ub, &found_final_value, &merge_context));
|
|
4220
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 1);
|
|
4221
|
+
ASSERT_EQ(merge_context.GetOperand(0), "e1");
|
|
4222
|
+
merge_context.Clear();
|
|
4223
|
+
ASSERT_EQ(Status::MergeInProgress().ToString(),
|
|
4224
|
+
Get("f", wbwi_mem, seqno_ub, &found_final_value, &merge_context));
|
|
4225
|
+
ASSERT_EQ(merge_context.GetNumOperands(), 2);
|
|
4226
|
+
ASSERT_EQ(merge_context.GetOperand(0), "f1");
|
|
4227
|
+
ASSERT_EQ(merge_context.GetOperand(1), "f2");
|
|
4228
|
+
ASSERT_EQ("NOT_FOUND", Get("g", wbwi_mem, seqno_ub, &found_final_value));
|
|
4229
|
+
}
|
|
3811
4230
|
} // namespace ROCKSDB_NAMESPACE
|
|
3812
4231
|
|
|
3813
4232
|
int main(int argc, char** argv) {
|