@nxtedition/rocksdb 5.2.21 → 5.2.26

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 (909) hide show
  1. package/binding.cc +216 -252
  2. package/binding.gyp +78 -72
  3. package/deps/rocksdb/build_version.cc +70 -4
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  5. package/deps/rocksdb/rocksdb/Makefile +459 -469
  6. package/deps/rocksdb/rocksdb/README.md +4 -4
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  33. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  51. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  60. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  61. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  62. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  63. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  64. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  65. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  67. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  68. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  69. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  71. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  96. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  97. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  98. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  100. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  101. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  102. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  103. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  104. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  105. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  106. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  107. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  108. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  110. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  111. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  112. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  124. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  125. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  126. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  127. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  128. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  129. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  131. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  132. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  133. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  134. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  135. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  136. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  137. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  139. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  140. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  141. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  142. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  143. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  144. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  145. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  146. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  147. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  148. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  149. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  150. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  151. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  152. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  153. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  154. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  155. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  156. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  157. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  158. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  159. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  160. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  161. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  162. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  163. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  164. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  165. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  166. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  167. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  168. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  169. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  171. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  172. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  174. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  175. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  176. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  180. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  182. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  183. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  184. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  185. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  186. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  187. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  188. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  189. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  190. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  191. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  192. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  193. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  194. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  195. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  196. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  197. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  198. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  199. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  200. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  201. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  202. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  203. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  204. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  205. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  206. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  207. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  210. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  212. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  213. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  216. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  217. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  218. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  219. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  220. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  223. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  224. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  226. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  227. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  228. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  229. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  230. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  231. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  233. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  234. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  235. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  236. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  246. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  248. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  249. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  250. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  251. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  252. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  253. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  254. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  255. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  256. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  257. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  258. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  259. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  260. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  261. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  262. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  263. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  266. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  267. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  274. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  280. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  285. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  286. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  287. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  288. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  289. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  290. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  291. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  292. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  293. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  294. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  295. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  296. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  298. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  299. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  300. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  301. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  302. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  303. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  304. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  305. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  306. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  307. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  308. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  309. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  310. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  313. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  315. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  316. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  317. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  318. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  319. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  320. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  321. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  324. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  325. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  326. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  327. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  334. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  335. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  336. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  342. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  343. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  344. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  345. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  346. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  348. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  349. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  350. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  353. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  354. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  357. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  358. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  359. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  360. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  361. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  362. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  364. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  365. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  366. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  367. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  368. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  371. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  378. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  380. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  381. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  383. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  386. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  387. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  407. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  408. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  410. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  412. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  413. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  414. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  415. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  416. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  417. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  418. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  419. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  420. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  421. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  422. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  423. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  424. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  425. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  426. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  427. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  428. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  429. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  430. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  431. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  432. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  433. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  434. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  435. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  436. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  437. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  438. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  439. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  440. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  441. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  442. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  443. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  444. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  445. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  446. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  447. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  448. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  449. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  450. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  451. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  452. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  453. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  454. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  455. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  456. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  457. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  458. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  459. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  460. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  461. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  462. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  463. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  464. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  465. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  466. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  467. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  468. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  469. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  470. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  471. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  472. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  473. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  474. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  475. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  476. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  477. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  478. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  479. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  480. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  481. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  482. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  483. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  484. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  485. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  486. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  487. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  488. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  489. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  490. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  491. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  492. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  493. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  494. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  495. package/deps/rocksdb/rocksdb/python.mk +9 -0
  496. package/deps/rocksdb/rocksdb/src.mk +82 -34
  497. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  498. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  500. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  501. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  502. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  503. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  504. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  505. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  506. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  507. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  508. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  514. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  515. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  516. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  517. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  518. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  519. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  520. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  521. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  522. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  523. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  524. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  525. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  526. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  527. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  529. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  530. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  531. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  532. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  534. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  535. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  536. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  537. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  539. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  540. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  541. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  542. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  543. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  544. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  546. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  547. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  548. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  549. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  550. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  551. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  552. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  553. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  554. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  555. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  556. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  557. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  558. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  559. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  560. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  561. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  562. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  563. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  564. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  565. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  566. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  567. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  568. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  569. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  570. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  571. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  572. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  573. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  574. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  575. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  576. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  577. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  578. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  579. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  580. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  581. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  582. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  586. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  587. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  588. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  589. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  590. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  591. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  592. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  593. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  594. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  595. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  596. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  597. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  598. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  599. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  600. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  601. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  602. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  603. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  604. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  605. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  606. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  607. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  608. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  609. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  610. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  611. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  612. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  613. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  614. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  615. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  616. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  617. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  618. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  619. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  620. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  621. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  622. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  623. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  624. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  625. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  626. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  627. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  628. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  629. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  630. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  631. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  632. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  633. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  634. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  635. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  636. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  637. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  638. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  639. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  640. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  641. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  642. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  643. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  644. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  645. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  646. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  647. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  648. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  649. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  650. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  651. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  652. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  653. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  654. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  655. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  656. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  657. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  658. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  659. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  660. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  661. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  662. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  663. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  664. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  665. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  666. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  667. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  668. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  669. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  670. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  671. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  672. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  673. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  674. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  675. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  676. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  677. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  678. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  679. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  680. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  681. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  682. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  683. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  684. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  685. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  686. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  687. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  688. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  689. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  690. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  691. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  692. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  693. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  694. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  695. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  696. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  697. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  698. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  699. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  700. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  701. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  702. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  703. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  704. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  705. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  706. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  707. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  708. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  709. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  710. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  711. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  712. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  713. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  714. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  715. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  716. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  717. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  718. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  719. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  720. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  721. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  722. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  723. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  724. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  725. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  726. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  727. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  728. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  729. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  730. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  731. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  732. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  733. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  734. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  741. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  742. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  743. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  744. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  745. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  746. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  747. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  748. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  749. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  750. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  751. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  752. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  753. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  754. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  755. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  756. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  757. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  758. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  759. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  760. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  761. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  762. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  763. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  764. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  765. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  766. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  767. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  768. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  769. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  770. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  771. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  772. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  773. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  774. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  775. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  776. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  777. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  778. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  779. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  780. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  786. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  787. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  788. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  789. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  790. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  791. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  792. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  793. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  794. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  795. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  796. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  797. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  798. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  799. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  802. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  803. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  804. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  805. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  806. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  807. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  808. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  809. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  810. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  811. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  812. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  813. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  814. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  815. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  816. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  817. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  818. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  821. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  822. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  823. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  824. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  825. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  826. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  827. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  828. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  829. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  830. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  831. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  832. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  833. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  834. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  835. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  836. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  837. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  838. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  839. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  840. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  841. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  842. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  843. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  844. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  845. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  846. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  847. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  848. package/deps/rocksdb/rocksdb.gyp +425 -446
  849. package/package.json +8 -8
  850. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  851. package/prebuilds/darwin-x86/node.napi.node +0 -0
  852. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  853. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  854. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  855. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  856. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  857. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  858. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  859. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  860. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  861. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  862. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  863. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  864. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  865. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  866. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  867. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  868. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  869. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  870. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  871. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  872. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  873. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  874. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  904. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  905. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  906. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  907. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  908. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  909. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -1,2354 +0,0 @@
