@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
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
// Use of this source code is governed by a BSD-style license that can be
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
|
-
|
|
11
10
|
#include <algorithm>
|
|
12
11
|
#include <atomic>
|
|
13
12
|
#include <cinttypes>
|
|
@@ -191,6 +190,7 @@ class BackupEngineImpl {
|
|
|
191
190
|
|
|
192
191
|
private:
|
|
193
192
|
void DeleteChildren(const std::string& dir,
|
|
193
|
+
const std::unordered_set<uint64_t>& files_to_keep,
|
|
194
194
|
uint32_t file_type_filter = 0) const;
|
|
195
195
|
IOStatus DeleteBackupNoGC(BackupID backup_id);
|
|
196
196
|
|
|
@@ -504,6 +504,17 @@ class BackupEngineImpl {
|
|
|
504
504
|
BackupInfo* backup_info,
|
|
505
505
|
bool include_file_details) const;
|
|
506
506
|
|
|
507
|
+
// Infers set of existing destination files that could be retained
|
|
508
|
+
// during the incremental restore procedure in accordance with user
|
|
509
|
+
// selected strategy (RestoreMode). File can be retained only if it's
|
|
510
|
+
// deemed to exist in the referenced backup set.
|
|
511
|
+
void InferDBFilesToRetainInRestore(
|
|
512
|
+
const std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>&
|
|
513
|
+
restore_file_infos,
|
|
514
|
+
std::unordered_set<std::string>& unowned_backups,
|
|
515
|
+
const std::string& db_dir, RestoreOptions::Mode mode,
|
|
516
|
+
std::unordered_set<uint64_t>& files_to_keep) const;
|
|
517
|
+
|
|
507
518
|
inline std::string GetAbsolutePath(
|
|
508
519
|
const std::string& relative_path = "") const {
|
|
509
520
|
assert(relative_path.size() == 0 || relative_path[0] != '/');
|
|
@@ -551,6 +562,18 @@ class BackupEngineImpl {
|
|
|
551
562
|
}
|
|
552
563
|
return file_copy;
|
|
553
564
|
}
|
|
565
|
+
|
|
566
|
+
inline std::string GenerateSharedFileWithDbSessionIdAndSize(
|
|
567
|
+
const std::string& file, const uint64_t file_size,
|
|
568
|
+
const std::string& db_session_id) const {
|
|
569
|
+
assert(file.size() == 0 || file[0] != '/');
|
|
570
|
+
std::string file_copy = file;
|
|
571
|
+
file_copy.insert(file_copy.find_last_of('.'), "_s" + db_session_id);
|
|
572
|
+
file_copy.insert(file_copy.find_last_of('.'),
|
|
573
|
+
"_" + std::to_string(file_size));
|
|
574
|
+
return kSharedChecksumDirSlash + file_copy;
|
|
575
|
+
}
|
|
576
|
+
|
|
554
577
|
static inline std::string GetFileFromChecksumFile(const std::string& file) {
|
|
555
578
|
assert(file.size() == 0 || file[0] != '/');
|
|
556
579
|
std::string file_copy = file;
|
|
@@ -558,6 +581,7 @@ class BackupEngineImpl {
|
|
|
558
581
|
return file_copy.erase(first_underscore,
|
|
559
582
|
file_copy.find_last_of('.') - first_underscore);
|
|
560
583
|
}
|
|
584
|
+
|
|
561
585
|
inline std::string GetBackupMetaFile(BackupID backup_id, bool tmp) const {
|
|
562
586
|
return GetAbsolutePath(kMetaDirName) + "/" + (tmp ? "." : "") +
|
|
563
587
|
std::to_string(backup_id) + (tmp ? ".tmp" : "");
|
|
@@ -582,6 +606,8 @@ class BackupEngineImpl {
|
|
|
582
606
|
uint64_t* bytes_toward_next_callback,
|
|
583
607
|
uint64_t* size, std::string* checksum_hex);
|
|
584
608
|
|
|
609
|
+
uint64_t CalculateIOBufferSize(RateLimiter* rate_limiter) const;
|
|
610
|
+
|
|
585
611
|
IOStatus ReadFileAndComputeChecksum(const std::string& src,
|
|
586
612
|
const std::shared_ptr<FileSystem>& src_fs,
|
|
587
613
|
const EnvOptions& src_env_options,
|
|
@@ -593,10 +619,32 @@ class BackupEngineImpl {
|
|
|
593
619
|
Status GetFileDbIdentities(Env* src_env, const EnvOptions& src_env_options,
|
|
594
620
|
const std::string& file_path,
|
|
595
621
|
Temperature file_temp, RateLimiter* rate_limiter,
|
|
596
|
-
std::string* db_id,
|
|
622
|
+
std::string* db_id,
|
|
623
|
+
std::string* db_session_id) const;
|
|
624
|
+
|
|
625
|
+
struct WorkItemResult {
|
|
626
|
+
WorkItemResult()
|
|
627
|
+
: size(0),
|
|
628
|
+
expected_src_temperature(Temperature::kUnknown),
|
|
629
|
+
current_src_temperature(Temperature::kUnknown) {}
|
|
597
630
|
|
|
598
|
-
|
|
599
|
-
|
|
631
|
+
WorkItemResult(const WorkItemResult& other) = delete;
|
|
632
|
+
WorkItemResult& operator=(const WorkItemResult& other) = delete;
|
|
633
|
+
|
|
634
|
+
WorkItemResult(WorkItemResult&& o) noexcept { *this = std::move(o); }
|
|
635
|
+
|
|
636
|
+
WorkItemResult& operator=(WorkItemResult&& o) noexcept {
|
|
637
|
+
size = o.size;
|
|
638
|
+
checksum_hex = std::move(o.checksum_hex);
|
|
639
|
+
db_id = std::move(o.db_id);
|
|
640
|
+
db_session_id = std::move(o.db_session_id);
|
|
641
|
+
io_status = std::move(o.io_status);
|
|
642
|
+
expected_src_temperature = o.expected_src_temperature;
|
|
643
|
+
current_src_temperature = o.current_src_temperature;
|
|
644
|
+
return *this;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
~WorkItemResult() {
|
|
600
648
|
// The Status needs to be ignored here for two reasons.
|
|
601
649
|
// First, if the BackupEngineImpl shuts down with jobs outstanding, then
|
|
602
650
|
// it is possible that the Status in the future/promise is never read,
|
|
@@ -615,10 +663,15 @@ class BackupEngineImpl {
|
|
|
615
663
|
Temperature current_src_temperature = Temperature::kUnknown;
|
|
616
664
|
};
|
|
617
665
|
|
|
666
|
+
enum WorkItemType : uint64_t {
|
|
667
|
+
CopyOrCreate = 1U,
|
|
668
|
+
ComputeChecksum = 2U,
|
|
669
|
+
};
|
|
670
|
+
|
|
618
671
|
// Exactly one of src_path and contents must be non-empty. If src_path is
|
|
619
672
|
// non-empty, the file is copied from this pathname. Otherwise, if contents is
|
|
620
673
|
// non-empty, the file will be created at dst_path with these contents.
|
|
621
|
-
struct
|
|
674
|
+
struct WorkItem {
|
|
622
675
|
std::string src_path;
|
|
623
676
|
std::string dst_path;
|
|
624
677
|
Temperature src_temperature;
|
|
@@ -631,17 +684,17 @@ class BackupEngineImpl {
|
|
|
631
684
|
RateLimiter* rate_limiter;
|
|
632
685
|
uint64_t size_limit;
|
|
633
686
|
Statistics* stats;
|
|
634
|
-
std::promise<
|
|
687
|
+
std::promise<WorkItemResult> result;
|
|
635
688
|
std::function<void()> progress_callback;
|
|
636
689
|
std::string src_checksum_func_name;
|
|
637
690
|
std::string src_checksum_hex;
|
|
638
691
|
std::string db_id;
|
|
639
692
|
std::string db_session_id;
|
|
693
|
+
WorkItemType type;
|
|
640
694
|
|
|
641
|
-
|
|
695
|
+
WorkItem()
|
|
642
696
|
: src_temperature(Temperature::kUnknown),
|
|
643
697
|
dst_temperature(Temperature::kUnknown),
|
|
644
|
-
|
|
645
698
|
src_env(nullptr),
|
|
646
699
|
dst_env(nullptr),
|
|
647
700
|
src_env_options(),
|
|
@@ -649,16 +702,15 @@ class BackupEngineImpl {
|
|
|
649
702
|
rate_limiter(nullptr),
|
|
650
703
|
size_limit(0),
|
|
651
704
|
stats(nullptr),
|
|
652
|
-
src_checksum_func_name(kUnknownFileChecksumFuncName)
|
|
705
|
+
src_checksum_func_name(kUnknownFileChecksumFuncName),
|
|
706
|
+
type(WorkItemType::CopyOrCreate) {}
|
|
653
707
|
|
|
654
|
-
|
|
655
|
-
|
|
708
|
+
WorkItem(const WorkItem&) = delete;
|
|
709
|
+
WorkItem& operator=(const WorkItem&) = delete;
|
|
656
710
|
|
|
657
|
-
|
|
658
|
-
*this = std::move(o);
|
|
659
|
-
}
|
|
711
|
+
WorkItem(WorkItem&& o) noexcept { *this = std::move(o); }
|
|
660
712
|
|
|
661
|
-
|
|
713
|
+
WorkItem& operator=(WorkItem&& o) noexcept {
|
|
662
714
|
src_path = std::move(o.src_path);
|
|
663
715
|
dst_path = std::move(o.dst_path);
|
|
664
716
|
src_temperature = std::move(o.src_temperature);
|
|
@@ -678,22 +730,22 @@ class BackupEngineImpl {
|
|
|
678
730
|
db_id = std::move(o.db_id);
|
|
679
731
|
db_session_id = std::move(o.db_session_id);
|
|
680
732
|
src_temperature = o.src_temperature;
|
|
733
|
+
type = std::move(o.type);
|
|
681
734
|
return *this;
|
|
682
735
|
}
|
|
683
736
|
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
const std::string& _db_session_id = "")
|
|
737
|
+
WorkItem(std::string _src_path, std::string _dst_path,
|
|
738
|
+
const Temperature _src_temperature,
|
|
739
|
+
const Temperature _dst_temperature, std::string _contents,
|
|
740
|
+
Env* _src_env, Env* _dst_env, EnvOptions _src_env_options,
|
|
741
|
+
bool _sync, RateLimiter* _rate_limiter, uint64_t _size_limit,
|
|
742
|
+
Statistics* _stats, std::function<void()> _progress_callback = {},
|
|
743
|
+
const std::string& _src_checksum_func_name =
|
|
744
|
+
kUnknownFileChecksumFuncName,
|
|
745
|
+
const std::string& _src_checksum_hex = "",
|
|
746
|
+
const std::string& _db_id = "",
|
|
747
|
+
const std::string& _db_session_id = "",
|
|
748
|
+
WorkItemType _type = WorkItemType::CopyOrCreate)
|
|
697
749
|
: src_path(std::move(_src_path)),
|
|
698
750
|
dst_path(std::move(_dst_path)),
|
|
699
751
|
src_temperature(_src_temperature),
|
|
@@ -710,11 +762,14 @@ class BackupEngineImpl {
|
|
|
710
762
|
src_checksum_func_name(_src_checksum_func_name),
|
|
711
763
|
src_checksum_hex(_src_checksum_hex),
|
|
712
764
|
db_id(_db_id),
|
|
713
|
-
db_session_id(_db_session_id)
|
|
765
|
+
db_session_id(_db_session_id),
|
|
766
|
+
type(_type) {}
|
|
767
|
+
|
|
768
|
+
~WorkItem() = default;
|
|
714
769
|
};
|
|
715
770
|
|
|
716
771
|
struct BackupAfterCopyOrCreateWorkItem {
|
|
717
|
-
std::future<
|
|
772
|
+
std::future<WorkItemResult> result;
|
|
718
773
|
bool shared;
|
|
719
774
|
bool needed_to_copy;
|
|
720
775
|
Env* backup_env;
|
|
@@ -741,7 +796,7 @@ class BackupEngineImpl {
|
|
|
741
796
|
return *this;
|
|
742
797
|
}
|
|
743
798
|
|
|
744
|
-
BackupAfterCopyOrCreateWorkItem(std::future<
|
|
799
|
+
BackupAfterCopyOrCreateWorkItem(std::future<WorkItemResult>&& _result,
|
|
745
800
|
bool _shared, bool _needed_to_copy,
|
|
746
801
|
Env* _backup_env, std::string _dst_path_tmp,
|
|
747
802
|
std::string _dst_path,
|
|
@@ -756,15 +811,44 @@ class BackupEngineImpl {
|
|
|
756
811
|
};
|
|
757
812
|
|
|
758
813
|
using BackupWorkItemPair =
|
|
759
|
-
std::pair<
|
|
814
|
+
std::pair<WorkItem, BackupAfterCopyOrCreateWorkItem>;
|
|
815
|
+
|
|
816
|
+
struct ComputeChecksumWorkItem {
|
|
817
|
+
std::future<WorkItemResult> result;
|
|
818
|
+
std::string file_path;
|
|
819
|
+
uint64_t file_number;
|
|
820
|
+
|
|
821
|
+
ComputeChecksumWorkItem(std::future<WorkItemResult>&& _result,
|
|
822
|
+
const std::string& _file_path,
|
|
823
|
+
uint64_t _file_number)
|
|
824
|
+
: result(std::move(_result)),
|
|
825
|
+
file_path(_file_path),
|
|
826
|
+
file_number(_file_number) {}
|
|
827
|
+
|
|
828
|
+
ComputeChecksumWorkItem(const ComputeChecksumWorkItem&) = delete;
|
|
829
|
+
ComputeChecksumWorkItem& operator=(const ComputeChecksumWorkItem&) = delete;
|
|
830
|
+
|
|
831
|
+
ComputeChecksumWorkItem(ComputeChecksumWorkItem&& o) noexcept {
|
|
832
|
+
*this = std::move(o);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
ComputeChecksumWorkItem& operator=(ComputeChecksumWorkItem&& o) noexcept {
|
|
836
|
+
result = std::move(o.result);
|
|
837
|
+
file_path = std::move(o.file_path);
|
|
838
|
+
file_number = o.file_number;
|
|
839
|
+
return *this;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
~ComputeChecksumWorkItem() = default;
|
|
843
|
+
};
|
|
760
844
|
|
|
761
845
|
struct RestoreAfterCopyOrCreateWorkItem {
|
|
762
|
-
std::future<
|
|
846
|
+
std::future<WorkItemResult> result;
|
|
763
847
|
std::string from_file;
|
|
764
848
|
std::string to_file;
|
|
765
849
|
std::string checksum_hex;
|
|
766
850
|
RestoreAfterCopyOrCreateWorkItem() {}
|
|
767
|
-
RestoreAfterCopyOrCreateWorkItem(std::future<
|
|
851
|
+
RestoreAfterCopyOrCreateWorkItem(std::future<WorkItemResult>&& _result,
|
|
768
852
|
const std::string& _from_file,
|
|
769
853
|
const std::string& _to_file,
|
|
770
854
|
const std::string& _checksum_hex)
|
|
@@ -787,7 +871,7 @@ class BackupEngineImpl {
|
|
|
787
871
|
|
|
788
872
|
bool initialized_;
|
|
789
873
|
std::mutex byte_report_mutex_;
|
|
790
|
-
mutable channel<
|
|
874
|
+
mutable channel<WorkItem> work_items_;
|
|
791
875
|
std::vector<port::Thread> threads_;
|
|
792
876
|
std::atomic<CpuPriority> threads_cpu_priority_;
|
|
793
877
|
|
|
@@ -1041,7 +1125,7 @@ BackupEngineImpl::BackupEngineImpl(const BackupEngineOptions& options,
|
|
|
1041
1125
|
}
|
|
1042
1126
|
|
|
1043
1127
|
BackupEngineImpl::~BackupEngineImpl() {
|
|
1044
|
-
|
|
1128
|
+
work_items_.sendEof();
|
|
1045
1129
|
for (auto& t : threads_) {
|
|
1046
1130
|
t.join();
|
|
1047
1131
|
}
|
|
@@ -1240,8 +1324,8 @@ IOStatus BackupEngineImpl::Initialize() {
|
|
|
1240
1324
|
ROCKS_LOG_INFO(options_.info_log, "Latest valid backup is %u",
|
|
1241
1325
|
latest_valid_backup_id_);
|
|
1242
1326
|
|
|
1243
|
-
// set up threads perform
|
|
1244
|
-
// background
|
|
1327
|
+
// set up threads to perform file creation / copy or checksum computations
|
|
1328
|
+
// from work_items_ in the background.
|
|
1245
1329
|
threads_cpu_priority_ = CpuPriority::kNormal;
|
|
1246
1330
|
threads_.reserve(options_.max_background_operations);
|
|
1247
1331
|
for (int t = 0; t < options_.max_background_operations; t++) {
|
|
@@ -1252,9 +1336,9 @@ IOStatus BackupEngineImpl::Initialize() {
|
|
|
1252
1336
|
#endif
|
|
1253
1337
|
#endif
|
|
1254
1338
|
CpuPriority current_priority = CpuPriority::kNormal;
|
|
1255
|
-
|
|
1339
|
+
WorkItem work_item;
|
|
1256
1340
|
uint64_t bytes_toward_next_callback = 0;
|
|
1257
|
-
while (
|
|
1341
|
+
while (work_items_.read(work_item)) {
|
|
1258
1342
|
CpuPriority priority = threads_cpu_priority_;
|
|
1259
1343
|
if (current_priority != priority) {
|
|
1260
1344
|
TEST_SYNC_POINT_CALLBACK(
|
|
@@ -1269,52 +1353,64 @@ IOStatus BackupEngineImpl::Initialize() {
|
|
|
1269
1353
|
uint64_t prev_bytes_read = IOSTATS(bytes_read);
|
|
1270
1354
|
uint64_t prev_bytes_written = IOSTATS(bytes_written);
|
|
1271
1355
|
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1356
|
+
WorkItemResult result;
|
|
1357
|
+
if (work_item.type == WorkItemType::CopyOrCreate) {
|
|
1358
|
+
Temperature temp = work_item.src_temperature;
|
|
1359
|
+
result.io_status = CopyOrCreateFile(
|
|
1360
|
+
work_item.src_path, work_item.dst_path, work_item.contents,
|
|
1361
|
+
work_item.size_limit, work_item.src_env, work_item.dst_env,
|
|
1362
|
+
work_item.src_env_options, work_item.sync, work_item.rate_limiter,
|
|
1363
|
+
work_item.progress_callback, &temp, work_item.dst_temperature,
|
|
1364
|
+
&bytes_toward_next_callback, &result.size, &result.checksum_hex);
|
|
1365
|
+
|
|
1366
|
+
RecordTick(work_item.stats, BACKUP_READ_BYTES,
|
|
1367
|
+
IOSTATS(bytes_read) - prev_bytes_read);
|
|
1368
|
+
RecordTick(work_item.stats, BACKUP_WRITE_BYTES,
|
|
1369
|
+
IOSTATS(bytes_written) - prev_bytes_written);
|
|
1370
|
+
|
|
1371
|
+
result.db_id = work_item.db_id;
|
|
1372
|
+
result.db_session_id = work_item.db_session_id;
|
|
1373
|
+
result.expected_src_temperature = work_item.src_temperature;
|
|
1374
|
+
result.current_src_temperature = temp;
|
|
1375
|
+
if (result.io_status.ok() && !work_item.src_checksum_hex.empty()) {
|
|
1376
|
+
// unknown checksum function name implies no db table file checksum
|
|
1377
|
+
// in db manifest; work_item.src_checksum_hex not empty means backup
|
|
1378
|
+
// engine has calculated its crc32c checksum for the table file;
|
|
1379
|
+
// therefore, we are able to compare the checksums.
|
|
1380
|
+
if (work_item.src_checksum_func_name ==
|
|
1381
|
+
kUnknownFileChecksumFuncName ||
|
|
1382
|
+
work_item.src_checksum_func_name == kDbFileChecksumFuncName) {
|
|
1383
|
+
if (work_item.src_checksum_hex != result.checksum_hex) {
|
|
1384
|
+
std::string checksum_info(
|
|
1385
|
+
"Expected checksum is " + work_item.src_checksum_hex +
|
|
1386
|
+
" while computed checksum is " + result.checksum_hex);
|
|
1387
|
+
result.io_status = IOStatus::Corruption(
|
|
1388
|
+
"Checksum mismatch after copying to " + work_item.dst_path +
|
|
1389
|
+
": " + checksum_info);
|
|
1390
|
+
}
|
|
1391
|
+
} else {
|
|
1392
|
+
// FIXME(peterd): dead code?
|
|
1393
|
+
std::string checksum_function_info(
|
|
1394
|
+
"Existing checksum function is " +
|
|
1395
|
+
work_item.src_checksum_func_name +
|
|
1396
|
+
" while provided checksum function is " +
|
|
1397
|
+
kBackupFileChecksumFuncName);
|
|
1398
|
+
ROCKS_LOG_INFO(
|
|
1399
|
+
options_.info_log,
|
|
1400
|
+
"Unable to verify checksum after copying to %s: %s\n",
|
|
1401
|
+
work_item.dst_path.c_str(), checksum_function_info.c_str());
|
|
1305
1402
|
}
|
|
1306
|
-
} else {
|
|
1307
|
-
// FIXME(peterd): dead code?
|
|
1308
|
-
std::string checksum_function_info(
|
|
1309
|
-
"Existing checksum function is " +
|
|
1310
|
-
work_item.src_checksum_func_name +
|
|
1311
|
-
" while provided checksum function is " +
|
|
1312
|
-
kBackupFileChecksumFuncName);
|
|
1313
|
-
ROCKS_LOG_INFO(
|
|
1314
|
-
options_.info_log,
|
|
1315
|
-
"Unable to verify checksum after copying to %s: %s\n",
|
|
1316
|
-
work_item.dst_path.c_str(), checksum_function_info.c_str());
|
|
1317
1403
|
}
|
|
1404
|
+
} else if (work_item.type == ComputeChecksum) {
|
|
1405
|
+
result.io_status = ReadFileAndComputeChecksum(
|
|
1406
|
+
work_item.src_path, work_item.src_env->GetFileSystem(),
|
|
1407
|
+
work_item.src_env_options, work_item.size_limit,
|
|
1408
|
+
&result.checksum_hex, work_item.src_temperature);
|
|
1409
|
+
result.db_id = work_item.db_id;
|
|
1410
|
+
result.db_session_id = work_item.db_session_id;
|
|
1411
|
+
} else {
|
|
1412
|
+
result.io_status = IOStatus::InvalidArgument(
|
|
1413
|
+
"Unknown work item type: " + std::to_string(work_item.type));
|
|
1318
1414
|
}
|
|
1319
1415
|
work_item.result.set_value(std::move(result));
|
|
1320
1416
|
}
|
|
@@ -1405,7 +1501,7 @@ IOStatus BackupEngineImpl::CreateNewBackupWithMetadata(
|
|
|
1405
1501
|
|
|
1406
1502
|
std::deque<BackupWorkItemPair> excludable_items;
|
|
1407
1503
|
std::deque<BackupAfterCopyOrCreateWorkItem> backup_items_to_finish;
|
|
1408
|
-
// Add a
|
|
1504
|
+
// Add a WorkItem to the channel for each live file
|
|
1409
1505
|
Status disabled = db->DisableFileDeletions();
|
|
1410
1506
|
DBOptions db_options = db->GetDBOptions();
|
|
1411
1507
|
Statistics* stats = db_options.statistics.get();
|
|
@@ -1534,7 +1630,7 @@ IOStatus BackupEngineImpl::CreateNewBackupWithMetadata(
|
|
|
1534
1630
|
if (maybe_exclude_files[i].exclude_decision) {
|
|
1535
1631
|
new_backup.get()->AddExcludedFile(e.second.dst_relative);
|
|
1536
1632
|
} else {
|
|
1537
|
-
|
|
1633
|
+
work_items_.write(std::move(e.first));
|
|
1538
1634
|
backup_items_to_finish.push_back(std::move(e.second));
|
|
1539
1635
|
}
|
|
1540
1636
|
}
|
|
@@ -1883,43 +1979,12 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
1883
1979
|
db_fs_->CreateDirIfMissing(wal_dir, io_options_, nullptr)
|
|
1884
1980
|
.PermitUncheckedError();
|
|
1885
1981
|
|
|
1886
|
-
if (options.keep_log_files) {
|
|
1887
|
-
// delete files in db_dir, but keep all the log files
|
|
1888
|
-
DeleteChildren(db_dir, 1 << kWalFile);
|
|
1889
|
-
// move all the files from archive dir to wal_dir
|
|
1890
|
-
std::string archive_dir = ArchivalDirectory(wal_dir);
|
|
1891
|
-
std::vector<std::string> archive_files;
|
|
1892
|
-
db_fs_->GetChildren(archive_dir, io_options_, &archive_files, nullptr)
|
|
1893
|
-
.PermitUncheckedError(); // ignore errors
|
|
1894
|
-
for (const auto& f : archive_files) {
|
|
1895
|
-
uint64_t number;
|
|
1896
|
-
FileType type;
|
|
1897
|
-
bool ok = ParseFileName(f, &number, &type);
|
|
1898
|
-
if (ok && type == kWalFile) {
|
|
1899
|
-
ROCKS_LOG_INFO(options_.info_log,
|
|
1900
|
-
"Moving log file from archive/ to wal_dir: %s",
|
|
1901
|
-
f.c_str());
|
|
1902
|
-
IOStatus io_s = db_fs_->RenameFile(
|
|
1903
|
-
archive_dir + "/" + f, wal_dir + "/" + f, io_options_, nullptr);
|
|
1904
|
-
if (!io_s.ok()) {
|
|
1905
|
-
// if we can't move log file from archive_dir to wal_dir,
|
|
1906
|
-
// we should fail, since it might mean data loss
|
|
1907
|
-
return io_s;
|
|
1908
|
-
}
|
|
1909
|
-
}
|
|
1910
|
-
}
|
|
1911
|
-
} else {
|
|
1912
|
-
DeleteChildren(wal_dir);
|
|
1913
|
-
DeleteChildren(ArchivalDirectory(wal_dir));
|
|
1914
|
-
DeleteChildren(db_dir);
|
|
1915
|
-
}
|
|
1916
|
-
|
|
1917
1982
|
// Files to restore, and from where (taking into account excluded files)
|
|
1918
1983
|
std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>
|
|
1919
1984
|
restore_file_infos;
|
|
1920
1985
|
restore_file_infos.reserve(backup->GetFiles().size() +
|
|
1921
1986
|
backup->GetExcludedFiles().size());
|
|
1922
|
-
|
|
1987
|
+
std::unordered_set<std::string> unowned_backups;
|
|
1923
1988
|
for (const auto& ef : backup->GetExcludedFiles()) {
|
|
1924
1989
|
const std::string& file = ef.relative_file;
|
|
1925
1990
|
|
|
@@ -1933,10 +1998,19 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
1933
1998
|
}
|
|
1934
1999
|
}
|
|
1935
2000
|
if (!found) {
|
|
2001
|
+
// In `kKeepLatestDbSessionIdFiles` restore mode, it's not strictly
|
|
2002
|
+
// required for the corresponding backup file to be present for as long
|
|
2003
|
+
// as existing, on-disk db file metadata matches this unowned backup file
|
|
2004
|
+
// db_session_id and size.
|
|
2005
|
+
if (options.mode == RestoreOptions::Mode::kKeepLatestDbSessionIdFiles) {
|
|
2006
|
+
unowned_backups.insert(ef.relative_file);
|
|
2007
|
+
continue;
|
|
2008
|
+
}
|
|
2009
|
+
|
|
1936
2010
|
return IOStatus::InvalidArgument(
|
|
1937
|
-
"Excluded file " + file + " not found in
|
|
2011
|
+
"Excluded file " + file + " not found in any of %d" +
|
|
1938
2012
|
std::to_string(locked_restore_from_dirs.size() - 1) +
|
|
1939
|
-
"
|
|
2013
|
+
"backup directories!");
|
|
1940
2014
|
}
|
|
1941
2015
|
}
|
|
1942
2016
|
|
|
@@ -1945,6 +2019,49 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
1945
2019
|
restore_file_infos.emplace_back(this, &*file_info_shared);
|
|
1946
2020
|
}
|
|
1947
2021
|
|
|
2022
|
+
std::unordered_set<uint64_t> files_to_keep;
|
|
2023
|
+
InferDBFilesToRetainInRestore(restore_file_infos, unowned_backups, db_dir,
|
|
2024
|
+
options.mode, files_to_keep);
|
|
2025
|
+
|
|
2026
|
+
if (!unowned_backups.empty()) {
|
|
2027
|
+
return IOStatus::InvalidArgument(
|
|
2028
|
+
"Excluded file " + *unowned_backups.begin() + " (one amongst " +
|
|
2029
|
+
std::to_string(unowned_backups.size()) + ") not found in any of" +
|
|
2030
|
+
std::to_string(locked_restore_from_dirs.size() - 1) +
|
|
2031
|
+
"backup directories!");
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
if (options.keep_log_files) {
|
|
2035
|
+
// delete non-matching files in db_dir, but keep all the log files
|
|
2036
|
+
DeleteChildren(db_dir, files_to_keep, 1 << kWalFile);
|
|
2037
|
+
// move all the files from archive dir to wal_dir
|
|
2038
|
+
std::string archive_dir = ArchivalDirectory(wal_dir);
|
|
2039
|
+
std::vector<std::string> archive_files;
|
|
2040
|
+
db_fs_->GetChildren(archive_dir, io_options_, &archive_files, nullptr)
|
|
2041
|
+
.PermitUncheckedError(); // ignore errors
|
|
2042
|
+
for (const auto& f : archive_files) {
|
|
2043
|
+
uint64_t number;
|
|
2044
|
+
FileType type;
|
|
2045
|
+
bool ok = ParseFileName(f, &number, &type);
|
|
2046
|
+
if (ok && type == kWalFile) {
|
|
2047
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
2048
|
+
"Moving log file from archive/ to wal_dir: %s",
|
|
2049
|
+
f.c_str());
|
|
2050
|
+
IOStatus io_s = db_fs_->RenameFile(
|
|
2051
|
+
archive_dir + "/" + f, wal_dir + "/" + f, io_options_, nullptr);
|
|
2052
|
+
if (!io_s.ok()) {
|
|
2053
|
+
// if we can't move log file from archive_dir to wal_dir,
|
|
2054
|
+
// we should fail, since it might mean data loss
|
|
2055
|
+
return io_s;
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
}
|
|
2059
|
+
} else {
|
|
2060
|
+
DeleteChildren(wal_dir, files_to_keep);
|
|
2061
|
+
DeleteChildren(ArchivalDirectory(wal_dir), files_to_keep);
|
|
2062
|
+
DeleteChildren(db_dir, files_to_keep);
|
|
2063
|
+
}
|
|
2064
|
+
|
|
1948
2065
|
IOStatus io_s;
|
|
1949
2066
|
std::vector<RestoreAfterCopyOrCreateWorkItem> restore_items_to_finish;
|
|
1950
2067
|
std::string temporary_current_file;
|
|
@@ -1970,6 +2087,15 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
1970
2087
|
return IOStatus::Corruption("Backup corrupted: Fail to parse filename " +
|
|
1971
2088
|
dst);
|
|
1972
2089
|
}
|
|
2090
|
+
|
|
2091
|
+
// `files_to_keep` identifies existing database files with contents
|
|
2092
|
+
// 'identical' to their respective backup files (standard or excluded)
|
|
2093
|
+
// as per user-selected RestoreOptions::Mode.
|
|
2094
|
+
if (files_to_keep.find(number) != files_to_keep.end()) {
|
|
2095
|
+
// This file is already in the destination directory. Skip restore.
|
|
2096
|
+
continue;
|
|
2097
|
+
}
|
|
2098
|
+
|
|
1973
2099
|
// 3. Construct the final path
|
|
1974
2100
|
// kWalFile lives in wal_dir and all the rest live in db_dir
|
|
1975
2101
|
if (type == kWalFile) {
|
|
@@ -2001,7 +2127,15 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
2001
2127
|
|
|
2002
2128
|
ROCKS_LOG_INFO(options_.info_log, "Restoring %s to %s\n", file.c_str(),
|
|
2003
2129
|
dst.c_str());
|
|
2004
|
-
|
|
2130
|
+
|
|
2131
|
+
// When file is being copied over, it means that it was either non-existent,
|
|
2132
|
+
// purged or its' original on-disk representation didn't meet incremental
|
|
2133
|
+
// restore tiering criteria. As such, we need to unconditionally recompute
|
|
2134
|
+
// the checksum on the newly restored files - even if checksum was already
|
|
2135
|
+
// computed on its' seed backup file in early assessment phase. Protection
|
|
2136
|
+
// is put in place to ensure that there are no bugs in the actual restore /
|
|
2137
|
+
// file copy logic and we're not producing garbage db files.
|
|
2138
|
+
WorkItem copy_or_create_work_item(
|
|
2005
2139
|
absolute_file, dst, Temperature::kUnknown /* src_temp */,
|
|
2006
2140
|
file_info->temp, "" /* contents */, src_env, db_env_,
|
|
2007
2141
|
EnvOptions() /* src_env_options */, options_.sync,
|
|
@@ -2010,7 +2144,7 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
|
|
|
2010
2144
|
RestoreAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
|
|
2011
2145
|
copy_or_create_work_item.result.get_future(), file, dst,
|
|
2012
2146
|
file_info->checksum_hex);
|
|
2013
|
-
|
|
2147
|
+
work_items_.write(std::move(copy_or_create_work_item));
|
|
2014
2148
|
restore_items_to_finish.push_back(
|
|
2015
2149
|
std::move(after_copy_or_create_work_item));
|
|
2016
2150
|
}
|
|
@@ -2101,6 +2235,9 @@ IOStatus BackupEngineImpl::VerifyBackup(BackupID backup_id,
|
|
|
2101
2235
|
}
|
|
2102
2236
|
|
|
2103
2237
|
// For all files registered in backup
|
|
2238
|
+
std::vector<ComputeChecksumWorkItem> backup_verification_checksum_work_items;
|
|
2239
|
+
std::unordered_map<std::string, std::string>
|
|
2240
|
+
file_abs_path_to_checksum_hex_map;
|
|
2104
2241
|
for (const auto& file_info : backup->GetFiles()) {
|
|
2105
2242
|
const auto abs_path = GetAbsolutePath(file_info->filename);
|
|
2106
2243
|
// check existence of the file
|
|
@@ -2117,25 +2254,95 @@ IOStatus BackupEngineImpl::VerifyBackup(BackupID backup_id,
|
|
|
2117
2254
|
abs_path + ": " + size_info);
|
|
2118
2255
|
}
|
|
2119
2256
|
if (verify_with_checksum && !file_info->checksum_hex.empty()) {
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2257
|
+
const std::string filename = file_info->GetDbFileName();
|
|
2258
|
+
uint64_t number;
|
|
2259
|
+
FileType type;
|
|
2260
|
+
if (!ParseFileName(filename, &number, &type)) {
|
|
2261
|
+
// In case of checksum verification, file parsing and its' number
|
|
2262
|
+
// retrieval are not strictly required. Rather, it's just a best effort
|
|
2263
|
+
// to preserve all the file related metadata within the task scope.
|
|
2264
|
+
number = 0;
|
|
2265
|
+
}
|
|
2266
|
+
|
|
2267
|
+
file_abs_path_to_checksum_hex_map[abs_path] = file_info->checksum_hex;
|
|
2268
|
+
WorkItem backup_file_work_item(
|
|
2269
|
+
abs_path, "" /* dst_path */, Temperature::kUnknown,
|
|
2270
|
+
Temperature::kUnknown /* dst_temperature */, "" /* contents */,
|
|
2271
|
+
backup_env_, nullptr /* dst_env */, EnvOptions(), false /* sync */,
|
|
2272
|
+
options_.backup_rate_limiter.get(), 0 /* size_limit */,
|
|
2273
|
+
nullptr /* stats */, {} /* progress_callback */,
|
|
2274
|
+
kUnknownFileChecksumFuncName /* src_checksum_func_name */,
|
|
2275
|
+
"" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
|
|
2276
|
+
WorkItemType::ComputeChecksum);
|
|
2277
|
+
ComputeChecksumWorkItem backup_file_checksum_work_item(
|
|
2278
|
+
backup_file_work_item.result.get_future(), abs_path, number);
|
|
2279
|
+
|
|
2280
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
2281
|
+
"Scheduling checksum evaluation for %s...\n",
|
|
2123
2282
|
abs_path.c_str());
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2283
|
+
work_items_.write(std::move(backup_file_work_item));
|
|
2284
|
+
backup_verification_checksum_work_items.push_back(
|
|
2285
|
+
std::move(backup_file_checksum_work_item));
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
|
|
2289
|
+
IOStatus io_s = IOStatus::OK();
|
|
2290
|
+
if (verify_with_checksum) {
|
|
2291
|
+
for (auto& item : backup_verification_checksum_work_items) {
|
|
2292
|
+
// Given the limitations of the existing simple thread pooling model
|
|
2293
|
+
// we deliberately decided to wait on each file checksum computation.
|
|
2294
|
+
// Please refer to the comment below for more.
|
|
2295
|
+
item.result.wait();
|
|
2296
|
+
auto result = item.result.get();
|
|
2297
|
+
if (result.io_status.ok()) {
|
|
2298
|
+
auto find_it = file_abs_path_to_checksum_hex_map.find(item.file_path);
|
|
2299
|
+
assert(find_it != file_abs_path_to_checksum_hex_map.end());
|
|
2300
|
+
if (result.checksum_hex == find_it->second) {
|
|
2301
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
2302
|
+
"Checksum successfully validated for %s\n",
|
|
2303
|
+
item.file_path.c_str());
|
|
2304
|
+
continue;
|
|
2305
|
+
}
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
std::string err_msg;
|
|
2309
|
+
if (!result.io_status.ok()) {
|
|
2310
|
+
err_msg =
|
|
2311
|
+
"Failed to compute checksum for " + item.file_path +
|
|
2312
|
+
", IOStatus(code: ," + std::to_string(result.io_status.code()) +
|
|
2313
|
+
", subcode: " + std::to_string(result.io_status.subcode()) + ")";
|
|
2314
|
+
} else { // checksum mismatch
|
|
2315
|
+
err_msg =
|
|
2316
|
+
"File corruption! Checksum mismatch for " + item.file_path + ". " +
|
|
2317
|
+
"Expected: " + file_abs_path_to_checksum_hex_map[item.file_path] +
|
|
2318
|
+
", got: " + result.checksum_hex;
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
ROCKS_LOG_WARN(options_.info_log, "%s", err_msg.c_str());
|
|
2322
|
+
if (io_s.ok()) {
|
|
2323
|
+
// Memoize only the first corruption for reporting purpose.
|
|
2324
|
+
io_s = IOStatus::Corruption(err_msg);
|
|
2325
|
+
} else {
|
|
2326
|
+
// Ideally, we want to bail out as early as possible upon encountering
|
|
2327
|
+
// the very first mismatch, which would not only reduce the observed
|
|
2328
|
+
// user latency, but also limit (potentially remote) read IO to the
|
|
2329
|
+
// absolute minimum and allow the thread pool to reclaim the resources
|
|
2330
|
+
// earlier. Even better, if we could cancel all in-progress threads!
|
|
2331
|
+
//
|
|
2332
|
+
// Unfortunately, with our current simple thread pool implementation
|
|
2333
|
+
// we do not have by-tag control / handle over running threads.
|
|
2334
|
+
// Having the choice of 1) returning to the caller earlier and having
|
|
2335
|
+
// dangling threads occupied in evaluating checksums in the background
|
|
2336
|
+
// and 2) waiting for all threads to finish, we choose 2) for cleaner
|
|
2337
|
+
// and more intuitive semantics.
|
|
2338
|
+
//
|
|
2339
|
+
// TODO: Reevaluate after onboarding backup engine to a more
|
|
2340
|
+
// sophisticated thread pool abstraction.
|
|
2135
2341
|
}
|
|
2136
2342
|
}
|
|
2137
2343
|
}
|
|
2138
|
-
|
|
2344
|
+
|
|
2345
|
+
return io_s;
|
|
2139
2346
|
}
|
|
2140
2347
|
|
|
2141
2348
|
IOStatus BackupEngineImpl::CopyOrCreateFile(
|
|
@@ -2165,7 +2372,11 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
|
|
|
2165
2372
|
|
|
2166
2373
|
io_s = dst_env->GetFileSystem()->NewWritableFile(dst, dst_file_options,
|
|
2167
2374
|
&dst_file, nullptr);
|
|
2168
|
-
if (io_s.ok()
|
|
2375
|
+
if (!io_s.ok()) {
|
|
2376
|
+
return io_s;
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
if (!src.empty()) {
|
|
2169
2380
|
auto src_file_options = FileOptions(src_env_options);
|
|
2170
2381
|
src_file_options.temperature = *src_temperature;
|
|
2171
2382
|
io_s = src_env->GetFileSystem()->NewSequentialFile(src, src_file_options,
|
|
@@ -2181,9 +2392,9 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
|
|
|
2181
2392
|
return io_s;
|
|
2182
2393
|
}
|
|
2183
2394
|
|
|
2184
|
-
size_t buf_size =
|
|
2185
|
-
|
|
2186
|
-
|
|
2395
|
+
size_t buf_size = CalculateIOBufferSize(rate_limiter);
|
|
2396
|
+
TEST_SYNC_POINT_CALLBACK(
|
|
2397
|
+
"BackupEngineImpl::CopyOrCreateFile:CalculateIOBufferSize", &buf_size);
|
|
2187
2398
|
|
|
2188
2399
|
// TODO: pass in Histograms if the destination file is sst or blob
|
|
2189
2400
|
std::unique_ptr<WritableFileWriter> dest_writer(
|
|
@@ -2276,6 +2487,16 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
|
|
|
2276
2487
|
return io_s;
|
|
2277
2488
|
}
|
|
2278
2489
|
|
|
2490
|
+
uint64_t BackupEngineImpl::CalculateIOBufferSize(
|
|
2491
|
+
RateLimiter* rate_limiter) const {
|
|
2492
|
+
if (options_.io_buffer_size > 0) {
|
|
2493
|
+
return options_.io_buffer_size;
|
|
2494
|
+
}
|
|
2495
|
+
return rate_limiter != nullptr
|
|
2496
|
+
? static_cast<size_t>(rate_limiter->GetSingleBurstBytes())
|
|
2497
|
+
: kDefaultCopyFileBufferSize;
|
|
2498
|
+
}
|
|
2499
|
+
|
|
2279
2500
|
// fname will always start with "/"
|
|
2280
2501
|
IOStatus BackupEngineImpl::AddBackupFileWorkItem(
|
|
2281
2502
|
std::unordered_set<std::string>& live_dst_paths,
|
|
@@ -2487,7 +2708,7 @@ IOStatus BackupEngineImpl::AddBackupFileWorkItem(
|
|
|
2487
2708
|
|
|
2488
2709
|
// Step 3: Add work item
|
|
2489
2710
|
if (!contents.empty() || need_to_copy) {
|
|
2490
|
-
|
|
2711
|
+
WorkItem copy_or_create_work_item(
|
|
2491
2712
|
src_dir.empty() ? "" : src_path, *copy_dest_path, src_temperature,
|
|
2492
2713
|
Temperature::kUnknown /*dst_temp*/, contents, db_env_, backup_env_,
|
|
2493
2714
|
src_env_options, options_.sync, rate_limiter, size_limit, stats,
|
|
@@ -2507,17 +2728,17 @@ IOStatus BackupEngineImpl::AddBackupFileWorkItem(
|
|
|
2507
2728
|
// the checkpoint
|
|
2508
2729
|
ROCKS_LOG_INFO(options_.info_log, "Copying %s to %s", fname.c_str(),
|
|
2509
2730
|
copy_dest_path->c_str());
|
|
2510
|
-
|
|
2731
|
+
work_items_.write(std::move(copy_or_create_work_item));
|
|
2511
2732
|
backup_items_to_finish.push_back(
|
|
2512
2733
|
std::move(after_copy_or_create_work_item));
|
|
2513
2734
|
}
|
|
2514
2735
|
} else {
|
|
2515
|
-
std::promise<
|
|
2736
|
+
std::promise<WorkItemResult> promise_result;
|
|
2516
2737
|
BackupAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
|
|
2517
2738
|
promise_result.get_future(), shared, need_to_copy, backup_env_,
|
|
2518
2739
|
temp_dest_path, final_dest_path, dst_relative);
|
|
2519
2740
|
backup_items_to_finish.push_back(std::move(after_copy_or_create_work_item));
|
|
2520
|
-
|
|
2741
|
+
WorkItemResult result;
|
|
2521
2742
|
result.io_status = IOStatus::OK();
|
|
2522
2743
|
result.size = size_bytes;
|
|
2523
2744
|
result.checksum_hex = std::move(checksum_hex);
|
|
@@ -2557,7 +2778,7 @@ IOStatus BackupEngineImpl::ReadFileAndComputeChecksum(
|
|
|
2557
2778
|
return io_s;
|
|
2558
2779
|
}
|
|
2559
2780
|
|
|
2560
|
-
size_t buf_size =
|
|
2781
|
+
size_t buf_size = CalculateIOBufferSize(rate_limiter);
|
|
2561
2782
|
std::unique_ptr<char[]> buf(new char[buf_size]);
|
|
2562
2783
|
Slice data;
|
|
2563
2784
|
|
|
@@ -2582,10 +2803,13 @@ IOStatus BackupEngineImpl::ReadFileAndComputeChecksum(
|
|
|
2582
2803
|
return io_s;
|
|
2583
2804
|
}
|
|
2584
2805
|
|
|
2585
|
-
Status BackupEngineImpl::GetFileDbIdentities(
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2806
|
+
Status BackupEngineImpl::GetFileDbIdentities(Env* src_env,
|
|
2807
|
+
const EnvOptions& src_env_options,
|
|
2808
|
+
const std::string& file_path,
|
|
2809
|
+
Temperature file_temp,
|
|
2810
|
+
RateLimiter* rate_limiter,
|
|
2811
|
+
std::string* db_id,
|
|
2812
|
+
std::string* db_session_id) const {
|
|
2589
2813
|
assert(db_id != nullptr || db_session_id != nullptr);
|
|
2590
2814
|
|
|
2591
2815
|
Options options;
|
|
@@ -2605,7 +2829,7 @@ Status BackupEngineImpl::GetFileDbIdentities(
|
|
|
2605
2829
|
// Try to get table properties from the table reader of sst_reader
|
|
2606
2830
|
if (!sst_reader.ReadTableProperties(&tp).ok()) {
|
|
2607
2831
|
// FIXME (peterd): this logic is untested and seems obsolete.
|
|
2608
|
-
// Try to use table
|
|
2832
|
+
// Try to use table properties from the initialization of sst_reader
|
|
2609
2833
|
table_properties = sst_reader.GetInitTableProperties();
|
|
2610
2834
|
} else {
|
|
2611
2835
|
table_properties = tp.get();
|
|
@@ -2660,8 +2884,276 @@ void BackupEngineImpl::LoopRateLimitRequestHelper(
|
|
|
2660
2884
|
}
|
|
2661
2885
|
}
|
|
2662
2886
|
|
|
2663
|
-
void BackupEngineImpl::
|
|
2664
|
-
|
|
2887
|
+
void BackupEngineImpl::InferDBFilesToRetainInRestore(
|
|
2888
|
+
const std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>&
|
|
2889
|
+
restore_file_infos,
|
|
2890
|
+
std::unordered_set<std::string>& unowned_backups, const std::string& db_dir,
|
|
2891
|
+
RestoreOptions::Mode mode,
|
|
2892
|
+
std::unordered_set<uint64_t>& files_to_keep) const {
|
|
2893
|
+
if (mode == RestoreOptions::Mode::kPurgeAllFiles) {
|
|
2894
|
+
return;
|
|
2895
|
+
}
|
|
2896
|
+
|
|
2897
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
2898
|
+
"Starting incremental restore evaluation in %" PRIu32 " mode",
|
|
2899
|
+
mode);
|
|
2900
|
+
|
|
2901
|
+
ROCKS_LOG_INFO(options_.info_log, "Constructing backup files mapping...");
|
|
2902
|
+
std::unordered_map<uint64_t,
|
|
2903
|
+
std::pair<const BackupEngineImpl*, const FileInfo*>>
|
|
2904
|
+
file_num_to_engine_infos;
|
|
2905
|
+
for (const auto& engine_and_file_info : restore_file_infos) {
|
|
2906
|
+
uint64_t number;
|
|
2907
|
+
FileType type;
|
|
2908
|
+
|
|
2909
|
+
std::string filename = engine_and_file_info.second->GetDbFileName();
|
|
2910
|
+
if (!ParseFileName(filename, &number, &type)) {
|
|
2911
|
+
continue;
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2914
|
+
// We only care to optimize restore for large files - like SSTs and blobs.
|
|
2915
|
+
// Blobs are only supported in kVerifyChecksum.
|
|
2916
|
+
if (type == kTableFile ||
|
|
2917
|
+
(type == kBlobFile && mode == RestoreOptions::Mode::kVerifyChecksum)) {
|
|
2918
|
+
file_num_to_engine_infos[number] = engine_and_file_info;
|
|
2919
|
+
}
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
ROCKS_LOG_INFO(
|
|
2923
|
+
options_.info_log,
|
|
2924
|
+
"Evaluating existing .sst%s files restore retention eligibility...",
|
|
2925
|
+
mode == RestoreOptions::Mode::kVerifyChecksum ? " and .blob files" : "");
|
|
2926
|
+
|
|
2927
|
+
std::vector<std::string> children;
|
|
2928
|
+
db_fs_->GetChildren(db_dir, io_options_, &children, nullptr)
|
|
2929
|
+
.PermitUncheckedError(); // ignore errors
|
|
2930
|
+
std::vector<ComputeChecksumWorkItem> backup_files_compute_checksum_work_items;
|
|
2931
|
+
std::vector<ComputeChecksumWorkItem> db_files_compute_checksum_work_items;
|
|
2932
|
+
std::unordered_map<uint64_t, std::string> backup_file_num_to_checksum;
|
|
2933
|
+
for (const auto& f : children) {
|
|
2934
|
+
uint64_t number;
|
|
2935
|
+
FileType type;
|
|
2936
|
+
bool ok = ParseFileName(f, &number, &type);
|
|
2937
|
+
if (!ok) {
|
|
2938
|
+
// Couldn't parse existing file name. We deliberately choose to sliently
|
|
2939
|
+
// skip here to avoid noisy & excessive logging in user controlled envs.
|
|
2940
|
+
continue;
|
|
2941
|
+
}
|
|
2942
|
+
|
|
2943
|
+
if (type != kTableFile && type != kBlobFile) {
|
|
2944
|
+
// We only care to optimize restore for large files - like SSTs / blobs.
|
|
2945
|
+
continue;
|
|
2946
|
+
}
|
|
2947
|
+
|
|
2948
|
+
if (type == kBlobFile && mode != RestoreOptions::Mode::kVerifyChecksum) {
|
|
2949
|
+
// Blob files are only supported in kVerifyChecksum mode.
|
|
2950
|
+
continue;
|
|
2951
|
+
}
|
|
2952
|
+
|
|
2953
|
+
uint64_t size_bytes = 0;
|
|
2954
|
+
std::string db_file_path = db_dir + "/" + f;
|
|
2955
|
+
IOStatus io_st = db_fs_->GetFileSize(db_file_path, io_options_, &size_bytes,
|
|
2956
|
+
nullptr /* dbg */);
|
|
2957
|
+
if (!io_st.ok()) {
|
|
2958
|
+
Log(options_.info_log,
|
|
2959
|
+
"Failed to get the file size for existing file: '%s'. IO status: %s",
|
|
2960
|
+
f.c_str(), io_st.ToString().c_str());
|
|
2961
|
+
continue;
|
|
2962
|
+
}
|
|
2963
|
+
|
|
2964
|
+
RateLimiter* rate_limiter = options_.restore_rate_limiter.get();
|
|
2965
|
+
if (mode == RestoreOptions::Mode::kKeepLatestDbSessionIdFiles) {
|
|
2966
|
+
// On-disk existing db file names require direct file footer query
|
|
2967
|
+
// as they don't follow same naming convention as backups.
|
|
2968
|
+
std::string db_id;
|
|
2969
|
+
std::string db_session_id;
|
|
2970
|
+
Status s = GetFileDbIdentities(
|
|
2971
|
+
db_env_, EnvOptions() /* src_env_options */,
|
|
2972
|
+
db_file_path /* file_path */, Temperature::kUnknown /* src_temp */,
|
|
2973
|
+
rate_limiter, &db_id, &db_session_id);
|
|
2974
|
+
if (!s.ok()) {
|
|
2975
|
+
Log(options_.info_log,
|
|
2976
|
+
"Encountered IO error while obtaining db session id metadata for "
|
|
2977
|
+
"existing file '%s'.",
|
|
2978
|
+
db_file_path.c_str());
|
|
2979
|
+
continue;
|
|
2980
|
+
}
|
|
2981
|
+
|
|
2982
|
+
const std::string checksum_hex = "";
|
|
2983
|
+
std::string shared_file_name = GenerateSharedFileWithDbSessionIdAndSize(
|
|
2984
|
+
f, size_bytes, db_session_id);
|
|
2985
|
+
bool found = false;
|
|
2986
|
+
const auto& f_ei = file_num_to_engine_infos.find(number);
|
|
2987
|
+
if (f_ei != file_num_to_engine_infos.end()) {
|
|
2988
|
+
found = f_ei->second.second->filename == shared_file_name;
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2991
|
+
if (!found) {
|
|
2992
|
+
const auto& uo_sst_bfn = unowned_backups.find(shared_file_name);
|
|
2993
|
+
if (uo_sst_bfn != unowned_backups.end()) {
|
|
2994
|
+
// Db file has been successfully associated with the excluded backup.
|
|
2995
|
+
unowned_backups.erase(shared_file_name);
|
|
2996
|
+
found = true;
|
|
2997
|
+
}
|
|
2998
|
+
}
|
|
2999
|
+
|
|
3000
|
+
if (found) {
|
|
3001
|
+
files_to_keep.insert(number);
|
|
3002
|
+
|
|
3003
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
3004
|
+
"Existing db file '%s' is retained for restore.",
|
|
3005
|
+
f.c_str());
|
|
3006
|
+
}
|
|
3007
|
+
} else if (mode == RestoreOptions::Mode::kVerifyChecksum) {
|
|
3008
|
+
const auto& f_ei = file_num_to_engine_infos.find(number);
|
|
3009
|
+
if (f_ei == file_num_to_engine_infos.end() ||
|
|
3010
|
+
f_ei->second.second->GetDbFileName() != f) {
|
|
3011
|
+
Log(options_.info_log,
|
|
3012
|
+
"Existing file '%s' is not present in the backup!", f.c_str());
|
|
3013
|
+
continue;
|
|
3014
|
+
}
|
|
3015
|
+
|
|
3016
|
+
auto backup_engine_impl = f_ei->second.first;
|
|
3017
|
+
auto backup_file_info = f_ei->second.second;
|
|
3018
|
+
DBOptions db_options;
|
|
3019
|
+
std::string backup_file_path =
|
|
3020
|
+
backup_engine_impl->GetAbsolutePath(backup_file_info->filename);
|
|
3021
|
+
std::string backup_file_checksum = backup_file_info->checksum_hex;
|
|
3022
|
+
if (!backup_file_checksum.empty()) {
|
|
3023
|
+
backup_file_num_to_checksum[number] = backup_file_checksum;
|
|
3024
|
+
} else {
|
|
3025
|
+
// Backup file checksum is missing in the backup metadata.
|
|
3026
|
+
// Given explicit requirement, compute it asynchronously.
|
|
3027
|
+
EnvOptions backup_env_options;
|
|
3028
|
+
if (type == kBlobFile) {
|
|
3029
|
+
backup_engine_impl->backup_env_->OptimizeForBlobFileRead(
|
|
3030
|
+
backup_env_options, ImmutableDBOptions(db_options));
|
|
3031
|
+
} else if (type == kTableFile) {
|
|
3032
|
+
backup_engine_impl->backup_env_->OptimizeForCompactionTableRead(
|
|
3033
|
+
backup_env_options, ImmutableDBOptions(db_options));
|
|
3034
|
+
}
|
|
3035
|
+
|
|
3036
|
+
WorkItem backup_file_work_item(
|
|
3037
|
+
backup_file_path, "" /* dst_path */, backup_file_info->temp,
|
|
3038
|
+
Temperature::kUnknown /* dst_temperature */, "" /* contents */,
|
|
3039
|
+
backup_engine_impl->backup_env_, nullptr /* dst_env */,
|
|
3040
|
+
backup_env_options, false /* sync */,
|
|
3041
|
+
options_.restore_rate_limiter.get(), 0 /* size_limit */,
|
|
3042
|
+
nullptr /* stats */, {} /* progress_callback */,
|
|
3043
|
+
kUnknownFileChecksumFuncName /* src_checksum_func_name */,
|
|
3044
|
+
"" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
|
|
3045
|
+
WorkItemType::ComputeChecksum);
|
|
3046
|
+
|
|
3047
|
+
ComputeChecksumWorkItem backup_file_checksum_work_item(
|
|
3048
|
+
backup_file_work_item.result.get_future(),
|
|
3049
|
+
backup_file_info->filename, number);
|
|
3050
|
+
|
|
3051
|
+
work_items_.write(std::move(backup_file_work_item));
|
|
3052
|
+
backup_files_compute_checksum_work_items.push_back(
|
|
3053
|
+
std::move(backup_file_checksum_work_item));
|
|
3054
|
+
|
|
3055
|
+
Log(options_.info_log,
|
|
3056
|
+
"Checksum is missing in '%s' backup file metadata."
|
|
3057
|
+
"Scheduled async computation...",
|
|
3058
|
+
backup_file_info->filename.c_str());
|
|
3059
|
+
}
|
|
3060
|
+
|
|
3061
|
+
// Unconditionally compute checksum for existing file.
|
|
3062
|
+
EnvOptions db_env_options;
|
|
3063
|
+
if (type == kBlobFile) {
|
|
3064
|
+
db_env_->OptimizeForBlobFileRead(db_env_options,
|
|
3065
|
+
ImmutableDBOptions(db_options));
|
|
3066
|
+
} else if (type == kTableFile) {
|
|
3067
|
+
db_env_->OptimizeForCompactionTableRead(db_env_options,
|
|
3068
|
+
ImmutableDBOptions(db_options));
|
|
3069
|
+
}
|
|
3070
|
+
|
|
3071
|
+
WorkItem db_file_work_item(
|
|
3072
|
+
db_file_path, "" /* dst_path */, backup_file_info->temp,
|
|
3073
|
+
Temperature::kUnknown /* dst_temperature */, "" /* contents */,
|
|
3074
|
+
db_env_, nullptr /* dst_env */, db_env_options, false /* sync */,
|
|
3075
|
+
options_.restore_rate_limiter.get(), 0 /* size_limit */,
|
|
3076
|
+
nullptr /* stats */, {} /* progress_callback */,
|
|
3077
|
+
kUnknownFileChecksumFuncName /* src_checksum_func_name */,
|
|
3078
|
+
"" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
|
|
3079
|
+
WorkItemType::ComputeChecksum);
|
|
3080
|
+
|
|
3081
|
+
ComputeChecksumWorkItem db_file_checksum_work_item(
|
|
3082
|
+
db_file_work_item.result.get_future(), db_file_path, number);
|
|
3083
|
+
work_items_.write(std::move(db_file_work_item));
|
|
3084
|
+
db_files_compute_checksum_work_items.push_back(
|
|
3085
|
+
std::move(db_file_checksum_work_item));
|
|
3086
|
+
|
|
3087
|
+
Log(options_.info_log,
|
|
3088
|
+
"Schedule async checksum computation for file '%s'", f.c_str());
|
|
3089
|
+
}
|
|
3090
|
+
}
|
|
3091
|
+
|
|
3092
|
+
if (mode == RestoreOptions::Mode::kVerifyChecksum) {
|
|
3093
|
+
// First loop through checksum computation results for backup files.
|
|
3094
|
+
for (auto& item : backup_files_compute_checksum_work_items) {
|
|
3095
|
+
item.result.wait();
|
|
3096
|
+
auto result = item.result.get();
|
|
3097
|
+
IOStatus item_io_status = result.io_status;
|
|
3098
|
+
if (!item_io_status.ok()) {
|
|
3099
|
+
// Failed computation for backup file will result in purging
|
|
3100
|
+
// the existing file and restoring the backup file.
|
|
3101
|
+
Log(options_.info_log,
|
|
3102
|
+
"Encountered IO error while computing checksum for "
|
|
3103
|
+
"backup file '%s'.",
|
|
3104
|
+
item.file_path.c_str());
|
|
3105
|
+
continue;
|
|
3106
|
+
}
|
|
3107
|
+
|
|
3108
|
+
backup_file_num_to_checksum[item.file_number] = result.checksum_hex;
|
|
3109
|
+
}
|
|
3110
|
+
|
|
3111
|
+
// Loop through db files checksum computation results.
|
|
3112
|
+
for (auto& item : db_files_compute_checksum_work_items) {
|
|
3113
|
+
item.result.wait();
|
|
3114
|
+
auto result = item.result.get();
|
|
3115
|
+
IOStatus item_io_status = result.io_status;
|
|
3116
|
+
if (!item_io_status.ok()) {
|
|
3117
|
+
// Failed computation for existing file will result in purging
|
|
3118
|
+
// and restoring it from the corresponding backup file.
|
|
3119
|
+
Log(options_.info_log,
|
|
3120
|
+
"Encountered IO error while computing checksum for "
|
|
3121
|
+
"existing file '%s'.",
|
|
3122
|
+
item.file_path.c_str());
|
|
3123
|
+
continue;
|
|
3124
|
+
}
|
|
3125
|
+
|
|
3126
|
+
auto it = backup_file_num_to_checksum.find(item.file_number);
|
|
3127
|
+
if (it == backup_file_num_to_checksum.end()) {
|
|
3128
|
+
Log(options_.info_log,
|
|
3129
|
+
"Failed to find backup file checksum for existing file '%s'.",
|
|
3130
|
+
item.file_path.c_str());
|
|
3131
|
+
continue;
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
if (it->second != result.checksum_hex) {
|
|
3135
|
+
Log(options_.info_log,
|
|
3136
|
+
"Checksum mismatch between backup file and existing file '%s'.",
|
|
3137
|
+
item.file_path.c_str());
|
|
3138
|
+
continue;
|
|
3139
|
+
}
|
|
3140
|
+
|
|
3141
|
+
files_to_keep.insert(item.file_number);
|
|
3142
|
+
|
|
3143
|
+
Log(options_.info_log, "Existing file '%s' is retained for restore.",
|
|
3144
|
+
item.file_path.c_str());
|
|
3145
|
+
}
|
|
3146
|
+
}
|
|
3147
|
+
|
|
3148
|
+
ROCKS_LOG_INFO(options_.info_log,
|
|
3149
|
+
"Done with incremental restore evaluation. "
|
|
3150
|
+
"Retained %zu files.",
|
|
3151
|
+
files_to_keep.size());
|
|
3152
|
+
}
|
|
3153
|
+
|
|
3154
|
+
void BackupEngineImpl::DeleteChildren(
|
|
3155
|
+
const std::string& dir, const std::unordered_set<uint64_t>& files_to_keep,
|
|
3156
|
+
uint32_t file_type_filter) const {
|
|
2665
3157
|
std::vector<std::string> children;
|
|
2666
3158
|
db_fs_->GetChildren(dir, io_options_, &children, nullptr)
|
|
2667
3159
|
.PermitUncheckedError(); // ignore errors
|
|
@@ -2670,8 +3162,12 @@ void BackupEngineImpl::DeleteChildren(const std::string& dir,
|
|
|
2670
3162
|
uint64_t number;
|
|
2671
3163
|
FileType type;
|
|
2672
3164
|
bool ok = ParseFileName(f, &number, &type);
|
|
3165
|
+
if (ok && (files_to_keep.find(number) != files_to_keep.end())) {
|
|
3166
|
+
// don't delete file with this number.
|
|
3167
|
+
continue;
|
|
3168
|
+
}
|
|
2673
3169
|
if (ok && (file_type_filter & (1 << type))) {
|
|
2674
|
-
// don't delete this file
|
|
3170
|
+
// don't delete this file type.
|
|
2675
3171
|
continue;
|
|
2676
3172
|
}
|
|
2677
3173
|
db_fs_->DeleteFile(dir + "/" + f, io_options_, nullptr)
|