@nxtedition/rocksdb 13.5.7 → 13.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (509) hide show
  1. package/binding.cc +248 -70
  2. package/binding.gyp +2 -2
  3. package/deps/rocksdb/rocksdb/BUCK +12 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  5. package/deps/rocksdb/rocksdb/Makefile +28 -23
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  16. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  26. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  27. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  28. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  29. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  31. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  59. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  60. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  61. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  63. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  64. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  65. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  66. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  67. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  68. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  69. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  70. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  71. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  87. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  88. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  89. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  90. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  91. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  92. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  93. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  95. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  96. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  97. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  98. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  99. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  100. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  101. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  102. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  104. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  105. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  106. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  107. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  108. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  109. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  110. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  111. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  112. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  113. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  114. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  115. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  116. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  117. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  118. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  119. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  120. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  124. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  125. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  126. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  127. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  129. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  130. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  131. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  132. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  133. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  134. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  135. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  136. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  137. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  138. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  139. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  140. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  141. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  142. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  143. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  144. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  145. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  146. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  147. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  148. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  149. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  150. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  153. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  154. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  155. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  156. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  157. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  158. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  160. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  161. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  163. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  164. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  165. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  166. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  168. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  169. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  170. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  171. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  172. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  173. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  174. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  175. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  176. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  177. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  178. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  180. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  181. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  182. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  191. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  193. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  194. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  195. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  196. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  198. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  199. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  200. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  201. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  202. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  204. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  205. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  206. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  207. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  210. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  212. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  213. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  214. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  215. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  218. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  220. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  221. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  224. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  226. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  228. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  229. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  230. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  232. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  234. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  235. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  238. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  241. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  242. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  243. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  245. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  249. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  253. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  254. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  256. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  257. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  258. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  260. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  269. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  270. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  276. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  277. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  278. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  279. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  281. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  283. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  284. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  285. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  286. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  288. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  289. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  290. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  291. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  292. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  293. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  294. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  295. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  296. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  297. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  298. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  299. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  300. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  301. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  302. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  303. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  304. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  305. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  306. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  307. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  308. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  309. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  310. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  311. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  312. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  314. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  315. package/deps/rocksdb/rocksdb/src.mk +17 -11
  316. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  325. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  327. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  328. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  329. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  330. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  334. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  335. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  338. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  340. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  342. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  343. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  345. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  349. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  350. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  351. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  352. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  353. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  354. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  356. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  357. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  362. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  364. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  366. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  367. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  368. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  369. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  370. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  371. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  372. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  374. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  376. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  377. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  380. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  381. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  382. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  384. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  385. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  386. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  388. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  391. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  393. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  395. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  396. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  397. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  398. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  399. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  400. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  401. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  402. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  403. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  404. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  405. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  406. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  408. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  409. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  416. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  426. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  428. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  430. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  433. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  435. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  436. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  437. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  439. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  442. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  443. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  458. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  464. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  467. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  468. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  479. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  482. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  485. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  486. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  499. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  500. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  504. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  505. package/deps/rocksdb/rocksdb.gyp +9 -4
  506. package/index.js +50 -9
  507. package/package.json +8 -1
  508. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  509. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -7,7 +7,6 @@
7
7
  // Use of this source code is governed by a BSD-style license that can be
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
-
11
10
  #include <algorithm>
12
11
  #include <atomic>
13
12
  #include <cinttypes>
