@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
|
@@ -62,23 +62,37 @@ class WBWIIterator {
|
|
|
62
62
|
|
|
63
63
|
virtual void SeekToLast() = 0;
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
// Move to the first entry with key >= target.
|
|
66
|
+
// If there are multiple updates to the same key, the most recent update is
|
|
67
|
+
// ordered first. If `overwrite_key` is true for this WBWI, this should only
|
|
68
|
+
// affect iterator output if the write batch contains Merge.
|
|
69
|
+
virtual void Seek(const Slice& target) = 0;
|
|
66
70
|
|
|
67
|
-
|
|
71
|
+
// Move to the last entry with key <= target.
|
|
72
|
+
// If there are multiple updates to the same key, this will move iterator
|
|
73
|
+
// to the last entry, which is the oldest update.
|
|
74
|
+
virtual void SeekForPrev(const Slice& target) = 0;
|
|
68
75
|
|
|
69
76
|
virtual void Next() = 0;
|
|
70
77
|
|
|
71
78
|
virtual void Prev() = 0;
|
|
72
79
|
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
virtual Status status() const = 0;
|
|
81
|
+
|
|
82
|
+
// The returned WriteEntry is only valid until the next mutation of
|
|
83
|
+
// WriteBatchWithIndex.
|
|
75
84
|
virtual WriteEntry Entry() const = 0;
|
|
76
85
|
|
|
77
86
|
// For this user key, there is a single delete in this write batch,
|
|
78
87
|
// and it was overwritten by another update.
|
|
79
88
|
virtual bool HasOverWrittenSingleDel() const { return false; }
|
|
80
89
|
|
|
81
|
-
|
|
90
|
+
// Returns n where the current entry is the n-th update to the current key.
|
|
91
|
+
// The update count starts from 1.
|
|
92
|
+
// Only valid if WBWI is created with overwrite_key = true.
|
|
93
|
+
// With overwrite_key=false, update count for each entry is not maintained,
|
|
94
|
+
// see UpdateExistingEntryWithCfId().
|
|
95
|
+
virtual uint32_t GetUpdateCount() const { return 0; }
|
|
82
96
|
};
|
|
83
97
|
|
|
84
98
|
// A WriteBatchWithIndex with a binary searchable index built for all the keys
|
|
@@ -87,6 +101,8 @@ class WBWIIterator {
|
|
|
87
101
|
// time, indexes will be built. By calling GetWriteBatch(), a user will get the
|
|
88
102
|
// WriteBatch for the data they inserted, which can be used for DB::Write(). A
|
|
89
103
|
// user can call NewIterator() to create an iterator.
|
|
104
|
+
// If there are multiple updates to the same key, the most recent update is
|
|
105
|
+
// ordered first (i.e. the iterator will return the most recent update first).
|
|
90
106
|
class WriteBatchWithIndex : public WriteBatchBase {
|
|
91
107
|
public:
|
|
92
108
|
// backup_index_comparator: the backup comparator used to compare keys
|
|
@@ -98,6 +114,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
|
|
|
98
114
|
// overwrite_key: if true, overwrite the key in the index when inserting
|
|
99
115
|
// the same key as previously, so iterator will never
|
|
100
116
|
// show two entries with the same key.
|
|
117
|
+
// Note that for Merge, it's added as a new update instead
|
|
118
|
+
// of overwriting the existing one.
|
|
101
119
|
explicit WriteBatchWithIndex(
|
|
102
120
|
const Comparator* backup_index_comparator = BytewiseComparator(),
|
|
103
121
|
size_t reserved_bytes = 0, bool overwrite_key = false,
|
|
@@ -195,8 +213,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
|
|
|
195
213
|
// if overwrite_key=false, then each update will be returned as a separate
|
|
196
214
|
// entry, in the order of update time.
|
|
197
215
|
// if overwrite_key=true, then one entry per key will be returned. Merge
|
|
198
|
-
// updates on the same key will be returned as separate entries
|
|
199
|
-
//
|
|
216
|
+
// updates on the same key will be returned as separate entries, with most
|
|
217
|
+
// recent update ordered first.
|
|
200
218
|
// The returned iterator should be deleted by the caller.
|
|
201
219
|
WBWIIterator* NewIterator(ColumnFamilyHandle* column_family);
|
|
202
220
|
// Create an iterator of the default column family.
|
|
@@ -218,7 +236,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
|
|
|
218
236
|
Iterator* base_iterator,
|
|
219
237
|
const ReadOptions* opts = nullptr);
|
|
220
238
|
// default column family
|
|
221
|
-
Iterator* NewIteratorWithBase(Iterator* base_iterator
|
|
239
|
+
Iterator* NewIteratorWithBase(Iterator* base_iterator,
|
|
240
|
+
const ReadOptions* opts = nullptr);
|
|
222
241
|
|
|
223
242
|
// Similar to DB::Get() but will only read the key from this batch.
|
|
224
243
|
// If the batch does not have enough data to resolve Merge operations,
|
|
@@ -229,7 +248,7 @@ class WriteBatchWithIndex : public WriteBatchBase {
|
|
|
229
248
|
|
|
230
249
|
// Similar to previous function but does not require a column_family.
|
|
231
250
|
// Note: An InvalidArgument status will be returned if there are any Merge
|
|
232
|
-
// operators for this key.
|
|
251
|
+
// operators for this key. Use previous method instead.
|
|
233
252
|
Status GetFromBatch(const DBOptions& options, const Slice& key,
|
|
234
253
|
std::string* value) {
|
|
235
254
|
return GetFromBatch(nullptr, options, key, value);
|
|
@@ -358,9 +377,6 @@ class WriteBatchWithIndex : public WriteBatchBase {
|
|
|
358
377
|
uint32_t entry_count = 0;
|
|
359
378
|
uint32_t overwritten_sd_count = 0;
|
|
360
379
|
};
|
|
361
|
-
// Will track CF ID, per CF entry count and overwritten sd count.
|
|
362
|
-
// Should be enabled when WBWI is empty for correct tracking.
|
|
363
|
-
void SetTrackPerCFStat(bool track);
|
|
364
380
|
const std::unordered_map<uint32_t, CFStat>& GetCFStats() const;
|
|
365
381
|
|
|
366
382
|
bool GetOverwriteKey() const;
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
// NOTE: in 'main' development branch, this should be the *next*
|
|
13
13
|
// minor or major version number planned for release.
|
|
14
|
-
#define ROCKSDB_MAJOR
|
|
15
|
-
#define ROCKSDB_MINOR
|
|
16
|
-
#define ROCKSDB_PATCH
|
|
14
|
+
#define ROCKSDB_MAJOR 10
|
|
15
|
+
#define ROCKSDB_MINOR 4
|
|
16
|
+
#define ROCKSDB_PATCH 2
|
|
17
17
|
|
|
18
18
|
// Do not use these. We made the mistake of declaring macros starting with
|
|
19
19
|
// double underscore. Now we have to live with our choice. We'll deprecate these
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
// (found in the LICENSE.Apache file in the root directory).
|
|
5
5
|
//
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
#include "logging/auto_roll_logger.h"
|
|
9
8
|
|
|
10
9
|
#include <sys/stat.h>
|
|
@@ -728,4 +727,3 @@ int main(int argc, char** argv) {
|
|
|
728
727
|
::testing::InitGoogleTest(&argc, argv);
|
|
729
728
|
return RUN_ALL_TESTS();
|
|
730
729
|
}
|
|
731
|
-
|
|
@@ -28,8 +28,7 @@ class StringLogger : public Logger {
|
|
|
28
28
|
TEST_F(EventLoggerTest, SimpleTest) {
|
|
29
29
|
StringLogger logger;
|
|
30
30
|
EventLogger event_logger(&logger);
|
|
31
|
-
event_logger.Log() << "id" << 5 << "event"
|
|
32
|
-
<< "just_testing";
|
|
31
|
+
event_logger.Log() << "id" << 5 << "event" << "just_testing";
|
|
33
32
|
std::string output(logger.buffer());
|
|
34
33
|
ASSERT_TRUE(output.find("\"event\": \"just_testing\"") != std::string::npos);
|
|
35
34
|
ASSERT_TRUE(output.find("\"id\": 5") != std::string::npos);
|
|
@@ -31,7 +31,7 @@ using CacheAllocationPtr = std::unique_ptr<char[], CustomDeleter>;
|
|
|
31
31
|
inline CacheAllocationPtr AllocateBlock(size_t size,
|
|
32
32
|
MemoryAllocator* allocator) {
|
|
33
33
|
if (allocator) {
|
|
34
|
-
auto block =
|
|
34
|
+
auto block = static_cast<char*>(allocator->Allocate(size));
|
|
35
35
|
return CacheAllocationPtr(block, allocator);
|
|
36
36
|
}
|
|
37
37
|
return CacheAllocationPtr(new char[size]);
|
|
@@ -134,8 +134,8 @@ class SkipList {
|
|
|
134
134
|
// i up to max_height_ is the predecessor of prev_[0] and prev_height_
|
|
135
135
|
// is the height of prev_[0]. prev_[0] can only be equal to head before
|
|
136
136
|
// insertion, in which case max_height_ and prev_height_ are 1.
|
|
137
|
-
Node** prev_;
|
|
138
137
|
int32_t prev_height_;
|
|
138
|
+
Node** prev_;
|
|
139
139
|
|
|
140
140
|
inline int GetMaxHeight() const {
|
|
141
141
|
return max_height_.load(std::memory_order_relaxed);
|
|
@@ -438,7 +438,7 @@ SkipList<Key, Comparator>::SkipList(const Comparator cmp, Allocator* allocator,
|
|
|
438
438
|
kScaledInverseBranching_((Random::kMaxNext + 1) / kBranching_),
|
|
439
439
|
compare_(cmp),
|
|
440
440
|
allocator_(allocator),
|
|
441
|
-
head_(NewNode(
|
|
441
|
+
head_(NewNode({} /* any key will do */, max_height)),
|
|
442
442
|
max_height_(1),
|
|
443
443
|
prev_height_(1) {
|
|
444
444
|
assert(max_height > 0 && kMaxHeight_ == static_cast<uint32_t>(max_height));
|
|
@@ -366,13 +366,11 @@ class SkipListRep : public MemTableRep {
|
|
|
366
366
|
if (lookahead_ > 0) {
|
|
367
367
|
void* mem =
|
|
368
368
|
arena ? arena->AllocateAligned(sizeof(SkipListRep::LookaheadIterator))
|
|
369
|
-
:
|
|
370
|
-
operator new(sizeof(SkipListRep::LookaheadIterator));
|
|
369
|
+
: operator new(sizeof(SkipListRep::LookaheadIterator));
|
|
371
370
|
return new (mem) SkipListRep::LookaheadIterator(*this);
|
|
372
371
|
} else {
|
|
373
372
|
void* mem = arena ? arena->AllocateAligned(sizeof(SkipListRep::Iterator))
|
|
374
|
-
:
|
|
375
|
-
operator new(sizeof(SkipListRep::Iterator));
|
|
373
|
+
: operator new(sizeof(SkipListRep::Iterator));
|
|
376
374
|
return new (mem) SkipListRep::Iterator(&skip_list_);
|
|
377
375
|
}
|
|
378
376
|
}
|
|
@@ -30,6 +30,8 @@ class VectorRep : public MemTableRep {
|
|
|
30
30
|
// collection.
|
|
31
31
|
void Insert(KeyHandle handle) override;
|
|
32
32
|
|
|
33
|
+
void InsertConcurrently(KeyHandle handle) override;
|
|
34
|
+
|
|
33
35
|
// Returns true iff an entry that compares equal to key is in the collection.
|
|
34
36
|
bool Contains(const char* key) const override;
|
|
35
37
|
|
|
@@ -40,6 +42,8 @@ class VectorRep : public MemTableRep {
|
|
|
40
42
|
void Get(const LookupKey& k, void* callback_args,
|
|
41
43
|
bool (*callback_func)(void* arg, const char* entry)) override;
|
|
42
44
|
|
|
45
|
+
void BatchPostProcess() override;
|
|
46
|
+
|
|
43
47
|
~VectorRep() override = default;
|
|
44
48
|
|
|
45
49
|
class Iterator : public MemTableRep::Iterator {
|
|
@@ -79,6 +83,10 @@ class VectorRep : public MemTableRep {
|
|
|
79
83
|
// Advance to the first entry with a key >= target
|
|
80
84
|
void Seek(const Slice& user_key, const char* memtable_key) override;
|
|
81
85
|
|
|
86
|
+
// Seek and do some memory validation
|
|
87
|
+
Status SeekAndValidate(const Slice& internal_key, const char* memtable_key,
|
|
88
|
+
bool allow_data_in_errors) override;
|
|
89
|
+
|
|
82
90
|
// Advance to the first entry with a key <= target
|
|
83
91
|
void SeekForPrev(const Slice& user_key, const char* memtable_key) override;
|
|
84
92
|
|
|
@@ -96,19 +104,40 @@ class VectorRep : public MemTableRep {
|
|
|
96
104
|
|
|
97
105
|
private:
|
|
98
106
|
friend class Iterator;
|
|
107
|
+
ALIGN_AS(CACHE_LINE_SIZE) RelaxedAtomic<size_t> bucket_size_;
|
|
99
108
|
using Bucket = std::vector<const char*>;
|
|
100
109
|
std::shared_ptr<Bucket> bucket_;
|
|
101
110
|
mutable port::RWMutex rwlock_;
|
|
102
111
|
bool immutable_;
|
|
103
112
|
bool sorted_;
|
|
104
113
|
const KeyComparator& compare_;
|
|
114
|
+
// Thread-local vector to buffer concurrent writes.
|
|
115
|
+
using TlBucket = std::vector<const char*>;
|
|
116
|
+
ThreadLocalPtr tl_writes_;
|
|
117
|
+
|
|
118
|
+
static void DeleteTlBucket(void* ptr) {
|
|
119
|
+
auto* v = static_cast<TlBucket*>(ptr);
|
|
120
|
+
delete v;
|
|
121
|
+
}
|
|
105
122
|
};
|
|
106
123
|
|
|
107
124
|
void VectorRep::Insert(KeyHandle handle) {
|
|
108
125
|
auto* key = static_cast<char*>(handle);
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
{
|
|
127
|
+
WriteLock l(&rwlock_);
|
|
128
|
+
assert(!immutable_);
|
|
129
|
+
bucket_->push_back(key);
|
|
130
|
+
}
|
|
131
|
+
bucket_size_.FetchAddRelaxed(1);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void VectorRep::InsertConcurrently(KeyHandle handle) {
|
|
135
|
+
auto* v = static_cast<TlBucket*>(tl_writes_.Get());
|
|
136
|
+
if (!v) {
|
|
137
|
+
v = new TlBucket();
|
|
138
|
+
tl_writes_.Reset(v);
|
|
139
|
+
}
|
|
140
|
+
v->push_back(static_cast<char*>(handle));
|
|
112
141
|
}
|
|
113
142
|
|
|
114
143
|
// Returns true iff an entry that compares equal to key is in the collection.
|
|
@@ -123,19 +152,35 @@ void VectorRep::MarkReadOnly() {
|
|
|
123
152
|
}
|
|
124
153
|
|
|
125
154
|
size_t VectorRep::ApproximateMemoryUsage() {
|
|
126
|
-
return
|
|
127
|
-
bucket_
|
|
128
|
-
|
|
129
|
-
|
|
155
|
+
return bucket_size_.LoadRelaxed() *
|
|
156
|
+
sizeof(std::remove_reference<decltype(*bucket_)>::type::value_type);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
void VectorRep::BatchPostProcess() {
|
|
160
|
+
auto* v = static_cast<TlBucket*>(tl_writes_.Get());
|
|
161
|
+
if (v) {
|
|
162
|
+
{
|
|
163
|
+
WriteLock l(&rwlock_);
|
|
164
|
+
assert(!immutable_);
|
|
165
|
+
for (auto& key : *v) {
|
|
166
|
+
bucket_->push_back(key);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
bucket_size_.FetchAddRelaxed(v->size());
|
|
170
|
+
delete v;
|
|
171
|
+
tl_writes_.Reset(nullptr);
|
|
172
|
+
}
|
|
130
173
|
}
|
|
131
174
|
|
|
132
175
|
VectorRep::VectorRep(const KeyComparator& compare, Allocator* allocator,
|
|
133
176
|
size_t count)
|
|
134
177
|
: MemTableRep(allocator),
|
|
178
|
+
bucket_size_(0),
|
|
135
179
|
bucket_(new Bucket()),
|
|
136
180
|
immutable_(false),
|
|
137
181
|
sorted_(false),
|
|
138
|
-
compare_(compare)
|
|
182
|
+
compare_(compare),
|
|
183
|
+
tl_writes_(DeleteTlBucket) {
|
|
139
184
|
bucket_.get()->reserve(count);
|
|
140
185
|
}
|
|
141
186
|
|
|
@@ -221,6 +266,22 @@ void VectorRep::Iterator::Seek(const Slice& user_key,
|
|
|
221
266
|
.first;
|
|
222
267
|
}
|
|
223
268
|
|
|
269
|
+
Status VectorRep::Iterator::SeekAndValidate(const Slice& /* internal_key */,
|
|
270
|
+
const char* /* memtable_key */,
|
|
271
|
+
bool /* allow_data_in_errors */) {
|
|
272
|
+
if (vrep_) {
|
|
273
|
+
WriteLock l(&vrep_->rwlock_);
|
|
274
|
+
if (bucket_->begin() == bucket_->end()) {
|
|
275
|
+
// Memtable is empty
|
|
276
|
+
return Status::OK();
|
|
277
|
+
} else {
|
|
278
|
+
return Status::NotSupported("SeekAndValidate() not implemented");
|
|
279
|
+
}
|
|
280
|
+
} else {
|
|
281
|
+
return Status::NotSupported("SeekAndValidate() not implemented");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
224
285
|
// Advance to the first entry with a key <= target
|
|
225
286
|
void VectorRep::Iterator::SeekForPrev(const Slice& /*user_key*/,
|
|
226
287
|
const char* /*memtable_key*/) {
|
|
@@ -49,22 +49,29 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
49
49
|
SequenceNumber* out_seq, const ReadOptions&,
|
|
50
50
|
bool immutable_memtable, ReadCallback* callback,
|
|
51
51
|
bool* is_blob_index, bool do_merge) {
|
|
52
|
+
assert(s->ok() || s->IsMergeInProgress());
|
|
52
53
|
(void)immutable_memtable;
|
|
53
54
|
(void)timestamp;
|
|
54
55
|
(void)columns;
|
|
55
56
|
assert(immutable_memtable);
|
|
56
57
|
assert(!timestamp); // TODO: support UDT
|
|
57
|
-
assert(!columns); // TODO: support WideColumn
|
|
58
58
|
assert(assigned_seqno_.upper_bound != kMaxSequenceNumber);
|
|
59
59
|
assert(assigned_seqno_.lower_bound != kMaxSequenceNumber);
|
|
60
60
|
// WBWI does not support DeleteRange yet.
|
|
61
61
|
assert(!wbwi_->GetWriteBatch()->HasDeleteRange());
|
|
62
|
+
assert(merge_context);
|
|
62
63
|
|
|
64
|
+
*out_seq = kMaxSequenceNumber;
|
|
63
65
|
[[maybe_unused]] SequenceNumber read_seq =
|
|
64
66
|
GetInternalKeySeqno(key.internal_key());
|
|
67
|
+
// This is memtable is a single write batch, no snapshot can be taken within
|
|
68
|
+
// assigned seqnos for this memtable.
|
|
69
|
+
assert(read_seq >= assigned_seqno_.upper_bound ||
|
|
70
|
+
read_seq < assigned_seqno_.lower_bound);
|
|
65
71
|
std::unique_ptr<InternalIterator> iter{NewIterator()};
|
|
66
72
|
iter->Seek(key.internal_key());
|
|
67
73
|
const Slice lookup_user_key = key.user_key();
|
|
74
|
+
bool merge_in_progress = s->IsMergeInProgress();
|
|
68
75
|
|
|
69
76
|
while (iter->Valid() && comparator_->EqualWithoutTimestamp(
|
|
70
77
|
ExtractUserKey(iter->key()), lookup_user_key)) {
|
|
@@ -77,7 +84,6 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
77
84
|
assert(type != kTypeWideColumnEntity);
|
|
78
85
|
assert(type != kTypeValuePreferredSeqno);
|
|
79
86
|
assert(type != kTypeDeletionWithTimestamp);
|
|
80
|
-
assert(type != kTypeMerge);
|
|
81
87
|
if (!callback || callback->IsVisible(seq)) {
|
|
82
88
|
if (*out_seq == kMaxSequenceNumber) {
|
|
83
89
|
*out_seq = std::max(seq, *max_covering_tombstone_seq);
|
|
@@ -88,7 +94,7 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
88
94
|
switch (type) {
|
|
89
95
|
case kTypeValue: {
|
|
90
96
|
HandleTypeValue(lookup_user_key, iter->value(), iter->IsValuePinned(),
|
|
91
|
-
do_merge,
|
|
97
|
+
do_merge, merge_in_progress, merge_context,
|
|
92
98
|
moptions_.merge_operator, clock_,
|
|
93
99
|
moptions_.statistics, moptions_.info_log, s, value,
|
|
94
100
|
columns, is_blob_index);
|
|
@@ -98,16 +104,29 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
98
104
|
case kTypeDeletion:
|
|
99
105
|
case kTypeSingleDeletion:
|
|
100
106
|
case kTypeRangeDeletion: {
|
|
101
|
-
HandleTypeDeletion(lookup_user_key,
|
|
102
|
-
|
|
107
|
+
HandleTypeDeletion(lookup_user_key, merge_in_progress, merge_context,
|
|
108
|
+
moptions_.merge_operator, clock_,
|
|
103
109
|
moptions_.statistics, moptions_.info_log, s, value,
|
|
104
110
|
columns);
|
|
105
111
|
assert(seq <= read_seq);
|
|
106
112
|
return /*found_final_value=*/true;
|
|
107
113
|
}
|
|
114
|
+
case kTypeMerge: {
|
|
115
|
+
merge_in_progress = true;
|
|
116
|
+
if (ReadOnlyMemTable::HandleTypeMerge(
|
|
117
|
+
lookup_user_key, iter->value(), iter->IsValuePinned(),
|
|
118
|
+
do_merge, merge_context, moptions_.merge_operator, clock_,
|
|
119
|
+
moptions_.statistics, moptions_.info_log, s, value,
|
|
120
|
+
columns)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
108
125
|
default: {
|
|
109
|
-
std::string msg(
|
|
110
|
-
|
|
126
|
+
std::string msg(
|
|
127
|
+
"Unrecognized or unsupported value type for "
|
|
128
|
+
"WBWI-based memtable: " +
|
|
129
|
+
std::to_string(static_cast<int>(type)) + ". ");
|
|
111
130
|
msg.append("User key: " +
|
|
112
131
|
ExtractUserKey(iter->key()).ToString(/*hex=*/true) + ". ");
|
|
113
132
|
msg.append("seq: " + std::to_string(seq) + ".");
|
|
@@ -116,8 +135,8 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
116
135
|
}
|
|
117
136
|
}
|
|
118
137
|
}
|
|
119
|
-
// Current key
|
|
120
|
-
assert(
|
|
138
|
+
// Current key is a merge key or not visible
|
|
139
|
+
assert(merge_in_progress || (callback && !callback->IsVisible(seq)));
|
|
121
140
|
iter->Next();
|
|
122
141
|
}
|
|
123
142
|
if (!iter->status().ok() &&
|
|
@@ -126,6 +145,10 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
|
|
|
126
145
|
// stop further look up
|
|
127
146
|
return true;
|
|
128
147
|
}
|
|
148
|
+
if (merge_in_progress) {
|
|
149
|
+
assert(s->ok() || s->IsMergeInProgress());
|
|
150
|
+
*s = Status::MergeInProgress();
|
|
151
|
+
}
|
|
129
152
|
return /*found_final_value=*/false;
|
|
130
153
|
}
|
|
131
154
|
|
|
@@ -12,13 +12,25 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
12
12
|
// of the given write batch with index (WBWI) object. This can be used to ingest
|
|
13
13
|
// a transaction (which is based on WBWI) into the DB as an immutable memtable.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
// Since the keys in WBWI do not have sequence number,
|
|
15
|
+
// REQUIRES: overwrite_key to be true for the WBWI
|
|
16
|
+
// Since the keys in WBWI do not have sequence number, this class is responsible
|
|
17
|
+
// for assigning sequence numbers to the keys. This memtable needs to be
|
|
17
18
|
// assigned a range of sequence numbers through AssignSequenceNumbers(seqno)
|
|
18
19
|
// before being available for reads.
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
20
|
+
//
|
|
21
|
+
// The sequence number assignment uses the update count for each key
|
|
22
|
+
// tracked in WBWI (see WBWIIterator::GetUpdateCount()). For each key, the
|
|
23
|
+
// sequence number assigned is seqno.lower_bound + update_count - 1. So more
|
|
24
|
+
// recent updates will have higher sequence number.
|
|
25
|
+
//
|
|
26
|
+
// Since WBWI with overwrite mode keeps track of the most recent update for
|
|
27
|
+
// each key, this memtable contains one update per key usually. However, there
|
|
28
|
+
// are two exceptions:
|
|
29
|
+
// 1. Merge operations: Each Merge operation do not overwrite existing entries,
|
|
30
|
+
// if a user uses Merge, multiple entries may be kept.
|
|
31
|
+
// 2. Overwriten SingleDelete: this memtable needs to emit an extra
|
|
32
|
+
// SingleDelete even when the SD is overwritten by another update.
|
|
33
|
+
// Consider the following scenario:
|
|
22
34
|
// - WBWI has SD(k) then PUT(k, v1)
|
|
23
35
|
// - DB has PUT(k, v2) in L1
|
|
24
36
|
// - flush WBWI adds PUT(k, v1) into L0
|
|
@@ -26,8 +38,7 @@ namespace ROCKSDB_NAMESPACE {
|
|
|
26
38
|
// - flush live memtable and compact it with L0 will drop SD(k) and PUT(k, v1)
|
|
27
39
|
// - the PUT(k, v2) in L1 incorrectly becomes visible
|
|
28
40
|
// So during flush, iterator from this memtable will need emit overwritten
|
|
29
|
-
// single deletion.
|
|
30
|
-
// assigned seqno.upper_bound - 1.
|
|
41
|
+
// single deletion. This SD will be assigned seqno.lower_bound.
|
|
31
42
|
class WBWIMemTable final : public ReadOnlyMemTable {
|
|
32
43
|
public:
|
|
33
44
|
struct SeqnoRange {
|
|
@@ -224,7 +235,7 @@ class WBWIMemTable final : public ReadOnlyMemTable {
|
|
|
224
235
|
uint64_t num_entries_;
|
|
225
236
|
// WBWI can contains updates to multiple CFs. `cf_id_` determines which CF
|
|
226
237
|
// this memtable is for.
|
|
227
|
-
uint32_t cf_id_;
|
|
238
|
+
const uint32_t cf_id_;
|
|
228
239
|
};
|
|
229
240
|
|
|
230
241
|
class WBWIMemTableIterator final : public InternalIterator {
|
|
@@ -253,59 +264,51 @@ class WBWIMemTableIterator final : public InternalIterator {
|
|
|
253
264
|
}
|
|
254
265
|
|
|
255
266
|
void SeekToLast() override {
|
|
267
|
+
assert(!emit_overwritten_single_del_);
|
|
256
268
|
it_->SeekToLast();
|
|
257
269
|
UpdateKey();
|
|
258
270
|
}
|
|
259
271
|
|
|
260
272
|
void Seek(const Slice& target) override {
|
|
273
|
+
// `emit_overwritten_single_del_` is only used for flush, which does
|
|
274
|
+
// sequential forward scan from the beginning.
|
|
275
|
+
assert(!emit_overwritten_single_del_);
|
|
261
276
|
Slice target_user_key = ExtractUserKey(target);
|
|
277
|
+
// Moves to first update >= target_user_key
|
|
262
278
|
it_->Seek(target_user_key);
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
seqno >= assigned_seqno_.upper_bound);
|
|
271
|
-
if (seqno < assigned_seqno_.upper_bound &&
|
|
272
|
-
comparator_->Compare(it_->Entry().key, target_user_key) == 0) {
|
|
273
|
-
it_->Next();
|
|
274
|
-
// TODO: cannot assume distinct keys once Merge is supported
|
|
275
|
-
if (it_->Valid()) {
|
|
276
|
-
assert(comparator_->Compare(it_->Entry().key, target_user_key) > 0);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
+
SequenceNumber target_seqno = GetInternalKeySeqno(target);
|
|
280
|
+
// Move to the first entry with seqno <= target_seqno for the same
|
|
281
|
+
// user key or a different user key.
|
|
282
|
+
while (it_->Valid() &&
|
|
283
|
+
comparator_->Compare(it_->Entry().key, target_user_key) == 0 &&
|
|
284
|
+
target_seqno < CurrentKeySeqno()) {
|
|
285
|
+
it_->Next();
|
|
279
286
|
}
|
|
280
287
|
UpdateKey();
|
|
281
288
|
}
|
|
282
289
|
|
|
283
290
|
void SeekForPrev(const Slice& target) override {
|
|
291
|
+
assert(!emit_overwritten_single_del_);
|
|
284
292
|
Slice target_user_key = ExtractUserKey(target);
|
|
293
|
+
// Moves to last update <= target_user_key
|
|
285
294
|
it_->SeekForPrev(target_user_key);
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
if (it_->Valid()) {
|
|
294
|
-
// TODO: cannot assume distinct keys once Merge is supported
|
|
295
|
-
assert(comparator_->Compare(it_->Entry().key, target_user_key) < 0);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
295
|
+
SequenceNumber target_seqno = GetInternalKeySeqno(target);
|
|
296
|
+
// Move to the first entry with seqno >= target_seqno for the same
|
|
297
|
+
// user key or a different user key.
|
|
298
|
+
while (it_->Valid() &&
|
|
299
|
+
comparator_->Compare(it_->Entry().key, target_user_key) == 0 &&
|
|
300
|
+
CurrentKeySeqno() < target_seqno) {
|
|
301
|
+
it_->Prev();
|
|
298
302
|
}
|
|
299
303
|
UpdateKey();
|
|
300
304
|
}
|
|
301
305
|
|
|
302
306
|
void Next() override {
|
|
303
|
-
// Only need to emit single deletion during flush. Since Flush does
|
|
304
|
-
// sequential forward scan, we only need to emit single deletion in Next(),
|
|
305
|
-
// and do not need to consider iterator direction change.
|
|
306
307
|
assert(Valid());
|
|
307
308
|
if (emit_overwritten_single_del_) {
|
|
308
309
|
if (it_->HasOverWrittenSingleDel() && !at_overwritten_single_del_) {
|
|
310
|
+
// Merge and SingleDelete on the same key is undefined behavior.
|
|
311
|
+
assert(it_->Entry().type != kMergeRecord);
|
|
309
312
|
UpdateSingleDeleteKey();
|
|
310
313
|
return;
|
|
311
314
|
}
|
|
@@ -329,6 +332,7 @@ class WBWIMemTableIterator final : public InternalIterator {
|
|
|
329
332
|
}
|
|
330
333
|
|
|
331
334
|
void Prev() override {
|
|
335
|
+
assert(!emit_overwritten_single_del_);
|
|
332
336
|
assert(Valid());
|
|
333
337
|
it_->Prev();
|
|
334
338
|
UpdateKey();
|
|
@@ -341,7 +345,6 @@ class WBWIMemTableIterator final : public InternalIterator {
|
|
|
341
345
|
|
|
342
346
|
Slice value() const override {
|
|
343
347
|
assert(Valid());
|
|
344
|
-
// TODO: it_->Entry() is not trivial, cache it
|
|
345
348
|
return it_->Entry().value;
|
|
346
349
|
}
|
|
347
350
|
|
|
@@ -355,6 +358,16 @@ class WBWIMemTableIterator final : public InternalIterator {
|
|
|
355
358
|
private:
|
|
356
359
|
static const std::unordered_map<WriteType, ValueType> WriteTypeToValueTypeMap;
|
|
357
360
|
|
|
361
|
+
SequenceNumber CurrentKeySeqno() {
|
|
362
|
+
assert(it_->Valid());
|
|
363
|
+
assert(it_->GetUpdateCount() >= 1);
|
|
364
|
+
auto seq = assigned_seqno_.lower_bound + it_->GetUpdateCount() - 1;
|
|
365
|
+
assert(seq <= assigned_seqno_.upper_bound);
|
|
366
|
+
return seq;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// If it_ is valid, udate key_ to an internal key containing it_ current
|
|
370
|
+
// key, CurrentKeySeqno() and a type corresponding to it_ current entry type.
|
|
358
371
|
void UpdateKey() {
|
|
359
372
|
valid_ = it_->Valid();
|
|
360
373
|
if (!Valid()) {
|
|
@@ -367,19 +380,19 @@ class WBWIMemTableIterator final : public InternalIterator {
|
|
|
367
380
|
key_.clear();
|
|
368
381
|
valid_ = false;
|
|
369
382
|
s_ = Status::Corruption("Unexpected write_batch_with_index entry type " +
|
|
370
|
-
std::to_string(
|
|
383
|
+
std::to_string(it_->Entry().type));
|
|
371
384
|
return;
|
|
372
385
|
}
|
|
373
|
-
key_buf_.SetInternalKey(it_->Entry().key,
|
|
374
|
-
t->second);
|
|
386
|
+
key_buf_.SetInternalKey(it_->Entry().key, CurrentKeySeqno(), t->second);
|
|
375
387
|
key_ = key_buf_.GetInternalKey();
|
|
376
388
|
}
|
|
377
389
|
|
|
378
390
|
void UpdateSingleDeleteKey() {
|
|
379
391
|
assert(it_->Valid());
|
|
380
392
|
assert(Valid());
|
|
381
|
-
|
|
382
|
-
|
|
393
|
+
// The key that overwrites this SingleDelete will be assigned at least
|
|
394
|
+
// seqno lower_bound + 1 (see CurrentKeySeqno()).
|
|
395
|
+
key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.lower_bound,
|
|
383
396
|
kTypeSingleDeletion);
|
|
384
397
|
key_ = key_buf_.GetInternalKey();
|
|
385
398
|
at_overwritten_single_del_ = true;
|