@nxtedition/rocksdb 9.0.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +244 -177
- package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -9
- package/deps/rocksdb/rocksdb/Makefile +15 -6
- package/deps/rocksdb/rocksdb/README.md +29 -0
- package/deps/rocksdb/rocksdb/TARGETS +17 -2
- package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +74 -15
- package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +16 -4
- package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
- package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2024 -14
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +349 -23
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +126 -51
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +202 -7
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +31 -14
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -33
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +314 -25
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +29 -4
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +10 -0
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -3
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
- package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +25 -11
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -1
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/builder.cc +3 -3
- package/deps/rocksdb/rocksdb/db/c.cc +64 -0
- package/deps/rocksdb/rocksdb/db/c_test.c +36 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +23 -15
- package/deps/rocksdb/rocksdb/db/column_family.h +9 -0
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +101 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +36 -23
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +24 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +3 -5
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -18
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +7 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +8 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +146 -64
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +13 -39
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -7
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +8 -3
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +59 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +186 -2
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +17 -5
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +519 -240
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +104 -43
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +169 -66
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +12 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +85 -53
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +99 -82
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +4 -14
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +24 -21
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
- package/deps/rocksdb/rocksdb/db/db_iter.cc +83 -55
- package/deps/rocksdb/rocksdb/db/db_iter.h +10 -2
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +187 -1
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +134 -30
- package/deps/rocksdb/rocksdb/db/db_test2.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +5 -2
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +12 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +337 -1
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/error_handler.cc +51 -34
- package/deps/rocksdb/rocksdb/db/error_handler.h +7 -6
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +58 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +17 -19
- package/deps/rocksdb/rocksdb/db/flush_job.h +3 -3
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/memtable.cc +18 -70
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +1 -1
- package/deps/rocksdb/rocksdb/db/memtable_list.h +11 -1
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
- package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
- package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
- package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +454 -70
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
- package/deps/rocksdb/rocksdb/db/table_cache.cc +32 -19
- package/deps/rocksdb/rocksdb/db/table_cache.h +12 -6
- package/deps/rocksdb/rocksdb/db/version_edit.h +10 -4
- package/deps/rocksdb/rocksdb/db/version_set.cc +75 -73
- package/deps/rocksdb/rocksdb/db/version_set.h +8 -8
- package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +22 -11
- package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
- package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
- package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +44 -20
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +15 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +108 -58
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +36 -14
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +195 -130
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +12 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +14 -11
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +44 -38
- package/deps/rocksdb/rocksdb/env/env.cc +5 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +1 -0
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +50 -29
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +32 -2
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +513 -30
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +38 -13
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +14 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +42 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +65 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +26 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +37 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +79 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +16 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +14 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +9 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +0 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -2
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
- package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +4 -0
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -0
- package/deps/rocksdb/rocksdb/options/db_options.cc +47 -2
- package/deps/rocksdb/rocksdb/options/db_options.h +3 -0
- package/deps/rocksdb/rocksdb/options/options_helper.cc +12 -0
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
- package/deps/rocksdb/rocksdb/options/options_test.cc +6 -1
- package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
- package/deps/rocksdb/rocksdb/port/README +10 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -0
- package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
- package/deps/rocksdb/rocksdb/src.mk +7 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +275 -61
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +96 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +179 -62
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +35 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +14 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +10 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +39 -18
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +10 -8
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -2
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +6 -2
- package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
- package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +12 -0
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +33 -6
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +2 -4
- package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
- package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -43
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +213 -28
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -10
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
- package/deps/rocksdb/rocksdb/util/cast_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +26 -1
- package/deps/rocksdb/rocksdb/util/compression.h +9 -3
- package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
- package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
- package/deps/rocksdb/rocksdb/util/overload.h +23 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
- package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
- package/deps/rocksdb/rocksdb/util/status.cc +1 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -0
- package/deps/rocksdb/rocksdb/util/udt_util.cc +42 -0
- package/deps/rocksdb/rocksdb/util/udt_util.h +19 -0
- package/deps/rocksdb/rocksdb/util/udt_util_test.cc +14 -0
- package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
- package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +19 -15
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +9 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +41 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +155 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +81 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +2 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +7 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +3 -2
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -27
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +105 -8
- package/deps/rocksdb/rocksdb.gyp +4 -2
- package/index.js +38 -55
- package/package.json +4 -4
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/util.h +7 -1
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
#include "db/db_test_util.h"
|
|
11
11
|
#include "port/stack_trace.h"
|
|
12
12
|
#include "test_util/testutil.h"
|
|
13
|
+
#include "util/overload.h"
|
|
13
14
|
#include "utilities/merge_operators.h"
|
|
14
15
|
|
|
15
16
|
namespace ROCKSDB_NAMESPACE {
|
|
@@ -208,6 +209,11 @@ TEST_F(DBWideBasicTest, PutEntity) {
|
|
|
208
209
|
ASSERT_OK(Flush());
|
|
209
210
|
|
|
210
211
|
verify();
|
|
212
|
+
|
|
213
|
+
// Reopen as Readonly DB and verify
|
|
214
|
+
Close();
|
|
215
|
+
ASSERT_OK(ReadOnlyReopen(options));
|
|
216
|
+
verify();
|
|
211
217
|
}
|
|
212
218
|
|
|
213
219
|
TEST_F(DBWideBasicTest, PutEntityColumnFamily) {
|
|
@@ -264,6 +270,134 @@ TEST_F(DBWideBasicTest, MultiCFMultiGetEntity) {
|
|
|
264
270
|
ASSERT_EQ(results[1].columns(), second_columns);
|
|
265
271
|
}
|
|
266
272
|
|
|
273
|
+
TEST_F(DBWideBasicTest, MultiCFMultiGetEntityAsPinnableAttributeGroups) {
|
|
274
|
+
Options options = GetDefaultOptions();
|
|
275
|
+
CreateAndReopenWithCF({"hot_cf", "cold_cf"}, options);
|
|
276
|
+
|
|
277
|
+
constexpr int DEFAULT_CF_HANDLE_INDEX = 0;
|
|
278
|
+
constexpr int HOT_CF_HANDLE_INDEX = 1;
|
|
279
|
+
constexpr int COLD_CF_HANDLE_INDEX = 2;
|
|
280
|
+
|
|
281
|
+
constexpr char first_key[] = "first";
|
|
282
|
+
WideColumns first_default_columns{
|
|
283
|
+
{"default_cf_col_1_name", "first_key_default_cf_col_1_value"},
|
|
284
|
+
{"default_cf_col_2_name", "first_key_default_cf_col_2_value"}};
|
|
285
|
+
WideColumns first_hot_columns{
|
|
286
|
+
{"hot_cf_col_1_name", "first_key_hot_cf_col_1_value"},
|
|
287
|
+
{"hot_cf_col_2_name", "first_key_hot_cf_col_2_value"}};
|
|
288
|
+
WideColumns first_cold_columns{
|
|
289
|
+
{"cold_cf_col_1_name", "first_key_cold_cf_col_1_value"}};
|
|
290
|
+
constexpr char second_key[] = "second";
|
|
291
|
+
WideColumns second_hot_columns{
|
|
292
|
+
{"hot_cf_col_1_name", "second_key_hot_cf_col_1_value"}};
|
|
293
|
+
WideColumns second_cold_columns{
|
|
294
|
+
{"cold_cf_col_1_name", "second_key_cold_cf_col_1_value"}};
|
|
295
|
+
|
|
296
|
+
// TODO - update this to use the multi-attribute-group PutEntity when ready
|
|
297
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), handles_[DEFAULT_CF_HANDLE_INDEX],
|
|
298
|
+
first_key, first_default_columns));
|
|
299
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), handles_[HOT_CF_HANDLE_INDEX],
|
|
300
|
+
first_key, first_hot_columns));
|
|
301
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), handles_[COLD_CF_HANDLE_INDEX],
|
|
302
|
+
first_key, first_cold_columns));
|
|
303
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), handles_[HOT_CF_HANDLE_INDEX],
|
|
304
|
+
second_key, second_hot_columns));
|
|
305
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), handles_[COLD_CF_HANDLE_INDEX],
|
|
306
|
+
second_key, second_cold_columns));
|
|
307
|
+
|
|
308
|
+
constexpr size_t num_keys = 2;
|
|
309
|
+
std::array<Slice, num_keys> keys = {first_key, second_key};
|
|
310
|
+
std::vector<ColumnFamilyHandle*> all_cfs = handles_;
|
|
311
|
+
std::vector<ColumnFamilyHandle*> default_and_hot_cfs{
|
|
312
|
+
{handles_[DEFAULT_CF_HANDLE_INDEX], handles_[HOT_CF_HANDLE_INDEX]}};
|
|
313
|
+
std::vector<ColumnFamilyHandle*> hot_and_cold_cfs{
|
|
314
|
+
{handles_[HOT_CF_HANDLE_INDEX], handles_[COLD_CF_HANDLE_INDEX]}};
|
|
315
|
+
auto create_result =
|
|
316
|
+
[](const std::vector<ColumnFamilyHandle*>& column_families)
|
|
317
|
+
-> PinnableAttributeGroups {
|
|
318
|
+
PinnableAttributeGroups result;
|
|
319
|
+
for (size_t i = 0; i < column_families.size(); ++i) {
|
|
320
|
+
result.emplace_back(column_families[i]);
|
|
321
|
+
}
|
|
322
|
+
return result;
|
|
323
|
+
};
|
|
324
|
+
{
|
|
325
|
+
// Check for invalid argument
|
|
326
|
+
ReadOptions read_options;
|
|
327
|
+
read_options.io_activity = Env::IOActivity::kGetEntity;
|
|
328
|
+
std::vector<PinnableAttributeGroups> results;
|
|
329
|
+
for (size_t i = 0; i < num_keys; ++i) {
|
|
330
|
+
results.emplace_back(create_result(all_cfs));
|
|
331
|
+
}
|
|
332
|
+
db_->MultiGetEntity(read_options, num_keys, keys.data(), results.data());
|
|
333
|
+
for (size_t i = 0; i < num_keys; ++i) {
|
|
334
|
+
for (size_t j = 0; j < all_cfs.size(); ++j) {
|
|
335
|
+
ASSERT_NOK(results[i][j].status());
|
|
336
|
+
ASSERT_TRUE(results[i][j].status().IsInvalidArgument());
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
{
|
|
341
|
+
// Case 1. Get first key from default cf and hot_cf and second key from
|
|
342
|
+
// hot_cf and cold_cf
|
|
343
|
+
std::vector<PinnableAttributeGroups> results;
|
|
344
|
+
PinnableAttributeGroups first_key_result =
|
|
345
|
+
create_result(default_and_hot_cfs);
|
|
346
|
+
PinnableAttributeGroups second_key_result = create_result(hot_and_cold_cfs);
|
|
347
|
+
results.emplace_back(std::move(first_key_result));
|
|
348
|
+
results.emplace_back(std::move(second_key_result));
|
|
349
|
+
|
|
350
|
+
db_->MultiGetEntity(ReadOptions(), num_keys, keys.data(), results.data());
|
|
351
|
+
ASSERT_EQ(2, results.size());
|
|
352
|
+
// We expect to get values for all keys and CFs
|
|
353
|
+
for (size_t i = 0; i < num_keys; ++i) {
|
|
354
|
+
for (size_t j = 0; j < 2; ++j) {
|
|
355
|
+
ASSERT_OK(results[i][j].status());
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// verify values for first key (default cf and hot cf)
|
|
359
|
+
ASSERT_EQ(2, results[0].size());
|
|
360
|
+
ASSERT_EQ(first_default_columns, results[0][0].columns());
|
|
361
|
+
ASSERT_EQ(first_hot_columns, results[0][1].columns());
|
|
362
|
+
|
|
363
|
+
// verify values for second key (hot cf and cold cf)
|
|
364
|
+
ASSERT_EQ(2, results[1].size());
|
|
365
|
+
ASSERT_EQ(second_hot_columns, results[1][0].columns());
|
|
366
|
+
ASSERT_EQ(second_cold_columns, results[1][1].columns());
|
|
367
|
+
}
|
|
368
|
+
{
|
|
369
|
+
// Case 2. Get first key and second key from all cfs. For the second key, we
|
|
370
|
+
// don't expect to get columns from default cf.
|
|
371
|
+
std::vector<PinnableAttributeGroups> results;
|
|
372
|
+
PinnableAttributeGroups first_key_result = create_result(all_cfs);
|
|
373
|
+
PinnableAttributeGroups second_key_result = create_result(all_cfs);
|
|
374
|
+
results.emplace_back(std::move(first_key_result));
|
|
375
|
+
results.emplace_back(std::move(second_key_result));
|
|
376
|
+
|
|
377
|
+
db_->MultiGetEntity(ReadOptions(), num_keys, keys.data(), results.data());
|
|
378
|
+
// verify first key
|
|
379
|
+
for (size_t i = 0; i < all_cfs.size(); ++i) {
|
|
380
|
+
ASSERT_OK(results[0][i].status());
|
|
381
|
+
}
|
|
382
|
+
ASSERT_EQ(3, results[0].size());
|
|
383
|
+
ASSERT_EQ(first_default_columns, results[0][0].columns());
|
|
384
|
+
ASSERT_EQ(first_hot_columns, results[0][1].columns());
|
|
385
|
+
ASSERT_EQ(first_cold_columns, results[0][2].columns());
|
|
386
|
+
|
|
387
|
+
// verify second key
|
|
388
|
+
// key does not exist in default cf
|
|
389
|
+
ASSERT_NOK(results[1][0].status());
|
|
390
|
+
ASSERT_TRUE(results[1][0].status().IsNotFound());
|
|
391
|
+
ASSERT_TRUE(results[1][0].columns().empty());
|
|
392
|
+
|
|
393
|
+
// key exists in hot_cf and cold_cf
|
|
394
|
+
ASSERT_OK(results[1][1].status());
|
|
395
|
+
ASSERT_EQ(second_hot_columns, results[1][1].columns());
|
|
396
|
+
ASSERT_OK(results[1][2].status());
|
|
397
|
+
ASSERT_EQ(second_cold_columns, results[1][2].columns());
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
267
401
|
TEST_F(DBWideBasicTest, MergePlainKeyValue) {
|
|
268
402
|
Options options = GetDefaultOptions();
|
|
269
403
|
options.create_if_missing = true;
|
|
@@ -685,6 +819,397 @@ TEST_F(DBWideBasicTest, MergeEntity) {
|
|
|
685
819
|
verify_merge_ops_post_compaction();
|
|
686
820
|
}
|
|
687
821
|
|
|
822
|
+
class DBWideMergeV3Test : public DBWideBasicTest {
|
|
823
|
+
protected:
|
|
824
|
+
void RunTest(const WideColumns& first_expected,
|
|
825
|
+
const WideColumns& second_expected,
|
|
826
|
+
const WideColumns& third_expected) {
|
|
827
|
+
// Note: we'll take some snapshots to prevent merging during flush
|
|
828
|
+
snapshots_.reserve(6);
|
|
829
|
+
|
|
830
|
+
// Test reading from memtables
|
|
831
|
+
WriteKeyValues();
|
|
832
|
+
VerifyKeyValues(first_expected, second_expected, third_expected);
|
|
833
|
+
VerifyMergeOperandCount(first_key, 2);
|
|
834
|
+
VerifyMergeOperandCount(second_key, 3);
|
|
835
|
+
VerifyMergeOperandCount(third_key, 3);
|
|
836
|
+
|
|
837
|
+
// Test reading from SST files
|
|
838
|
+
ASSERT_OK(Flush());
|
|
839
|
+
VerifyKeyValues(first_expected, second_expected, third_expected);
|
|
840
|
+
VerifyMergeOperandCount(first_key, 2);
|
|
841
|
+
VerifyMergeOperandCount(second_key, 3);
|
|
842
|
+
VerifyMergeOperandCount(third_key, 3);
|
|
843
|
+
|
|
844
|
+
// Test reading from SSTs after compaction. Note that we write the same KVs
|
|
845
|
+
// and flush again so we have two overlapping files. We also release the
|
|
846
|
+
// snapshots so that the compaction can merge all keys.
|
|
847
|
+
WriteKeyValues();
|
|
848
|
+
ASSERT_OK(Flush());
|
|
849
|
+
|
|
850
|
+
snapshots_.clear();
|
|
851
|
+
|
|
852
|
+
ASSERT_OK(db_->CompactRange(CompactRangeOptions(), /* begin */ nullptr,
|
|
853
|
+
/* end */ nullptr));
|
|
854
|
+
VerifyKeyValues(first_expected, second_expected, third_expected);
|
|
855
|
+
VerifyMergeOperandCount(first_key, 1);
|
|
856
|
+
VerifyMergeOperandCount(second_key, 1);
|
|
857
|
+
VerifyMergeOperandCount(third_key, 1);
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
void WriteKeyValues() {
|
|
861
|
+
// Base values
|
|
862
|
+
ASSERT_OK(db_->Delete(WriteOptions(), db_->DefaultColumnFamily(),
|
|
863
|
+
first_key)); // no base value
|
|
864
|
+
ASSERT_OK(db_->Put(WriteOptions(), db_->DefaultColumnFamily(), second_key,
|
|
865
|
+
second_base_value)); // plain base value
|
|
866
|
+
ASSERT_OK(db_->PutEntity(WriteOptions(), db_->DefaultColumnFamily(),
|
|
867
|
+
third_key,
|
|
868
|
+
third_columns)); // wide-column base value
|
|
869
|
+
|
|
870
|
+
snapshots_.emplace_back(db_);
|
|
871
|
+
|
|
872
|
+
// First round of merge operands
|
|
873
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), first_key,
|
|
874
|
+
first_merge_op1));
|
|
875
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), second_key,
|
|
876
|
+
second_merge_op1));
|
|
877
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), third_key,
|
|
878
|
+
third_merge_op1));
|
|
879
|
+
|
|
880
|
+
snapshots_.emplace_back(db_);
|
|
881
|
+
|
|
882
|
+
// Second round of merge operands
|
|
883
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), first_key,
|
|
884
|
+
first_merge_op2));
|
|
885
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), second_key,
|
|
886
|
+
second_merge_op2));
|
|
887
|
+
ASSERT_OK(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), third_key,
|
|
888
|
+
third_merge_op2));
|
|
889
|
+
|
|
890
|
+
snapshots_.emplace_back(db_);
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
void VerifyKeyValues(const WideColumns& first_expected,
|
|
894
|
+
const WideColumns& second_expected,
|
|
895
|
+
const WideColumns& third_expected) {
|
|
896
|
+
assert(!first_expected.empty() &&
|
|
897
|
+
first_expected[0].name() == kDefaultWideColumnName);
|
|
898
|
+
assert(!second_expected.empty() &&
|
|
899
|
+
second_expected[0].name() == kDefaultWideColumnName);
|
|
900
|
+
assert(!third_expected.empty() &&
|
|
901
|
+
third_expected[0].name() == kDefaultWideColumnName);
|
|
902
|
+
|
|
903
|
+
// Get
|
|
904
|
+
{
|
|
905
|
+
PinnableSlice result;
|
|
906
|
+
ASSERT_OK(db_->Get(ReadOptions(), db_->DefaultColumnFamily(), first_key,
|
|
907
|
+
&result));
|
|
908
|
+
ASSERT_EQ(result, first_expected[0].value());
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
{
|
|
912
|
+
PinnableSlice result;
|
|
913
|
+
ASSERT_OK(db_->Get(ReadOptions(), db_->DefaultColumnFamily(), second_key,
|
|
914
|
+
&result));
|
|
915
|
+
ASSERT_EQ(result, second_expected[0].value());
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
{
|
|
919
|
+
PinnableSlice result;
|
|
920
|
+
ASSERT_OK(db_->Get(ReadOptions(), db_->DefaultColumnFamily(), third_key,
|
|
921
|
+
&result));
|
|
922
|
+
ASSERT_EQ(result, third_expected[0].value());
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
// MultiGet
|
|
926
|
+
{
|
|
927
|
+
std::array<Slice, num_keys> keys{{first_key, second_key, third_key}};
|
|
928
|
+
std::array<PinnableSlice, num_keys> values;
|
|
929
|
+
std::array<Status, num_keys> statuses;
|
|
930
|
+
|
|
931
|
+
db_->MultiGet(ReadOptions(), db_->DefaultColumnFamily(), num_keys,
|
|
932
|
+
keys.data(), values.data(), statuses.data());
|
|
933
|
+
ASSERT_OK(statuses[0]);
|
|
934
|
+
ASSERT_EQ(values[0], first_expected[0].value());
|
|
935
|
+
ASSERT_OK(statuses[1]);
|
|
936
|
+
ASSERT_EQ(values[1], second_expected[0].value());
|
|
937
|
+
ASSERT_OK(statuses[2]);
|
|
938
|
+
ASSERT_EQ(values[2], third_expected[0].value());
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
// GetEntity
|
|
942
|
+
{
|
|
943
|
+
PinnableWideColumns result;
|
|
944
|
+
|
|
945
|
+
ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
|
|
946
|
+
first_key, &result));
|
|
947
|
+
ASSERT_EQ(result.columns(), first_expected);
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
{
|
|
951
|
+
PinnableWideColumns result;
|
|
952
|
+
|
|
953
|
+
ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
|
|
954
|
+
second_key, &result));
|
|
955
|
+
ASSERT_EQ(result.columns(), second_expected);
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
{
|
|
959
|
+
PinnableWideColumns result;
|
|
960
|
+
|
|
961
|
+
ASSERT_OK(db_->GetEntity(ReadOptions(), db_->DefaultColumnFamily(),
|
|
962
|
+
third_key, &result));
|
|
963
|
+
ASSERT_EQ(result.columns(), third_expected);
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// MultiGetEntity
|
|
967
|
+
{
|
|
968
|
+
std::array<Slice, num_keys> keys{{first_key, second_key, third_key}};
|
|
969
|
+
std::array<PinnableWideColumns, num_keys> results;
|
|
970
|
+
std::array<Status, num_keys> statuses;
|
|
971
|
+
|
|
972
|
+
db_->MultiGetEntity(ReadOptions(), db_->DefaultColumnFamily(), num_keys,
|
|
973
|
+
keys.data(), results.data(), statuses.data());
|
|
974
|
+
ASSERT_OK(statuses[0]);
|
|
975
|
+
ASSERT_EQ(results[0].columns(), first_expected);
|
|
976
|
+
ASSERT_OK(statuses[1]);
|
|
977
|
+
ASSERT_EQ(results[1].columns(), second_expected);
|
|
978
|
+
ASSERT_OK(statuses[2]);
|
|
979
|
+
ASSERT_EQ(results[2].columns(), third_expected);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Iterator
|
|
983
|
+
{
|
|
984
|
+
std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions()));
|
|
985
|
+
|
|
986
|
+
iter->SeekToFirst();
|
|
987
|
+
ASSERT_TRUE(iter->Valid());
|
|
988
|
+
ASSERT_OK(iter->status());
|
|
989
|
+
ASSERT_EQ(iter->key(), first_key);
|
|
990
|
+
ASSERT_EQ(iter->value(), first_expected[0].value());
|
|
991
|
+
ASSERT_EQ(iter->columns(), first_expected);
|
|
992
|
+
|
|
993
|
+
iter->Next();
|
|
994
|
+
ASSERT_TRUE(iter->Valid());
|
|
995
|
+
ASSERT_OK(iter->status());
|
|
996
|
+
ASSERT_EQ(iter->key(), second_key);
|
|
997
|
+
ASSERT_EQ(iter->value(), second_expected[0].value());
|
|
998
|
+
ASSERT_EQ(iter->columns(), second_expected);
|
|
999
|
+
|
|
1000
|
+
iter->Next();
|
|
1001
|
+
ASSERT_TRUE(iter->Valid());
|
|
1002
|
+
ASSERT_OK(iter->status());
|
|
1003
|
+
ASSERT_EQ(iter->key(), third_key);
|
|
1004
|
+
ASSERT_EQ(iter->value(), third_expected[0].value());
|
|
1005
|
+
ASSERT_EQ(iter->columns(), third_expected);
|
|
1006
|
+
|
|
1007
|
+
iter->Next();
|
|
1008
|
+
ASSERT_FALSE(iter->Valid());
|
|
1009
|
+
ASSERT_OK(iter->status());
|
|
1010
|
+
|
|
1011
|
+
iter->SeekToLast();
|
|
1012
|
+
ASSERT_TRUE(iter->Valid());
|
|
1013
|
+
ASSERT_OK(iter->status());
|
|
1014
|
+
ASSERT_EQ(iter->key(), third_key);
|
|
1015
|
+
ASSERT_EQ(iter->value(), third_expected[0].value());
|
|
1016
|
+
ASSERT_EQ(iter->columns(), third_expected);
|
|
1017
|
+
|
|
1018
|
+
iter->Prev();
|
|
1019
|
+
ASSERT_TRUE(iter->Valid());
|
|
1020
|
+
ASSERT_OK(iter->status());
|
|
1021
|
+
ASSERT_EQ(iter->key(), second_key);
|
|
1022
|
+
ASSERT_EQ(iter->value(), second_expected[0].value());
|
|
1023
|
+
ASSERT_EQ(iter->columns(), second_expected);
|
|
1024
|
+
|
|
1025
|
+
iter->Prev();
|
|
1026
|
+
ASSERT_TRUE(iter->Valid());
|
|
1027
|
+
ASSERT_OK(iter->status());
|
|
1028
|
+
ASSERT_EQ(iter->key(), first_key);
|
|
1029
|
+
ASSERT_EQ(iter->value(), first_expected[0].value());
|
|
1030
|
+
ASSERT_EQ(iter->columns(), first_expected);
|
|
1031
|
+
|
|
1032
|
+
iter->Prev();
|
|
1033
|
+
ASSERT_FALSE(iter->Valid());
|
|
1034
|
+
ASSERT_OK(iter->status());
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
void VerifyMergeOperandCount(const Slice& key, int expected_merge_ops) {
|
|
1039
|
+
GetMergeOperandsOptions get_merge_opts;
|
|
1040
|
+
get_merge_opts.expected_max_number_of_operands = expected_merge_ops;
|
|
1041
|
+
|
|
1042
|
+
std::vector<PinnableSlice> merge_operands(expected_merge_ops);
|
|
1043
|
+
int number_of_operands = 0;
|
|
1044
|
+
|
|
1045
|
+
ASSERT_OK(db_->GetMergeOperands(ReadOptions(), db_->DefaultColumnFamily(),
|
|
1046
|
+
key, merge_operands.data(), &get_merge_opts,
|
|
1047
|
+
&number_of_operands));
|
|
1048
|
+
ASSERT_EQ(number_of_operands, expected_merge_ops);
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
std::vector<ManagedSnapshot> snapshots_;
|
|
1052
|
+
|
|
1053
|
+
static constexpr size_t num_keys = 3;
|
|
1054
|
+
|
|
1055
|
+
static constexpr char first_key[] = "first";
|
|
1056
|
+
static constexpr char first_merge_op1[] = "hello";
|
|
1057
|
+
static constexpr char first_merge_op1_upper[] = "HELLO";
|
|
1058
|
+
static constexpr char first_merge_op2[] = "world";
|
|
1059
|
+
static constexpr char first_merge_op2_upper[] = "WORLD";
|
|
1060
|
+
|
|
1061
|
+
static constexpr char second_key[] = "second";
|
|
1062
|
+
static constexpr char second_base_value[] = "foo";
|
|
1063
|
+
static constexpr char second_base_value_upper[] = "FOO";
|
|
1064
|
+
static constexpr char second_merge_op1[] = "bar";
|
|
1065
|
+
static constexpr char second_merge_op1_upper[] = "BAR";
|
|
1066
|
+
static constexpr char second_merge_op2[] = "baz";
|
|
1067
|
+
static constexpr char second_merge_op2_upper[] = "BAZ";
|
|
1068
|
+
|
|
1069
|
+
static constexpr char third_key[] = "third";
|
|
1070
|
+
static const WideColumns third_columns;
|
|
1071
|
+
static constexpr char third_merge_op1[] = "three";
|
|
1072
|
+
static constexpr char third_merge_op1_upper[] = "THREE";
|
|
1073
|
+
static constexpr char third_merge_op2[] = "four";
|
|
1074
|
+
static constexpr char third_merge_op2_upper[] = "FOUR";
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
const WideColumns DBWideMergeV3Test::third_columns{{"one", "ONE"},
|
|
1078
|
+
{"two", "TWO"}};
|
|
1079
|
+
|
|
1080
|
+
TEST_F(DBWideMergeV3Test, MergeV3WideColumnOutput) {
|
|
1081
|
+
// A test merge operator that always returns a wide-column result. It adds any
|
|
1082
|
+
// base values and merge operands to a single wide-column entity, and converts
|
|
1083
|
+
// all column values to uppercase. In addition, it puts "none", "plain", or
|
|
1084
|
+
// "wide" into the value of the default column depending on the type of the
|
|
1085
|
+
// base value (if any).
|
|
1086
|
+
static constexpr char kNone[] = "none";
|
|
1087
|
+
static constexpr char kPlain[] = "plain";
|
|
1088
|
+
static constexpr char kWide[] = "wide";
|
|
1089
|
+
|
|
1090
|
+
class WideColumnOutputMergeOperator : public MergeOperator {
|
|
1091
|
+
public:
|
|
1092
|
+
bool FullMergeV3(const MergeOperationInputV3& merge_in,
|
|
1093
|
+
MergeOperationOutputV3* merge_out) const override {
|
|
1094
|
+
assert(merge_out);
|
|
1095
|
+
|
|
1096
|
+
merge_out->new_value = MergeOperationOutputV3::NewColumns();
|
|
1097
|
+
auto& new_columns =
|
|
1098
|
+
std::get<MergeOperationOutputV3::NewColumns>(merge_out->new_value);
|
|
1099
|
+
|
|
1100
|
+
auto upper = [](std::string str) {
|
|
1101
|
+
for (char& c : str) {
|
|
1102
|
+
c = static_cast<char>(std::toupper(static_cast<unsigned char>(c)));
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
return str;
|
|
1106
|
+
};
|
|
1107
|
+
|
|
1108
|
+
std::visit(overload{[&](const std::monostate&) {
|
|
1109
|
+
new_columns.emplace_back(
|
|
1110
|
+
kDefaultWideColumnName.ToString(), kNone);
|
|
1111
|
+
},
|
|
1112
|
+
[&](const Slice& value) {
|
|
1113
|
+
new_columns.emplace_back(
|
|
1114
|
+
kDefaultWideColumnName.ToString(), kPlain);
|
|
1115
|
+
|
|
1116
|
+
const std::string val = value.ToString();
|
|
1117
|
+
new_columns.emplace_back(val, upper(val));
|
|
1118
|
+
},
|
|
1119
|
+
[&](const WideColumns& columns) {
|
|
1120
|
+
new_columns.emplace_back(
|
|
1121
|
+
kDefaultWideColumnName.ToString(), kWide);
|
|
1122
|
+
|
|
1123
|
+
for (const auto& column : columns) {
|
|
1124
|
+
new_columns.emplace_back(
|
|
1125
|
+
column.name().ToString(),
|
|
1126
|
+
upper(column.value().ToString()));
|
|
1127
|
+
}
|
|
1128
|
+
}},
|
|
1129
|
+
merge_in.existing_value);
|
|
1130
|
+
|
|
1131
|
+
for (const auto& operand : merge_in.operand_list) {
|
|
1132
|
+
const std::string op = operand.ToString();
|
|
1133
|
+
new_columns.emplace_back(op, upper(op));
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
return true;
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
const char* Name() const override {
|
|
1140
|
+
return "WideColumnOutputMergeOperator";
|
|
1141
|
+
}
|
|
1142
|
+
};
|
|
1143
|
+
|
|
1144
|
+
Options options = GetDefaultOptions();
|
|
1145
|
+
options.create_if_missing = true;
|
|
1146
|
+
options.merge_operator = std::make_shared<WideColumnOutputMergeOperator>();
|
|
1147
|
+
Reopen(options);
|
|
1148
|
+
|
|
1149
|
+
// Expected results
|
|
1150
|
+
// Lexicographical order: [default] < hello < world
|
|
1151
|
+
const WideColumns first_expected{{kDefaultWideColumnName, kNone},
|
|
1152
|
+
{first_merge_op1, first_merge_op1_upper},
|
|
1153
|
+
{first_merge_op2, first_merge_op2_upper}};
|
|
1154
|
+
// Lexicographical order: [default] < bar < baz < foo
|
|
1155
|
+
const WideColumns second_expected{
|
|
1156
|
+
{kDefaultWideColumnName, kPlain},
|
|
1157
|
+
{second_merge_op1, second_merge_op1_upper},
|
|
1158
|
+
{second_merge_op2, second_merge_op2_upper},
|
|
1159
|
+
{second_base_value, second_base_value_upper}};
|
|
1160
|
+
// Lexicographical order: [default] < four < one < three < two
|
|
1161
|
+
const WideColumns third_expected{
|
|
1162
|
+
{kDefaultWideColumnName, kWide},
|
|
1163
|
+
{third_merge_op2, third_merge_op2_upper},
|
|
1164
|
+
{third_columns[0].name(), third_columns[0].value()},
|
|
1165
|
+
{third_merge_op1, third_merge_op1_upper},
|
|
1166
|
+
{third_columns[1].name(), third_columns[1].value()}};
|
|
1167
|
+
|
|
1168
|
+
RunTest(first_expected, second_expected, third_expected);
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
TEST_F(DBWideMergeV3Test, MergeV3PlainOutput) {
|
|
1172
|
+
// A test merge operator that always returns a plain value as result, namely
|
|
1173
|
+
// the total number of operands serialized as a string. Base values are also
|
|
1174
|
+
// counted as operands; specifically, a plain base value is counted as one
|
|
1175
|
+
// operand, while a wide-column base value is counted as as many operands as
|
|
1176
|
+
// the number of columns.
|
|
1177
|
+
class PlainOutputMergeOperator : public MergeOperator {
|
|
1178
|
+
public:
|
|
1179
|
+
bool FullMergeV3(const MergeOperationInputV3& merge_in,
|
|
1180
|
+
MergeOperationOutputV3* merge_out) const override {
|
|
1181
|
+
assert(merge_out);
|
|
1182
|
+
|
|
1183
|
+
size_t count = 0;
|
|
1184
|
+
std::visit(
|
|
1185
|
+
overload{[&](const std::monostate&) {},
|
|
1186
|
+
[&](const Slice&) { count = 1; },
|
|
1187
|
+
[&](const WideColumns& columns) { count = columns.size(); }},
|
|
1188
|
+
merge_in.existing_value);
|
|
1189
|
+
|
|
1190
|
+
count += merge_in.operand_list.size();
|
|
1191
|
+
|
|
1192
|
+
merge_out->new_value = std::string();
|
|
1193
|
+
std::get<std::string>(merge_out->new_value) = std::to_string(count);
|
|
1194
|
+
|
|
1195
|
+
return true;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
const char* Name() const override { return "PlainOutputMergeOperator"; }
|
|
1199
|
+
};
|
|
1200
|
+
|
|
1201
|
+
Options options = GetDefaultOptions();
|
|
1202
|
+
options.create_if_missing = true;
|
|
1203
|
+
options.merge_operator = std::make_shared<PlainOutputMergeOperator>();
|
|
1204
|
+
Reopen(options);
|
|
1205
|
+
|
|
1206
|
+
const WideColumns first_expected{{kDefaultWideColumnName, "2"}};
|
|
1207
|
+
const WideColumns second_expected{{kDefaultWideColumnName, "3"}};
|
|
1208
|
+
const WideColumns third_expected{{kDefaultWideColumnName, "4"}};
|
|
1209
|
+
|
|
1210
|
+
RunTest(first_expected, second_expected, third_expected);
|
|
1211
|
+
}
|
|
1212
|
+
|
|
688
1213
|
TEST_F(DBWideBasicTest, CompactionFilter) {
|
|
689
1214
|
Options options = GetDefaultOptions();
|
|
690
1215
|
options.create_if_missing = true;
|
|
@@ -9,17 +9,16 @@
|
|
|
9
9
|
#include <cassert>
|
|
10
10
|
#include <limits>
|
|
11
11
|
|
|
12
|
+
#include "db/wide/wide_columns_helper.h"
|
|
12
13
|
#include "rocksdb/slice.h"
|
|
13
14
|
#include "util/autovector.h"
|
|
14
15
|
#include "util/coding.h"
|
|
15
16
|
|
|
16
17
|
namespace ROCKSDB_NAMESPACE {
|
|
17
18
|
|
|
18
|
-
Status WideColumnSerialization::
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const size_t num_columns =
|
|
22
|
-
value_of_default ? columns.size() + 1 : columns.size();
|
|
19
|
+
Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
20
|
+
std::string& output) {
|
|
21
|
+
const size_t num_columns = columns.size();
|
|
23
22
|
|
|
24
23
|
if (num_columns > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
25
24
|
return Status::InvalidArgument("Too many wide columns");
|
|
@@ -30,17 +29,6 @@ Status WideColumnSerialization::SerializeImpl(const Slice* value_of_default,
|
|
|
30
29
|
PutVarint32(&output, static_cast<uint32_t>(num_columns));
|
|
31
30
|
|
|
32
31
|
const Slice* prev_name = nullptr;
|
|
33
|
-
if (value_of_default) {
|
|
34
|
-
if (value_of_default->size() >
|
|
35
|
-
static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
|
|
36
|
-
return Status::InvalidArgument("Wide column value too long");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
PutLengthPrefixedSlice(&output, kDefaultWideColumnName);
|
|
40
|
-
PutVarint32(&output, static_cast<uint32_t>(value_of_default->size()));
|
|
41
|
-
|
|
42
|
-
prev_name = &kDefaultWideColumnName;
|
|
43
|
-
}
|
|
44
32
|
|
|
45
33
|
for (size_t i = 0; i < columns.size(); ++i) {
|
|
46
34
|
const WideColumn& column = columns[i];
|
|
@@ -67,10 +55,6 @@ Status WideColumnSerialization::SerializeImpl(const Slice* value_of_default,
|
|
|
67
55
|
prev_name = &name;
|
|
68
56
|
}
|
|
69
57
|
|
|
70
|
-
if (value_of_default) {
|
|
71
|
-
output.append(value_of_default->data(), value_of_default->size());
|
|
72
|
-
}
|
|
73
|
-
|
|
74
58
|
for (const auto& column : columns) {
|
|
75
59
|
const Slice& value = column.value();
|
|
76
60
|
|
|
@@ -169,12 +153,12 @@ Status WideColumnSerialization::GetValueOfDefaultColumn(Slice& input,
|
|
|
169
153
|
return s;
|
|
170
154
|
}
|
|
171
155
|
|
|
172
|
-
if (
|
|
156
|
+
if (!WideColumnsHelper::HasDefaultColumn(columns)) {
|
|
173
157
|
value.clear();
|
|
174
158
|
return Status::OK();
|
|
175
159
|
}
|
|
176
160
|
|
|
177
|
-
value = columns
|
|
161
|
+
value = WideColumnsHelper::GetDefaultColumn(columns);
|
|
178
162
|
|
|
179
163
|
return Status::OK();
|
|
180
164
|
}
|
|
@@ -44,9 +44,6 @@ class Slice;
|
|
|
44
44
|
class WideColumnSerialization {
|
|
45
45
|
public:
|
|
46
46
|
static Status Serialize(const WideColumns& columns, std::string& output);
|
|
47
|
-
static Status Serialize(const Slice& value_of_default,
|
|
48
|
-
const WideColumns& other_columns,
|
|
49
|
-
std::string& output);
|
|
50
47
|
|
|
51
48
|
static Status Deserialize(Slice& input, WideColumns& columns);
|
|
52
49
|
|
|
@@ -55,23 +52,6 @@ class WideColumnSerialization {
|
|
|
55
52
|
static Status GetValueOfDefaultColumn(Slice& input, Slice& value);
|
|
56
53
|
|
|
57
54
|
static constexpr uint32_t kCurrentVersion = 1;
|
|
58
|
-
|
|
59
|
-
private:
|
|
60
|
-
static Status SerializeImpl(const Slice* value_of_default,
|
|
61
|
-
const WideColumns& columns, std::string& output);
|
|
62
55
|
};
|
|
63
56
|
|
|
64
|
-
inline Status WideColumnSerialization::Serialize(const WideColumns& columns,
|
|
65
|
-
std::string& output) {
|
|
66
|
-
constexpr Slice* value_of_default = nullptr;
|
|
67
|
-
|
|
68
|
-
return SerializeImpl(value_of_default, columns, output);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
inline Status WideColumnSerialization::Serialize(
|
|
72
|
-
const Slice& value_of_default, const WideColumns& other_columns,
|
|
73
|
-
std::string& output) {
|
|
74
|
-
return SerializeImpl(&value_of_default, other_columns, output);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
57
|
} // namespace ROCKSDB_NAMESPACE
|
|
@@ -124,25 +124,6 @@ TEST(WideColumnSerializationTest, SerializeDeserialize) {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
TEST(WideColumnSerializationTest, SerializeWithPrepend) {
|
|
128
|
-
Slice value_of_default("baz");
|
|
129
|
-
WideColumns other_columns{{"foo", "bar"}, {"hello", "world"}};
|
|
130
|
-
|
|
131
|
-
std::string output;
|
|
132
|
-
ASSERT_OK(WideColumnSerialization::Serialize(value_of_default, other_columns,
|
|
133
|
-
output));
|
|
134
|
-
|
|
135
|
-
Slice input(output);
|
|
136
|
-
|
|
137
|
-
WideColumns deserialized_columns;
|
|
138
|
-
ASSERT_OK(WideColumnSerialization::Deserialize(input, deserialized_columns));
|
|
139
|
-
|
|
140
|
-
WideColumns expected_columns{{kDefaultWideColumnName, value_of_default},
|
|
141
|
-
other_columns[0],
|
|
142
|
-
other_columns[1]};
|
|
143
|
-
ASSERT_EQ(deserialized_columns, expected_columns);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
127
|
TEST(WideColumnSerializationTest, SerializeDuplicateError) {
|
|
147
128
|
WideColumns columns{{"foo", "bar"}, {"foo", "baz"}};
|
|
148
129
|
std::string output;
|
|
@@ -151,16 +132,6 @@ TEST(WideColumnSerializationTest, SerializeDuplicateError) {
|
|
|
151
132
|
WideColumnSerialization::Serialize(columns, output).IsCorruption());
|
|
152
133
|
}
|
|
153
134
|
|
|
154
|
-
TEST(WideColumnSerializationTest, SerializeWithPrependDuplicateError) {
|
|
155
|
-
Slice value_of_default("baz");
|
|
156
|
-
WideColumns other_columns{{kDefaultWideColumnName, "dup"}, {"foo", "bar"}};
|
|
157
|
-
|
|
158
|
-
std::string output;
|
|
159
|
-
ASSERT_TRUE(WideColumnSerialization::Serialize(value_of_default,
|
|
160
|
-
other_columns, output)
|
|
161
|
-
.IsCorruption());
|
|
162
|
-
}
|
|
163
|
-
|
|
164
135
|
TEST(WideColumnSerializationTest, SerializeOutOfOrderError) {
|
|
165
136
|
WideColumns columns{{"hello", "world"}, {"foo", "bar"}};
|
|
166
137
|
std::string output;
|