@@ -191,6 +190,7 @@ class BackupEngineImpl {
191
190
 
192
191
  private:
193
192
  void DeleteChildren(const std::string& dir,
193
+ const std::unordered_set<uint64_t>& files_to_keep,
194
194
  uint32_t file_type_filter = 0) const;
195
195
  IOStatus DeleteBackupNoGC(BackupID backup_id);
196
196
 
@@ -504,6 +504,17 @@ class BackupEngineImpl {
504
504
  BackupInfo* backup_info,
505
505
  bool include_file_details) const;
506
506
 
507
+ // Infers set of existing destination files that could be retained
508
+ // during the incremental restore procedure in accordance with user
509
+ // selected strategy (RestoreMode). File can be retained only if it's
510
+ // deemed to exist in the referenced backup set.
511
+ void InferDBFilesToRetainInRestore(
512
+ const std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>&
513
+ restore_file_infos,
514
+ std::unordered_set<std::string>& unowned_backups,
515
+ const std::string& db_dir, RestoreOptions::Mode mode,
516
+ std::unordered_set<uint64_t>& files_to_keep) const;
517
+
507
518
  inline std::string GetAbsolutePath(
508
519
  const std::string& relative_path = "") const {
509
520
  assert(relative_path.size() == 0 || relative_path[0] != '/');
@@ -551,6 +562,18 @@ class BackupEngineImpl {
551
562
  }
552
563
  return file_copy;
553
564
  }
565
+
566
+ inline std::string GenerateSharedFileWithDbSessionIdAndSize(
567
+ const std::string& file, const uint64_t file_size,
568
+ const std::string& db_session_id) const {
569
+ assert(file.size() == 0 || file[0] != '/');
570
+ std::string file_copy = file;
571
+ file_copy.insert(file_copy.find_last_of('.'), "_s" + db_session_id);
572
+ file_copy.insert(file_copy.find_last_of('.'),
573
+ "_" + std::to_string(file_size));
574
+ return kSharedChecksumDirSlash + file_copy;
575
+ }
576
+
554
577
  static inline std::string GetFileFromChecksumFile(const std::string& file) {
555
578
  assert(file.size() == 0 || file[0] != '/');
556
579
  std::string file_copy = file;
@@ -558,6 +581,7 @@ class BackupEngineImpl {
558
581
  return file_copy.erase(first_underscore,
559
582
  file_copy.find_last_of('.') - first_underscore);
560
583
  }
584
+
561
585
  inline std::string GetBackupMetaFile(BackupID backup_id, bool tmp) const {
562
586
  return GetAbsolutePath(kMetaDirName) + "/" + (tmp ? "." : "") +
563
587
  std::to_string(backup_id) + (tmp ? ".tmp" : "");
@@ -582,6 +606,8 @@ class BackupEngineImpl {
582
606
  uint64_t* bytes_toward_next_callback,
583
607
  uint64_t* size, std::string* checksum_hex);
584
608
 
609
+ uint64_t CalculateIOBufferSize(RateLimiter* rate_limiter) const;
610
+
585
611
  IOStatus ReadFileAndComputeChecksum(const std::string& src,
586
612
  const std::shared_ptr<FileSystem>& src_fs,
587
613
  const EnvOptions& src_env_options,
@@ -593,10 +619,32 @@ class BackupEngineImpl {
593
619
  Status GetFileDbIdentities(Env* src_env, const EnvOptions& src_env_options,
594
620
  const std::string& file_path,
595
621
  Temperature file_temp, RateLimiter* rate_limiter,
596
- std::string* db_id, std::string* db_session_id);
622
+ std::string* db_id,
623
+ std::string* db_session_id) const;
624
+
625
+ struct WorkItemResult {
626
+ WorkItemResult()
627
+ : size(0),
628
+ expected_src_temperature(Temperature::kUnknown),
629
+ current_src_temperature(Temperature::kUnknown) {}
597
630
 
598
- struct CopyOrCreateResult {
599
- ~CopyOrCreateResult() {
631
+ WorkItemResult(const WorkItemResult& other) = delete;
632
+ WorkItemResult& operator=(const WorkItemResult& other) = delete;
633
+
634
+ WorkItemResult(WorkItemResult&& o) noexcept { *this = std::move(o); }
635
+
636
+ WorkItemResult& operator=(WorkItemResult&& o) noexcept {
637
+ size = o.size;
638
+ checksum_hex = std::move(o.checksum_hex);
639
+ db_id = std::move(o.db_id);
640
+ db_session_id = std::move(o.db_session_id);
641
+ io_status = std::move(o.io_status);
642
+ expected_src_temperature = o.expected_src_temperature;
643
+ current_src_temperature = o.current_src_temperature;
644
+ return *this;
645
+ }
646
+
647
+ ~WorkItemResult() {
600
648
  // The Status needs to be ignored here for two reasons.
601
649
  // First, if the BackupEngineImpl shuts down with jobs outstanding, then
602
650
  // it is possible that the Status in the future/promise is never read,
@@ -615,10 +663,15 @@ class BackupEngineImpl {
615
663
  Temperature current_src_temperature = Temperature::kUnknown;
616
664
  };
617
665
 
666
+ enum WorkItemType : uint64_t {
667
+ CopyOrCreate = 1U,
668
+ ComputeChecksum = 2U,
669
+ };
670
+
618
671
  // Exactly one of src_path and contents must be non-empty. If src_path is
619
672
  // non-empty, the file is copied from this pathname. Otherwise, if contents is
620
673
  // non-empty, the file will be created at dst_path with these contents.
621
- struct CopyOrCreateWorkItem {
674
+ struct WorkItem {
622
675
  std::string src_path;
623
676
  std::string dst_path;
624
677
  Temperature src_temperature;
@@ -631,17 +684,17 @@ class BackupEngineImpl {
631
684
  RateLimiter* rate_limiter;
632
685
  uint64_t size_limit;
633
686
  Statistics* stats;
634
- std::promise<CopyOrCreateResult> result;
687
+ std::promise<WorkItemResult> result;
635
688
  std::function<void()> progress_callback;
636
689
  std::string src_checksum_func_name;
637
690
  std::string src_checksum_hex;
638
691
  std::string db_id;
639
692
  std::string db_session_id;
693
+ WorkItemType type;
640
694
 
641
- CopyOrCreateWorkItem()
695
+ WorkItem()
642
696
  : src_temperature(Temperature::kUnknown),
643
697
  dst_temperature(Temperature::kUnknown),
644
-
645
698
  src_env(nullptr),
646
699
  dst_env(nullptr),
647
700
  src_env_options(),
@@ -649,16 +702,15 @@ class BackupEngineImpl {
649
702
  rate_limiter(nullptr),
650
703
  size_limit(0),
651
704
  stats(nullptr),
652
- src_checksum_func_name(kUnknownFileChecksumFuncName) {}
705
+ src_checksum_func_name(kUnknownFileChecksumFuncName),
706
+ type(WorkItemType::CopyOrCreate) {}
653
707
 
654
- CopyOrCreateWorkItem(const CopyOrCreateWorkItem&) = delete;
655
- CopyOrCreateWorkItem& operator=(const CopyOrCreateWorkItem&) = delete;
708
+ WorkItem(const WorkItem&) = delete;
709
+ WorkItem& operator=(const WorkItem&) = delete;
656
710
 
657
- CopyOrCreateWorkItem(CopyOrCreateWorkItem&& o) noexcept {
658
- *this = std::move(o);
659
- }
711
+ WorkItem(WorkItem&& o) noexcept { *this = std::move(o); }
660
712
 
661
- CopyOrCreateWorkItem& operator=(CopyOrCreateWorkItem&& o) noexcept {
713
+ WorkItem& operator=(WorkItem&& o) noexcept {
662
714
  src_path = std::move(o.src_path);
663
715
  dst_path = std::move(o.dst_path);
664
716
  src_temperature = std::move(o.src_temperature);
@@ -678,22 +730,22 @@ class BackupEngineImpl {
678
730
  db_id = std::move(o.db_id);
679
731
  db_session_id = std::move(o.db_session_id);
680
732
  src_temperature = o.src_temperature;
733
+ type = std::move(o.type);
681
734
  return *this;
682
735
  }
683
736
 
684
- CopyOrCreateWorkItem(std::string _src_path, std::string _dst_path,
685
- const Temperature _src_temperature,
686
- const Temperature _dst_temperature,
687
- std::string _contents, Env* _src_env, Env* _dst_env,
688
- EnvOptions _src_env_options, bool _sync,
689
- RateLimiter* _rate_limiter, uint64_t _size_limit,
690
- Statistics* _stats,
691
- std::function<void()> _progress_callback = {},
692
- const std::string& _src_checksum_func_name =
693
- kUnknownFileChecksumFuncName,
694
- const std::string& _src_checksum_hex = "",
695
- const std::string& _db_id = "",
696
- const std::string& _db_session_id = "")
737
+ WorkItem(std::string _src_path, std::string _dst_path,
738
+ const Temperature _src_temperature,
739
+ const Temperature _dst_temperature, std::string _contents,
740
+ Env* _src_env, Env* _dst_env, EnvOptions _src_env_options,
741
+ bool _sync, RateLimiter* _rate_limiter, uint64_t _size_limit,
742
+ Statistics* _stats, std::function<void()> _progress_callback = {},
743
+ const std::string& _src_checksum_func_name =
744
+ kUnknownFileChecksumFuncName,
745
+ const std::string& _src_checksum_hex = "",
746
+ const std::string& _db_id = "",
747
+ const std::string& _db_session_id = "",
748
+ WorkItemType _type = WorkItemType::CopyOrCreate)
697
749
  : src_path(std::move(_src_path)),
698
750
  dst_path(std::move(_dst_path)),
699
751
  src_temperature(_src_temperature),
@@ -710,11 +762,14 @@ class BackupEngineImpl {
710
762
  src_checksum_func_name(_src_checksum_func_name),
711
763
  src_checksum_hex(_src_checksum_hex),
712
764
  db_id(_db_id),
713
- db_session_id(_db_session_id) {}
765
+ db_session_id(_db_session_id),
766
+ type(_type) {}
767
+
768
+ ~WorkItem() = default;
714
769
  };
715
770
 
716
771
  struct BackupAfterCopyOrCreateWorkItem {
717
- std::future<CopyOrCreateResult> result;
772
+ std::future<WorkItemResult> result;
718
773
  bool shared;
719
774
  bool needed_to_copy;
720
775
  Env* backup_env;
@@ -741,7 +796,7 @@ class BackupEngineImpl {
741
796
  return *this;
742
797
  }
743
798
 
744
- BackupAfterCopyOrCreateWorkItem(std::future<CopyOrCreateResult>&& _result,
799
+ BackupAfterCopyOrCreateWorkItem(std::future<WorkItemResult>&& _result,
745
800
  bool _shared, bool _needed_to_copy,
746
801
  Env* _backup_env, std::string _dst_path_tmp,
747
802
  std::string _dst_path,
@@ -756,15 +811,44 @@ class BackupEngineImpl {
756
811
  };
757
812
 
758
813
  using BackupWorkItemPair =
759
- std::pair<CopyOrCreateWorkItem, BackupAfterCopyOrCreateWorkItem>;
814
+ std::pair<WorkItem, BackupAfterCopyOrCreateWorkItem>;
815
+
816
+ struct ComputeChecksumWorkItem {
817
+ std::future<WorkItemResult> result;
818
+ std::string file_path;
819
+ uint64_t file_number;
820
+
821
+ ComputeChecksumWorkItem(std::future<WorkItemResult>&& _result,
822
+ const std::string& _file_path,
823
+ uint64_t _file_number)
824
+ : result(std::move(_result)),
825
+ file_path(_file_path),
826
+ file_number(_file_number) {}
827
+
828
+ ComputeChecksumWorkItem(const ComputeChecksumWorkItem&) = delete;
829
+ ComputeChecksumWorkItem& operator=(const ComputeChecksumWorkItem&) = delete;
830
+
831
+ ComputeChecksumWorkItem(ComputeChecksumWorkItem&& o) noexcept {
832
+ *this = std::move(o);
833
+ }
834
+
835
+ ComputeChecksumWorkItem& operator=(ComputeChecksumWorkItem&& o) noexcept {
836
+ result = std::move(o.result);
837
+ file_path = std::move(o.file_path);
838
+ file_number = o.file_number;
839
+ return *this;
840
+ }
841
+
842
+ ~ComputeChecksumWorkItem() = default;
843
+ };
760
844
 
761
845
  struct RestoreAfterCopyOrCreateWorkItem {
762
- std::future<CopyOrCreateResult> result;
846
+ std::future<WorkItemResult> result;
763
847
  std::string from_file;
764
848
  std::string to_file;
765
849
  std::string checksum_hex;
766
850
  RestoreAfterCopyOrCreateWorkItem() {}
767
- RestoreAfterCopyOrCreateWorkItem(std::future<CopyOrCreateResult>&& _result,
851
+ RestoreAfterCopyOrCreateWorkItem(std::future<WorkItemResult>&& _result,
768
852
  const std::string& _from_file,
769
853
  const std::string& _to_file,
770
854
  const std::string& _checksum_hex)
@@ -787,7 +871,7 @@ class BackupEngineImpl {
787
871
 
788
872
  bool initialized_;
789
873
  std::mutex byte_report_mutex_;
790
- mutable channel<CopyOrCreateWorkItem> files_to_copy_or_create_;
874
+ mutable channel<WorkItem> work_items_;
791
875
  std::vector<port::Thread> threads_;
792
876
  std::atomic<CpuPriority> threads_cpu_priority_;
793
877
 
@@ -1041,7 +1125,7 @@ BackupEngineImpl::BackupEngineImpl(const BackupEngineOptions& options,
1041
1125
  }
1042
1126
 
1043
1127
  BackupEngineImpl::~BackupEngineImpl() {
1044
- files_to_copy_or_create_.sendEof();
1128
+ work_items_.sendEof();
1045
1129
  for (auto& t : threads_) {
1046
1130
  t.join();
1047
1131
  }
@@ -1240,8 +1324,8 @@ IOStatus BackupEngineImpl::Initialize() {
1240
1324
  ROCKS_LOG_INFO(options_.info_log, "Latest valid backup is %u",
1241
1325
  latest_valid_backup_id_);
1242
1326
 
1243
- // set up threads perform copies from files_to_copy_or_create_ in the
1244
- // background
1327
+ // set up threads to perform file creation / copy or checksum computations
1328
+ // from work_items_ in the background.
1245
1329
  threads_cpu_priority_ = CpuPriority::kNormal;
1246
1330
  threads_.reserve(options_.max_background_operations);
1247
1331
  for (int t = 0; t < options_.max_background_operations; t++) {
@@ -1252,9 +1336,9 @@ IOStatus BackupEngineImpl::Initialize() {
1252
1336
  #endif
1253
1337
  #endif
1254
1338
  CpuPriority current_priority = CpuPriority::kNormal;
1255
- CopyOrCreateWorkItem work_item;
1339
+ WorkItem work_item;
1256
1340
  uint64_t bytes_toward_next_callback = 0;
1257
- while (files_to_copy_or_create_.read(work_item)) {
1341
+ while (work_items_.read(work_item)) {
1258
1342
  CpuPriority priority = threads_cpu_priority_;
1259
1343
  if (current_priority != priority) {
1260
1344
  TEST_SYNC_POINT_CALLBACK(
@@ -1269,52 +1353,64 @@ IOStatus BackupEngineImpl::Initialize() {
1269
1353
  uint64_t prev_bytes_read = IOSTATS(bytes_read);
1270
1354
  uint64_t prev_bytes_written = IOSTATS(bytes_written);
1271
1355
 
1272
- CopyOrCreateResult result;
1273
- Temperature temp = work_item.src_temperature;
1274
- result.io_status = CopyOrCreateFile(
1275
- work_item.src_path, work_item.dst_path, work_item.contents,
1276
- work_item.size_limit, work_item.src_env, work_item.dst_env,
1277
- work_item.src_env_options, work_item.sync, work_item.rate_limiter,
1278
- work_item.progress_callback, &temp, work_item.dst_temperature,
1279
- &bytes_toward_next_callback, &result.size, &result.checksum_hex);
1280
-
1281
- RecordTick(work_item.stats, BACKUP_READ_BYTES,
1282
- IOSTATS(bytes_read) - prev_bytes_read);
1283
- RecordTick(work_item.stats, BACKUP_WRITE_BYTES,
1284
- IOSTATS(bytes_written) - prev_bytes_written);
1285
-
1286
- result.db_id = work_item.db_id;
1287
- result.db_session_id = work_item.db_session_id;
1288
- result.expected_src_temperature = work_item.src_temperature;
1289
- result.current_src_temperature = temp;
1290
- if (result.io_status.ok() && !work_item.src_checksum_hex.empty()) {
1291
- // unknown checksum function name implies no db table file checksum in
1292
- // db manifest; work_item.src_checksum_hex not empty means
1293
- // backup engine has calculated its crc32c checksum for the table
1294
- // file; therefore, we are able to compare the checksums.
1295
- if (work_item.src_checksum_func_name ==
1296
- kUnknownFileChecksumFuncName ||
1297
- work_item.src_checksum_func_name == kDbFileChecksumFuncName) {
1298
- if (work_item.src_checksum_hex != result.checksum_hex) {
1299
- std::string checksum_info(
1300
- "Expected checksum is " + work_item.src_checksum_hex +
1301
- " while computed checksum is " + result.checksum_hex);
1302
- result.io_status = IOStatus::Corruption(
1303
- "Checksum mismatch after copying to " + work_item.dst_path +
1304
- ": " + checksum_info);
1356
+ WorkItemResult result;
1357
+ if (work_item.type == WorkItemType::CopyOrCreate) {
1358
+ Temperature temp = work_item.src_temperature;
1359
+ result.io_status = CopyOrCreateFile(
1360
+ work_item.src_path, work_item.dst_path, work_item.contents,
1361
+ work_item.size_limit, work_item.src_env, work_item.dst_env,
1362
+ work_item.src_env_options, work_item.sync, work_item.rate_limiter,
1363
+ work_item.progress_callback, &temp, work_item.dst_temperature,
1364
+ &bytes_toward_next_callback, &result.size, &result.checksum_hex);
1365
+
1366
+ RecordTick(work_item.stats, BACKUP_READ_BYTES,
1367
+ IOSTATS(bytes_read) - prev_bytes_read);
1368
+ RecordTick(work_item.stats, BACKUP_WRITE_BYTES,
1369
+ IOSTATS(bytes_written) - prev_bytes_written);
1370
+
1371
+ result.db_id = work_item.db_id;
1372
+ result.db_session_id = work_item.db_session_id;
1373
+ result.expected_src_temperature = work_item.src_temperature;
1374
+ result.current_src_temperature = temp;
1375
+ if (result.io_status.ok() && !work_item.src_checksum_hex.empty()) {
1376
+ // unknown checksum function name implies no db table file checksum
1377
+ // in db manifest; work_item.src_checksum_hex not empty means backup
1378
+ // engine has calculated its crc32c checksum for the table file;
1379
+ // therefore, we are able to compare the checksums.
1380
+ if (work_item.src_checksum_func_name ==
1381
+ kUnknownFileChecksumFuncName ||
1382
+ work_item.src_checksum_func_name == kDbFileChecksumFuncName) {
1383
+ if (work_item.src_checksum_hex != result.checksum_hex) {
1384
+ std::string checksum_info(
1385
+ "Expected checksum is " + work_item.src_checksum_hex +
1386
+ " while computed checksum is " + result.checksum_hex);
1387
+ result.io_status = IOStatus::Corruption(
1388
+ "Checksum mismatch after copying to " + work_item.dst_path +
1389
+ ": " + checksum_info);
1390
+ }
1391
+ } else {
1392
+ // FIXME(peterd): dead code?
1393
+ std::string checksum_function_info(
1394
+ "Existing checksum function is " +
1395
+ work_item.src_checksum_func_name +
1396
+ " while provided checksum function is " +
1397
+ kBackupFileChecksumFuncName);
1398
+ ROCKS_LOG_INFO(
1399
+ options_.info_log,
1400
+ "Unable to verify checksum after copying to %s: %s\n",
1401
+ work_item.dst_path.c_str(), checksum_function_info.c_str());
1305
1402
  }
1306
- } else {
1307
- // FIXME(peterd): dead code?
1308
- std::string checksum_function_info(
1309
- "Existing checksum function is " +
1310
- work_item.src_checksum_func_name +
1311
- " while provided checksum function is " +
1312
- kBackupFileChecksumFuncName);
1313
- ROCKS_LOG_INFO(
1314
- options_.info_log,
1315
- "Unable to verify checksum after copying to %s: %s\n",
1316
- work_item.dst_path.c_str(), checksum_function_info.c_str());
1317
1403
  }
1404
+ } else if (work_item.type == ComputeChecksum) {
1405
+ result.io_status = ReadFileAndComputeChecksum(
1406
+ work_item.src_path, work_item.src_env->GetFileSystem(),
1407
+ work_item.src_env_options, work_item.size_limit,
1408
+ &result.checksum_hex, work_item.src_temperature);
1409
+ result.db_id = work_item.db_id;
1410
+ result.db_session_id = work_item.db_session_id;
1411
+ } else {
1412
+ result.io_status = IOStatus::InvalidArgument(
1413
+ "Unknown work item type: " + std::to_string(work_item.type));
1318
1414
  }
1319
1415
  work_item.result.set_value(std::move(result));
1320
1416
  }
@@ -1405,7 +1501,7 @@ IOStatus BackupEngineImpl::CreateNewBackupWithMetadata(
1405
1501
 
1406
1502
  std::deque<BackupWorkItemPair> excludable_items;
1407
1503
  std::deque<BackupAfterCopyOrCreateWorkItem> backup_items_to_finish;
1408
- // Add a CopyOrCreateWorkItem to the channel for each live file
1504
+ // Add a WorkItem to the channel for each live file
1409
1505
  Status disabled = db->DisableFileDeletions();
1410
1506
  DBOptions db_options = db->GetDBOptions();
1411
1507
  Statistics* stats = db_options.statistics.get();
@@ -1534,7 +1630,7 @@ IOStatus BackupEngineImpl::CreateNewBackupWithMetadata(
1534
1630
  if (maybe_exclude_files[i].exclude_decision) {
1535
1631
  new_backup.get()->AddExcludedFile(e.second.dst_relative);
1536
1632
  } else {
1537
- files_to_copy_or_create_.write(std::move(e.first));
1633
+ work_items_.write(std::move(e.first));
1538
1634
  backup_items_to_finish.push_back(std::move(e.second));
1539
1635
  }
1540
1636
  }
@@ -1883,43 +1979,12 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
1883
1979
  db_fs_->CreateDirIfMissing(wal_dir, io_options_, nullptr)
1884
1980
  .PermitUncheckedError();
1885
1981
 
1886
- if (options.keep_log_files) {
1887
- // delete files in db_dir, but keep all the log files
1888
- DeleteChildren(db_dir, 1 << kWalFile);
1889
- // move all the files from archive dir to wal_dir
1890
- std::string archive_dir = ArchivalDirectory(wal_dir);
1891
- std::vector<std::string> archive_files;
1892
- db_fs_->GetChildren(archive_dir, io_options_, &archive_files, nullptr)
1893
- .PermitUncheckedError(); // ignore errors
1894
- for (const auto& f : archive_files) {
1895
- uint64_t number;
1896
- FileType type;
1897
- bool ok = ParseFileName(f, &number, &type);
1898
- if (ok && type == kWalFile) {
1899
- ROCKS_LOG_INFO(options_.info_log,
1900
- "Moving log file from archive/ to wal_dir: %s",
1901
- f.c_str());
1902
- IOStatus io_s = db_fs_->RenameFile(
1903
- archive_dir + "/" + f, wal_dir + "/" + f, io_options_, nullptr);
1904
- if (!io_s.ok()) {
1905
- // if we can't move log file from archive_dir to wal_dir,
1906
- // we should fail, since it might mean data loss
1907
- return io_s;
1908
- }
1909
- }
1910
- }
1911
- } else {
1912
- DeleteChildren(wal_dir);
1913
- DeleteChildren(ArchivalDirectory(wal_dir));
1914
- DeleteChildren(db_dir);
1915
- }
1916
-
1917
1982
  // Files to restore, and from where (taking into account excluded files)
1918
1983
  std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>
1919
1984
  restore_file_infos;
1920
1985
  restore_file_infos.reserve(backup->GetFiles().size() +
1921
1986
  backup->GetExcludedFiles().size());
1922
-
1987
+ std::unordered_set<std::string> unowned_backups;
1923
1988
  for (const auto& ef : backup->GetExcludedFiles()) {
1924
1989
  const std::string& file = ef.relative_file;
1925
1990
 
@@ -1933,10 +1998,19 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
1933
1998
  }
1934
1999
  }
1935
2000
  if (!found) {
2001
+ // In `kKeepLatestDbSessionIdFiles` restore mode, it's not strictly
2002
+ // required for the corresponding backup file to be present for as long
2003
+ // as existing, on-disk db file metadata matches this unowned backup file
2004
+ // db_session_id and size.
2005
+ if (options.mode == RestoreOptions::Mode::kKeepLatestDbSessionIdFiles) {
2006
+ unowned_backups.insert(ef.relative_file);
2007
+ continue;
2008
+ }
2009
+
1936
2010
  return IOStatus::InvalidArgument(
1937
- "Excluded file " + file + " not found in other backups nor in " +
2011
+ "Excluded file " + file + " not found in any of %d" +
1938
2012
  std::to_string(locked_restore_from_dirs.size() - 1) +
1939
- " alternate backup directories");
2013
+ "backup directories!");
1940
2014
  }
1941
2015
  }
1942
2016
 
@@ -1945,6 +2019,49 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
1945
2019
  restore_file_infos.emplace_back(this, &*file_info_shared);
1946
2020
  }
1947
2021
 
2022
+ std::unordered_set<uint64_t> files_to_keep;
2023
+ InferDBFilesToRetainInRestore(restore_file_infos, unowned_backups, db_dir,
2024
+ options.mode, files_to_keep);
2025
+
2026
+ if (!unowned_backups.empty()) {
2027
+ return IOStatus::InvalidArgument(
2028
+ "Excluded file " + *unowned_backups.begin() + " (one amongst " +
2029
+ std::to_string(unowned_backups.size()) + ") not found in any of" +
2030
+ std::to_string(locked_restore_from_dirs.size() - 1) +
2031
+ "backup directories!");
2032
+ }
2033
+
2034
+ if (options.keep_log_files) {
2035
+ // delete non-matching files in db_dir, but keep all the log files
2036
+ DeleteChildren(db_dir, files_to_keep, 1 << kWalFile);
2037
+ // move all the files from archive dir to wal_dir
2038
+ std::string archive_dir = ArchivalDirectory(wal_dir);
2039
+ std::vector<std::string> archive_files;
2040
+ db_fs_->GetChildren(archive_dir, io_options_, &archive_files, nullptr)
2041
+ .PermitUncheckedError(); // ignore errors
2042
+ for (const auto& f : archive_files) {
2043
+ uint64_t number;
2044
+ FileType type;
2045
+ bool ok = ParseFileName(f, &number, &type);
2046
+ if (ok && type == kWalFile) {
2047
+ ROCKS_LOG_INFO(options_.info_log,
2048
+ "Moving log file from archive/ to wal_dir: %s",
2049
+ f.c_str());
2050
+ IOStatus io_s = db_fs_->RenameFile(
2051
+ archive_dir + "/" + f, wal_dir + "/" + f, io_options_, nullptr);
2052
+ if (!io_s.ok()) {
2053
+ // if we can't move log file from archive_dir to wal_dir,
2054
+ // we should fail, since it might mean data loss
2055
+ return io_s;
2056
+ }
2057
+ }
2058
+ }
2059
+ } else {
2060
+ DeleteChildren(wal_dir, files_to_keep);
2061
+ DeleteChildren(ArchivalDirectory(wal_dir), files_to_keep);
2062
+ DeleteChildren(db_dir, files_to_keep);
2063
+ }
2064
+
1948
2065
  IOStatus io_s;
1949
2066
  std::vector<RestoreAfterCopyOrCreateWorkItem> restore_items_to_finish;
1950
2067
  std::string temporary_current_file;
@@ -1970,6 +2087,15 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
1970
2087
  return IOStatus::Corruption("Backup corrupted: Fail to parse filename " +
1971
2088
  dst);
1972
2089
  }
2090
+
2091
+ // `files_to_keep` identifies existing database files with contents
2092
+ // 'identical' to their respective backup files (standard or excluded)
2093
+ // as per user-selected RestoreOptions::Mode.
2094
+ if (files_to_keep.find(number) != files_to_keep.end()) {
2095
+ // This file is already in the destination directory. Skip restore.
2096
+ continue;
2097
+ }
2098
+
1973
2099
  // 3. Construct the final path
1974
2100
  // kWalFile lives in wal_dir and all the rest live in db_dir
1975
2101
  if (type == kWalFile) {
@@ -2001,7 +2127,15 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
2001
2127
 
2002
2128
  ROCKS_LOG_INFO(options_.info_log, "Restoring %s to %s\n", file.c_str(),
2003
2129
  dst.c_str());
2004
- CopyOrCreateWorkItem copy_or_create_work_item(
2130
+
2131
+ // When file is being copied over, it means that it was either non-existent,
2132
+ // purged or its' original on-disk representation didn't meet incremental
2133
+ // restore tiering criteria. As such, we need to unconditionally recompute
2134
+ // the checksum on the newly restored files - even if checksum was already
2135
+ // computed on its' seed backup file in early assessment phase. Protection
2136
+ // is put in place to ensure that there are no bugs in the actual restore /
2137
+ // file copy logic and we're not producing garbage db files.
2138
+ WorkItem copy_or_create_work_item(
2005
2139
  absolute_file, dst, Temperature::kUnknown /* src_temp */,
2006
2140
  file_info->temp, "" /* contents */, src_env, db_env_,
2007
2141
  EnvOptions() /* src_env_options */, options_.sync,
@@ -2010,7 +2144,7 @@ IOStatus BackupEngineImpl::RestoreDBFromBackup(
2010
2144
  RestoreAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
2011
2145
  copy_or_create_work_item.result.get_future(), file, dst,
2012
2146
  file_info->checksum_hex);
2013
- files_to_copy_or_create_.write(std::move(copy_or_create_work_item));
2147
+ work_items_.write(std::move(copy_or_create_work_item));
2014
2148
  restore_items_to_finish.push_back(
2015
2149
  std::move(after_copy_or_create_work_item));
2016
2150
  }
@@ -2101,6 +2235,9 @@ IOStatus BackupEngineImpl::VerifyBackup(BackupID backup_id,
2101
2235
  }
2102
2236
 
2103
2237
  // For all files registered in backup
2238
+ std::vector<ComputeChecksumWorkItem> backup_verification_checksum_work_items;
2239
+ std::unordered_map<std::string, std::string>
2240
+ file_abs_path_to_checksum_hex_map;
2104
2241
  for (const auto& file_info : backup->GetFiles()) {
2105
2242
  const auto abs_path = GetAbsolutePath(file_info->filename);
2106
2243
  // check existence of the file
@@ -2117,25 +2254,95 @@ IOStatus BackupEngineImpl::VerifyBackup(BackupID backup_id,
2117
2254
  abs_path + ": " + size_info);
2118
2255
  }
2119
2256
  if (verify_with_checksum && !file_info->checksum_hex.empty()) {
2120
- // verify file checksum
2121
- std::string checksum_hex;
2122
- ROCKS_LOG_INFO(options_.info_log, "Verifying %s checksum...\n",
2257
+ const std::string filename = file_info->GetDbFileName();
2258
+ uint64_t number;
2259
+ FileType type;
2260
+ if (!ParseFileName(filename, &number, &type)) {
2261
+ // In case of checksum verification, file parsing and its' number
2262
+ // retrieval are not strictly required. Rather, it's just a best effort
2263
+ // to preserve all the file related metadata within the task scope.
2264
+ number = 0;
2265
+ }
2266
+
2267
+ file_abs_path_to_checksum_hex_map[abs_path] = file_info->checksum_hex;
2268
+ WorkItem backup_file_work_item(
2269
+ abs_path, "" /* dst_path */, Temperature::kUnknown,
2270
+ Temperature::kUnknown /* dst_temperature */, "" /* contents */,
2271
+ backup_env_, nullptr /* dst_env */, EnvOptions(), false /* sync */,
2272
+ options_.backup_rate_limiter.get(), 0 /* size_limit */,
2273
+ nullptr /* stats */, {} /* progress_callback */,
2274
+ kUnknownFileChecksumFuncName /* src_checksum_func_name */,
2275
+ "" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
2276
+ WorkItemType::ComputeChecksum);
2277
+ ComputeChecksumWorkItem backup_file_checksum_work_item(
2278
+ backup_file_work_item.result.get_future(), abs_path, number);
2279
+
2280
+ ROCKS_LOG_INFO(options_.info_log,
2281
+ "Scheduling checksum evaluation for %s...\n",
2123
2282
  abs_path.c_str());
2124
- IOStatus io_s = ReadFileAndComputeChecksum(
2125
- abs_path, backup_fs_, EnvOptions(), 0 /* size_limit */, &checksum_hex,
2126
- Temperature::kUnknown);
2127
- if (!io_s.ok()) {
2128
- return io_s;
2129
- } else if (file_info->checksum_hex != checksum_hex) {
2130
- std::string checksum_info(
2131
- "Expected checksum is " + file_info->checksum_hex +
2132
- " while computed checksum is " + checksum_hex);
2133
- return IOStatus::Corruption("File corrupted: Checksum mismatch for " +
2134
- abs_path + ": " + checksum_info);
2283
+ work_items_.write(std::move(backup_file_work_item));
2284
+ backup_verification_checksum_work_items.push_back(
2285
+ std::move(backup_file_checksum_work_item));
2286
+ }
2287
+ }
2288
+
2289
+ IOStatus io_s = IOStatus::OK();
2290
+ if (verify_with_checksum) {
2291
+ for (auto& item : backup_verification_checksum_work_items) {
2292
+ // Given the limitations of the existing simple thread pooling model
2293
+ // we deliberately decided to wait on each file checksum computation.
2294
+ // Please refer to the comment below for more.
2295
+ item.result.wait();
2296
+ auto result = item.result.get();
2297
+ if (result.io_status.ok()) {
2298
+ auto find_it = file_abs_path_to_checksum_hex_map.find(item.file_path);
2299
+ assert(find_it != file_abs_path_to_checksum_hex_map.end());
2300
+ if (result.checksum_hex == find_it->second) {
2301
+ ROCKS_LOG_INFO(options_.info_log,
2302
+ "Checksum successfully validated for %s\n",
2303
+ item.file_path.c_str());
2304
+ continue;
2305
+ }
2306
+ }
2307
+
2308
+ std::string err_msg;
2309
+ if (!result.io_status.ok()) {
2310
+ err_msg =
2311
+ "Failed to compute checksum for " + item.file_path +
2312
+ ", IOStatus(code: ," + std::to_string(result.io_status.code()) +
2313
+ ", subcode: " + std::to_string(result.io_status.subcode()) + ")";
2314
+ } else { // checksum mismatch
2315
+ err_msg =
2316
+ "File corruption! Checksum mismatch for " + item.file_path + ". " +
2317
+ "Expected: " + file_abs_path_to_checksum_hex_map[item.file_path] +
2318
+ ", got: " + result.checksum_hex;
2319
+ }
2320
+
2321
+ ROCKS_LOG_WARN(options_.info_log, "%s", err_msg.c_str());
2322
+ if (io_s.ok()) {
2323
+ // Memoize only the first corruption for reporting purpose.
2324
+ io_s = IOStatus::Corruption(err_msg);
2325
+ } else {
2326
+ // Ideally, we want to bail out as early as possible upon encountering
2327
+ // the very first mismatch, which would not only reduce the observed
2328
+ // user latency, but also limit (potentially remote) read IO to the
2329
+ // absolute minimum and allow the thread pool to reclaim the resources
2330
+ // earlier. Even better, if we could cancel all in-progress threads!
2331
+ //
2332
+ // Unfortunately, with our current simple thread pool implementation
2333
+ // we do not have by-tag control / handle over running threads.
2334
+ // Having the choice of 1) returning to the caller earlier and having
2335
+ // dangling threads occupied in evaluating checksums in the background
2336
+ // and 2) waiting for all threads to finish, we choose 2) for cleaner
2337
+ // and more intuitive semantics.
2338
+ //
2339
+ // TODO: Reevaluate after onboarding backup engine to a more
2340
+ // sophisticated thread pool abstraction.
2135
2341
  }
2136
2342
  }
2137
2343
  }
2138
- return IOStatus::OK();
2344
+
2345
+ return io_s;
2139
2346
  }
2140
2347
 
2141
2348
  IOStatus BackupEngineImpl::CopyOrCreateFile(
@@ -2165,7 +2372,11 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
2165
2372
 
2166
2373
  io_s = dst_env->GetFileSystem()->NewWritableFile(dst, dst_file_options,
2167
2374
  &dst_file, nullptr);
2168
- if (io_s.ok() && !src.empty()) {
2375
+ if (!io_s.ok()) {
2376
+ return io_s;
2377
+ }
2378
+
2379
+ if (!src.empty()) {
2169
2380
  auto src_file_options = FileOptions(src_env_options);
2170
2381
  src_file_options.temperature = *src_temperature;
2171
2382
  io_s = src_env->GetFileSystem()->NewSequentialFile(src, src_file_options,
@@ -2181,9 +2392,9 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
2181
2392
  return io_s;
2182
2393
  }
2183
2394
 
2184
- size_t buf_size =
2185
- rate_limiter ? static_cast<size_t>(rate_limiter->GetSingleBurstBytes())
2186
- : kDefaultCopyFileBufferSize;
2395
+ size_t buf_size = CalculateIOBufferSize(rate_limiter);
2396
+ TEST_SYNC_POINT_CALLBACK(
2397
+ "BackupEngineImpl::CopyOrCreateFile:CalculateIOBufferSize", &buf_size);
2187
2398
 
2188
2399
  // TODO: pass in Histograms if the destination file is sst or blob
2189
2400
  std::unique_ptr<WritableFileWriter> dest_writer(
@@ -2276,6 +2487,16 @@ IOStatus BackupEngineImpl::CopyOrCreateFile(
2276
2487
  return io_s;
2277
2488
  }
2278
2489
 
2490
+ uint64_t BackupEngineImpl::CalculateIOBufferSize(
2491
+ RateLimiter* rate_limiter) const {
2492
+ if (options_.io_buffer_size > 0) {
2493
+ return options_.io_buffer_size;
2494
+ }
2495
+ return rate_limiter != nullptr
2496
+ ? static_cast<size_t>(rate_limiter->GetSingleBurstBytes())
2497
+ : kDefaultCopyFileBufferSize;
2498
+ }
2499
+
2279
2500
  // fname will always start with "/"
2280
2501
  IOStatus BackupEngineImpl::AddBackupFileWorkItem(
2281
2502
  std::unordered_set<std::string>& live_dst_paths,
@@ -2487,7 +2708,7 @@ IOStatus BackupEngineImpl::AddBackupFileWorkItem(
2487
2708
 
2488
2709
  // Step 3: Add work item
2489
2710
  if (!contents.empty() || need_to_copy) {
2490
- CopyOrCreateWorkItem copy_or_create_work_item(
2711
+ WorkItem copy_or_create_work_item(
2491
2712
  src_dir.empty() ? "" : src_path, *copy_dest_path, src_temperature,
2492
2713
  Temperature::kUnknown /*dst_temp*/, contents, db_env_, backup_env_,
2493
2714
  src_env_options, options_.sync, rate_limiter, size_limit, stats,
@@ -2507,17 +2728,17 @@ IOStatus BackupEngineImpl::AddBackupFileWorkItem(
2507
2728
  // the checkpoint
2508
2729
  ROCKS_LOG_INFO(options_.info_log, "Copying %s to %s", fname.c_str(),
2509
2730
  copy_dest_path->c_str());
2510
- files_to_copy_or_create_.write(std::move(copy_or_create_work_item));
2731
+ work_items_.write(std::move(copy_or_create_work_item));
2511
2732
  backup_items_to_finish.push_back(
2512
2733
  std::move(after_copy_or_create_work_item));
2513
2734
  }
2514
2735
  } else {
2515
- std::promise<CopyOrCreateResult> promise_result;
2736
+ std::promise<WorkItemResult> promise_result;
2516
2737
  BackupAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
2517
2738
  promise_result.get_future(), shared, need_to_copy, backup_env_,
2518
2739
  temp_dest_path, final_dest_path, dst_relative);
2519
2740
  backup_items_to_finish.push_back(std::move(after_copy_or_create_work_item));
2520
- CopyOrCreateResult result;
2741
+ WorkItemResult result;
2521
2742
  result.io_status = IOStatus::OK();
2522
2743
  result.size = size_bytes;
2523
2744
  result.checksum_hex = std::move(checksum_hex);
@@ -2557,7 +2778,7 @@ IOStatus BackupEngineImpl::ReadFileAndComputeChecksum(
2557
2778
  return io_s;
2558
2779
  }
2559
2780
 
2560
- size_t buf_size = kDefaultCopyFileBufferSize;
2781
+ size_t buf_size = CalculateIOBufferSize(rate_limiter);
2561
2782
  std::unique_ptr<char[]> buf(new char[buf_size]);
2562
2783
  Slice data;
2563
2784
 
@@ -2582,10 +2803,13 @@ IOStatus BackupEngineImpl::ReadFileAndComputeChecksum(
2582
2803
  return io_s;
2583
2804
  }
2584
2805
 
2585
- Status BackupEngineImpl::GetFileDbIdentities(
2586
- Env* src_env, const EnvOptions& src_env_options,
2587
- const std::string& file_path, Temperature file_temp,
2588
- RateLimiter* rate_limiter, std::string* db_id, std::string* db_session_id) {
2806
+ Status BackupEngineImpl::GetFileDbIdentities(Env* src_env,
2807
+ const EnvOptions& src_env_options,
2808
+ const std::string& file_path,
2809
+ Temperature file_temp,
2810
+ RateLimiter* rate_limiter,
2811
+ std::string* db_id,
2812
+ std::string* db_session_id) const {
2589
2813
  assert(db_id != nullptr || db_session_id != nullptr);
2590
2814
 
2591
2815
  Options options;
@@ -2605,7 +2829,7 @@ Status BackupEngineImpl::GetFileDbIdentities(
2605
2829
  // Try to get table properties from the table reader of sst_reader
2606
2830
  if (!sst_reader.ReadTableProperties(&tp).ok()) {
2607
2831
  // FIXME (peterd): this logic is untested and seems obsolete.
2608
- // Try to use table properites from the initialization of sst_reader
2832
+ // Try to use table properties from the initialization of sst_reader
2609
2833
  table_properties = sst_reader.GetInitTableProperties();
2610
2834
  } else {
2611
2835
  table_properties = tp.get();
@@ -2660,8 +2884,276 @@ void BackupEngineImpl::LoopRateLimitRequestHelper(
2660
2884
  }
2661
2885
  }
2662
2886
 
2663
- void BackupEngineImpl::DeleteChildren(const std::string& dir,
2664
- uint32_t file_type_filter) const {
2887
+ void BackupEngineImpl::InferDBFilesToRetainInRestore(
2888
+ const std::vector<std::pair<const BackupEngineImpl*, const FileInfo*>>&
2889
+ restore_file_infos,
2890
+ std::unordered_set<std::string>& unowned_backups, const std::string& db_dir,
2891
+ RestoreOptions::Mode mode,
2892
+ std::unordered_set<uint64_t>& files_to_keep) const {
2893
+ if (mode == RestoreOptions::Mode::kPurgeAllFiles) {
2894
+ return;
2895
+ }
2896
+
2897
+ ROCKS_LOG_INFO(options_.info_log,
2898
+ "Starting incremental restore evaluation in %" PRIu32 " mode",
2899
+ mode);
2900
+
2901
+ ROCKS_LOG_INFO(options_.info_log, "Constructing backup files mapping...");
2902
+ std::unordered_map<uint64_t,
2903
+ std::pair<const BackupEngineImpl*, const FileInfo*>>
2904
+ file_num_to_engine_infos;
2905
+ for (const auto& engine_and_file_info : restore_file_infos) {
2906
+ uint64_t number;
2907
+ FileType type;
2908
+
2909
+ std::string filename = engine_and_file_info.second->GetDbFileName();
2910
+ if (!ParseFileName(filename, &number, &type)) {
2911
+ continue;
2912
+ }
2913
+
2914
+ // We only care to optimize restore for large files - like SSTs and blobs.
2915
+ // Blobs are only supported in kVerifyChecksum.
2916
+ if (type == kTableFile ||
2917
+ (type == kBlobFile && mode == RestoreOptions::Mode::kVerifyChecksum)) {
2918
+ file_num_to_engine_infos[number] = engine_and_file_info;
2919
+ }
2920
+ }
2921
+
2922
+ ROCKS_LOG_INFO(
2923
+ options_.info_log,
2924
+ "Evaluating existing .sst%s files restore retention eligibility...",
2925
+ mode == RestoreOptions::Mode::kVerifyChecksum ? " and .blob files" : "");
2926
+
2927
+ std::vector<std::string> children;
2928
+ db_fs_->GetChildren(db_dir, io_options_, &children, nullptr)
2929
+ .PermitUncheckedError(); // ignore errors
2930
+ std::vector<ComputeChecksumWorkItem> backup_files_compute_checksum_work_items;
2931
+ std::vector<ComputeChecksumWorkItem> db_files_compute_checksum_work_items;
2932
+ std::unordered_map<uint64_t, std::string> backup_file_num_to_checksum;
2933
+ for (const auto& f : children) {
2934
+ uint64_t number;
2935
+ FileType type;
2936
+ bool ok = ParseFileName(f, &number, &type);
2937
+ if (!ok) {
2938
+ // Couldn't parse existing file name. We deliberately choose to sliently
2939
+ // skip here to avoid noisy & excessive logging in user controlled envs.
2940
+ continue;
2941
+ }
2942
+
2943
+ if (type != kTableFile && type != kBlobFile) {
2944
+ // We only care to optimize restore for large files - like SSTs / blobs.
2945
+ continue;
2946
+ }
2947
+
2948
+ if (type == kBlobFile && mode != RestoreOptions::Mode::kVerifyChecksum) {
2949
+ // Blob files are only supported in kVerifyChecksum mode.
2950
+ continue;
2951
+ }
2952
+
2953
+ uint64_t size_bytes = 0;
2954
+ std::string db_file_path = db_dir + "/" + f;
2955
+ IOStatus io_st = db_fs_->GetFileSize(db_file_path, io_options_, &size_bytes,
2956
+ nullptr /* dbg */);
2957
+ if (!io_st.ok()) {
2958
+ Log(options_.info_log,
2959
+ "Failed to get the file size for existing file: '%s'. IO status: %s",
2960
+ f.c_str(), io_st.ToString().c_str());
2961
+ continue;
2962
+ }
2963
+
2964
+ RateLimiter* rate_limiter = options_.restore_rate_limiter.get();
2965
+ if (mode == RestoreOptions::Mode::kKeepLatestDbSessionIdFiles) {
2966
+ // On-disk existing db file names require direct file footer query
2967
+ // as they don't follow same naming convention as backups.
2968
+ std::string db_id;
2969
+ std::string db_session_id;
2970
+ Status s = GetFileDbIdentities(
2971
+ db_env_, EnvOptions() /* src_env_options */,
2972
+ db_file_path /* file_path */, Temperature::kUnknown /* src_temp */,
2973
+ rate_limiter, &db_id, &db_session_id);
2974
+ if (!s.ok()) {
2975
+ Log(options_.info_log,
2976
+ "Encountered IO error while obtaining db session id metadata for "
2977
+ "existing file '%s'.",
2978
+ db_file_path.c_str());
2979
+ continue;
2980
+ }
2981
+
2982
+ const std::string checksum_hex = "";
2983
+ std::string shared_file_name = GenerateSharedFileWithDbSessionIdAndSize(
2984
+ f, size_bytes, db_session_id);
2985
+ bool found = false;
2986
+ const auto& f_ei = file_num_to_engine_infos.find(number);
2987
+ if (f_ei != file_num_to_engine_infos.end()) {
2988
+ found = f_ei->second.second->filename == shared_file_name;
2989
+ }
2990
+
2991
+ if (!found) {
2992
+ const auto& uo_sst_bfn = unowned_backups.find(shared_file_name);
2993
+ if (uo_sst_bfn != unowned_backups.end()) {
2994
+ // Db file has been successfully associated with the excluded backup.
2995
+ unowned_backups.erase(shared_file_name);
2996
+ found = true;
2997
+ }
2998
+ }
2999
+
3000
+ if (found) {
3001
+ files_to_keep.insert(number);
3002
+
3003
+ ROCKS_LOG_INFO(options_.info_log,
3004
+ "Existing db file '%s' is retained for restore.",
3005
+ f.c_str());
3006
+ }
3007
+ } else if (mode == RestoreOptions::Mode::kVerifyChecksum) {
3008
+ const auto& f_ei = file_num_to_engine_infos.find(number);
3009
+ if (f_ei == file_num_to_engine_infos.end() ||
3010
+ f_ei->second.second->GetDbFileName() != f) {
3011
+ Log(options_.info_log,
3012
+ "Existing file '%s' is not present in the backup!", f.c_str());
3013
+ continue;
3014
+ }
3015
+
3016
+ auto backup_engine_impl = f_ei->second.first;
3017
+ auto backup_file_info = f_ei->second.second;
3018
+ DBOptions db_options;
3019
+ std::string backup_file_path =
3020
+ backup_engine_impl->GetAbsolutePath(backup_file_info->filename);
3021
+ std::string backup_file_checksum = backup_file_info->checksum_hex;
3022
+ if (!backup_file_checksum.empty()) {
3023
+ backup_file_num_to_checksum[number] = backup_file_checksum;
3024
+ } else {
3025
+ // Backup file checksum is missing in the backup metadata.
3026
+ // Given explicit requirement, compute it asynchronously.
3027
+ EnvOptions backup_env_options;
3028
+ if (type == kBlobFile) {
3029
+ backup_engine_impl->backup_env_->OptimizeForBlobFileRead(
3030
+ backup_env_options, ImmutableDBOptions(db_options));
3031
+ } else if (type == kTableFile) {
3032
+ backup_engine_impl->backup_env_->OptimizeForCompactionTableRead(
3033
+ backup_env_options, ImmutableDBOptions(db_options));
3034
+ }
3035
+
3036
+ WorkItem backup_file_work_item(
3037
+ backup_file_path, "" /* dst_path */, backup_file_info->temp,
3038
+ Temperature::kUnknown /* dst_temperature */, "" /* contents */,
3039
+ backup_engine_impl->backup_env_, nullptr /* dst_env */,
3040
+ backup_env_options, false /* sync */,
3041
+ options_.restore_rate_limiter.get(), 0 /* size_limit */,
3042
+ nullptr /* stats */, {} /* progress_callback */,
3043
+ kUnknownFileChecksumFuncName /* src_checksum_func_name */,
3044
+ "" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
3045
+ WorkItemType::ComputeChecksum);
3046
+
3047
+ ComputeChecksumWorkItem backup_file_checksum_work_item(
3048
+ backup_file_work_item.result.get_future(),
3049
+ backup_file_info->filename, number);
3050
+
3051
+ work_items_.write(std::move(backup_file_work_item));
3052
+ backup_files_compute_checksum_work_items.push_back(
3053
+ std::move(backup_file_checksum_work_item));
3054
+
3055
+ Log(options_.info_log,
3056
+ "Checksum is missing in '%s' backup file metadata."
3057
+ "Scheduled async computation...",
3058
+ backup_file_info->filename.c_str());
3059
+ }
3060
+
3061
+ // Unconditionally compute checksum for existing file.
3062
+ EnvOptions db_env_options;
3063
+ if (type == kBlobFile) {
3064
+ db_env_->OptimizeForBlobFileRead(db_env_options,
3065
+ ImmutableDBOptions(db_options));
3066
+ } else if (type == kTableFile) {
3067
+ db_env_->OptimizeForCompactionTableRead(db_env_options,
3068
+ ImmutableDBOptions(db_options));
3069
+ }
3070
+
3071
+ WorkItem db_file_work_item(
3072
+ db_file_path, "" /* dst_path */, backup_file_info->temp,
3073
+ Temperature::kUnknown /* dst_temperature */, "" /* contents */,
3074
+ db_env_, nullptr /* dst_env */, db_env_options, false /* sync */,
3075
+ options_.restore_rate_limiter.get(), 0 /* size_limit */,
3076
+ nullptr /* stats */, {} /* progress_callback */,
3077
+ kUnknownFileChecksumFuncName /* src_checksum_func_name */,
3078
+ "" /* src_checksum_hex */, "" /* db_id */, "" /* db_session_id*/,
3079
+ WorkItemType::ComputeChecksum);
3080
+
3081
+ ComputeChecksumWorkItem db_file_checksum_work_item(
3082
+ db_file_work_item.result.get_future(), db_file_path, number);
3083
+ work_items_.write(std::move(db_file_work_item));
3084
+ db_files_compute_checksum_work_items.push_back(
3085
+ std::move(db_file_checksum_work_item));
3086
+
3087
+ Log(options_.info_log,
3088
+ "Schedule async checksum computation for file '%s'", f.c_str());
3089
+ }
3090
+ }
3091
+
3092
+ if (mode == RestoreOptions::Mode::kVerifyChecksum) {
3093
+ // First loop through checksum computation results for backup files.
3094
+ for (auto& item : backup_files_compute_checksum_work_items) {
3095
+ item.result.wait();
3096
+ auto result = item.result.get();
3097
+ IOStatus item_io_status = result.io_status;
3098
+ if (!item_io_status.ok()) {
3099
+ // Failed computation for backup file will result in purging
3100
+ // the existing file and restoring the backup file.
3101
+ Log(options_.info_log,
3102
+ "Encountered IO error while computing checksum for "
3103
+ "backup file '%s'.",
3104
+ item.file_path.c_str());
3105
+ continue;
3106
+ }
3107
+
3108
+ backup_file_num_to_checksum[item.file_number] = result.checksum_hex;
3109
+ }
3110
+
3111
+ // Loop through db files checksum computation results.
3112
+ for (auto& item : db_files_compute_checksum_work_items) {
3113
+ item.result.wait();
3114
+ auto result = item.result.get();
3115
+ IOStatus item_io_status = result.io_status;
3116
+ if (!item_io_status.ok()) {
3117
+ // Failed computation for existing file will result in purging
3118
+ // and restoring it from the corresponding backup file.
3119
+ Log(options_.info_log,
3120
+ "Encountered IO error while computing checksum for "
3121
+ "existing file '%s'.",
3122
+ item.file_path.c_str());
3123
+ continue;
3124
+ }
3125
+
3126
+ auto it = backup_file_num_to_checksum.find(item.file_number);
3127
+ if (it == backup_file_num_to_checksum.end()) {
3128
+ Log(options_.info_log,
3129
+ "Failed to find backup file checksum for existing file '%s'.",
3130
+ item.file_path.c_str());
3131
+ continue;
3132
+ }
3133
+
3134
+ if (it->second != result.checksum_hex) {
3135
+ Log(options_.info_log,
3136
+ "Checksum mismatch between backup file and existing file '%s'.",
3137
+ item.file_path.c_str());
3138
+ continue;
3139
+ }
3140
+
3141
+ files_to_keep.insert(item.file_number);
3142
+
3143
+ Log(options_.info_log, "Existing file '%s' is retained for restore.",
3144
+ item.file_path.c_str());
3145
+ }
3146
+ }
3147
+
3148
+ ROCKS_LOG_INFO(options_.info_log,
3149
+ "Done with incremental restore evaluation. "
3150
+ "Retained %zu files.",
3151
+ files_to_keep.size());
3152
+ }
3153
+
3154
+ void BackupEngineImpl::DeleteChildren(
3155
+ const std::string& dir, const std::unordered_set<uint64_t>& files_to_keep,
3156
+ uint32_t file_type_filter) const {
2665
3157
  std::vector<std::string> children;
2666
3158
  db_fs_->GetChildren(dir, io_options_, &children, nullptr)
2667
3159
  .PermitUncheckedError(); // ignore errors
@@ -2670,8 +3162,12 @@ void BackupEngineImpl::DeleteChildren(const std::string& dir,
2670
3162
  uint64_t number;
2671
3163
  FileType type;
2672
3164
  bool ok = ParseFileName(f, &number, &type);
3165
+ if (ok && (files_to_keep.find(number) != files_to_keep.end())) {
3166
+ // don't delete file with this number.
3167
+ continue;
3168
+ }
2673
3169
  if (ok && (file_type_filter & (1 << type))) {
2674
- // don't delete this file
3170
+ // don't delete this file type.
2675
3171
  continue;
2676
3172
  }
2677
3173
  db_fs_->DeleteFile(dir + "/" + f, io_options_, nullptr)