@nxtedition/rocksdb 1.0.0

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 (1088) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/UPGRADING.md +91 -0
  5. package/binding.cc +1276 -0
  6. package/binding.gyp +73 -0
  7. package/binding.js +1 -0
  8. package/chained-batch.js +44 -0
  9. package/deps/rocksdb/build_version.cc +4 -0
  10. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  11. package/deps/rocksdb/rocksdb/COPYING +339 -0
  12. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  13. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  14. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  15. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  16. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  20. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  22. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  23. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  24. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  25. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  26. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  27. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  37. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  38. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  60. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  61. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  64. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  65. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  67. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  68. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  69. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  71. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  74. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  75. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  95. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  96. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  97. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  98. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  99. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  100. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  101. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  102. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  103. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  104. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  105. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  106. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  107. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  108. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  122. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  123. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  124. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  125. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  126. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  127. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  128. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  129. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  130. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  131. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  132. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  133. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  134. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  135. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  136. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  137. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  138. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  139. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  140. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  141. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  142. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  143. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  144. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  145. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  146. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  147. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  148. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  149. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  150. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  151. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  152. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  153. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  154. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  155. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  156. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  157. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  158. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  159. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  160. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  161. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  162. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  163. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  164. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  165. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  166. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  167. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  168. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  169. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  170. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  171. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  172. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  174. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  175. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  176. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  178. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  179. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  184. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  186. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  187. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  188. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  189. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  190. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  191. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  192. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  193. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  194. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  195. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  196. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  197. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  198. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  199. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  200. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  201. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  202. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  203. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  204. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  205. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  206. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  207. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  210. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  212. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  213. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  216. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  217. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  218. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  219. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  220. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  223. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  224. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  226. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  227. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  228. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  229. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  230. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  231. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  232. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  233. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  234. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  235. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  236. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  237. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  238. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  239. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  240. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  241. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  242. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  243. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  244. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  245. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  246. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  247. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  248. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  249. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  250. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  251. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  252. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  253. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  254. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  255. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  256. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  257. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  258. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  260. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  261. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  262. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  263. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  264. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  290. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  291. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  292. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  293. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  294. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  295. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  296. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  297. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  298. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  299. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  300. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  301. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  302. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  303. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  304. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  305. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  306. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  307. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  308. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  309. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  310. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  313. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  315. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  316. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  317. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  318. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  319. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  320. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  321. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  324. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  325. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  326. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  327. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  334. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  418. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  419. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  420. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  422. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  423. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  425. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  426. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  427. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  428. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  429. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  430. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  431. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  432. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  433. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  434. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  435. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  436. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  437. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  438. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  439. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  440. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  441. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  442. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  443. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  444. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  445. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  446. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  447. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  448. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  449. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  450. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  451. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  452. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  453. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  454. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  455. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  456. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  457. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  458. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  459. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  460. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  461. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  462. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  463. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  464. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  465. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  466. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  467. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  468. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  469. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  470. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  471. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  472. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  473. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  474. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  475. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  476. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  477. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  478. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  479. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  480. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  481. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  482. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  483. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  484. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  485. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  486. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  487. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  489. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  490. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  491. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  492. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  493. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  494. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  495. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  496. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  497. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  498. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  499. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  500. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  501. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  502. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  503. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  504. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  505. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  506. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  507. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  508. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  509. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  510. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  511. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  512. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  513. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  514. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  515. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  516. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  517. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  518. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  519. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  520. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  521. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  522. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  523. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  524. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  525. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  526. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  527. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  528. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  529. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  530. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  531. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  532. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  533. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  534. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  535. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  536. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  537. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  538. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  539. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  540. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  541. package/deps/rocksdb/rocksdb/src.mk +631 -0
  542. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  543. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  599. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  600. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  601. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  602. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  603. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  604. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  605. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  606. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  607. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  608. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  611. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  612. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  613. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  614. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  615. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  616. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  617. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  618. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  619. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  620. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  621. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  622. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  623. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  624. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  625. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  626. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  627. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  628. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  629. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  630. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  631. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  632. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  633. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  634. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  635. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  642. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  643. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  644. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  645. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  646. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  647. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  648. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  649. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  650. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  651. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  652. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  653. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  654. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  655. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  656. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  657. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  658. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  659. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  660. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  661. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  662. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  663. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  664. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  665. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  666. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  667. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  668. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  669. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  670. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  671. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  672. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  673. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  674. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  675. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  676. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  677. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  713. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  714. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  715. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  716. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  717. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  718. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  719. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  720. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  721. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  722. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  726. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  727. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  728. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  729. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  730. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  731. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  732. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  733. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  734. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  735. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  736. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  737. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  738. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  739. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  740. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  741. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  742. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  743. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  744. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  745. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  746. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  747. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  748. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  749. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  750. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  751. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  752. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  753. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  754. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  755. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  756. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  757. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  760. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  761. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  762. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  763. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  764. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  765. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  766. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  767. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  768. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  769. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  770. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  771. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  772. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  773. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  774. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  775. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  776. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  777. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  778. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  779. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  780. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  781. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  782. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  783. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  784. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  785. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  786. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  790. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  791. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  792. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  793. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  794. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  795. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  796. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  797. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  798. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  799. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  800. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  801. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  802. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  803. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  804. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  805. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  806. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  807. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  808. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  809. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  810. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  811. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  812. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  813. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  814. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  815. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  816. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  817. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  818. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  819. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  820. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  821. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  822. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  823. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  824. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  825. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  826. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  827. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  828. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  829. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  830. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  831. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  832. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  833. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  834. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  835. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  836. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  837. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  838. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  839. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  840. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  841. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  842. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  843. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  844. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  845. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  846. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  847. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  848. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  849. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  850. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  851. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  852. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  853. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  854. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  855. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  856. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  857. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  858. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  859. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  860. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  861. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  862. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  872. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  873. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  874. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  875. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  876. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  877. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  885. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  886. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  887. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  888. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  889. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  890. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  891. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  892. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  894. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  895. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  896. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  897. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  898. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  899. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  900. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  901. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  902. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  903. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  904. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  905. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  906. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  907. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  908. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  909. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  910. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  911. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  919. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  920. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  921. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  922. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  923. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  924. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  925. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  926. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  927. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  928. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  929. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  930. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  945. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  946. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  947. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  948. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  949. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  950. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  951. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  952. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  953. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  954. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  955. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  956. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  957. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  958. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  959. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  960. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1041. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1042. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1043. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1044. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1045. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1046. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1047. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1048. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1049. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1050. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1051. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1052. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1053. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1054. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1055. package/deps/rocksdb/rocksdb.gyp +475 -0
  1056. package/deps/snappy/freebsd/config.h +135 -0
  1057. package/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
  1058. package/deps/snappy/linux/config.h +135 -0
  1059. package/deps/snappy/linux/snappy-stubs-public.h +100 -0
  1060. package/deps/snappy/mac/config.h +137 -0
  1061. package/deps/snappy/mac/snappy-stubs-public.h +100 -0
  1062. package/deps/snappy/openbsd/config.h +135 -0
  1063. package/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
  1064. package/deps/snappy/snappy-1.1.7/COPYING +54 -0
  1065. package/deps/snappy/snappy-1.1.7/cmake/SnappyConfig.cmake +1 -0
  1066. package/deps/snappy/snappy-1.1.7/cmake/config.h.in +62 -0
  1067. package/deps/snappy/snappy-1.1.7/snappy-c.cc +90 -0
  1068. package/deps/snappy/snappy-1.1.7/snappy-c.h +138 -0
  1069. package/deps/snappy/snappy-1.1.7/snappy-internal.h +224 -0
  1070. package/deps/snappy/snappy-1.1.7/snappy-sinksource.cc +104 -0
  1071. package/deps/snappy/snappy-1.1.7/snappy-sinksource.h +182 -0
  1072. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.cc +42 -0
  1073. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.h +561 -0
  1074. package/deps/snappy/snappy-1.1.7/snappy-stubs-public.h.in +94 -0
  1075. package/deps/snappy/snappy-1.1.7/snappy-test.cc +612 -0
  1076. package/deps/snappy/snappy-1.1.7/snappy-test.h +573 -0
  1077. package/deps/snappy/snappy-1.1.7/snappy.cc +1515 -0
  1078. package/deps/snappy/snappy-1.1.7/snappy.h +203 -0
  1079. package/deps/snappy/snappy-1.1.7/snappy_unittest.cc +1410 -0
  1080. package/deps/snappy/snappy.gyp +90 -0
  1081. package/deps/snappy/solaris/config.h +135 -0
  1082. package/deps/snappy/solaris/snappy-stubs-public.h +100 -0
  1083. package/deps/snappy/win32/config.h +29 -0
  1084. package/deps/snappy/win32/snappy-stubs-public.h +100 -0
  1085. package/iterator.js +55 -0
  1086. package/leveldown.js +113 -0
  1087. package/package-lock.json +23687 -0
  1088. package/package.json +70 -0
