@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
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
|
|
6
6
|
#include "util/compression.h"
|
|
7
7
|
|
|
8
|
+
#include "options/options_helper.h"
|
|
9
|
+
#include "rocksdb/convenience.h"
|
|
10
|
+
#include "rocksdb/utilities/object_registry.h"
|
|
11
|
+
|
|
8
12
|
namespace ROCKSDB_NAMESPACE {
|
|
9
13
|
|
|
10
14
|
StreamingCompress* StreamingCompress::Create(CompressionType compression_type,
|
|
@@ -48,7 +52,7 @@ int ZSTDStreamingCompress::Compress(const char* input, size_t input_size,
|
|
|
48
52
|
if (input_size == 0) {
|
|
49
53
|
return 0;
|
|
50
54
|
}
|
|
51
|
-
#ifndef
|
|
55
|
+
#ifndef ZSTD
|
|
52
56
|
(void)input;
|
|
53
57
|
(void)input_size;
|
|
54
58
|
(void)output;
|
|
@@ -77,7 +81,7 @@ int ZSTDStreamingCompress::Compress(const char* input, size_t input_size,
|
|
|
77
81
|
}
|
|
78
82
|
|
|
79
83
|
void ZSTDStreamingCompress::Reset() {
|
|
80
|
-
#ifdef
|
|
84
|
+
#ifdef ZSTD
|
|
81
85
|
ZSTD_CCtx_reset(cctx_, ZSTD_ResetDirective::ZSTD_reset_session_only);
|
|
82
86
|
input_buffer_ = {/*src=*/nullptr, /*size=*/0, /*pos=*/0};
|
|
83
87
|
#endif
|
|
@@ -91,7 +95,7 @@ int ZSTDStreamingUncompress::Uncompress(const char* input, size_t input_size,
|
|
|
91
95
|
if (input_size == 0) {
|
|
92
96
|
return 0;
|
|
93
97
|
}
|
|
94
|
-
#ifdef
|
|
98
|
+
#ifdef ZSTD
|
|
95
99
|
if (input) {
|
|
96
100
|
// New input
|
|
97
101
|
input_buffer_ = {input, input_size, /*pos=*/0};
|
|
@@ -113,10 +117,938 @@ int ZSTDStreamingUncompress::Uncompress(const char* input, size_t input_size,
|
|
|
113
117
|
}
|
|
114
118
|
|
|
115
119
|
void ZSTDStreamingUncompress::Reset() {
|
|
116
|
-
#ifdef
|
|
120
|
+
#ifdef ZSTD
|
|
117
121
|
ZSTD_DCtx_reset(dctx_, ZSTD_ResetDirective::ZSTD_reset_session_only);
|
|
118
122
|
input_buffer_ = {/*src=*/nullptr, /*size=*/0, /*pos=*/0};
|
|
119
123
|
#endif
|
|
120
124
|
}
|
|
121
125
|
|
|
126
|
+
// ***********************************************************************
|
|
127
|
+
// BEGIN built-in implementation of customization interface
|
|
128
|
+
// ***********************************************************************
|
|
129
|
+
Status Decompressor::ExtractUncompressedSize(Args& args) {
|
|
130
|
+
// Default implementation:
|
|
131
|
+
//
|
|
132
|
+
// Standard format for prepending uncompressed size to the compressed
|
|
133
|
+
// payload. (RocksDB compress_format_version=2 except Snappy)
|
|
134
|
+
//
|
|
135
|
+
// This is historically a varint32, but it is preliminarily generalized
|
|
136
|
+
// to varint64, in case that is supported on the write side for some
|
|
137
|
+
// algorithms.
|
|
138
|
+
if (LIKELY(GetVarint64(&args.compressed_data, &args.uncompressed_size))) {
|
|
139
|
+
if (LIKELY(args.uncompressed_size <= SIZE_MAX)) {
|
|
140
|
+
return Status::OK();
|
|
141
|
+
} else {
|
|
142
|
+
return Status::MemoryLimit("Uncompressed size too large for platform");
|
|
143
|
+
}
|
|
144
|
+
} else {
|
|
145
|
+
return Status::Corruption("Unable to extract uncompressed size");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const Slice& Decompressor::GetSerializedDict() const {
|
|
150
|
+
// Default: empty slice => no dictionary
|
|
151
|
+
static Slice kEmptySlice;
|
|
152
|
+
return kEmptySlice;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
namespace {
|
|
156
|
+
|
|
157
|
+
class BuiltinCompressorV1 : public Compressor {
|
|
158
|
+
public:
|
|
159
|
+
const char* Name() const override { return "BuiltinCompressorV1"; }
|
|
160
|
+
|
|
161
|
+
explicit BuiltinCompressorV1(const CompressionOptions& opts,
|
|
162
|
+
CompressionType type)
|
|
163
|
+
: opts_(opts), type_(type) {
|
|
164
|
+
assert(type != kNoCompression);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
CompressionType GetPreferredCompressionType() const override { return type_; }
|
|
168
|
+
|
|
169
|
+
Status CompressBlock(Slice uncompressed_data, std::string* compressed_output,
|
|
170
|
+
CompressionType* out_compression_type,
|
|
171
|
+
ManagedWorkingArea* wa) override {
|
|
172
|
+
std::optional<CompressionContext> tmp_ctx;
|
|
173
|
+
CompressionContext* ctx = nullptr;
|
|
174
|
+
if (wa != nullptr && wa->owner() == this) {
|
|
175
|
+
ctx = static_cast<CompressionContext*>(wa->get());
|
|
176
|
+
}
|
|
177
|
+
if (ctx == nullptr) {
|
|
178
|
+
tmp_ctx.emplace(type_, opts_);
|
|
179
|
+
ctx = &*tmp_ctx;
|
|
180
|
+
}
|
|
181
|
+
CompressionInfo info(opts_, *ctx, CompressionDict::GetEmptyDict(), type_);
|
|
182
|
+
if (!OLD_CompressData(uncompressed_data, info,
|
|
183
|
+
1 /*compress_format_version*/, compressed_output)) {
|
|
184
|
+
*out_compression_type = kNoCompression;
|
|
185
|
+
return Status::OK();
|
|
186
|
+
}
|
|
187
|
+
*out_compression_type = type_;
|
|
188
|
+
return Status::OK();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
protected:
|
|
192
|
+
const CompressionOptions opts_;
|
|
193
|
+
const CompressionType type_;
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
class BuiltinCompressorV2 : public Compressor {
|
|
197
|
+
public:
|
|
198
|
+
const char* Name() const override { return "BuiltinCompressorV2"; }
|
|
199
|
+
|
|
200
|
+
explicit BuiltinCompressorV2(const CompressionOptions& opts,
|
|
201
|
+
CompressionType type,
|
|
202
|
+
CompressionDict&& dict = {})
|
|
203
|
+
: opts_(opts), type_(type), dict_(std::move(dict)) {
|
|
204
|
+
assert(type != kNoCompression);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
size_t GetMaxSampleSizeIfWantDict(
|
|
208
|
+
CacheEntryRole /*block_type*/) const override {
|
|
209
|
+
if (opts_.max_dict_bytes == 0) {
|
|
210
|
+
// Dictionary compression disabled
|
|
211
|
+
return 0;
|
|
212
|
+
} else {
|
|
213
|
+
return type_ == kZSTD && opts_.zstd_max_train_bytes > 0
|
|
214
|
+
? opts_.zstd_max_train_bytes
|
|
215
|
+
: opts_.max_dict_bytes;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// NOTE: empty dict is equivalent to no dict
|
|
220
|
+
Slice GetSerializedDict() const override { return dict_.GetRawDict(); }
|
|
221
|
+
|
|
222
|
+
CompressionType GetPreferredCompressionType() const override { return type_; }
|
|
223
|
+
|
|
224
|
+
std::unique_ptr<Compressor> MaybeCloneSpecialized(
|
|
225
|
+
CacheEntryRole /*block_type*/, DictSampleArgs&& dict_samples) override {
|
|
226
|
+
assert(dict_samples.Verify());
|
|
227
|
+
if (dict_samples.empty()) {
|
|
228
|
+
// Nothing to specialize on
|
|
229
|
+
return nullptr;
|
|
230
|
+
}
|
|
231
|
+
std::string dict_data;
|
|
232
|
+
// Migrated from BlockBasedTableBuilder::EnterUnbuffered()
|
|
233
|
+
if (type_ == kZSTD && opts_.zstd_max_train_bytes > 0) {
|
|
234
|
+
assert(dict_samples.sample_data.size() <= opts_.zstd_max_train_bytes);
|
|
235
|
+
if (opts_.use_zstd_dict_trainer) {
|
|
236
|
+
dict_data = ZSTD_TrainDictionary(dict_samples.sample_data,
|
|
237
|
+
dict_samples.sample_lens,
|
|
238
|
+
opts_.max_dict_bytes);
|
|
239
|
+
} else {
|
|
240
|
+
dict_data = ZSTD_FinalizeDictionary(dict_samples.sample_data,
|
|
241
|
+
dict_samples.sample_lens,
|
|
242
|
+
opts_.max_dict_bytes, opts_.level);
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
assert(dict_samples.sample_data.size() <= opts_.max_dict_bytes);
|
|
246
|
+
// ZSTD "raw content dictionary" - "Any buffer is a valid raw content
|
|
247
|
+
// dictionary." Or similar for other compressions.
|
|
248
|
+
dict_data = std::move(dict_samples.sample_data);
|
|
249
|
+
}
|
|
250
|
+
CompressionDict dict{std::move(dict_data), type_, opts_.level};
|
|
251
|
+
return std::make_unique<BuiltinCompressorV2>(opts_, type_, std::move(dict));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// TODO: use ZSTD_CCtx directly
|
|
255
|
+
ManagedWorkingArea ObtainWorkingArea() override {
|
|
256
|
+
return ManagedWorkingArea(new CompressionContext(type_, opts_), this);
|
|
257
|
+
}
|
|
258
|
+
void ReleaseWorkingArea(WorkingArea* wa) override {
|
|
259
|
+
delete static_cast<CompressionContext*>(wa);
|
|
260
|
+
}
|
|
261
|
+
Status CompressBlock(Slice uncompressed_data, std::string* compressed_output,
|
|
262
|
+
CompressionType* out_compression_type,
|
|
263
|
+
ManagedWorkingArea* wa) override {
|
|
264
|
+
std::optional<CompressionContext> tmp_ctx;
|
|
265
|
+
CompressionContext* ctx = nullptr;
|
|
266
|
+
if (wa != nullptr && wa->owner() == this) {
|
|
267
|
+
ctx = static_cast<CompressionContext*>(wa->get());
|
|
268
|
+
}
|
|
269
|
+
CompressionType type = type_;
|
|
270
|
+
if (ctx == nullptr) {
|
|
271
|
+
tmp_ctx.emplace(type, opts_);
|
|
272
|
+
ctx = &*tmp_ctx;
|
|
273
|
+
}
|
|
274
|
+
CompressionInfo info(opts_, *ctx, dict_, type);
|
|
275
|
+
if (!OLD_CompressData(uncompressed_data, info,
|
|
276
|
+
2 /*compress_format_version*/, compressed_output)) {
|
|
277
|
+
*out_compression_type = kNoCompression;
|
|
278
|
+
return Status::OK();
|
|
279
|
+
}
|
|
280
|
+
*out_compression_type = type;
|
|
281
|
+
return Status::OK();
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
protected:
|
|
285
|
+
const CompressionOptions opts_;
|
|
286
|
+
const CompressionType type_;
|
|
287
|
+
const CompressionDict dict_;
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
// NOTE: this implementation is intentionally SIMPLE based on existing code
|
|
291
|
+
// and NOT EFFICIENT because this is an old/deprecated format.
|
|
292
|
+
class BuiltinDecompressorV1 : public Decompressor {
|
|
293
|
+
public:
|
|
294
|
+
const char* Name() const override { return "BuiltinDecompressorV1"; }
|
|
295
|
+
|
|
296
|
+
Status ExtractUncompressedSize(Args& args) override {
|
|
297
|
+
CacheAllocationPtr throw_away_output;
|
|
298
|
+
return DoUncompress(args, &throw_away_output, &args.uncompressed_size);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
302
|
+
uint64_t same_uncompressed_size = 0;
|
|
303
|
+
CacheAllocationPtr output;
|
|
304
|
+
Status s = DoUncompress(args, &output, &same_uncompressed_size);
|
|
305
|
+
if (same_uncompressed_size != args.uncompressed_size) {
|
|
306
|
+
s = Status::Corruption("Compressed block size mismatch");
|
|
307
|
+
}
|
|
308
|
+
if (s.ok()) {
|
|
309
|
+
// NOTE: simple but inefficient
|
|
310
|
+
memcpy(uncompressed_output, output.get(), args.uncompressed_size);
|
|
311
|
+
}
|
|
312
|
+
return s;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
protected:
|
|
316
|
+
Status DoUncompress(const Args& args, CacheAllocationPtr* out_data,
|
|
317
|
+
uint64_t* out_uncompressed_size) {
|
|
318
|
+
assert(args.working_area == nullptr);
|
|
319
|
+
assert(*out_uncompressed_size == 0);
|
|
320
|
+
|
|
321
|
+
// NOTE: simple but inefficient
|
|
322
|
+
UncompressionContext dummy_ctx{args.compression_type};
|
|
323
|
+
UncompressionInfo info{dummy_ctx, UncompressionDict::GetEmptyDict(),
|
|
324
|
+
args.compression_type};
|
|
325
|
+
const char* error_message = nullptr;
|
|
326
|
+
size_t size_t_uncompressed_size = 0;
|
|
327
|
+
*out_data = OLD_UncompressData(
|
|
328
|
+
info, args.compressed_data.data(), args.compressed_data.size(),
|
|
329
|
+
&size_t_uncompressed_size, 1 /*compress_format_version*/,
|
|
330
|
+
nullptr /*allocator*/, &error_message);
|
|
331
|
+
if (*out_data == nullptr) {
|
|
332
|
+
if (error_message != nullptr) {
|
|
333
|
+
return Status::Corruption(error_message);
|
|
334
|
+
} else {
|
|
335
|
+
return Status::Corruption("Corrupted compressed block contents");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
*out_uncompressed_size = size_t_uncompressed_size;
|
|
339
|
+
assert(*out_uncompressed_size > 0);
|
|
340
|
+
return Status::OK();
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
class BuiltinCompressionManagerV1 : public CompressionManager {
|
|
345
|
+
public:
|
|
346
|
+
BuiltinCompressionManagerV1() = default;
|
|
347
|
+
~BuiltinCompressionManagerV1() override = default;
|
|
348
|
+
|
|
349
|
+
const char* Name() const override { return "BuiltinCompressionManagerV1"; }
|
|
350
|
+
|
|
351
|
+
const char* CompatibilityName() const override { return "BuiltinV1"; }
|
|
352
|
+
|
|
353
|
+
std::unique_ptr<Compressor> GetCompressor(const CompressionOptions& opts,
|
|
354
|
+
CompressionType type) override {
|
|
355
|
+
// At the time of deprecating the writing of new format_version=1 files,
|
|
356
|
+
// ZSTD was the last supported built-in compression type.
|
|
357
|
+
if (type > kZSTD) {
|
|
358
|
+
// Unrecognized; fall back on default compression
|
|
359
|
+
type = ColumnFamilyOptions{}.compression;
|
|
360
|
+
}
|
|
361
|
+
if (type == kNoCompression) {
|
|
362
|
+
return nullptr;
|
|
363
|
+
} else {
|
|
364
|
+
return std::make_unique<BuiltinCompressorV1>(opts, type);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
std::shared_ptr<Decompressor> GetDecompressor() override {
|
|
369
|
+
return std::shared_ptr<Decompressor>(shared_from_this(), &decompressor_);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
bool SupportsCompressionType(CompressionType type) const override {
|
|
373
|
+
return CompressionTypeSupported(type);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
protected:
|
|
377
|
+
BuiltinDecompressorV1 decompressor_;
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// Subroutines for BuiltinDecompressorV2
|
|
381
|
+
|
|
382
|
+
Status Snappy_DecompressBlock(const Decompressor::Args& args,
|
|
383
|
+
char* uncompressed_output) {
|
|
384
|
+
#ifdef SNAPPY
|
|
385
|
+
if (!snappy::RawUncompress(args.compressed_data.data(),
|
|
386
|
+
args.compressed_data.size(),
|
|
387
|
+
uncompressed_output)) {
|
|
388
|
+
return Status::Corruption("Error decompressing snappy data");
|
|
389
|
+
}
|
|
390
|
+
return Status::OK();
|
|
391
|
+
#else
|
|
392
|
+
(void)args;
|
|
393
|
+
(void)uncompressed_output;
|
|
394
|
+
return Status::NotSupported("Snappy not supported in this build");
|
|
395
|
+
#endif
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
Status Zlib_DecompressBlock(const Decompressor::Args& args, Slice dict,
|
|
399
|
+
char* uncompressed_output) {
|
|
400
|
+
#ifdef ZLIB
|
|
401
|
+
// NOTE: uses "raw" format
|
|
402
|
+
constexpr int kWindowBits = -14;
|
|
403
|
+
|
|
404
|
+
z_stream _stream;
|
|
405
|
+
memset(&_stream, 0, sizeof(z_stream));
|
|
406
|
+
|
|
407
|
+
// For raw inflate, the windowBits should be -8..-15.
|
|
408
|
+
// If windowBits is bigger than zero, it will use either zlib
|
|
409
|
+
// header or gzip header. Adding 32 to it will do automatic detection.
|
|
410
|
+
int st = inflateInit2(&_stream, kWindowBits);
|
|
411
|
+
if (UNLIKELY(st != Z_OK)) {
|
|
412
|
+
return Status::Corruption("Failed to initialize zlib inflate: " +
|
|
413
|
+
std::to_string(st));
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (!dict.empty()) {
|
|
417
|
+
// Initialize the compression library's dictionary
|
|
418
|
+
st = inflateSetDictionary(&_stream,
|
|
419
|
+
reinterpret_cast<const Bytef*>(dict.data()),
|
|
420
|
+
static_cast<unsigned int>(dict.size()));
|
|
421
|
+
if (UNLIKELY(st != Z_OK)) {
|
|
422
|
+
return Status::Corruption("Failed to initialize zlib dictionary: " +
|
|
423
|
+
std::to_string(st));
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
_stream.next_in = const_cast<Bytef*>(
|
|
428
|
+
reinterpret_cast<const Bytef*>(args.compressed_data.data()));
|
|
429
|
+
_stream.avail_in = static_cast<unsigned int>(args.compressed_data.size());
|
|
430
|
+
|
|
431
|
+
_stream.next_out = reinterpret_cast<Bytef*>(uncompressed_output);
|
|
432
|
+
_stream.avail_out = static_cast<unsigned int>(args.uncompressed_size);
|
|
433
|
+
|
|
434
|
+
st = inflate(&_stream, Z_SYNC_FLUSH);
|
|
435
|
+
if (UNLIKELY(st != Z_STREAM_END)) {
|
|
436
|
+
inflateEnd(&_stream);
|
|
437
|
+
// NOTE: Z_OK is still corruption because it means we got the size wrong
|
|
438
|
+
return Status::Corruption("Failed zlib inflate: " + std::to_string(st));
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// We should have no bytes left
|
|
442
|
+
if (_stream.avail_out != 0) {
|
|
443
|
+
inflateEnd(&_stream);
|
|
444
|
+
return Status::Corruption("Size mismatch decompressing zlib data");
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
inflateEnd(&_stream);
|
|
448
|
+
return Status::OK();
|
|
449
|
+
#else
|
|
450
|
+
(void)args;
|
|
451
|
+
(void)dict;
|
|
452
|
+
(void)uncompressed_output;
|
|
453
|
+
return Status::NotSupported("Zlib not supported in this build");
|
|
454
|
+
#endif
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
Status BZip2_DecompressBlock(const Decompressor::Args& args,
|
|
458
|
+
char* uncompressed_output) {
|
|
459
|
+
#ifdef BZIP2
|
|
460
|
+
auto uncompressed_size = static_cast<unsigned int>(args.uncompressed_size);
|
|
461
|
+
if (BZ_OK != BZ2_bzBuffToBuffDecompress(
|
|
462
|
+
uncompressed_output, &uncompressed_size,
|
|
463
|
+
const_cast<char*>(args.compressed_data.data()),
|
|
464
|
+
static_cast<unsigned int>(args.compressed_data.size()),
|
|
465
|
+
0 /*small mem*/, 0 /*verbosity*/)) {
|
|
466
|
+
return Status::Corruption("Error decompressing bzip2 data");
|
|
467
|
+
}
|
|
468
|
+
if (uncompressed_size != args.uncompressed_size) {
|
|
469
|
+
return Status::Corruption("Size mismatch decompressing bzip2 data");
|
|
470
|
+
}
|
|
471
|
+
return Status::OK();
|
|
472
|
+
#else
|
|
473
|
+
(void)args;
|
|
474
|
+
(void)uncompressed_output;
|
|
475
|
+
return Status::NotSupported("BZip2 not supported in this build");
|
|
476
|
+
#endif
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
Status LZ4_DecompressBlock(const Decompressor::Args& args, Slice dict,
|
|
480
|
+
char* uncompressed_output) {
|
|
481
|
+
#ifdef LZ4
|
|
482
|
+
int expected_uncompressed_size = static_cast<int>(args.uncompressed_size);
|
|
483
|
+
#if LZ4_VERSION_NUMBER >= 10400 // r124+
|
|
484
|
+
LZ4_streamDecode_t* stream = LZ4_createStreamDecode();
|
|
485
|
+
if (!dict.empty()) {
|
|
486
|
+
LZ4_setStreamDecode(stream, dict.data(), static_cast<int>(dict.size()));
|
|
487
|
+
}
|
|
488
|
+
int uncompressed_size = LZ4_decompress_safe_continue(
|
|
489
|
+
stream, args.compressed_data.data(), uncompressed_output,
|
|
490
|
+
static_cast<int>(args.compressed_data.size()),
|
|
491
|
+
expected_uncompressed_size);
|
|
492
|
+
LZ4_freeStreamDecode(stream);
|
|
493
|
+
#else // up to r123
|
|
494
|
+
if (!dict.empty()) {
|
|
495
|
+
return Status::NotSupported(
|
|
496
|
+
"This build doesn't support dictionary compression with LZ4");
|
|
497
|
+
}
|
|
498
|
+
int uncompressed_size =
|
|
499
|
+
LZ4_decompress_safe(args.compressed_data.data(), uncompressed_output,
|
|
500
|
+
static_cast<int>(args.compressed_data.size()),
|
|
501
|
+
expected_uncompressed_size);
|
|
502
|
+
#endif // LZ4_VERSION_NUMBER >= 10400
|
|
503
|
+
|
|
504
|
+
if (uncompressed_size != expected_uncompressed_size) {
|
|
505
|
+
if (uncompressed_size < 0) {
|
|
506
|
+
return Status::Corruption("Error decompressing LZ4 data");
|
|
507
|
+
} else {
|
|
508
|
+
return Status::Corruption("Size mismatch decompressing LZ4 data");
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return Status::OK();
|
|
512
|
+
#else
|
|
513
|
+
(void)args;
|
|
514
|
+
(void)dict;
|
|
515
|
+
(void)uncompressed_output;
|
|
516
|
+
return Status::NotSupported("LZ4 not supported in this build");
|
|
517
|
+
#endif
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
Status XPRESS_DecompressBlock(const Decompressor::Args& args,
|
|
521
|
+
char* uncompressed_output) {
|
|
522
|
+
#ifdef XPRESS
|
|
523
|
+
int64_t actual_uncompressed_size = port::xpress::DecompressToBuffer(
|
|
524
|
+
args.compressed_data.data(), args.compressed_data.size(),
|
|
525
|
+
uncompressed_output, args.uncompressed_size);
|
|
526
|
+
if (actual_uncompressed_size !=
|
|
527
|
+
static_cast<int64_t>(args.uncompressed_size)) {
|
|
528
|
+
if (actual_uncompressed_size < 0) {
|
|
529
|
+
return Status::Corruption("Error decompressing XPRESS data");
|
|
530
|
+
} else {
|
|
531
|
+
return Status::Corruption("Size mismatch decompressing XPRESS data");
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return Status::OK();
|
|
535
|
+
#else
|
|
536
|
+
(void)args;
|
|
537
|
+
(void)uncompressed_output;
|
|
538
|
+
return Status::NotSupported("XPRESS not supported in this build");
|
|
539
|
+
#endif
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
template <bool kIsDigestedDict = false>
|
|
543
|
+
Status ZSTD_DecompressBlockWithContext(
|
|
544
|
+
const Decompressor::Args& args,
|
|
545
|
+
std::conditional_t<kIsDigestedDict, void*, Slice> dict,
|
|
546
|
+
ZSTDUncompressCachedData::ZSTDNativeContext zstd_context,
|
|
547
|
+
char* uncompressed_output) {
|
|
548
|
+
#ifdef ZSTD
|
|
549
|
+
size_t uncompressed_size;
|
|
550
|
+
assert(zstd_context != nullptr);
|
|
551
|
+
if constexpr (kIsDigestedDict) {
|
|
552
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
553
|
+
uncompressed_size = ZSTD_decompress_usingDDict(
|
|
554
|
+
zstd_context, uncompressed_output, args.uncompressed_size,
|
|
555
|
+
args.compressed_data.data(), args.compressed_data.size(),
|
|
556
|
+
static_cast<ZSTD_DDict*>(dict));
|
|
557
|
+
#else
|
|
558
|
+
static_assert(!kIsDigestedDict,
|
|
559
|
+
"Inconsistent expectation of ZSTD digested dict support");
|
|
560
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
561
|
+
} else if (dict.empty()) {
|
|
562
|
+
uncompressed_size = ZSTD_decompressDCtx(
|
|
563
|
+
zstd_context, uncompressed_output, args.uncompressed_size,
|
|
564
|
+
args.compressed_data.data(), args.compressed_data.size());
|
|
565
|
+
} else {
|
|
566
|
+
uncompressed_size = ZSTD_decompress_usingDict(
|
|
567
|
+
zstd_context, uncompressed_output, args.uncompressed_size,
|
|
568
|
+
args.compressed_data.data(), args.compressed_data.size(), dict.data(),
|
|
569
|
+
dict.size());
|
|
570
|
+
}
|
|
571
|
+
if (ZSTD_isError(uncompressed_size)) {
|
|
572
|
+
return Status::Corruption(std::string("ZSTD ") +
|
|
573
|
+
ZSTD_getErrorName(uncompressed_size));
|
|
574
|
+
} else if (uncompressed_size != args.uncompressed_size) {
|
|
575
|
+
return Status::Corruption("ZSTD decompression size mismatch");
|
|
576
|
+
} else {
|
|
577
|
+
return Status::OK();
|
|
578
|
+
}
|
|
579
|
+
#else
|
|
580
|
+
(void)args;
|
|
581
|
+
(void)dict;
|
|
582
|
+
(void)zstd_context;
|
|
583
|
+
(void)uncompressed_output;
|
|
584
|
+
return Status::NotSupported("ZSTD not supported in this build");
|
|
585
|
+
#endif
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
template <bool kIsDigestedDict = false>
|
|
589
|
+
Status ZSTD_DecompressBlock(
|
|
590
|
+
const Decompressor::Args& args,
|
|
591
|
+
std::conditional_t<kIsDigestedDict, void*, Slice> dict,
|
|
592
|
+
const Decompressor* decompressor, char* uncompressed_output) {
|
|
593
|
+
if (args.working_area && args.working_area->owner() == decompressor) {
|
|
594
|
+
auto ctx = static_cast<UncompressionContext*>(args.working_area->get());
|
|
595
|
+
assert(ctx != nullptr);
|
|
596
|
+
if (ctx->GetZSTDContext() != nullptr) {
|
|
597
|
+
return ZSTD_DecompressBlockWithContext<kIsDigestedDict>(
|
|
598
|
+
args, dict, ctx->GetZSTDContext(), uncompressed_output);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
UncompressionContext tmp_ctx{kZSTD};
|
|
602
|
+
return ZSTD_DecompressBlockWithContext<kIsDigestedDict>(
|
|
603
|
+
args, dict, tmp_ctx.GetZSTDContext(), uncompressed_output);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
class BuiltinDecompressorV2 : public Decompressor {
|
|
607
|
+
public:
|
|
608
|
+
const char* Name() const override { return "BuiltinDecompressorV2"; }
|
|
609
|
+
|
|
610
|
+
Status ExtractUncompressedSize(Args& args) override {
|
|
611
|
+
assert(args.compression_type != kNoCompression);
|
|
612
|
+
if (args.compression_type == kSnappyCompression) {
|
|
613
|
+
// 1st exception to encoding of uncompressed size
|
|
614
|
+
#ifdef SNAPPY
|
|
615
|
+
size_t uncompressed_length = 0;
|
|
616
|
+
if (!snappy::GetUncompressedLength(args.compressed_data.data(),
|
|
617
|
+
args.compressed_data.size(),
|
|
618
|
+
&uncompressed_length)) {
|
|
619
|
+
return Status::Corruption("Error reading snappy compressed length");
|
|
620
|
+
}
|
|
621
|
+
args.uncompressed_size = uncompressed_length;
|
|
622
|
+
return Status::OK();
|
|
623
|
+
#else
|
|
624
|
+
return Status::NotSupported("Snappy not supported in this build");
|
|
625
|
+
#endif
|
|
626
|
+
} else if (args.compression_type == kXpressCompression) {
|
|
627
|
+
// 2nd exception to encoding of uncompressed size
|
|
628
|
+
#ifdef XPRESS
|
|
629
|
+
int64_t result = port::xpress::GetDecompressedSize(
|
|
630
|
+
args.compressed_data.data(), args.compressed_data.size());
|
|
631
|
+
if (result < 0) {
|
|
632
|
+
return Status::Corruption("Error reading XPRESS compressed length");
|
|
633
|
+
}
|
|
634
|
+
args.uncompressed_size = static_cast<size_t>(result);
|
|
635
|
+
return Status::OK();
|
|
636
|
+
#else
|
|
637
|
+
return Status::NotSupported("XPRESS not supported in this build");
|
|
638
|
+
#endif
|
|
639
|
+
|
|
640
|
+
} else {
|
|
641
|
+
// Extract encoded uncompressed size
|
|
642
|
+
return Decompressor::ExtractUncompressedSize(args);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
647
|
+
switch (args.compression_type) {
|
|
648
|
+
case kSnappyCompression:
|
|
649
|
+
return Snappy_DecompressBlock(args, uncompressed_output);
|
|
650
|
+
case kZlibCompression:
|
|
651
|
+
return Zlib_DecompressBlock(args, /*dict=*/Slice{},
|
|
652
|
+
uncompressed_output);
|
|
653
|
+
case kBZip2Compression:
|
|
654
|
+
return BZip2_DecompressBlock(args, uncompressed_output);
|
|
655
|
+
case kLZ4Compression:
|
|
656
|
+
case kLZ4HCCompression:
|
|
657
|
+
return LZ4_DecompressBlock(args, /*dict=*/Slice{}, uncompressed_output);
|
|
658
|
+
case kXpressCompression:
|
|
659
|
+
return XPRESS_DecompressBlock(args, uncompressed_output);
|
|
660
|
+
case kZSTD:
|
|
661
|
+
return ZSTD_DecompressBlock(args, /*dict=*/Slice{}, this,
|
|
662
|
+
uncompressed_output);
|
|
663
|
+
default:
|
|
664
|
+
return Status::NotSupported(
|
|
665
|
+
"Compression type not supported or not built-in: " +
|
|
666
|
+
CompressionTypeToString(args.compression_type));
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
Status MaybeCloneForDict(const Slice&,
|
|
671
|
+
std::unique_ptr<Decompressor>*) override;
|
|
672
|
+
|
|
673
|
+
size_t ApproximateOwnedMemoryUsage() const override {
|
|
674
|
+
return sizeof(BuiltinDecompressorV2);
|
|
675
|
+
}
|
|
676
|
+
};
|
|
677
|
+
|
|
678
|
+
class BuiltinDecompressorV2SnappyOnly : public BuiltinDecompressorV2 {
|
|
679
|
+
public:
|
|
680
|
+
const char* Name() const override {
|
|
681
|
+
return "BuiltinDecompressorV2SnappyOnly";
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
Status ExtractUncompressedSize(Args& args) override {
|
|
685
|
+
assert(args.compression_type == kSnappyCompression);
|
|
686
|
+
#ifdef SNAPPY
|
|
687
|
+
size_t uncompressed_length = 0;
|
|
688
|
+
if (!snappy::GetUncompressedLength(args.compressed_data.data(),
|
|
689
|
+
args.compressed_data.size(),
|
|
690
|
+
&uncompressed_length)) {
|
|
691
|
+
return Status::Corruption("Error reading snappy compressed length");
|
|
692
|
+
}
|
|
693
|
+
args.uncompressed_size = uncompressed_length;
|
|
694
|
+
return Status::OK();
|
|
695
|
+
#else
|
|
696
|
+
return Status::NotSupported("Snappy not supported in this build");
|
|
697
|
+
#endif
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
701
|
+
assert(args.compression_type == kSnappyCompression);
|
|
702
|
+
return Snappy_DecompressBlock(args, uncompressed_output);
|
|
703
|
+
}
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
class BuiltinDecompressorV2WithDict : public BuiltinDecompressorV2 {
|
|
707
|
+
public:
|
|
708
|
+
explicit BuiltinDecompressorV2WithDict(const Slice& dict) : dict_(dict) {}
|
|
709
|
+
|
|
710
|
+
const char* Name() const override { return "BuiltinDecompressorV2WithDict"; }
|
|
711
|
+
|
|
712
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
713
|
+
switch (args.compression_type) {
|
|
714
|
+
case kSnappyCompression:
|
|
715
|
+
// NOTE: quietly ignores the dictionary (for compatibility)
|
|
716
|
+
return Snappy_DecompressBlock(args, uncompressed_output);
|
|
717
|
+
case kZlibCompression:
|
|
718
|
+
return Zlib_DecompressBlock(args, dict_, uncompressed_output);
|
|
719
|
+
case kBZip2Compression:
|
|
720
|
+
// NOTE: quietly ignores the dictionary (for compatibility)
|
|
721
|
+
return BZip2_DecompressBlock(args, uncompressed_output);
|
|
722
|
+
case kLZ4Compression:
|
|
723
|
+
case kLZ4HCCompression:
|
|
724
|
+
return LZ4_DecompressBlock(args, dict_, uncompressed_output);
|
|
725
|
+
case kXpressCompression:
|
|
726
|
+
// NOTE: quietly ignores the dictionary (for compatibility)
|
|
727
|
+
return XPRESS_DecompressBlock(args, uncompressed_output);
|
|
728
|
+
case kZSTD:
|
|
729
|
+
return ZSTD_DecompressBlock(args, dict_, this, uncompressed_output);
|
|
730
|
+
default:
|
|
731
|
+
return Status::NotSupported(
|
|
732
|
+
"Compression type not supported or not built-in: " +
|
|
733
|
+
CompressionTypeToString(args.compression_type));
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
const Slice& GetSerializedDict() const override { return dict_; }
|
|
738
|
+
|
|
739
|
+
size_t ApproximateOwnedMemoryUsage() const override {
|
|
740
|
+
return sizeof(BuiltinDecompressorV2WithDict);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
protected:
|
|
744
|
+
const Slice dict_;
|
|
745
|
+
};
|
|
746
|
+
|
|
747
|
+
Status BuiltinDecompressorV2::MaybeCloneForDict(
|
|
748
|
+
const Slice& dict, std::unique_ptr<Decompressor>* out) {
|
|
749
|
+
// Because of unfortunate decisions in handling built-in compression types,
|
|
750
|
+
// all the compression types before ZSTD that do not actually support
|
|
751
|
+
// dictionary compression pretend to support it. Specifically, we have to be
|
|
752
|
+
// able to read files with a compression dictionary block using those
|
|
753
|
+
// compression types even though the compression dictionary is ignored by
|
|
754
|
+
// the compression algorithm. And the Decompressor has to return the
|
|
755
|
+
// configured dictionary from GetSerializedDict() even if it is ignored. This
|
|
756
|
+
// unfortunately means that a new schema version (BuiltinV3?) would be needed
|
|
757
|
+
// toactually support dictionary compression in the future for these
|
|
758
|
+
// algorithms (if the libraries add support).
|
|
759
|
+
// TODO: can we make this a better/cleaner experience?
|
|
760
|
+
*out = std::make_unique<BuiltinDecompressorV2WithDict>(dict);
|
|
761
|
+
return Status::OK();
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
class BuiltinDecompressorV2OptimizeZstd : public BuiltinDecompressorV2 {
|
|
765
|
+
public:
|
|
766
|
+
const char* Name() const override {
|
|
767
|
+
return "BuiltinDecompressorV2OptimizeZstd";
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
ManagedWorkingArea ObtainWorkingArea(CompressionType preferred) override {
|
|
771
|
+
if (preferred == kZSTD) {
|
|
772
|
+
// TODO: evaluate whether it makes sense to use core local cache here.
|
|
773
|
+
// (Perhaps not, because explicit WorkingArea could be long-running.)
|
|
774
|
+
return ManagedWorkingArea(new UncompressionContext(kZSTD), this);
|
|
775
|
+
} else {
|
|
776
|
+
return {};
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
void ReleaseWorkingArea(WorkingArea* wa) override {
|
|
781
|
+
delete static_cast<UncompressionContext*>(wa);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
785
|
+
if (LIKELY(args.compression_type == kZSTD)) {
|
|
786
|
+
return ZSTD_DecompressBlock(args, /*dict=*/Slice{}, this,
|
|
787
|
+
uncompressed_output);
|
|
788
|
+
} else {
|
|
789
|
+
return BuiltinDecompressorV2::DecompressBlock(args, uncompressed_output);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
Status MaybeCloneForDict(const Slice& /*serialized_dict*/,
|
|
794
|
+
std::unique_ptr<Decompressor>* /*out*/) override;
|
|
795
|
+
};
|
|
796
|
+
|
|
797
|
+
class BuiltinDecompressorV2OptimizeZstdWithDict
|
|
798
|
+
: public BuiltinDecompressorV2OptimizeZstd {
|
|
799
|
+
public:
|
|
800
|
+
BuiltinDecompressorV2OptimizeZstdWithDict(const Slice& dict)
|
|
801
|
+
:
|
|
802
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
803
|
+
dict_(dict),
|
|
804
|
+
ddict_(ZSTD_createDDict_byReference(dict.data(), dict.size())) {
|
|
805
|
+
assert(ddict_ != nullptr);
|
|
806
|
+
}
|
|
807
|
+
#else
|
|
808
|
+
dict_(dict) {
|
|
809
|
+
}
|
|
810
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
811
|
+
|
|
812
|
+
const char* Name() const override {
|
|
813
|
+
return "BuiltinDecompressorV2OptimizeZstdWithDict";
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
~BuiltinDecompressorV2OptimizeZstdWithDict() override {
|
|
817
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
818
|
+
size_t res = ZSTD_freeDDict(ddict_);
|
|
819
|
+
assert(res == 0); // Last I checked they can't fail
|
|
820
|
+
(void)res; // prevent unused var warning
|
|
821
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
const Slice& GetSerializedDict() const override { return dict_; }
|
|
825
|
+
|
|
826
|
+
size_t ApproximateOwnedMemoryUsage() const override {
|
|
827
|
+
size_t sz = sizeof(BuiltinDecompressorV2WithDict);
|
|
828
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
829
|
+
sz += ZSTD_sizeof_DDict(ddict_);
|
|
830
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
831
|
+
return sz;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
Status DecompressBlock(const Args& args, char* uncompressed_output) override {
|
|
835
|
+
if (LIKELY(args.compression_type == kZSTD)) {
|
|
836
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
837
|
+
return ZSTD_DecompressBlock</*kIsDigestedDict=*/true>(
|
|
838
|
+
args, ddict_, this, uncompressed_output);
|
|
839
|
+
#else
|
|
840
|
+
return ZSTD_DecompressBlock(args, dict_, this, uncompressed_output);
|
|
841
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
842
|
+
} else {
|
|
843
|
+
return BuiltinDecompressorV2WithDict(dict_).DecompressBlock(
|
|
844
|
+
args, uncompressed_output);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
protected:
|
|
849
|
+
const Slice dict_;
|
|
850
|
+
#ifdef ROCKSDB_ZSTD_DDICT
|
|
851
|
+
ZSTD_DDict* const ddict_;
|
|
852
|
+
#endif // ROCKSDB_ZSTD_DDICT
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
Status BuiltinDecompressorV2OptimizeZstd::MaybeCloneForDict(
|
|
856
|
+
const Slice& serialized_dict, std::unique_ptr<Decompressor>* out) {
|
|
857
|
+
*out = std::make_unique<BuiltinDecompressorV2OptimizeZstdWithDict>(
|
|
858
|
+
serialized_dict);
|
|
859
|
+
return Status::OK();
|
|
860
|
+
}
|
|
861
|
+
class BuiltinCompressionManagerV2 : public CompressionManager {
|
|
862
|
+
public:
|
|
863
|
+
BuiltinCompressionManagerV2() = default;
|
|
864
|
+
~BuiltinCompressionManagerV2() override = default;
|
|
865
|
+
|
|
866
|
+
const char* Name() const override { return "BuiltinCompressionManagerV2"; }
|
|
867
|
+
|
|
868
|
+
const char* CompatibilityName() const override { return "BuiltinV2"; }
|
|
869
|
+
|
|
870
|
+
std::unique_ptr<Compressor> GetCompressor(const CompressionOptions& opts,
|
|
871
|
+
CompressionType type) override {
|
|
872
|
+
if (opts.max_compressed_bytes_per_kb <= 0) {
|
|
873
|
+
// No acceptable compression ratio => no compression
|
|
874
|
+
return nullptr;
|
|
875
|
+
}
|
|
876
|
+
if (type > kLastBuiltinCompression) {
|
|
877
|
+
// Unrecognized; fall back on default compression
|
|
878
|
+
type = ColumnFamilyOptions{}.compression;
|
|
879
|
+
}
|
|
880
|
+
if (type == kNoCompression) {
|
|
881
|
+
return nullptr;
|
|
882
|
+
} else {
|
|
883
|
+
return std::make_unique<BuiltinCompressorV2>(opts, type);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
std::shared_ptr<Decompressor> GetDecompressor() override {
|
|
888
|
+
return GetGeneralDecompressor();
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
std::shared_ptr<Decompressor> GetDecompressorOptimizeFor(
|
|
892
|
+
CompressionType optimize_for_type) override {
|
|
893
|
+
if (optimize_for_type == kZSTD) {
|
|
894
|
+
return GetZstdDecompressor();
|
|
895
|
+
} else {
|
|
896
|
+
return GetGeneralDecompressor();
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
std::shared_ptr<Decompressor> GetDecompressorForTypes(
|
|
901
|
+
const CompressionType* types_begin,
|
|
902
|
+
const CompressionType* types_end) override {
|
|
903
|
+
if (types_begin == types_end) {
|
|
904
|
+
return nullptr;
|
|
905
|
+
} else if (types_begin + 1 == types_end &&
|
|
906
|
+
*types_begin == kSnappyCompression) {
|
|
907
|
+
return GetSnappyDecompressor();
|
|
908
|
+
} else if (std::find(types_begin, types_end, kZSTD)) {
|
|
909
|
+
return GetZstdDecompressor();
|
|
910
|
+
} else {
|
|
911
|
+
return GetGeneralDecompressor();
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
std::shared_ptr<Decompressor> GetDecompressorForCompressor(
|
|
915
|
+
const Compressor& compressor) override {
|
|
916
|
+
#ifdef ROCKSDB_USE_RTTI
|
|
917
|
+
// To be extra safe, only optimize here if we are certain we are not
|
|
918
|
+
// looking at a wrapped compressor, so that we are sure it only uses that
|
|
919
|
+
// one compression type.
|
|
920
|
+
if (dynamic_cast<const BuiltinCompressorV2*>(&compressor)) {
|
|
921
|
+
CompressionType type = compressor.GetPreferredCompressionType();
|
|
922
|
+
return GetDecompressorForTypes(&type, &type + 1);
|
|
923
|
+
}
|
|
924
|
+
#endif
|
|
925
|
+
// Fallback
|
|
926
|
+
return CompressionManager::GetDecompressorForCompressor(compressor);
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
bool SupportsCompressionType(CompressionType type) const override {
|
|
930
|
+
return CompressionTypeSupported(type);
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
protected:
|
|
934
|
+
BuiltinDecompressorV2 decompressor_;
|
|
935
|
+
BuiltinDecompressorV2OptimizeZstd zstd_decompressor_;
|
|
936
|
+
BuiltinDecompressorV2SnappyOnly snappy_decompressor_;
|
|
937
|
+
|
|
938
|
+
inline std::shared_ptr<Decompressor> GetGeneralDecompressor() {
|
|
939
|
+
return std::shared_ptr<Decompressor>(shared_from_this(), &decompressor_);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
inline std::shared_ptr<Decompressor> GetZstdDecompressor() {
|
|
943
|
+
return std::shared_ptr<Decompressor>(shared_from_this(),
|
|
944
|
+
&zstd_decompressor_);
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
inline std::shared_ptr<Decompressor> GetSnappyDecompressor() {
|
|
948
|
+
return std::shared_ptr<Decompressor>(shared_from_this(),
|
|
949
|
+
&snappy_decompressor_);
|
|
950
|
+
}
|
|
951
|
+
};
|
|
952
|
+
|
|
953
|
+
const std::shared_ptr<BuiltinCompressionManagerV1>
|
|
954
|
+
kBuiltinCompressionManagerV1 =
|
|
955
|
+
std::make_shared<BuiltinCompressionManagerV1>();
|
|
956
|
+
const std::shared_ptr<BuiltinCompressionManagerV2>
|
|
957
|
+
kBuiltinCompressionManagerV2 =
|
|
958
|
+
std::make_shared<BuiltinCompressionManagerV2>();
|
|
959
|
+
|
|
960
|
+
} // namespace
|
|
961
|
+
|
|
962
|
+
Status CompressionManager::CreateFromString(
|
|
963
|
+
const ConfigOptions& config_options, const std::string& value,
|
|
964
|
+
std::shared_ptr<CompressionManager>* result) {
|
|
965
|
+
if (value == kNullptrString || value.empty()) {
|
|
966
|
+
result->reset();
|
|
967
|
+
return Status::OK();
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
static std::once_flag loaded;
|
|
971
|
+
std::call_once(loaded, [&]() {
|
|
972
|
+
auto& library = *ObjectLibrary::Default();
|
|
973
|
+
// TODO: try to enhance ObjectLibrary to support singletons
|
|
974
|
+
library.AddFactory<CompressionManager>(
|
|
975
|
+
kBuiltinCompressionManagerV1->CompatibilityName(),
|
|
976
|
+
[](const std::string& /*uri*/,
|
|
977
|
+
std::unique_ptr<CompressionManager>* guard,
|
|
978
|
+
std::string* /*errmsg*/) {
|
|
979
|
+
*guard = std::make_unique<BuiltinCompressionManagerV1>();
|
|
980
|
+
return guard->get();
|
|
981
|
+
});
|
|
982
|
+
library.AddFactory<CompressionManager>(
|
|
983
|
+
kBuiltinCompressionManagerV2->CompatibilityName(),
|
|
984
|
+
[](const std::string& /*uri*/,
|
|
985
|
+
std::unique_ptr<CompressionManager>* guard,
|
|
986
|
+
std::string* /*errmsg*/) {
|
|
987
|
+
*guard = std::make_unique<BuiltinCompressionManagerV2>();
|
|
988
|
+
return guard->get();
|
|
989
|
+
});
|
|
990
|
+
});
|
|
991
|
+
|
|
992
|
+
std::string id;
|
|
993
|
+
std::unordered_map<std::string, std::string> opt_map;
|
|
994
|
+
Status status = Customizable::GetOptionsMap(config_options, result->get(),
|
|
995
|
+
value, &id, &opt_map);
|
|
996
|
+
if (!status.ok()) { // GetOptionsMap failed
|
|
997
|
+
return status;
|
|
998
|
+
} else if (id.empty()) { // We have no Id but have options. Not good
|
|
999
|
+
return Status::NotSupported("Cannot reset object ", id);
|
|
1000
|
+
} else {
|
|
1001
|
+
status = config_options.registry->NewSharedObject(id, result);
|
|
1002
|
+
}
|
|
1003
|
+
if (config_options.ignore_unsupported_options && status.IsNotSupported()) {
|
|
1004
|
+
return Status::OK();
|
|
1005
|
+
} else if (status.ok()) {
|
|
1006
|
+
status = Customizable::ConfigureNewObject(config_options, result->get(),
|
|
1007
|
+
opt_map);
|
|
1008
|
+
}
|
|
1009
|
+
return status;
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
std::shared_ptr<CompressionManager>
|
|
1013
|
+
CompressionManager::FindCompatibleCompressionManager(Slice compatibility_name) {
|
|
1014
|
+
if (compatibility_name.compare(CompatibilityName()) == 0) {
|
|
1015
|
+
return shared_from_this();
|
|
1016
|
+
} else {
|
|
1017
|
+
std::shared_ptr<CompressionManager> out;
|
|
1018
|
+
Status s =
|
|
1019
|
+
CreateFromString(ConfigOptions(), compatibility_name.ToString(), &out);
|
|
1020
|
+
if (s.ok()) {
|
|
1021
|
+
return out;
|
|
1022
|
+
} else {
|
|
1023
|
+
return nullptr;
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
const std::shared_ptr<CompressionManager>& GetBuiltinCompressionManager(
|
|
1029
|
+
int compression_format_version) {
|
|
1030
|
+
static const std::shared_ptr<CompressionManager> v1_as_base =
|
|
1031
|
+
kBuiltinCompressionManagerV1;
|
|
1032
|
+
static const std::shared_ptr<CompressionManager> v2_as_base =
|
|
1033
|
+
kBuiltinCompressionManagerV2;
|
|
1034
|
+
static const std::shared_ptr<CompressionManager> none;
|
|
1035
|
+
if (compression_format_version == 1) {
|
|
1036
|
+
return v1_as_base;
|
|
1037
|
+
} else if (compression_format_version == 2) {
|
|
1038
|
+
return v2_as_base;
|
|
1039
|
+
} else {
|
|
1040
|
+
// Unrecognized. In some cases this is unexpected and the caller can
|
|
1041
|
+
// rightfully crash.
|
|
1042
|
+
return none;
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
const std::shared_ptr<CompressionManager>& GetBuiltinV2CompressionManager() {
|
|
1047
|
+
return GetBuiltinCompressionManager(2);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// ***********************************************************************
|
|
1051
|
+
// END built-in implementation of customization interface
|
|
1052
|
+
// ***********************************************************************
|
|
1053
|
+
|
|
122
1054
|
} // namespace ROCKSDB_NAMESPACE
|