@nxtedition/rocksdb 5.2.21 → 5.2.28
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 +510 -967
- package/binding.gyp +78 -72
- package/chained-batch.js +1 -2
- package/deps/rocksdb/build_version.cc +70 -4
- package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
- package/deps/rocksdb/rocksdb/Makefile +459 -469
- package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
- package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
- package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
- package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
- package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
- package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
- package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
- package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
- package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
- package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
- package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
- package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
- package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
- package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
- package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
- package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
- package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
- package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
- package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
- package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
- package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
- package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
- package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
- package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
- package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
- package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
- package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
- package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
- package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
- package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
- package/deps/rocksdb/rocksdb/db/builder.h +16 -37
- package/deps/rocksdb/rocksdb/db/c.cc +413 -208
- package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
- package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
- package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
- package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
- package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
- package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
- package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
- package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
- package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
- package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
- package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
- package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
- package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
- package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
- package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
- package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
- package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
- package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
- package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
- package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
- package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
- package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
- package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
- package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
- package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
- package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
- package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
- package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
- package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
- package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
- package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
- package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
- package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
- package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
- package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
- package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
- package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
- package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
- package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
- package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
- package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
- package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
- package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
- package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
- package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
- package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
- package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
- package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
- package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
- package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
- package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
- package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
- package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
- package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
- package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
- package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
- package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
- package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
- package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
- package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
- package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
- package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
- package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
- package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
- package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
- package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
- package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
- package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
- package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
- package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
- package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
- package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
- package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
- package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
- package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
- package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
- package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
- package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
- package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
- package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
- package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
- package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
- package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
- package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
- package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
- package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
- package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
- package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
- package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
- package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
- package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
- package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
- package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
- package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
- package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
- package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
- package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
- package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
- package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
- package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
- package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
- package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
- package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
- package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
- package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
- package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
- package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
- package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
- package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
- package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
- package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
- package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
- package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
- package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
- package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
- package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
- package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
- package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
- package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
- package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
- package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
- package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
- package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
- package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
- package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
- package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
- package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
- package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
- package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
- package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
- package/deps/rocksdb/rocksdb/env/env.cc +632 -42
- package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
- package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
- package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
- package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
- package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
- package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
- package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
- package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
- package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
- package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
- package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
- package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
- package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
- package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
- package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
- package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
- package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
- package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
- package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
- package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
- package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
- package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
- package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
- package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
- package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
- package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
- package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
- package/deps/rocksdb/rocksdb/file/filename.h +13 -8
- package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
- package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
- package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
- package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
- package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
- package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
- package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
- package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
- package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
- package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
- package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
- package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
- package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
- package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
- package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
- package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
- package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
- package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
- package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
- package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
- package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
- package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
- package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
- package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
- package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
- package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
- package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
- package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
- package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
- package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
- package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
- package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
- package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
- package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
- package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
- package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
- package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
- package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
- package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
- package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
- package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
- package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
- package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
- package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
- package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
- package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
- package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
- package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
- package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
- package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
- package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
- package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
- package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
- package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
- package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
- package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
- package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
- package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
- package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
- package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
- package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
- package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
- package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
- package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
- package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
- package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
- package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
- package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
- package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
- package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
- package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
- package/deps/rocksdb/rocksdb/options/options.cc +49 -17
- package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
- package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
- package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
- package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
- package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
- package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
- package/deps/rocksdb/rocksdb/port/lang.h +52 -0
- package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
- package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
- package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
- package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
- package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
- package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
- package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
- package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
- package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
- package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
- package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
- package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
- package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
- package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
- package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
- package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
- package/deps/rocksdb/rocksdb/python.mk +9 -0
- package/deps/rocksdb/rocksdb/src.mk +82 -34
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
- package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
- package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
- package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
- package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
- package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
- package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
- package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
- package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
- package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
- package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
- package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
- package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
- package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
- package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
- package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
- package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
- package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
- package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
- package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
- package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
- package/deps/rocksdb/rocksdb/table/format.cc +258 -104
- package/deps/rocksdb/rocksdb/table/format.h +120 -109
- package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
- package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
- package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
- package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
- package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
- package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
- package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
- package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
- package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
- package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
- package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
- package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
- package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
- package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
- package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
- package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
- package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
- package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
- package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
- package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
- package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
- package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
- package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
- package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
- package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
- package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
- package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
- package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
- package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
- package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
- package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
- package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
- package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
- package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
- package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
- package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
- package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
- package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
- package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
- package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
- package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
- package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
- package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
- package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
- package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
- package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
- package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
- package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
- package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
- package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
- package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
- package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
- package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
- package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
- package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
- package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
- package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
- package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
- package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
- package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
- package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
- package/deps/rocksdb/rocksdb/util/channel.h +2 -0
- package/deps/rocksdb/rocksdb/util/coding.h +1 -33
- package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
- package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
- package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
- package/deps/rocksdb/rocksdb/util/compression.h +212 -7
- package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
- package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
- package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
- package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
- package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
- package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
- package/deps/rocksdb/rocksdb/util/defer.h +30 -1
- package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
- package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
- package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
- package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
- package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
- package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
- package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
- package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
- package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
- package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
- package/deps/rocksdb/rocksdb/util/hash.h +31 -1
- package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
- package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
- package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
- package/deps/rocksdb/rocksdb/util/heap.h +6 -1
- package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
- package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
- package/deps/rocksdb/rocksdb/util/math.h +74 -7
- package/deps/rocksdb/rocksdb/util/math128.h +13 -1
- package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
- package/deps/rocksdb/rocksdb/util/random.cc +9 -0
- package/deps/rocksdb/rocksdb/util/random.h +6 -0
- package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
- package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
- package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
- package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
- package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
- package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
- package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
- package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
- package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
- package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
- package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
- package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
- package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
- package/deps/rocksdb/rocksdb/util/status.cc +32 -29
- package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
- package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
- package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
- package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
- package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
- package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
- package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
- package/deps/rocksdb/rocksdb/util/timer.h +55 -46
- package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
- package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
- package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
- package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
- package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
- package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
- package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
- package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
- package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
- package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
- package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
- package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
- package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
- package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
- package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
- package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
- package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
- package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
- package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
- package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
- package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
- package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
- package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
- package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
- package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
- package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
- package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
- package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
- package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
- package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
- package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
- package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
- package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
- package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
- package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
- package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
- package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
- package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
- package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
- package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
- package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
- package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
- package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
- package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
- package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
- package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
- package/deps/rocksdb/rocksdb.gyp +425 -446
- package/index.js +5 -87
- package/package-lock.json +23687 -0
- package/package.json +8 -9
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/README.md +0 -32
- package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
- package/deps/rocksdb/rocksdb/hdfs/README +0 -23
- package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
- package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
- package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
- package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
- package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
- package/deps/rocksdb/rocksdb/port/README +0 -10
- package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
- package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
- package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
- package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
- package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
- package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
- package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
- package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
- package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
- package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
- package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
- package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
- package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
- package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
- package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
- package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
- package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
- package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
- package/deps/snappy/snappy-1.1.7/README.md +0 -149
- package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
|
@@ -8,23 +8,31 @@
|
|
|
8
8
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
9
9
|
|
|
10
10
|
#include <atomic>
|
|
11
|
+
#include <limits>
|
|
11
12
|
|
|
12
13
|
#include "db/db_impl/db_impl.h"
|
|
13
14
|
#include "db/db_test_util.h"
|
|
15
|
+
#include "env/mock_env.h"
|
|
14
16
|
#include "file/filename.h"
|
|
15
17
|
#include "port/port.h"
|
|
16
18
|
#include "port/stack_trace.h"
|
|
17
19
|
#include "rocksdb/utilities/transaction_db.h"
|
|
18
20
|
#include "test_util/sync_point.h"
|
|
21
|
+
#include "test_util/testutil.h"
|
|
19
22
|
#include "util/cast_util.h"
|
|
20
23
|
#include "util/mutexlock.h"
|
|
21
24
|
#include "utilities/fault_injection_env.h"
|
|
25
|
+
#include "utilities/fault_injection_fs.h"
|
|
22
26
|
|
|
23
27
|
namespace ROCKSDB_NAMESPACE {
|
|
24
28
|
|
|
29
|
+
// This is a static filter used for filtering
|
|
30
|
+
// kvs during the compaction process.
|
|
31
|
+
static std::string NEW_VALUE = "NewValue";
|
|
32
|
+
|
|
25
33
|
class DBFlushTest : public DBTestBase {
|
|
26
34
|
public:
|
|
27
|
-
DBFlushTest() : DBTestBase("
|
|
35
|
+
DBFlushTest() : DBTestBase("db_flush_test", /*env_do_fsync=*/true) {}
|
|
28
36
|
};
|
|
29
37
|
|
|
30
38
|
class DBFlushDirectIOTest : public DBFlushTest,
|
|
@@ -80,29 +88,16 @@ TEST_F(DBFlushTest, SyncFail) {
|
|
|
80
88
|
options.env = fault_injection_env.get();
|
|
81
89
|
|
|
82
90
|
SyncPoint::GetInstance()->LoadDependency(
|
|
83
|
-
{{"DBFlushTest::SyncFail:
|
|
84
|
-
"DBImpl::FlushMemTableToOutputFile:BeforePickMemtables"},
|
|
85
|
-
{"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables",
|
|
86
|
-
"DBFlushTest::SyncFail:GetVersionRefCount:2"},
|
|
87
|
-
{"DBFlushTest::SyncFail:1", "DBImpl::SyncClosedLogs:Start"},
|
|
91
|
+
{{"DBFlushTest::SyncFail:1", "DBImpl::SyncClosedLogs:Start"},
|
|
88
92
|
{"DBImpl::SyncClosedLogs:Failed", "DBFlushTest::SyncFail:2"}});
|
|
89
93
|
SyncPoint::GetInstance()->EnableProcessing();
|
|
90
94
|
|
|
91
95
|
CreateAndReopenWithCF({"pikachu"}, options);
|
|
92
96
|
ASSERT_OK(Put("key", "value"));
|
|
93
|
-
auto* cfd =
|
|
94
|
-
static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
|
|
95
|
-
->cfd();
|
|
96
97
|
FlushOptions flush_options;
|
|
97
98
|
flush_options.wait = false;
|
|
98
99
|
ASSERT_OK(dbfull()->Flush(flush_options));
|
|
99
100
|
// Flush installs a new super-version. Get the ref count after that.
|
|
100
|
-
auto current_before = cfd->current();
|
|
101
|
-
int refs_before = cfd->current()->TEST_refs();
|
|
102
|
-
TEST_SYNC_POINT("DBFlushTest::SyncFail:GetVersionRefCount:1");
|
|
103
|
-
TEST_SYNC_POINT("DBFlushTest::SyncFail:GetVersionRefCount:2");
|
|
104
|
-
int refs_after_picking_memtables = cfd->current()->TEST_refs();
|
|
105
|
-
ASSERT_EQ(refs_before + 1, refs_after_picking_memtables);
|
|
106
101
|
fault_injection_env->SetFilesystemActive(false);
|
|
107
102
|
TEST_SYNC_POINT("DBFlushTest::SyncFail:1");
|
|
108
103
|
TEST_SYNC_POINT("DBFlushTest::SyncFail:2");
|
|
@@ -113,9 +108,6 @@ TEST_F(DBFlushTest, SyncFail) {
|
|
|
113
108
|
#ifndef ROCKSDB_LITE
|
|
114
109
|
ASSERT_EQ("", FilesPerLevel()); // flush failed.
|
|
115
110
|
#endif // ROCKSDB_LITE
|
|
116
|
-
// Backgroun flush job should release ref count to current version.
|
|
117
|
-
ASSERT_EQ(current_before, cfd->current());
|
|
118
|
-
ASSERT_EQ(refs_before, cfd->current()->TEST_refs());
|
|
119
111
|
Destroy(options);
|
|
120
112
|
}
|
|
121
113
|
|
|
@@ -148,7 +140,7 @@ TEST_F(DBFlushTest, FlushInLowPriThreadPool) {
|
|
|
148
140
|
// scheduled in the low-pri (compaction) thread pool.
|
|
149
141
|
Options options = CurrentOptions();
|
|
150
142
|
options.level0_file_num_compaction_trigger = 4;
|
|
151
|
-
options.memtable_factory.reset(
|
|
143
|
+
options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
|
|
152
144
|
Reopen(options);
|
|
153
145
|
env_->SetBackgroundThreads(0, Env::HIGH);
|
|
154
146
|
|
|
@@ -180,6 +172,66 @@ TEST_F(DBFlushTest, FlushInLowPriThreadPool) {
|
|
|
180
172
|
ASSERT_EQ(1, num_compactions);
|
|
181
173
|
}
|
|
182
174
|
|
|
175
|
+
// Test when flush job is submitted to low priority thread pool and when DB is
|
|
176
|
+
// closed in the meanwhile, CloseHelper doesn't hang.
|
|
177
|
+
TEST_F(DBFlushTest, CloseDBWhenFlushInLowPri) {
|
|
178
|
+
Options options = CurrentOptions();
|
|
179
|
+
options.max_background_flushes = 1;
|
|
180
|
+
options.max_total_wal_size = 8192;
|
|
181
|
+
|
|
182
|
+
DestroyAndReopen(options);
|
|
183
|
+
CreateColumnFamilies({"cf1", "cf2"}, options);
|
|
184
|
+
|
|
185
|
+
env_->SetBackgroundThreads(0, Env::HIGH);
|
|
186
|
+
env_->SetBackgroundThreads(1, Env::LOW);
|
|
187
|
+
test::SleepingBackgroundTask sleeping_task_low;
|
|
188
|
+
int num_flushes = 0;
|
|
189
|
+
|
|
190
|
+
SyncPoint::GetInstance()->SetCallBack("DBImpl::BGWorkFlush",
|
|
191
|
+
[&](void* /*arg*/) { ++num_flushes; });
|
|
192
|
+
|
|
193
|
+
int num_low_flush_unscheduled = 0;
|
|
194
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
195
|
+
"DBImpl::UnscheduleLowFlushCallback", [&](void* /*arg*/) {
|
|
196
|
+
num_low_flush_unscheduled++;
|
|
197
|
+
// There should be one flush job in low pool that needs to be
|
|
198
|
+
// unscheduled
|
|
199
|
+
ASSERT_EQ(num_low_flush_unscheduled, 1);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
int num_high_flush_unscheduled = 0;
|
|
203
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
204
|
+
"DBImpl::UnscheduleHighFlushCallback", [&](void* /*arg*/) {
|
|
205
|
+
num_high_flush_unscheduled++;
|
|
206
|
+
// There should be no flush job in high pool
|
|
207
|
+
ASSERT_EQ(num_high_flush_unscheduled, 0);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
211
|
+
|
|
212
|
+
ASSERT_OK(Put(0, "key1", DummyString(8192)));
|
|
213
|
+
// Block thread so that flush cannot be run and can be removed from the queue
|
|
214
|
+
// when called Unschedule.
|
|
215
|
+
env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
|
|
216
|
+
Env::Priority::LOW);
|
|
217
|
+
sleeping_task_low.WaitUntilSleeping();
|
|
218
|
+
|
|
219
|
+
// Trigger flush and flush job will be scheduled to LOW priority thread.
|
|
220
|
+
ASSERT_OK(Put(0, "key2", DummyString(8192)));
|
|
221
|
+
|
|
222
|
+
// Close DB and flush job in low priority queue will be removed without
|
|
223
|
+
// running.
|
|
224
|
+
Close();
|
|
225
|
+
sleeping_task_low.WakeUp();
|
|
226
|
+
sleeping_task_low.WaitUntilDone();
|
|
227
|
+
ASSERT_EQ(0, num_flushes);
|
|
228
|
+
|
|
229
|
+
TryReopenWithColumnFamilies({"default", "cf1", "cf2"}, options);
|
|
230
|
+
ASSERT_OK(Put(0, "key3", DummyString(8192)));
|
|
231
|
+
ASSERT_OK(Flush(0));
|
|
232
|
+
ASSERT_EQ(1, num_flushes);
|
|
233
|
+
}
|
|
234
|
+
|
|
183
235
|
TEST_F(DBFlushTest, ManualFlushWithMinWriteBufferNumberToMerge) {
|
|
184
236
|
Options options = CurrentOptions();
|
|
185
237
|
options.write_buffer_size = 100;
|
|
@@ -239,13 +291,1230 @@ TEST_F(DBFlushTest, ScheduleOnlyOneBgThread) {
|
|
|
239
291
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
240
292
|
}
|
|
241
293
|
|
|
294
|
+
// The following 3 tests are designed for testing garbage statistics at flush
|
|
295
|
+
// time.
|
|
296
|
+
//
|
|
297
|
+
// ======= General Information ======= (from GitHub Wiki).
|
|
298
|
+
// There are three scenarios where memtable flush can be triggered:
|
|
299
|
+
//
|
|
300
|
+
// 1 - Memtable size exceeds ColumnFamilyOptions::write_buffer_size
|
|
301
|
+
// after a write.
|
|
302
|
+
// 2 - Total memtable size across all column families exceeds
|
|
303
|
+
// DBOptions::db_write_buffer_size,
|
|
304
|
+
// or DBOptions::write_buffer_manager signals a flush. In this scenario
|
|
305
|
+
// the largest memtable will be flushed.
|
|
306
|
+
// 3 - Total WAL file size exceeds DBOptions::max_total_wal_size.
|
|
307
|
+
// In this scenario the memtable with the oldest data will be flushed,
|
|
308
|
+
// in order to allow the WAL file with data from this memtable to be
|
|
309
|
+
// purged.
|
|
310
|
+
//
|
|
311
|
+
// As a result, a memtable can be flushed before it is full. This is one
|
|
312
|
+
// reason the generated SST file can be smaller than the corresponding
|
|
313
|
+
// memtable. Compression is another factor to make SST file smaller than
|
|
314
|
+
// corresponding memtable, since data in memtable is uncompressed.
|
|
315
|
+
|
|
316
|
+
TEST_F(DBFlushTest, StatisticsGarbageBasic) {
|
|
317
|
+
Options options = CurrentOptions();
|
|
318
|
+
|
|
319
|
+
// The following options are used to enforce several values that
|
|
320
|
+
// may already exist as default values to make this test resilient
|
|
321
|
+
// to default value updates in the future.
|
|
322
|
+
options.statistics = CreateDBStatistics();
|
|
323
|
+
|
|
324
|
+
// Record all statistics.
|
|
325
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
326
|
+
|
|
327
|
+
// create the DB if it's not already present
|
|
328
|
+
options.create_if_missing = true;
|
|
329
|
+
|
|
330
|
+
// Useful for now as we are trying to compare uncompressed data savings on
|
|
331
|
+
// flush().
|
|
332
|
+
options.compression = kNoCompression;
|
|
333
|
+
|
|
334
|
+
// Prevent memtable in place updates. Should already be disabled
|
|
335
|
+
// (from Wiki:
|
|
336
|
+
// In place updates can be enabled by toggling on the bool
|
|
337
|
+
// inplace_update_support flag. However, this flag is by default set to
|
|
338
|
+
// false
|
|
339
|
+
// because this thread-safe in-place update support is not compatible
|
|
340
|
+
// with concurrent memtable writes. Note that the bool
|
|
341
|
+
// allow_concurrent_memtable_write is set to true by default )
|
|
342
|
+
options.inplace_update_support = false;
|
|
343
|
+
options.allow_concurrent_memtable_write = true;
|
|
344
|
+
|
|
345
|
+
// Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
|
|
346
|
+
options.write_buffer_size = 64 << 20;
|
|
347
|
+
|
|
348
|
+
ASSERT_OK(TryReopen(options));
|
|
349
|
+
|
|
350
|
+
// Put multiple times the same key-values.
|
|
351
|
+
// The encoded length of a db entry in the memtable is
|
|
352
|
+
// defined in db/memtable.cc (MemTable::Add) as the variable:
|
|
353
|
+
// encoded_len= VarintLength(internal_key_size) --> =
|
|
354
|
+
// log_256(internal_key).
|
|
355
|
+
// Min # of bytes
|
|
356
|
+
// necessary to
|
|
357
|
+
// store
|
|
358
|
+
// internal_key_size.
|
|
359
|
+
// + internal_key_size --> = actual key string,
|
|
360
|
+
// (size key_size: w/o term null char)
|
|
361
|
+
// + 8 bytes for
|
|
362
|
+
// fixed uint64 "seq
|
|
363
|
+
// number
|
|
364
|
+
// +
|
|
365
|
+
// insertion type"
|
|
366
|
+
// + VarintLength(val_size) --> = min # of bytes to
|
|
367
|
+
// store val_size
|
|
368
|
+
// + val_size --> = actual value
|
|
369
|
+
// string
|
|
370
|
+
// For example, in our situation, "key1" : size 4, "value1" : size 6
|
|
371
|
+
// (the terminating null characters are not copied over to the memtable).
|
|
372
|
+
// And therefore encoded_len = 1 + (4+8) + 1 + 6 = 20 bytes per entry.
|
|
373
|
+
// However in terms of raw data contained in the memtable, and written
|
|
374
|
+
// over to the SSTable, we only count internal_key_size and val_size,
|
|
375
|
+
// because this is the only raw chunk of bytes that contains everything
|
|
376
|
+
// necessary to reconstruct a user entry: sequence number, insertion type,
|
|
377
|
+
// key, and value.
|
|
378
|
+
|
|
379
|
+
// To test the relevance of our Memtable garbage statistics,
|
|
380
|
+
// namely MEMTABLE_PAYLOAD_BYTES_AT_FLUSH and MEMTABLE_GARBAGE_BYTES_AT_FLUSH,
|
|
381
|
+
// we insert K-V pairs with 3 distinct keys (of length 4),
|
|
382
|
+
// and random values of arbitrary length RAND_VALUES_LENGTH,
|
|
383
|
+
// and we repeat this step NUM_REPEAT times total.
|
|
384
|
+
// At the end, we insert 3 final K-V pairs with the same 3 keys
|
|
385
|
+
// and known values (these will be the final values, of length 6).
|
|
386
|
+
// I chose NUM_REPEAT=2,000 such that no automatic flush is
|
|
387
|
+
// triggered (the number of bytes in the memtable is therefore
|
|
388
|
+
// well below any meaningful heuristic for a memtable of size 64MB).
|
|
389
|
+
// As a result, since each K-V pair is inserted as a payload
|
|
390
|
+
// of N meaningful bytes (sequence number, insertion type,
|
|
391
|
+
// key, and value = 8 + 4 + RAND_VALUE_LENGTH),
|
|
392
|
+
// MEMTABLE_GARBAGE_BYTES_AT_FLUSH should be equal to 2,000 * N bytes
|
|
393
|
+
// and MEMTABLE_PAYLAOD_BYTES_AT_FLUSH = MEMTABLE_GARBAGE_BYTES_AT_FLUSH +
|
|
394
|
+
// (3*(8 + 4 + 6)) bytes. For RAND_VALUE_LENGTH = 172 (arbitrary value), we
|
|
395
|
+
// expect:
|
|
396
|
+
// N = 8 + 4 + 172 = 184 bytes
|
|
397
|
+
// MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 2,000 * 184 = 368,000 bytes.
|
|
398
|
+
// MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 368,000 + 3*18 = 368,054 bytes.
|
|
399
|
+
|
|
400
|
+
const size_t NUM_REPEAT = 2000;
|
|
401
|
+
const size_t RAND_VALUES_LENGTH = 172;
|
|
402
|
+
const std::string KEY1 = "key1";
|
|
403
|
+
const std::string KEY2 = "key2";
|
|
404
|
+
const std::string KEY3 = "key3";
|
|
405
|
+
const std::string VALUE1 = "value1";
|
|
406
|
+
const std::string VALUE2 = "value2";
|
|
407
|
+
const std::string VALUE3 = "value3";
|
|
408
|
+
uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
|
|
409
|
+
uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
|
|
410
|
+
|
|
411
|
+
Random rnd(301);
|
|
412
|
+
// Insertion of of K-V pairs, multiple times.
|
|
413
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
414
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
415
|
+
std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
416
|
+
std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
417
|
+
std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
418
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
419
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
420
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
421
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
422
|
+
KEY1.size() + p_v1.size() + sizeof(uint64_t);
|
|
423
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
424
|
+
KEY2.size() + p_v2.size() + sizeof(uint64_t);
|
|
425
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
426
|
+
KEY3.size() + p_v3.size() + sizeof(uint64_t);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// The memtable data bytes includes the "garbage"
|
|
430
|
+
// bytes along with the useful payload.
|
|
431
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
|
|
432
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
|
|
433
|
+
|
|
434
|
+
ASSERT_OK(Put(KEY1, VALUE1));
|
|
435
|
+
ASSERT_OK(Put(KEY2, VALUE2));
|
|
436
|
+
ASSERT_OK(Put(KEY3, VALUE3));
|
|
437
|
+
|
|
438
|
+
// Add useful payload to the memtable data bytes:
|
|
439
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
|
|
440
|
+
KEY1.size() + VALUE1.size() + KEY2.size() + VALUE2.size() + KEY3.size() +
|
|
441
|
+
VALUE3.size() + 3 * sizeof(uint64_t);
|
|
442
|
+
|
|
443
|
+
// We assert that the last K-V pairs have been successfully inserted,
|
|
444
|
+
// and that the valid values are VALUE1, VALUE2, VALUE3.
|
|
445
|
+
PinnableSlice value;
|
|
446
|
+
ASSERT_OK(Get(KEY1, &value));
|
|
447
|
+
ASSERT_EQ(value.ToString(), VALUE1);
|
|
448
|
+
ASSERT_OK(Get(KEY2, &value));
|
|
449
|
+
ASSERT_EQ(value.ToString(), VALUE2);
|
|
450
|
+
ASSERT_OK(Get(KEY3, &value));
|
|
451
|
+
ASSERT_EQ(value.ToString(), VALUE3);
|
|
452
|
+
|
|
453
|
+
// Force flush to SST. Increments the statistics counter.
|
|
454
|
+
ASSERT_OK(Flush());
|
|
455
|
+
|
|
456
|
+
// Collect statistics.
|
|
457
|
+
uint64_t mem_data_bytes =
|
|
458
|
+
TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
459
|
+
uint64_t mem_garbage_bytes =
|
|
460
|
+
TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
461
|
+
|
|
462
|
+
EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
463
|
+
EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
464
|
+
|
|
465
|
+
Close();
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
TEST_F(DBFlushTest, StatisticsGarbageInsertAndDeletes) {
|
|
469
|
+
Options options = CurrentOptions();
|
|
470
|
+
options.statistics = CreateDBStatistics();
|
|
471
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
472
|
+
options.create_if_missing = true;
|
|
473
|
+
options.compression = kNoCompression;
|
|
474
|
+
options.inplace_update_support = false;
|
|
475
|
+
options.allow_concurrent_memtable_write = true;
|
|
476
|
+
options.write_buffer_size = 67108864;
|
|
477
|
+
|
|
478
|
+
ASSERT_OK(TryReopen(options));
|
|
479
|
+
|
|
480
|
+
const size_t NUM_REPEAT = 2000;
|
|
481
|
+
const size_t RAND_VALUES_LENGTH = 37;
|
|
482
|
+
const std::string KEY1 = "key1";
|
|
483
|
+
const std::string KEY2 = "key2";
|
|
484
|
+
const std::string KEY3 = "key3";
|
|
485
|
+
const std::string KEY4 = "key4";
|
|
486
|
+
const std::string KEY5 = "key5";
|
|
487
|
+
const std::string KEY6 = "key6";
|
|
488
|
+
|
|
489
|
+
uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
|
|
490
|
+
uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
|
|
491
|
+
|
|
492
|
+
WriteBatch batch;
|
|
493
|
+
|
|
494
|
+
Random rnd(301);
|
|
495
|
+
// Insertion of of K-V pairs, multiple times.
|
|
496
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
497
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
498
|
+
std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
499
|
+
std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
500
|
+
std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
501
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
502
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
503
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
504
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
505
|
+
KEY1.size() + p_v1.size() + sizeof(uint64_t);
|
|
506
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
507
|
+
KEY2.size() + p_v2.size() + sizeof(uint64_t);
|
|
508
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
509
|
+
KEY3.size() + p_v3.size() + sizeof(uint64_t);
|
|
510
|
+
ASSERT_OK(Delete(KEY1));
|
|
511
|
+
ASSERT_OK(Delete(KEY2));
|
|
512
|
+
ASSERT_OK(Delete(KEY3));
|
|
513
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
514
|
+
KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// The memtable data bytes includes the "garbage"
|
|
518
|
+
// bytes along with the useful payload.
|
|
519
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
|
|
520
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
|
|
521
|
+
|
|
522
|
+
// Note : one set of delete for KEY1, KEY2, KEY3 is written to
|
|
523
|
+
// SSTable to propagate the delete operations to K-V pairs
|
|
524
|
+
// that could have been inserted into the database during past Flush
|
|
525
|
+
// opeartions.
|
|
526
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
|
|
527
|
+
KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
|
|
528
|
+
|
|
529
|
+
// Additional useful paylaod.
|
|
530
|
+
ASSERT_OK(Delete(KEY4));
|
|
531
|
+
ASSERT_OK(Delete(KEY5));
|
|
532
|
+
ASSERT_OK(Delete(KEY6));
|
|
533
|
+
|
|
534
|
+
// // Add useful payload to the memtable data bytes:
|
|
535
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
|
|
536
|
+
KEY4.size() + KEY5.size() + KEY6.size() + 3 * sizeof(uint64_t);
|
|
537
|
+
|
|
538
|
+
// We assert that the K-V pairs have been successfully deleted.
|
|
539
|
+
PinnableSlice value;
|
|
540
|
+
ASSERT_NOK(Get(KEY1, &value));
|
|
541
|
+
ASSERT_NOK(Get(KEY2, &value));
|
|
542
|
+
ASSERT_NOK(Get(KEY3, &value));
|
|
543
|
+
|
|
544
|
+
// Force flush to SST. Increments the statistics counter.
|
|
545
|
+
ASSERT_OK(Flush());
|
|
546
|
+
|
|
547
|
+
// Collect statistics.
|
|
548
|
+
uint64_t mem_data_bytes =
|
|
549
|
+
TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
550
|
+
uint64_t mem_garbage_bytes =
|
|
551
|
+
TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
552
|
+
|
|
553
|
+
EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
554
|
+
EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
555
|
+
|
|
556
|
+
Close();
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
TEST_F(DBFlushTest, StatisticsGarbageRangeDeletes) {
|
|
560
|
+
Options options = CurrentOptions();
|
|
561
|
+
options.statistics = CreateDBStatistics();
|
|
562
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
563
|
+
options.create_if_missing = true;
|
|
564
|
+
options.compression = kNoCompression;
|
|
565
|
+
options.inplace_update_support = false;
|
|
566
|
+
options.allow_concurrent_memtable_write = true;
|
|
567
|
+
options.write_buffer_size = 67108864;
|
|
568
|
+
|
|
569
|
+
ASSERT_OK(TryReopen(options));
|
|
570
|
+
|
|
571
|
+
const size_t NUM_REPEAT = 1000;
|
|
572
|
+
const size_t RAND_VALUES_LENGTH = 42;
|
|
573
|
+
const std::string KEY1 = "key1";
|
|
574
|
+
const std::string KEY2 = "key2";
|
|
575
|
+
const std::string KEY3 = "key3";
|
|
576
|
+
const std::string KEY4 = "key4";
|
|
577
|
+
const std::string KEY5 = "key5";
|
|
578
|
+
const std::string KEY6 = "key6";
|
|
579
|
+
const std::string VALUE3 = "value3";
|
|
580
|
+
|
|
581
|
+
uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
|
|
582
|
+
uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
|
|
583
|
+
|
|
584
|
+
Random rnd(301);
|
|
585
|
+
// Insertion of of K-V pairs, multiple times.
|
|
586
|
+
// Also insert DeleteRange
|
|
587
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
588
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
589
|
+
std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
590
|
+
std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
591
|
+
std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
592
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
593
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
594
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
595
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
596
|
+
KEY1.size() + p_v1.size() + sizeof(uint64_t);
|
|
597
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
598
|
+
KEY2.size() + p_v2.size() + sizeof(uint64_t);
|
|
599
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
600
|
+
KEY3.size() + p_v3.size() + sizeof(uint64_t);
|
|
601
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
|
|
602
|
+
KEY2));
|
|
603
|
+
// Note: DeleteRange have an exclusive upper bound, e.g. here: [KEY2,KEY3)
|
|
604
|
+
// is deleted.
|
|
605
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
|
|
606
|
+
KEY3));
|
|
607
|
+
// Delete ranges are stored as a regular K-V pair, with key=STARTKEY,
|
|
608
|
+
// value=ENDKEY.
|
|
609
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
|
|
610
|
+
(KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
|
|
611
|
+
(KEY2.size() + KEY3.size() + sizeof(uint64_t));
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// The memtable data bytes includes the "garbage"
|
|
615
|
+
// bytes along with the useful payload.
|
|
616
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
|
|
617
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
|
|
618
|
+
|
|
619
|
+
// Note : one set of deleteRange for (KEY1, KEY2) and (KEY2, KEY3) is written
|
|
620
|
+
// to SSTable to propagate the deleteRange operations to K-V pairs that could
|
|
621
|
+
// have been inserted into the database during past Flush opeartions.
|
|
622
|
+
EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
|
|
623
|
+
(KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
|
|
624
|
+
(KEY2.size() + KEY3.size() + sizeof(uint64_t));
|
|
625
|
+
|
|
626
|
+
// Overwrite KEY3 with known value (VALUE3)
|
|
627
|
+
// Note that during the whole time KEY3 has never been deleted
|
|
628
|
+
// by the RangeDeletes.
|
|
629
|
+
ASSERT_OK(Put(KEY3, VALUE3));
|
|
630
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
|
|
631
|
+
KEY3.size() + VALUE3.size() + sizeof(uint64_t);
|
|
632
|
+
|
|
633
|
+
// Additional useful paylaod.
|
|
634
|
+
ASSERT_OK(
|
|
635
|
+
db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY4, KEY5));
|
|
636
|
+
ASSERT_OK(
|
|
637
|
+
db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY5, KEY6));
|
|
638
|
+
|
|
639
|
+
// Add useful payload to the memtable data bytes:
|
|
640
|
+
EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
|
|
641
|
+
(KEY4.size() + KEY5.size() + sizeof(uint64_t)) +
|
|
642
|
+
(KEY5.size() + KEY6.size() + sizeof(uint64_t));
|
|
643
|
+
|
|
644
|
+
// We assert that the K-V pairs have been successfully deleted.
|
|
645
|
+
PinnableSlice value;
|
|
646
|
+
ASSERT_NOK(Get(KEY1, &value));
|
|
647
|
+
ASSERT_NOK(Get(KEY2, &value));
|
|
648
|
+
// And that KEY3's value is correct.
|
|
649
|
+
ASSERT_OK(Get(KEY3, &value));
|
|
650
|
+
ASSERT_EQ(value, VALUE3);
|
|
651
|
+
|
|
652
|
+
// Force flush to SST. Increments the statistics counter.
|
|
653
|
+
ASSERT_OK(Flush());
|
|
654
|
+
|
|
655
|
+
// Collect statistics.
|
|
656
|
+
uint64_t mem_data_bytes =
|
|
657
|
+
TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
658
|
+
uint64_t mem_garbage_bytes =
|
|
659
|
+
TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
660
|
+
|
|
661
|
+
EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
|
|
662
|
+
EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
|
|
663
|
+
|
|
664
|
+
Close();
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
#ifndef ROCKSDB_LITE
|
|
668
|
+
// This simple Listener can only handle one flush at a time.
|
|
669
|
+
class TestFlushListener : public EventListener {
|
|
670
|
+
public:
|
|
671
|
+
TestFlushListener(Env* env, DBFlushTest* test)
|
|
672
|
+
: slowdown_count(0), stop_count(0), db_closed(), env_(env), test_(test) {
|
|
673
|
+
db_closed = false;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
~TestFlushListener() override {
|
|
677
|
+
prev_fc_info_.status.PermitUncheckedError(); // Ignore the status
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
void OnTableFileCreated(const TableFileCreationInfo& info) override {
|
|
681
|
+
// remember the info for later checking the FlushJobInfo.
|
|
682
|
+
prev_fc_info_ = info;
|
|
683
|
+
ASSERT_GT(info.db_name.size(), 0U);
|
|
684
|
+
ASSERT_GT(info.cf_name.size(), 0U);
|
|
685
|
+
ASSERT_GT(info.file_path.size(), 0U);
|
|
686
|
+
ASSERT_GT(info.job_id, 0);
|
|
687
|
+
ASSERT_GT(info.table_properties.data_size, 0U);
|
|
688
|
+
ASSERT_GT(info.table_properties.raw_key_size, 0U);
|
|
689
|
+
ASSERT_GT(info.table_properties.raw_value_size, 0U);
|
|
690
|
+
ASSERT_GT(info.table_properties.num_data_blocks, 0U);
|
|
691
|
+
ASSERT_GT(info.table_properties.num_entries, 0U);
|
|
692
|
+
ASSERT_EQ(info.file_checksum, kUnknownFileChecksum);
|
|
693
|
+
ASSERT_EQ(info.file_checksum_func_name, kUnknownFileChecksumFuncName);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
void OnFlushCompleted(DB* db, const FlushJobInfo& info) override {
|
|
697
|
+
flushed_dbs_.push_back(db);
|
|
698
|
+
flushed_column_family_names_.push_back(info.cf_name);
|
|
699
|
+
if (info.triggered_writes_slowdown) {
|
|
700
|
+
slowdown_count++;
|
|
701
|
+
}
|
|
702
|
+
if (info.triggered_writes_stop) {
|
|
703
|
+
stop_count++;
|
|
704
|
+
}
|
|
705
|
+
// verify whether the previously created file matches the flushed file.
|
|
706
|
+
ASSERT_EQ(prev_fc_info_.db_name, db->GetName());
|
|
707
|
+
ASSERT_EQ(prev_fc_info_.cf_name, info.cf_name);
|
|
708
|
+
ASSERT_EQ(prev_fc_info_.job_id, info.job_id);
|
|
709
|
+
ASSERT_EQ(prev_fc_info_.file_path, info.file_path);
|
|
710
|
+
ASSERT_EQ(TableFileNameToNumber(info.file_path), info.file_number);
|
|
711
|
+
|
|
712
|
+
// Note: the following chunk relies on the notification pertaining to the
|
|
713
|
+
// database pointed to by DBTestBase::db_, and is thus bypassed when
|
|
714
|
+
// that assumption does not hold (see the test case MultiDBMultiListeners
|
|
715
|
+
// below).
|
|
716
|
+
ASSERT_TRUE(test_);
|
|
717
|
+
if (db == test_->db_) {
|
|
718
|
+
std::vector<std::vector<FileMetaData>> files_by_level;
|
|
719
|
+
test_->dbfull()->TEST_GetFilesMetaData(db->DefaultColumnFamily(),
|
|
720
|
+
&files_by_level);
|
|
721
|
+
|
|
722
|
+
ASSERT_FALSE(files_by_level.empty());
|
|
723
|
+
auto it = std::find_if(files_by_level[0].begin(), files_by_level[0].end(),
|
|
724
|
+
[&](const FileMetaData& meta) {
|
|
725
|
+
return meta.fd.GetNumber() == info.file_number;
|
|
726
|
+
});
|
|
727
|
+
ASSERT_NE(it, files_by_level[0].end());
|
|
728
|
+
ASSERT_EQ(info.oldest_blob_file_number, it->oldest_blob_file_number);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
ASSERT_EQ(db->GetEnv()->GetThreadID(), info.thread_id);
|
|
732
|
+
ASSERT_GT(info.thread_id, 0U);
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
std::vector<std::string> flushed_column_family_names_;
|
|
736
|
+
std::vector<DB*> flushed_dbs_;
|
|
737
|
+
int slowdown_count;
|
|
738
|
+
int stop_count;
|
|
739
|
+
bool db_closing;
|
|
740
|
+
std::atomic_bool db_closed;
|
|
741
|
+
TableFileCreationInfo prev_fc_info_;
|
|
742
|
+
|
|
743
|
+
protected:
|
|
744
|
+
Env* env_;
|
|
745
|
+
DBFlushTest* test_;
|
|
746
|
+
};
|
|
747
|
+
#endif // !ROCKSDB_LITE
|
|
748
|
+
|
|
749
|
+
TEST_F(DBFlushTest, MemPurgeBasic) {
|
|
750
|
+
Options options = CurrentOptions();
|
|
751
|
+
|
|
752
|
+
// The following options are used to enforce several values that
|
|
753
|
+
// may already exist as default values to make this test resilient
|
|
754
|
+
// to default value updates in the future.
|
|
755
|
+
options.statistics = CreateDBStatistics();
|
|
756
|
+
|
|
757
|
+
// Record all statistics.
|
|
758
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
759
|
+
|
|
760
|
+
// create the DB if it's not already present
|
|
761
|
+
options.create_if_missing = true;
|
|
762
|
+
|
|
763
|
+
// Useful for now as we are trying to compare uncompressed data savings on
|
|
764
|
+
// flush().
|
|
765
|
+
options.compression = kNoCompression;
|
|
766
|
+
|
|
767
|
+
// Prevent memtable in place updates. Should already be disabled
|
|
768
|
+
// (from Wiki:
|
|
769
|
+
// In place updates can be enabled by toggling on the bool
|
|
770
|
+
// inplace_update_support flag. However, this flag is by default set to
|
|
771
|
+
// false
|
|
772
|
+
// because this thread-safe in-place update support is not compatible
|
|
773
|
+
// with concurrent memtable writes. Note that the bool
|
|
774
|
+
// allow_concurrent_memtable_write is set to true by default )
|
|
775
|
+
options.inplace_update_support = false;
|
|
776
|
+
options.allow_concurrent_memtable_write = true;
|
|
777
|
+
|
|
778
|
+
// Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
|
|
779
|
+
options.write_buffer_size = 1 << 20;
|
|
780
|
+
// Activate the MemPurge prototype.
|
|
781
|
+
options.experimental_mempurge_threshold = 1.0;
|
|
782
|
+
#ifndef ROCKSDB_LITE
|
|
783
|
+
TestFlushListener* listener = new TestFlushListener(options.env, this);
|
|
784
|
+
options.listeners.emplace_back(listener);
|
|
785
|
+
#endif // !ROCKSDB_LITE
|
|
786
|
+
ASSERT_OK(TryReopen(options));
|
|
787
|
+
std::atomic<uint32_t> mempurge_count{0};
|
|
788
|
+
std::atomic<uint32_t> sst_count{0};
|
|
789
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
790
|
+
"DBImpl::FlushJob:MemPurgeSuccessful",
|
|
791
|
+
[&](void* /*arg*/) { mempurge_count++; });
|
|
792
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
793
|
+
"DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
|
|
794
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
795
|
+
|
|
796
|
+
std::string KEY1 = "IamKey1";
|
|
797
|
+
std::string KEY2 = "IamKey2";
|
|
798
|
+
std::string KEY3 = "IamKey3";
|
|
799
|
+
std::string KEY4 = "IamKey4";
|
|
800
|
+
std::string KEY5 = "IamKey5";
|
|
801
|
+
std::string KEY6 = "IamKey6";
|
|
802
|
+
std::string KEY7 = "IamKey7";
|
|
803
|
+
std::string KEY8 = "IamKey8";
|
|
804
|
+
std::string KEY9 = "IamKey9";
|
|
805
|
+
std::string RNDKEY1, RNDKEY2, RNDKEY3;
|
|
806
|
+
const std::string NOT_FOUND = "NOT_FOUND";
|
|
807
|
+
|
|
808
|
+
// Heavy overwrite workload,
|
|
809
|
+
// more than would fit in maximum allowed memtables.
|
|
810
|
+
Random rnd(719);
|
|
811
|
+
const size_t NUM_REPEAT = 100;
|
|
812
|
+
const size_t RAND_KEYS_LENGTH = 57;
|
|
813
|
+
const size_t RAND_VALUES_LENGTH = 10240;
|
|
814
|
+
std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9, p_rv1,
|
|
815
|
+
p_rv2, p_rv3;
|
|
816
|
+
|
|
817
|
+
// Insert a very first set of keys that will be
|
|
818
|
+
// mempurged at least once.
|
|
819
|
+
p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
820
|
+
p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
821
|
+
p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
822
|
+
p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
823
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
824
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
825
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
826
|
+
ASSERT_OK(Put(KEY4, p_v4));
|
|
827
|
+
ASSERT_EQ(Get(KEY1), p_v1);
|
|
828
|
+
ASSERT_EQ(Get(KEY2), p_v2);
|
|
829
|
+
ASSERT_EQ(Get(KEY3), p_v3);
|
|
830
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
831
|
+
|
|
832
|
+
// Insertion of of K-V pairs, multiple times (overwrites).
|
|
833
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
834
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
835
|
+
p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
836
|
+
p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
837
|
+
p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
838
|
+
p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
839
|
+
p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
840
|
+
|
|
841
|
+
ASSERT_OK(Put(KEY5, p_v5));
|
|
842
|
+
ASSERT_OK(Put(KEY6, p_v6));
|
|
843
|
+
ASSERT_OK(Put(KEY7, p_v7));
|
|
844
|
+
ASSERT_OK(Put(KEY8, p_v8));
|
|
845
|
+
ASSERT_OK(Put(KEY9, p_v9));
|
|
846
|
+
|
|
847
|
+
ASSERT_EQ(Get(KEY1), p_v1);
|
|
848
|
+
ASSERT_EQ(Get(KEY2), p_v2);
|
|
849
|
+
ASSERT_EQ(Get(KEY3), p_v3);
|
|
850
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
851
|
+
ASSERT_EQ(Get(KEY5), p_v5);
|
|
852
|
+
ASSERT_EQ(Get(KEY6), p_v6);
|
|
853
|
+
ASSERT_EQ(Get(KEY7), p_v7);
|
|
854
|
+
ASSERT_EQ(Get(KEY8), p_v8);
|
|
855
|
+
ASSERT_EQ(Get(KEY9), p_v9);
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
// Check that there was at least one mempurge
|
|
859
|
+
const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
|
|
860
|
+
// Check that there was no SST files created during flush.
|
|
861
|
+
const uint32_t EXPECTED_SST_COUNT = 0;
|
|
862
|
+
|
|
863
|
+
EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
|
|
864
|
+
EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
865
|
+
|
|
866
|
+
// Insertion of of K-V pairs, no overwrites.
|
|
867
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
868
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
869
|
+
RNDKEY1 = rnd.RandomString(RAND_KEYS_LENGTH);
|
|
870
|
+
RNDKEY2 = rnd.RandomString(RAND_KEYS_LENGTH);
|
|
871
|
+
RNDKEY3 = rnd.RandomString(RAND_KEYS_LENGTH);
|
|
872
|
+
p_rv1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
873
|
+
p_rv2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
874
|
+
p_rv3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
875
|
+
|
|
876
|
+
ASSERT_OK(Put(RNDKEY1, p_rv1));
|
|
877
|
+
ASSERT_OK(Put(RNDKEY2, p_rv2));
|
|
878
|
+
ASSERT_OK(Put(RNDKEY3, p_rv3));
|
|
879
|
+
|
|
880
|
+
ASSERT_EQ(Get(KEY1), p_v1);
|
|
881
|
+
ASSERT_EQ(Get(KEY2), p_v2);
|
|
882
|
+
ASSERT_EQ(Get(KEY3), p_v3);
|
|
883
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
884
|
+
ASSERT_EQ(Get(KEY5), p_v5);
|
|
885
|
+
ASSERT_EQ(Get(KEY6), p_v6);
|
|
886
|
+
ASSERT_EQ(Get(KEY7), p_v7);
|
|
887
|
+
ASSERT_EQ(Get(KEY8), p_v8);
|
|
888
|
+
ASSERT_EQ(Get(KEY9), p_v9);
|
|
889
|
+
ASSERT_EQ(Get(RNDKEY1), p_rv1);
|
|
890
|
+
ASSERT_EQ(Get(RNDKEY2), p_rv2);
|
|
891
|
+
ASSERT_EQ(Get(RNDKEY3), p_rv3);
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
// Assert that at least one flush to storage has been performed
|
|
895
|
+
EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
896
|
+
// (which will consequently increase the number of mempurges recorded too).
|
|
897
|
+
EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
|
|
898
|
+
|
|
899
|
+
// Assert that there is no data corruption, even with
|
|
900
|
+
// a flush to storage.
|
|
901
|
+
ASSERT_EQ(Get(KEY1), p_v1);
|
|
902
|
+
ASSERT_EQ(Get(KEY2), p_v2);
|
|
903
|
+
ASSERT_EQ(Get(KEY3), p_v3);
|
|
904
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
905
|
+
ASSERT_EQ(Get(KEY5), p_v5);
|
|
906
|
+
ASSERT_EQ(Get(KEY6), p_v6);
|
|
907
|
+
ASSERT_EQ(Get(KEY7), p_v7);
|
|
908
|
+
ASSERT_EQ(Get(KEY8), p_v8);
|
|
909
|
+
ASSERT_EQ(Get(KEY9), p_v9);
|
|
910
|
+
ASSERT_EQ(Get(RNDKEY1), p_rv1);
|
|
911
|
+
ASSERT_EQ(Get(RNDKEY2), p_rv2);
|
|
912
|
+
ASSERT_EQ(Get(RNDKEY3), p_rv3);
|
|
913
|
+
|
|
914
|
+
Close();
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
TEST_F(DBFlushTest, MemPurgeDeleteAndDeleteRange) {
|
|
918
|
+
Options options = CurrentOptions();
|
|
919
|
+
|
|
920
|
+
options.statistics = CreateDBStatistics();
|
|
921
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
922
|
+
options.create_if_missing = true;
|
|
923
|
+
options.compression = kNoCompression;
|
|
924
|
+
options.inplace_update_support = false;
|
|
925
|
+
options.allow_concurrent_memtable_write = true;
|
|
926
|
+
#ifndef ROCKSDB_LITE
|
|
927
|
+
TestFlushListener* listener = new TestFlushListener(options.env, this);
|
|
928
|
+
options.listeners.emplace_back(listener);
|
|
929
|
+
#endif // !ROCKSDB_LITE
|
|
930
|
+
// Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
|
|
931
|
+
options.write_buffer_size = 1 << 20;
|
|
932
|
+
// Activate the MemPurge prototype.
|
|
933
|
+
options.experimental_mempurge_threshold = 1.0;
|
|
934
|
+
|
|
935
|
+
ASSERT_OK(TryReopen(options));
|
|
936
|
+
|
|
937
|
+
std::atomic<uint32_t> mempurge_count{0};
|
|
938
|
+
std::atomic<uint32_t> sst_count{0};
|
|
939
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
940
|
+
"DBImpl::FlushJob:MemPurgeSuccessful",
|
|
941
|
+
[&](void* /*arg*/) { mempurge_count++; });
|
|
942
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
943
|
+
"DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
|
|
944
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
945
|
+
|
|
946
|
+
std::string KEY1 = "ThisIsKey1";
|
|
947
|
+
std::string KEY2 = "ThisIsKey2";
|
|
948
|
+
std::string KEY3 = "ThisIsKey3";
|
|
949
|
+
std::string KEY4 = "ThisIsKey4";
|
|
950
|
+
std::string KEY5 = "ThisIsKey5";
|
|
951
|
+
const std::string NOT_FOUND = "NOT_FOUND";
|
|
952
|
+
|
|
953
|
+
Random rnd(117);
|
|
954
|
+
const size_t NUM_REPEAT = 100;
|
|
955
|
+
const size_t RAND_VALUES_LENGTH = 10240;
|
|
956
|
+
|
|
957
|
+
std::string key, value, p_v1, p_v2, p_v3, p_v3b, p_v4, p_v5;
|
|
958
|
+
int count = 0;
|
|
959
|
+
const int EXPECTED_COUNT_FORLOOP = 3;
|
|
960
|
+
const int EXPECTED_COUNT_END = 4;
|
|
961
|
+
|
|
962
|
+
ReadOptions ropt;
|
|
963
|
+
ropt.pin_data = true;
|
|
964
|
+
ropt.total_order_seek = true;
|
|
965
|
+
Iterator* iter = nullptr;
|
|
966
|
+
|
|
967
|
+
// Insertion of of K-V pairs, multiple times.
|
|
968
|
+
// Also insert DeleteRange
|
|
969
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
970
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
971
|
+
p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
972
|
+
p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
973
|
+
p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
974
|
+
p_v3b = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
975
|
+
p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
976
|
+
p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
977
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
978
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
979
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
980
|
+
ASSERT_OK(Put(KEY4, p_v4));
|
|
981
|
+
ASSERT_OK(Put(KEY5, p_v5));
|
|
982
|
+
ASSERT_OK(Delete(KEY2));
|
|
983
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
|
|
984
|
+
KEY4));
|
|
985
|
+
ASSERT_OK(Put(KEY3, p_v3b));
|
|
986
|
+
ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
|
|
987
|
+
KEY3));
|
|
988
|
+
ASSERT_OK(Delete(KEY1));
|
|
989
|
+
|
|
990
|
+
ASSERT_EQ(Get(KEY1), NOT_FOUND);
|
|
991
|
+
ASSERT_EQ(Get(KEY2), NOT_FOUND);
|
|
992
|
+
ASSERT_EQ(Get(KEY3), p_v3b);
|
|
993
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
994
|
+
ASSERT_EQ(Get(KEY5), p_v5);
|
|
995
|
+
|
|
996
|
+
iter = db_->NewIterator(ropt);
|
|
997
|
+
iter->SeekToFirst();
|
|
998
|
+
count = 0;
|
|
999
|
+
for (; iter->Valid(); iter->Next()) {
|
|
1000
|
+
ASSERT_OK(iter->status());
|
|
1001
|
+
key = (iter->key()).ToString(false);
|
|
1002
|
+
value = (iter->value()).ToString(false);
|
|
1003
|
+
if (key.compare(KEY3) == 0)
|
|
1004
|
+
ASSERT_EQ(value, p_v3b);
|
|
1005
|
+
else if (key.compare(KEY4) == 0)
|
|
1006
|
+
ASSERT_EQ(value, p_v4);
|
|
1007
|
+
else if (key.compare(KEY5) == 0)
|
|
1008
|
+
ASSERT_EQ(value, p_v5);
|
|
1009
|
+
else
|
|
1010
|
+
ASSERT_EQ(value, NOT_FOUND);
|
|
1011
|
+
count++;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
// Expected count here is 3: KEY3, KEY4, KEY5.
|
|
1015
|
+
ASSERT_EQ(count, EXPECTED_COUNT_FORLOOP);
|
|
1016
|
+
if (iter) {
|
|
1017
|
+
delete iter;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// Check that there was at least one mempurge
|
|
1022
|
+
const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
|
|
1023
|
+
// Check that there was no SST files created during flush.
|
|
1024
|
+
const uint32_t EXPECTED_SST_COUNT = 0;
|
|
1025
|
+
|
|
1026
|
+
EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
|
|
1027
|
+
EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
1028
|
+
|
|
1029
|
+
// Additional test for the iterator+memPurge.
|
|
1030
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
1031
|
+
iter = db_->NewIterator(ropt);
|
|
1032
|
+
iter->SeekToFirst();
|
|
1033
|
+
ASSERT_OK(Put(KEY4, p_v4));
|
|
1034
|
+
count = 0;
|
|
1035
|
+
for (; iter->Valid(); iter->Next()) {
|
|
1036
|
+
ASSERT_OK(iter->status());
|
|
1037
|
+
key = (iter->key()).ToString(false);
|
|
1038
|
+
value = (iter->value()).ToString(false);
|
|
1039
|
+
if (key.compare(KEY2) == 0)
|
|
1040
|
+
ASSERT_EQ(value, p_v2);
|
|
1041
|
+
else if (key.compare(KEY3) == 0)
|
|
1042
|
+
ASSERT_EQ(value, p_v3b);
|
|
1043
|
+
else if (key.compare(KEY4) == 0)
|
|
1044
|
+
ASSERT_EQ(value, p_v4);
|
|
1045
|
+
else if (key.compare(KEY5) == 0)
|
|
1046
|
+
ASSERT_EQ(value, p_v5);
|
|
1047
|
+
else
|
|
1048
|
+
ASSERT_EQ(value, NOT_FOUND);
|
|
1049
|
+
count++;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
// Expected count here is 4: KEY2, KEY3, KEY4, KEY5.
|
|
1053
|
+
ASSERT_EQ(count, EXPECTED_COUNT_END);
|
|
1054
|
+
if (iter) delete iter;
|
|
1055
|
+
|
|
1056
|
+
Close();
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
// Create a Compaction Fitler that will be invoked
|
|
1060
|
+
// at flush time and will update the value of a KV pair
|
|
1061
|
+
// if the key string is "lower" than the filter_key_ string.
|
|
1062
|
+
class ConditionalUpdateFilter : public CompactionFilter {
|
|
1063
|
+
public:
|
|
1064
|
+
explicit ConditionalUpdateFilter(const std::string* filtered_key)
|
|
1065
|
+
: filtered_key_(filtered_key) {}
|
|
1066
|
+
bool Filter(int /*level*/, const Slice& key, const Slice& /*value*/,
|
|
1067
|
+
std::string* new_value, bool* value_changed) const override {
|
|
1068
|
+
// If key<filtered_key_, update the value of the KV-pair.
|
|
1069
|
+
if (key.compare(*filtered_key_) < 0) {
|
|
1070
|
+
assert(new_value != nullptr);
|
|
1071
|
+
*new_value = NEW_VALUE;
|
|
1072
|
+
*value_changed = true;
|
|
1073
|
+
}
|
|
1074
|
+
return false /*do not remove this KV-pair*/;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
const char* Name() const override { return "ConditionalUpdateFilter"; }
|
|
1078
|
+
|
|
1079
|
+
private:
|
|
1080
|
+
const std::string* filtered_key_;
|
|
1081
|
+
};
|
|
1082
|
+
|
|
1083
|
+
class ConditionalUpdateFilterFactory : public CompactionFilterFactory {
|
|
1084
|
+
public:
|
|
1085
|
+
explicit ConditionalUpdateFilterFactory(const Slice& filtered_key)
|
|
1086
|
+
: filtered_key_(filtered_key.ToString()) {}
|
|
1087
|
+
|
|
1088
|
+
std::unique_ptr<CompactionFilter> CreateCompactionFilter(
|
|
1089
|
+
const CompactionFilter::Context& /*context*/) override {
|
|
1090
|
+
return std::unique_ptr<CompactionFilter>(
|
|
1091
|
+
new ConditionalUpdateFilter(&filtered_key_));
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
const char* Name() const override { return "ConditionalUpdateFilterFactory"; }
|
|
1095
|
+
|
|
1096
|
+
bool ShouldFilterTableFileCreation(
|
|
1097
|
+
TableFileCreationReason reason) const override {
|
|
1098
|
+
// This compaction filter will be invoked
|
|
1099
|
+
// at flush time (and therefore at MemPurge time).
|
|
1100
|
+
return (reason == TableFileCreationReason::kFlush);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
private:
|
|
1104
|
+
std::string filtered_key_;
|
|
1105
|
+
};
|
|
1106
|
+
|
|
1107
|
+
TEST_F(DBFlushTest, MemPurgeAndCompactionFilter) {
|
|
1108
|
+
Options options = CurrentOptions();
|
|
1109
|
+
|
|
1110
|
+
std::string KEY1 = "ThisIsKey1";
|
|
1111
|
+
std::string KEY2 = "ThisIsKey2";
|
|
1112
|
+
std::string KEY3 = "ThisIsKey3";
|
|
1113
|
+
std::string KEY4 = "ThisIsKey4";
|
|
1114
|
+
std::string KEY5 = "ThisIsKey5";
|
|
1115
|
+
std::string KEY6 = "ThisIsKey6";
|
|
1116
|
+
std::string KEY7 = "ThisIsKey7";
|
|
1117
|
+
std::string KEY8 = "ThisIsKey8";
|
|
1118
|
+
std::string KEY9 = "ThisIsKey9";
|
|
1119
|
+
const std::string NOT_FOUND = "NOT_FOUND";
|
|
1120
|
+
|
|
1121
|
+
options.statistics = CreateDBStatistics();
|
|
1122
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
1123
|
+
options.create_if_missing = true;
|
|
1124
|
+
options.compression = kNoCompression;
|
|
1125
|
+
options.inplace_update_support = false;
|
|
1126
|
+
options.allow_concurrent_memtable_write = true;
|
|
1127
|
+
#ifndef ROCKSDB_LITE
|
|
1128
|
+
TestFlushListener* listener = new TestFlushListener(options.env, this);
|
|
1129
|
+
options.listeners.emplace_back(listener);
|
|
1130
|
+
#endif // !ROCKSDB_LITE
|
|
1131
|
+
// Create a ConditionalUpdate compaction filter
|
|
1132
|
+
// that will update all the values of the KV pairs
|
|
1133
|
+
// where the keys are "lower" than KEY4.
|
|
1134
|
+
options.compaction_filter_factory =
|
|
1135
|
+
std::make_shared<ConditionalUpdateFilterFactory>(KEY4);
|
|
1136
|
+
|
|
1137
|
+
// Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
|
|
1138
|
+
options.write_buffer_size = 1 << 20;
|
|
1139
|
+
// Activate the MemPurge prototype.
|
|
1140
|
+
options.experimental_mempurge_threshold = 1.0;
|
|
1141
|
+
|
|
1142
|
+
ASSERT_OK(TryReopen(options));
|
|
1143
|
+
|
|
1144
|
+
std::atomic<uint32_t> mempurge_count{0};
|
|
1145
|
+
std::atomic<uint32_t> sst_count{0};
|
|
1146
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1147
|
+
"DBImpl::FlushJob:MemPurgeSuccessful",
|
|
1148
|
+
[&](void* /*arg*/) { mempurge_count++; });
|
|
1149
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1150
|
+
"DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
|
|
1151
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
1152
|
+
|
|
1153
|
+
Random rnd(53);
|
|
1154
|
+
const size_t NUM_REPEAT = 1000;
|
|
1155
|
+
const size_t RAND_VALUES_LENGTH = 10240;
|
|
1156
|
+
std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9;
|
|
1157
|
+
|
|
1158
|
+
p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1159
|
+
p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1160
|
+
p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1161
|
+
p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1162
|
+
p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1163
|
+
ASSERT_OK(Put(KEY1, p_v1));
|
|
1164
|
+
ASSERT_OK(Put(KEY2, p_v2));
|
|
1165
|
+
ASSERT_OK(Put(KEY3, p_v3));
|
|
1166
|
+
ASSERT_OK(Put(KEY4, p_v4));
|
|
1167
|
+
ASSERT_OK(Put(KEY5, p_v5));
|
|
1168
|
+
ASSERT_OK(Delete(KEY1));
|
|
1169
|
+
|
|
1170
|
+
// Insertion of of K-V pairs, multiple times.
|
|
1171
|
+
for (size_t i = 0; i < NUM_REPEAT; i++) {
|
|
1172
|
+
// Create value strings of arbitrary
|
|
1173
|
+
// length RAND_VALUES_LENGTH bytes.
|
|
1174
|
+
p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1175
|
+
p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1176
|
+
p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1177
|
+
p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1178
|
+
ASSERT_OK(Put(KEY6, p_v6));
|
|
1179
|
+
ASSERT_OK(Put(KEY7, p_v7));
|
|
1180
|
+
ASSERT_OK(Put(KEY8, p_v8));
|
|
1181
|
+
ASSERT_OK(Put(KEY9, p_v9));
|
|
1182
|
+
|
|
1183
|
+
ASSERT_OK(Delete(KEY7));
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
// Check that there was at least one mempurge
|
|
1187
|
+
const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
|
|
1188
|
+
// Check that there was no SST files created during flush.
|
|
1189
|
+
const uint32_t EXPECTED_SST_COUNT = 0;
|
|
1190
|
+
|
|
1191
|
+
EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
|
|
1192
|
+
EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
1193
|
+
|
|
1194
|
+
// Verify that the ConditionalUpdateCompactionFilter
|
|
1195
|
+
// updated the values of KEY2 and KEY3, and not KEY4 and KEY5.
|
|
1196
|
+
ASSERT_EQ(Get(KEY1), NOT_FOUND);
|
|
1197
|
+
ASSERT_EQ(Get(KEY2), NEW_VALUE);
|
|
1198
|
+
ASSERT_EQ(Get(KEY3), NEW_VALUE);
|
|
1199
|
+
ASSERT_EQ(Get(KEY4), p_v4);
|
|
1200
|
+
ASSERT_EQ(Get(KEY5), p_v5);
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
TEST_F(DBFlushTest, DISABLED_MemPurgeWALSupport) {
|
|
1204
|
+
Options options = CurrentOptions();
|
|
1205
|
+
|
|
1206
|
+
options.statistics = CreateDBStatistics();
|
|
1207
|
+
options.statistics->set_stats_level(StatsLevel::kAll);
|
|
1208
|
+
options.create_if_missing = true;
|
|
1209
|
+
options.compression = kNoCompression;
|
|
1210
|
+
options.inplace_update_support = false;
|
|
1211
|
+
options.allow_concurrent_memtable_write = true;
|
|
1212
|
+
|
|
1213
|
+
// Enforce size of a single MemTable to 128KB.
|
|
1214
|
+
options.write_buffer_size = 128 << 10;
|
|
1215
|
+
// Activate the MemPurge prototype.
|
|
1216
|
+
options.experimental_mempurge_threshold = 1.0;
|
|
1217
|
+
|
|
1218
|
+
ASSERT_OK(TryReopen(options));
|
|
1219
|
+
|
|
1220
|
+
const size_t KVSIZE = 10;
|
|
1221
|
+
|
|
1222
|
+
do {
|
|
1223
|
+
CreateAndReopenWithCF({"pikachu"}, options);
|
|
1224
|
+
ASSERT_OK(Put(1, "foo", "v1"));
|
|
1225
|
+
ASSERT_OK(Put(1, "baz", "v5"));
|
|
1226
|
+
|
|
1227
|
+
ReopenWithColumnFamilies({"default", "pikachu"}, options);
|
|
1228
|
+
ASSERT_EQ("v1", Get(1, "foo"));
|
|
1229
|
+
|
|
1230
|
+
ASSERT_EQ("v1", Get(1, "foo"));
|
|
1231
|
+
ASSERT_EQ("v5", Get(1, "baz"));
|
|
1232
|
+
ASSERT_OK(Put(0, "bar", "v2"));
|
|
1233
|
+
ASSERT_OK(Put(1, "bar", "v2"));
|
|
1234
|
+
ASSERT_OK(Put(1, "foo", "v3"));
|
|
1235
|
+
std::atomic<uint32_t> mempurge_count{0};
|
|
1236
|
+
std::atomic<uint32_t> sst_count{0};
|
|
1237
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1238
|
+
"DBImpl::FlushJob:MemPurgeSuccessful",
|
|
1239
|
+
[&](void* /*arg*/) { mempurge_count++; });
|
|
1240
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1241
|
+
"DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
|
|
1242
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
1243
|
+
|
|
1244
|
+
std::vector<std::string> keys;
|
|
1245
|
+
for (size_t k = 0; k < KVSIZE; k++) {
|
|
1246
|
+
keys.push_back("IamKey" + std::to_string(k));
|
|
1247
|
+
}
|
|
1248
|
+
|
|
1249
|
+
std::string RNDKEY, RNDVALUE;
|
|
1250
|
+
const std::string NOT_FOUND = "NOT_FOUND";
|
|
1251
|
+
|
|
1252
|
+
// Heavy overwrite workload,
|
|
1253
|
+
// more than would fit in maximum allowed memtables.
|
|
1254
|
+
Random rnd(719);
|
|
1255
|
+
const size_t NUM_REPEAT = 100;
|
|
1256
|
+
const size_t RAND_KEY_LENGTH = 4096;
|
|
1257
|
+
const size_t RAND_VALUES_LENGTH = 1024;
|
|
1258
|
+
std::vector<std::string> values_default(KVSIZE), values_pikachu(KVSIZE);
|
|
1259
|
+
|
|
1260
|
+
// Insert a very first set of keys that will be
|
|
1261
|
+
// mempurged at least once.
|
|
1262
|
+
for (size_t k = 0; k < KVSIZE / 2; k++) {
|
|
1263
|
+
values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1264
|
+
values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
// Insert keys[0:KVSIZE/2] to
|
|
1268
|
+
// both 'default' and 'pikachu' CFs.
|
|
1269
|
+
for (size_t k = 0; k < KVSIZE / 2; k++) {
|
|
1270
|
+
ASSERT_OK(Put(0, keys[k], values_default[k]));
|
|
1271
|
+
ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
// Check that the insertion was seamless.
|
|
1275
|
+
for (size_t k = 0; k < KVSIZE / 2; k++) {
|
|
1276
|
+
ASSERT_EQ(Get(0, keys[k]), values_default[k]);
|
|
1277
|
+
ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
// Insertion of of K-V pairs, multiple times (overwrites)
|
|
1281
|
+
// into 'default' CF. Will trigger mempurge.
|
|
1282
|
+
for (size_t j = 0; j < NUM_REPEAT; j++) {
|
|
1283
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
1284
|
+
for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
|
|
1285
|
+
values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
// Insert K-V into default CF.
|
|
1289
|
+
for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
|
|
1290
|
+
ASSERT_OK(Put(0, keys[k], values_default[k]));
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
// Check key validity, for all keys, both in
|
|
1294
|
+
// default and pikachu CFs.
|
|
1295
|
+
for (size_t k = 0; k < KVSIZE; k++) {
|
|
1296
|
+
ASSERT_EQ(Get(0, keys[k]), values_default[k]);
|
|
1297
|
+
}
|
|
1298
|
+
// Note that at this point, only keys[0:KVSIZE/2]
|
|
1299
|
+
// have been inserted into Pikachu.
|
|
1300
|
+
for (size_t k = 0; k < KVSIZE / 2; k++) {
|
|
1301
|
+
ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// Insertion of of K-V pairs, multiple times (overwrites)
|
|
1306
|
+
// into 'pikachu' CF. Will trigger mempurge.
|
|
1307
|
+
// Check that we keep the older logs for 'default' imm().
|
|
1308
|
+
for (size_t j = 0; j < NUM_REPEAT; j++) {
|
|
1309
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
1310
|
+
for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
|
|
1311
|
+
values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
// Insert K-V into pikachu CF.
|
|
1315
|
+
for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
|
|
1316
|
+
ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
// Check key validity, for all keys,
|
|
1320
|
+
// both in default and pikachu.
|
|
1321
|
+
for (size_t k = 0; k < KVSIZE; k++) {
|
|
1322
|
+
ASSERT_EQ(Get(0, keys[k]), values_default[k]);
|
|
1323
|
+
ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
// Check that there was at least one mempurge
|
|
1328
|
+
const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
|
|
1329
|
+
// Check that there was no SST files created during flush.
|
|
1330
|
+
const uint32_t EXPECTED_SST_COUNT = 0;
|
|
1331
|
+
|
|
1332
|
+
EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
|
|
1333
|
+
if (options.experimental_mempurge_threshold ==
|
|
1334
|
+
std::numeric_limits<double>::max()) {
|
|
1335
|
+
EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
ReopenWithColumnFamilies({"default", "pikachu"}, options);
|
|
1339
|
+
// Check that there was no data corruption anywhere,
|
|
1340
|
+
// not in 'default' nor in 'Pikachu' CFs.
|
|
1341
|
+
ASSERT_EQ("v3", Get(1, "foo"));
|
|
1342
|
+
ASSERT_OK(Put(1, "foo", "v4"));
|
|
1343
|
+
ASSERT_EQ("v4", Get(1, "foo"));
|
|
1344
|
+
ASSERT_EQ("v2", Get(1, "bar"));
|
|
1345
|
+
ASSERT_EQ("v5", Get(1, "baz"));
|
|
1346
|
+
// Check keys in 'Default' and 'Pikachu'.
|
|
1347
|
+
// keys[0:KVSIZE/2] were for sure contained
|
|
1348
|
+
// in the imm() at Reopen/recovery time.
|
|
1349
|
+
for (size_t k = 0; k < KVSIZE; k++) {
|
|
1350
|
+
ASSERT_EQ(Get(0, keys[k]), values_default[k]);
|
|
1351
|
+
ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
|
|
1352
|
+
}
|
|
1353
|
+
// Insertion of random K-V pairs to trigger
|
|
1354
|
+
// a flush in the Pikachu CF.
|
|
1355
|
+
for (size_t j = 0; j < NUM_REPEAT; j++) {
|
|
1356
|
+
RNDKEY = rnd.RandomString(RAND_KEY_LENGTH);
|
|
1357
|
+
RNDVALUE = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1358
|
+
ASSERT_OK(Put(1, RNDKEY, RNDVALUE));
|
|
1359
|
+
}
|
|
1360
|
+
// ASsert than there was at least one flush to storage.
|
|
1361
|
+
EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
|
|
1362
|
+
ReopenWithColumnFamilies({"default", "pikachu"}, options);
|
|
1363
|
+
ASSERT_EQ("v4", Get(1, "foo"));
|
|
1364
|
+
ASSERT_EQ("v2", Get(1, "bar"));
|
|
1365
|
+
ASSERT_EQ("v5", Get(1, "baz"));
|
|
1366
|
+
// Since values in default are held in mutable mem()
|
|
1367
|
+
// and imm(), check if the flush in pikachu didn't
|
|
1368
|
+
// affect these values.
|
|
1369
|
+
for (size_t k = 0; k < KVSIZE; k++) {
|
|
1370
|
+
ASSERT_EQ(Get(0, keys[k]), values_default[k]);
|
|
1371
|
+
ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
|
|
1372
|
+
}
|
|
1373
|
+
ASSERT_EQ(Get(1, RNDKEY), RNDVALUE);
|
|
1374
|
+
} while (ChangeWalOptions());
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
TEST_F(DBFlushTest, MemPurgeCorrectLogNumberAndSSTFileCreation) {
|
|
1378
|
+
// Before our bug fix, we noticed that when 2 memtables were
|
|
1379
|
+
// being flushed (with one memtable being the output of a
|
|
1380
|
+
// previous MemPurge and one memtable being a newly-sealed memtable),
|
|
1381
|
+
// the SST file created was not properly added to the DB version
|
|
1382
|
+
// (via the VersionEdit obj), leading to data loss (the SST file
|
|
1383
|
+
// was later being purged as an obsolete file).
|
|
1384
|
+
// Therefore, we reproduce this scenario to test our fix.
|
|
1385
|
+
Options options = CurrentOptions();
|
|
1386
|
+
|
|
1387
|
+
options.create_if_missing = true;
|
|
1388
|
+
options.compression = kNoCompression;
|
|
1389
|
+
options.inplace_update_support = false;
|
|
1390
|
+
options.allow_concurrent_memtable_write = true;
|
|
1391
|
+
|
|
1392
|
+
// Enforce size of a single MemTable to 1MB (64MB = 1048576 bytes).
|
|
1393
|
+
options.write_buffer_size = 1 << 20;
|
|
1394
|
+
// Activate the MemPurge prototype.
|
|
1395
|
+
options.experimental_mempurge_threshold = 1.0;
|
|
1396
|
+
|
|
1397
|
+
// Force to have more than one memtable to trigger a flush.
|
|
1398
|
+
// For some reason this option does not seem to be enforced,
|
|
1399
|
+
// so the following test is designed to make sure that we
|
|
1400
|
+
// are testing the correct test case.
|
|
1401
|
+
options.min_write_buffer_number_to_merge = 3;
|
|
1402
|
+
options.max_write_buffer_number = 5;
|
|
1403
|
+
options.max_write_buffer_size_to_maintain = 2 * (options.write_buffer_size);
|
|
1404
|
+
options.disable_auto_compactions = true;
|
|
1405
|
+
ASSERT_OK(TryReopen(options));
|
|
1406
|
+
|
|
1407
|
+
std::atomic<uint32_t> mempurge_count{0};
|
|
1408
|
+
std::atomic<uint32_t> sst_count{0};
|
|
1409
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1410
|
+
"DBImpl::FlushJob:MemPurgeSuccessful",
|
|
1411
|
+
[&](void* /*arg*/) { mempurge_count++; });
|
|
1412
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1413
|
+
"DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
|
|
1414
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
|
1415
|
+
|
|
1416
|
+
// Dummy variable used for the following callback function.
|
|
1417
|
+
uint64_t ZERO = 0;
|
|
1418
|
+
// We will first execute mempurge operations exclusively.
|
|
1419
|
+
// Therefore, when the first flush is triggered, we want to make
|
|
1420
|
+
// sure there is at least 2 memtables being flushed: one output
|
|
1421
|
+
// from a previous mempurge, and one newly sealed memtable.
|
|
1422
|
+
// This is when we observed in the past that some SST files created
|
|
1423
|
+
// were not properly added to the DB version (via the VersionEdit obj).
|
|
1424
|
+
std::atomic<uint64_t> num_memtable_at_first_flush(0);
|
|
1425
|
+
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
|
|
1426
|
+
"FlushJob::WriteLevel0Table:num_memtables", [&](void* arg) {
|
|
1427
|
+
uint64_t* mems_size = reinterpret_cast<uint64_t*>(arg);
|
|
1428
|
+
// atomic_compare_exchange_strong sometimes updates the value
|
|
1429
|
+
// of ZERO (the "expected" object), so we make sure ZERO is indeed...
|
|
1430
|
+
// zero.
|
|
1431
|
+
ZERO = 0;
|
|
1432
|
+
std::atomic_compare_exchange_strong(&num_memtable_at_first_flush, &ZERO,
|
|
1433
|
+
*mems_size);
|
|
1434
|
+
});
|
|
1435
|
+
|
|
1436
|
+
const std::vector<std::string> KEYS = {
|
|
1437
|
+
"ThisIsKey1", "ThisIsKey2", "ThisIsKey3", "ThisIsKey4", "ThisIsKey5",
|
|
1438
|
+
"ThisIsKey6", "ThisIsKey7", "ThisIsKey8", "ThisIsKey9"};
|
|
1439
|
+
const std::string NOT_FOUND = "NOT_FOUND";
|
|
1440
|
+
|
|
1441
|
+
Random rnd(117);
|
|
1442
|
+
const uint64_t NUM_REPEAT_OVERWRITES = 100;
|
|
1443
|
+
const uint64_t NUM_RAND_INSERTS = 500;
|
|
1444
|
+
const uint64_t RAND_VALUES_LENGTH = 10240;
|
|
1445
|
+
|
|
1446
|
+
std::string key, value;
|
|
1447
|
+
std::vector<std::string> values(9, "");
|
|
1448
|
+
|
|
1449
|
+
// Keys used to check that no SST file disappeared.
|
|
1450
|
+
for (uint64_t k = 0; k < 5; k++) {
|
|
1451
|
+
values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1452
|
+
ASSERT_OK(Put(KEYS[k], values[k]));
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
// Insertion of of K-V pairs, multiple times.
|
|
1456
|
+
// Trigger at least one mempurge and no SST file creation.
|
|
1457
|
+
for (size_t i = 0; i < NUM_REPEAT_OVERWRITES; i++) {
|
|
1458
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
1459
|
+
for (uint64_t k = 5; k < values.size(); k++) {
|
|
1460
|
+
values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1461
|
+
ASSERT_OK(Put(KEYS[k], values[k]));
|
|
1462
|
+
}
|
|
1463
|
+
// Check database consistency.
|
|
1464
|
+
for (uint64_t k = 0; k < values.size(); k++) {
|
|
1465
|
+
ASSERT_EQ(Get(KEYS[k]), values[k]);
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1469
|
+
// Check that there was at least one mempurge
|
|
1470
|
+
uint32_t expected_min_mempurge_count = 1;
|
|
1471
|
+
// Check that there was no SST files created during flush.
|
|
1472
|
+
uint32_t expected_sst_count = 0;
|
|
1473
|
+
EXPECT_GE(mempurge_count.load(), expected_min_mempurge_count);
|
|
1474
|
+
EXPECT_EQ(sst_count.load(), expected_sst_count);
|
|
1475
|
+
|
|
1476
|
+
// Trigger an SST file creation and no mempurge.
|
|
1477
|
+
for (size_t i = 0; i < NUM_RAND_INSERTS; i++) {
|
|
1478
|
+
key = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1479
|
+
// Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
|
|
1480
|
+
value = rnd.RandomString(RAND_VALUES_LENGTH);
|
|
1481
|
+
ASSERT_OK(Put(key, value));
|
|
1482
|
+
// Check database consistency.
|
|
1483
|
+
for (uint64_t k = 0; k < values.size(); k++) {
|
|
1484
|
+
ASSERT_EQ(Get(KEYS[k]), values[k]);
|
|
1485
|
+
}
|
|
1486
|
+
ASSERT_EQ(Get(key), value);
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1489
|
+
// Check that there was at least one SST files created during flush.
|
|
1490
|
+
expected_sst_count = 1;
|
|
1491
|
+
EXPECT_GE(sst_count.load(), expected_sst_count);
|
|
1492
|
+
|
|
1493
|
+
// Oddly enough, num_memtable_at_first_flush is not enforced to be
|
|
1494
|
+
// equal to min_write_buffer_number_to_merge. So by asserting that
|
|
1495
|
+
// the first SST file creation comes from one output memtable
|
|
1496
|
+
// from a previous mempurge, and one newly sealed memtable. This
|
|
1497
|
+
// is the scenario where we observed that some SST files created
|
|
1498
|
+
// were not properly added to the DB version before our bug fix.
|
|
1499
|
+
ASSERT_GE(num_memtable_at_first_flush.load(), 2);
|
|
1500
|
+
|
|
1501
|
+
// Check that no data was lost after SST file creation.
|
|
1502
|
+
for (uint64_t k = 0; k < values.size(); k++) {
|
|
1503
|
+
ASSERT_EQ(Get(KEYS[k]), values[k]);
|
|
1504
|
+
}
|
|
1505
|
+
// Extra check of database consistency.
|
|
1506
|
+
ASSERT_EQ(Get(key), value);
|
|
1507
|
+
|
|
1508
|
+
Close();
|
|
1509
|
+
}
|
|
1510
|
+
|
|
242
1511
|
TEST_P(DBFlushDirectIOTest, DirectIO) {
|
|
243
1512
|
Options options;
|
|
244
1513
|
options.create_if_missing = true;
|
|
245
1514
|
options.disable_auto_compactions = true;
|
|
246
1515
|
options.max_background_flushes = 2;
|
|
247
1516
|
options.use_direct_io_for_flush_and_compaction = GetParam();
|
|
248
|
-
options.env =
|
|
1517
|
+
options.env = MockEnv::Create(Env::Default());
|
|
249
1518
|
SyncPoint::GetInstance()->SetCallBack(
|
|
250
1519
|
"BuildTable:create_file", [&](void* arg) {
|
|
251
1520
|
bool* use_direct_writes = static_cast<bool*>(arg);
|
|
@@ -398,7 +1667,7 @@ TEST_F(DBFlushTest, FireOnFlushCompletedAfterCommittedResult) {
|
|
|
398
1667
|
std::shared_ptr<TestListener> listener = std::make_shared<TestListener>();
|
|
399
1668
|
|
|
400
1669
|
SyncPoint::GetInstance()->LoadDependency(
|
|
401
|
-
{{"DBImpl::
|
|
1670
|
+
{{"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables",
|
|
402
1671
|
"DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitFirst"},
|
|
403
1672
|
{"DBImpl::FlushMemTableToOutputFile:Finish",
|
|
404
1673
|
"DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitSecond"}});
|
|
@@ -440,6 +1709,9 @@ TEST_F(DBFlushTest, FireOnFlushCompletedAfterCommittedResult) {
|
|
|
440
1709
|
flush_opts.wait = false;
|
|
441
1710
|
ASSERT_OK(db_->Flush(flush_opts));
|
|
442
1711
|
t1.join();
|
|
1712
|
+
// Ensure background work is fully finished including listener callbacks
|
|
1713
|
+
// before accessing listener state.
|
|
1714
|
+
ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
|
|
443
1715
|
ASSERT_TRUE(listener->completed1);
|
|
444
1716
|
ASSERT_TRUE(listener->completed2);
|
|
445
1717
|
SyncPoint::GetInstance()->DisableProcessing();
|
|
@@ -451,7 +1723,6 @@ TEST_F(DBFlushTest, FlushWithBlob) {
|
|
|
451
1723
|
constexpr uint64_t min_blob_size = 10;
|
|
452
1724
|
|
|
453
1725
|
Options options;
|
|
454
|
-
options.env = CurrentOptions().env;
|
|
455
1726
|
options.enable_blob_files = true;
|
|
456
1727
|
options.min_blob_size = min_blob_size;
|
|
457
1728
|
options.disable_auto_compactions = true;
|
|
@@ -475,7 +1746,7 @@ TEST_F(DBFlushTest, FlushWithBlob) {
|
|
|
475
1746
|
ASSERT_EQ(Get("key1"), short_value);
|
|
476
1747
|
ASSERT_EQ(Get("key2"), long_value);
|
|
477
1748
|
|
|
478
|
-
VersionSet* const versions = dbfull()->
|
|
1749
|
+
VersionSet* const versions = dbfull()->GetVersionSet();
|
|
479
1750
|
assert(versions);
|
|
480
1751
|
|
|
481
1752
|
ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
|
|
@@ -496,7 +1767,7 @@ TEST_F(DBFlushTest, FlushWithBlob) {
|
|
|
496
1767
|
const auto& blob_files = storage_info->GetBlobFiles();
|
|
497
1768
|
ASSERT_EQ(blob_files.size(), 1);
|
|
498
1769
|
|
|
499
|
-
const auto& blob_file = blob_files.
|
|
1770
|
+
const auto& blob_file = blob_files.front();
|
|
500
1771
|
assert(blob_file);
|
|
501
1772
|
|
|
502
1773
|
ASSERT_EQ(table_file->smallest.user_key(), "key1");
|
|
@@ -512,27 +1783,268 @@ TEST_F(DBFlushTest, FlushWithBlob) {
|
|
|
512
1783
|
const InternalStats* const internal_stats = cfd->internal_stats();
|
|
513
1784
|
assert(internal_stats);
|
|
514
1785
|
|
|
515
|
-
const uint64_t expected_bytes =
|
|
516
|
-
table_file->fd.GetFileSize() + blob_file->GetTotalBlobBytes();
|
|
517
|
-
|
|
518
1786
|
const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
|
|
519
1787
|
ASSERT_FALSE(compaction_stats.empty());
|
|
520
|
-
ASSERT_EQ(compaction_stats[0].bytes_written,
|
|
521
|
-
ASSERT_EQ(compaction_stats[0].
|
|
1788
|
+
ASSERT_EQ(compaction_stats[0].bytes_written, table_file->fd.GetFileSize());
|
|
1789
|
+
ASSERT_EQ(compaction_stats[0].bytes_written_blob,
|
|
1790
|
+
blob_file->GetTotalBlobBytes());
|
|
1791
|
+
ASSERT_EQ(compaction_stats[0].num_output_files, 1);
|
|
1792
|
+
ASSERT_EQ(compaction_stats[0].num_output_files_blob, 1);
|
|
522
1793
|
|
|
523
1794
|
const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
|
|
524
|
-
ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
|
|
1795
|
+
ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
|
|
1796
|
+
compaction_stats[0].bytes_written +
|
|
1797
|
+
compaction_stats[0].bytes_written_blob);
|
|
525
1798
|
#endif // ROCKSDB_LITE
|
|
526
1799
|
}
|
|
527
1800
|
|
|
1801
|
+
TEST_F(DBFlushTest, FlushWithChecksumHandoff1) {
|
|
1802
|
+
if (mem_env_ || encrypted_env_) {
|
|
1803
|
+
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
1804
|
+
return;
|
|
1805
|
+
}
|
|
1806
|
+
std::shared_ptr<FaultInjectionTestFS> fault_fs(
|
|
1807
|
+
new FaultInjectionTestFS(FileSystem::Default()));
|
|
1808
|
+
std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
|
|
1809
|
+
Options options = CurrentOptions();
|
|
1810
|
+
options.write_buffer_size = 100;
|
|
1811
|
+
options.max_write_buffer_number = 4;
|
|
1812
|
+
options.min_write_buffer_number_to_merge = 3;
|
|
1813
|
+
options.disable_auto_compactions = true;
|
|
1814
|
+
options.env = fault_fs_env.get();
|
|
1815
|
+
options.checksum_handoff_file_types.Add(FileType::kTableFile);
|
|
1816
|
+
Reopen(options);
|
|
1817
|
+
|
|
1818
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1819
|
+
ASSERT_OK(Put("key1", "value1"));
|
|
1820
|
+
ASSERT_OK(Put("key2", "value2"));
|
|
1821
|
+
ASSERT_OK(dbfull()->TEST_SwitchMemtable());
|
|
1822
|
+
|
|
1823
|
+
// The hash does not match, write fails
|
|
1824
|
+
// fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
|
|
1825
|
+
// Since the file system returns IOStatus::Corruption, it is an
|
|
1826
|
+
// unrecoverable error.
|
|
1827
|
+
SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
|
|
1828
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
|
|
1829
|
+
});
|
|
1830
|
+
ASSERT_OK(Put("key3", "value3"));
|
|
1831
|
+
ASSERT_OK(Put("key4", "value4"));
|
|
1832
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1833
|
+
Status s = Flush();
|
|
1834
|
+
ASSERT_EQ(s.severity(),
|
|
1835
|
+
ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
|
|
1836
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1837
|
+
Destroy(options);
|
|
1838
|
+
Reopen(options);
|
|
1839
|
+
|
|
1840
|
+
// The file system does not support checksum handoff. The check
|
|
1841
|
+
// will be ignored.
|
|
1842
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
|
|
1843
|
+
ASSERT_OK(Put("key5", "value5"));
|
|
1844
|
+
ASSERT_OK(Put("key6", "value6"));
|
|
1845
|
+
ASSERT_OK(dbfull()->TEST_SwitchMemtable());
|
|
1846
|
+
|
|
1847
|
+
// Each write will be similated as corrupted.
|
|
1848
|
+
// Since the file system returns IOStatus::Corruption, it is an
|
|
1849
|
+
// unrecoverable error.
|
|
1850
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1851
|
+
SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
|
|
1852
|
+
fault_fs->IngestDataCorruptionBeforeWrite();
|
|
1853
|
+
});
|
|
1854
|
+
ASSERT_OK(Put("key7", "value7"));
|
|
1855
|
+
ASSERT_OK(Put("key8", "value8"));
|
|
1856
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1857
|
+
s = Flush();
|
|
1858
|
+
ASSERT_EQ(s.severity(),
|
|
1859
|
+
ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
|
|
1860
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1861
|
+
|
|
1862
|
+
Destroy(options);
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
TEST_F(DBFlushTest, FlushWithChecksumHandoff2) {
|
|
1866
|
+
if (mem_env_ || encrypted_env_) {
|
|
1867
|
+
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
1868
|
+
return;
|
|
1869
|
+
}
|
|
1870
|
+
std::shared_ptr<FaultInjectionTestFS> fault_fs(
|
|
1871
|
+
new FaultInjectionTestFS(FileSystem::Default()));
|
|
1872
|
+
std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
|
|
1873
|
+
Options options = CurrentOptions();
|
|
1874
|
+
options.write_buffer_size = 100;
|
|
1875
|
+
options.max_write_buffer_number = 4;
|
|
1876
|
+
options.min_write_buffer_number_to_merge = 3;
|
|
1877
|
+
options.disable_auto_compactions = true;
|
|
1878
|
+
options.env = fault_fs_env.get();
|
|
1879
|
+
Reopen(options);
|
|
1880
|
+
|
|
1881
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1882
|
+
ASSERT_OK(Put("key1", "value1"));
|
|
1883
|
+
ASSERT_OK(Put("key2", "value2"));
|
|
1884
|
+
ASSERT_OK(Flush());
|
|
1885
|
+
|
|
1886
|
+
// options is not set, the checksum handoff will not be triggered
|
|
1887
|
+
SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
|
|
1888
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
|
|
1889
|
+
});
|
|
1890
|
+
ASSERT_OK(Put("key3", "value3"));
|
|
1891
|
+
ASSERT_OK(Put("key4", "value4"));
|
|
1892
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1893
|
+
ASSERT_OK(Flush());
|
|
1894
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1895
|
+
Destroy(options);
|
|
1896
|
+
Reopen(options);
|
|
1897
|
+
|
|
1898
|
+
// The file system does not support checksum handoff. The check
|
|
1899
|
+
// will be ignored.
|
|
1900
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
|
|
1901
|
+
ASSERT_OK(Put("key5", "value5"));
|
|
1902
|
+
ASSERT_OK(Put("key6", "value6"));
|
|
1903
|
+
ASSERT_OK(Flush());
|
|
1904
|
+
|
|
1905
|
+
// options is not set, the checksum handoff will not be triggered
|
|
1906
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1907
|
+
SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
|
|
1908
|
+
fault_fs->IngestDataCorruptionBeforeWrite();
|
|
1909
|
+
});
|
|
1910
|
+
ASSERT_OK(Put("key7", "value7"));
|
|
1911
|
+
ASSERT_OK(Put("key8", "value8"));
|
|
1912
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1913
|
+
ASSERT_OK(Flush());
|
|
1914
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1915
|
+
|
|
1916
|
+
Destroy(options);
|
|
1917
|
+
}
|
|
1918
|
+
|
|
1919
|
+
TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest1) {
|
|
1920
|
+
if (mem_env_ || encrypted_env_) {
|
|
1921
|
+
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
1922
|
+
return;
|
|
1923
|
+
}
|
|
1924
|
+
std::shared_ptr<FaultInjectionTestFS> fault_fs(
|
|
1925
|
+
new FaultInjectionTestFS(FileSystem::Default()));
|
|
1926
|
+
std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
|
|
1927
|
+
Options options = CurrentOptions();
|
|
1928
|
+
options.write_buffer_size = 100;
|
|
1929
|
+
options.max_write_buffer_number = 4;
|
|
1930
|
+
options.min_write_buffer_number_to_merge = 3;
|
|
1931
|
+
options.disable_auto_compactions = true;
|
|
1932
|
+
options.env = fault_fs_env.get();
|
|
1933
|
+
options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
|
|
1934
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1935
|
+
Reopen(options);
|
|
1936
|
+
|
|
1937
|
+
ASSERT_OK(Put("key1", "value1"));
|
|
1938
|
+
ASSERT_OK(Put("key2", "value2"));
|
|
1939
|
+
ASSERT_OK(Flush());
|
|
1940
|
+
|
|
1941
|
+
// The hash does not match, write fails
|
|
1942
|
+
// fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
|
|
1943
|
+
// Since the file system returns IOStatus::Corruption, it is mapped to
|
|
1944
|
+
// kFatalError error.
|
|
1945
|
+
ASSERT_OK(Put("key3", "value3"));
|
|
1946
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1947
|
+
"VersionSet::LogAndApply:WriteManifest", [&](void*) {
|
|
1948
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
|
|
1949
|
+
});
|
|
1950
|
+
ASSERT_OK(Put("key3", "value3"));
|
|
1951
|
+
ASSERT_OK(Put("key4", "value4"));
|
|
1952
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1953
|
+
Status s = Flush();
|
|
1954
|
+
ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
|
|
1955
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1956
|
+
Destroy(options);
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest2) {
|
|
1960
|
+
if (mem_env_ || encrypted_env_) {
|
|
1961
|
+
ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
|
|
1962
|
+
return;
|
|
1963
|
+
}
|
|
1964
|
+
std::shared_ptr<FaultInjectionTestFS> fault_fs(
|
|
1965
|
+
new FaultInjectionTestFS(FileSystem::Default()));
|
|
1966
|
+
std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
|
|
1967
|
+
Options options = CurrentOptions();
|
|
1968
|
+
options.write_buffer_size = 100;
|
|
1969
|
+
options.max_write_buffer_number = 4;
|
|
1970
|
+
options.min_write_buffer_number_to_merge = 3;
|
|
1971
|
+
options.disable_auto_compactions = true;
|
|
1972
|
+
options.env = fault_fs_env.get();
|
|
1973
|
+
options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
|
|
1974
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
|
|
1975
|
+
Reopen(options);
|
|
1976
|
+
// The file system does not support checksum handoff. The check
|
|
1977
|
+
// will be ignored.
|
|
1978
|
+
ASSERT_OK(Put("key5", "value5"));
|
|
1979
|
+
ASSERT_OK(Put("key6", "value6"));
|
|
1980
|
+
ASSERT_OK(Flush());
|
|
1981
|
+
|
|
1982
|
+
// Each write will be similated as corrupted.
|
|
1983
|
+
// Since the file system returns IOStatus::Corruption, it is mapped to
|
|
1984
|
+
// kFatalError error.
|
|
1985
|
+
fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
|
|
1986
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
1987
|
+
"VersionSet::LogAndApply:WriteManifest",
|
|
1988
|
+
[&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
|
|
1989
|
+
ASSERT_OK(Put("key7", "value7"));
|
|
1990
|
+
ASSERT_OK(Put("key8", "value8"));
|
|
1991
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
1992
|
+
Status s = Flush();
|
|
1993
|
+
ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
|
|
1994
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
1995
|
+
|
|
1996
|
+
Destroy(options);
|
|
1997
|
+
}
|
|
1998
|
+
|
|
1999
|
+
TEST_F(DBFlushTest, PickRightMemtables) {
|
|
2000
|
+
Options options = CurrentOptions();
|
|
2001
|
+
DestroyAndReopen(options);
|
|
2002
|
+
options.create_if_missing = true;
|
|
2003
|
+
|
|
2004
|
+
const std::string test_cf_name = "test_cf";
|
|
2005
|
+
options.max_write_buffer_number = 128;
|
|
2006
|
+
CreateColumnFamilies({test_cf_name}, options);
|
|
2007
|
+
|
|
2008
|
+
Close();
|
|
2009
|
+
|
|
2010
|
+
ReopenWithColumnFamilies({kDefaultColumnFamilyName, test_cf_name}, options);
|
|
2011
|
+
|
|
2012
|
+
ASSERT_OK(db_->Put(WriteOptions(), "key", "value"));
|
|
2013
|
+
|
|
2014
|
+
ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "key", "value"));
|
|
2015
|
+
|
|
2016
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
2017
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
2018
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2019
|
+
"DBImpl::SyncClosedLogs:BeforeReLock", [&](void* /*arg*/) {
|
|
2020
|
+
ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "what", "v"));
|
|
2021
|
+
auto* cfhi =
|
|
2022
|
+
static_cast_with_check<ColumnFamilyHandleImpl>(handles_[1]);
|
|
2023
|
+
assert(cfhi);
|
|
2024
|
+
ASSERT_OK(dbfull()->TEST_SwitchMemtable(cfhi->cfd()));
|
|
2025
|
+
});
|
|
2026
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2027
|
+
"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables", [&](void* arg) {
|
|
2028
|
+
auto* job = reinterpret_cast<FlushJob*>(arg);
|
|
2029
|
+
assert(job);
|
|
2030
|
+
const auto& mems = job->GetMemTables();
|
|
2031
|
+
assert(mems.size() == 1);
|
|
2032
|
+
assert(mems[0]);
|
|
2033
|
+
ASSERT_EQ(1, mems[0]->GetID());
|
|
2034
|
+
});
|
|
2035
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
2036
|
+
|
|
2037
|
+
ASSERT_OK(db_->Flush(FlushOptions(), handles_[1]));
|
|
2038
|
+
|
|
2039
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
2040
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
2041
|
+
}
|
|
2042
|
+
|
|
528
2043
|
class DBFlushTestBlobError : public DBFlushTest,
|
|
529
2044
|
public testing::WithParamInterface<std::string> {
|
|
530
2045
|
public:
|
|
531
|
-
DBFlushTestBlobError()
|
|
532
|
-
: fault_injection_env_(env_), sync_point_(GetParam()) {}
|
|
533
|
-
~DBFlushTestBlobError() { Close(); }
|
|
2046
|
+
DBFlushTestBlobError() : sync_point_(GetParam()) {}
|
|
534
2047
|
|
|
535
|
-
FaultInjectionTestEnv fault_injection_env_;
|
|
536
2048
|
std::string sync_point_;
|
|
537
2049
|
};
|
|
538
2050
|
|
|
@@ -545,20 +2057,18 @@ TEST_P(DBFlushTestBlobError, FlushError) {
|
|
|
545
2057
|
Options options;
|
|
546
2058
|
options.enable_blob_files = true;
|
|
547
2059
|
options.disable_auto_compactions = true;
|
|
548
|
-
options.env =
|
|
2060
|
+
options.env = env_;
|
|
549
2061
|
|
|
550
2062
|
Reopen(options);
|
|
551
2063
|
|
|
552
2064
|
ASSERT_OK(Put("key", "blob"));
|
|
553
2065
|
|
|
554
|
-
SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void*
|
|
555
|
-
|
|
556
|
-
|
|
2066
|
+
SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* arg) {
|
|
2067
|
+
Status* const s = static_cast<Status*>(arg);
|
|
2068
|
+
assert(s);
|
|
2069
|
+
|
|
2070
|
+
(*s) = Status::IOError(sync_point_);
|
|
557
2071
|
});
|
|
558
|
-
SyncPoint::GetInstance()->SetCallBack(
|
|
559
|
-
"BuildTable:BeforeDeleteFile", [this](void* /* arg */) {
|
|
560
|
-
fault_injection_env_.SetFilesystemActive(true);
|
|
561
|
-
});
|
|
562
2072
|
SyncPoint::GetInstance()->EnableProcessing();
|
|
563
2073
|
|
|
564
2074
|
ASSERT_NOK(Flush());
|
|
@@ -566,7 +2076,7 @@ TEST_P(DBFlushTestBlobError, FlushError) {
|
|
|
566
2076
|
SyncPoint::GetInstance()->DisableProcessing();
|
|
567
2077
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
568
2078
|
|
|
569
|
-
VersionSet* const versions = dbfull()->
|
|
2079
|
+
VersionSet* const versions = dbfull()->GetVersionSet();
|
|
570
2080
|
assert(versions);
|
|
571
2081
|
|
|
572
2082
|
ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
|
|
@@ -608,20 +2118,80 @@ TEST_P(DBFlushTestBlobError, FlushError) {
|
|
|
608
2118
|
|
|
609
2119
|
if (sync_point_ == "BlobFileBuilder::WriteBlobToFile:AddRecord") {
|
|
610
2120
|
ASSERT_EQ(compaction_stats[0].bytes_written, 0);
|
|
2121
|
+
ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
|
|
611
2122
|
ASSERT_EQ(compaction_stats[0].num_output_files, 0);
|
|
2123
|
+
ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
|
|
612
2124
|
} else {
|
|
613
2125
|
// SST file writing succeeded; blob file writing failed (during Finish)
|
|
614
2126
|
ASSERT_GT(compaction_stats[0].bytes_written, 0);
|
|
2127
|
+
ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
|
|
615
2128
|
ASSERT_EQ(compaction_stats[0].num_output_files, 1);
|
|
2129
|
+
ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
|
|
616
2130
|
}
|
|
617
2131
|
|
|
618
2132
|
const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
|
|
619
2133
|
ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
|
|
620
|
-
compaction_stats[0].bytes_written
|
|
2134
|
+
compaction_stats[0].bytes_written +
|
|
2135
|
+
compaction_stats[0].bytes_written_blob);
|
|
621
2136
|
#endif // ROCKSDB_LITE
|
|
622
2137
|
}
|
|
623
2138
|
|
|
624
2139
|
#ifndef ROCKSDB_LITE
|
|
2140
|
+
TEST_F(DBFlushTest, TombstoneVisibleInSnapshot) {
|
|
2141
|
+
class SimpleTestFlushListener : public EventListener {
|
|
2142
|
+
public:
|
|
2143
|
+
explicit SimpleTestFlushListener(DBFlushTest* _test) : test_(_test) {}
|
|
2144
|
+
~SimpleTestFlushListener() override {}
|
|
2145
|
+
|
|
2146
|
+
void OnFlushBegin(DB* db, const FlushJobInfo& info) override {
|
|
2147
|
+
ASSERT_EQ(static_cast<uint32_t>(0), info.cf_id);
|
|
2148
|
+
|
|
2149
|
+
ASSERT_OK(db->Delete(WriteOptions(), "foo"));
|
|
2150
|
+
snapshot_ = db->GetSnapshot();
|
|
2151
|
+
ASSERT_OK(db->Put(WriteOptions(), "foo", "value"));
|
|
2152
|
+
|
|
2153
|
+
auto* dbimpl = static_cast_with_check<DBImpl>(db);
|
|
2154
|
+
assert(dbimpl);
|
|
2155
|
+
|
|
2156
|
+
ColumnFamilyHandle* cfh = db->DefaultColumnFamily();
|
|
2157
|
+
auto* cfhi = static_cast_with_check<ColumnFamilyHandleImpl>(cfh);
|
|
2158
|
+
assert(cfhi);
|
|
2159
|
+
ASSERT_OK(dbimpl->TEST_SwitchMemtable(cfhi->cfd()));
|
|
2160
|
+
}
|
|
2161
|
+
|
|
2162
|
+
DBFlushTest* test_ = nullptr;
|
|
2163
|
+
const Snapshot* snapshot_ = nullptr;
|
|
2164
|
+
};
|
|
2165
|
+
|
|
2166
|
+
Options options = CurrentOptions();
|
|
2167
|
+
options.create_if_missing = true;
|
|
2168
|
+
auto* listener = new SimpleTestFlushListener(this);
|
|
2169
|
+
options.listeners.emplace_back(listener);
|
|
2170
|
+
DestroyAndReopen(options);
|
|
2171
|
+
|
|
2172
|
+
ASSERT_OK(db_->Put(WriteOptions(), "foo", "value0"));
|
|
2173
|
+
|
|
2174
|
+
ManagedSnapshot snapshot_guard(db_);
|
|
2175
|
+
|
|
2176
|
+
ColumnFamilyHandle* default_cf = db_->DefaultColumnFamily();
|
|
2177
|
+
ASSERT_OK(db_->Flush(FlushOptions(), default_cf));
|
|
2178
|
+
|
|
2179
|
+
const Snapshot* snapshot = listener->snapshot_;
|
|
2180
|
+
assert(snapshot);
|
|
2181
|
+
|
|
2182
|
+
ReadOptions read_opts;
|
|
2183
|
+
read_opts.snapshot = snapshot;
|
|
2184
|
+
|
|
2185
|
+
// Using snapshot should not see "foo".
|
|
2186
|
+
{
|
|
2187
|
+
std::string value;
|
|
2188
|
+
Status s = db_->Get(read_opts, "foo", &value);
|
|
2189
|
+
ASSERT_TRUE(s.IsNotFound());
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
db_->ReleaseSnapshot(snapshot);
|
|
2193
|
+
}
|
|
2194
|
+
|
|
625
2195
|
TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
|
|
626
2196
|
Options options = CurrentOptions();
|
|
627
2197
|
options.create_if_missing = true;
|
|
@@ -701,7 +2271,7 @@ TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
|
|
|
701
2271
|
|
|
702
2272
|
// The recovered min log number with prepared data should be non-zero.
|
|
703
2273
|
// In 2pc mode, MinLogNumberToKeep returns the
|
|
704
|
-
// VersionSet::
|
|
2274
|
+
// VersionSet::min_log_number_to_keep recovered from MANIFEST, if it's 0,
|
|
705
2275
|
// it means atomic flush didn't write the min_log_number_to_keep to MANIFEST.
|
|
706
2276
|
cfs.push_back(kDefaultColumnFamilyName);
|
|
707
2277
|
ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
|
|
@@ -772,7 +2342,7 @@ TEST_P(DBAtomicFlushTest, PrecomputeMinLogNumberToKeepNon2PC) {
|
|
|
772
2342
|
flush_edits.push_back({});
|
|
773
2343
|
auto unflushed_cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[1]);
|
|
774
2344
|
|
|
775
|
-
ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->
|
|
2345
|
+
ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
|
|
776
2346
|
flushed_cfds, flush_edits),
|
|
777
2347
|
unflushed_cfh->cfd()->GetLogNumber());
|
|
778
2348
|
}
|
|
@@ -797,7 +2367,7 @@ TEST_P(DBAtomicFlushTest, PrecomputeMinLogNumberToKeepNon2PC) {
|
|
|
797
2367
|
std::min(min_log_number_to_keep, cfh->cfd()->GetLogNumber());
|
|
798
2368
|
}
|
|
799
2369
|
ASSERT_EQ(min_log_number_to_keep, log_num_after_flush);
|
|
800
|
-
ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->
|
|
2370
|
+
ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
|
|
801
2371
|
flushed_cfds, flush_edits),
|
|
802
2372
|
min_log_number_to_keep);
|
|
803
2373
|
}
|
|
@@ -986,7 +2556,7 @@ TEST_P(DBAtomicFlushTest, TriggerFlushAndClose) {
|
|
|
986
2556
|
options.create_if_missing = true;
|
|
987
2557
|
options.atomic_flush = atomic_flush;
|
|
988
2558
|
options.memtable_factory.reset(
|
|
989
|
-
|
|
2559
|
+
test::NewSpecialSkipListFactory(kNumKeysTriggerFlush));
|
|
990
2560
|
CreateAndReopenWithCF({"pikachu"}, options);
|
|
991
2561
|
|
|
992
2562
|
for (int i = 0; i != kNumKeysTriggerFlush; ++i) {
|
|
@@ -1105,6 +2675,122 @@ TEST_P(DBAtomicFlushTest, RollbackAfterFailToInstallResults) {
|
|
|
1105
2675
|
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
1106
2676
|
}
|
|
1107
2677
|
|
|
2678
|
+
// In atomic flush, concurrent bg flush threads commit to the MANIFEST in
|
|
2679
|
+
// serial, in the order of their picked memtables for each column family.
|
|
2680
|
+
// Only when a bg flush thread finds out that its memtables are the earliest
|
|
2681
|
+
// unflushed ones for all the included column families will this bg flush
|
|
2682
|
+
// thread continue to commit to MANIFEST.
|
|
2683
|
+
// This unit test uses sync point to coordinate the execution of two bg threads
|
|
2684
|
+
// executing the same sequence of functions. The interleaving are as follows.
|
|
2685
|
+
// time bg1 bg2
|
|
2686
|
+
// | pick memtables to flush
|
|
2687
|
+
// | flush memtables cf1_m1, cf2_m1
|
|
2688
|
+
// | join MANIFEST write queue
|
|
2689
|
+
// | pick memtabls to flush
|
|
2690
|
+
// | flush memtables cf1_(m1+1)
|
|
2691
|
+
// | join MANIFEST write queue
|
|
2692
|
+
// | wait to write MANIFEST
|
|
2693
|
+
// | write MANIFEST
|
|
2694
|
+
// | IO error
|
|
2695
|
+
// | detect IO error and stop waiting
|
|
2696
|
+
// V
|
|
2697
|
+
TEST_P(DBAtomicFlushTest, BgThreadNoWaitAfterManifestError) {
|
|
2698
|
+
bool atomic_flush = GetParam();
|
|
2699
|
+
if (!atomic_flush) {
|
|
2700
|
+
return;
|
|
2701
|
+
}
|
|
2702
|
+
auto fault_injection_env = std::make_shared<FaultInjectionTestEnv>(env_);
|
|
2703
|
+
Options options = GetDefaultOptions();
|
|
2704
|
+
options.create_if_missing = true;
|
|
2705
|
+
options.atomic_flush = true;
|
|
2706
|
+
options.env = fault_injection_env.get();
|
|
2707
|
+
// Set a larger value than default so that RocksDB can schedule concurrent
|
|
2708
|
+
// background flush threads.
|
|
2709
|
+
options.max_background_jobs = 8;
|
|
2710
|
+
options.max_write_buffer_number = 8;
|
|
2711
|
+
CreateAndReopenWithCF({"pikachu"}, options);
|
|
2712
|
+
|
|
2713
|
+
assert(2 == handles_.size());
|
|
2714
|
+
|
|
2715
|
+
WriteOptions write_opts;
|
|
2716
|
+
write_opts.disableWAL = true;
|
|
2717
|
+
|
|
2718
|
+
ASSERT_OK(Put(0, "a", "v_0_a", write_opts));
|
|
2719
|
+
ASSERT_OK(Put(1, "a", "v_1_a", write_opts));
|
|
2720
|
+
|
|
2721
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
2722
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
2723
|
+
|
|
2724
|
+
SyncPoint::GetInstance()->LoadDependency({
|
|
2725
|
+
{"BgFlushThr2:WaitToCommit", "BgFlushThr1:BeforeWriteManifest"},
|
|
2726
|
+
});
|
|
2727
|
+
|
|
2728
|
+
std::thread::id bg_flush_thr1, bg_flush_thr2;
|
|
2729
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2730
|
+
"DBImpl::BackgroundCallFlush:start", [&](void*) {
|
|
2731
|
+
if (bg_flush_thr1 == std::thread::id()) {
|
|
2732
|
+
bg_flush_thr1 = std::this_thread::get_id();
|
|
2733
|
+
} else if (bg_flush_thr2 == std::thread::id()) {
|
|
2734
|
+
bg_flush_thr2 = std::this_thread::get_id();
|
|
2735
|
+
}
|
|
2736
|
+
});
|
|
2737
|
+
|
|
2738
|
+
int called = 0;
|
|
2739
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2740
|
+
"DBImpl::AtomicFlushMemTablesToOutputFiles:WaitToCommit", [&](void* arg) {
|
|
2741
|
+
if (std::this_thread::get_id() == bg_flush_thr2) {
|
|
2742
|
+
const auto* ptr = reinterpret_cast<std::pair<Status, bool>*>(arg);
|
|
2743
|
+
assert(ptr);
|
|
2744
|
+
if (0 == called) {
|
|
2745
|
+
// When bg flush thread 2 reaches here for the first time.
|
|
2746
|
+
ASSERT_OK(ptr->first);
|
|
2747
|
+
ASSERT_TRUE(ptr->second);
|
|
2748
|
+
} else if (1 == called) {
|
|
2749
|
+
// When bg flush thread 2 reaches here for the second time.
|
|
2750
|
+
ASSERT_TRUE(ptr->first.IsIOError());
|
|
2751
|
+
ASSERT_FALSE(ptr->second);
|
|
2752
|
+
}
|
|
2753
|
+
++called;
|
|
2754
|
+
TEST_SYNC_POINT("BgFlushThr2:WaitToCommit");
|
|
2755
|
+
}
|
|
2756
|
+
});
|
|
2757
|
+
|
|
2758
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2759
|
+
"VersionSet::ProcessManifestWrites:BeforeWriteLastVersionEdit:0",
|
|
2760
|
+
[&](void*) {
|
|
2761
|
+
if (std::this_thread::get_id() == bg_flush_thr1) {
|
|
2762
|
+
TEST_SYNC_POINT("BgFlushThr1:BeforeWriteManifest");
|
|
2763
|
+
}
|
|
2764
|
+
});
|
|
2765
|
+
|
|
2766
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2767
|
+
"VersionSet::LogAndApply:WriteManifest", [&](void*) {
|
|
2768
|
+
if (std::this_thread::get_id() != bg_flush_thr1) {
|
|
2769
|
+
return;
|
|
2770
|
+
}
|
|
2771
|
+
ASSERT_OK(db_->Put(write_opts, "b", "v_1_b"));
|
|
2772
|
+
|
|
2773
|
+
FlushOptions flush_opts;
|
|
2774
|
+
flush_opts.wait = false;
|
|
2775
|
+
std::vector<ColumnFamilyHandle*> cfhs(1, db_->DefaultColumnFamily());
|
|
2776
|
+
ASSERT_OK(dbfull()->Flush(flush_opts, cfhs));
|
|
2777
|
+
});
|
|
2778
|
+
|
|
2779
|
+
SyncPoint::GetInstance()->SetCallBack(
|
|
2780
|
+
"VersionSet::ProcessManifestWrites:AfterSyncManifest", [&](void* arg) {
|
|
2781
|
+
auto* ptr = reinterpret_cast<IOStatus*>(arg);
|
|
2782
|
+
assert(ptr);
|
|
2783
|
+
*ptr = IOStatus::IOError("Injected failure");
|
|
2784
|
+
});
|
|
2785
|
+
SyncPoint::GetInstance()->EnableProcessing();
|
|
2786
|
+
|
|
2787
|
+
ASSERT_TRUE(dbfull()->Flush(FlushOptions(), handles_).IsIOError());
|
|
2788
|
+
|
|
2789
|
+
Close();
|
|
2790
|
+
SyncPoint::GetInstance()->DisableProcessing();
|
|
2791
|
+
SyncPoint::GetInstance()->ClearAllCallBacks();
|
|
2792
|
+
}
|
|
2793
|
+
|
|
1108
2794
|
INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
|
|
1109
2795
|
testing::Bool());
|
|
1110
2796
|
|