@@ -0,0 +1,2955 @@
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
+ #if !defined(ROCKSDB_LITE) && !defined(OS_WIN)
11
+
12
+ #include "rocksdb/utilities/backupable_db.h"
13
+
14
+ #include <algorithm>
15
+ #include <limits>
16
+ #include <regex>
17
+ #include <string>
18
+ #include <utility>
19
+
20
+ #include "db/db_impl/db_impl.h"
21
+ #include "env/env_chroot.h"
22
+ #include "file/filename.h"
23
+ #include "port/port.h"
24
+ #include "port/stack_trace.h"
25
+ #include "rocksdb/rate_limiter.h"
26
+ #include "rocksdb/transaction_log.h"
27
+ #include "rocksdb/types.h"
28
+ #include "rocksdb/utilities/options_util.h"
29
+ #include "test_util/sync_point.h"
30
+ #include "test_util/testharness.h"
31
+ #include "test_util/testutil.h"
32
+ #include "util/cast_util.h"
33
+ #include "util/mutexlock.h"
34
+ #include "util/random.h"
35
+ #include "util/stderr_logger.h"
36
+ #include "util/string_util.h"
37
+
38
+ namespace ROCKSDB_NAMESPACE {
39
+
40
+ namespace {
41
+ using ShareFilesNaming = BackupableDBOptions::ShareFilesNaming;
42
+ const auto kLegacyCrc32cAndFileSize =
43
+ BackupableDBOptions::kLegacyCrc32cAndFileSize;
44
+ const auto kUseDbSessionId = BackupableDBOptions::kUseDbSessionId;
45
+ const auto kFlagIncludeFileSize = BackupableDBOptions::kFlagIncludeFileSize;
46
+ const auto kFlagMatchInterimNaming =
47
+ BackupableDBOptions::kFlagMatchInterimNaming;
48
+ const auto kNamingDefault =
49
+ kUseDbSessionId | kFlagIncludeFileSize | kFlagMatchInterimNaming;
50
+
51
+ class DummyDB : public StackableDB {
52
+ public:
53
+ /* implicit */
54
+ DummyDB(const Options& options, const std::string& dbname)
55
+ : StackableDB(nullptr), options_(options), dbname_(dbname),
56
+ deletions_enabled_(true), sequence_number_(0) {}
57
+
58
+ SequenceNumber GetLatestSequenceNumber() const override {
59
+ return ++sequence_number_;
60
+ }
61
+
62
+ const std::string& GetName() const override { return dbname_; }
63
+
64
+ Env* GetEnv() const override { return options_.env; }
65
+
66
+ using DB::GetOptions;
67
+ Options GetOptions(ColumnFamilyHandle* /*column_family*/) const override {
68
+ return options_;
69
+ }
70
+
71
+ DBOptions GetDBOptions() const override { return DBOptions(options_); }
72
+
73
+ using StackableDB::GetIntProperty;
74
+ bool GetIntProperty(ColumnFamilyHandle*, const Slice& property,
75
+ uint64_t* value) override {
76
+ if (property == DB::Properties::kMinLogNumberToKeep) {
77
+ *value = 1;
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+
83
+ Status EnableFileDeletions(bool /*force*/) override {
84
+ EXPECT_TRUE(!deletions_enabled_);
85
+ deletions_enabled_ = true;
86
+ return Status::OK();
87
+ }
88
+
89
+ Status DisableFileDeletions() override {
90
+ EXPECT_TRUE(deletions_enabled_);
91
+ deletions_enabled_ = false;
92
+ return Status::OK();
93
+ }
94
+
95
+ Status GetLiveFiles(std::vector<std::string>& vec, uint64_t* mfs,
96
+ bool /*flush_memtable*/ = true) override {
97
+ EXPECT_TRUE(!deletions_enabled_);
98
+ vec = live_files_;
99
+ *mfs = 100;
100
+ return Status::OK();
101
+ }
102
+
103
+ ColumnFamilyHandle* DefaultColumnFamily() const override { return nullptr; }
104
+
105
+ class DummyLogFile : public LogFile {
106
+ public:
107
+ /* implicit */
108
+ DummyLogFile(const std::string& path, bool alive = true)
109
+ : path_(path), alive_(alive) {}
110
+
111
+ std::string PathName() const override { return path_; }
112
+
113
+ uint64_t LogNumber() const override {
114
+ // what business do you have calling this method?
115
+ ADD_FAILURE();
116
+ return 0;
117
+ }
118
+
119
+ WalFileType Type() const override {
120
+ return alive_ ? kAliveLogFile : kArchivedLogFile;
121
+ }
122
+
123
+ SequenceNumber StartSequence() const override {
124
+ // this seqnum guarantees the dummy file will be included in the backup
125
+ // as long as it is alive.
126
+ return kMaxSequenceNumber;
127
+ }
128
+
129
+ uint64_t SizeFileBytes() const override { return 0; }
130
+
131
+ private:
132
+ std::string path_;
133
+ bool alive_;
134
+ }; // DummyLogFile
135
+
136
+ Status GetSortedWalFiles(VectorLogPtr& files) override {
137
+ EXPECT_TRUE(!deletions_enabled_);
138
+ files.resize(wal_files_.size());
139
+ for (size_t i = 0; i < files.size(); ++i) {
140
+ files[i].reset(
141
+ new DummyLogFile(wal_files_[i].first, wal_files_[i].second));
142
+ }
143
+ return Status::OK();
144
+ }
145
+
146
+ // To avoid FlushWAL called on stacked db which is nullptr
147
+ Status FlushWAL(bool /*sync*/) override { return Status::OK(); }
148
+
149
+ std::vector<std::string> live_files_;
150
+ // pair<filename, alive?>
151
+ std::vector<std::pair<std::string, bool>> wal_files_;
152
+ private:
153
+ Options options_;
154
+ std::string dbname_;
155
+ bool deletions_enabled_;
156
+ mutable SequenceNumber sequence_number_;
157
+ }; // DummyDB
158
+
159
+ class TestEnv : public EnvWrapper {
160
+ public:
161
+ explicit TestEnv(Env* t) : EnvWrapper(t) {}
162
+
163
+ class DummySequentialFile : public SequentialFile {
164
+ public:
165
+ explicit DummySequentialFile(bool fail_reads)
166
+ : SequentialFile(), rnd_(5), fail_reads_(fail_reads) {}
167
+ Status Read(size_t n, Slice* result, char* scratch) override {
168
+ if (fail_reads_) {
169
+ return Status::IOError();
170
+ }
171
+ size_t read_size = (n > size_left) ? size_left : n;
172
+ for (size_t i = 0; i < read_size; ++i) {
173
+ scratch[i] = rnd_.Next() & 255;
174
+ }
175
+ *result = Slice(scratch, read_size);
176
+ size_left -= read_size;
177
+ return Status::OK();
178
+ }
179
+
180
+ Status Skip(uint64_t n) override {
181
+ size_left = (n > size_left) ? size_left - n : 0;
182
+ return Status::OK();
183
+ }
184
+
185
+ private:
186
+ size_t size_left = 200;
187
+ Random rnd_;
188
+ bool fail_reads_;
189
+ };
190
+
191
+ Status NewSequentialFile(const std::string& f,
192
+ std::unique_ptr<SequentialFile>* r,
193
+ const EnvOptions& options) override {
194
+ MutexLock l(&mutex_);
195
+ if (dummy_sequential_file_) {
196
+ r->reset(
197
+ new TestEnv::DummySequentialFile(dummy_sequential_file_fail_reads_));
198
+ return Status::OK();
199
+ } else {
200
+ Status s = EnvWrapper::NewSequentialFile(f, r, options);
201
+ if (s.ok()) {
202
+ if ((*r)->use_direct_io()) {
203
+ ++num_direct_seq_readers_;
204
+ }
205
+ ++num_seq_readers_;
206
+ }
207
+ return s;
208
+ }
209
+ }
210
+
211
+ Status NewWritableFile(const std::string& f, std::unique_ptr<WritableFile>* r,
212
+ const EnvOptions& options) override {
213
+ MutexLock l(&mutex_);
214
+ written_files_.push_back(f);
215
+ if (limit_written_files_ <= 0) {
216
+ return Status::NotSupported("Sorry, can't do this");
217
+ }
218
+ limit_written_files_--;
219
+ Status s = EnvWrapper::NewWritableFile(f, r, options);
220
+ if (s.ok()) {
221
+ if ((*r)->use_direct_io()) {
222
+ ++num_direct_writers_;
223
+ }
224
+ ++num_writers_;
225
+ }
226
+ return s;
227
+ }
228
+
229
+ Status NewRandomAccessFile(const std::string& fname,
230
+ std::unique_ptr<RandomAccessFile>* result,
231
+ const EnvOptions& options) override {
232
+ MutexLock l(&mutex_);
233
+ Status s = EnvWrapper::NewRandomAccessFile(fname, result, options);
234
+ if (s.ok()) {
235
+ if ((*result)->use_direct_io()) {
236
+ ++num_direct_rand_readers_;
237
+ }
238
+ ++num_rand_readers_;
239
+ }
240
+ return s;
241
+ }
242
+
243
+ Status DeleteFile(const std::string& fname) override {
244
+ MutexLock l(&mutex_);
245
+ if (fail_delete_files_) {
246
+ return Status::IOError();
247
+ }
248
+ EXPECT_GT(limit_delete_files_, 0U);
249
+ limit_delete_files_--;
250
+ return EnvWrapper::DeleteFile(fname);
251
+ }
252
+
253
+ Status DeleteDir(const std::string& dirname) override {
254
+ MutexLock l(&mutex_);
255
+ if (fail_delete_files_) {
256
+ return Status::IOError();
257
+ }
258
+ return EnvWrapper::DeleteDir(dirname);
259
+ }
260
+
261
+ void AssertWrittenFiles(std::vector<std::string>& should_have_written) {
262
+ MutexLock l(&mutex_);
263
+ std::sort(should_have_written.begin(), should_have_written.end());
264
+ std::sort(written_files_.begin(), written_files_.end());
265
+
266
+ ASSERT_EQ(should_have_written, written_files_);
267
+ }
268
+
269
+ void ClearWrittenFiles() {
270
+ MutexLock l(&mutex_);
271
+ written_files_.clear();
272
+ }
273
+
274
+ void SetLimitWrittenFiles(uint64_t limit) {
275
+ MutexLock l(&mutex_);
276
+ limit_written_files_ = limit;
277
+ }
278
+
279
+ void SetLimitDeleteFiles(uint64_t limit) {
280
+ MutexLock l(&mutex_);
281
+ limit_delete_files_ = limit;
282
+ }
283
+
284
+ void SetDeleteFileFailure(bool fail) {
285
+ MutexLock l(&mutex_);
286
+ fail_delete_files_ = fail;
287
+ }
288
+
289
+ void SetDummySequentialFile(bool dummy_sequential_file) {
290
+ MutexLock l(&mutex_);
291
+ dummy_sequential_file_ = dummy_sequential_file;
292
+ }
293
+ void SetDummySequentialFileFailReads(bool dummy_sequential_file_fail_reads) {
294
+ MutexLock l(&mutex_);
295
+ dummy_sequential_file_fail_reads_ = dummy_sequential_file_fail_reads;
296
+ }
297
+
298
+ void SetGetChildrenFailure(bool fail) { get_children_failure_ = fail; }
299
+ Status GetChildren(const std::string& dir,
300
+ std::vector<std::string>* r) override {
301
+ if (get_children_failure_) {
302
+ return Status::IOError("SimulatedFailure");
303
+ }
304
+ return EnvWrapper::GetChildren(dir, r);
305
+ }
306
+
307
+ // Some test cases do not actually create the test files (e.g., see
308
+ // DummyDB::live_files_) - for those cases, we mock those files' attributes
309
+ // so CreateNewBackup() can get their attributes.
310
+ void SetFilenamesForMockedAttrs(const std::vector<std::string>& filenames) {
311
+ filenames_for_mocked_attrs_ = filenames;
312
+ }
313
+ Status GetChildrenFileAttributes(
314
+ const std::string& dir, std::vector<Env::FileAttributes>* r) override {
315
+ if (filenames_for_mocked_attrs_.size() > 0) {
316
+ for (const auto& filename : filenames_for_mocked_attrs_) {
317
+ uint64_t size_bytes = 200; // Match TestEnv
318
+ if (filename.find("MANIFEST") == 0) {
319
+ size_bytes = 100; // Match DummyDB::GetLiveFiles
320
+ }
321
+ r->push_back({dir + filename, size_bytes});
322
+ }
323
+ return Status::OK();
324
+ }
325
+ return EnvWrapper::GetChildrenFileAttributes(dir, r);
326
+ }
327
+ Status GetFileSize(const std::string& path, uint64_t* size_bytes) override {
328
+ if (filenames_for_mocked_attrs_.size() > 0) {
329
+ auto fname = path.substr(path.find_last_of('/'));
330
+ auto filename_iter = std::find(filenames_for_mocked_attrs_.begin(),
331
+ filenames_for_mocked_attrs_.end(), fname);
332
+ if (filename_iter != filenames_for_mocked_attrs_.end()) {
333
+ *size_bytes = 200; // Match TestEnv
334
+ if (fname.find("MANIFEST") == 0) {
335
+ *size_bytes = 100; // Match DummyDB::GetLiveFiles
336
+ }
337
+ return Status::OK();
338
+ }
339
+ return Status::NotFound(fname);
340
+ }
341
+ return EnvWrapper::GetFileSize(path, size_bytes);
342
+ }
343
+
344
+ void SetCreateDirIfMissingFailure(bool fail) {
345
+ create_dir_if_missing_failure_ = fail;
346
+ }
347
+ Status CreateDirIfMissing(const std::string& d) override {
348
+ if (create_dir_if_missing_failure_) {
349
+ return Status::IOError("SimulatedFailure");
350
+ }
351
+ return EnvWrapper::CreateDirIfMissing(d);
352
+ }
353
+
354
+ void SetNewDirectoryFailure(bool fail) { new_directory_failure_ = fail; }
355
+ Status NewDirectory(const std::string& name,
356
+ std::unique_ptr<Directory>* result) override {
357
+ if (new_directory_failure_) {
358
+ return Status::IOError("SimulatedFailure");
359
+ }
360
+ return EnvWrapper::NewDirectory(name, result);
361
+ }
362
+
363
+ void ClearFileOpenCounters() {
364
+ MutexLock l(&mutex_);
365
+ num_rand_readers_ = 0;
366
+ num_direct_rand_readers_ = 0;
367
+ num_seq_readers_ = 0;
368
+ num_direct_seq_readers_ = 0;
369
+ num_writers_ = 0;
370
+ num_direct_writers_ = 0;
371
+ }
372
+
373
+ int num_rand_readers() { return num_rand_readers_; }
374
+ int num_direct_rand_readers() { return num_direct_rand_readers_; }
375
+ int num_seq_readers() { return num_seq_readers_; }
376
+ int num_direct_seq_readers() { return num_direct_seq_readers_; }
377
+ int num_writers() { return num_writers_; }
378
+ int num_direct_writers() { return num_direct_writers_; }
379
+
380
+ private:
381
+ port::Mutex mutex_;
382
+ bool dummy_sequential_file_ = false;
383
+ bool dummy_sequential_file_fail_reads_ = false;
384
+ std::vector<std::string> written_files_;
385
+ std::vector<std::string> filenames_for_mocked_attrs_;
386
+ uint64_t limit_written_files_ = 1000000;
387
+ uint64_t limit_delete_files_ = 1000000;
388
+ bool fail_delete_files_ = false;
389
+
390
+ bool get_children_failure_ = false;
391
+ bool create_dir_if_missing_failure_ = false;
392
+ bool new_directory_failure_ = false;
393
+
394
+ // Keeps track of how many files of each type were successfully opened, and
395
+ // out of those, how many were opened with direct I/O.
396
+ std::atomic<int> num_rand_readers_;
397
+ std::atomic<int> num_direct_rand_readers_;
398
+ std::atomic<int> num_seq_readers_;
399
+ std::atomic<int> num_direct_seq_readers_;
400
+ std::atomic<int> num_writers_;
401
+ std::atomic<int> num_direct_writers_;
402
+ }; // TestEnv
403
+
404
+ class FileManager : public EnvWrapper {
405
+ public:
406
+ explicit FileManager(Env* t) : EnvWrapper(t), rnd_(5) {}
407
+
408
+ Status GetRandomFileInDir(const std::string& dir, std::string* fname,
409
+ uint64_t* fsize) {
410
+ std::vector<FileAttributes> children;
411
+ auto s = GetChildrenFileAttributes(dir, &children);
412
+ if (!s.ok()) {
413
+ return s;
414
+ } else if (children.size() <= 2) { // . and ..
415
+ return Status::NotFound("Empty directory: " + dir);
416
+ }
417
+ assert(fname != nullptr);
418
+ while (true) {
419
+ int i = rnd_.Next() % children.size();
420
+ fname->assign(dir + "/" + children[i].name);
421
+ *fsize = children[i].size_bytes;
422
+ return Status::OK();
423
+ }
424
+ // should never get here
425
+ assert(false);
426
+ return Status::NotFound("");
427
+ }
428
+
429
+ Status DeleteRandomFileInDir(const std::string& dir) {
430
+ std::vector<std::string> children;
431
+ Status s = GetChildren(dir, &children);
432
+ if (!s.ok()) {
433
+ return s;
434
+ }
435
+ while (true) {
436
+ int i = rnd_.Next() % children.size();
437
+ return DeleteFile(dir + "/" + children[i]);
438
+ }
439
+ // should never get here
440
+ assert(false);
441
+ return Status::NotFound("");
442
+ }
443
+
444
+ Status AppendToRandomFileInDir(const std::string& dir,
445
+ const std::string& data) {
446
+ std::vector<std::string> children;
447
+ Status s = GetChildren(dir, &children);
448
+ if (!s.ok()) {
449
+ return s;
450
+ }
451
+ while (true) {
452
+ int i = rnd_.Next() % children.size();
453
+ return WriteToFile(dir + "/" + children[i], data);
454
+ }
455
+ // should never get here
456
+ assert(false);
457
+ return Status::NotFound("");
458
+ }
459
+
460
+ Status CorruptFile(const std::string& fname, uint64_t bytes_to_corrupt) {
461
+ std::string file_contents;
462
+ Status s = ReadFileToString(this, fname, &file_contents);
463
+ if (!s.ok()) {
464
+ return s;
465
+ }
466
+ s = DeleteFile(fname);
467
+ if (!s.ok()) {
468
+ return s;
469
+ }
470
+
471
+ for (uint64_t i = 0; i < bytes_to_corrupt; ++i) {
472
+ std::string tmp = rnd_.RandomString(1);
473
+ file_contents[rnd_.Next() % file_contents.size()] = tmp[0];
474
+ }
475
+ return WriteToFile(fname, file_contents);
476
+ }
477
+
478
+ Status CorruptFileStart(const std::string& fname) {
479
+ std::string to_xor = "blah";
480
+ std::string file_contents;
481
+ Status s = ReadFileToString(this, fname, &file_contents);
482
+ if (!s.ok()) {
483
+ return s;
484
+ }
485
+ s = DeleteFile(fname);
486
+ if (!s.ok()) {
487
+ return s;
488
+ }
489
+ for (size_t i = 0; i < to_xor.size(); ++i) {
490
+ file_contents[i] ^= to_xor[i];
491
+ }
492
+ return WriteToFile(fname, file_contents);
493
+ }
494
+
495
+ Status CorruptChecksum(const std::string& fname, bool appear_valid) {
496
+ std::string metadata;
497
+ Status s = ReadFileToString(this, fname, &metadata);
498
+ if (!s.ok()) {
499
+ return s;
500
+ }
501
+ s = DeleteFile(fname);
502
+ if (!s.ok()) {
503
+ return s;
504
+ }
505
+
506
+ auto pos = metadata.find("private");
507
+ if (pos == std::string::npos) {
508
+ return Status::Corruption("private file is expected");
509
+ }
510
+ pos = metadata.find(" crc32 ", pos + 6);
511
+ if (pos == std::string::npos) {
512
+ return Status::Corruption("checksum not found");
513
+ }
514
+
515
+ if (metadata.size() < pos + 7) {
516
+ return Status::Corruption("bad CRC32 checksum value");
517
+ }
518
+
519
+ if (appear_valid) {
520
+ if (metadata[pos + 8] == '\n') {
521
+ // single digit value, safe to insert one more digit
522
+ metadata.insert(pos + 8, 1, '0');
523
+ } else {
524
+ metadata.erase(pos + 8, 1);
525
+ }
526
+ } else {
527
+ metadata[pos + 7] = 'a';
528
+ }
529
+
530
+ return WriteToFile(fname, metadata);
531
+ }
532
+
533
+ Status WriteToFile(const std::string& fname, const std::string& data) {
534
+ std::unique_ptr<WritableFile> file;
535
+ EnvOptions env_options;
536
+ env_options.use_mmap_writes = false;
537
+ Status s = EnvWrapper::NewWritableFile(fname, &file, env_options);
538
+ if (!s.ok()) {
539
+ return s;
540
+ }
541
+ return file->Append(Slice(data));
542
+ }
543
+
544
+ private:
545
+ Random rnd_;
546
+ }; // FileManager
547
+
548
+ // utility functions
549
+ namespace {
550
+
551
+ enum FillDBFlushAction {
552
+ kFlushMost,
553
+ kFlushAll,
554
+ kAutoFlushOnly,
555
+ };
556
+
557
+ // Many tests in this file expect FillDB to write at least one sst file,
558
+ // so the default behavior (if not kAutoFlushOnly) of FillDB is to force
559
+ // a flush. But to ensure coverage of the WAL file case, we also (by default)
560
+ // do one Put after the Flush (kFlushMost).
561
+ size_t FillDB(DB* db, int from, int to,
562
+ FillDBFlushAction flush_action = kFlushMost) {
563
+ size_t bytes_written = 0;
564
+ for (int i = from; i < to; ++i) {
565
+ std::string key = "testkey" + ToString(i);
566
+ std::string value = "testvalue" + ToString(i);
567
+ bytes_written += key.size() + value.size();
568
+
569
+ EXPECT_OK(db->Put(WriteOptions(), Slice(key), Slice(value)));
570
+
571
+ if (flush_action == kFlushMost && i == to - 2) {
572
+ EXPECT_OK(db->Flush(FlushOptions()));
573
+ }
574
+ }
575
+ if (flush_action == kFlushAll) {
576
+ EXPECT_OK(db->Flush(FlushOptions()));
577
+ }
578
+ return bytes_written;
579
+ }
580
+
581
+ void AssertExists(DB* db, int from, int to) {
582
+ for (int i = from; i < to; ++i) {
583
+ std::string key = "testkey" + ToString(i);
584
+ std::string value;
585
+ Status s = db->Get(ReadOptions(), Slice(key), &value);
586
+ ASSERT_EQ(value, "testvalue" + ToString(i));
587
+ }
588
+ }
589
+
590
+ void AssertEmpty(DB* db, int from, int to) {
591
+ for (int i = from; i < to; ++i) {
592
+ std::string key = "testkey" + ToString(i);
593
+ std::string value = "testvalue" + ToString(i);
594
+
595
+ Status s = db->Get(ReadOptions(), Slice(key), &value);
596
+ ASSERT_TRUE(s.IsNotFound());
597
+ }
598
+ }
599
+ } // namespace
600
+
601
+ class BackupableDBTest : public testing::Test {
602
+ public:
603
+ enum ShareOption {
604
+ kNoShare,
605
+ kShareNoChecksum,
606
+ kShareWithChecksum,
607
+ };
608
+
609
+ const std::vector<ShareOption> kAllShareOptions = {
610
+ kNoShare, kShareNoChecksum, kShareWithChecksum};
611
+
612
+ BackupableDBTest() {
613
+ // set up files
614
+ std::string db_chroot = test::PerThreadDBPath("backupable_db");
615
+ std::string backup_chroot = test::PerThreadDBPath("backupable_db_backup");
616
+ EXPECT_OK(Env::Default()->CreateDirIfMissing(db_chroot));
617
+ EXPECT_OK(Env::Default()->CreateDirIfMissing(backup_chroot));
618
+ dbname_ = "/tempdb";
619
+ backupdir_ = "/tempbk";
620
+
621
+ // set up envs
622
+ db_chroot_env_.reset(NewChrootEnv(Env::Default(), db_chroot));
623
+ backup_chroot_env_.reset(NewChrootEnv(Env::Default(), backup_chroot));
624
+ test_db_env_.reset(new TestEnv(db_chroot_env_.get()));
625
+ test_backup_env_.reset(new TestEnv(backup_chroot_env_.get()));
626
+ file_manager_.reset(new FileManager(backup_chroot_env_.get()));
627
+ db_file_manager_.reset(new FileManager(db_chroot_env_.get()));
628
+
629
+ // set up db options
630
+ options_.create_if_missing = true;
631
+ options_.paranoid_checks = true;
632
+ options_.write_buffer_size = 1 << 17; // 128KB
633
+ options_.env = test_db_env_.get();
634
+ options_.wal_dir = dbname_;
635
+
636
+ // Create logger
637
+ DBOptions logger_options;
638
+ logger_options.env = db_chroot_env_.get();
639
+ // TODO: This should really be an EXPECT_OK, but this CreateLogger fails
640
+ // regularly in some environments with "no such directory"
641
+ CreateLoggerFromOptions(dbname_, logger_options, &logger_)
642
+ .PermitUncheckedError();
643
+
644
+ // set up backup db options
645
+ backupable_options_.reset(new BackupableDBOptions(
646
+ backupdir_, test_backup_env_.get(), true, logger_.get(), true));
647
+
648
+ // most tests will use multi-threaded backups
649
+ backupable_options_->max_background_operations = 7;
650
+
651
+ // delete old files in db
652
+ DestroyDB(dbname_, options_);
653
+ }
654
+
655
+ DB* OpenDB() {
656
+ DB* db;
657
+ EXPECT_OK(DB::Open(options_, dbname_, &db));
658
+ return db;
659
+ }
660
+
661
+ void CloseAndReopenDB() {
662
+ // Close DB
663
+ db_.reset();
664
+
665
+ // Open DB
666
+ test_db_env_->SetLimitWrittenFiles(1000000);
667
+ DB* db;
668
+ ASSERT_OK(DB::Open(options_, dbname_, &db));
669
+ db_.reset(db);
670
+ }
671
+
672
+ void InitializeDBAndBackupEngine(bool dummy = false) {
673
+ // reset all the db env defaults
674
+ test_db_env_->SetLimitWrittenFiles(1000000);
675
+ test_db_env_->SetDummySequentialFile(dummy);
676
+
677
+ DB* db;
678
+ if (dummy) {
679
+ dummy_db_ = new DummyDB(options_, dbname_);
680
+ db = dummy_db_;
681
+ } else {
682
+ ASSERT_OK(DB::Open(options_, dbname_, &db));
683
+ }
684
+ db_.reset(db);
685
+ }
686
+
687
+ virtual void OpenDBAndBackupEngine(
688
+ bool destroy_old_data = false, bool dummy = false,
689
+ ShareOption shared_option = kShareNoChecksum) {
690
+ InitializeDBAndBackupEngine(dummy);
691
+ // reset backup env defaults
692
+ test_backup_env_->SetLimitWrittenFiles(1000000);
693
+ backupable_options_->destroy_old_data = destroy_old_data;
694
+ backupable_options_->share_table_files = shared_option != kNoShare;
695
+ backupable_options_->share_files_with_checksum =
696
+ shared_option == kShareWithChecksum;
697
+ OpenBackupEngine(destroy_old_data);
698
+ }
699
+
700
+ void CloseDBAndBackupEngine() {
701
+ db_.reset();
702
+ backup_engine_.reset();
703
+ }
704
+
705
+ void OpenBackupEngine(bool destroy_old_data = false) {
706
+ backupable_options_->destroy_old_data = destroy_old_data;
707
+ BackupEngine* backup_engine;
708
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
709
+ &backup_engine));
710
+ backup_engine_.reset(backup_engine);
711
+ }
712
+
713
+ void CloseBackupEngine() { backup_engine_.reset(nullptr); }
714
+
715
+ // restores backup backup_id and asserts the existence of
716
+ // [start_exist, end_exist> and not-existence of
717
+ // [end_exist, end>
718
+ //
719
+ // if backup_id == 0, it means restore from latest
720
+ // if end == 0, don't check AssertEmpty
721
+ void AssertBackupConsistency(BackupID backup_id, uint32_t start_exist,
722
+ uint32_t end_exist, uint32_t end = 0,
723
+ bool keep_log_files = false) {
724
+ RestoreOptions restore_options(keep_log_files);
725
+ bool opened_backup_engine = false;
726
+ if (backup_engine_.get() == nullptr) {
727
+ opened_backup_engine = true;
728
+ OpenBackupEngine();
729
+ }
730
+ if (backup_id > 0) {
731
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(backup_id, dbname_, dbname_,
732
+ restore_options));
733
+ } else {
734
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_,
735
+ restore_options));
736
+ }
737
+ DB* db = OpenDB();
738
+ AssertExists(db, start_exist, end_exist);
739
+ if (end != 0) {
740
+ AssertEmpty(db, end_exist, end);
741
+ }
742
+ delete db;
743
+ if (opened_backup_engine) {
744
+ CloseBackupEngine();
745
+ }
746
+ }
747
+
748
+ void DeleteLogFiles() {
749
+ std::vector<std::string> delete_logs;
750
+ ASSERT_OK(db_chroot_env_->GetChildren(dbname_, &delete_logs));
751
+ for (auto f : delete_logs) {
752
+ uint64_t number;
753
+ FileType type;
754
+ bool ok = ParseFileName(f, &number, &type);
755
+ if (ok && type == kWalFile) {
756
+ ASSERT_OK(db_chroot_env_->DeleteFile(dbname_ + "/" + f));
757
+ }
758
+ }
759
+ }
760
+
761
+ Status GetTableFilesInDB(std::vector<FileAttributes>* table_files) {
762
+ std::vector<FileAttributes> children;
763
+ Status s = test_db_env_->GetChildrenFileAttributes(dbname_, &children);
764
+ for (const auto& child : children) {
765
+ if (child.size_bytes > 0 && child.name.size() > 4 &&
766
+ child.name.rfind(".sst") == child.name.length() - 4) {
767
+ table_files->push_back(child);
768
+ }
769
+ }
770
+ return s;
771
+ }
772
+
773
+ Status GetRandomTableFileInDB(std::string* fname_out,
774
+ uint64_t* fsize_out = nullptr) {
775
+ Random rnd(6); // NB: hardly "random"
776
+ std::vector<FileAttributes> table_files;
777
+ Status s = GetTableFilesInDB(&table_files);
778
+ if (!s.ok()) {
779
+ return s;
780
+ }
781
+ if (table_files.empty()) {
782
+ return Status::NotFound("");
783
+ }
784
+ size_t i = rnd.Uniform(static_cast<int>(table_files.size()));
785
+ *fname_out = dbname_ + "/" + table_files[i].name;
786
+ if (fsize_out) {
787
+ *fsize_out = table_files[i].size_bytes;
788
+ }
789
+ return Status::OK();
790
+ }
791
+
792
+ Status CorruptRandomTableFileInDB() {
793
+ std::string fname;
794
+ uint64_t fsize = 0;
795
+ Status s = GetRandomTableFileInDB(&fname, &fsize);
796
+ if (!s.ok()) {
797
+ return s;
798
+ }
799
+
800
+ std::string file_contents;
801
+ s = ReadFileToString(test_db_env_.get(), fname, &file_contents);
802
+ if (!s.ok()) {
803
+ return s;
804
+ }
805
+ s = test_db_env_->DeleteFile(fname);
806
+ if (!s.ok()) {
807
+ return s;
808
+ }
809
+
810
+ file_contents[0] = (file_contents[0] + 257) % 256;
811
+ return WriteStringToFile(test_db_env_.get(), file_contents, fname);
812
+ }
813
+
814
+ void AssertDirectoryFilesMatchRegex(const std::string& dir,
815
+ const std::regex& pattern,
816
+ int minimum_count) {
817
+ std::vector<FileAttributes> children;
818
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
819
+ int found_count = 0;
820
+ for (const auto& child : children) {
821
+ const std::string match("match");
822
+ ASSERT_EQ(match, std::regex_replace(child.name, pattern, match));
823
+ ++found_count;
824
+ }
825
+ ASSERT_GE(found_count, minimum_count);
826
+ }
827
+
828
+ void AssertDirectoryFilesSizeIndicators(const std::string& dir,
829
+ int minimum_count) {
830
+ std::vector<FileAttributes> children;
831
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
832
+ int found_count = 0;
833
+ for (const auto& child : children) {
834
+ auto last_underscore = child.name.find_last_of('_');
835
+ auto last_dot = child.name.find_last_of('.');
836
+ ASSERT_NE(child.name, child.name.substr(0, last_underscore));
837
+ ASSERT_NE(child.name, child.name.substr(0, last_dot));
838
+ ASSERT_LT(last_underscore, last_dot);
839
+ std::string s = child.name.substr(last_underscore + 1,
840
+ last_dot - (last_underscore + 1));
841
+ ASSERT_EQ(s, ToString(child.size_bytes));
842
+ ++found_count;
843
+ }
844
+ ASSERT_GE(found_count, minimum_count);
845
+ }
846
+
847
+ // files
848
+ std::string dbname_;
849
+ std::string backupdir_;
850
+
851
+ // logger_ must be above backup_engine_ such that the engine's destructor,
852
+ // which uses a raw pointer to the logger, executes first.
853
+ std::shared_ptr<Logger> logger_;
854
+
855
+ // envs
856
+ std::unique_ptr<Env> db_chroot_env_;
857
+ std::unique_ptr<Env> backup_chroot_env_;
858
+ std::unique_ptr<TestEnv> test_db_env_;
859
+ std::unique_ptr<TestEnv> test_backup_env_;
860
+ std::unique_ptr<FileManager> file_manager_;
861
+ std::unique_ptr<FileManager> db_file_manager_;
862
+
863
+ // all the dbs!
864
+ DummyDB* dummy_db_; // BackupableDB owns dummy_db_
865
+ std::unique_ptr<DB> db_;
866
+ std::unique_ptr<BackupEngine> backup_engine_;
867
+
868
+ // options
869
+ Options options_;
870
+
871
+ protected:
872
+ std::unique_ptr<BackupableDBOptions> backupable_options_;
873
+ }; // BackupableDBTest
874
+
875
+ void AppendPath(const std::string& path, std::vector<std::string>& v) {
876
+ for (auto& f : v) {
877
+ f = path + f;
878
+ }
879
+ }
880
+
881
+ class BackupableDBTestWithParam : public BackupableDBTest,
882
+ public testing::WithParamInterface<bool> {
883
+ public:
884
+ BackupableDBTestWithParam() {
885
+ backupable_options_->share_files_with_checksum = GetParam();
886
+ }
887
+ void OpenDBAndBackupEngine(
888
+ bool destroy_old_data = false, bool dummy = false,
889
+ ShareOption shared_option = kShareNoChecksum) override {
890
+ BackupableDBTest::InitializeDBAndBackupEngine(dummy);
891
+ // reset backup env defaults
892
+ test_backup_env_->SetLimitWrittenFiles(1000000);
893
+ backupable_options_->destroy_old_data = destroy_old_data;
894
+ backupable_options_->share_table_files = shared_option != kNoShare;
895
+ // NOTE: keep share_files_with_checksum setting from constructor
896
+ OpenBackupEngine(destroy_old_data);
897
+ }
898
+ };
899
+
900
+ TEST_F(BackupableDBTest, FileCollision) {
901
+ const int keys_iteration = 5000;
902
+ for (const auto& sopt : kAllShareOptions) {
903
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
904
+ FillDB(db_.get(), 0, keys_iteration);
905
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
906
+ FillDB(db_.get(), 0, keys_iteration);
907
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
908
+ CloseDBAndBackupEngine();
909
+
910
+ // If the db directory has been cleaned up, it is sensitive to file
911
+ // collision.
912
+ DestroyDB(dbname_, options_);
913
+
914
+ // open with old backup
915
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
916
+ sopt);
917
+ FillDB(db_.get(), 0, keys_iteration * 2);
918
+ if (sopt != kShareNoChecksum) {
919
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
920
+ } else {
921
+ // The new table files created in FillDB() will clash with the old
922
+ // backup and sharing tables with no checksum will have the file
923
+ // collision problem.
924
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
925
+ ASSERT_OK(backup_engine_->PurgeOldBackups(0));
926
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
927
+ }
928
+ CloseDBAndBackupEngine();
929
+
930
+ // delete old data
931
+ DestroyDB(dbname_, options_);
932
+ }
933
+ }
934
+
935
+ // This test verifies that the verifyBackup method correctly identifies
936
+ // invalid backups
937
+ TEST_P(BackupableDBTestWithParam, VerifyBackup) {
938
+ const int keys_iteration = 5000;
939
+ OpenDBAndBackupEngine(true);
940
+ // create five backups
941
+ for (int i = 0; i < 5; ++i) {
942
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
943
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
944
+ }
945
+ CloseDBAndBackupEngine();
946
+
947
+ OpenDBAndBackupEngine();
948
+ // ---------- case 1. - valid backup -----------
949
+ ASSERT_TRUE(backup_engine_->VerifyBackup(1).ok());
950
+
951
+ // ---------- case 2. - delete a file -----------i
952
+ ASSERT_OK(file_manager_->DeleteRandomFileInDir(backupdir_ + "/private/1"));
953
+ ASSERT_TRUE(backup_engine_->VerifyBackup(1).IsNotFound());
954
+
955
+ // ---------- case 3. - corrupt a file -----------
956
+ std::string append_data = "Corrupting a random file";
957
+ ASSERT_OK(file_manager_->AppendToRandomFileInDir(backupdir_ + "/private/2",
958
+ append_data));
959
+ ASSERT_TRUE(backup_engine_->VerifyBackup(2).IsCorruption());
960
+
961
+ // ---------- case 4. - invalid backup -----------
962
+ ASSERT_TRUE(backup_engine_->VerifyBackup(6).IsNotFound());
963
+ CloseDBAndBackupEngine();
964
+ }
965
+
966
+ // open DB, write, close DB, backup, restore, repeat
967
+ TEST_P(BackupableDBTestWithParam, OfflineIntegrationTest) {
968
+ // has to be a big number, so that it triggers the memtable flush
969
+ const int keys_iteration = 5000;
970
+ const int max_key = keys_iteration * 4 + 10;
971
+ // first iter -- flush before backup
972
+ // second iter -- don't flush before backup
973
+ for (int iter = 0; iter < 2; ++iter) {
974
+ // delete old data
975
+ DestroyDB(dbname_, options_);
976
+ bool destroy_data = true;
977
+
978
+ // every iteration --
979
+ // 1. insert new data in the DB
980
+ // 2. backup the DB
981
+ // 3. destroy the db
982
+ // 4. restore the db, check everything is still there
983
+ for (int i = 0; i < 5; ++i) {
984
+ // in last iteration, put smaller amount of data,
985
+ int fill_up_to = std::min(keys_iteration * (i + 1), max_key);
986
+ // ---- insert new data and back up ----
987
+ OpenDBAndBackupEngine(destroy_data);
988
+ destroy_data = false;
989
+ // kAutoFlushOnly to preserve legacy test behavior (consider updating)
990
+ FillDB(db_.get(), keys_iteration * i, fill_up_to, kAutoFlushOnly);
991
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), iter == 0));
992
+ CloseDBAndBackupEngine();
993
+ DestroyDB(dbname_, options_);
994
+
995
+ // ---- make sure it's empty ----
996
+ DB* db = OpenDB();
997
+ AssertEmpty(db, 0, fill_up_to);
998
+ delete db;
999
+
1000
+ // ---- restore the DB ----
1001
+ OpenBackupEngine();
1002
+ if (i >= 3) { // test purge old backups
1003
+ // when i == 4, purge to only 1 backup
1004
+ // when i == 3, purge to 2 backups
1005
+ ASSERT_OK(backup_engine_->PurgeOldBackups(5 - i));
1006
+ }
1007
+ // ---- make sure the data is there ---
1008
+ AssertBackupConsistency(0, 0, fill_up_to, max_key);
1009
+ CloseBackupEngine();
1010
+ }
1011
+ }
1012
+ }
1013
+
1014
+ // open DB, write, backup, write, backup, close, restore
1015
+ TEST_P(BackupableDBTestWithParam, OnlineIntegrationTest) {
1016
+ // has to be a big number, so that it triggers the memtable flush
1017
+ const int keys_iteration = 5000;
1018
+ const int max_key = keys_iteration * 4 + 10;
1019
+ Random rnd(7);
1020
+ // delete old data
1021
+ DestroyDB(dbname_, options_);
1022
+
1023
+ OpenDBAndBackupEngine(true);
1024
+ // write some data, backup, repeat
1025
+ for (int i = 0; i < 5; ++i) {
1026
+ if (i == 4) {
1027
+ // delete backup number 2, online delete!
1028
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
1029
+ }
1030
+ // in last iteration, put smaller amount of data,
1031
+ // so that backups can share sst files
1032
+ int fill_up_to = std::min(keys_iteration * (i + 1), max_key);
1033
+ // kAutoFlushOnly to preserve legacy test behavior (consider updating)
1034
+ FillDB(db_.get(), keys_iteration * i, fill_up_to, kAutoFlushOnly);
1035
+ // we should get consistent results with flush_before_backup
1036
+ // set to both true and false
1037
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1038
+ }
1039
+ // close and destroy
1040
+ CloseDBAndBackupEngine();
1041
+ DestroyDB(dbname_, options_);
1042
+
1043
+ // ---- make sure it's empty ----
1044
+ DB* db = OpenDB();
1045
+ AssertEmpty(db, 0, max_key);
1046
+ delete db;
1047
+
1048
+ // ---- restore every backup and verify all the data is there ----
1049
+ OpenBackupEngine();
1050
+ for (int i = 1; i <= 5; ++i) {
1051
+ if (i == 2) {
1052
+ // we deleted backup 2
1053
+ Status s = backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_);
1054
+ ASSERT_TRUE(!s.ok());
1055
+ } else {
1056
+ int fill_up_to = std::min(keys_iteration * i, max_key);
1057
+ AssertBackupConsistency(i, 0, fill_up_to, max_key);
1058
+ }
1059
+ }
1060
+
1061
+ // delete some backups -- this should leave only backups 3 and 5 alive
1062
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1063
+ ASSERT_OK(backup_engine_->PurgeOldBackups(2));
1064
+
1065
+ std::vector<BackupInfo> backup_info;
1066
+ backup_engine_->GetBackupInfo(&backup_info);
1067
+ ASSERT_EQ(2UL, backup_info.size());
1068
+
1069
+ // check backup 3
1070
+ AssertBackupConsistency(3, 0, 3 * keys_iteration, max_key);
1071
+ // check backup 5
1072
+ AssertBackupConsistency(5, 0, max_key);
1073
+
1074
+ CloseBackupEngine();
1075
+ }
1076
+
1077
+ INSTANTIATE_TEST_CASE_P(BackupableDBTestWithParam, BackupableDBTestWithParam,
1078
+ ::testing::Bool());
1079
+
1080
+ // this will make sure that backup does not copy the same file twice
1081
+ TEST_F(BackupableDBTest, NoDoubleCopy_And_AutoGC) {
1082
+ OpenDBAndBackupEngine(true, true);
1083
+
1084
+ // should write 5 DB files + one meta file
1085
+ test_backup_env_->SetLimitWrittenFiles(7);
1086
+ test_backup_env_->ClearWrittenFiles();
1087
+ test_db_env_->SetLimitWrittenFiles(0);
1088
+ dummy_db_->live_files_ = {"/00010.sst", "/00011.sst", "/CURRENT",
1089
+ "/MANIFEST-01"};
1090
+ dummy_db_->wal_files_ = {{"/00011.log", true}, {"/00012.log", false}};
1091
+ test_db_env_->SetFilenamesForMockedAttrs(dummy_db_->live_files_);
1092
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
1093
+ std::vector<std::string> should_have_written = {
1094
+ "/shared/.00010.sst.tmp", "/shared/.00011.sst.tmp", "/private/1/CURRENT",
1095
+ "/private/1/MANIFEST-01", "/private/1/00011.log", "/meta/.1.tmp"};
1096
+ AppendPath(backupdir_, should_have_written);
1097
+ test_backup_env_->AssertWrittenFiles(should_have_written);
1098
+
1099
+ char db_number = '1';
1100
+
1101
+ for (std::string other_sst : {"00015.sst", "00017.sst", "00019.sst"}) {
1102
+ // should write 4 new DB files + one meta file
1103
+ // should not write/copy 00010.sst, since it's already there!
1104
+ test_backup_env_->SetLimitWrittenFiles(6);
1105
+ test_backup_env_->ClearWrittenFiles();
1106
+
1107
+ dummy_db_->live_files_ = {"/00010.sst", "/" + other_sst, "/CURRENT",
1108
+ "/MANIFEST-01"};
1109
+ dummy_db_->wal_files_ = {{"/00011.log", true}, {"/00012.log", false}};
1110
+ test_db_env_->SetFilenamesForMockedAttrs(dummy_db_->live_files_);
1111
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
1112
+ // should not open 00010.sst - it's already there
1113
+
1114
+ ++db_number;
1115
+ std::string private_dir = std::string("/private/") + db_number;
1116
+ should_have_written = {
1117
+ "/shared/." + other_sst + ".tmp", private_dir + "/CURRENT",
1118
+ private_dir + "/MANIFEST-01", private_dir + "/00011.log",
1119
+ std::string("/meta/.") + db_number + ".tmp"};
1120
+ AppendPath(backupdir_, should_have_written);
1121
+ test_backup_env_->AssertWrittenFiles(should_have_written);
1122
+ }
1123
+
1124
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
1125
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00010.sst"));
1126
+
1127
+ // 00011.sst was only in backup 1, should be deleted
1128
+ ASSERT_EQ(Status::NotFound(),
1129
+ test_backup_env_->FileExists(backupdir_ + "/shared/00011.sst"));
1130
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00015.sst"));
1131
+
1132
+ // MANIFEST file size should be only 100
1133
+ uint64_t size = 0;
1134
+ ASSERT_OK(test_backup_env_->GetFileSize(backupdir_ + "/private/2/MANIFEST-01",
1135
+ &size));
1136
+ ASSERT_EQ(100UL, size);
1137
+ ASSERT_OK(
1138
+ test_backup_env_->GetFileSize(backupdir_ + "/shared/00015.sst", &size));
1139
+ ASSERT_EQ(200UL, size);
1140
+
1141
+ CloseBackupEngine();
1142
+
1143
+ //
1144
+ // Now simulate incomplete delete by removing just meta
1145
+ //
1146
+ ASSERT_OK(test_backup_env_->DeleteFile(backupdir_ + "/meta/2"));
1147
+
1148
+ OpenBackupEngine();
1149
+
1150
+ // 1 appears to be removed, so
1151
+ // 2 non-corrupt and 0 corrupt seen
1152
+ std::vector<BackupInfo> backup_info;
1153
+ std::vector<BackupID> corrupt_backup_ids;
1154
+ backup_engine_->GetBackupInfo(&backup_info);
1155
+ backup_engine_->GetCorruptedBackups(&corrupt_backup_ids);
1156
+ ASSERT_EQ(2UL, backup_info.size());
1157
+ ASSERT_EQ(0UL, corrupt_backup_ids.size());
1158
+
1159
+ // Keep the two we see, but this should suffice to purge unreferenced
1160
+ // shared files from incomplete delete.
1161
+ ASSERT_OK(backup_engine_->PurgeOldBackups(2));
1162
+
1163
+ // Make sure dangling sst file has been removed (somewhere along this
1164
+ // process). GarbageCollect should not be needed.
1165
+ ASSERT_EQ(Status::NotFound(),
1166
+ test_backup_env_->FileExists(backupdir_ + "/shared/00015.sst"));
1167
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00017.sst"));
1168
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00019.sst"));
1169
+
1170
+ // Now actually purge a good one
1171
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1));
1172
+
1173
+ ASSERT_EQ(Status::NotFound(),
1174
+ test_backup_env_->FileExists(backupdir_ + "/shared/00017.sst"));
1175
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00019.sst"));
1176
+
1177
+ CloseDBAndBackupEngine();
1178
+ }
1179
+
1180
+ // test various kind of corruptions that may happen:
1181
+ // 1. Not able to write a file for backup - that backup should fail,
1182
+ // everything else should work
1183
+ // 2. Corrupted backup meta file or missing backuped file - we should
1184
+ // not be able to open that backup, but all other backups should be
1185
+ // fine
1186
+ // 3. Corrupted checksum value - if the checksum is not a valid uint32_t,
1187
+ // db open should fail, otherwise, it aborts during the restore process.
1188
+ TEST_F(BackupableDBTest, CorruptionsTest) {
1189
+ const int keys_iteration = 5000;
1190
+ Random rnd(6);
1191
+ Status s;
1192
+
1193
+ OpenDBAndBackupEngine(true);
1194
+ // create five backups
1195
+ for (int i = 0; i < 5; ++i) {
1196
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1197
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1198
+ }
1199
+
1200
+ // ---------- case 1. - fail a write -----------
1201
+ // try creating backup 6, but fail a write
1202
+ FillDB(db_.get(), keys_iteration * 5, keys_iteration * 6);
1203
+ test_backup_env_->SetLimitWrittenFiles(2);
1204
+ // should fail
1205
+ s = backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2));
1206
+ ASSERT_NOK(s);
1207
+ test_backup_env_->SetLimitWrittenFiles(1000000);
1208
+ // latest backup should have all the keys
1209
+ CloseDBAndBackupEngine();
1210
+ AssertBackupConsistency(0, 0, keys_iteration * 5, keys_iteration * 6);
1211
+
1212
+ // --------- case 2. corrupted backup meta or missing backuped file ----
1213
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/5", 3));
1214
+ // since 5 meta is now corrupted, latest backup should be 4
1215
+ AssertBackupConsistency(0, 0, keys_iteration * 4, keys_iteration * 5);
1216
+ OpenBackupEngine();
1217
+ s = backup_engine_->RestoreDBFromBackup(5, dbname_, dbname_);
1218
+ ASSERT_NOK(s);
1219
+ CloseBackupEngine();
1220
+ ASSERT_OK(file_manager_->DeleteRandomFileInDir(backupdir_ + "/private/4"));
1221
+ // 4 is corrupted, 3 is the latest backup now
1222
+ AssertBackupConsistency(0, 0, keys_iteration * 3, keys_iteration * 5);
1223
+ OpenBackupEngine();
1224
+ s = backup_engine_->RestoreDBFromBackup(4, dbname_, dbname_);
1225
+ CloseBackupEngine();
1226
+ ASSERT_NOK(s);
1227
+
1228
+ // --------- case 3. corrupted checksum value ----
1229
+ ASSERT_OK(file_manager_->CorruptChecksum(backupdir_ + "/meta/3", false));
1230
+ // checksum of backup 3 is an invalid value, this can be detected at
1231
+ // db open time, and it reverts to the previous backup automatically
1232
+ AssertBackupConsistency(0, 0, keys_iteration * 2, keys_iteration * 5);
1233
+ // checksum of the backup 2 appears to be valid, this can cause checksum
1234
+ // mismatch and abort restore process
1235
+ ASSERT_OK(file_manager_->CorruptChecksum(backupdir_ + "/meta/2", true));
1236
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1237
+ OpenBackupEngine();
1238
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1239
+ s = backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_);
1240
+ ASSERT_NOK(s);
1241
+
1242
+ // make sure that no corrupt backups have actually been deleted!
1243
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/1"));
1244
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1245
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/3"));
1246
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/4"));
1247
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/5"));
1248
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/1"));
1249
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/2"));
1250
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/3"));
1251
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/4"));
1252
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/5"));
1253
+
1254
+ // delete the corrupt backups and then make sure they're actually deleted
1255
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1256
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1257
+ ASSERT_OK(backup_engine_->DeleteBackup(3));
1258
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
1259
+ // Should not be needed anymore with auto-GC on DeleteBackup
1260
+ //(void)backup_engine_->GarbageCollect();
1261
+ ASSERT_EQ(Status::NotFound(),
1262
+ file_manager_->FileExists(backupdir_ + "/meta/5"));
1263
+ ASSERT_EQ(Status::NotFound(),
1264
+ file_manager_->FileExists(backupdir_ + "/private/5"));
1265
+ ASSERT_EQ(Status::NotFound(),
1266
+ file_manager_->FileExists(backupdir_ + "/meta/4"));
1267
+ ASSERT_EQ(Status::NotFound(),
1268
+ file_manager_->FileExists(backupdir_ + "/private/4"));
1269
+ ASSERT_EQ(Status::NotFound(),
1270
+ file_manager_->FileExists(backupdir_ + "/meta/3"));
1271
+ ASSERT_EQ(Status::NotFound(),
1272
+ file_manager_->FileExists(backupdir_ + "/private/3"));
1273
+ ASSERT_EQ(Status::NotFound(),
1274
+ file_manager_->FileExists(backupdir_ + "/meta/2"));
1275
+ ASSERT_EQ(Status::NotFound(),
1276
+ file_manager_->FileExists(backupdir_ + "/private/2"));
1277
+ CloseBackupEngine();
1278
+ AssertBackupConsistency(0, 0, keys_iteration * 1, keys_iteration * 5);
1279
+
1280
+ // new backup should be 2!
1281
+ OpenDBAndBackupEngine();
1282
+ FillDB(db_.get(), keys_iteration * 1, keys_iteration * 2);
1283
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1284
+ CloseDBAndBackupEngine();
1285
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * 5);
1286
+ }
1287
+
1288
+ // Corrupt a file but maintain its size
1289
+ TEST_F(BackupableDBTest, CorruptFileMaintainSize) {
1290
+ const int keys_iteration = 5000;
1291
+ OpenDBAndBackupEngine(true);
1292
+ // create a backup
1293
+ FillDB(db_.get(), 0, keys_iteration);
1294
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1295
+ CloseDBAndBackupEngine();
1296
+
1297
+ OpenDBAndBackupEngine();
1298
+ // verify with file size
1299
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1300
+ // verify with file checksum
1301
+ ASSERT_OK(backup_engine_->VerifyBackup(1, true));
1302
+
1303
+ std::string file_to_corrupt;
1304
+ uint64_t file_size = 0;
1305
+ // under normal circumstance, there should be at least one nonempty file
1306
+ while (file_size == 0) {
1307
+ // get a random file in /private/1
1308
+ ASSERT_OK(file_manager_->GetRandomFileInDir(backupdir_ + "/private/1",
1309
+ &file_to_corrupt, &file_size));
1310
+ // corrupt the file by replacing its content by file_size random bytes
1311
+ ASSERT_OK(file_manager_->CorruptFile(file_to_corrupt, file_size));
1312
+ }
1313
+ // file sizes match
1314
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1315
+ // file checksums mismatch
1316
+ ASSERT_NOK(backup_engine_->VerifyBackup(1, true));
1317
+ // sanity check, use default second argument
1318
+ ASSERT_OK(backup_engine_->VerifyBackup(1));
1319
+ CloseDBAndBackupEngine();
1320
+
1321
+ // an extra challenge
1322
+ // set share_files_with_checksum to true and do two more backups
1323
+ // corrupt all the table files in shared_checksum but maintain their sizes
1324
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1325
+ kShareWithChecksum);
1326
+ // creat two backups
1327
+ for (int i = 1; i < 3; ++i) {
1328
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1329
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1330
+ }
1331
+ CloseDBAndBackupEngine();
1332
+
1333
+ OpenDBAndBackupEngine();
1334
+ std::vector<FileAttributes> children;
1335
+ const std::string dir = backupdir_ + "/shared_checksum";
1336
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
1337
+ for (const auto& child : children) {
1338
+ if (child.size_bytes == 0) {
1339
+ continue;
1340
+ }
1341
+ // corrupt the file by replacing its content by file_size random bytes
1342
+ ASSERT_OK(
1343
+ file_manager_->CorruptFile(dir + "/" + child.name, child.size_bytes));
1344
+ }
1345
+ // file sizes match
1346
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1347
+ ASSERT_OK(backup_engine_->VerifyBackup(2, false));
1348
+ // file checksums mismatch
1349
+ ASSERT_NOK(backup_engine_->VerifyBackup(1, true));
1350
+ ASSERT_NOK(backup_engine_->VerifyBackup(2, true));
1351
+ CloseDBAndBackupEngine();
1352
+ }
1353
+
1354
+ // Test if BackupEngine will fail to create new backup if some table has been
1355
+ // corrupted and the table file checksum is stored in the DB manifest
1356
+ TEST_F(BackupableDBTest, TableFileCorruptedBeforeBackup) {
1357
+ const int keys_iteration = 50000;
1358
+
1359
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1360
+ kNoShare);
1361
+ FillDB(db_.get(), 0, keys_iteration);
1362
+ CloseAndReopenDB();
1363
+ // corrupt a random table file in the DB directory
1364
+ ASSERT_OK(CorruptRandomTableFileInDB());
1365
+ // file_checksum_gen_factory is null, and thus table checksum is not
1366
+ // verified for creating a new backup; no correction is detected
1367
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1368
+ CloseDBAndBackupEngine();
1369
+
1370
+ // delete old files in db
1371
+ ASSERT_OK(DestroyDB(dbname_, options_));
1372
+
1373
+ // Enable table file checksum in DB manifest
1374
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1375
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1376
+ kNoShare);
1377
+ FillDB(db_.get(), 0, keys_iteration);
1378
+ CloseAndReopenDB();
1379
+ // corrupt a random table file in the DB directory
1380
+ ASSERT_OK(CorruptRandomTableFileInDB());
1381
+ // table file checksum is enabled so we should be able to detect any
1382
+ // corruption
1383
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1384
+ CloseDBAndBackupEngine();
1385
+ }
1386
+
1387
+ // Test if BackupEngine will fail to create new backup if some table has been
1388
+ // corrupted and the table file checksum is stored in the DB manifest for the
1389
+ // case when backup table files will be stored in a shared directory
1390
+ TEST_P(BackupableDBTestWithParam, TableFileCorruptedBeforeBackup) {
1391
+ const int keys_iteration = 50000;
1392
+
1393
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1394
+ FillDB(db_.get(), 0, keys_iteration);
1395
+ CloseAndReopenDB();
1396
+ // corrupt a random table file in the DB directory
1397
+ ASSERT_OK(CorruptRandomTableFileInDB());
1398
+ // cannot detect corruption since DB manifest has no table checksums
1399
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1400
+ CloseDBAndBackupEngine();
1401
+
1402
+ // delete old files in db
1403
+ ASSERT_OK(DestroyDB(dbname_, options_));
1404
+
1405
+ // Enable table checksums in DB manifest
1406
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1407
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1408
+ FillDB(db_.get(), 0, keys_iteration);
1409
+ CloseAndReopenDB();
1410
+ // corrupt a random table file in the DB directory
1411
+ ASSERT_OK(CorruptRandomTableFileInDB());
1412
+ // corruption is detected
1413
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1414
+ CloseDBAndBackupEngine();
1415
+ }
1416
+
1417
+ TEST_F(BackupableDBTest, TableFileWithoutDbChecksumCorruptedDuringBackup) {
1418
+ const int keys_iteration = 50000;
1419
+ backupable_options_->share_files_with_checksum_naming =
1420
+ kLegacyCrc32cAndFileSize;
1421
+ // When share_files_with_checksum is on, we calculate checksums of table
1422
+ // files before and after copying. So we can test whether a corruption has
1423
+ // happened during the file is copied to backup directory.
1424
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1425
+ kShareWithChecksum);
1426
+
1427
+ FillDB(db_.get(), 0, keys_iteration);
1428
+ std::atomic<bool> corrupted{false};
1429
+ // corrupt files when copying to the backup directory
1430
+ SyncPoint::GetInstance()->SetCallBack(
1431
+ "BackupEngineImpl::CopyOrCreateFile:CorruptionDuringBackup",
1432
+ [&](void* data) {
1433
+ if (data != nullptr) {
1434
+ Slice* d = reinterpret_cast<Slice*>(data);
1435
+ if (!d->empty()) {
1436
+ d->remove_suffix(1);
1437
+ corrupted = true;
1438
+ }
1439
+ }
1440
+ });
1441
+ SyncPoint::GetInstance()->EnableProcessing();
1442
+ Status s = backup_engine_->CreateNewBackup(db_.get());
1443
+ if (corrupted) {
1444
+ ASSERT_NOK(s);
1445
+ } else {
1446
+ // should not in this path in normal cases
1447
+ ASSERT_OK(s);
1448
+ }
1449
+
1450
+ SyncPoint::GetInstance()->DisableProcessing();
1451
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1452
+
1453
+ CloseDBAndBackupEngine();
1454
+ // delete old files in db
1455
+ ASSERT_OK(DestroyDB(dbname_, options_));
1456
+ }
1457
+
1458
+ TEST_F(BackupableDBTest, TableFileWithDbChecksumCorruptedDuringBackup) {
1459
+ const int keys_iteration = 50000;
1460
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1461
+ for (auto& sopt : kAllShareOptions) {
1462
+ // Since the default DB table file checksum is on, we obtain checksums of
1463
+ // table files from the DB manifest before copying and verify it with the
1464
+ // one calculated during copying.
1465
+ // Therefore, we can test whether a corruption has happened during the file
1466
+ // being copied to backup directory.
1467
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
1468
+
1469
+ FillDB(db_.get(), 0, keys_iteration);
1470
+
1471
+ // corrupt files when copying to the backup directory
1472
+ SyncPoint::GetInstance()->SetCallBack(
1473
+ "BackupEngineImpl::CopyOrCreateFile:CorruptionDuringBackup",
1474
+ [&](void* data) {
1475
+ if (data != nullptr) {
1476
+ Slice* d = reinterpret_cast<Slice*>(data);
1477
+ if (!d->empty()) {
1478
+ d->remove_suffix(1);
1479
+ }
1480
+ }
1481
+ });
1482
+ SyncPoint::GetInstance()->EnableProcessing();
1483
+ // The only case that we can't detect a corruption is when the file
1484
+ // being backed up is empty. But as keys_iteration is large, such
1485
+ // a case shouldn't have happened and we should be able to detect
1486
+ // the corruption.
1487
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1488
+
1489
+ SyncPoint::GetInstance()->DisableProcessing();
1490
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1491
+
1492
+ CloseDBAndBackupEngine();
1493
+ // delete old files in db
1494
+ ASSERT_OK(DestroyDB(dbname_, options_));
1495
+ }
1496
+ }
1497
+
1498
+ TEST_F(BackupableDBTest, InterruptCreationTest) {
1499
+ // Interrupt backup creation by failing new writes and failing cleanup of the
1500
+ // partial state. Then verify a subsequent backup can still succeed.
1501
+ const int keys_iteration = 5000;
1502
+ Random rnd(6);
1503
+
1504
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1505
+ FillDB(db_.get(), 0, keys_iteration);
1506
+ test_backup_env_->SetLimitWrittenFiles(2);
1507
+ test_backup_env_->SetDeleteFileFailure(true);
1508
+ // should fail creation
1509
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1510
+ CloseDBAndBackupEngine();
1511
+ // should also fail cleanup so the tmp directory stays behind
1512
+ ASSERT_OK(backup_chroot_env_->FileExists(backupdir_ + "/private/1/"));
1513
+
1514
+ OpenDBAndBackupEngine(false /* destroy_old_data */);
1515
+ test_backup_env_->SetLimitWrittenFiles(1000000);
1516
+ test_backup_env_->SetDeleteFileFailure(false);
1517
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1518
+ // latest backup should have all the keys
1519
+ CloseDBAndBackupEngine();
1520
+ AssertBackupConsistency(0, 0, keys_iteration);
1521
+ }
1522
+
1523
+ TEST_F(BackupableDBTest, FlushCompactDuringBackupCheckpoint) {
1524
+ const int keys_iteration = 5000;
1525
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1526
+ for (const auto& sopt : kAllShareOptions) {
1527
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
1528
+ FillDB(db_.get(), 0, keys_iteration);
1529
+ // That FillDB leaves a mix of flushed and unflushed data
1530
+ SyncPoint::GetInstance()->LoadDependency(
1531
+ {{"CheckpointImpl::CreateCustomCheckpoint:AfterGetLive1",
1532
+ "BackupableDBTest::FlushCompactDuringBackupCheckpoint:Before"},
1533
+ {"BackupableDBTest::FlushCompactDuringBackupCheckpoint:After",
1534
+ "CheckpointImpl::CreateCustomCheckpoint:AfterGetLive2"}});
1535
+ SyncPoint::GetInstance()->EnableProcessing();
1536
+ ROCKSDB_NAMESPACE::port::Thread flush_thread{[this]() {
1537
+ TEST_SYNC_POINT(
1538
+ "BackupableDBTest::FlushCompactDuringBackupCheckpoint:Before");
1539
+ FillDB(db_.get(), keys_iteration, 2 * keys_iteration);
1540
+ ASSERT_OK(db_->Flush(FlushOptions()));
1541
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
1542
+ ASSERT_OK(dbi->TEST_WaitForFlushMemTable());
1543
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1544
+ ASSERT_OK(dbi->TEST_WaitForCompact());
1545
+ TEST_SYNC_POINT(
1546
+ "BackupableDBTest::FlushCompactDuringBackupCheckpoint:After");
1547
+ }};
1548
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1549
+ flush_thread.join();
1550
+ CloseDBAndBackupEngine();
1551
+ SyncPoint::GetInstance()->DisableProcessing();
1552
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1553
+ /* FIXME(peterd): reinstate with option for checksum in file names
1554
+ if (sopt == kShareWithChecksum) {
1555
+ // Ensure we actually got DB manifest checksums by inspecting
1556
+ // shared_checksum file names for hex checksum component
1557
+ std::regex expected("[^_]+_[0-9A-F]{8}_[^_]+.sst");
1558
+ std::vector<FileAttributes> children;
1559
+ const std::string dir = backupdir_ + "/shared_checksum";
1560
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
1561
+ for (const auto& child : children) {
1562
+ if (child.size_bytes == 0) {
1563
+ continue;
1564
+ }
1565
+ const std::string match("match");
1566
+ EXPECT_EQ(match, std::regex_replace(child.name, expected, match));
1567
+ }
1568
+ }
1569
+ */
1570
+ AssertBackupConsistency(0, 0, keys_iteration);
1571
+ }
1572
+ }
1573
+
1574
+ inline std::string OptionsPath(std::string ret, int backupID) {
1575
+ ret += "/private/";
1576
+ ret += std::to_string(backupID);
1577
+ ret += "/";
1578
+ return ret;
1579
+ }
1580
+
1581
+ // Backup the LATEST options file to
1582
+ // "<backup_dir>/private/<backup_id>/OPTIONS<number>"
1583
+
1584
+ TEST_F(BackupableDBTest, BackupOptions) {
1585
+ OpenDBAndBackupEngine(true);
1586
+ for (int i = 1; i < 5; i++) {
1587
+ std::string name;
1588
+ std::vector<std::string> filenames;
1589
+ // Must reset() before reset(OpenDB()) again.
1590
+ // Calling OpenDB() while *db_ is existing will cause LOCK issue
1591
+ db_.reset();
1592
+ db_.reset(OpenDB());
1593
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1594
+ ASSERT_OK(ROCKSDB_NAMESPACE::GetLatestOptionsFileName(db_->GetName(),
1595
+ options_.env, &name));
1596
+ ASSERT_OK(file_manager_->FileExists(OptionsPath(backupdir_, i) + name));
1597
+ ASSERT_OK(backup_chroot_env_->GetChildren(OptionsPath(backupdir_, i),
1598
+ &filenames));
1599
+ for (auto fn : filenames) {
1600
+ if (fn.compare(0, 7, "OPTIONS") == 0) {
1601
+ ASSERT_EQ(name, fn);
1602
+ }
1603
+ }
1604
+ }
1605
+
1606
+ CloseDBAndBackupEngine();
1607
+ }
1608
+
1609
+ TEST_F(BackupableDBTest, SetOptionsBackupRaceCondition) {
1610
+ OpenDBAndBackupEngine(true);
1611
+ SyncPoint::GetInstance()->LoadDependency(
1612
+ {{"CheckpointImpl::CreateCheckpoint:SavedLiveFiles1",
1613
+ "BackupableDBTest::SetOptionsBackupRaceCondition:BeforeSetOptions"},
1614
+ {"BackupableDBTest::SetOptionsBackupRaceCondition:AfterSetOptions",
1615
+ "CheckpointImpl::CreateCheckpoint:SavedLiveFiles2"}});
1616
+ SyncPoint::GetInstance()->EnableProcessing();
1617
+ ROCKSDB_NAMESPACE::port::Thread setoptions_thread{[this]() {
1618
+ TEST_SYNC_POINT(
1619
+ "BackupableDBTest::SetOptionsBackupRaceCondition:BeforeSetOptions");
1620
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
1621
+ // Change arbitrary option to trigger OPTIONS file deletion
1622
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1623
+ {{"paranoid_file_checks", "false"}}));
1624
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1625
+ {{"paranoid_file_checks", "true"}}));
1626
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1627
+ {{"paranoid_file_checks", "false"}}));
1628
+ TEST_SYNC_POINT(
1629
+ "BackupableDBTest::SetOptionsBackupRaceCondition:AfterSetOptions");
1630
+ }};
1631
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1632
+ setoptions_thread.join();
1633
+ CloseDBAndBackupEngine();
1634
+ }
1635
+
1636
+ // This test verifies we don't delete the latest backup when read-only option is
1637
+ // set
1638
+ TEST_F(BackupableDBTest, NoDeleteWithReadOnly) {
1639
+ const int keys_iteration = 5000;
1640
+ Random rnd(6);
1641
+
1642
+ OpenDBAndBackupEngine(true);
1643
+ // create five backups
1644
+ for (int i = 0; i < 5; ++i) {
1645
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1646
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1647
+ }
1648
+ CloseDBAndBackupEngine();
1649
+ ASSERT_OK(file_manager_->WriteToFile(backupdir_ + "/LATEST_BACKUP", "4"));
1650
+
1651
+ backupable_options_->destroy_old_data = false;
1652
+ BackupEngineReadOnly* read_only_backup_engine;
1653
+ ASSERT_OK(BackupEngineReadOnly::Open(backup_chroot_env_.get(),
1654
+ *backupable_options_,
1655
+ &read_only_backup_engine));
1656
+
1657
+ // assert that data from backup 5 is still here (even though LATEST_BACKUP
1658
+ // says 4 is latest)
1659
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/5"));
1660
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/5"));
1661
+
1662
+ // Behavior change: We now ignore LATEST_BACKUP contents. This means that
1663
+ // we should have 5 backups, even if LATEST_BACKUP says 4.
1664
+ std::vector<BackupInfo> backup_info;
1665
+ read_only_backup_engine->GetBackupInfo(&backup_info);
1666
+ ASSERT_EQ(5UL, backup_info.size());
1667
+ delete read_only_backup_engine;
1668
+ }
1669
+
1670
+ TEST_F(BackupableDBTest, FailOverwritingBackups) {
1671
+ options_.write_buffer_size = 1024 * 1024 * 1024; // 1GB
1672
+ options_.disable_auto_compactions = true;
1673
+
1674
+ // create backups 1, 2, 3, 4, 5
1675
+ OpenDBAndBackupEngine(true);
1676
+ for (int i = 0; i < 5; ++i) {
1677
+ CloseDBAndBackupEngine();
1678
+ DeleteLogFiles();
1679
+ OpenDBAndBackupEngine(false);
1680
+ FillDB(db_.get(), 100 * i, 100 * (i + 1), kFlushAll);
1681
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1682
+ }
1683
+ CloseDBAndBackupEngine();
1684
+
1685
+ // restore 3
1686
+ OpenBackupEngine();
1687
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(3, dbname_, dbname_));
1688
+ CloseBackupEngine();
1689
+
1690
+ OpenDBAndBackupEngine(false);
1691
+ // More data, bigger SST
1692
+ FillDB(db_.get(), 1000, 1300, kFlushAll);
1693
+ Status s = backup_engine_->CreateNewBackup(db_.get());
1694
+ // the new backup fails because new table files
1695
+ // clash with old table files from backups 4 and 5
1696
+ // (since write_buffer_size is huge, we can be sure that
1697
+ // each backup will generate only one sst file and that
1698
+ // a file generated here would have the same name as an
1699
+ // sst file generated by backup 4, and will be bigger)
1700
+ ASSERT_TRUE(s.IsCorruption());
1701
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1702
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1703
+ // now, the backup can succeed
1704
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1705
+ CloseDBAndBackupEngine();
1706
+ }
1707
+
1708
+ TEST_F(BackupableDBTest, NoShareTableFiles) {
1709
+ const int keys_iteration = 5000;
1710
+ OpenDBAndBackupEngine(true, false, kNoShare);
1711
+ for (int i = 0; i < 5; ++i) {
1712
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1713
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(i % 2)));
1714
+ }
1715
+ CloseDBAndBackupEngine();
1716
+
1717
+ for (int i = 0; i < 5; ++i) {
1718
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1719
+ keys_iteration * 6);
1720
+ }
1721
+ }
1722
+
1723
+ // Verify that you can backup and restore with share_files_with_checksum on
1724
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksums) {
1725
+ const int keys_iteration = 5000;
1726
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
1727
+ for (int i = 0; i < 5; ++i) {
1728
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1729
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(i % 2)));
1730
+ }
1731
+ CloseDBAndBackupEngine();
1732
+
1733
+ for (int i = 0; i < 5; ++i) {
1734
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1735
+ keys_iteration * 6);
1736
+ }
1737
+ }
1738
+
1739
+ // Verify that you can backup and restore using share_files_with_checksum set to
1740
+ // false and then transition this option to true
1741
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsTransition) {
1742
+ const int keys_iteration = 5000;
1743
+ // set share_files_with_checksum to false
1744
+ OpenDBAndBackupEngine(true, false, kShareNoChecksum);
1745
+ for (int i = 0; i < 5; ++i) {
1746
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1747
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1748
+ }
1749
+ CloseDBAndBackupEngine();
1750
+
1751
+ for (int i = 0; i < 5; ++i) {
1752
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1753
+ keys_iteration * 6);
1754
+ }
1755
+
1756
+ // set share_files_with_checksum to true and do some more backups
1757
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
1758
+ kShareWithChecksum);
1759
+ for (int i = 5; i < 10; ++i) {
1760
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1761
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1762
+ }
1763
+ CloseDBAndBackupEngine();
1764
+
1765
+ // Verify first (about to delete)
1766
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 11);
1767
+
1768
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
1769
+ // is OK even if we open without share_table_files
1770
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
1771
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
1772
+ ASSERT_OK(backup_engine_->GarbageCollect());
1773
+ CloseDBAndBackupEngine();
1774
+
1775
+ // Verify rest (not deleted)
1776
+ for (int i = 1; i < 10; ++i) {
1777
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1778
+ keys_iteration * 11);
1779
+ }
1780
+ }
1781
+
1782
+ // Verify backup and restore with various naming options, check names
1783
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsNewNaming) {
1784
+ ASSERT_TRUE(backupable_options_->share_files_with_checksum_naming ==
1785
+ kNamingDefault);
1786
+
1787
+ const int keys_iteration = 5000;
1788
+
1789
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
1790
+ FillDB(db_.get(), 0, keys_iteration);
1791
+ CloseDBAndBackupEngine();
1792
+
1793
+ static const std::map<ShareFilesNaming, std::string> option_to_expected = {
1794
+ {kLegacyCrc32cAndFileSize, "[0-9]+_[0-9]+_[0-9]+[.]sst"},
1795
+ // kFlagIncludeFileSize redundant here
1796
+ {kLegacyCrc32cAndFileSize | kFlagIncludeFileSize,
1797
+ "[0-9]+_[0-9]+_[0-9]+[.]sst"},
1798
+ {kUseDbSessionId, "[0-9]+_s[0-9A-Z]{20}[.]sst"},
1799
+ {kUseDbSessionId | kFlagIncludeFileSize,
1800
+ "[0-9]+_s[0-9A-Z]{20}_[0-9]+[.]sst"},
1801
+ };
1802
+
1803
+ for (const auto& pair : option_to_expected) {
1804
+ // kFlagMatchInterimNaming must not matter on new SST files
1805
+ for (const auto option :
1806
+ {pair.first, pair.first | kFlagMatchInterimNaming}) {
1807
+ CloseAndReopenDB();
1808
+ backupable_options_->share_files_with_checksum_naming = option;
1809
+ OpenBackupEngine(true /*destroy_old_data*/);
1810
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1811
+ CloseDBAndBackupEngine();
1812
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 2);
1813
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum",
1814
+ std::regex(pair.second),
1815
+ 1 /* minimum_count */);
1816
+ if (std::string::npos != pair.second.find("_[0-9]+[.]sst")) {
1817
+ AssertDirectoryFilesSizeIndicators(backupdir_ + "/shared_checksum",
1818
+ 1 /* minimum_count */);
1819
+ }
1820
+ }
1821
+ }
1822
+ }
1823
+
1824
+ // Mimic SST file generated by early internal-only 6.12 release
1825
+ // and test various naming options. This test can be removed when
1826
+ // the kFlagMatchInterimNaming feature is removed.
1827
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsInterimNaming) {
1828
+ const int keys_iteration = 5000;
1829
+
1830
+ // Essentially, reinstate old implementaiton of generating a DB
1831
+ // session id. This is how we distinguish "interim" SST files from
1832
+ // newer ones: from the form of the db session id string.
1833
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1834
+ "DBImpl::SetDbSessionId", [&](void* sid_void_star) {
1835
+ std::string* sid = static_cast<std::string*>(sid_void_star);
1836
+ *sid = test_db_env_->GenerateUniqueId();
1837
+ if (!sid->empty() && sid->back() == '\n') {
1838
+ sid->pop_back();
1839
+ }
1840
+ });
1841
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1842
+
1843
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
1844
+ FillDB(db_.get(), 0, keys_iteration);
1845
+ CloseDBAndBackupEngine();
1846
+
1847
+ static const std::map<ShareFilesNaming, std::string> option_to_expected = {
1848
+ {kLegacyCrc32cAndFileSize, "[0-9]+_[0-9]+_[0-9]+[.]sst"},
1849
+ // kFlagMatchInterimNaming ignored here
1850
+ {kLegacyCrc32cAndFileSize | kFlagMatchInterimNaming,
1851
+ "[0-9]+_[0-9]+_[0-9]+[.]sst"},
1852
+ {kUseDbSessionId, "[0-9]+_s[0-9a-fA-F-]+[.]sst"},
1853
+ {kUseDbSessionId | kFlagIncludeFileSize,
1854
+ "[0-9]+_s[0-9a-fA-F-]+_[0-9]+[.]sst"},
1855
+ {kUseDbSessionId | kFlagMatchInterimNaming, "[0-9]+_[0-9a-fA-F-]+[.]sst"},
1856
+ {kUseDbSessionId | kFlagIncludeFileSize | kFlagMatchInterimNaming,
1857
+ "[0-9]+_[0-9a-fA-F-]+[.]sst"},
1858
+ };
1859
+
1860
+ for (const auto& pair : option_to_expected) {
1861
+ CloseAndReopenDB();
1862
+ backupable_options_->share_files_with_checksum_naming = pair.first;
1863
+ OpenBackupEngine(true /*destroy_old_data*/);
1864
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1865
+ CloseDBAndBackupEngine();
1866
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 2);
1867
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum",
1868
+ std::regex(pair.second),
1869
+ 1 /* minimum_count */);
1870
+ }
1871
+
1872
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1873
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1874
+ }
1875
+
1876
+ // Mimic SST file generated by pre-6.12 releases and verify that
1877
+ // old names are always used regardless of naming option.
1878
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsOldFileNaming) {
1879
+ const int keys_iteration = 5000;
1880
+
1881
+ // Pre-6.12 release did not include db id and db session id properties.
1882
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1883
+ "PropertyBlockBuilder::AddTableProperty:Start", [&](void* props_vs) {
1884
+ auto props = static_cast<TableProperties*>(props_vs);
1885
+ props->db_id = "";
1886
+ props->db_session_id = "";
1887
+ });
1888
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1889
+
1890
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
1891
+ FillDB(db_.get(), 0, keys_iteration);
1892
+ CloseDBAndBackupEngine();
1893
+
1894
+ // Old names should always be used on old files
1895
+ const std::regex expected("[0-9]+_[0-9]+_[0-9]+[.]sst");
1896
+
1897
+ for (ShareFilesNaming option : {kNamingDefault, kUseDbSessionId}) {
1898
+ CloseAndReopenDB();
1899
+ backupable_options_->share_files_with_checksum_naming = option;
1900
+ OpenBackupEngine(true /*destroy_old_data*/);
1901
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1902
+ CloseDBAndBackupEngine();
1903
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 2);
1904
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum", expected,
1905
+ 1 /* minimum_count */);
1906
+ }
1907
+
1908
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1909
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
1910
+ }
1911
+
1912
+ // Test how naming options interact with detecting DB corruption
1913
+ // between incremental backups
1914
+ TEST_F(BackupableDBTest, TableFileCorruptionBeforeIncremental) {
1915
+ const auto share_no_checksum = static_cast<ShareFilesNaming>(0);
1916
+
1917
+ for (bool corrupt_before_first_backup : {false, true}) {
1918
+ for (ShareFilesNaming option :
1919
+ {share_no_checksum, kLegacyCrc32cAndFileSize, kNamingDefault}) {
1920
+ auto share =
1921
+ option == share_no_checksum ? kShareNoChecksum : kShareWithChecksum;
1922
+ if (option != share_no_checksum) {
1923
+ backupable_options_->share_files_with_checksum_naming = option;
1924
+ }
1925
+ OpenDBAndBackupEngine(true, false, share);
1926
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
1927
+ // A small SST file
1928
+ ASSERT_OK(dbi->Put(WriteOptions(), "x", "y"));
1929
+ ASSERT_OK(dbi->Flush(FlushOptions()));
1930
+ // And a bigger one
1931
+ ASSERT_OK(dbi->Put(WriteOptions(), "y", Random(42).RandomString(500)));
1932
+ ASSERT_OK(dbi->Flush(FlushOptions()));
1933
+ ASSERT_OK(dbi->TEST_WaitForFlushMemTable());
1934
+ CloseDBAndBackupEngine();
1935
+
1936
+ std::vector<FileAttributes> table_files;
1937
+ ASSERT_OK(GetTableFilesInDB(&table_files));
1938
+ ASSERT_EQ(table_files.size(), 2);
1939
+ std::string tf0 = dbname_ + "/" + table_files[0].name;
1940
+ std::string tf1 = dbname_ + "/" + table_files[1].name;
1941
+
1942
+ if (corrupt_before_first_backup) {
1943
+ // This corrupts a data block, which does not cause DB open
1944
+ // failure, only failure on accessing the block.
1945
+ ASSERT_OK(db_file_manager_->CorruptFileStart(tf0));
1946
+ }
1947
+
1948
+ OpenDBAndBackupEngine(false, false, share);
1949
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1950
+ CloseDBAndBackupEngine();
1951
+
1952
+ // if corrupt_before_first_backup, this undoes the initial corruption
1953
+ ASSERT_OK(db_file_manager_->CorruptFileStart(tf0));
1954
+
1955
+ OpenDBAndBackupEngine(false, false, share);
1956
+ Status s = backup_engine_->CreateNewBackup(db_.get());
1957
+
1958
+ // Even though none of the naming options catch the inconsistency
1959
+ // between the first and second time backing up fname, in the case
1960
+ // of kUseDbSessionId (kNamingDefault), this is an intentional
1961
+ // trade-off to avoid full scan of files from the DB that are
1962
+ // already backed up. If we did the scan, kUseDbSessionId could catch
1963
+ // the corruption. kLegacyCrc32cAndFileSize does the scan (to
1964
+ // compute checksum for name) without catching the corruption,
1965
+ // because the corruption means the names don't merge.
1966
+ EXPECT_OK(s);
1967
+
1968
+ // VerifyBackup doesn't check DB integrity or table file internal
1969
+ // checksums
1970
+ EXPECT_OK(backup_engine_->VerifyBackup(1, true));
1971
+ EXPECT_OK(backup_engine_->VerifyBackup(2, true));
1972
+
1973
+ db_.reset();
1974
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_));
1975
+ {
1976
+ DB* db = OpenDB();
1977
+ s = db->VerifyChecksum();
1978
+ delete db;
1979
+ }
1980
+ if (option != kLegacyCrc32cAndFileSize && !corrupt_before_first_backup) {
1981
+ // Second backup is OK because it used (uncorrupt) file from first
1982
+ // backup instead of (corrupt) file from DB.
1983
+ // This is arguably a good trade-off vs. treating the file as distinct
1984
+ // from the old version, because a file should be more likely to be
1985
+ // corrupt as it ages. Although the backed-up file might also corrupt
1986
+ // with age, the alternative approach (checksum in file name computed
1987
+ // from current DB file contents) wouldn't detect that case at backup
1988
+ // time either. Although you would have both copies of the file with
1989
+ // the alternative approach, that would only last until the older
1990
+ // backup is deleted.
1991
+ ASSERT_OK(s);
1992
+ } else if (option == kLegacyCrc32cAndFileSize &&
1993
+ corrupt_before_first_backup) {
1994
+ // Second backup is OK because it saved the updated (uncorrupt)
1995
+ // file from DB, instead of the sharing with first backup.
1996
+ // Recall: if corrupt_before_first_backup, [second CorruptFileStart]
1997
+ // undoes the initial corruption.
1998
+ // This is arguably a bad trade-off vs. sharing the old version of the
1999
+ // file because a file should be more likely to corrupt as it ages.
2000
+ // (Not likely that the previously backed-up version was already
2001
+ // corrupt and the new version is non-corrupt. This approach doesn't
2002
+ // help if backed-up version is corrupted after taking the backup.)
2003
+ ASSERT_OK(s);
2004
+ } else {
2005
+ // Something is legitimately corrupted, but we can't be sure what
2006
+ // with information available (TODO? unless one passes block checksum
2007
+ // test and other doesn't. Probably better to use end-to-end full file
2008
+ // checksum anyway.)
2009
+ ASSERT_TRUE(s.IsCorruption());
2010
+ }
2011
+
2012
+ CloseDBAndBackupEngine();
2013
+ ASSERT_OK(DestroyDB(dbname_, options_));
2014
+ }
2015
+ }
2016
+ }
2017
+
2018
+ // Test how naming options interact with detecting file size corruption
2019
+ // between incremental backups
2020
+ TEST_F(BackupableDBTest, FileSizeForIncremental) {
2021
+ const auto share_no_checksum = static_cast<ShareFilesNaming>(0);
2022
+
2023
+ for (ShareFilesNaming option : {share_no_checksum, kLegacyCrc32cAndFileSize,
2024
+ kNamingDefault, kUseDbSessionId}) {
2025
+ auto share =
2026
+ option == share_no_checksum ? kShareNoChecksum : kShareWithChecksum;
2027
+ if (option != share_no_checksum) {
2028
+ backupable_options_->share_files_with_checksum_naming = option;
2029
+ }
2030
+ OpenDBAndBackupEngine(true, false, share);
2031
+
2032
+ std::vector<FileAttributes> children;
2033
+ const std::string shared_dir =
2034
+ backupdir_ +
2035
+ (option == share_no_checksum ? "/shared" : "/shared_checksum");
2036
+
2037
+ // A single small SST file
2038
+ ASSERT_OK(db_->Put(WriteOptions(), "x", "y"));
2039
+
2040
+ // First, test that we always detect file size corruption on the shared
2041
+ // backup side on incremental. (Since sizes aren't really part of backup
2042
+ // meta file, this works by querying the filesystem for the sizes.)
2043
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true /*flush*/));
2044
+ CloseDBAndBackupEngine();
2045
+
2046
+ // Corrupt backup SST
2047
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2048
+ ASSERT_EQ(children.size(), 1U); // one sst
2049
+ for (const auto& child : children) {
2050
+ if (child.name.size() > 4 && child.size_bytes > 0) {
2051
+ ASSERT_OK(
2052
+ file_manager_->WriteToFile(shared_dir + "/" + child.name, "asdf"));
2053
+ break;
2054
+ }
2055
+ }
2056
+
2057
+ OpenDBAndBackupEngine(false, false, share);
2058
+ Status s = backup_engine_->CreateNewBackup(db_.get());
2059
+ EXPECT_TRUE(s.IsCorruption());
2060
+
2061
+ ASSERT_OK(backup_engine_->PurgeOldBackups(0));
2062
+ CloseDBAndBackupEngine();
2063
+
2064
+ // Second, test that a hypothetical db session id collision would likely
2065
+ // not suffice to corrupt a backup, because there's a good chance of
2066
+ // file size difference (in this test, guaranteed) so either no name
2067
+ // collision or detected collision.
2068
+
2069
+ // Create backup 1
2070
+ OpenDBAndBackupEngine(false, false, share);
2071
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2072
+
2073
+ // Even though we have "the same" DB state as backup 1, we need
2074
+ // to restore to recreate the same conditions as later restore.
2075
+ db_.reset();
2076
+ ASSERT_OK(DestroyDB(dbname_, options_));
2077
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(1, dbname_, dbname_));
2078
+ CloseDBAndBackupEngine();
2079
+
2080
+ // Forge session id
2081
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2082
+ "DBImpl::SetDbSessionId", [](void* sid_void_star) {
2083
+ std::string* sid = static_cast<std::string*>(sid_void_star);
2084
+ *sid = "01234567890123456789";
2085
+ });
2086
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2087
+
2088
+ // Create another SST file
2089
+ OpenDBAndBackupEngine(false, false, share);
2090
+ ASSERT_OK(db_->Put(WriteOptions(), "y", "x"));
2091
+
2092
+ // Create backup 2
2093
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true /*flush*/));
2094
+
2095
+ // Restore backup 1 (again)
2096
+ db_.reset();
2097
+ ASSERT_OK(DestroyDB(dbname_, options_));
2098
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(1, dbname_, dbname_));
2099
+ CloseDBAndBackupEngine();
2100
+
2101
+ // Create another SST file with same number and db session id, only bigger
2102
+ OpenDBAndBackupEngine(false, false, share);
2103
+ ASSERT_OK(db_->Put(WriteOptions(), "y", Random(42).RandomString(500)));
2104
+
2105
+ // Count backup SSTs
2106
+ children.clear();
2107
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2108
+ ASSERT_EQ(children.size(), 2U); // two sst
2109
+
2110
+ // Try create backup 3
2111
+ s = backup_engine_->CreateNewBackup(db_.get(), true /*flush*/);
2112
+
2113
+ // Re-count backup SSTs
2114
+ children.clear();
2115
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2116
+
2117
+ if (option == kUseDbSessionId) {
2118
+ // Acceptable to call it corruption if size is not in name and
2119
+ // db session id collision is practically impossible.
2120
+ EXPECT_TRUE(s.IsCorruption());
2121
+ EXPECT_EQ(children.size(), 2U); // no SST added
2122
+ } else if (option == share_no_checksum) {
2123
+ // Good to call it corruption if both backups cannot be
2124
+ // accommodated.
2125
+ EXPECT_TRUE(s.IsCorruption());
2126
+ EXPECT_EQ(children.size(), 2U); // no SST added
2127
+ } else {
2128
+ // Since opening a DB seems sufficient for detecting size corruption
2129
+ // on the DB side, this should be a good thing, ...
2130
+ EXPECT_OK(s);
2131
+ // ... as long as we did actually treat it as a distinct SST file.
2132
+ EXPECT_EQ(children.size(), 3U); // Another SST added
2133
+ }
2134
+ CloseDBAndBackupEngine();
2135
+ ASSERT_OK(DestroyDB(dbname_, options_));
2136
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2137
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2138
+ }
2139
+ }
2140
+
2141
+ // Verify backup and restore with share_files_with_checksum off and then
2142
+ // transition this option to on and share_files_with_checksum_naming to be
2143
+ // based on kUseDbSessionId
2144
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsNewNamingTransition) {
2145
+ const int keys_iteration = 5000;
2146
+ // We may set share_files_with_checksum_naming to kLegacyCrc32cAndFileSize
2147
+ // here but even if we don't, it should have no effect when
2148
+ // share_files_with_checksum is false
2149
+ ASSERT_TRUE(backupable_options_->share_files_with_checksum_naming ==
2150
+ kNamingDefault);
2151
+ // set share_files_with_checksum to false
2152
+ OpenDBAndBackupEngine(true, false, kShareNoChecksum);
2153
+ int j = 3;
2154
+ for (int i = 0; i < j; ++i) {
2155
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2156
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2157
+ }
2158
+ CloseDBAndBackupEngine();
2159
+
2160
+ for (int i = 0; i < j; ++i) {
2161
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2162
+ keys_iteration * (j + 1));
2163
+ }
2164
+
2165
+ // set share_files_with_checksum to true and do some more backups
2166
+ // and use session id in the name of SST file backup
2167
+ ASSERT_TRUE(backupable_options_->share_files_with_checksum_naming ==
2168
+ kNamingDefault);
2169
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2170
+ kShareWithChecksum);
2171
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2172
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2173
+ CloseDBAndBackupEngine();
2174
+ // Use checksum in the name as well
2175
+ ++j;
2176
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
2177
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2178
+ kShareWithChecksum);
2179
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2180
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2181
+ CloseDBAndBackupEngine();
2182
+
2183
+ // Verify first (about to delete)
2184
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * (j + 1));
2185
+
2186
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
2187
+ // is OK even if we open without share_table_files but with
2188
+ // share_files_with_checksum_naming based on kUseDbSessionId
2189
+ ASSERT_TRUE(backupable_options_->share_files_with_checksum_naming ==
2190
+ kNamingDefault);
2191
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2192
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
2193
+ ASSERT_OK(backup_engine_->GarbageCollect());
2194
+ CloseDBAndBackupEngine();
2195
+
2196
+ // Verify second (about to delete)
2197
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * (j + 1));
2198
+
2199
+ // Use checksum and file size for backup table file names and open without
2200
+ // share_table_files
2201
+ // Again, make sure that GarbageCollect / DeleteBackup is OK
2202
+ backupable_options_->share_files_with_checksum_naming =
2203
+ kLegacyCrc32cAndFileSize;
2204
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2205
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
2206
+ ASSERT_OK(backup_engine_->GarbageCollect());
2207
+ CloseDBAndBackupEngine();
2208
+
2209
+ // Verify rest (not deleted)
2210
+ for (int i = 2; i < j; ++i) {
2211
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2212
+ keys_iteration * (j + 1));
2213
+ }
2214
+ }
2215
+
2216
+ // Verify backup and restore with share_files_with_checksum on and transition
2217
+ // from kLegacyCrc32cAndFileSize to kUseDbSessionId
2218
+ TEST_F(BackupableDBTest, ShareTableFilesWithChecksumsNewNamingUpgrade) {
2219
+ backupable_options_->share_files_with_checksum_naming =
2220
+ kLegacyCrc32cAndFileSize;
2221
+ const int keys_iteration = 5000;
2222
+ // set share_files_with_checksum to true
2223
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
2224
+ int j = 3;
2225
+ for (int i = 0; i < j; ++i) {
2226
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2227
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2228
+ }
2229
+ CloseDBAndBackupEngine();
2230
+
2231
+ for (int i = 0; i < j; ++i) {
2232
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2233
+ keys_iteration * (j + 1));
2234
+ }
2235
+
2236
+ backupable_options_->share_files_with_checksum_naming = kUseDbSessionId;
2237
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2238
+ kShareWithChecksum);
2239
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2240
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2241
+ CloseDBAndBackupEngine();
2242
+
2243
+ ++j;
2244
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
2245
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2246
+ kShareWithChecksum);
2247
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2248
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2249
+ CloseDBAndBackupEngine();
2250
+
2251
+ // Verify first (about to delete)
2252
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * (j + 1));
2253
+
2254
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
2255
+ // is OK even if we open without share_table_files
2256
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2257
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
2258
+ ASSERT_OK(backup_engine_->GarbageCollect());
2259
+ CloseDBAndBackupEngine();
2260
+
2261
+ // Verify second (about to delete)
2262
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * (j + 1));
2263
+
2264
+ // Use checksum and file size for backup table file names and open without
2265
+ // share_table_files
2266
+ // Again, make sure that GarbageCollect / DeleteBackup is OK
2267
+ backupable_options_->share_files_with_checksum_naming =
2268
+ kLegacyCrc32cAndFileSize;
2269
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2270
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
2271
+ ASSERT_OK(backup_engine_->GarbageCollect());
2272
+ CloseDBAndBackupEngine();
2273
+
2274
+ // Verify rest (not deleted)
2275
+ for (int i = 2; i < j; ++i) {
2276
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2277
+ keys_iteration * (j + 1));
2278
+ }
2279
+ }
2280
+
2281
+ // This test simulates cleaning up after aborted or incomplete creation
2282
+ // of a new backup.
2283
+ TEST_F(BackupableDBTest, DeleteTmpFiles) {
2284
+ for (int cleanup_fn : {1, 2, 3, 4}) {
2285
+ for (ShareOption shared_option : kAllShareOptions) {
2286
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
2287
+ shared_option);
2288
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2289
+ BackupID next_id = 1;
2290
+ BackupID oldest_id = std::numeric_limits<BackupID>::max();
2291
+ {
2292
+ std::vector<BackupInfo> backup_info;
2293
+ backup_engine_->GetBackupInfo(&backup_info);
2294
+ for (const auto& bi : backup_info) {
2295
+ next_id = std::max(next_id, bi.backup_id + 1);
2296
+ oldest_id = std::min(oldest_id, bi.backup_id);
2297
+ }
2298
+ }
2299
+ CloseDBAndBackupEngine();
2300
+
2301
+ // An aborted or incomplete new backup will always be in the next
2302
+ // id (maybe more)
2303
+ std::string next_private = "private/" + std::to_string(next_id);
2304
+
2305
+ // NOTE: both shared and shared_checksum should be cleaned up
2306
+ // regardless of how the backup engine is opened.
2307
+ std::vector<std::string> tmp_files_and_dirs;
2308
+ for (const auto& dir_and_file : {
2309
+ std::make_pair(std::string("shared"),
2310
+ std::string(".00006.sst.tmp")),
2311
+ std::make_pair(std::string("shared_checksum"),
2312
+ std::string(".00007.sst.tmp")),
2313
+ std::make_pair(next_private, std::string("00003.sst")),
2314
+ }) {
2315
+ std::string dir = backupdir_ + "/" + dir_and_file.first;
2316
+ ASSERT_OK(file_manager_->CreateDirIfMissing(dir));
2317
+ ASSERT_OK(file_manager_->FileExists(dir));
2318
+
2319
+ std::string file = dir + "/" + dir_and_file.second;
2320
+ ASSERT_OK(file_manager_->WriteToFile(file, "tmp"));
2321
+ ASSERT_OK(file_manager_->FileExists(file));
2322
+
2323
+ tmp_files_and_dirs.push_back(file);
2324
+ }
2325
+ if (cleanup_fn != /*CreateNewBackup*/ 4) {
2326
+ // This exists after CreateNewBackup because it's deleted then
2327
+ // re-created.
2328
+ tmp_files_and_dirs.push_back(backupdir_ + "/" + next_private);
2329
+ }
2330
+
2331
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
2332
+ shared_option);
2333
+ // Need to call one of these explicitly to delete tmp files
2334
+ switch (cleanup_fn) {
2335
+ case 1:
2336
+ ASSERT_OK(backup_engine_->GarbageCollect());
2337
+ break;
2338
+ case 2:
2339
+ ASSERT_OK(backup_engine_->DeleteBackup(oldest_id));
2340
+ break;
2341
+ case 3:
2342
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1));
2343
+ break;
2344
+ case 4:
2345
+ // Does a garbage collect if it sees that next private dir exists
2346
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2347
+ break;
2348
+ default:
2349
+ assert(false);
2350
+ }
2351
+ CloseDBAndBackupEngine();
2352
+ for (std::string file_or_dir : tmp_files_and_dirs) {
2353
+ if (file_manager_->FileExists(file_or_dir) != Status::NotFound()) {
2354
+ FAIL() << file_or_dir << " was expected to be deleted." << cleanup_fn;
2355
+ }
2356
+ }
2357
+ }
2358
+ }
2359
+ }
2360
+
2361
+ TEST_F(BackupableDBTest, KeepLogFiles) {
2362
+ backupable_options_->backup_log_files = false;
2363
+ // basically infinite
2364
+ options_.WAL_ttl_seconds = 24 * 60 * 60;
2365
+ OpenDBAndBackupEngine(true);
2366
+ FillDB(db_.get(), 0, 100, kFlushAll);
2367
+ FillDB(db_.get(), 100, 200, kFlushAll);
2368
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
2369
+ FillDB(db_.get(), 200, 300, kFlushAll);
2370
+ FillDB(db_.get(), 300, 400, kFlushAll);
2371
+ FillDB(db_.get(), 400, 500, kFlushAll);
2372
+ CloseDBAndBackupEngine();
2373
+
2374
+ // all data should be there if we call with keep_log_files = true
2375
+ AssertBackupConsistency(0, 0, 500, 600, true);
2376
+ }
2377
+
2378
+ class BackupableDBRateLimitingTestWithParam
2379
+ : public BackupableDBTest,
2380
+ public testing::WithParamInterface<
2381
+ std::tuple<bool /* make throttle */,
2382
+ int /* 0 = single threaded, 1 = multi threaded*/,
2383
+ std::pair<uint64_t, uint64_t> /* limits */>> {
2384
+ public:
2385
+ BackupableDBRateLimitingTestWithParam() {}
2386
+ };
2387
+
2388
+ uint64_t const MB = 1024 * 1024;
2389
+
2390
+ INSTANTIATE_TEST_CASE_P(
2391
+ RateLimiting, BackupableDBRateLimitingTestWithParam,
2392
+ ::testing::Values(std::make_tuple(false, 0, std::make_pair(1 * MB, 5 * MB)),
2393
+ std::make_tuple(false, 0, std::make_pair(2 * MB, 3 * MB)),
2394
+ std::make_tuple(false, 1, std::make_pair(1 * MB, 5 * MB)),
2395
+ std::make_tuple(false, 1, std::make_pair(2 * MB, 3 * MB)),
2396
+ std::make_tuple(true, 0, std::make_pair(1 * MB, 5 * MB)),
2397
+ std::make_tuple(true, 0, std::make_pair(2 * MB, 3 * MB)),
2398
+ std::make_tuple(true, 1, std::make_pair(1 * MB, 5 * MB)),
2399
+ std::make_tuple(true, 1,
2400
+ std::make_pair(2 * MB, 3 * MB))));
2401
+
2402
+ TEST_P(BackupableDBRateLimitingTestWithParam, RateLimiting) {
2403
+ size_t const kMicrosPerSec = 1000 * 1000LL;
2404
+
2405
+ std::shared_ptr<RateLimiter> backupThrottler(NewGenericRateLimiter(1));
2406
+ std::shared_ptr<RateLimiter> restoreThrottler(NewGenericRateLimiter(1));
2407
+
2408
+ bool makeThrottler = std::get<0>(GetParam());
2409
+ if (makeThrottler) {
2410
+ backupable_options_->backup_rate_limiter = backupThrottler;
2411
+ backupable_options_->restore_rate_limiter = restoreThrottler;
2412
+ }
2413
+
2414
+ // iter 0 -- single threaded
2415
+ // iter 1 -- multi threaded
2416
+ int iter = std::get<1>(GetParam());
2417
+ const std::pair<uint64_t, uint64_t> limit = std::get<2>(GetParam());
2418
+
2419
+ // destroy old data
2420
+ DestroyDB(dbname_, Options());
2421
+ if (makeThrottler) {
2422
+ backupThrottler->SetBytesPerSecond(limit.first);
2423
+ restoreThrottler->SetBytesPerSecond(limit.second);
2424
+ } else {
2425
+ backupable_options_->backup_rate_limit = limit.first;
2426
+ backupable_options_->restore_rate_limit = limit.second;
2427
+ }
2428
+ backupable_options_->max_background_operations = (iter == 0) ? 1 : 10;
2429
+ options_.compression = kNoCompression;
2430
+ OpenDBAndBackupEngine(true);
2431
+ size_t bytes_written = FillDB(db_.get(), 0, 100000);
2432
+
2433
+ auto start_backup = db_chroot_env_->NowMicros();
2434
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
2435
+ auto backup_time = db_chroot_env_->NowMicros() - start_backup;
2436
+ auto rate_limited_backup_time = (bytes_written * kMicrosPerSec) / limit.first;
2437
+ ASSERT_GT(backup_time, 0.8 * rate_limited_backup_time);
2438
+
2439
+ CloseDBAndBackupEngine();
2440
+
2441
+ OpenBackupEngine();
2442
+ auto start_restore = db_chroot_env_->NowMicros();
2443
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
2444
+ auto restore_time = db_chroot_env_->NowMicros() - start_restore;
2445
+ CloseBackupEngine();
2446
+ auto rate_limited_restore_time =
2447
+ (bytes_written * kMicrosPerSec) / limit.second;
2448
+ ASSERT_GT(restore_time, 0.8 * rate_limited_restore_time);
2449
+
2450
+ AssertBackupConsistency(0, 0, 100000, 100010);
2451
+ }
2452
+
2453
+ TEST_F(BackupableDBTest, ReadOnlyBackupEngine) {
2454
+ DestroyDB(dbname_, options_);
2455
+ OpenDBAndBackupEngine(true);
2456
+ FillDB(db_.get(), 0, 100);
2457
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2458
+ FillDB(db_.get(), 100, 200);
2459
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2460
+ CloseDBAndBackupEngine();
2461
+ DestroyDB(dbname_, options_);
2462
+
2463
+ backupable_options_->destroy_old_data = false;
2464
+ test_backup_env_->ClearWrittenFiles();
2465
+ test_backup_env_->SetLimitDeleteFiles(0);
2466
+ BackupEngineReadOnly* read_only_backup_engine;
2467
+ ASSERT_OK(BackupEngineReadOnly::Open(
2468
+ db_chroot_env_.get(), *backupable_options_, &read_only_backup_engine));
2469
+ std::vector<BackupInfo> backup_info;
2470
+ read_only_backup_engine->GetBackupInfo(&backup_info);
2471
+ ASSERT_EQ(backup_info.size(), 2U);
2472
+
2473
+ RestoreOptions restore_options(false);
2474
+ ASSERT_OK(read_only_backup_engine->RestoreDBFromLatestBackup(
2475
+ dbname_, dbname_, restore_options));
2476
+ delete read_only_backup_engine;
2477
+ std::vector<std::string> should_have_written;
2478
+ test_backup_env_->AssertWrittenFiles(should_have_written);
2479
+
2480
+ DB* db = OpenDB();
2481
+ AssertExists(db, 0, 200);
2482
+ delete db;
2483
+ }
2484
+
2485
+ TEST_F(BackupableDBTest, ProgressCallbackDuringBackup) {
2486
+ DestroyDB(dbname_, options_);
2487
+ OpenDBAndBackupEngine(true);
2488
+ FillDB(db_.get(), 0, 100);
2489
+ bool is_callback_invoked = false;
2490
+ ASSERT_OK(backup_engine_->CreateNewBackup(
2491
+ db_.get(), true,
2492
+ [&is_callback_invoked]() { is_callback_invoked = true; }));
2493
+
2494
+ ASSERT_TRUE(is_callback_invoked);
2495
+ CloseDBAndBackupEngine();
2496
+ DestroyDB(dbname_, options_);
2497
+ }
2498
+
2499
+ TEST_F(BackupableDBTest, GarbageCollectionBeforeBackup) {
2500
+ DestroyDB(dbname_, options_);
2501
+ OpenDBAndBackupEngine(true);
2502
+
2503
+ ASSERT_OK(backup_chroot_env_->CreateDirIfMissing(backupdir_ + "/shared"));
2504
+ std::string file_five = backupdir_ + "/shared/000008.sst";
2505
+ std::string file_five_contents = "I'm not really a sst file";
2506
+ // this depends on the fact that 00008.sst is the first file created by the DB
2507
+ ASSERT_OK(file_manager_->WriteToFile(file_five, file_five_contents));
2508
+
2509
+ FillDB(db_.get(), 0, 100);
2510
+ // backup overwrites file 000008.sst
2511
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2512
+
2513
+ std::string new_file_five_contents;
2514
+ ASSERT_OK(ReadFileToString(backup_chroot_env_.get(), file_five,
2515
+ &new_file_five_contents));
2516
+ // file 000008.sst was overwritten
2517
+ ASSERT_TRUE(new_file_five_contents != file_five_contents);
2518
+
2519
+ CloseDBAndBackupEngine();
2520
+
2521
+ AssertBackupConsistency(0, 0, 100);
2522
+ }
2523
+
2524
+ // Test that we properly propagate Env failures
2525
+ TEST_F(BackupableDBTest, EnvFailures) {
2526
+ BackupEngine* backup_engine;
2527
+
2528
+ // get children failure
2529
+ {
2530
+ test_backup_env_->SetGetChildrenFailure(true);
2531
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
2532
+ &backup_engine));
2533
+ test_backup_env_->SetGetChildrenFailure(false);
2534
+ }
2535
+
2536
+ // created dir failure
2537
+ {
2538
+ test_backup_env_->SetCreateDirIfMissingFailure(true);
2539
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
2540
+ &backup_engine));
2541
+ test_backup_env_->SetCreateDirIfMissingFailure(false);
2542
+ }
2543
+
2544
+ // new directory failure
2545
+ {
2546
+ test_backup_env_->SetNewDirectoryFailure(true);
2547
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
2548
+ &backup_engine));
2549
+ test_backup_env_->SetNewDirectoryFailure(false);
2550
+ }
2551
+
2552
+ // Read from meta-file failure
2553
+ {
2554
+ DestroyDB(dbname_, options_);
2555
+ OpenDBAndBackupEngine(true);
2556
+ FillDB(db_.get(), 0, 100);
2557
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2558
+ CloseDBAndBackupEngine();
2559
+ test_backup_env_->SetDummySequentialFile(true);
2560
+ test_backup_env_->SetDummySequentialFileFailReads(true);
2561
+ backupable_options_->destroy_old_data = false;
2562
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
2563
+ &backup_engine));
2564
+ test_backup_env_->SetDummySequentialFile(false);
2565
+ test_backup_env_->SetDummySequentialFileFailReads(false);
2566
+ }
2567
+
2568
+ // no failure
2569
+ {
2570
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), *backupable_options_,
2571
+ &backup_engine));
2572
+ delete backup_engine;
2573
+ }
2574
+ }
2575
+
2576
+ // Verify manifest can roll while a backup is being created with the old
2577
+ // manifest.
2578
+ TEST_F(BackupableDBTest, ChangeManifestDuringBackupCreation) {
2579
+ DestroyDB(dbname_, options_);
2580
+ options_.max_manifest_file_size = 0; // always rollover manifest for file add
2581
+ OpenDBAndBackupEngine(true);
2582
+ FillDB(db_.get(), 0, 100, kAutoFlushOnly);
2583
+
2584
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
2585
+ {"CheckpointImpl::CreateCheckpoint:SavedLiveFiles1",
2586
+ "VersionSet::LogAndApply:WriteManifest"},
2587
+ {"VersionSet::LogAndApply:WriteManifestDone",
2588
+ "CheckpointImpl::CreateCheckpoint:SavedLiveFiles2"},
2589
+ });
2590
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2591
+
2592
+ ROCKSDB_NAMESPACE::port::Thread flush_thread{
2593
+ [this]() { ASSERT_OK(db_->Flush(FlushOptions())); }};
2594
+
2595
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
2596
+
2597
+ flush_thread.join();
2598
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2599
+
2600
+ // The last manifest roll would've already been cleaned up by the full scan
2601
+ // that happens when CreateNewBackup invokes EnableFileDeletions. We need to
2602
+ // trigger another roll to verify non-full scan purges stale manifests.
2603
+ DBImpl* db_impl = static_cast_with_check<DBImpl>(db_.get());
2604
+ std::string prev_manifest_path =
2605
+ DescriptorFileName(dbname_, db_impl->TEST_Current_Manifest_FileNo());
2606
+ FillDB(db_.get(), 0, 100, kAutoFlushOnly);
2607
+ ASSERT_OK(db_chroot_env_->FileExists(prev_manifest_path));
2608
+ ASSERT_OK(db_->Flush(FlushOptions()));
2609
+ ASSERT_TRUE(db_chroot_env_->FileExists(prev_manifest_path).IsNotFound());
2610
+
2611
+ CloseDBAndBackupEngine();
2612
+ DestroyDB(dbname_, options_);
2613
+ AssertBackupConsistency(0, 0, 100);
2614
+ }
2615
+
2616
+ // see https://github.com/facebook/rocksdb/issues/921
2617
+ TEST_F(BackupableDBTest, Issue921Test) {
2618
+ BackupEngine* backup_engine;
2619
+ backupable_options_->share_table_files = false;
2620
+ ASSERT_OK(
2621
+ backup_chroot_env_->CreateDirIfMissing(backupable_options_->backup_dir));
2622
+ backupable_options_->backup_dir += "/new_dir";
2623
+ ASSERT_OK(BackupEngine::Open(backup_chroot_env_.get(), *backupable_options_,
2624
+ &backup_engine));
2625
+
2626
+ delete backup_engine;
2627
+ }
2628
+
2629
+ TEST_F(BackupableDBTest, BackupWithMetadata) {
2630
+ const int keys_iteration = 5000;
2631
+ OpenDBAndBackupEngine(true);
2632
+ // create five backups
2633
+ for (int i = 0; i < 5; ++i) {
2634
+ const std::string metadata = std::to_string(i);
2635
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2636
+ ASSERT_OK(
2637
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), metadata, true));
2638
+ }
2639
+ CloseDBAndBackupEngine();
2640
+
2641
+ OpenDBAndBackupEngine();
2642
+ std::vector<BackupInfo> backup_infos;
2643
+ backup_engine_->GetBackupInfo(&backup_infos);
2644
+ ASSERT_EQ(5, backup_infos.size());
2645
+ for (int i = 0; i < 5; i++) {
2646
+ ASSERT_EQ(std::to_string(i), backup_infos[i].app_metadata);
2647
+ }
2648
+ CloseDBAndBackupEngine();
2649
+ DestroyDB(dbname_, options_);
2650
+ }
2651
+
2652
+ TEST_F(BackupableDBTest, BinaryMetadata) {
2653
+ OpenDBAndBackupEngine(true);
2654
+ std::string binaryMetadata = "abc\ndef";
2655
+ binaryMetadata.push_back('\0');
2656
+ binaryMetadata.append("ghi");
2657
+ ASSERT_OK(
2658
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), binaryMetadata));
2659
+ CloseDBAndBackupEngine();
2660
+
2661
+ OpenDBAndBackupEngine();
2662
+ std::vector<BackupInfo> backup_infos;
2663
+ backup_engine_->GetBackupInfo(&backup_infos);
2664
+ ASSERT_EQ(1, backup_infos.size());
2665
+ ASSERT_EQ(binaryMetadata, backup_infos[0].app_metadata);
2666
+ CloseDBAndBackupEngine();
2667
+ DestroyDB(dbname_, options_);
2668
+ }
2669
+
2670
+ TEST_F(BackupableDBTest, MetadataTooLarge) {
2671
+ OpenDBAndBackupEngine(true);
2672
+ std::string largeMetadata(1024 * 1024 + 1, 0);
2673
+ ASSERT_NOK(
2674
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), largeMetadata));
2675
+ CloseDBAndBackupEngine();
2676
+ DestroyDB(dbname_, options_);
2677
+ }
2678
+
2679
+ TEST_F(BackupableDBTest, LimitBackupsOpened) {
2680
+ // Verify the specified max backups are opened, including skipping over
2681
+ // corrupted backups.
2682
+ //
2683
+ // Setup:
2684
+ // - backups 1, 2, and 4 are valid
2685
+ // - backup 3 is corrupt
2686
+ // - max_valid_backups_to_open == 2
2687
+ //
2688
+ // Expectation: the engine opens backups 4 and 2 since those are latest two
2689
+ // non-corrupt backups.
2690
+ const int kNumKeys = 5000;
2691
+ OpenDBAndBackupEngine(true);
2692
+ for (int i = 1; i <= 4; ++i) {
2693
+ FillDB(db_.get(), kNumKeys * i, kNumKeys * (i + 1));
2694
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2695
+ if (i == 3) {
2696
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/3", 3));
2697
+ }
2698
+ }
2699
+ CloseDBAndBackupEngine();
2700
+
2701
+ backupable_options_->max_valid_backups_to_open = 2;
2702
+ backupable_options_->destroy_old_data = false;
2703
+ BackupEngineReadOnly* read_only_backup_engine;
2704
+ ASSERT_OK(BackupEngineReadOnly::Open(backup_chroot_env_.get(),
2705
+ *backupable_options_,
2706
+ &read_only_backup_engine));
2707
+
2708
+ std::vector<BackupInfo> backup_infos;
2709
+ read_only_backup_engine->GetBackupInfo(&backup_infos);
2710
+ ASSERT_EQ(2, backup_infos.size());
2711
+ ASSERT_EQ(2, backup_infos[0].backup_id);
2712
+ ASSERT_EQ(4, backup_infos[1].backup_id);
2713
+ delete read_only_backup_engine;
2714
+ }
2715
+
2716
+ TEST_F(BackupableDBTest, IgnoreLimitBackupsOpenedWhenNotReadOnly) {
2717
+ // Verify the specified max_valid_backups_to_open is ignored if the engine
2718
+ // is not read-only.
2719
+ //
2720
+ // Setup:
2721
+ // - backups 1, 2, and 4 are valid
2722
+ // - backup 3 is corrupt
2723
+ // - max_valid_backups_to_open == 2
2724
+ //
2725
+ // Expectation: the engine opens backups 4, 2, and 1 since those are latest
2726
+ // non-corrupt backups, by ignoring max_valid_backups_to_open == 2.
2727
+ const int kNumKeys = 5000;
2728
+ OpenDBAndBackupEngine(true);
2729
+ for (int i = 1; i <= 4; ++i) {
2730
+ FillDB(db_.get(), kNumKeys * i, kNumKeys * (i + 1));
2731
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2732
+ if (i == 3) {
2733
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/3", 3));
2734
+ }
2735
+ }
2736
+ CloseDBAndBackupEngine();
2737
+
2738
+ backupable_options_->max_valid_backups_to_open = 2;
2739
+ OpenDBAndBackupEngine();
2740
+ std::vector<BackupInfo> backup_infos;
2741
+ backup_engine_->GetBackupInfo(&backup_infos);
2742
+ ASSERT_EQ(3, backup_infos.size());
2743
+ ASSERT_EQ(1, backup_infos[0].backup_id);
2744
+ ASSERT_EQ(2, backup_infos[1].backup_id);
2745
+ ASSERT_EQ(4, backup_infos[2].backup_id);
2746
+ CloseDBAndBackupEngine();
2747
+ DestroyDB(dbname_, options_);
2748
+ }
2749
+
2750
+ TEST_F(BackupableDBTest, CreateWhenLatestBackupCorrupted) {
2751
+ // we should pick an ID greater than corrupted backups' IDs so creation can
2752
+ // succeed even when latest backup is corrupted.
2753
+ const int kNumKeys = 5000;
2754
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
2755
+ FillDB(db_.get(), 0 /* from */, kNumKeys);
2756
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2757
+ true /* flush_before_backup */));
2758
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/1",
2759
+ 3 /* bytes_to_corrupt */));
2760
+ CloseDBAndBackupEngine();
2761
+
2762
+ OpenDBAndBackupEngine();
2763
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2764
+ true /* flush_before_backup */));
2765
+ std::vector<BackupInfo> backup_infos;
2766
+ backup_engine_->GetBackupInfo(&backup_infos);
2767
+ ASSERT_EQ(1, backup_infos.size());
2768
+ ASSERT_EQ(2, backup_infos[0].backup_id);
2769
+ }
2770
+
2771
+ TEST_F(BackupableDBTest, WriteOnlyEngineNoSharedFileDeletion) {
2772
+ // Verifies a write-only BackupEngine does not delete files belonging to valid
2773
+ // backups when GarbageCollect, PurgeOldBackups, or DeleteBackup are called.
2774
+ const int kNumKeys = 5000;
2775
+ for (int i = 0; i < 3; ++i) {
2776
+ OpenDBAndBackupEngine(i == 0 /* destroy_old_data */);
2777
+ FillDB(db_.get(), i * kNumKeys, (i + 1) * kNumKeys);
2778
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2779
+ CloseDBAndBackupEngine();
2780
+
2781
+ backupable_options_->max_valid_backups_to_open = 0;
2782
+ OpenDBAndBackupEngine();
2783
+ switch (i) {
2784
+ case 0:
2785
+ ASSERT_OK(backup_engine_->GarbageCollect());
2786
+ break;
2787
+ case 1:
2788
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1 /* num_backups_to_keep */));
2789
+ break;
2790
+ case 2:
2791
+ ASSERT_OK(backup_engine_->DeleteBackup(2 /* backup_id */));
2792
+ break;
2793
+ default:
2794
+ assert(false);
2795
+ }
2796
+ CloseDBAndBackupEngine();
2797
+
2798
+ backupable_options_->max_valid_backups_to_open = port::kMaxInt32;
2799
+ AssertBackupConsistency(i + 1, 0, (i + 1) * kNumKeys);
2800
+ }
2801
+ }
2802
+
2803
+ TEST_P(BackupableDBTestWithParam, BackupUsingDirectIO) {
2804
+ // Tests direct I/O on the backup engine's reads and writes on the DB env and
2805
+ // backup env
2806
+ // We use ChrootEnv underneath so the below line checks for direct I/O support
2807
+ // in the chroot directory, not the true filesystem root.
2808
+ if (!test::IsDirectIOSupported(test_db_env_.get(), "/")) {
2809
+ ROCKSDB_GTEST_SKIP("Test requires Direct I/O Support");
2810
+ return;
2811
+ }
2812
+ const int kNumKeysPerBackup = 100;
2813
+ const int kNumBackups = 3;
2814
+ options_.use_direct_reads = true;
2815
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
2816
+ for (int i = 0; i < kNumBackups; ++i) {
2817
+ FillDB(db_.get(), i * kNumKeysPerBackup /* from */,
2818
+ (i + 1) * kNumKeysPerBackup /* to */, kFlushAll);
2819
+
2820
+ // Clear the file open counters and then do a bunch of backup engine ops.
2821
+ // For all ops, files should be opened in direct mode.
2822
+ test_backup_env_->ClearFileOpenCounters();
2823
+ test_db_env_->ClearFileOpenCounters();
2824
+ CloseBackupEngine();
2825
+ OpenBackupEngine();
2826
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2827
+ false /* flush_before_backup */));
2828
+ ASSERT_OK(backup_engine_->VerifyBackup(i + 1));
2829
+ CloseBackupEngine();
2830
+ OpenBackupEngine();
2831
+ std::vector<BackupInfo> backup_infos;
2832
+ backup_engine_->GetBackupInfo(&backup_infos);
2833
+ ASSERT_EQ(static_cast<size_t>(i + 1), backup_infos.size());
2834
+
2835
+ // Verify backup engine always opened files with direct I/O
2836
+ ASSERT_EQ(0, test_db_env_->num_writers());
2837
+ ASSERT_GE(test_db_env_->num_direct_rand_readers(), 0);
2838
+ ASSERT_GT(test_db_env_->num_direct_seq_readers(), 0);
2839
+ // Currently the DB doesn't support reading WALs or manifest with direct
2840
+ // I/O, so subtract two.
2841
+ ASSERT_EQ(test_db_env_->num_seq_readers() - 2,
2842
+ test_db_env_->num_direct_seq_readers());
2843
+ ASSERT_EQ(test_db_env_->num_rand_readers(),
2844
+ test_db_env_->num_direct_rand_readers());
2845
+ }
2846
+ CloseDBAndBackupEngine();
2847
+
2848
+ for (int i = 0; i < kNumBackups; ++i) {
2849
+ AssertBackupConsistency(i + 1 /* backup_id */,
2850
+ i * kNumKeysPerBackup /* start_exist */,
2851
+ (i + 1) * kNumKeysPerBackup /* end_exist */,
2852
+ (i + 2) * kNumKeysPerBackup /* end */);
2853
+ }
2854
+ }
2855
+
2856
+ TEST_F(BackupableDBTest, BackgroundThreadCpuPriority) {
2857
+ std::atomic<CpuPriority> priority(CpuPriority::kNormal);
2858
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2859
+ "BackupEngineImpl::Initialize:SetCpuPriority", [&](void* new_priority) {
2860
+ priority.store(*reinterpret_cast<CpuPriority*>(new_priority));
2861
+ });
2862
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2863
+
2864
+ // 1 thread is easier to test, otherwise, we may not be sure which thread
2865
+ // actually does the work during CreateNewBackup.
2866
+ backupable_options_->max_background_operations = 1;
2867
+ OpenDBAndBackupEngine(true);
2868
+
2869
+ {
2870
+ FillDB(db_.get(), 0, 100);
2871
+
2872
+ // by default, cpu priority is not changed.
2873
+ CreateBackupOptions options;
2874
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
2875
+
2876
+ ASSERT_EQ(priority, CpuPriority::kNormal);
2877
+ }
2878
+
2879
+ {
2880
+ FillDB(db_.get(), 101, 200);
2881
+
2882
+ // decrease cpu priority from normal to low.
2883
+ CreateBackupOptions options;
2884
+ options.decrease_background_thread_cpu_priority = true;
2885
+ options.background_thread_cpu_priority = CpuPriority::kLow;
2886
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
2887
+
2888
+ ASSERT_EQ(priority, CpuPriority::kLow);
2889
+ }
2890
+
2891
+ {
2892
+ FillDB(db_.get(), 201, 300);
2893
+
2894
+ // try to upgrade cpu priority back to normal,
2895
+ // the priority should still low.
2896
+ CreateBackupOptions options;
2897
+ options.decrease_background_thread_cpu_priority = true;
2898
+ options.background_thread_cpu_priority = CpuPriority::kNormal;
2899
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
2900
+
2901
+ ASSERT_EQ(priority, CpuPriority::kLow);
2902
+ }
2903
+
2904
+ {
2905
+ FillDB(db_.get(), 301, 400);
2906
+
2907
+ // decrease cpu priority from low to idle.
2908
+ CreateBackupOptions options;
2909
+ options.decrease_background_thread_cpu_priority = true;
2910
+ options.background_thread_cpu_priority = CpuPriority::kIdle;
2911
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
2912
+
2913
+ ASSERT_EQ(priority, CpuPriority::kIdle);
2914
+ }
2915
+
2916
+ {
2917
+ FillDB(db_.get(), 301, 400);
2918
+
2919
+ // reset priority to later verify that it's not updated by SetCpuPriority.
2920
+ priority = CpuPriority::kNormal;
2921
+
2922
+ // setting the same cpu priority won't call SetCpuPriority.
2923
+ CreateBackupOptions options;
2924
+ options.decrease_background_thread_cpu_priority = true;
2925
+ options.background_thread_cpu_priority = CpuPriority::kIdle;
2926
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
2927
+
2928
+ ASSERT_EQ(priority, CpuPriority::kNormal);
2929
+ }
2930
+
2931
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2932
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2933
+ CloseDBAndBackupEngine();
2934
+ DestroyDB(dbname_, options_);
2935
+ }
2936
+
2937
+ } // anon namespace
2938
+
2939
+ } // namespace ROCKSDB_NAMESPACE
2940
+
2941
+ int main(int argc, char** argv) {
2942
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
2943
+ ::testing::InitGoogleTest(&argc, argv);
2944
+ return RUN_ALL_TESTS();
2945
+ }
2946
+
2947
+ #else
2948
+ #include <stdio.h>
2949
+
2950
+ int main(int /*argc*/, char** /*argv*/) {
2951
+ fprintf(stderr, "SKIPPED as BackupableDB is not supported in ROCKSDB_LITE\n");
2952
+ return 0;
2953
+ }
2954
+
2955
+ #endif // !defined(ROCKSDB_LITE) && !defined(OS_WIN)