@nxtedition/rocksdb 13.5.7 → 13.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.cc +248 -70
- package/binding.gyp +2 -2
- package/deps/rocksdb/rocksdb/BUCK +12 -0
- package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
- package/deps/rocksdb/rocksdb/Makefile +28 -23
- package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
- package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
- package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
- package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
- package/deps/rocksdb/rocksdb/db/builder.h +5 -4
- package/deps/rocksdb/rocksdb/db/c.cc +556 -15
- package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
- package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
- package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
- package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
- package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
- package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
- package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
- package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
- package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
- package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
- package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
- package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
- package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
- package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
- package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
- package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
- package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
- package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
- package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
- package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
- package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
- package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
- package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
- package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
- package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
- package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
- package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
- package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
- package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
- package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
- package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
- package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
- package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
- package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
- package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
- package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
- package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
- package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
- package/deps/rocksdb/rocksdb/env/env.cc +32 -2
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
- package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
- package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
- package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
- package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
- package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
- package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
- package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
- package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
- package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
- package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
- package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
- package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
- package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
- package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
- package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
- package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
- package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
- package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
- package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
- package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
- package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
- package/deps/rocksdb/rocksdb/options/options.cc +296 -305
- package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
- package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
- package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
- package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
- package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
- package/deps/rocksdb/rocksdb/port/lang.h +2 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
- package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
- package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
- package/deps/rocksdb/rocksdb/src.mk +17 -11
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
- package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
- package/deps/rocksdb/rocksdb/table/format.cc +62 -44
- package/deps/rocksdb/rocksdb/table/format.h +35 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
- package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
- package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
- package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
- package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
- package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
- package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
- package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
- package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
- package/deps/rocksdb/rocksdb/util/compression.h +348 -232
- package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
- package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
- package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
- package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
- package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
- package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
- package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
- package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
- package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
- package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
- package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
- package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
- package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
- package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
- package/deps/rocksdb/rocksdb.gyp +9 -4
- package/index.js +50 -9
- package/package.json +8 -1
- package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
- package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
#include <algorithm>
|
|
15
15
|
#include <cstddef>
|
|
16
16
|
#include <cstdio>
|
|
17
|
+
#include <iomanip>
|
|
17
18
|
#include <iostream>
|
|
18
19
|
#include <map>
|
|
19
20
|
#include <memory>
|
|
@@ -36,6 +37,7 @@
|
|
|
36
37
|
#include "rocksdb/convenience.h"
|
|
37
38
|
#include "rocksdb/db.h"
|
|
38
39
|
#include "rocksdb/env.h"
|
|
40
|
+
#include "rocksdb/external_table.h"
|
|
39
41
|
#include "rocksdb/file_checksum.h"
|
|
40
42
|
#include "rocksdb/file_system.h"
|
|
41
43
|
#include "rocksdb/filter_policy.h"
|
|
@@ -44,6 +46,7 @@
|
|
|
44
46
|
#include "rocksdb/options.h"
|
|
45
47
|
#include "rocksdb/perf_context.h"
|
|
46
48
|
#include "rocksdb/slice_transform.h"
|
|
49
|
+
#include "rocksdb/sst_file_reader.h"
|
|
47
50
|
#include "rocksdb/statistics.h"
|
|
48
51
|
#include "rocksdb/table_properties.h"
|
|
49
52
|
#include "rocksdb/trace_record.h"
|
|
@@ -441,7 +444,8 @@ class TableConstructor : public Constructor {
|
|
|
441
444
|
|
|
442
445
|
file_reader_.reset(new RandomAccessFileReader(std::move(source), "test"));
|
|
443
446
|
return moptions.table_factory->NewTableReader(
|
|
444
|
-
TableReaderOptions(ioptions, moptions.prefix_extractor,
|
|
447
|
+
TableReaderOptions(ioptions, moptions.prefix_extractor,
|
|
448
|
+
moptions.compression_manager.get(), soptions,
|
|
445
449
|
*last_internal_comparator_,
|
|
446
450
|
0 /* block_protection_bytes_per_key */,
|
|
447
451
|
/*skip_filters*/ false,
|
|
@@ -1791,18 +1795,23 @@ TEST_P(BlockBasedTableTest, IndexUncompressed) {
|
|
|
1791
1795
|
#endif // SNAPPY
|
|
1792
1796
|
|
|
1793
1797
|
TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
|
|
1794
|
-
TableConstructor c(&reverse_key_comparator
|
|
1798
|
+
TableConstructor c(&reverse_key_comparator,
|
|
1799
|
+
true /* convert_to_internal_key_ */);
|
|
1795
1800
|
std::vector<std::string> keys;
|
|
1796
1801
|
stl_wrappers::KVMap kvmap;
|
|
1797
1802
|
|
|
1798
|
-
{
|
|
1803
|
+
for (CompressionType ct : {kNoCompression, kSnappyCompression}) {
|
|
1804
|
+
if (!Snappy_Supported() && ct == kSnappyCompression) {
|
|
1805
|
+
continue;
|
|
1806
|
+
}
|
|
1799
1807
|
Options options;
|
|
1800
|
-
options.compression =
|
|
1808
|
+
options.compression = ct;
|
|
1801
1809
|
BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
|
|
1802
1810
|
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
|
|
1803
1811
|
|
|
1804
1812
|
const ImmutableOptions ioptions(options);
|
|
1805
1813
|
const MutableCFOptions moptions(options);
|
|
1814
|
+
c.Add("blah", std::string(200, 'x')); // something to compress
|
|
1806
1815
|
c.Finish(options, ioptions, moptions, table_options,
|
|
1807
1816
|
GetPlainInternalComparator(options.comparator), &keys, &kvmap);
|
|
1808
1817
|
|
|
@@ -1819,7 +1828,13 @@ TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
|
|
|
1819
1828
|
// No filter policy is used
|
|
1820
1829
|
ASSERT_EQ("", props.filter_policy_name);
|
|
1821
1830
|
// Compression type == that set:
|
|
1822
|
-
|
|
1831
|
+
if (FormatVersionUsesCompressionManagerName(table_options.format_version)) {
|
|
1832
|
+
ASSERT_EQ(ct == kNoCompression ? ";;" : "BuiltinV2;01;",
|
|
1833
|
+
props.compression_name);
|
|
1834
|
+
} else {
|
|
1835
|
+
ASSERT_EQ(ct == kNoCompression ? "NoCompression" : "Snappy",
|
|
1836
|
+
props.compression_name);
|
|
1837
|
+
}
|
|
1823
1838
|
c.ResetTableReader();
|
|
1824
1839
|
}
|
|
1825
1840
|
|
|
@@ -4726,13 +4741,18 @@ static void DoCompressionTest(CompressionType comp) {
|
|
|
4726
4741
|
const ImmutableOptions ioptions(options);
|
|
4727
4742
|
const MutableCFOptions moptions(options);
|
|
4728
4743
|
c.Finish(options, ioptions, moptions, table_options, ikc, &keys, &kvmap);
|
|
4744
|
+
size_t file_size = c.TEST_GetSink()->contents().size();
|
|
4745
|
+
EXPECT_EQ(c.ApproximateOffsetOf("abc"), 0);
|
|
4746
|
+
EXPECT_EQ(c.ApproximateOffsetOf("k01"), 0);
|
|
4747
|
+
EXPECT_EQ(c.ApproximateOffsetOf("k02"), 0);
|
|
4748
|
+
EXPECT_NEAR2(c.ApproximateOffsetOf("k03"), file_size / 2, file_size / 10);
|
|
4749
|
+
EXPECT_NEAR2(c.ApproximateOffsetOf("k04"), file_size / 2, file_size / 10);
|
|
4750
|
+
EXPECT_NEAR2(c.ApproximateOffsetOf("xyz"), file_size, file_size / 10);
|
|
4751
|
+
|
|
4752
|
+
size_t data_blocks_size = c.GetTableReader()->GetTableProperties()->data_size;
|
|
4753
|
+
// Near expected compressed size ~= (0.25 + 0.25) * 10000
|
|
4754
|
+
EXPECT_NEAR2(data_blocks_size, 5000, 1500);
|
|
4729
4755
|
|
|
4730
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("abc"), 0, 0));
|
|
4731
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01"), 0, 0));
|
|
4732
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("k02"), 0, 0));
|
|
4733
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), 2000, 3555));
|
|
4734
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), 2000, 3555));
|
|
4735
|
-
ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 4000, 7110));
|
|
4736
4756
|
c.ResetTableReader();
|
|
4737
4757
|
}
|
|
4738
4758
|
|
|
@@ -5324,7 +5344,8 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
|
|
|
5324
5344
|
new RandomAccessFileReader(std::move(source), ""));
|
|
5325
5345
|
|
|
5326
5346
|
options.table_factory->NewTableReader(
|
|
5327
|
-
TableReaderOptions(ioptions, moptions.prefix_extractor,
|
|
5347
|
+
TableReaderOptions(ioptions, moptions.prefix_extractor,
|
|
5348
|
+
moptions.compression_manager.get(), EnvOptions(),
|
|
5328
5349
|
ikc, 0 /* block_protection_bytes_per_key */),
|
|
5329
5350
|
std::move(file_reader), ss_rw.contents().size(), &table_reader);
|
|
5330
5351
|
|
|
@@ -5499,7 +5520,8 @@ TEST_P(BlockBasedTableTest, BlockAlignTest) {
|
|
|
5499
5520
|
const MutableCFOptions moptions2(options2);
|
|
5500
5521
|
|
|
5501
5522
|
ASSERT_OK(moptions.table_factory->NewTableReader(
|
|
5502
|
-
TableReaderOptions(ioptions2, moptions2.prefix_extractor,
|
|
5523
|
+
TableReaderOptions(ioptions2, moptions2.prefix_extractor,
|
|
5524
|
+
moptions2.compression_manager.get(), EnvOptions(),
|
|
5503
5525
|
GetPlainInternalComparator(options2.comparator),
|
|
5504
5526
|
0 /* block_protection_bytes_per_key */),
|
|
5505
5527
|
std::move(file_reader), sink->contents().size(), &table_reader));
|
|
@@ -5673,11 +5695,13 @@ TEST_P(BlockBasedTableTest, PropertiesBlockRestartPointTest) {
|
|
|
5673
5695
|
read_options_for_helper.verify_checksums = false;
|
|
5674
5696
|
PersistentCacheOptions cache_options;
|
|
5675
5697
|
|
|
5676
|
-
|
|
5677
|
-
|
|
5678
|
-
|
|
5679
|
-
|
|
5680
|
-
|
|
5698
|
+
auto mgr = GetBuiltinCompressionManager(
|
|
5699
|
+
GetCompressFormatForVersion(footer.format_version()));
|
|
5700
|
+
BlockFetcher block_fetcher(file, nullptr /* prefetch_buffer */, footer,
|
|
5701
|
+
read_options_for_helper, handle, contents,
|
|
5702
|
+
ioptions, false /* decompress */,
|
|
5703
|
+
false /*maybe_compressed*/, block_type,
|
|
5704
|
+
mgr->GetDecompressor().get(), cache_options);
|
|
5681
5705
|
|
|
5682
5706
|
ASSERT_OK(block_fetcher.ReadBlockContents());
|
|
5683
5707
|
};
|
|
@@ -5810,12 +5834,13 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
|
|
|
5810
5834
|
auto metaindex_handle = footer.metaindex_handle();
|
|
5811
5835
|
BlockContents metaindex_contents;
|
|
5812
5836
|
PersistentCacheOptions pcache_opts;
|
|
5837
|
+
auto mgr = GetBuiltinCompressionManager(
|
|
5838
|
+
GetCompressFormatForVersion(footer.format_version()));
|
|
5813
5839
|
BlockFetcher block_fetcher(
|
|
5814
5840
|
table_reader.get(), nullptr /* prefetch_buffer */, footer, ReadOptions(),
|
|
5815
5841
|
metaindex_handle, &metaindex_contents, ioptions, false /* decompress */,
|
|
5816
5842
|
false /*maybe_compressed*/, BlockType::kMetaIndex,
|
|
5817
|
-
|
|
5818
|
-
nullptr /*memory_allocator*/);
|
|
5843
|
+
mgr->GetDecompressor().get(), pcache_opts, nullptr /*memory_allocator*/);
|
|
5819
5844
|
ASSERT_OK(block_fetcher.ReadBlockContents());
|
|
5820
5845
|
Block metaindex_block(std::move(metaindex_contents));
|
|
5821
5846
|
|
|
@@ -5892,12 +5917,13 @@ TEST_P(BlockBasedTableTest, SeekMetaBlocks) {
|
|
|
5892
5917
|
auto metaindex_handle = footer.metaindex_handle();
|
|
5893
5918
|
BlockContents metaindex_contents;
|
|
5894
5919
|
PersistentCacheOptions pcache_opts;
|
|
5920
|
+
auto mgr = GetBuiltinCompressionManager(
|
|
5921
|
+
GetCompressFormatForVersion(footer.format_version()));
|
|
5895
5922
|
BlockFetcher block_fetcher(
|
|
5896
5923
|
table_reader.get(), nullptr /* prefetch_buffer */, footer, ReadOptions(),
|
|
5897
5924
|
metaindex_handle, &metaindex_contents, ioptions, false /* decompress */,
|
|
5898
5925
|
false /*maybe_compressed*/, BlockType::kMetaIndex,
|
|
5899
|
-
|
|
5900
|
-
nullptr /*memory_allocator*/);
|
|
5926
|
+
mgr->GetDecompressor().get(), pcache_opts, nullptr /*memory_allocator*/);
|
|
5901
5927
|
ASSERT_OK(block_fetcher.ReadBlockContents());
|
|
5902
5928
|
Block metaindex_block(std::move(metaindex_contents));
|
|
5903
5929
|
|
|
@@ -6522,9 +6548,860 @@ TEST_F(CacheUsageOptionsOverridesTest, SanitizeAndValidateOptions) {
|
|
|
6522
6548
|
std::string::npos);
|
|
6523
6549
|
Destroy(options);
|
|
6524
6550
|
}
|
|
6551
|
+
|
|
6552
|
+
class ExternalTableTest : public DBTestBase {
|
|
6553
|
+
public:
|
|
6554
|
+
ExternalTableTest()
|
|
6555
|
+
: DBTestBase("external_table_test", /*env_do_fsync=*/false) {}
|
|
6556
|
+
|
|
6557
|
+
protected:
|
|
6558
|
+
class DummyExternalTableFile {
|
|
6559
|
+
public:
|
|
6560
|
+
explicit DummyExternalTableFile(const std::string& file_path,
|
|
6561
|
+
FSWritableFile* file)
|
|
6562
|
+
: file_path_(file_path), file_(file), file_size_(0) {
|
|
6563
|
+
props_.comparator_name = BytewiseComparator()->Name();
|
|
6564
|
+
}
|
|
6565
|
+
|
|
6566
|
+
Status Serialize(
|
|
6567
|
+
const std::vector<std::pair<std::string, std::string>>& kv_vec) {
|
|
6568
|
+
// First append the property block if one exists
|
|
6569
|
+
uint32_t prop_block_size = static_cast<uint32_t>(prop_block_.length());
|
|
6570
|
+
buf_.append(static_cast<char*>(static_cast<void*>(&prop_block_size)),
|
|
6571
|
+
sizeof(prop_block_size));
|
|
6572
|
+
if (!prop_block_.empty()) {
|
|
6573
|
+
buf_.append(prop_block_);
|
|
6574
|
+
}
|
|
6575
|
+
for (auto& kv : kv_vec) {
|
|
6576
|
+
SerializeOne(kv.first, kv.second);
|
|
6577
|
+
props_.raw_key_size += kv.first.length();
|
|
6578
|
+
props_.raw_value_size += kv.second.length();
|
|
6579
|
+
}
|
|
6580
|
+
props_.num_entries = kv_vec.size();
|
|
6581
|
+
file_size_ = buf_.length();
|
|
6582
|
+
if (file_) {
|
|
6583
|
+
return file_->Append(buf_, IOOptions(), /*dbg=*/nullptr);
|
|
6584
|
+
} else {
|
|
6585
|
+
return WriteStringToFile(Env::Default(), buf_, file_path_);
|
|
6586
|
+
}
|
|
6587
|
+
}
|
|
6588
|
+
|
|
6589
|
+
Status Deserialize(std::map<std::string, std::string>& kv_map) {
|
|
6590
|
+
Status s = ReadFileToString(Env::Default(), file_path_, &buf_);
|
|
6591
|
+
if (!s.ok()) {
|
|
6592
|
+
return s;
|
|
6593
|
+
}
|
|
6594
|
+
|
|
6595
|
+
uint32_t prop_block_size = 0;
|
|
6596
|
+
buf_.copy(static_cast<char*>(static_cast<void*>(&prop_block_size)),
|
|
6597
|
+
sizeof(prop_block_size));
|
|
6598
|
+
buf_.erase(0, sizeof(prop_block_size));
|
|
6599
|
+
prop_block_.assign(buf_.substr(0, prop_block_size));
|
|
6600
|
+
buf_.erase(0, prop_block_size);
|
|
6601
|
+
while (buf_.length() > 0) {
|
|
6602
|
+
std::pair<std::string, std::string> kv;
|
|
6603
|
+
s = DeserializeOne(kv);
|
|
6604
|
+
if (!s.ok()) {
|
|
6605
|
+
break;
|
|
6606
|
+
}
|
|
6607
|
+
size_t key_size = kv.first.length();
|
|
6608
|
+
size_t value_size = kv.second.length();
|
|
6609
|
+
kv_map.emplace(std::move(kv));
|
|
6610
|
+
props_.raw_key_size += key_size;
|
|
6611
|
+
props_.raw_value_size += value_size;
|
|
6612
|
+
}
|
|
6613
|
+
props_.num_entries = kv_map.size();
|
|
6614
|
+
return s;
|
|
6615
|
+
}
|
|
6616
|
+
|
|
6617
|
+
Status PutPropertiesBlock(const Slice& prop_block) {
|
|
6618
|
+
prop_block_.assign(prop_block.data(), prop_block.size());
|
|
6619
|
+
return Status::OK();
|
|
6620
|
+
}
|
|
6621
|
+
|
|
6622
|
+
Status GetPropertiesBlock(std::unique_ptr<char[]>* block, uint64_t* size,
|
|
6623
|
+
uint64_t* file_offset) {
|
|
6624
|
+
if (!prop_block_.empty()) {
|
|
6625
|
+
*block = std::make_unique<char[]>(prop_block_.length());
|
|
6626
|
+
memcpy(block->get(), prop_block_.data(), prop_block_.length());
|
|
6627
|
+
*size = prop_block_.length();
|
|
6628
|
+
*file_offset = sizeof(uint32_t);
|
|
6629
|
+
} else {
|
|
6630
|
+
*size = 0;
|
|
6631
|
+
}
|
|
6632
|
+
return Status::OK();
|
|
6633
|
+
}
|
|
6634
|
+
|
|
6635
|
+
TableProperties GetTableProperties() const { return props_; }
|
|
6636
|
+
|
|
6637
|
+
uint64_t FileSize() const { return file_size_; }
|
|
6638
|
+
|
|
6639
|
+
private:
|
|
6640
|
+
struct ItemHeader {
|
|
6641
|
+
uint32_t key_size;
|
|
6642
|
+
uint32_t value_size;
|
|
6643
|
+
};
|
|
6644
|
+
|
|
6645
|
+
void SerializeOne(const Slice& key, const Slice& value) {
|
|
6646
|
+
ItemHeader hdr;
|
|
6647
|
+
hdr.key_size = static_cast<uint32_t>(key.size());
|
|
6648
|
+
hdr.value_size = static_cast<uint32_t>(value.size());
|
|
6649
|
+
buf_.append(static_cast<char*>(static_cast<void*>(&hdr)), sizeof(hdr));
|
|
6650
|
+
buf_.append(key.data(), key.size());
|
|
6651
|
+
buf_.append(value.data(), value.size());
|
|
6652
|
+
}
|
|
6653
|
+
|
|
6654
|
+
Status DeserializeOne(std::pair<std::string, std::string>& kv) {
|
|
6655
|
+
ItemHeader hdr;
|
|
6656
|
+
size_t copied =
|
|
6657
|
+
buf_.copy(static_cast<char*>(static_cast<void*>(&hdr)), sizeof(hdr));
|
|
6658
|
+
if (copied < sizeof(hdr)) {
|
|
6659
|
+
return Status::Corruption();
|
|
6660
|
+
}
|
|
6661
|
+
buf_.erase(0, sizeof(hdr));
|
|
6662
|
+
if (buf_.length() < hdr.key_size + hdr.value_size) {
|
|
6663
|
+
return Status::Corruption();
|
|
6664
|
+
}
|
|
6665
|
+
kv.first.assign(std::string_view(buf_.data(), hdr.key_size));
|
|
6666
|
+
buf_.erase(0, hdr.key_size);
|
|
6667
|
+
kv.second.assign(std::string_view(buf_.data(), hdr.value_size));
|
|
6668
|
+
buf_.erase(0, hdr.value_size);
|
|
6669
|
+
return Status::OK();
|
|
6670
|
+
}
|
|
6671
|
+
|
|
6672
|
+
std::string file_path_;
|
|
6673
|
+
FSWritableFile* file_;
|
|
6674
|
+
std::string buf_;
|
|
6675
|
+
TableProperties props_;
|
|
6676
|
+
uint64_t file_size_;
|
|
6677
|
+
std::string prop_block_;
|
|
6678
|
+
};
|
|
6679
|
+
|
|
6680
|
+
class DummyExternalTableIterator : public ExternalTableIterator {
|
|
6681
|
+
public:
|
|
6682
|
+
explicit DummyExternalTableIterator(
|
|
6683
|
+
const ReadOptions& /*ro*/,
|
|
6684
|
+
const std::map<std::string, std::string>& kv_map)
|
|
6685
|
+
: scan_options_(nullptr),
|
|
6686
|
+
num_opts_(0),
|
|
6687
|
+
scan_idx_(0),
|
|
6688
|
+
kv_map_(kv_map),
|
|
6689
|
+
valid_(false) {
|
|
6690
|
+
TEST_SYNC_POINT_CALLBACK("DummyExternalTableIterator::Constructor",
|
|
6691
|
+
&status_);
|
|
6692
|
+
}
|
|
6693
|
+
|
|
6694
|
+
bool Valid() const override { return valid_; }
|
|
6695
|
+
|
|
6696
|
+
void SeekToFirst() override {
|
|
6697
|
+
if (scan_options_) {
|
|
6698
|
+
status_ = Status::InvalidArgument();
|
|
6699
|
+
} else {
|
|
6700
|
+
iter_ = kv_map_.begin();
|
|
6701
|
+
valid_ = iter_ != kv_map_.end();
|
|
6702
|
+
status_ = Status::OK();
|
|
6703
|
+
}
|
|
6704
|
+
}
|
|
6705
|
+
|
|
6706
|
+
void SeekToLast() override {
|
|
6707
|
+
if (scan_options_) {
|
|
6708
|
+
status_ = Status::InvalidArgument();
|
|
6709
|
+
} else {
|
|
6710
|
+
if (!kv_map_.empty()) {
|
|
6711
|
+
iter_ = kv_map_.begin();
|
|
6712
|
+
for (uint64_t i = 0; i < kv_map_.size() - 1; ++i) {
|
|
6713
|
+
iter_++;
|
|
6714
|
+
}
|
|
6715
|
+
valid_ = true;
|
|
6716
|
+
} else {
|
|
6717
|
+
valid_ = false;
|
|
6718
|
+
}
|
|
6719
|
+
status_ = Status::OK();
|
|
6720
|
+
}
|
|
6721
|
+
}
|
|
6722
|
+
|
|
6723
|
+
void Seek(const Slice& target) override {
|
|
6724
|
+
if (status_.ok()) {
|
|
6725
|
+
iter_ = kv_map_.find(target.ToString());
|
|
6726
|
+
valid_ = iter_ != kv_map_.end();
|
|
6727
|
+
eof_ = iter_ == kv_map_.end();
|
|
6728
|
+
}
|
|
6729
|
+
if (scan_options_) {
|
|
6730
|
+
if (scan_idx_ >= num_opts_ ||
|
|
6731
|
+
target != scan_options_[scan_idx_].range.start.value().ToString()) {
|
|
6732
|
+
status_ = Status::InvalidArgument();
|
|
6733
|
+
} else {
|
|
6734
|
+
if (valid_ && scan_options_[scan_idx_].range.limit.has_value() &&
|
|
6735
|
+
iter_->first.compare(
|
|
6736
|
+
scan_options_[scan_idx_].range.limit.value().ToString()) >=
|
|
6737
|
+
0) {
|
|
6738
|
+
valid_ = false;
|
|
6739
|
+
}
|
|
6740
|
+
scan_idx_++;
|
|
6741
|
+
}
|
|
6742
|
+
}
|
|
6743
|
+
}
|
|
6744
|
+
|
|
6745
|
+
void SeekForPrev(const Slice& /*target*/) override {
|
|
6746
|
+
valid_ = false;
|
|
6747
|
+
status_ = Status::NotSupported();
|
|
6748
|
+
}
|
|
6749
|
+
|
|
6750
|
+
void Next() override {
|
|
6751
|
+
iter_++;
|
|
6752
|
+
valid_ = iter_ != kv_map_.end();
|
|
6753
|
+
eof_ = iter_ == kv_map_.end();
|
|
6754
|
+
if (valid_ && scan_options_ &&
|
|
6755
|
+
scan_options_[scan_idx_ - 1].range.limit.has_value() &&
|
|
6756
|
+
iter_->first.compare(
|
|
6757
|
+
scan_options_[scan_idx_ - 1].range.limit.value().ToString()) >=
|
|
6758
|
+
0) {
|
|
6759
|
+
valid_ = false;
|
|
6760
|
+
}
|
|
6761
|
+
// status_ is still ok. !valid_ indicates end of scan
|
|
6762
|
+
}
|
|
6763
|
+
|
|
6764
|
+
bool NextAndGetResult(IterateResult* result) override {
|
|
6765
|
+
Next();
|
|
6766
|
+
if (valid_) {
|
|
6767
|
+
result->key = key();
|
|
6768
|
+
result->bound_check_result = IterBoundCheck::kInbound;
|
|
6769
|
+
result->value_prepared = true;
|
|
6770
|
+
} else {
|
|
6771
|
+
result->key = Slice();
|
|
6772
|
+
result->bound_check_result =
|
|
6773
|
+
eof_ ? IterBoundCheck::kUnknown : IterBoundCheck::kOutOfBound;
|
|
6774
|
+
result->value_prepared = false;
|
|
6775
|
+
}
|
|
6776
|
+
return valid_;
|
|
6777
|
+
}
|
|
6778
|
+
|
|
6779
|
+
bool PrepareValue() override { return valid_ ? true : false; }
|
|
6780
|
+
|
|
6781
|
+
IterBoundCheck UpperBoundCheckResult() override {
|
|
6782
|
+
return eof_ ? IterBoundCheck::kUnknown : IterBoundCheck::kOutOfBound;
|
|
6783
|
+
}
|
|
6784
|
+
|
|
6785
|
+
void Prev() override {
|
|
6786
|
+
valid_ = false;
|
|
6787
|
+
status_ = Status::NotSupported();
|
|
6788
|
+
}
|
|
6789
|
+
|
|
6790
|
+
Slice key() const override {
|
|
6791
|
+
// If valid_ is false or status_ is non-ok, behavior is indeterminate
|
|
6792
|
+
return Slice(iter_->first);
|
|
6793
|
+
}
|
|
6794
|
+
|
|
6795
|
+
Status status() const override {
|
|
6796
|
+
// status_ gets overwritten by next Seek
|
|
6797
|
+
return status_;
|
|
6798
|
+
}
|
|
6799
|
+
|
|
6800
|
+
Slice value() const override {
|
|
6801
|
+
// If valid_ is false or status_ is non-ok, behavior is indeterminate
|
|
6802
|
+
return Slice(iter_->second);
|
|
6803
|
+
}
|
|
6804
|
+
|
|
6805
|
+
void Prepare(const ScanOptions scan_opts[], size_t num_opts) override {
|
|
6806
|
+
scan_options_ = scan_opts;
|
|
6807
|
+
num_opts_ = num_opts;
|
|
6808
|
+
}
|
|
6809
|
+
|
|
6810
|
+
private:
|
|
6811
|
+
const ScanOptions* scan_options_;
|
|
6812
|
+
size_t num_opts_;
|
|
6813
|
+
size_t scan_idx_;
|
|
6814
|
+
std::map<std::string, std::string> kv_map_;
|
|
6815
|
+
bool valid_ = false;
|
|
6816
|
+
bool eof_ = false;
|
|
6817
|
+
Status status_ = Status::OK();
|
|
6818
|
+
std::map<std::string, std::string>::iterator iter_;
|
|
6819
|
+
};
|
|
6820
|
+
|
|
6821
|
+
class DummyExternalTableReader : public ExternalTableReader {
|
|
6822
|
+
public:
|
|
6823
|
+
explicit DummyExternalTableReader(const std::string& file_path,
|
|
6824
|
+
bool support_property_block)
|
|
6825
|
+
: file_(file_path, /*file=*/nullptr),
|
|
6826
|
+
support_property_block_(support_property_block) {
|
|
6827
|
+
Status s = file_.Deserialize(kv_map_);
|
|
6828
|
+
EXPECT_OK(s);
|
|
6829
|
+
}
|
|
6830
|
+
|
|
6831
|
+
ExternalTableIterator* NewIterator(
|
|
6832
|
+
const ReadOptions& read_options,
|
|
6833
|
+
const SliceTransform* /*prefix_extractor*/) override {
|
|
6834
|
+
return new DummyExternalTableIterator(read_options, kv_map_);
|
|
6835
|
+
}
|
|
6836
|
+
|
|
6837
|
+
Status Get(const ReadOptions& /*read_options*/, const Slice& key,
|
|
6838
|
+
const SliceTransform* /*prefix_extractor*/,
|
|
6839
|
+
std::string* value) override {
|
|
6840
|
+
auto iter = kv_map_.find(key.ToString());
|
|
6841
|
+
if (iter != kv_map_.end()) {
|
|
6842
|
+
value->assign(iter->second);
|
|
6843
|
+
return Status::OK();
|
|
6844
|
+
}
|
|
6845
|
+
return Status::NotFound();
|
|
6846
|
+
}
|
|
6847
|
+
|
|
6848
|
+
void MultiGet(const ReadOptions& read_options,
|
|
6849
|
+
const std::vector<Slice>& keys,
|
|
6850
|
+
const SliceTransform* prefix_extractor,
|
|
6851
|
+
std::vector<std::string>* values,
|
|
6852
|
+
std::vector<Status>* statuses) override {
|
|
6853
|
+
values->resize(keys.size());
|
|
6854
|
+
statuses->resize(keys.size());
|
|
6855
|
+
for (size_t i = 0; i < keys.size(); ++i) {
|
|
6856
|
+
statuses->at(i) =
|
|
6857
|
+
Get(read_options, keys[i], prefix_extractor, &values->at(i));
|
|
6858
|
+
}
|
|
6859
|
+
}
|
|
6860
|
+
|
|
6861
|
+
Status GetPropertiesBlock(std::unique_ptr<char[]>* block, uint64_t* size,
|
|
6862
|
+
uint64_t* file_offset) override {
|
|
6863
|
+
if (!support_property_block_) {
|
|
6864
|
+
return Status::NotSupported();
|
|
6865
|
+
}
|
|
6866
|
+
return file_.GetPropertiesBlock(block, size, file_offset);
|
|
6867
|
+
}
|
|
6868
|
+
|
|
6869
|
+
std::shared_ptr<const TableProperties> GetTableProperties() const override {
|
|
6870
|
+
std::shared_ptr<TableProperties> props =
|
|
6871
|
+
std::make_shared<TableProperties>();
|
|
6872
|
+
props->comparator_name.assign(BytewiseComparator()->Name());
|
|
6873
|
+
props->num_entries = 1;
|
|
6874
|
+
props->raw_key_size = 3;
|
|
6875
|
+
props->raw_value_size = 3;
|
|
6876
|
+
return props;
|
|
6877
|
+
}
|
|
6878
|
+
|
|
6879
|
+
private:
|
|
6880
|
+
std::map<std::string, std::string> kv_map_;
|
|
6881
|
+
DummyExternalTableFile file_;
|
|
6882
|
+
bool support_property_block_;
|
|
6883
|
+
};
|
|
6884
|
+
|
|
6885
|
+
class DummyExternalTableBuilder : public ExternalTableBuilder {
|
|
6886
|
+
public:
|
|
6887
|
+
explicit DummyExternalTableBuilder(const std::string& file_path,
|
|
6888
|
+
FSWritableFile* file,
|
|
6889
|
+
bool support_property_block)
|
|
6890
|
+
: file_(file_path, file),
|
|
6891
|
+
support_property_block_(support_property_block) {}
|
|
6892
|
+
|
|
6893
|
+
void Add(const Slice& key, const Slice& value) override {
|
|
6894
|
+
if (!kv_vec_.empty()) {
|
|
6895
|
+
ASSERT_LT(BytewiseComparator()->Compare(kv_vec_.back().first, key), 0);
|
|
6896
|
+
}
|
|
6897
|
+
kv_vec_.emplace_back(key.ToString(), value.ToString());
|
|
6898
|
+
}
|
|
6899
|
+
|
|
6900
|
+
Status Finish() override {
|
|
6901
|
+
status_ = file_.Serialize(kv_vec_);
|
|
6902
|
+
return status_;
|
|
6903
|
+
}
|
|
6904
|
+
|
|
6905
|
+
void Abandon() override { kv_vec_.clear(); }
|
|
6906
|
+
|
|
6907
|
+
uint64_t FileSize() const override { return file_.FileSize(); }
|
|
6908
|
+
|
|
6909
|
+
Status PutPropertiesBlock(const Slice& block) override {
|
|
6910
|
+
if (!support_property_block_) {
|
|
6911
|
+
return Status::NotSupported();
|
|
6912
|
+
}
|
|
6913
|
+
return file_.PutPropertiesBlock(block);
|
|
6914
|
+
}
|
|
6915
|
+
|
|
6916
|
+
TableProperties GetTableProperties() const override {
|
|
6917
|
+
return file_.GetTableProperties();
|
|
6918
|
+
}
|
|
6919
|
+
|
|
6920
|
+
Status status() const override { return status_; }
|
|
6921
|
+
|
|
6922
|
+
private:
|
|
6923
|
+
std::vector<std::pair<std::string, std::string>> kv_vec_;
|
|
6924
|
+
DummyExternalTableFile file_;
|
|
6925
|
+
Status status_;
|
|
6926
|
+
bool support_property_block_;
|
|
6927
|
+
};
|
|
6928
|
+
|
|
6929
|
+
class DummyExternalTableFactory : public ExternalTableFactory {
|
|
6930
|
+
public:
|
|
6931
|
+
explicit DummyExternalTableFactory(bool support_property_block)
|
|
6932
|
+
: support_property_block_(support_property_block) {}
|
|
6933
|
+
const char* Name() const override { return "DummyExternalTableFactory"; }
|
|
6934
|
+
|
|
6935
|
+
Status NewTableReader(
|
|
6936
|
+
const ReadOptions& /*read_options*/, const std::string& file_path,
|
|
6937
|
+
const ExternalTableOptions& topts,
|
|
6938
|
+
std::unique_ptr<ExternalTableReader>* table_reader) const override {
|
|
6939
|
+
// Sanity check some options
|
|
6940
|
+
EXPECT_EQ(topts.file_options.handoff_checksum_type,
|
|
6941
|
+
ChecksumType::kCRC32c);
|
|
6942
|
+
table_reader->reset(
|
|
6943
|
+
new DummyExternalTableReader(file_path, support_property_block_));
|
|
6944
|
+
return Status::OK();
|
|
6945
|
+
}
|
|
6946
|
+
|
|
6947
|
+
ExternalTableBuilder* NewTableBuilder(
|
|
6948
|
+
const ExternalTableBuilderOptions& /*opts*/,
|
|
6949
|
+
const std::string& file_path, FSWritableFile* file) const override {
|
|
6950
|
+
return new DummyExternalTableBuilder(file_path, file,
|
|
6951
|
+
support_property_block_);
|
|
6952
|
+
}
|
|
6953
|
+
|
|
6954
|
+
private:
|
|
6955
|
+
bool support_property_block_;
|
|
6956
|
+
};
|
|
6957
|
+
};
|
|
6958
|
+
|
|
6959
|
+
TEST_F(ExternalTableTest, BasicTest) {
|
|
6960
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
6961
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
6962
|
+
/*support_property_block=*/false);
|
|
6963
|
+
|
|
6964
|
+
std::string file_path = test::PerThreadDBPath("external_table");
|
|
6965
|
+
{
|
|
6966
|
+
std::unique_ptr<ExternalTableBuilder> builder;
|
|
6967
|
+
builder.reset(factory->NewTableBuilder(
|
|
6968
|
+
ExternalTableBuilderOptions(ReadOptions(), WriteOptions(),
|
|
6969
|
+
std::shared_ptr<const SliceTransform>(),
|
|
6970
|
+
BytewiseComparator(), "default",
|
|
6971
|
+
TableFileCreationReason::kMisc),
|
|
6972
|
+
file_path, /*file=*/nullptr));
|
|
6973
|
+
builder->Add("foo", "bar");
|
|
6974
|
+
ASSERT_OK(builder->Finish());
|
|
6975
|
+
}
|
|
6976
|
+
|
|
6977
|
+
std::unique_ptr<ExternalTableReader> reader;
|
|
6978
|
+
std::shared_ptr<SliceTransform> prefix_extractor;
|
|
6979
|
+
ASSERT_OK(factory->NewTableReader(
|
|
6980
|
+
{}, file_path,
|
|
6981
|
+
ExternalTableOptions(prefix_extractor, /*comparator=*/nullptr,
|
|
6982
|
+
/*fs=*/nullptr, FileOptions()),
|
|
6983
|
+
&reader));
|
|
6984
|
+
|
|
6985
|
+
ReadOptions ro;
|
|
6986
|
+
std::unique_ptr<ExternalTableIterator> iter(reader->NewIterator(ro, nullptr));
|
|
6987
|
+
ASSERT_NE(iter, nullptr);
|
|
6988
|
+
iter->Seek("foo");
|
|
6989
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
6990
|
+
ASSERT_EQ(iter->value(), "bar");
|
|
6991
|
+
iter->Next();
|
|
6992
|
+
ASSERT_FALSE(iter->Valid());
|
|
6993
|
+
|
|
6994
|
+
std::string val;
|
|
6995
|
+
ASSERT_OK(reader->Get({}, "foo", nullptr, &val));
|
|
6996
|
+
ASSERT_EQ(val, "bar");
|
|
6997
|
+
|
|
6998
|
+
std::vector<std::string> vals;
|
|
6999
|
+
std::vector<Status> statuses;
|
|
7000
|
+
reader->MultiGet({}, {"foo", "bar"}, nullptr, &vals, &statuses);
|
|
7001
|
+
ASSERT_EQ(vals.size(), 2);
|
|
7002
|
+
ASSERT_EQ(statuses.size(), 2);
|
|
7003
|
+
ASSERT_EQ(vals[0], "bar");
|
|
7004
|
+
ASSERT_EQ(statuses[0], Status::OK());
|
|
7005
|
+
ASSERT_EQ(statuses[1], Status::NotFound());
|
|
7006
|
+
}
|
|
7007
|
+
|
|
7008
|
+
TEST_F(ExternalTableTest, SstReaderTest) {
|
|
7009
|
+
if (encrypted_env_) {
|
|
7010
|
+
ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
|
|
7011
|
+
return;
|
|
7012
|
+
}
|
|
7013
|
+
Options options = GetDefaultOptions();
|
|
7014
|
+
std::string dbname = test::PerThreadDBPath("external_table_test");
|
|
7015
|
+
std::string ingest_file = dbname + "test.immutabledb";
|
|
7016
|
+
dbname += "_db";
|
|
7017
|
+
|
|
7018
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
7019
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
7020
|
+
/*support_property_block=*/false);
|
|
7021
|
+
options.table_factory = NewExternalTableFactory(factory);
|
|
7022
|
+
|
|
7023
|
+
std::unique_ptr<SstFileWriter> writer;
|
|
7024
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7025
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7026
|
+
ASSERT_OK(writer->Put("foo", "bar"));
|
|
7027
|
+
ASSERT_OK(writer->Finish());
|
|
7028
|
+
writer.reset();
|
|
7029
|
+
|
|
7030
|
+
std::unique_ptr<SstFileReader> reader(new SstFileReader(options));
|
|
7031
|
+
ASSERT_OK(reader->Open(ingest_file));
|
|
7032
|
+
|
|
7033
|
+
ReadOptions ro;
|
|
7034
|
+
std::unique_ptr<Iterator> iter(reader->NewIterator(ro));
|
|
7035
|
+
ASSERT_NE(iter, nullptr);
|
|
7036
|
+
iter->Seek("foo");
|
|
7037
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7038
|
+
ASSERT_EQ(iter->value(), "bar");
|
|
7039
|
+
iter->Next();
|
|
7040
|
+
ASSERT_FALSE(iter->Valid());
|
|
7041
|
+
ASSERT_TRUE(iter->status().ok());
|
|
7042
|
+
}
|
|
7043
|
+
|
|
7044
|
+
TEST_F(ExternalTableTest, ExternalFileChecksumTest) {
|
|
7045
|
+
if (encrypted_env_) {
|
|
7046
|
+
ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
|
|
7047
|
+
return;
|
|
7048
|
+
}
|
|
7049
|
+
Options options = GetDefaultOptions();
|
|
7050
|
+
std::string dbname = test::PerThreadDBPath("external_table_test");
|
|
7051
|
+
std::string ingest_file = dbname + "test.immutable";
|
|
7052
|
+
dbname += "_db";
|
|
7053
|
+
ASSERT_OK(DestroyDB(dbname, options));
|
|
7054
|
+
|
|
7055
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
7056
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
7057
|
+
/*support_property_block=*/true);
|
|
7058
|
+
options.table_factory = NewExternalTableFactory(factory);
|
|
7059
|
+
|
|
7060
|
+
// Create a file
|
|
7061
|
+
options.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
|
|
7062
|
+
std::unique_ptr<SstFileWriter> writer;
|
|
7063
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7064
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7065
|
+
ASSERT_OK(writer->Put("foo", "bar"));
|
|
7066
|
+
ASSERT_OK(writer->Put("foo2", "bar2"));
|
|
7067
|
+
ExternalSstFileInfo info;
|
|
7068
|
+
ASSERT_OK(writer->Finish(&info));
|
|
7069
|
+
writer.reset();
|
|
7070
|
+
|
|
7071
|
+
FileChecksumGenContext cksum_ctx;
|
|
7072
|
+
FileChecksumGenCrc32c cksum_gen(cksum_ctx);
|
|
7073
|
+
std::string file_data;
|
|
7074
|
+
ASSERT_OK(ReadFileToString(options.env, ingest_file, &file_data));
|
|
7075
|
+
cksum_gen.Update(file_data.data(), file_data.size());
|
|
7076
|
+
cksum_gen.Finalize();
|
|
7077
|
+
ASSERT_EQ(info.file_checksum, cksum_gen.GetChecksum());
|
|
7078
|
+
}
|
|
7079
|
+
|
|
7080
|
+
TEST_F(ExternalTableTest, DBIterTest) {
|
|
7081
|
+
if (encrypted_env_) {
|
|
7082
|
+
ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
|
|
7083
|
+
return;
|
|
7084
|
+
}
|
|
7085
|
+
Options options = GetDefaultOptions();
|
|
7086
|
+
std::string dbname = test::PerThreadDBPath("external_table_test");
|
|
7087
|
+
std::string ingest_file = dbname + "test.immutable";
|
|
7088
|
+
dbname += "_db";
|
|
7089
|
+
ASSERT_OK(DestroyDB(dbname, options));
|
|
7090
|
+
|
|
7091
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
7092
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
7093
|
+
/*support_property_block=*/true);
|
|
7094
|
+
options.table_factory = NewExternalTableFactory(factory);
|
|
7095
|
+
|
|
7096
|
+
// Create a file
|
|
7097
|
+
std::unique_ptr<SstFileWriter> writer;
|
|
7098
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7099
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7100
|
+
ASSERT_OK(writer->Put("foo", "bar"));
|
|
7101
|
+
ASSERT_OK(writer->Put("foo2", "bar2"));
|
|
7102
|
+
ASSERT_OK(writer->Finish());
|
|
7103
|
+
writer.reset();
|
|
7104
|
+
|
|
7105
|
+
std::unique_ptr<DB> db;
|
|
7106
|
+
options.create_if_missing = true;
|
|
7107
|
+
Status s = DB::Open(options, dbname, &db);
|
|
7108
|
+
ASSERT_OK(s);
|
|
7109
|
+
ASSERT_TRUE(db != nullptr);
|
|
7110
|
+
ColumnFamilyHandle* cfh = nullptr;
|
|
7111
|
+
ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
|
|
7112
|
+
|
|
7113
|
+
IngestExternalFileOptions ifo;
|
|
7114
|
+
ifo.allow_db_generated_files = true;
|
|
7115
|
+
ifo.fill_cache = false;
|
|
7116
|
+
s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
|
|
7117
|
+
ASSERT_OK(s);
|
|
7118
|
+
|
|
7119
|
+
std::unique_ptr<Iterator> iter(db->NewIterator({}, cfh));
|
|
7120
|
+
ASSERT_NE(iter, nullptr);
|
|
7121
|
+
iter->Seek("foo");
|
|
7122
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7123
|
+
ASSERT_EQ(iter->value(), "bar");
|
|
7124
|
+
iter->Next();
|
|
7125
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7126
|
+
ASSERT_EQ(iter->key(), "foo2");
|
|
7127
|
+
ASSERT_EQ(iter->value(), "bar2");
|
|
7128
|
+
iter->Next();
|
|
7129
|
+
ASSERT_FALSE(iter->Valid());
|
|
7130
|
+
ASSERT_OK(iter->status());
|
|
7131
|
+
iter.reset();
|
|
7132
|
+
|
|
7133
|
+
ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
|
|
7134
|
+
ASSERT_OK(db->Close());
|
|
7135
|
+
}
|
|
7136
|
+
|
|
7137
|
+
TEST_F(ExternalTableTest, DBMultiScanTest) {
|
|
7138
|
+
if (encrypted_env_) {
|
|
7139
|
+
ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
|
|
7140
|
+
return;
|
|
7141
|
+
}
|
|
7142
|
+
Options options = GetDefaultOptions();
|
|
7143
|
+
std::string dbname = test::PerThreadDBPath("external_table_test");
|
|
7144
|
+
std::string ingest_file = dbname + "test.immutable";
|
|
7145
|
+
dbname += "_db";
|
|
7146
|
+
ASSERT_OK(DestroyDB(dbname, options));
|
|
7147
|
+
|
|
7148
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
7149
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
7150
|
+
/*support_property_block=*/true);
|
|
7151
|
+
options.table_factory = NewExternalTableFactory(factory);
|
|
7152
|
+
|
|
7153
|
+
// Create a file
|
|
7154
|
+
std::unique_ptr<SstFileWriter> writer;
|
|
7155
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7156
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7157
|
+
for (int i = 0; i < 100; ++i) {
|
|
7158
|
+
std::stringstream ss;
|
|
7159
|
+
ss << std::setw(2) << std::setfill('0') << i;
|
|
7160
|
+
ASSERT_OK(writer->Put("k" + ss.str(), "val" + ss.str()));
|
|
7161
|
+
}
|
|
7162
|
+
ASSERT_OK(writer->Finish());
|
|
7163
|
+
writer.reset();
|
|
7164
|
+
|
|
7165
|
+
std::unique_ptr<DB> db;
|
|
7166
|
+
options.create_if_missing = true;
|
|
7167
|
+
Status s = DB::Open(options, dbname, &db);
|
|
7168
|
+
ASSERT_OK(s);
|
|
7169
|
+
ASSERT_TRUE(db != nullptr);
|
|
7170
|
+
ColumnFamilyHandle* cfh = nullptr;
|
|
7171
|
+
ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
|
|
7172
|
+
|
|
7173
|
+
IngestExternalFileOptions ifo;
|
|
7174
|
+
ifo.allow_db_generated_files = true;
|
|
7175
|
+
ifo.fill_cache = false;
|
|
7176
|
+
s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
|
|
7177
|
+
ASSERT_OK(s);
|
|
7178
|
+
|
|
7179
|
+
std::vector<std::string> key_ranges({"k03", "k10", "k25", "k50"});
|
|
7180
|
+
ReadOptions ro;
|
|
7181
|
+
std::vector<ScanOptions> scan_options(
|
|
7182
|
+
{ScanOptions(key_ranges[0], key_ranges[1]),
|
|
7183
|
+
ScanOptions(key_ranges[2], key_ranges[3])});
|
|
7184
|
+
std::unique_ptr<MultiScan> iter = db->NewMultiScan(ro, cfh, scan_options);
|
|
7185
|
+
try {
|
|
7186
|
+
int idx = 0;
|
|
7187
|
+
int count = 0;
|
|
7188
|
+
for (auto range : *iter) {
|
|
7189
|
+
for (auto it : range) {
|
|
7190
|
+
ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
|
|
7191
|
+
ASSERT_LT(it.first.ToString().compare(key_ranges[idx + 1]), 0);
|
|
7192
|
+
count++;
|
|
7193
|
+
}
|
|
7194
|
+
idx += 2;
|
|
7195
|
+
}
|
|
7196
|
+
ASSERT_EQ(count, 32);
|
|
7197
|
+
} catch (MultiScanException& ex) {
|
|
7198
|
+
// Make sure exception contains the status
|
|
7199
|
+
ASSERT_NOK(ex.status());
|
|
7200
|
+
std::cerr << "Iterator returned status " << ex.what();
|
|
7201
|
+
abort();
|
|
7202
|
+
} catch (std::logic_error& ex) {
|
|
7203
|
+
std::cerr << "Iterator returned logic error " << ex.what();
|
|
7204
|
+
abort();
|
|
7205
|
+
}
|
|
7206
|
+
iter.reset();
|
|
7207
|
+
|
|
7208
|
+
// Test the overlapping scan case
|
|
7209
|
+
key_ranges[1] = "k30";
|
|
7210
|
+
scan_options[0] = ScanOptions(key_ranges[0], key_ranges[1]);
|
|
7211
|
+
iter = db->NewMultiScan(ro, cfh, scan_options);
|
|
7212
|
+
try {
|
|
7213
|
+
int idx = 0;
|
|
7214
|
+
int count = 0;
|
|
7215
|
+
for (auto range : *iter) {
|
|
7216
|
+
for (auto it : range) {
|
|
7217
|
+
ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
|
|
7218
|
+
ASSERT_LT(it.first.ToString().compare(key_ranges[idx + 1]), 0);
|
|
7219
|
+
count++;
|
|
7220
|
+
}
|
|
7221
|
+
idx += 2;
|
|
7222
|
+
}
|
|
7223
|
+
ASSERT_EQ(count, 52);
|
|
7224
|
+
} catch (MultiScanException& ex) {
|
|
7225
|
+
// Make sure exception contains the status
|
|
7226
|
+
ASSERT_NOK(ex.status());
|
|
7227
|
+
std::cerr << "Iterator returned status " << ex.what();
|
|
7228
|
+
abort();
|
|
7229
|
+
} catch (std::logic_error& ex) {
|
|
7230
|
+
std::cerr << "Iterator returned logic error " << ex.what();
|
|
7231
|
+
abort();
|
|
7232
|
+
}
|
|
7233
|
+
iter.reset();
|
|
7234
|
+
|
|
7235
|
+
// Test the no limit scan case
|
|
7236
|
+
scan_options[0] = ScanOptions(key_ranges[0]);
|
|
7237
|
+
scan_options[1] = ScanOptions(key_ranges[2]);
|
|
7238
|
+
iter = db->NewMultiScan(ro, cfh, scan_options);
|
|
7239
|
+
try {
|
|
7240
|
+
int idx = 0;
|
|
7241
|
+
int count = 0;
|
|
7242
|
+
for (auto range : *iter) {
|
|
7243
|
+
for (auto it : range) {
|
|
7244
|
+
ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
|
|
7245
|
+
if (it.first.ToString().compare(key_ranges[idx + 1]) == 0) {
|
|
7246
|
+
break;
|
|
7247
|
+
}
|
|
7248
|
+
count++;
|
|
7249
|
+
}
|
|
7250
|
+
idx += 2;
|
|
7251
|
+
}
|
|
7252
|
+
ASSERT_EQ(count, 52);
|
|
7253
|
+
} catch (MultiScanException& ex) {
|
|
7254
|
+
// Make sure exception contains the status
|
|
7255
|
+
ASSERT_NOK(ex.status());
|
|
7256
|
+
std::cerr << "Iterator returned status " << ex.what();
|
|
7257
|
+
abort();
|
|
7258
|
+
} catch (std::logic_error& ex) {
|
|
7259
|
+
std::cerr << "Iterator returned logic error " << ex.what();
|
|
7260
|
+
abort();
|
|
7261
|
+
}
|
|
7262
|
+
iter.reset();
|
|
7263
|
+
|
|
7264
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
7265
|
+
"DummyExternalTableIterator::Constructor", [](void* arg) {
|
|
7266
|
+
Status* status = static_cast<Status*>(arg);
|
|
7267
|
+
*status = Status::IOError();
|
|
7268
|
+
});
|
|
7269
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
7270
|
+
iter = db->NewMultiScan(ro, cfh, scan_options);
|
|
7271
|
+
try {
|
|
7272
|
+
for (auto range : *iter) {
|
|
7273
|
+
// Should not get here. Iterator should throw an exception
|
|
7274
|
+
assert(false);
|
|
7275
|
+
for (auto it : range) {
|
|
7276
|
+
(void)it;
|
|
7277
|
+
assert(false);
|
|
7278
|
+
}
|
|
7279
|
+
}
|
|
7280
|
+
} catch (MultiScanException& ex) {
|
|
7281
|
+
// Make sure exception contains the status
|
|
7282
|
+
ASSERT_EQ(ex.status(), Status::IOError());
|
|
7283
|
+
} catch (std::logic_error& ex) {
|
|
7284
|
+
std::cerr << "Iterator returned logic error " << ex.what();
|
|
7285
|
+
abort();
|
|
7286
|
+
}
|
|
7287
|
+
iter.reset();
|
|
7288
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
7289
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
7290
|
+
|
|
7291
|
+
ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
|
|
7292
|
+
ASSERT_OK(db->Close());
|
|
7293
|
+
}
|
|
7294
|
+
|
|
7295
|
+
TEST_F(ExternalTableTest, IngestionTest) {
|
|
7296
|
+
if (encrypted_env_) {
|
|
7297
|
+
ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
|
|
7298
|
+
return;
|
|
7299
|
+
}
|
|
7300
|
+
Options options = GetDefaultOptions();
|
|
7301
|
+
std::string dbname = test::PerThreadDBPath("external_table_test");
|
|
7302
|
+
std::string ingest_file = dbname + "test.immutable";
|
|
7303
|
+
dbname += "_db";
|
|
7304
|
+
ASSERT_OK(DestroyDB(dbname, options));
|
|
7305
|
+
|
|
7306
|
+
std::shared_ptr<ExternalTableFactory> factory =
|
|
7307
|
+
std::make_shared<DummyExternalTableFactory>(
|
|
7308
|
+
/*support_property_block=*/true);
|
|
7309
|
+
options.table_factory = NewExternalTableFactory(factory);
|
|
7310
|
+
|
|
7311
|
+
// Create a file
|
|
7312
|
+
std::unique_ptr<SstFileWriter> writer;
|
|
7313
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7314
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7315
|
+
ASSERT_OK(writer->Put("foo", "bar"));
|
|
7316
|
+
ASSERT_OK(writer->Put("foo2", "bar2"));
|
|
7317
|
+
ASSERT_OK(writer->Finish());
|
|
7318
|
+
writer.reset();
|
|
7319
|
+
|
|
7320
|
+
std::unique_ptr<DB> db;
|
|
7321
|
+
options.create_if_missing = true;
|
|
7322
|
+
Status s = DB::Open(options, dbname, &db);
|
|
7323
|
+
ASSERT_OK(s);
|
|
7324
|
+
ASSERT_TRUE(db != nullptr);
|
|
7325
|
+
ColumnFamilyHandle* cfh = nullptr;
|
|
7326
|
+
ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
|
|
7327
|
+
|
|
7328
|
+
IngestExternalFileOptions ifo;
|
|
7329
|
+
ifo.allow_db_generated_files = false;
|
|
7330
|
+
ifo.fill_cache = false;
|
|
7331
|
+
s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
|
|
7332
|
+
ASSERT_OK(s);
|
|
7333
|
+
|
|
7334
|
+
std::unique_ptr<Iterator> iter(db->NewIterator({}, cfh));
|
|
7335
|
+
ASSERT_NE(iter, nullptr);
|
|
7336
|
+
iter->Seek("foo");
|
|
7337
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7338
|
+
ASSERT_EQ(iter->value(), "bar");
|
|
7339
|
+
iter->Next();
|
|
7340
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7341
|
+
ASSERT_EQ(iter->key(), "foo2");
|
|
7342
|
+
ASSERT_EQ(iter->value(), "bar2");
|
|
7343
|
+
iter->Next();
|
|
7344
|
+
ASSERT_FALSE(iter->Valid());
|
|
7345
|
+
ASSERT_OK(iter->status());
|
|
7346
|
+
iter.reset();
|
|
7347
|
+
|
|
7348
|
+
// Create an overlapping file to ingest with atomic_replace_range option
|
|
7349
|
+
ingest_file += "2";
|
|
7350
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7351
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7352
|
+
ASSERT_OK(writer->Put("foo", "val"));
|
|
7353
|
+
ASSERT_OK(writer->Put("foo2", "val2"));
|
|
7354
|
+
ASSERT_OK(writer->Finish());
|
|
7355
|
+
writer.reset();
|
|
7356
|
+
|
|
7357
|
+
ifo.snapshot_consistency = false;
|
|
7358
|
+
s = db->IngestExternalFiles({{cfh,
|
|
7359
|
+
{ingest_file},
|
|
7360
|
+
ifo,
|
|
7361
|
+
{},
|
|
7362
|
+
{},
|
|
7363
|
+
Temperature::kUnknown,
|
|
7364
|
+
{{nullptr, nullptr}}}});
|
|
7365
|
+
ASSERT_OK(s);
|
|
7366
|
+
|
|
7367
|
+
iter.reset(db->NewIterator({}, cfh));
|
|
7368
|
+
ASSERT_NE(iter, nullptr);
|
|
7369
|
+
iter->Seek("foo");
|
|
7370
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7371
|
+
ASSERT_EQ(iter->value(), "val");
|
|
7372
|
+
iter->Next();
|
|
7373
|
+
ASSERT_TRUE(iter->Valid() && iter->status().ok());
|
|
7374
|
+
ASSERT_EQ(iter->key(), "foo2");
|
|
7375
|
+
ASSERT_EQ(iter->value(), "val2");
|
|
7376
|
+
iter->Next();
|
|
7377
|
+
ASSERT_FALSE(iter->Valid());
|
|
7378
|
+
ASSERT_OK(iter->status());
|
|
7379
|
+
iter.reset();
|
|
7380
|
+
|
|
7381
|
+
// Create an overlapping file to ingest without atomic_replace_range option.
|
|
7382
|
+
// This should fail as we don't support ingesting an external file with
|
|
7383
|
+
// non-zero assigned sequence number.
|
|
7384
|
+
ingest_file += "3";
|
|
7385
|
+
writer.reset(new SstFileWriter(EnvOptions(), options));
|
|
7386
|
+
ASSERT_OK(writer->Open(ingest_file));
|
|
7387
|
+
ASSERT_OK(writer->Put("foo", "newval"));
|
|
7388
|
+
ASSERT_OK(writer->Put("foo2", "newval2"));
|
|
7389
|
+
ASSERT_OK(writer->Finish());
|
|
7390
|
+
writer.reset();
|
|
7391
|
+
|
|
7392
|
+
s = db->IngestExternalFiles(
|
|
7393
|
+
{{cfh, {ingest_file}, ifo, {}, {}, Temperature::kUnknown, {}}});
|
|
7394
|
+
ASSERT_EQ(s, Status::NotSupported());
|
|
7395
|
+
|
|
7396
|
+
ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
|
|
7397
|
+
ASSERT_OK(db->Close());
|
|
7398
|
+
}
|
|
6525
7399
|
} // namespace ROCKSDB_NAMESPACE
|
|
6526
7400
|
|
|
6527
7401
|
int main(int argc, char** argv) {
|
|
7402
|
+
// Opt-in this whole test file
|
|
7403
|
+
ROCKSDB_NAMESPACE::TEST_AllowUnsupportedFormatVersion() = true;
|
|
7404
|
+
|
|
6528
7405
|
ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
|
|
6529
7406
|
::testing::InitGoogleTest(&argc, argv);
|
|
6530
7407
|
return RUN_ALL_TESTS();
|