1
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
- // This source code is licensed under both the GPLv2 (found in the
3
- // COPYING file in the root directory) and Apache 2.0 License
4
- // (found in the LICENSE.Apache file in the root directory).
5
- //
6
- // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
- // Use of this source code is governed by a BSD-style license that can be
8
- // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
-
10
- #ifndef ROCKSDB_LITE
11
-
12
- #include "rocksdb/utilities/backupable_db.h"
13
-
14
- #include <stdlib.h>
15
-
16
- #include <algorithm>
17
- #include <atomic>
18
- #include <cinttypes>
19
- #include <functional>
20
- #include <future>
21
- #include <limits>
22
- #include <map>
23
- #include <mutex>
24
- #include <sstream>
25
- #include <string>
26
- #include <thread>
27
- #include <unordered_map>
28
- #include <unordered_set>
29
- #include <vector>
30
-
31
- #include "env/composite_env_wrapper.h"
32
- #include "file/filename.h"
33
- #include "file/sequence_file_reader.h"
34
- #include "file/writable_file_writer.h"
35
- #include "logging/logging.h"
36
- #include "port/port.h"
37
- #include "rocksdb/rate_limiter.h"
38
- #include "rocksdb/transaction_log.h"
39
- #include "table/sst_file_dumper.h"
40
- #include "test_util/sync_point.h"
41
- #include "util/channel.h"
42
- #include "util/coding.h"
43
- #include "util/crc32c.h"
44
- #include "util/string_util.h"
45
- #include "utilities/checkpoint/checkpoint_impl.h"
46
-
47
- namespace ROCKSDB_NAMESPACE {
48
-
49
- namespace {
50
- using ShareFilesNaming = BackupableDBOptions::ShareFilesNaming;
51
-
52
- inline uint32_t ChecksumHexToInt32(const std::string& checksum_hex) {
53
- std::string checksum_str;
54
- Slice(checksum_hex).DecodeHex(&checksum_str);
55
- return EndianSwapValue(DecodeFixed32(checksum_str.c_str()));
56
- }
57
- inline std::string ChecksumStrToHex(const std::string& checksum_str) {
58
- return Slice(checksum_str).ToString(true);
59
- }
60
- inline std::string ChecksumInt32ToHex(const uint32_t& checksum_value) {
61
- std::string checksum_str;
62
- PutFixed32(&checksum_str, EndianSwapValue(checksum_value));
63
- return ChecksumStrToHex(checksum_str);
64
- }
65
- } // namespace
66
-
67
- void BackupStatistics::IncrementNumberSuccessBackup() {
68
- number_success_backup++;
69
- }
70
- void BackupStatistics::IncrementNumberFailBackup() {
71
- number_fail_backup++;
72
- }
73
-
74
- uint32_t BackupStatistics::GetNumberSuccessBackup() const {
75
- return number_success_backup;
76
- }
77
- uint32_t BackupStatistics::GetNumberFailBackup() const {
78
- return number_fail_backup;
79
- }
80
-
81
- std::string BackupStatistics::ToString() const {
82
- char result[50];
83
- snprintf(result, sizeof(result), "# success backup: %u, # fail backup: %u",
84
- GetNumberSuccessBackup(), GetNumberFailBackup());
85
- return result;
86
- }
87
-
88
- void BackupableDBOptions::Dump(Logger* logger) const {
89
- ROCKS_LOG_INFO(logger, " Options.backup_dir: %s",
90
- backup_dir.c_str());
91
- ROCKS_LOG_INFO(logger, " Options.backup_env: %p", backup_env);
92
- ROCKS_LOG_INFO(logger, " Options.share_table_files: %d",
93
- static_cast<int>(share_table_files));
94
- ROCKS_LOG_INFO(logger, " Options.info_log: %p", info_log);
95
- ROCKS_LOG_INFO(logger, " Options.sync: %d",
96
- static_cast<int>(sync));
97
- ROCKS_LOG_INFO(logger, " Options.destroy_old_data: %d",
98
- static_cast<int>(destroy_old_data));
99
- ROCKS_LOG_INFO(logger, " Options.backup_log_files: %d",
100
- static_cast<int>(backup_log_files));
101
- ROCKS_LOG_INFO(logger, " Options.backup_rate_limit: %" PRIu64,
102
- backup_rate_limit);
103
- ROCKS_LOG_INFO(logger, " Options.restore_rate_limit: %" PRIu64,
104
- restore_rate_limit);
105
- ROCKS_LOG_INFO(logger, "Options.max_background_operations: %d",
106
- max_background_operations);
107
- }
108
-
109
- // -------- BackupEngineImpl class ---------
110
- class BackupEngineImpl : public BackupEngine {
111
- public:
112
- BackupEngineImpl(const BackupableDBOptions& options, Env* db_env,
113
- bool read_only = false);
114
- ~BackupEngineImpl() override;
115
-
116
- using BackupEngine::CreateNewBackupWithMetadata;
117
- Status CreateNewBackupWithMetadata(const CreateBackupOptions& options, DB* db,
118
- const std::string& app_metadata) override;
119
-
120
- Status PurgeOldBackups(uint32_t num_backups_to_keep) override;
121
-
122
- Status DeleteBackup(BackupID backup_id) override;
123
-
124
- void StopBackup() override {
125
- stop_backup_.store(true, std::memory_order_release);
126
- }
127
-
128
- Status GarbageCollect() override;
129
-
130
- // The returned BackupInfos are in chronological order, which means the
131
- // latest backup comes last.
132
- void GetBackupInfo(std::vector<BackupInfo>* backup_info) override;
133
-
134
- void GetCorruptedBackups(std::vector<BackupID>* corrupt_backup_ids) override;
135
-
136
- using BackupEngine::RestoreDBFromBackup;
137
- Status RestoreDBFromBackup(const RestoreOptions& options, BackupID backup_id,
138
- const std::string& db_dir,
139
- const std::string& wal_dir) override;
140
-
141
- using BackupEngine::RestoreDBFromLatestBackup;
142
- Status RestoreDBFromLatestBackup(const RestoreOptions& options,
143
- const std::string& db_dir,
144
- const std::string& wal_dir) override {
145
- return RestoreDBFromBackup(options, latest_valid_backup_id_, db_dir,
146
- wal_dir);
147
- }
148
-
149
- Status VerifyBackup(BackupID backup_id,
150
- bool verify_with_checksum = false) override;
151
-
152
- Status Initialize();
153
-
154
- ShareFilesNaming GetNamingNoFlags() const {
155
- return options_.share_files_with_checksum_naming &
156
- BackupableDBOptions::kMaskNoNamingFlags;
157
- }
158
- ShareFilesNaming GetNamingFlags() const {
159
- return options_.share_files_with_checksum_naming &
160
- BackupableDBOptions::kMaskNamingFlags;
161
- }
162
-
163
- private:
164
- void DeleteChildren(const std::string& dir, uint32_t file_type_filter = 0);
165
- Status DeleteBackupInternal(BackupID backup_id);
166
-
167
- // Extends the "result" map with pathname->size mappings for the contents of
168
- // "dir" in "env". Pathnames are prefixed with "dir".
169
- Status InsertPathnameToSizeBytes(
170
- const std::string& dir, Env* env,
171
- std::unordered_map<std::string, uint64_t>* result);
172
-
173
- struct FileInfo {
174
- FileInfo(const std::string& fname, uint64_t sz, const std::string& checksum,
175
- const std::string& id = "", const std::string& sid = "")
176
- : refs(0),
177
- filename(fname),
178
- size(sz),
179
- checksum_hex(checksum),
180
- db_id(id),
181
- db_session_id(sid) {}
182
-
183
- FileInfo(const FileInfo&) = delete;
184
- FileInfo& operator=(const FileInfo&) = delete;
185
-
186
- int refs;
187
- const std::string filename;
188
- const uint64_t size;
189
- const std::string checksum_hex;
190
- // DB identities
191
- // db_id is obtained for potential usage in the future but not used
192
- // currently
193
- const std::string db_id;
194
- // db_session_id appears in the backup SST filename if the table naming
195
- // option is kUseDbSessionId
196
- const std::string db_session_id;
197
- };
198
-
199
- class BackupMeta {
200
- public:
201
- BackupMeta(
202
- const std::string& meta_filename, const std::string& meta_tmp_filename,
203
- std::unordered_map<std::string, std::shared_ptr<FileInfo>>* file_infos,
204
- Env* env)
205
- : timestamp_(0),
206
- sequence_number_(0),
207
- size_(0),
208
- meta_filename_(meta_filename),
209
- meta_tmp_filename_(meta_tmp_filename),
210
- file_infos_(file_infos),
211
- env_(env) {}
212
-
213
- BackupMeta(const BackupMeta&) = delete;
214
- BackupMeta& operator=(const BackupMeta&) = delete;
215
-
216
- ~BackupMeta() {}
217
-
218
- Status RecordTimestamp() { return env_->GetCurrentTime(&timestamp_); }
219
- int64_t GetTimestamp() const {
220
- return timestamp_;
221
- }
222
- uint64_t GetSize() const {
223
- return size_;
224
- }
225
- uint32_t GetNumberFiles() { return static_cast<uint32_t>(files_.size()); }
226
- void SetSequenceNumber(uint64_t sequence_number) {
227
- sequence_number_ = sequence_number;
228
- }
229
- uint64_t GetSequenceNumber() {
230
- return sequence_number_;
231
- }
232
-
233
- const std::string& GetAppMetadata() const { return app_metadata_; }
234
-
235
- void SetAppMetadata(const std::string& app_metadata) {
236
- app_metadata_ = app_metadata;
237
- }
238
-
239
- Status AddFile(std::shared_ptr<FileInfo> file_info);
240
-
241
- Status Delete(bool delete_meta = true);
242
-
243
- bool Empty() {
244
- return files_.empty();
245
- }
246
-
247
- std::shared_ptr<FileInfo> GetFile(const std::string& filename) const {
248
- auto it = file_infos_->find(filename);
249
- if (it == file_infos_->end())
250
- return nullptr;
251
- return it->second;
252
- }
253
-
254
- const std::vector<std::shared_ptr<FileInfo>>& GetFiles() {
255
- return files_;
256
- }
257
-
258
- // @param abs_path_to_size Pre-fetched file sizes (bytes).
259
- Status LoadFromFile(
260
- const std::string& backup_dir,
261
- const std::unordered_map<std::string, uint64_t>& abs_path_to_size);
262
- Status StoreToFile(bool sync);
263
-
264
- std::string GetInfoString() {
265
- std::ostringstream ss;
266
- ss << "Timestamp: " << timestamp_ << std::endl;
267
- char human_size[16];
268
- AppendHumanBytes(size_, human_size, sizeof(human_size));
269
- ss << "Size: " << human_size << std::endl;
270
- ss << "Files:" << std::endl;
271
- for (const auto& file : files_) {
272
- AppendHumanBytes(file->size, human_size, sizeof(human_size));
273
- ss << file->filename << ", size " << human_size << ", refs "
274
- << file->refs << std::endl;
275
- }
276
- return ss.str();
277
- }
278
-
279
- private:
280
- int64_t timestamp_;
281
- // sequence number is only approximate, should not be used
282
- // by clients
283
- uint64_t sequence_number_;
284
- uint64_t size_;
285
- std::string app_metadata_;
286
- std::string const meta_filename_;
287
- std::string const meta_tmp_filename_;
288
- // files with relative paths (without "/" prefix!!)
289
- std::vector<std::shared_ptr<FileInfo>> files_;
290
- std::unordered_map<std::string, std::shared_ptr<FileInfo>>* file_infos_;
291
- Env* env_;
292
-
293
- static const size_t max_backup_meta_file_size_ = 10 * 1024 * 1024; // 10MB
294
- }; // BackupMeta
295
-
296
- inline std::string GetAbsolutePath(
297
- const std::string &relative_path = "") const {
298
- assert(relative_path.size() == 0 || relative_path[0] != '/');
299
- return options_.backup_dir + "/" + relative_path;
300
- }
301
- inline std::string GetPrivateDirRel() const {
302
- return "private";
303
- }
304
- inline std::string GetSharedDirRel() const { return "shared"; }
305
- inline std::string GetSharedChecksumDirRel() const {
306
- return "shared_checksum";
307
- }
308
- inline std::string GetPrivateFileRel(BackupID backup_id,
309
- bool tmp = false,
310
- const std::string& file = "") const {
311
- assert(file.size() == 0 || file[0] != '/');
312
- return GetPrivateDirRel() + "/" + ROCKSDB_NAMESPACE::ToString(backup_id) +
313
- (tmp ? ".tmp" : "") + "/" + file;
314
- }
315
- inline std::string GetSharedFileRel(const std::string& file = "",
316
- bool tmp = false) const {
317
- assert(file.size() == 0 || file[0] != '/');
318
- return GetSharedDirRel() + "/" + (tmp ? "." : "") + file +
319
- (tmp ? ".tmp" : "");
320
- }
321
- inline std::string GetSharedFileWithChecksumRel(const std::string& file = "",
322
- bool tmp = false) const {
323
- assert(file.size() == 0 || file[0] != '/');
324
- return GetSharedChecksumDirRel() + "/" + (tmp ? "." : "") + file +
325
- (tmp ? ".tmp" : "");
326
- }
327
- inline bool UseLegacyNaming(const std::string& sid) const {
328
- return GetNamingNoFlags() ==
329
- BackupableDBOptions::kLegacyCrc32cAndFileSize ||
330
- sid.empty();
331
- }
332
- inline bool UseInterimNaming(const std::string& sid) const {
333
- // The indicator of SST file from early internal 6.12 release
334
- // is a '-' in the DB session id. DB session id was made more
335
- // concise without '-' after that.
336
- return (GetNamingFlags() & BackupableDBOptions::kFlagMatchInterimNaming) &&
337
- sid.find('-') != std::string::npos;
338
- }
339
- inline std::string GetSharedFileWithChecksum(
340
- const std::string& file, bool has_checksum,
341
- const std::string& checksum_hex, const uint64_t file_size,
342
- const std::string& db_session_id) const {
343
- assert(file.size() == 0 || file[0] != '/');
344
- std::string file_copy = file;
345
- if (UseLegacyNaming(db_session_id)) {
346
- assert(has_checksum);
347
- (void)has_checksum;
348
- file_copy.insert(file_copy.find_last_of('.'),
349
- "_" + ToString(ChecksumHexToInt32(checksum_hex)) + "_" +
350
- ToString(file_size));
351
- } else if (UseInterimNaming(db_session_id)) {
352
- file_copy.insert(file_copy.find_last_of('.'), "_" + db_session_id);
353
- } else {
354
- file_copy.insert(file_copy.find_last_of('.'), "_s" + db_session_id);
355
- if (GetNamingFlags() & BackupableDBOptions::kFlagIncludeFileSize) {
356
- file_copy.insert(file_copy.find_last_of('.'),
357
- "_" + ToString(file_size));
358
- }
359
- }
360
- return file_copy;
361
- }
362
- inline std::string GetFileFromChecksumFile(const std::string& file) const {
363
- assert(file.size() == 0 || file[0] != '/');
364
- std::string file_copy = file;
365
- size_t first_underscore = file_copy.find_first_of('_');
366
- return file_copy.erase(first_underscore,
367
- file_copy.find_last_of('.') - first_underscore);
368
- }
369
- inline std::string GetBackupMetaDir() const {
370
- return GetAbsolutePath("meta");
371
- }
372
- inline std::string GetBackupMetaFile(BackupID backup_id, bool tmp) const {
373
- return GetBackupMetaDir() + "/" + (tmp ? "." : "") +
374
- ROCKSDB_NAMESPACE::ToString(backup_id) + (tmp ? ".tmp" : "");
375
- }
376
-
377
- // If size_limit == 0, there is no size limit, copy everything.
378
- //
379
- // Exactly one of src and contents must be non-empty.
380
- //
381
- // @param src If non-empty, the file is copied from this pathname.
382
- // @param contents If non-empty, the file will be created with these contents.
383
- Status CopyOrCreateFile(const std::string& src, const std::string& dst,
384
- const std::string& contents, Env* src_env,
385
- Env* dst_env, const EnvOptions& src_env_options,
386
- bool sync, RateLimiter* rate_limiter,
387
- uint64_t* size = nullptr,
388
- std::string* checksum_hex = nullptr,
389
- uint64_t size_limit = 0,
390
- std::function<void()> progress_callback = []() {});
391
-
392
- Status ReadFileAndComputeChecksum(const std::string& src, Env* src_env,
393
- const EnvOptions& src_env_options,
394
- uint64_t size_limit,
395
- std::string* checksum_hex);
396
-
397
- // Obtain db_id and db_session_id from the table properties of file_path
398
- Status GetFileDbIdentities(Env* src_env, const EnvOptions& src_env_options,
399
- const std::string& file_path, std::string* db_id,
400
- std::string* db_session_id);
401
-
402
- struct CopyOrCreateResult {
403
- ~CopyOrCreateResult() {
404
- // The Status needs to be ignored here for two reasons.
405
- // First, if the BackupEngineImpl shuts down with jobs outstanding, then
406
- // it is possible that the Status in the future/promise is never read,
407
- // resulting in an unchecked Status. Second, if there are items in the
408
- // channel when the BackupEngineImpl is shutdown, these will also have
409
- // Status that have not been checked. This
410
- // TODO: Fix those issues so that the Status
411
- status.PermitUncheckedError();
412
- }
413
- uint64_t size;
414
- std::string checksum_hex;
415
- std::string db_id;
416
- std::string db_session_id;
417
- Status status;
418
- };
419
-
420
- // Exactly one of src_path and contents must be non-empty. If src_path is
421
- // non-empty, the file is copied from this pathname. Otherwise, if contents is
422
- // non-empty, the file will be created at dst_path with these contents.
423
- struct CopyOrCreateWorkItem {
424
- std::string src_path;
425
- std::string dst_path;
426
- std::string contents;
427
- Env* src_env;
428
- Env* dst_env;
429
- EnvOptions src_env_options;
430
- bool sync;
431
- RateLimiter* rate_limiter;
432
- uint64_t size_limit;
433
- std::promise<CopyOrCreateResult> result;
434
- std::function<void()> progress_callback;
435
- bool verify_checksum_after_work;
436
- std::string src_checksum_func_name;
437
- std::string src_checksum_hex;
438
- std::string db_id;
439
- std::string db_session_id;
440
-
441
- CopyOrCreateWorkItem()
442
- : src_path(""),
443
- dst_path(""),
444
- contents(""),
445
- src_env(nullptr),
446
- dst_env(nullptr),
447
- src_env_options(),
448
- sync(false),
449
- rate_limiter(nullptr),
450
- size_limit(0),
451
- verify_checksum_after_work(false),
452
- src_checksum_func_name(kUnknownFileChecksumFuncName),
453
- src_checksum_hex(""),
454
- db_id(""),
455
- db_session_id("") {}
456
-
457
- CopyOrCreateWorkItem(const CopyOrCreateWorkItem&) = delete;
458
- CopyOrCreateWorkItem& operator=(const CopyOrCreateWorkItem&) = delete;
459
-
460
- CopyOrCreateWorkItem(CopyOrCreateWorkItem&& o) ROCKSDB_NOEXCEPT {
461
- *this = std::move(o);
462
- }
463
-
464
- CopyOrCreateWorkItem& operator=(CopyOrCreateWorkItem&& o) ROCKSDB_NOEXCEPT {
465
- src_path = std::move(o.src_path);
466
- dst_path = std::move(o.dst_path);
467
- contents = std::move(o.contents);
468
- src_env = o.src_env;
469
- dst_env = o.dst_env;
470
- src_env_options = std::move(o.src_env_options);
471
- sync = o.sync;
472
- rate_limiter = o.rate_limiter;
473
- size_limit = o.size_limit;
474
- result = std::move(o.result);
475
- progress_callback = std::move(o.progress_callback);
476
- verify_checksum_after_work = o.verify_checksum_after_work;
477
- src_checksum_func_name = std::move(o.src_checksum_func_name);
478
- src_checksum_hex = std::move(o.src_checksum_hex);
479
- db_id = std::move(o.db_id);
480
- db_session_id = std::move(o.db_session_id);
481
- return *this;
482
- }
483
-
484
- CopyOrCreateWorkItem(
485
- std::string _src_path, std::string _dst_path, std::string _contents,
486
- Env* _src_env, Env* _dst_env, EnvOptions _src_env_options, bool _sync,
487
- RateLimiter* _rate_limiter, uint64_t _size_limit,
488
- std::function<void()> _progress_callback = []() {},
489
- bool _verify_checksum_after_work = false,
490
- const std::string& _src_checksum_func_name =
491
- kUnknownFileChecksumFuncName,
492
- const std::string& _src_checksum_hex = "",
493
- const std::string& _db_id = "", const std::string& _db_session_id = "")
494
- : src_path(std::move(_src_path)),
495
- dst_path(std::move(_dst_path)),
496
- contents(std::move(_contents)),
497
- src_env(_src_env),
498
- dst_env(_dst_env),
499
- src_env_options(std::move(_src_env_options)),
500
- sync(_sync),
501
- rate_limiter(_rate_limiter),
502
- size_limit(_size_limit),
503
- progress_callback(_progress_callback),
504
- verify_checksum_after_work(_verify_checksum_after_work),
505
- src_checksum_func_name(_src_checksum_func_name),
506
- src_checksum_hex(_src_checksum_hex),
507
- db_id(_db_id),
508
- db_session_id(_db_session_id) {}
509
- };
510
-
511
- struct BackupAfterCopyOrCreateWorkItem {
512
- std::future<CopyOrCreateResult> result;
513
- bool shared;
514
- bool needed_to_copy;
515
- Env* backup_env;
516
- std::string dst_path_tmp;
517
- std::string dst_path;
518
- std::string dst_relative;
519
- BackupAfterCopyOrCreateWorkItem()
520
- : shared(false),
521
- needed_to_copy(false),
522
- backup_env(nullptr),
523
- dst_path_tmp(""),
524
- dst_path(""),
525
- dst_relative("") {}
526
-
527
- BackupAfterCopyOrCreateWorkItem(BackupAfterCopyOrCreateWorkItem&& o)
528
- ROCKSDB_NOEXCEPT {
529
- *this = std::move(o);
530
- }
531
-
532
- BackupAfterCopyOrCreateWorkItem& operator=(
533
- BackupAfterCopyOrCreateWorkItem&& o) ROCKSDB_NOEXCEPT {
534
- result = std::move(o.result);
535
- shared = o.shared;
536
- needed_to_copy = o.needed_to_copy;
537
- backup_env = o.backup_env;
538
- dst_path_tmp = std::move(o.dst_path_tmp);
539
- dst_path = std::move(o.dst_path);
540
- dst_relative = std::move(o.dst_relative);
541
- return *this;
542
- }
543
-
544
- BackupAfterCopyOrCreateWorkItem(std::future<CopyOrCreateResult>&& _result,
545
- bool _shared, bool _needed_to_copy,
546
- Env* _backup_env, std::string _dst_path_tmp,
547
- std::string _dst_path,
548
- std::string _dst_relative)
549
- : result(std::move(_result)),
550
- shared(_shared),
551
- needed_to_copy(_needed_to_copy),
552
- backup_env(_backup_env),
553
- dst_path_tmp(std::move(_dst_path_tmp)),
554
- dst_path(std::move(_dst_path)),
555
- dst_relative(std::move(_dst_relative)) {}
556
- };
557
-
558
- struct RestoreAfterCopyOrCreateWorkItem {
559
- std::future<CopyOrCreateResult> result;
560
- std::string checksum_hex;
561
- RestoreAfterCopyOrCreateWorkItem() : checksum_hex("") {}
562
- RestoreAfterCopyOrCreateWorkItem(std::future<CopyOrCreateResult>&& _result,
563
- const std::string& _checksum_hex)
564
- : result(std::move(_result)), checksum_hex(_checksum_hex) {}
565
- RestoreAfterCopyOrCreateWorkItem(RestoreAfterCopyOrCreateWorkItem&& o)
566
- ROCKSDB_NOEXCEPT {
567
- *this = std::move(o);
568
- }
569
-
570
- RestoreAfterCopyOrCreateWorkItem& operator=(
571
- RestoreAfterCopyOrCreateWorkItem&& o) ROCKSDB_NOEXCEPT {
572
- result = std::move(o.result);
573
- checksum_hex = std::move(o.checksum_hex);
574
- return *this;
575
- }
576
- };
577
-
578
- bool initialized_;
579
- std::mutex byte_report_mutex_;
580
- channel<CopyOrCreateWorkItem> files_to_copy_or_create_;
581
- std::vector<port::Thread> threads_;
582
- std::atomic<CpuPriority> threads_cpu_priority_;
583
- // Certain operations like PurgeOldBackups and DeleteBackup will trigger
584
- // automatic GarbageCollect (true) unless we've already done one in this
585
- // session and have not failed to delete backup files since then (false).
586
- bool might_need_garbage_collect_ = true;
587
-
588
- // Adds a file to the backup work queue to be copied or created if it doesn't
589
- // already exist.
590
- //
591
- // Exactly one of src_dir and contents must be non-empty.
592
- //
593
- // @param src_dir If non-empty, the file in this directory named fname will be
594
- // copied.
595
- // @param fname Name of destination file and, in case of copy, source file.
596
- // @param contents If non-empty, the file will be created with these contents.
597
- Status AddBackupFileWorkItem(
598
- std::unordered_set<std::string>& live_dst_paths,
599
- std::vector<BackupAfterCopyOrCreateWorkItem>& backup_items_to_finish,
600
- BackupID backup_id, bool shared, const std::string& src_dir,
601
- const std::string& fname, // starts with "/"
602
- const EnvOptions& src_env_options, RateLimiter* rate_limiter,
603
- uint64_t size_bytes, uint64_t size_limit = 0,
604
- bool shared_checksum = false,
605
- std::function<void()> progress_callback = []() {},
606
- const std::string& contents = std::string(),
607
- const std::string& src_checksum_func_name = kUnknownFileChecksumFuncName,
608
- const std::string& src_checksum_str = kUnknownFileChecksum);
609
-
610
- // backup state data
611
- BackupID latest_backup_id_;
612
- BackupID latest_valid_backup_id_;
613
- std::map<BackupID, std::unique_ptr<BackupMeta>> backups_;
614
- std::map<BackupID, std::pair<Status, std::unique_ptr<BackupMeta>>>
615
- corrupt_backups_;
616
- std::unordered_map<std::string,
617
- std::shared_ptr<FileInfo>> backuped_file_infos_;
618
- std::atomic<bool> stop_backup_;
619
-
620
- // options data
621
- BackupableDBOptions options_;
622
- Env* db_env_;
623
- Env* backup_env_;
624
-
625
- // directories
626
- std::unique_ptr<Directory> backup_directory_;
627
- std::unique_ptr<Directory> shared_directory_;
628
- std::unique_ptr<Directory> meta_directory_;
629
- std::unique_ptr<Directory> private_directory_;
630
-
631
- static const size_t kDefaultCopyFileBufferSize = 5 * 1024 * 1024LL; // 5MB
632
- size_t copy_file_buffer_size_;
633
- bool read_only_;
634
- BackupStatistics backup_statistics_;
635
- static const size_t kMaxAppMetaSize = 1024 * 1024; // 1MB
636
- };
637
-
638
- Status BackupEngine::Open(const BackupableDBOptions& options, Env* env,
639
- BackupEngine** backup_engine_ptr) {
640
- std::unique_ptr<BackupEngineImpl> backup_engine(
641
- new BackupEngineImpl(options, env));
642
- auto s = backup_engine->Initialize();
643
- if (!s.ok()) {
644
- *backup_engine_ptr = nullptr;
645
- return s;
646
- }
647
- *backup_engine_ptr = backup_engine.release();
648
- return Status::OK();
649
- }
650
-
651
- BackupEngineImpl::BackupEngineImpl(const BackupableDBOptions& options,
652
- Env* db_env, bool read_only)
653
- : initialized_(false),
654
- threads_cpu_priority_(),
655
- latest_backup_id_(0),
656
- latest_valid_backup_id_(0),
657
- stop_backup_(false),
658
- options_(options),
659
- db_env_(db_env),
660
- backup_env_(options.backup_env != nullptr ? options.backup_env : db_env_),
661
- copy_file_buffer_size_(kDefaultCopyFileBufferSize),
662
- read_only_(read_only) {
663
- if (options_.backup_rate_limiter == nullptr &&
664
- options_.backup_rate_limit > 0) {
665
- options_.backup_rate_limiter.reset(
666
- NewGenericRateLimiter(options_.backup_rate_limit));
667
- }
668
- if (options_.restore_rate_limiter == nullptr &&
669
- options_.restore_rate_limit > 0) {
670
- options_.restore_rate_limiter.reset(
671
- NewGenericRateLimiter(options_.restore_rate_limit));
672
- }
673
- }
674
-
675
- BackupEngineImpl::~BackupEngineImpl() {
676
- files_to_copy_or_create_.sendEof();
677
- for (auto& t : threads_) {
678
- t.join();
679
- }
680
- LogFlush(options_.info_log);
681
- for (const auto& it : corrupt_backups_) {
682
- it.second.first.PermitUncheckedError();
683
- }
684
- }
685
-
686
- Status BackupEngineImpl::Initialize() {
687
- assert(!initialized_);
688
- initialized_ = true;
689
- if (read_only_) {
690
- ROCKS_LOG_INFO(options_.info_log, "Starting read_only backup engine");
691
- }
692
- options_.Dump(options_.info_log);
693
-
694
- if (!read_only_) {
695
- // we might need to clean up from previous crash or I/O errors
696
- might_need_garbage_collect_ = true;
697
-
698
- if (options_.max_valid_backups_to_open != port::kMaxInt32) {
699
- options_.max_valid_backups_to_open = port::kMaxInt32;
700
- ROCKS_LOG_WARN(
701
- options_.info_log,
702
- "`max_valid_backups_to_open` is not set to the default value. Ignoring "
703
- "its value since BackupEngine is not read-only.");
704
- }
705
-
706
- // gather the list of directories that we need to create
707
- std::vector<std::pair<std::string, std::unique_ptr<Directory>*>>
708
- directories;
709
- directories.emplace_back(GetAbsolutePath(), &backup_directory_);
710
- if (options_.share_table_files) {
711
- if (options_.share_files_with_checksum) {
712
- directories.emplace_back(
713
- GetAbsolutePath(GetSharedFileWithChecksumRel()),
714
- &shared_directory_);
715
- } else {
716
- directories.emplace_back(GetAbsolutePath(GetSharedFileRel()),
717
- &shared_directory_);
718
- }
719
- }
720
- directories.emplace_back(GetAbsolutePath(GetPrivateDirRel()),
721
- &private_directory_);
722
- directories.emplace_back(GetBackupMetaDir(), &meta_directory_);
723
- // create all the dirs we need
724
- for (const auto& d : directories) {
725
- auto s = backup_env_->CreateDirIfMissing(d.first);
726
- if (s.ok()) {
727
- s = backup_env_->NewDirectory(d.first, d.second);
728
- }
729
- if (!s.ok()) {
730
- return s;
731
- }
732
- }
733
- }
734
-
735
- std::vector<std::string> backup_meta_files;
736
- {
737
- auto s = backup_env_->GetChildren(GetBackupMetaDir(), &backup_meta_files);
738
- if (s.IsNotFound()) {
739
- return Status::NotFound(GetBackupMetaDir() + " is missing");
740
- } else if (!s.ok()) {
741
- return s;
742
- }
743
- }
744
- // create backups_ structure
745
- for (auto& file : backup_meta_files) {
746
- ROCKS_LOG_INFO(options_.info_log, "Detected backup %s", file.c_str());
747
- BackupID backup_id = 0;
748
- sscanf(file.c_str(), "%u", &backup_id);
749
- if (backup_id == 0 || file != ROCKSDB_NAMESPACE::ToString(backup_id)) {
750
- if (!read_only_) {
751
- // invalid file name, delete that
752
- auto s = backup_env_->DeleteFile(GetBackupMetaDir() + "/" + file);
753
- ROCKS_LOG_INFO(options_.info_log,
754
- "Unrecognized meta file %s, deleting -- %s",
755
- file.c_str(), s.ToString().c_str());
756
- }
757
- continue;
758
- }
759
- assert(backups_.find(backup_id) == backups_.end());
760
- // Insert all the (backup_id, BackupMeta) that will be loaded later
761
- // The loading performed later will check whether there are corrupt backups
762
- // and move the corrupt backups to corrupt_backups_
763
- backups_.insert(std::make_pair(
764
- backup_id, std::unique_ptr<BackupMeta>(new BackupMeta(
765
- GetBackupMetaFile(backup_id, false /* tmp */),
766
- GetBackupMetaFile(backup_id, true /* tmp */),
767
- &backuped_file_infos_, backup_env_))));
768
- }
769
-
770
- latest_backup_id_ = 0;
771
- latest_valid_backup_id_ = 0;
772
- if (options_.destroy_old_data) { // Destroy old data
773
- assert(!read_only_);
774
- ROCKS_LOG_INFO(
775
- options_.info_log,
776
- "Backup Engine started with destroy_old_data == true, deleting all "
777
- "backups");
778
- auto s = PurgeOldBackups(0);
779
- if (s.ok()) {
780
- s = GarbageCollect();
781
- }
782
- if (!s.ok()) {
783
- return s;
784
- }
785
- } else { // Load data from storage
786
- // abs_path_to_size: maps absolute paths of files in backup directory to
787
- // their corresponding sizes
788
- std::unordered_map<std::string, uint64_t> abs_path_to_size;
789
- // Insert files and their sizes in backup sub-directories (shared and
790
- // shared_checksum) to abs_path_to_size
791
- for (const auto& rel_dir :
792
- {GetSharedFileRel(), GetSharedFileWithChecksumRel()}) {
793
- const auto abs_dir = GetAbsolutePath(rel_dir);
794
- // TODO: What do do on error?
795
- InsertPathnameToSizeBytes(abs_dir, backup_env_, &abs_path_to_size)
796
- .PermitUncheckedError();
797
- }
798
- // load the backups if any, until valid_backups_to_open of the latest
799
- // non-corrupted backups have been successfully opened.
800
- int valid_backups_to_open = options_.max_valid_backups_to_open;
801
- for (auto backup_iter = backups_.rbegin();
802
- backup_iter != backups_.rend();
803
- ++backup_iter) {
804
- assert(latest_backup_id_ == 0 || latest_backup_id_ > backup_iter->first);
805
- if (latest_backup_id_ == 0) {
806
- latest_backup_id_ = backup_iter->first;
807
- }
808
- if (valid_backups_to_open == 0) {
809
- break;
810
- }
811
-
812
- // Insert files and their sizes in backup sub-directories
813
- // (private/backup_id) to abs_path_to_size
814
- Status s = InsertPathnameToSizeBytes(
815
- GetAbsolutePath(GetPrivateFileRel(backup_iter->first)), backup_env_,
816
- &abs_path_to_size);
817
- if (s.ok()) {
818
- s = backup_iter->second->LoadFromFile(options_.backup_dir,
819
- abs_path_to_size);
820
- }
821
- if (s.IsCorruption()) {
822
- ROCKS_LOG_INFO(options_.info_log, "Backup %u corrupted -- %s",
823
- backup_iter->first, s.ToString().c_str());
824
- corrupt_backups_.insert(
825
- std::make_pair(backup_iter->first,
826
- std::make_pair(s, std::move(backup_iter->second))));
827
- } else if (!s.ok()) {
828
- // Distinguish corruption errors from errors in the backup Env.
829
- // Errors in the backup Env (i.e., this code path) will cause Open() to
830
- // fail, whereas corruption errors would not cause Open() failures.
831
- return s;
832
- } else {
833
- ROCKS_LOG_INFO(options_.info_log, "Loading backup %" PRIu32 " OK:\n%s",
834
- backup_iter->first,
835
- backup_iter->second->GetInfoString().c_str());
836
- assert(latest_valid_backup_id_ == 0 ||
837
- latest_valid_backup_id_ > backup_iter->first);
838
- if (latest_valid_backup_id_ == 0) {
839
- latest_valid_backup_id_ = backup_iter->first;
840
- }
841
- --valid_backups_to_open;
842
- }
843
- }
844
-
845
- for (const auto& corrupt : corrupt_backups_) {
846
- backups_.erase(backups_.find(corrupt.first));
847
- }
848
- // erase the backups before max_valid_backups_to_open
849
- int num_unopened_backups;
850
- if (options_.max_valid_backups_to_open == 0) {
851
- num_unopened_backups = 0;
852
- } else {
853
- num_unopened_backups =
854
- std::max(0, static_cast<int>(backups_.size()) -
855
- options_.max_valid_backups_to_open);
856
- }
857
- for (int i = 0; i < num_unopened_backups; ++i) {
858
- assert(backups_.begin()->second->Empty());
859
- backups_.erase(backups_.begin());
860
- }
861
- }
862
-
863
- ROCKS_LOG_INFO(options_.info_log, "Latest backup is %u", latest_backup_id_);
864
- ROCKS_LOG_INFO(options_.info_log, "Latest valid backup is %u",
865
- latest_valid_backup_id_);
866
-
867
- // set up threads perform copies from files_to_copy_or_create_ in the
868
- // background
869
- threads_cpu_priority_ = CpuPriority::kNormal;
870
- threads_.reserve(options_.max_background_operations);
871
- for (int t = 0; t < options_.max_background_operations; t++) {
872
- threads_.emplace_back([this]() {
873
- #if defined(_GNU_SOURCE) && defined(__GLIBC_PREREQ)
874
- #if __GLIBC_PREREQ(2, 12)
875
- pthread_setname_np(pthread_self(), "backup_engine");
876
- #endif
877
- #endif
878
- CpuPriority current_priority = CpuPriority::kNormal;
879
- CopyOrCreateWorkItem work_item;
880
- while (files_to_copy_or_create_.read(work_item)) {
881
- CpuPriority priority = threads_cpu_priority_;
882
- if (current_priority != priority) {
883
- TEST_SYNC_POINT_CALLBACK(
884
- "BackupEngineImpl::Initialize:SetCpuPriority", &priority);
885
- port::SetCpuPriority(0, priority);
886
- current_priority = priority;
887
- }
888
- CopyOrCreateResult result;
889
- result.status = CopyOrCreateFile(
890
- work_item.src_path, work_item.dst_path, work_item.contents,
891
- work_item.src_env, work_item.dst_env, work_item.src_env_options,
892
- work_item.sync, work_item.rate_limiter, &result.size,
893
- &result.checksum_hex, work_item.size_limit,
894
- work_item.progress_callback);
895
- result.db_id = work_item.db_id;
896
- result.db_session_id = work_item.db_session_id;
897
- if (result.status.ok() && work_item.verify_checksum_after_work) {
898
- // unknown checksum function name implies no db table file checksum in
899
- // db manifest; work_item.verify_checksum_after_work being true means
900
- // backup engine has calculated its crc32c checksum for the table
901
- // file; therefore, we are able to compare the checksums.
902
- if (work_item.src_checksum_func_name ==
903
- kUnknownFileChecksumFuncName ||
904
- work_item.src_checksum_func_name == kDbFileChecksumFuncName) {
905
- if (work_item.src_checksum_hex != result.checksum_hex) {
906
- std::string checksum_info(
907
- "Expected checksum is " + work_item.src_checksum_hex +
908
- " while computed checksum is " + result.checksum_hex);
909
- result.status =
910
- Status::Corruption("Checksum mismatch after copying to " +
911
- work_item.dst_path + ": " + checksum_info);
912
- }
913
- } else {
914
- std::string checksum_function_info(
915
- "Existing checksum function is " +
916
- work_item.src_checksum_func_name +
917
- " while provided checksum function is " +
918
- kBackupFileChecksumFuncName);
919
- ROCKS_LOG_INFO(
920
- options_.info_log,
921
- "Unable to verify checksum after copying to %s: %s\n",
922
- work_item.dst_path.c_str(), checksum_function_info.c_str());
923
- }
924
- }
925
- work_item.result.set_value(std::move(result));
926
- }
927
- });
928
- }
929
- ROCKS_LOG_INFO(options_.info_log, "Initialized BackupEngine");
930
-
931
- return Status::OK();
932
- }
933
-
934
- Status BackupEngineImpl::CreateNewBackupWithMetadata(
935
- const CreateBackupOptions& options, DB* db,
936
- const std::string& app_metadata) {
937
- assert(initialized_);
938
- assert(!read_only_);
939
- if (app_metadata.size() > kMaxAppMetaSize) {
940
- return Status::InvalidArgument("App metadata too large");
941
- }
942
-
943
- if (options.decrease_background_thread_cpu_priority) {
944
- if (options.background_thread_cpu_priority < threads_cpu_priority_) {
945
- threads_cpu_priority_.store(options.background_thread_cpu_priority);
946
- }
947
- }
948
-
949
- BackupID new_backup_id = latest_backup_id_ + 1;
950
-
951
- assert(backups_.find(new_backup_id) == backups_.end());
952
-
953
- auto private_dir = GetAbsolutePath(GetPrivateFileRel(new_backup_id));
954
- Status s = backup_env_->FileExists(private_dir);
955
- if (s.ok()) {
956
- // maybe last backup failed and left partial state behind, clean it up.
957
- // need to do this before updating backups_ such that a private dir
958
- // named after new_backup_id will be cleaned up.
959
- // (If an incomplete new backup is followed by an incomplete delete
960
- // of the latest full backup, then there could be more than one next
961
- // id with a private dir, the last thing to be deleted in delete
962
- // backup, but all will be cleaned up with a GarbageCollect.)
963
- s = GarbageCollect();
964
- } else if (s.IsNotFound()) {
965
- // normal case, the new backup's private dir doesn't exist yet
966
- s = Status::OK();
967
- }
968
-
969
- auto ret = backups_.insert(std::make_pair(
970
- new_backup_id, std::unique_ptr<BackupMeta>(new BackupMeta(
971
- GetBackupMetaFile(new_backup_id, false /* tmp */),
972
- GetBackupMetaFile(new_backup_id, true /* tmp */),
973
- &backuped_file_infos_, backup_env_))));
974
- assert(ret.second == true);
975
- auto& new_backup = ret.first->second;
976
- // TODO: What should we do on error here?
977
- new_backup->RecordTimestamp().PermitUncheckedError();
978
- new_backup->SetAppMetadata(app_metadata);
979
-
980
- auto start_backup = backup_env_->NowMicros();
981
-
982
- ROCKS_LOG_INFO(options_.info_log,
983
- "Started the backup process -- creating backup %u",
984
- new_backup_id);
985
- if (s.ok()) {
986
- s = backup_env_->CreateDir(private_dir);
987
- }
988
-
989
- RateLimiter* rate_limiter = options_.backup_rate_limiter.get();
990
- if (rate_limiter) {
991
- copy_file_buffer_size_ = static_cast<size_t>(rate_limiter->GetSingleBurstBytes());
992
- }
993
-
994
- // A set into which we will insert the dst_paths that are calculated for live
995
- // files and live WAL files.
996
- // This is used to check whether a live files shares a dst_path with another
997
- // live file.
998
- std::unordered_set<std::string> live_dst_paths;
999
-
1000
- std::vector<BackupAfterCopyOrCreateWorkItem> backup_items_to_finish;
1001
- // Add a CopyOrCreateWorkItem to the channel for each live file
1002
- Status disabled = db->DisableFileDeletions();
1003
- if (s.ok()) {
1004
- CheckpointImpl checkpoint(db);
1005
- uint64_t sequence_number = 0;
1006
- DBOptions db_options = db->GetDBOptions();
1007
- FileChecksumGenFactory* db_checksum_factory =
1008
- db_options.file_checksum_gen_factory.get();
1009
- const std::string kFileChecksumGenFactoryName =
1010
- "FileChecksumGenCrc32cFactory";
1011
- bool compare_checksum =
1012
- db_checksum_factory != nullptr &&
1013
- db_checksum_factory->Name() == kFileChecksumGenFactoryName
1014
- ? true
1015
- : false;
1016
- EnvOptions src_raw_env_options(db_options);
1017
- s = checkpoint.CreateCustomCheckpoint(
1018
- db_options,
1019
- [&](const std::string& /*src_dirname*/, const std::string& /*fname*/,
1020
- FileType) {
1021
- // custom checkpoint will switch to calling copy_file_cb after it sees
1022
- // NotSupported returned from link_file_cb.
1023
- return Status::NotSupported();
1024
- } /* link_file_cb */,
1025
- [&](const std::string& src_dirname, const std::string& fname,
1026
- uint64_t size_limit_bytes, FileType type,
1027
- const std::string& checksum_func_name,
1028
- const std::string& checksum_val) {
1029
- if (type == kWalFile && !options_.backup_log_files) {
1030
- return Status::OK();
1031
- }
1032
- Log(options_.info_log, "add file for backup %s", fname.c_str());
1033
- uint64_t size_bytes = 0;
1034
- Status st;
1035
- if (type == kTableFile) {
1036
- st = db_env_->GetFileSize(src_dirname + fname, &size_bytes);
1037
- }
1038
- EnvOptions src_env_options;
1039
- switch (type) {
1040
- case kWalFile:
1041
- src_env_options =
1042
- db_env_->OptimizeForLogRead(src_raw_env_options);
1043
- break;
1044
- case kTableFile:
1045
- src_env_options = db_env_->OptimizeForCompactionTableRead(
1046
- src_raw_env_options, ImmutableDBOptions(db_options));
1047
- break;
1048
- case kDescriptorFile:
1049
- src_env_options =
1050
- db_env_->OptimizeForManifestRead(src_raw_env_options);
1051
- break;
1052
- default:
1053
- // Other backed up files (like options file) are not read by live
1054
- // DB, so don't need to worry about avoiding mixing buffered and
1055
- // direct I/O. Just use plain defaults.
1056
- src_env_options = src_raw_env_options;
1057
- break;
1058
- }
1059
- if (st.ok()) {
1060
- st = AddBackupFileWorkItem(
1061
- live_dst_paths, backup_items_to_finish, new_backup_id,
1062
- options_.share_table_files && type == kTableFile, src_dirname,
1063
- fname, src_env_options, rate_limiter, size_bytes,
1064
- size_limit_bytes,
1065
- options_.share_files_with_checksum && type == kTableFile,
1066
- options.progress_callback, "" /* contents */,
1067
- checksum_func_name, checksum_val);
1068
- }
1069
- return st;
1070
- } /* copy_file_cb */,
1071
- [&](const std::string& fname, const std::string& contents, FileType) {
1072
- Log(options_.info_log, "add file for backup %s", fname.c_str());
1073
- return AddBackupFileWorkItem(
1074
- live_dst_paths, backup_items_to_finish, new_backup_id,
1075
- false /* shared */, "" /* src_dir */, fname,
1076
- EnvOptions() /* src_env_options */, rate_limiter, contents.size(),
1077
- 0 /* size_limit */, false /* shared_checksum */,
1078
- options.progress_callback, contents);
1079
- } /* create_file_cb */,
1080
- &sequence_number, options.flush_before_backup ? 0 : port::kMaxUint64,
1081
- compare_checksum);
1082
- if (s.ok()) {
1083
- new_backup->SetSequenceNumber(sequence_number);
1084
- }
1085
- }
1086
- ROCKS_LOG_INFO(options_.info_log, "add files for backup done, wait finish.");
1087
- Status item_status;
1088
- for (auto& item : backup_items_to_finish) {
1089
- item.result.wait();
1090
- auto result = item.result.get();
1091
- item_status = result.status;
1092
- if (item_status.ok() && item.shared && item.needed_to_copy) {
1093
- item_status =
1094
- item.backup_env->RenameFile(item.dst_path_tmp, item.dst_path);
1095
- }
1096
- if (item_status.ok()) {
1097
- item_status = new_backup.get()->AddFile(std::make_shared<FileInfo>(
1098
- item.dst_relative, result.size, result.checksum_hex, result.db_id,
1099
- result.db_session_id));
1100
- }
1101
- if (!item_status.ok()) {
1102
- s = item_status;
1103
- }
1104
- }
1105
-
1106
- // we copied all the files, enable file deletions
1107
- if (disabled.ok()) { // If we successfully disabled file deletions
1108
- db->EnableFileDeletions(false).PermitUncheckedError();
1109
- }
1110
- auto backup_time = backup_env_->NowMicros() - start_backup;
1111
-
1112
- if (s.ok()) {
1113
- // persist the backup metadata on the disk
1114
- s = new_backup->StoreToFile(options_.sync);
1115
- }
1116
- if (s.ok() && options_.sync) {
1117
- std::unique_ptr<Directory> backup_private_directory;
1118
- backup_env_->NewDirectory(
1119
- GetAbsolutePath(GetPrivateFileRel(new_backup_id, false)),
1120
- &backup_private_directory);
1121
- if (backup_private_directory != nullptr) {
1122
- s = backup_private_directory->Fsync();
1123
- }
1124
- if (s.ok() && private_directory_ != nullptr) {
1125
- s = private_directory_->Fsync();
1126
- }
1127
- if (s.ok() && meta_directory_ != nullptr) {
1128
- s = meta_directory_->Fsync();
1129
- }
1130
- if (s.ok() && shared_directory_ != nullptr) {
1131
- s = shared_directory_->Fsync();
1132
- }
1133
- if (s.ok() && backup_directory_ != nullptr) {
1134
- s = backup_directory_->Fsync();
1135
- }
1136
- }
1137
-
1138
- if (s.ok()) {
1139
- backup_statistics_.IncrementNumberSuccessBackup();
1140
- }
1141
- if (!s.ok()) {
1142
- backup_statistics_.IncrementNumberFailBackup();
1143
- // clean all the files we might have created
1144
- ROCKS_LOG_INFO(options_.info_log, "Backup failed -- %s",
1145
- s.ToString().c_str());
1146
- ROCKS_LOG_INFO(options_.info_log, "Backup Statistics %s\n",
1147
- backup_statistics_.ToString().c_str());
1148
- // delete files that we might have already written
1149
- might_need_garbage_collect_ = true;
1150
- DeleteBackup(new_backup_id).PermitUncheckedError();
1151
- return s;
1152
- }
1153
-
1154
- // here we know that we succeeded and installed the new backup
1155
- // in the LATEST_BACKUP file
1156
- latest_backup_id_ = new_backup_id;
1157
- latest_valid_backup_id_ = new_backup_id;
1158
- ROCKS_LOG_INFO(options_.info_log, "Backup DONE. All is good");
1159
-
1160
- // backup_speed is in byte/second
1161
- double backup_speed = new_backup->GetSize() / (1.048576 * backup_time);
1162
- ROCKS_LOG_INFO(options_.info_log, "Backup number of files: %u",
1163
- new_backup->GetNumberFiles());
1164
- char human_size[16];
1165
- AppendHumanBytes(new_backup->GetSize(), human_size, sizeof(human_size));
1166
- ROCKS_LOG_INFO(options_.info_log, "Backup size: %s", human_size);
1167
- ROCKS_LOG_INFO(options_.info_log, "Backup time: %" PRIu64 " microseconds",
1168
- backup_time);
1169
- ROCKS_LOG_INFO(options_.info_log, "Backup speed: %.3f MB/s", backup_speed);
1170
- ROCKS_LOG_INFO(options_.info_log, "Backup Statistics %s",
1171
- backup_statistics_.ToString().c_str());
1172
- return s;
1173
- }
1174
-
1175
- Status BackupEngineImpl::PurgeOldBackups(uint32_t num_backups_to_keep) {
1176
- assert(initialized_);
1177
- assert(!read_only_);
1178
-
1179
- // Best effort deletion even with errors
1180
- Status overall_status = Status::OK();
1181
-
1182
- ROCKS_LOG_INFO(options_.info_log, "Purging old backups, keeping %u",
1183
- num_backups_to_keep);
1184
- std::vector<BackupID> to_delete;
1185
- auto itr = backups_.begin();
1186
- while ((backups_.size() - to_delete.size()) > num_backups_to_keep) {
1187
- to_delete.push_back(itr->first);
1188
- itr++;
1189
- }
1190
- for (auto backup_id : to_delete) {
1191
- auto s = DeleteBackupInternal(backup_id);
1192
- if (!s.ok()) {
1193
- overall_status = s;
1194
- }
1195
- }
1196
- // Clean up after any incomplete backup deletion, potentially from
1197
- // earlier session.
1198
- if (might_need_garbage_collect_) {
1199
- auto s = GarbageCollect();
1200
- if (!s.ok() && overall_status.ok()) {
1201
- overall_status = s;
1202
- }
1203
- }
1204
- return overall_status;
1205
- }
1206
-
1207
- Status BackupEngineImpl::DeleteBackup(BackupID backup_id) {
1208
- auto s1 = DeleteBackupInternal(backup_id);
1209
- auto s2 = Status::OK();
1210
-
1211
- // Clean up after any incomplete backup deletion, potentially from
1212
- // earlier session.
1213
- if (might_need_garbage_collect_) {
1214
- s2 = GarbageCollect();
1215
- }
1216
-
1217
- if (!s1.ok()) {
1218
- s2.PermitUncheckedError(); // What to do?
1219
- return s1;
1220
- } else {
1221
- return s2;
1222
- }
1223
- }
1224
-
1225
- // Does not auto-GarbageCollect
1226
- Status BackupEngineImpl::DeleteBackupInternal(BackupID backup_id) {
1227
- assert(initialized_);
1228
- assert(!read_only_);
1229
-
1230
- ROCKS_LOG_INFO(options_.info_log, "Deleting backup %u", backup_id);
1231
- auto backup = backups_.find(backup_id);
1232
- if (backup != backups_.end()) {
1233
- auto s = backup->second->Delete();
1234
- if (!s.ok()) {
1235
- return s;
1236
- }
1237
- backups_.erase(backup);
1238
- } else {
1239
- auto corrupt = corrupt_backups_.find(backup_id);
1240
- if (corrupt == corrupt_backups_.end()) {
1241
- return Status::NotFound("Backup not found");
1242
- }
1243
- auto s = corrupt->second.second->Delete();
1244
- if (!s.ok()) {
1245
- return s;
1246
- }
1247
- corrupt->second.first.PermitUncheckedError();
1248
- corrupt_backups_.erase(corrupt);
1249
- }
1250
-
1251
- // After removing meta file, best effort deletion even with errors.
1252
- // (Don't delete other files if we can't delete the meta file right
1253
- // now.)
1254
- std::vector<std::string> to_delete;
1255
- for (auto& itr : backuped_file_infos_) {
1256
- if (itr.second->refs == 0) {
1257
- Status s = backup_env_->DeleteFile(GetAbsolutePath(itr.first));
1258
- ROCKS_LOG_INFO(options_.info_log, "Deleting %s -- %s", itr.first.c_str(),
1259
- s.ToString().c_str());
1260
- to_delete.push_back(itr.first);
1261
- if (!s.ok()) {
1262
- // Trying again later might work
1263
- might_need_garbage_collect_ = true;
1264
- }
1265
- }
1266
- }
1267
- for (auto& td : to_delete) {
1268
- backuped_file_infos_.erase(td);
1269
- }
1270
-
1271
- // take care of private dirs -- GarbageCollect() will take care of them
1272
- // if they are not empty
1273
- std::string private_dir = GetPrivateFileRel(backup_id);
1274
- Status s = backup_env_->DeleteDir(GetAbsolutePath(private_dir));
1275
- ROCKS_LOG_INFO(options_.info_log, "Deleting private dir %s -- %s",
1276
- private_dir.c_str(), s.ToString().c_str());
1277
- if (!s.ok()) {
1278
- // Full gc or trying again later might work
1279
- might_need_garbage_collect_ = true;
1280
- }
1281
- return Status::OK();
1282
- }
1283
-
1284
- void BackupEngineImpl::GetBackupInfo(std::vector<BackupInfo>* backup_info) {
1285
- assert(initialized_);
1286
- backup_info->reserve(backups_.size());
1287
- for (auto& backup : backups_) {
1288
- if (!backup.second->Empty()) {
1289
- backup_info->push_back(BackupInfo(
1290
- backup.first, backup.second->GetTimestamp(), backup.second->GetSize(),
1291
- backup.second->GetNumberFiles(), backup.second->GetAppMetadata()));
1292
- }
1293
- }
1294
- }
1295
-
1296
- void
1297
- BackupEngineImpl::GetCorruptedBackups(
1298
- std::vector<BackupID>* corrupt_backup_ids) {
1299
- assert(initialized_);
1300
- corrupt_backup_ids->reserve(corrupt_backups_.size());
1301
- for (auto& backup : corrupt_backups_) {
1302
- corrupt_backup_ids->push_back(backup.first);
1303
- }
1304
- }
1305
-
1306
- Status BackupEngineImpl::RestoreDBFromBackup(const RestoreOptions& options,
1307
- BackupID backup_id,
1308
- const std::string& db_dir,
1309
- const std::string& wal_dir) {
1310
- assert(initialized_);
1311
- auto corrupt_itr = corrupt_backups_.find(backup_id);
1312
- if (corrupt_itr != corrupt_backups_.end()) {
1313
- return corrupt_itr->second.first;
1314
- }
1315
- auto backup_itr = backups_.find(backup_id);
1316
- if (backup_itr == backups_.end()) {
1317
- return Status::NotFound("Backup not found");
1318
- }
1319
- auto& backup = backup_itr->second;
1320
- if (backup->Empty()) {
1321
- return Status::NotFound("Backup not found");
1322
- }
1323
-
1324
- ROCKS_LOG_INFO(options_.info_log, "Restoring backup id %u\n", backup_id);
1325
- ROCKS_LOG_INFO(options_.info_log, "keep_log_files: %d\n",
1326
- static_cast<int>(options.keep_log_files));
1327
-
1328
- // just in case. Ignore errors
1329
- db_env_->CreateDirIfMissing(db_dir).PermitUncheckedError();
1330
- db_env_->CreateDirIfMissing(wal_dir).PermitUncheckedError();
1331
-
1332
- if (options.keep_log_files) {
1333
- // delete files in db_dir, but keep all the log files
1334
- DeleteChildren(db_dir, 1 << kWalFile);
1335
- // move all the files from archive dir to wal_dir
1336
- std::string archive_dir = ArchivalDirectory(wal_dir);
1337
- std::vector<std::string> archive_files;
1338
- db_env_->GetChildren(archive_dir, &archive_files)
1339
- .PermitUncheckedError(); // ignore errors
1340
- for (const auto& f : archive_files) {
1341
- uint64_t number;
1342
- FileType type;
1343
- bool ok = ParseFileName(f, &number, &type);
1344
- if (ok && type == kWalFile) {
1345
- ROCKS_LOG_INFO(options_.info_log,
1346
- "Moving log file from archive/ to wal_dir: %s",
1347
- f.c_str());
1348
- Status s =
1349
- db_env_->RenameFile(archive_dir + "/" + f, wal_dir + "/" + f);
1350
- if (!s.ok()) {
1351
- // if we can't move log file from archive_dir to wal_dir,
1352
- // we should fail, since it might mean data loss
1353
- return s;
1354
- }
1355
- }
1356
- }
1357
- } else {
1358
- DeleteChildren(wal_dir);
1359
- DeleteChildren(ArchivalDirectory(wal_dir));
1360
- DeleteChildren(db_dir);
1361
- }
1362
-
1363
- RateLimiter* rate_limiter = options_.restore_rate_limiter.get();
1364
- if (rate_limiter) {
1365
- copy_file_buffer_size_ =
1366
- static_cast<size_t>(rate_limiter->GetSingleBurstBytes());
1367
- }
1368
- Status s;
1369
- std::vector<RestoreAfterCopyOrCreateWorkItem> restore_items_to_finish;
1370
- for (const auto& file_info : backup->GetFiles()) {
1371
- const std::string& file = file_info->filename;
1372
- std::string dst;
1373
- // 1. extract the filename
1374
- size_t slash = file.find_last_of('/');
1375
- // file will either be shared/<file>, shared_checksum/<file_crc32c_size>,
1376
- // shared_checksum/<file_session>, shared_checksum/<file_crc32c_session>,
1377
- // or private/<number>/<file>
1378
- assert(slash != std::string::npos);
1379
- dst = file.substr(slash + 1);
1380
-
1381
- // if the file was in shared_checksum, extract the real file name
1382
- // in this case the file is <number>_<checksum>_<size>.<type>,
1383
- // <number>_<session>.<type>, or <number>_<checksum>_<session>.<type>
1384
- if (file.substr(0, slash) == GetSharedChecksumDirRel()) {
1385
- dst = GetFileFromChecksumFile(dst);
1386
- }
1387
-
1388
- // 2. find the filetype
1389
- uint64_t number;
1390
- FileType type;
1391
- bool ok = ParseFileName(dst, &number, &type);
1392
- if (!ok) {
1393
- return Status::Corruption("Backup corrupted: Fail to parse filename " +
1394
- dst);
1395
- }
1396
- // 3. Construct the final path
1397
- // kWalFile lives in wal_dir and all the rest live in db_dir
1398
- dst = ((type == kWalFile) ? wal_dir : db_dir) + "/" + dst;
1399
-
1400
- ROCKS_LOG_INFO(options_.info_log, "Restoring %s to %s\n", file.c_str(),
1401
- dst.c_str());
1402
- CopyOrCreateWorkItem copy_or_create_work_item(
1403
- GetAbsolutePath(file), dst, "" /* contents */, backup_env_, db_env_,
1404
- EnvOptions() /* src_env_options */, false, rate_limiter,
1405
- 0 /* size_limit */);
1406
- RestoreAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
1407
- copy_or_create_work_item.result.get_future(), file_info->checksum_hex);
1408
- files_to_copy_or_create_.write(std::move(copy_or_create_work_item));
1409
- restore_items_to_finish.push_back(
1410
- std::move(after_copy_or_create_work_item));
1411
- }
1412
- Status item_status;
1413
- for (auto& item : restore_items_to_finish) {
1414
- item.result.wait();
1415
- auto result = item.result.get();
1416
- item_status = result.status;
1417
- // Note: It is possible that both of the following bad-status cases occur
1418
- // during copying. But, we only return one status.
1419
- if (!item_status.ok()) {
1420
- s = item_status;
1421
- break;
1422
- } else if (item.checksum_hex != result.checksum_hex) {
1423
- s = Status::Corruption("Checksum check failed");
1424
- break;
1425
- }
1426
- }
1427
-
1428
- ROCKS_LOG_INFO(options_.info_log, "Restoring done -- %s\n",
1429
- s.ToString().c_str());
1430
- return s;
1431
- }
1432
-
1433
- Status BackupEngineImpl::VerifyBackup(BackupID backup_id,
1434
- bool verify_with_checksum) {
1435
- // Check if backup_id is corrupted, or valid and registered
1436
- assert(initialized_);
1437
- auto corrupt_itr = corrupt_backups_.find(backup_id);
1438
- if (corrupt_itr != corrupt_backups_.end()) {
1439
- return corrupt_itr->second.first;
1440
- }
1441
-
1442
- auto backup_itr = backups_.find(backup_id);
1443
- if (backup_itr == backups_.end()) {
1444
- return Status::NotFound();
1445
- }
1446
-
1447
- auto& backup = backup_itr->second;
1448
- if (backup->Empty()) {
1449
- return Status::NotFound();
1450
- }
1451
-
1452
- ROCKS_LOG_INFO(options_.info_log, "Verifying backup id %u\n", backup_id);
1453
-
1454
- // Find all existing backup files belong to backup_id
1455
- std::unordered_map<std::string, uint64_t> curr_abs_path_to_size;
1456
- for (const auto& rel_dir : {GetPrivateFileRel(backup_id), GetSharedFileRel(),
1457
- GetSharedFileWithChecksumRel()}) {
1458
- const auto abs_dir = GetAbsolutePath(rel_dir);
1459
- // TODO: What to do on error?
1460
- InsertPathnameToSizeBytes(abs_dir, backup_env_, &curr_abs_path_to_size)
1461
- .PermitUncheckedError();
1462
- }
1463
-
1464
- // For all files registered in backup
1465
- for (const auto& file_info : backup->GetFiles()) {
1466
- const auto abs_path = GetAbsolutePath(file_info->filename);
1467
- // check existence of the file
1468
- if (curr_abs_path_to_size.find(abs_path) == curr_abs_path_to_size.end()) {
1469
- return Status::NotFound("File missing: " + abs_path);
1470
- }
1471
- // verify file size
1472
- if (file_info->size != curr_abs_path_to_size[abs_path]) {
1473
- std::string size_info("Expected file size is " +
1474
- ToString(file_info->size) +
1475
- " while found file size is " +
1476
- ToString(curr_abs_path_to_size[abs_path]));
1477
- return Status::Corruption("File corrupted: File size mismatch for " +
1478
- abs_path + ": " + size_info);
1479
- }
1480
- if (verify_with_checksum) {
1481
- // verify file checksum
1482
- std::string checksum_hex;
1483
- ROCKS_LOG_INFO(options_.info_log, "Verifying %s checksum...\n",
1484
- abs_path.c_str());
1485
- Status s = ReadFileAndComputeChecksum(abs_path, backup_env_, EnvOptions(),
1486
- 0 /* size_limit */, &checksum_hex);
1487
- if (!s.ok()) {
1488
- return s;
1489
- } else if (file_info->checksum_hex != checksum_hex) {
1490
- std::string checksum_info(
1491
- "Expected checksum is " + file_info->checksum_hex +
1492
- " while computed checksum is " + checksum_hex);
1493
- return Status::Corruption("File corrupted: Checksum mismatch for " +
1494
- abs_path + ": " + checksum_info);
1495
- }
1496
- }
1497
- }
1498
- return Status::OK();
1499
- }
1500
-
1501
- Status BackupEngineImpl::CopyOrCreateFile(
1502
- const std::string& src, const std::string& dst, const std::string& contents,
1503
- Env* src_env, Env* dst_env, const EnvOptions& src_env_options, bool sync,
1504
- RateLimiter* rate_limiter, uint64_t* size, std::string* checksum_hex,
1505
- uint64_t size_limit, std::function<void()> progress_callback) {
1506
- assert(src.empty() != contents.empty());
1507
- Status s;
1508
- std::unique_ptr<WritableFile> dst_file;
1509
- std::unique_ptr<SequentialFile> src_file;
1510
- EnvOptions dst_env_options;
1511
- dst_env_options.use_mmap_writes = false;
1512
- // TODO:(gzh) maybe use direct reads/writes here if possible
1513
- if (size != nullptr) {
1514
- *size = 0;
1515
- }
1516
- uint32_t checksum_value = 0;
1517
-
1518
- // Check if size limit is set. if not, set it to very big number
1519
- if (size_limit == 0) {
1520
- size_limit = std::numeric_limits<uint64_t>::max();
1521
- }
1522
-
1523
- s = dst_env->NewWritableFile(dst, &dst_file, dst_env_options);
1524
- if (s.ok() && !src.empty()) {
1525
- s = src_env->NewSequentialFile(src, &src_file, src_env_options);
1526
- }
1527
- if (!s.ok()) {
1528
- return s;
1529
- }
1530
-
1531
- std::unique_ptr<WritableFileWriter> dest_writer(new WritableFileWriter(
1532
- NewLegacyWritableFileWrapper(std::move(dst_file)), dst, dst_env_options));
1533
- std::unique_ptr<SequentialFileReader> src_reader;
1534
- std::unique_ptr<char[]> buf;
1535
- if (!src.empty()) {
1536
- src_reader.reset(new SequentialFileReader(
1537
- NewLegacySequentialFileWrapper(src_file), src));
1538
- buf.reset(new char[copy_file_buffer_size_]);
1539
- }
1540
-
1541
- Slice data;
1542
- uint64_t processed_buffer_size = 0;
1543
- do {
1544
- if (stop_backup_.load(std::memory_order_acquire)) {
1545
- return Status::Incomplete("Backup stopped");
1546
- }
1547
- if (!src.empty()) {
1548
- size_t buffer_to_read = (copy_file_buffer_size_ < size_limit)
1549
- ? copy_file_buffer_size_
1550
- : static_cast<size_t>(size_limit);
1551
- s = src_reader->Read(buffer_to_read, &data, buf.get());
1552
- processed_buffer_size += buffer_to_read;
1553
- } else {
1554
- data = contents;
1555
- }
1556
- size_limit -= data.size();
1557
- TEST_SYNC_POINT_CALLBACK(
1558
- "BackupEngineImpl::CopyOrCreateFile:CorruptionDuringBackup",
1559
- (src.length() > 4 && src.rfind(".sst") == src.length() - 4) ? &data
1560
- : nullptr);
1561
-
1562
- if (!s.ok()) {
1563
- return s;
1564
- }
1565
-
1566
- if (size != nullptr) {
1567
- *size += data.size();
1568
- }
1569
- if (checksum_hex != nullptr) {
1570
- checksum_value = crc32c::Extend(checksum_value, data.data(), data.size());
1571
- }
1572
- s = dest_writer->Append(data);
1573
- if (rate_limiter != nullptr) {
1574
- rate_limiter->Request(data.size(), Env::IO_LOW, nullptr /* stats */,
1575
- RateLimiter::OpType::kWrite);
1576
- }
1577
- if (processed_buffer_size > options_.callback_trigger_interval_size) {
1578
- processed_buffer_size -= options_.callback_trigger_interval_size;
1579
- std::lock_guard<std::mutex> lock(byte_report_mutex_);
1580
- progress_callback();
1581
- }
1582
- } while (s.ok() && contents.empty() && data.size() > 0 && size_limit > 0);
1583
-
1584
- // Convert uint32_t checksum to hex checksum
1585
- if (checksum_hex != nullptr) {
1586
- checksum_hex->assign(ChecksumInt32ToHex(checksum_value));
1587
- }
1588
-
1589
- if (s.ok() && sync) {
1590
- s = dest_writer->Sync(false);
1591
- }
1592
- if (s.ok()) {
1593
- s = dest_writer->Close();
1594
- }
1595
- return s;
1596
- }
1597
-
1598
- // fname will always start with "/"
1599
- Status BackupEngineImpl::AddBackupFileWorkItem(
1600
- std::unordered_set<std::string>& live_dst_paths,
1601
- std::vector<BackupAfterCopyOrCreateWorkItem>& backup_items_to_finish,
1602
- BackupID backup_id, bool shared, const std::string& src_dir,
1603
- const std::string& fname, const EnvOptions& src_env_options,
1604
- RateLimiter* rate_limiter, uint64_t size_bytes, uint64_t size_limit,
1605
- bool shared_checksum, std::function<void()> progress_callback,
1606
- const std::string& contents, const std::string& src_checksum_func_name,
1607
- const std::string& src_checksum_str) {
1608
- assert(!fname.empty() && fname[0] == '/');
1609
- assert(contents.empty() != src_dir.empty());
1610
-
1611
- std::string dst_relative = fname.substr(1);
1612
- std::string dst_relative_tmp;
1613
- std::string checksum_hex;
1614
- std::string db_id;
1615
- std::string db_session_id;
1616
- // whether the checksum for a table file is available
1617
- bool has_checksum = false;
1618
-
1619
- // Whenever a default checksum function name is passed in, we will compares
1620
- // the corresponding checksum values after copying. Note that only table files
1621
- // may have a known checksum function name passed in.
1622
- //
1623
- // If no default checksum function name is passed in and db session id is not
1624
- // available, we will calculate the checksum *before* copying in two cases
1625
- // (we always calcuate checksums when copying or creating for any file types):
1626
- // a) share_files_with_checksum is true and file type is table;
1627
- // b) share_table_files is true and the file exists already.
1628
- //
1629
- // Step 0: Check if default checksum function name is passed in
1630
- if (kDbFileChecksumFuncName == src_checksum_func_name) {
1631
- if (src_checksum_str == kUnknownFileChecksum) {
1632
- return Status::Aborted("Unknown checksum value for " + fname);
1633
- }
1634
- checksum_hex = ChecksumStrToHex(src_checksum_str);
1635
- has_checksum = true;
1636
- }
1637
-
1638
- // Step 1: Prepare the relative path to destination
1639
- if (shared && shared_checksum) {
1640
- if (GetNamingNoFlags() != BackupableDBOptions::kLegacyCrc32cAndFileSize) {
1641
- // Prepare db_session_id to add to the file name
1642
- // Ignore the returned status
1643
- // In the failed cases, db_id and db_session_id will be empty
1644
- GetFileDbIdentities(db_env_, src_env_options, src_dir + fname, &db_id,
1645
- &db_session_id)
1646
- .PermitUncheckedError();
1647
- }
1648
- // Calculate checksum if checksum and db session id are not available.
1649
- // If db session id is available, we will not calculate the checksum
1650
- // since the session id should suffice to avoid file name collision in
1651
- // the shared_checksum directory.
1652
- if (!has_checksum && db_session_id.empty()) {
1653
- Status s = ReadFileAndComputeChecksum(
1654
- src_dir + fname, db_env_, src_env_options, size_limit, &checksum_hex);
1655
- if (!s.ok()) {
1656
- return s;
1657
- }
1658
- has_checksum = true;
1659
- }
1660
- if (size_bytes == port::kMaxUint64) {
1661
- return Status::NotFound("File missing: " + src_dir + fname);
1662
- }
1663
- // dst_relative depends on the following conditions:
1664
- // 1) the naming scheme is kUseDbSessionId,
1665
- // 2) db_session_id is not empty,
1666
- // 3) checksum is available in the DB manifest.
1667
- // If 1,2,3) are satisfied, then dst_relative will be of the form:
1668
- // shared_checksum/<file_number>_<checksum>_<db_session_id>.sst
1669
- // If 1,2) are satisfied, then dst_relative will be of the form:
1670
- // shared_checksum/<file_number>_<db_session_id>.sst
1671
- // Otherwise, dst_relative is of the form
1672
- // shared_checksum/<file_number>_<checksum>_<size>.sst
1673
- dst_relative = GetSharedFileWithChecksum(
1674
- dst_relative, has_checksum, checksum_hex, size_bytes, db_session_id);
1675
- dst_relative_tmp = GetSharedFileWithChecksumRel(dst_relative, true);
1676
- dst_relative = GetSharedFileWithChecksumRel(dst_relative, false);
1677
- } else if (shared) {
1678
- dst_relative_tmp = GetSharedFileRel(dst_relative, true);
1679
- dst_relative = GetSharedFileRel(dst_relative, false);
1680
- } else {
1681
- dst_relative = GetPrivateFileRel(backup_id, false, dst_relative);
1682
- }
1683
-
1684
- // We copy into `temp_dest_path` and, once finished, rename it to
1685
- // `final_dest_path`. This allows files to atomically appear at
1686
- // `final_dest_path`. We can copy directly to the final path when atomicity
1687
- // is unnecessary, like for files in private backup directories.
1688
- const std::string* copy_dest_path;
1689
- std::string temp_dest_path;
1690
- std::string final_dest_path = GetAbsolutePath(dst_relative);
1691
- if (!dst_relative_tmp.empty()) {
1692
- temp_dest_path = GetAbsolutePath(dst_relative_tmp);
1693
- copy_dest_path = &temp_dest_path;
1694
- } else {
1695
- copy_dest_path = &final_dest_path;
1696
- }
1697
-
1698
- // Step 2: Determine whether to copy or not
1699
- // if it's shared, we also need to check if it exists -- if it does, no need
1700
- // to copy it again.
1701
- bool need_to_copy = true;
1702
- // true if final_dest_path is the same path as another live file
1703
- const bool same_path =
1704
- live_dst_paths.find(final_dest_path) != live_dst_paths.end();
1705
-
1706
- bool file_exists = false;
1707
- if (shared && !same_path) {
1708
- // Should be in shared directory but not a live path, check existence in
1709
- // shared directory
1710
- Status exist = backup_env_->FileExists(final_dest_path);
1711
- if (exist.ok()) {
1712
- file_exists = true;
1713
- } else if (exist.IsNotFound()) {
1714
- file_exists = false;
1715
- } else {
1716
- return exist;
1717
- }
1718
- }
1719
-
1720
- if (!contents.empty()) {
1721
- need_to_copy = false;
1722
- } else if (shared && (same_path || file_exists)) {
1723
- need_to_copy = false;
1724
- auto find_result = backuped_file_infos_.find(dst_relative);
1725
- if (find_result == backuped_file_infos_.end() && !same_path) {
1726
- // file exists but not referenced
1727
- ROCKS_LOG_INFO(
1728
- options_.info_log,
1729
- "%s already present, but not referenced by any backup. We will "
1730
- "overwrite the file.",
1731
- fname.c_str());
1732
- need_to_copy = true;
1733
- //**TODO: What to do on error?
1734
- backup_env_->DeleteFile(final_dest_path).PermitUncheckedError();
1735
- } else {
1736
- // file exists and referenced
1737
- if (!has_checksum) {
1738
- if (!same_path) {
1739
- assert(find_result != backuped_file_infos_.end());
1740
- // Note: to save I/O on incremental backups, we copy prior known
1741
- // checksum of the file instead of reading entire file contents
1742
- // to recompute it.
1743
- checksum_hex = find_result->second->checksum_hex;
1744
- has_checksum = true;
1745
- // Regarding corruption detection, consider:
1746
- // (a) the DB file is corrupt (since previous backup) and the backup
1747
- // file is OK: we failed to detect, but the backup is safe. DB can
1748
- // be repaired/restored once its corruption is detected.
1749
- // (b) the backup file is corrupt (since previous backup) and the
1750
- // db file is OK: we failed to detect, but the backup is corrupt.
1751
- // CreateNewBackup should support fast incremental backups and
1752
- // there's no way to support that without reading all the files.
1753
- // We might add an option for extra checks on incremental backup,
1754
- // but until then, use VerifyBackups to check existing backup data.
1755
- // (c) file name collision with legitimately different content.
1756
- // This is almost inconceivable with a well-generated DB session
1757
- // ID, but even in that case, we double check the file sizes in
1758
- // BackupMeta::AddFile.
1759
- } else {
1760
- // same_path should not happen for a standard DB, so OK to
1761
- // read file contents to check for checksum mismatch between
1762
- // two files from same DB getting same name.
1763
- Status s = ReadFileAndComputeChecksum(src_dir + fname, db_env_,
1764
- src_env_options, size_limit,
1765
- &checksum_hex);
1766
- if (!s.ok()) {
1767
- return s;
1768
- }
1769
- }
1770
- }
1771
- if (!db_session_id.empty()) {
1772
- ROCKS_LOG_INFO(options_.info_log,
1773
- "%s already present, with checksum %s, size %" PRIu64
1774
- " and DB session identity %s",
1775
- fname.c_str(), checksum_hex.c_str(), size_bytes,
1776
- db_session_id.c_str());
1777
- } else {
1778
- ROCKS_LOG_INFO(options_.info_log,
1779
- "%s already present, with checksum %s and size %" PRIu64,
1780
- fname.c_str(), checksum_hex.c_str(), size_bytes);
1781
- }
1782
- }
1783
- }
1784
- live_dst_paths.insert(final_dest_path);
1785
-
1786
- // Step 3: Add work item
1787
- if (!contents.empty() || need_to_copy) {
1788
- ROCKS_LOG_INFO(options_.info_log, "Copying %s to %s", fname.c_str(),
1789
- copy_dest_path->c_str());
1790
- CopyOrCreateWorkItem copy_or_create_work_item(
1791
- src_dir.empty() ? "" : src_dir + fname, *copy_dest_path, contents,
1792
- db_env_, backup_env_, src_env_options, options_.sync, rate_limiter,
1793
- size_limit, progress_callback, has_checksum, src_checksum_func_name,
1794
- checksum_hex, db_id, db_session_id);
1795
- BackupAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
1796
- copy_or_create_work_item.result.get_future(), shared, need_to_copy,
1797
- backup_env_, temp_dest_path, final_dest_path, dst_relative);
1798
- files_to_copy_or_create_.write(std::move(copy_or_create_work_item));
1799
- backup_items_to_finish.push_back(std::move(after_copy_or_create_work_item));
1800
- } else {
1801
- std::promise<CopyOrCreateResult> promise_result;
1802
- BackupAfterCopyOrCreateWorkItem after_copy_or_create_work_item(
1803
- promise_result.get_future(), shared, need_to_copy, backup_env_,
1804
- temp_dest_path, final_dest_path, dst_relative);
1805
- backup_items_to_finish.push_back(std::move(after_copy_or_create_work_item));
1806
- CopyOrCreateResult result;
1807
- result.status = Status::OK();
1808
- result.size = size_bytes;
1809
- result.checksum_hex = std::move(checksum_hex);
1810
- result.db_id = std::move(db_id);
1811
- result.db_session_id = std::move(db_session_id);
1812
- promise_result.set_value(std::move(result));
1813
- }
1814
- return Status::OK();
1815
- }
1816
-
1817
- Status BackupEngineImpl::ReadFileAndComputeChecksum(
1818
- const std::string& src, Env* src_env, const EnvOptions& src_env_options,
1819
- uint64_t size_limit, std::string* checksum_hex) {
1820
- if (checksum_hex == nullptr) {
1821
- return Status::Aborted("Checksum pointer is null");
1822
- }
1823
- uint32_t checksum_value = 0;
1824
- if (size_limit == 0) {
1825
- size_limit = std::numeric_limits<uint64_t>::max();
1826
- }
1827
-
1828
- std::unique_ptr<SequentialFile> src_file;
1829
- Status s = src_env->NewSequentialFile(src, &src_file, src_env_options);
1830
- if (!s.ok()) {
1831
- return s;
1832
- }
1833
-
1834
- std::unique_ptr<SequentialFileReader> src_reader(
1835
- new SequentialFileReader(NewLegacySequentialFileWrapper(src_file), src));
1836
- std::unique_ptr<char[]> buf(new char[copy_file_buffer_size_]);
1837
- Slice data;
1838
-
1839
- do {
1840
- if (stop_backup_.load(std::memory_order_acquire)) {
1841
- return Status::Incomplete("Backup stopped");
1842
- }
1843
- size_t buffer_to_read = (copy_file_buffer_size_ < size_limit) ?
1844
- copy_file_buffer_size_ : static_cast<size_t>(size_limit);
1845
- s = src_reader->Read(buffer_to_read, &data, buf.get());
1846
-
1847
- if (!s.ok()) {
1848
- return s;
1849
- }
1850
-
1851
- size_limit -= data.size();
1852
- checksum_value = crc32c::Extend(checksum_value, data.data(), data.size());
1853
- } while (data.size() > 0 && size_limit > 0);
1854
-
1855
- checksum_hex->assign(ChecksumInt32ToHex(checksum_value));
1856
-
1857
- return s;
1858
- }
1859
-
1860
- Status BackupEngineImpl::GetFileDbIdentities(Env* src_env,
1861
- const EnvOptions& src_env_options,
1862
- const std::string& file_path,
1863
- std::string* db_id,
1864
- std::string* db_session_id) {
1865
- assert(db_id != nullptr || db_session_id != nullptr);
1866
-
1867
- Options options;
1868
- options.env = src_env;
1869
- SstFileDumper sst_reader(options, file_path,
1870
- 2 * 1024 * 1024
1871
- /* readahead_size */,
1872
- false /* verify_checksum */, false /* output_hex */,
1873
- false /* decode_blob_index */, src_env_options,
1874
- true /* silent */);
1875
-
1876
- const TableProperties* table_properties = nullptr;
1877
- std::shared_ptr<const TableProperties> tp;
1878
- Status s = sst_reader.getStatus();
1879
-
1880
- if (s.ok()) {
1881
- // Try to get table properties from the table reader of sst_reader
1882
- if (!sst_reader.ReadTableProperties(&tp).ok()) {
1883
- // Try to use table properites from the initialization of sst_reader
1884
- table_properties = sst_reader.GetInitTableProperties();
1885
- } else {
1886
- table_properties = tp.get();
1887
- }
1888
- } else {
1889
- ROCKS_LOG_INFO(options_.info_log, "Failed to read %s: %s",
1890
- file_path.c_str(), s.ToString().c_str());
1891
- return s;
1892
- }
1893
-
1894
- if (table_properties != nullptr) {
1895
- if (db_id != nullptr) {
1896
- db_id->assign(table_properties->db_id);
1897
- }
1898
- if (db_session_id != nullptr) {
1899
- db_session_id->assign(table_properties->db_session_id);
1900
- if (db_session_id->empty()) {
1901
- s = Status::NotFound("DB session identity not found in " + file_path);
1902
- ROCKS_LOG_INFO(options_.info_log, "%s", s.ToString().c_str());
1903
- return s;
1904
- }
1905
- }
1906
- return Status::OK();
1907
- } else {
1908
- s = Status::Corruption("Table properties missing in " + file_path);
1909
- ROCKS_LOG_INFO(options_.info_log, "%s", s.ToString().c_str());
1910
- return s;
1911
- }
1912
- }
1913
-
1914
- void BackupEngineImpl::DeleteChildren(const std::string& dir,
1915
- uint32_t file_type_filter) {
1916
- std::vector<std::string> children;
1917
- db_env_->GetChildren(dir, &children).PermitUncheckedError(); // ignore errors
1918
-
1919
- for (const auto& f : children) {
1920
- uint64_t number;
1921
- FileType type;
1922
- bool ok = ParseFileName(f, &number, &type);
1923
- if (ok && (file_type_filter & (1 << type))) {
1924
- // don't delete this file
1925
- continue;
1926
- }
1927
- db_env_->DeleteFile(dir + "/" + f).PermitUncheckedError(); // ignore errors
1928
- }
1929
- }
1930
-
1931
- Status BackupEngineImpl::InsertPathnameToSizeBytes(
1932
- const std::string& dir, Env* env,
1933
- std::unordered_map<std::string, uint64_t>* result) {
1934
- assert(result != nullptr);
1935
- std::vector<Env::FileAttributes> files_attrs;
1936
- Status status = env->FileExists(dir);
1937
- if (status.ok()) {
1938
- status = env->GetChildrenFileAttributes(dir, &files_attrs);
1939
- } else if (status.IsNotFound()) {
1940
- // Insert no entries can be considered success
1941
- status = Status::OK();
1942
- }
1943
- const bool slash_needed = dir.empty() || dir.back() != '/';
1944
- for (const auto& file_attrs : files_attrs) {
1945
- result->emplace(dir + (slash_needed ? "/" : "") + file_attrs.name,
1946
- file_attrs.size_bytes);
1947
- }
1948
- return status;
1949
- }
1950
-
1951
- Status BackupEngineImpl::GarbageCollect() {
1952
- assert(!read_only_);
1953
-
1954
- // We will make a best effort to remove all garbage even in the presence
1955
- // of inconsistencies or I/O failures that inhibit finding garbage.
1956
- Status overall_status = Status::OK();
1957
- // If all goes well, we don't need another auto-GC this session
1958
- might_need_garbage_collect_ = false;
1959
-
1960
- ROCKS_LOG_INFO(options_.info_log, "Starting garbage collection");
1961
-
1962
- // delete obsolete shared files
1963
- for (bool with_checksum : {false, true}) {
1964
- std::vector<std::string> shared_children;
1965
- {
1966
- std::string shared_path;
1967
- if (with_checksum) {
1968
- shared_path = GetAbsolutePath(GetSharedFileWithChecksumRel());
1969
- } else {
1970
- shared_path = GetAbsolutePath(GetSharedFileRel());
1971
- }
1972
- auto s = backup_env_->FileExists(shared_path);
1973
- if (s.ok()) {
1974
- s = backup_env_->GetChildren(shared_path, &shared_children);
1975
- } else if (s.IsNotFound()) {
1976
- s = Status::OK();
1977
- }
1978
- if (!s.ok()) {
1979
- overall_status = s;
1980
- // Trying again later might work
1981
- might_need_garbage_collect_ = true;
1982
- }
1983
- }
1984
- for (auto& child : shared_children) {
1985
- std::string rel_fname;
1986
- if (with_checksum) {
1987
- rel_fname = GetSharedFileWithChecksumRel(child);
1988
- } else {
1989
- rel_fname = GetSharedFileRel(child);
1990
- }
1991
- auto child_itr = backuped_file_infos_.find(rel_fname);
1992
- // if it's not refcounted, delete it
1993
- if (child_itr == backuped_file_infos_.end() ||
1994
- child_itr->second->refs == 0) {
1995
- // this might be a directory, but DeleteFile will just fail in that
1996
- // case, so we're good
1997
- Status s = backup_env_->DeleteFile(GetAbsolutePath(rel_fname));
1998
- ROCKS_LOG_INFO(options_.info_log, "Deleting %s -- %s",
1999
- rel_fname.c_str(), s.ToString().c_str());
2000
- backuped_file_infos_.erase(rel_fname);
2001
- if (!s.ok()) {
2002
- // Trying again later might work
2003
- might_need_garbage_collect_ = true;
2004
- }
2005
- }
2006
- }
2007
- }
2008
-
2009
- // delete obsolete private files
2010
- std::vector<std::string> private_children;
2011
- {
2012
- auto s = backup_env_->GetChildren(GetAbsolutePath(GetPrivateDirRel()),
2013
- &private_children);
2014
- if (!s.ok()) {
2015
- overall_status = s;
2016
- // Trying again later might work
2017
- might_need_garbage_collect_ = true;
2018
- }
2019
- }
2020
- for (auto& child : private_children) {
2021
- BackupID backup_id = 0;
2022
- bool tmp_dir = child.find(".tmp") != std::string::npos;
2023
- sscanf(child.c_str(), "%u", &backup_id);
2024
- if (!tmp_dir && // if it's tmp_dir, delete it
2025
- (backup_id == 0 || backups_.find(backup_id) != backups_.end())) {
2026
- // it's either not a number or it's still alive. continue
2027
- continue;
2028
- }
2029
- // here we have to delete the dir and all its children
2030
- std::string full_private_path =
2031
- GetAbsolutePath(GetPrivateFileRel(backup_id));
2032
- std::vector<std::string> subchildren;
2033
- if (backup_env_->GetChildren(full_private_path, &subchildren).ok()) {
2034
- for (auto& subchild : subchildren) {
2035
- Status s = backup_env_->DeleteFile(full_private_path + subchild);
2036
- ROCKS_LOG_INFO(options_.info_log, "Deleting %s -- %s",
2037
- (full_private_path + subchild).c_str(),
2038
- s.ToString().c_str());
2039
- if (!s.ok()) {
2040
- // Trying again later might work
2041
- might_need_garbage_collect_ = true;
2042
- }
2043
- }
2044
- }
2045
- // finally delete the private dir
2046
- Status s = backup_env_->DeleteDir(full_private_path);
2047
- ROCKS_LOG_INFO(options_.info_log, "Deleting dir %s -- %s",
2048
- full_private_path.c_str(), s.ToString().c_str());
2049
- if (!s.ok()) {
2050
- // Trying again later might work
2051
- might_need_garbage_collect_ = true;
2052
- }
2053
- }
2054
-
2055
- assert(overall_status.ok() || might_need_garbage_collect_);
2056
- return overall_status;
2057
- }
2058
-
2059
- // ------- BackupMeta class --------
2060
-
2061
- Status BackupEngineImpl::BackupMeta::AddFile(
2062
- std::shared_ptr<FileInfo> file_info) {
2063
- auto itr = file_infos_->find(file_info->filename);
2064
- if (itr == file_infos_->end()) {
2065
- auto ret = file_infos_->insert({file_info->filename, file_info});
2066
- if (ret.second) {
2067
- itr = ret.first;
2068
- itr->second->refs = 1;
2069
- } else {
2070
- // if this happens, something is seriously wrong
2071
- return Status::Corruption("In memory metadata insertion error");
2072
- }
2073
- } else {
2074
- // Compare sizes, because we scanned that off the filesystem on both
2075
- // ends. This is like a check in VerifyBackup.
2076
- if (itr->second->size != file_info->size) {
2077
- std::string msg = "Size mismatch for existing backup file: ";
2078
- msg.append(file_info->filename);
2079
- msg.append(" Size in backup is " + ToString(itr->second->size) +
2080
- " while size in DB is " + ToString(file_info->size));
2081
- msg.append(
2082
- " If this DB file checks as not corrupt, try deleting old"
2083
- " backups or backing up to a different backup directory.");
2084
- return Status::Corruption(msg);
2085
- }
2086
- // Note: to save I/O, this check will pass trivially on already backed
2087
- // up files that don't have the checksum in their name. And it should
2088
- // never fail for files that do have checksum in their name.
2089
- if (itr->second->checksum_hex != file_info->checksum_hex) {
2090
- // Should never reach here, but produce an appropriate corruption
2091
- // message in case we do in a release build.
2092
- assert(false);
2093
- std::string msg = "Checksum mismatch for existing backup file: ";
2094
- msg.append(file_info->filename);
2095
- msg.append(" Expected checksum is " + itr->second->checksum_hex +
2096
- " while computed checksum is " + file_info->checksum_hex);
2097
- msg.append(
2098
- " If this DB file checks as not corrupt, try deleting old"
2099
- " backups or backing up to a different backup directory.");
2100
- return Status::Corruption(msg);
2101
- }
2102
- ++itr->second->refs; // increase refcount if already present
2103
- }
2104
-
2105
- size_ += file_info->size;
2106
- files_.push_back(itr->second);
2107
-
2108
- return Status::OK();
2109
- }
2110
-
2111
- Status BackupEngineImpl::BackupMeta::Delete(bool delete_meta) {
2112
- Status s;
2113
- for (const auto& file : files_) {
2114
- --file->refs; // decrease refcount
2115
- }
2116
- files_.clear();
2117
- // delete meta file
2118
- if (delete_meta) {
2119
- s = env_->FileExists(meta_filename_);
2120
- if (s.ok()) {
2121
- s = env_->DeleteFile(meta_filename_);
2122
- } else if (s.IsNotFound()) {
2123
- s = Status::OK(); // nothing to delete
2124
- }
2125
- }
2126
- timestamp_ = 0;
2127
- return s;
2128
- }
2129
-
2130
- Slice kMetaDataPrefix("metadata ");
2131
-
2132
- // each backup meta file is of the format:
2133
- // <timestamp>
2134
- // <seq number>
2135
- // <metadata(literal string)> <metadata> (optional)
2136
- // <number of files>
2137
- // <file1> <crc32(literal string)> <crc32c_value>
2138
- // <file2> <crc32(literal string)> <crc32c_value>
2139
- // ...
2140
- Status BackupEngineImpl::BackupMeta::LoadFromFile(
2141
- const std::string& backup_dir,
2142
- const std::unordered_map<std::string, uint64_t>& abs_path_to_size) {
2143
- assert(Empty());
2144
- Status s;
2145
- std::unique_ptr<SequentialFile> backup_meta_file;
2146
- s = env_->NewSequentialFile(meta_filename_, &backup_meta_file, EnvOptions());
2147
- if (!s.ok()) {
2148
- return s;
2149
- }
2150
-
2151
- std::unique_ptr<SequentialFileReader> backup_meta_reader(
2152
- new SequentialFileReader(NewLegacySequentialFileWrapper(backup_meta_file),
2153
- meta_filename_));
2154
- std::unique_ptr<char[]> buf(new char[max_backup_meta_file_size_ + 1]);
2155
- Slice data;
2156
- s = backup_meta_reader->Read(max_backup_meta_file_size_, &data, buf.get());
2157
-
2158
- if (!s.ok() || data.size() == max_backup_meta_file_size_) {
2159
- return s.ok() ? Status::Corruption("File size too big") : s;
2160
- }
2161
- buf[data.size()] = 0;
2162
-
2163
- uint32_t num_files = 0;
2164
- char *next;
2165
- timestamp_ = strtoull(data.data(), &next, 10);
2166
- data.remove_prefix(next - data.data() + 1); // +1 for '\n'
2167
- sequence_number_ = strtoull(data.data(), &next, 10);
2168
- data.remove_prefix(next - data.data() + 1); // +1 for '\n'
2169
-
2170
- if (data.starts_with(kMetaDataPrefix)) {
2171
- // app metadata present
2172
- data.remove_prefix(kMetaDataPrefix.size());
2173
- Slice hex_encoded_metadata = GetSliceUntil(&data, '\n');
2174
- bool decode_success = hex_encoded_metadata.DecodeHex(&app_metadata_);
2175
- if (!decode_success) {
2176
- return Status::Corruption(
2177
- "Failed to decode stored hex encoded app metadata");
2178
- }
2179
- }
2180
-
2181
- num_files = static_cast<uint32_t>(strtoul(data.data(), &next, 10));
2182
- data.remove_prefix(next - data.data() + 1); // +1 for '\n'
2183
-
2184
- std::vector<std::shared_ptr<FileInfo>> files;
2185
-
2186
- // WART: The checksums are crc32c, not original crc32
2187
- Slice checksum_prefix("crc32 ");
2188
-
2189
- for (uint32_t i = 0; s.ok() && i < num_files; ++i) {
2190
- auto line = GetSliceUntil(&data, '\n');
2191
- // filename is relative, i.e., shared/number.sst,
2192
- // shared_checksum/number.sst, or private/backup_id/number.sst
2193
- std::string filename = GetSliceUntil(&line, ' ').ToString();
2194
-
2195
- uint64_t size;
2196
- const std::shared_ptr<FileInfo> file_info = GetFile(filename);
2197
- if (file_info) {
2198
- size = file_info->size;
2199
- } else {
2200
- std::string abs_path = backup_dir + "/" + filename;
2201
- try {
2202
- size = abs_path_to_size.at(abs_path);
2203
- } catch (std::out_of_range&) {
2204
- return Status::Corruption("Size missing for pathname: " + abs_path);
2205
- }
2206
- }
2207
-
2208
- if (line.empty()) {
2209
- return Status::Corruption("File checksum is missing for " + filename +
2210
- " in " + meta_filename_);
2211
- }
2212
-
2213
- uint32_t checksum_value = 0;
2214
- if (line.starts_with(checksum_prefix)) {
2215
- line.remove_prefix(checksum_prefix.size());
2216
- checksum_value = static_cast<uint32_t>(strtoul(line.data(), nullptr, 10));
2217
- if (line != ROCKSDB_NAMESPACE::ToString(checksum_value)) {
2218
- return Status::Corruption("Invalid checksum value for " + filename +
2219
- " in " + meta_filename_);
2220
- }
2221
- } else {
2222
- return Status::Corruption("Unknown checksum type for " + filename +
2223
- " in " + meta_filename_);
2224
- }
2225
-
2226
- files.emplace_back(
2227
- new FileInfo(filename, size, ChecksumInt32ToHex(checksum_value)));
2228
- }
2229
-
2230
- if (s.ok() && data.size() > 0) {
2231
- // file has to be read completely. if not, we count it as corruption
2232
- s = Status::Corruption("Tailing data in backup meta file in " +
2233
- meta_filename_);
2234
- }
2235
-
2236
- if (s.ok()) {
2237
- files_.reserve(files.size());
2238
- for (const auto& file_info : files) {
2239
- s = AddFile(file_info);
2240
- if (!s.ok()) {
2241
- break;
2242
- }
2243
- }
2244
- }
2245
-
2246
- return s;
2247
- }
2248
-
2249
- Status BackupEngineImpl::BackupMeta::StoreToFile(bool sync) {
2250
- Status s;
2251
- std::unique_ptr<WritableFile> backup_meta_file;
2252
- EnvOptions env_options;
2253
- env_options.use_mmap_writes = false;
2254
- env_options.use_direct_writes = false;
2255
- s = env_->NewWritableFile(meta_tmp_filename_, &backup_meta_file, env_options);
2256
- if (!s.ok()) {
2257
- return s;
2258
- }
2259
-
2260
- std::ostringstream buf;
2261
- buf << timestamp_ << "\n";
2262
- buf << sequence_number_ << "\n";
2263
-
2264
- if (!app_metadata_.empty()) {
2265
- std::string hex_encoded_metadata =
2266
- Slice(app_metadata_).ToString(/* hex */ true);
2267
- buf << kMetaDataPrefix.ToString() << hex_encoded_metadata << "\n";
2268
- }
2269
- buf << files_.size() << "\n";
2270
-
2271
- for (const auto& file : files_) {
2272
- // use crc32c for now, switch to something else if needed
2273
- // WART: The checksums are crc32c, not original crc32
2274
- buf << file->filename << " crc32 " << ChecksumHexToInt32(file->checksum_hex)
2275
- << "\n";
2276
- }
2277
-
2278
- s = backup_meta_file->Append(Slice(buf.str()));
2279
- if (s.ok() && sync) {
2280
- s = backup_meta_file->Sync();
2281
- }
2282
- if (s.ok()) {
2283
- s = backup_meta_file->Close();
2284
- }
2285
- if (s.ok()) {
2286
- s = env_->RenameFile(meta_tmp_filename_, meta_filename_);
2287
- }
2288
- return s;
2289
- }
2290
-
2291
- // -------- BackupEngineReadOnlyImpl ---------
2292
- class BackupEngineReadOnlyImpl : public BackupEngineReadOnly {
2293
- public:
2294
- BackupEngineReadOnlyImpl(const BackupableDBOptions& options, Env* db_env)
2295
- : backup_engine_(new BackupEngineImpl(options, db_env, true)) {}
2296
-
2297
- ~BackupEngineReadOnlyImpl() override {}
2298
-
2299
- // The returned BackupInfos are in chronological order, which means the
2300
- // latest backup comes last.
2301
- void GetBackupInfo(std::vector<BackupInfo>* backup_info) override {
2302
- backup_engine_->GetBackupInfo(backup_info);
2303
- }
2304
-
2305
- void GetCorruptedBackups(std::vector<BackupID>* corrupt_backup_ids) override {
2306
- backup_engine_->GetCorruptedBackups(corrupt_backup_ids);
2307
- }
2308
-
2309
- using BackupEngineReadOnly::RestoreDBFromBackup;
2310
- Status RestoreDBFromBackup(const RestoreOptions& options, BackupID backup_id,
2311
- const std::string& db_dir,
2312
- const std::string& wal_dir) override {
2313
- return backup_engine_->RestoreDBFromBackup(options, backup_id, db_dir,
2314
- wal_dir);
2315
- }
2316
-
2317
- using BackupEngineReadOnly::RestoreDBFromLatestBackup;
2318
- Status RestoreDBFromLatestBackup(const RestoreOptions& options,
2319
- const std::string& db_dir,
2320
- const std::string& wal_dir) override {
2321
- return backup_engine_->RestoreDBFromLatestBackup(options, db_dir, wal_dir);
2322
- }
2323
-
2324
- Status VerifyBackup(BackupID backup_id,
2325
- bool verify_with_checksum = false) override {
2326
- return backup_engine_->VerifyBackup(backup_id, verify_with_checksum);
2327
- }
2328
-
2329
- Status Initialize() { return backup_engine_->Initialize(); }
2330
-
2331
- private:
2332
- std::unique_ptr<BackupEngineImpl> backup_engine_;
2333
- };
2334
-
2335
- Status BackupEngineReadOnly::Open(const BackupableDBOptions& options, Env* env,
2336
- BackupEngineReadOnly** backup_engine_ptr) {
2337
- if (options.destroy_old_data) {
2338
- return Status::InvalidArgument(
2339
- "Can't destroy old data with ReadOnly BackupEngine");
2340
- }
2341
- std::unique_ptr<BackupEngineReadOnlyImpl> backup_engine(
2342
- new BackupEngineReadOnlyImpl(options, env));
2343
- auto s = backup_engine->Initialize();
2344
- if (!s.ok()) {
2345
- *backup_engine_ptr = nullptr;
2346
- return s;
2347
- }
2348
- *backup_engine_ptr = backup_engine.release();
2349
- return Status::OK();
2350
- }
2351
-
2352
- } // namespace ROCKSDB_NAMESPACE
2353
-
2354
- #endif // ROCKSDB_LITE