rocksdb-native 0.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 (1951) hide show
  1. package/.clang-format +15 -0
  2. package/.github/workflows/test-node.yml +23 -0
  3. package/.gitmodules +4 -0
  4. package/CMakeLists.txt +33 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +13 -0
  7. package/README.md +15 -0
  8. package/binding.c +470 -0
  9. package/binding.js +1 -0
  10. package/index.js +276 -0
  11. package/package.json +19 -0
  12. package/vendor/rocksdb/.circleci/config.yml +892 -0
  13. package/vendor/rocksdb/.circleci/ubsan_suppression_list.txt +6 -0
  14. package/vendor/rocksdb/.clang-format +5 -0
  15. package/vendor/rocksdb/.github/workflows/sanity_check.yml +47 -0
  16. package/vendor/rocksdb/.lgtm.yml +4 -0
  17. package/vendor/rocksdb/AUTHORS +12 -0
  18. package/vendor/rocksdb/CMakeLists.txt +1591 -0
  19. package/vendor/rocksdb/CODE_OF_CONDUCT.md +77 -0
  20. package/vendor/rocksdb/CONTRIBUTING.md +17 -0
  21. package/vendor/rocksdb/COPYING +339 -0
  22. package/vendor/rocksdb/DEFAULT_OPTIONS_HISTORY.md +24 -0
  23. package/vendor/rocksdb/DUMP_FORMAT.md +16 -0
  24. package/vendor/rocksdb/HISTORY.md +2399 -0
  25. package/vendor/rocksdb/INSTALL.md +220 -0
  26. package/vendor/rocksdb/LANGUAGE-BINDINGS.md +26 -0
  27. package/vendor/rocksdb/LICENSE.Apache +202 -0
  28. package/vendor/rocksdb/LICENSE.leveldb +29 -0
  29. package/vendor/rocksdb/Makefile +2579 -0
  30. package/vendor/rocksdb/PLUGINS.md +8 -0
  31. package/vendor/rocksdb/README.md +29 -0
  32. package/vendor/rocksdb/TARGETS +5599 -0
  33. package/vendor/rocksdb/USERS.md +165 -0
  34. package/vendor/rocksdb/Vagrantfile +39 -0
  35. package/vendor/rocksdb/WINDOWS_PORT.md +228 -0
  36. package/vendor/rocksdb/buckifier/bench-slow.json +6163 -0
  37. package/vendor/rocksdb/buckifier/bench.json +1594 -0
  38. package/vendor/rocksdb/buckifier/buckify_rocksdb.py +333 -0
  39. package/vendor/rocksdb/buckifier/check_buck_targets.sh +32 -0
  40. package/vendor/rocksdb/buckifier/rocks_test_runner.sh +6 -0
  41. package/vendor/rocksdb/buckifier/targets_builder.py +150 -0
  42. package/vendor/rocksdb/buckifier/targets_cfg.py +41 -0
  43. package/vendor/rocksdb/buckifier/util.py +118 -0
  44. package/vendor/rocksdb/build_tools/amalgamate.py +168 -0
  45. package/vendor/rocksdb/build_tools/benchmark_log_tool.py +238 -0
  46. package/vendor/rocksdb/build_tools/build_detect_platform +804 -0
  47. package/vendor/rocksdb/build_tools/check-sources.sh +48 -0
  48. package/vendor/rocksdb/build_tools/dependencies_platform010.sh +22 -0
  49. package/vendor/rocksdb/build_tools/dockerbuild.sh +3 -0
  50. package/vendor/rocksdb/build_tools/error_filter.py +181 -0
  51. package/vendor/rocksdb/build_tools/fb_compile_mongo.sh +55 -0
  52. package/vendor/rocksdb/build_tools/fbcode_config.sh +175 -0
  53. package/vendor/rocksdb/build_tools/fbcode_config_platform010.sh +175 -0
  54. package/vendor/rocksdb/build_tools/format-diff.sh +203 -0
  55. package/vendor/rocksdb/build_tools/gnu_parallel +7971 -0
  56. package/vendor/rocksdb/build_tools/make_package.sh +129 -0
  57. package/vendor/rocksdb/build_tools/ps_with_stack +38 -0
  58. package/vendor/rocksdb/build_tools/regression_build_test.sh +396 -0
  59. package/vendor/rocksdb/build_tools/run_ci_db_test.ps1 +493 -0
  60. package/vendor/rocksdb/build_tools/setup_centos7.sh +45 -0
  61. package/vendor/rocksdb/build_tools/ubuntu20_image/Dockerfile +57 -0
  62. package/vendor/rocksdb/build_tools/update_dependencies.sh +106 -0
  63. package/vendor/rocksdb/build_tools/version.sh +23 -0
  64. package/vendor/rocksdb/cache/cache.cc +158 -0
  65. package/vendor/rocksdb/cache/cache_bench.cc +20 -0
  66. package/vendor/rocksdb/cache/cache_bench_tool.cc +969 -0
  67. package/vendor/rocksdb/cache/cache_entry_roles.cc +104 -0
  68. package/vendor/rocksdb/cache/cache_entry_roles.h +20 -0
  69. package/vendor/rocksdb/cache/cache_entry_stats.h +182 -0
  70. package/vendor/rocksdb/cache/cache_helpers.cc +40 -0
  71. package/vendor/rocksdb/cache/cache_helpers.h +139 -0
  72. package/vendor/rocksdb/cache/cache_key.cc +364 -0
  73. package/vendor/rocksdb/cache/cache_key.h +143 -0
  74. package/vendor/rocksdb/cache/cache_reservation_manager.cc +184 -0
  75. package/vendor/rocksdb/cache/cache_reservation_manager.h +317 -0
  76. package/vendor/rocksdb/cache/cache_reservation_manager_test.cc +469 -0
  77. package/vendor/rocksdb/cache/cache_test.cc +1061 -0
  78. package/vendor/rocksdb/cache/charged_cache.cc +109 -0
  79. package/vendor/rocksdb/cache/charged_cache.h +59 -0
  80. package/vendor/rocksdb/cache/clock_cache.cc +1482 -0
  81. package/vendor/rocksdb/cache/clock_cache.h +707 -0
  82. package/vendor/rocksdb/cache/compressed_secondary_cache.cc +304 -0
  83. package/vendor/rocksdb/cache/compressed_secondary_cache.h +132 -0
  84. package/vendor/rocksdb/cache/compressed_secondary_cache_test.cc +983 -0
  85. package/vendor/rocksdb/cache/lru_cache.cc +723 -0
  86. package/vendor/rocksdb/cache/lru_cache.h +467 -0
  87. package/vendor/rocksdb/cache/lru_cache_test.cc +2559 -0
  88. package/vendor/rocksdb/cache/secondary_cache.cc +44 -0
  89. package/vendor/rocksdb/cache/secondary_cache_adapter.cc +295 -0
  90. package/vendor/rocksdb/cache/secondary_cache_adapter.h +52 -0
  91. package/vendor/rocksdb/cache/sharded_cache.cc +137 -0
  92. package/vendor/rocksdb/cache/sharded_cache.h +309 -0
  93. package/vendor/rocksdb/cache/typed_cache.h +375 -0
  94. package/vendor/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  95. package/vendor/rocksdb/common.mk +30 -0
  96. package/vendor/rocksdb/crash_test.mk +107 -0
  97. package/vendor/rocksdb/db/arena_wrapped_db_iter.cc +163 -0
  98. package/vendor/rocksdb/db/arena_wrapped_db_iter.h +127 -0
  99. package/vendor/rocksdb/db/blob/blob_constants.h +16 -0
  100. package/vendor/rocksdb/db/blob/blob_contents.cc +42 -0
  101. package/vendor/rocksdb/db/blob/blob_contents.h +59 -0
  102. package/vendor/rocksdb/db/blob/blob_counting_iterator.h +150 -0
  103. package/vendor/rocksdb/db/blob/blob_counting_iterator_test.cc +327 -0
  104. package/vendor/rocksdb/db/blob/blob_fetcher.cc +34 -0
  105. package/vendor/rocksdb/db/blob/blob_fetcher.h +37 -0
  106. package/vendor/rocksdb/db/blob/blob_file_addition.cc +156 -0
  107. package/vendor/rocksdb/db/blob/blob_file_addition.h +67 -0
  108. package/vendor/rocksdb/db/blob/blob_file_addition_test.cc +211 -0
  109. package/vendor/rocksdb/db/blob/blob_file_builder.cc +426 -0
  110. package/vendor/rocksdb/db/blob/blob_file_builder.h +112 -0
  111. package/vendor/rocksdb/db/blob/blob_file_builder_test.cc +680 -0
  112. package/vendor/rocksdb/db/blob/blob_file_cache.cc +101 -0
  113. package/vendor/rocksdb/db/blob/blob_file_cache.h +56 -0
  114. package/vendor/rocksdb/db/blob/blob_file_cache_test.cc +278 -0
  115. package/vendor/rocksdb/db/blob/blob_file_completion_callback.h +84 -0
  116. package/vendor/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  117. package/vendor/rocksdb/db/blob/blob_file_garbage.h +57 -0
  118. package/vendor/rocksdb/db/blob/blob_file_garbage_test.cc +174 -0
  119. package/vendor/rocksdb/db/blob/blob_file_meta.cc +62 -0
  120. package/vendor/rocksdb/db/blob/blob_file_meta.h +170 -0
  121. package/vendor/rocksdb/db/blob/blob_file_reader.cc +624 -0
  122. package/vendor/rocksdb/db/blob/blob_file_reader.h +112 -0
  123. package/vendor/rocksdb/db/blob/blob_file_reader_test.cc +1023 -0
  124. package/vendor/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  125. package/vendor/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  126. package/vendor/rocksdb/db/blob/blob_garbage_meter_test.cc +197 -0
  127. package/vendor/rocksdb/db/blob/blob_index.h +187 -0
  128. package/vendor/rocksdb/db/blob/blob_log_format.cc +143 -0
  129. package/vendor/rocksdb/db/blob/blob_log_format.h +164 -0
  130. package/vendor/rocksdb/db/blob/blob_log_sequential_reader.cc +134 -0
  131. package/vendor/rocksdb/db/blob/blob_log_sequential_reader.h +83 -0
  132. package/vendor/rocksdb/db/blob/blob_log_writer.cc +178 -0
  133. package/vendor/rocksdb/db/blob/blob_log_writer.h +83 -0
  134. package/vendor/rocksdb/db/blob/blob_read_request.h +58 -0
  135. package/vendor/rocksdb/db/blob/blob_source.cc +459 -0
  136. package/vendor/rocksdb/db/blob/blob_source.h +161 -0
  137. package/vendor/rocksdb/db/blob/blob_source_test.cc +1611 -0
  138. package/vendor/rocksdb/db/blob/db_blob_basic_test.cc +2237 -0
  139. package/vendor/rocksdb/db/blob/db_blob_compaction_test.cc +899 -0
  140. package/vendor/rocksdb/db/blob/db_blob_corruption_test.cc +80 -0
  141. package/vendor/rocksdb/db/blob/db_blob_index_test.cc +596 -0
  142. package/vendor/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  143. package/vendor/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  144. package/vendor/rocksdb/db/builder.cc +447 -0
  145. package/vendor/rocksdb/db/builder.h +78 -0
  146. package/vendor/rocksdb/db/c.cc +6559 -0
  147. package/vendor/rocksdb/db/c_test.c +3609 -0
  148. package/vendor/rocksdb/db/column_family.cc +1708 -0
  149. package/vendor/rocksdb/db/column_family.h +851 -0
  150. package/vendor/rocksdb/db/column_family_test.cc +3382 -0
  151. package/vendor/rocksdb/db/compact_files_test.cc +492 -0
  152. package/vendor/rocksdb/db/compaction/clipping_iterator.h +281 -0
  153. package/vendor/rocksdb/db/compaction/clipping_iterator_test.cc +259 -0
  154. package/vendor/rocksdb/db/compaction/compaction.cc +857 -0
  155. package/vendor/rocksdb/db/compaction/compaction.h +565 -0
  156. package/vendor/rocksdb/db/compaction/compaction_iteration_stats.h +49 -0
  157. package/vendor/rocksdb/db/compaction/compaction_iterator.cc +1445 -0
  158. package/vendor/rocksdb/db/compaction/compaction_iterator.h +530 -0
  159. package/vendor/rocksdb/db/compaction/compaction_iterator_test.cc +1618 -0
  160. package/vendor/rocksdb/db/compaction/compaction_job.cc +2054 -0
  161. package/vendor/rocksdb/db/compaction/compaction_job.h +504 -0
  162. package/vendor/rocksdb/db/compaction/compaction_job_stats_test.cc +965 -0
  163. package/vendor/rocksdb/db/compaction/compaction_job_test.cc +2444 -0
  164. package/vendor/rocksdb/db/compaction/compaction_outputs.cc +784 -0
  165. package/vendor/rocksdb/db/compaction/compaction_outputs.h +403 -0
  166. package/vendor/rocksdb/db/compaction/compaction_picker.cc +1225 -0
  167. package/vendor/rocksdb/db/compaction/compaction_picker.h +318 -0
  168. package/vendor/rocksdb/db/compaction/compaction_picker_fifo.cc +471 -0
  169. package/vendor/rocksdb/db/compaction/compaction_picker_fifo.h +60 -0
  170. package/vendor/rocksdb/db/compaction/compaction_picker_level.cc +888 -0
  171. package/vendor/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  172. package/vendor/rocksdb/db/compaction/compaction_picker_test.cc +4074 -0
  173. package/vendor/rocksdb/db/compaction/compaction_picker_universal.cc +1452 -0
  174. package/vendor/rocksdb/db/compaction/compaction_picker_universal.h +30 -0
  175. package/vendor/rocksdb/db/compaction/compaction_service_job.cc +833 -0
  176. package/vendor/rocksdb/db/compaction/compaction_service_test.cc +954 -0
  177. package/vendor/rocksdb/db/compaction/compaction_state.cc +46 -0
  178. package/vendor/rocksdb/db/compaction/compaction_state.h +42 -0
  179. package/vendor/rocksdb/db/compaction/file_pri.h +92 -0
  180. package/vendor/rocksdb/db/compaction/sst_partitioner.cc +83 -0
  181. package/vendor/rocksdb/db/compaction/subcompaction_state.cc +106 -0
  182. package/vendor/rocksdb/db/compaction/subcompaction_state.h +220 -0
  183. package/vendor/rocksdb/db/compaction/tiered_compaction_test.cc +2149 -0
  184. package/vendor/rocksdb/db/comparator_db_test.cc +678 -0
  185. package/vendor/rocksdb/db/convenience.cc +81 -0
  186. package/vendor/rocksdb/db/corruption_test.cc +1670 -0
  187. package/vendor/rocksdb/db/cuckoo_table_db_test.cc +351 -0
  188. package/vendor/rocksdb/db/db_basic_test.cc +4777 -0
  189. package/vendor/rocksdb/db/db_block_cache_test.cc +1972 -0
  190. package/vendor/rocksdb/db/db_bloom_filter_test.cc +3513 -0
  191. package/vendor/rocksdb/db/db_clip_test.cc +142 -0
  192. package/vendor/rocksdb/db/db_compaction_filter_test.cc +1030 -0
  193. package/vendor/rocksdb/db/db_compaction_test.cc +9424 -0
  194. package/vendor/rocksdb/db/db_dynamic_level_test.cc +499 -0
  195. package/vendor/rocksdb/db/db_encryption_test.cc +126 -0
  196. package/vendor/rocksdb/db/db_filesnapshot.cc +436 -0
  197. package/vendor/rocksdb/db/db_flush_test.cc +3202 -0
  198. package/vendor/rocksdb/db/db_impl/compacted_db_impl.cc +260 -0
  199. package/vendor/rocksdb/db/db_impl/compacted_db_impl.h +157 -0
  200. package/vendor/rocksdb/db/db_impl/db_impl.cc +6132 -0
  201. package/vendor/rocksdb/db/db_impl/db_impl.h +2841 -0
  202. package/vendor/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3980 -0
  203. package/vendor/rocksdb/db/db_impl/db_impl_debug.cc +314 -0
  204. package/vendor/rocksdb/db/db_impl/db_impl_experimental.cc +159 -0
  205. package/vendor/rocksdb/db/db_impl/db_impl_files.cc +1014 -0
  206. package/vendor/rocksdb/db/db_impl/db_impl_open.cc +2202 -0
  207. package/vendor/rocksdb/db/db_impl/db_impl_readonly.cc +334 -0
  208. package/vendor/rocksdb/db/db_impl/db_impl_readonly.h +173 -0
  209. package/vendor/rocksdb/db/db_impl/db_impl_secondary.cc +964 -0
  210. package/vendor/rocksdb/db/db_impl/db_impl_secondary.h +406 -0
  211. package/vendor/rocksdb/db/db_impl/db_impl_write.cc +2487 -0
  212. package/vendor/rocksdb/db/db_info_dumper.cc +147 -0
  213. package/vendor/rocksdb/db/db_info_dumper.h +15 -0
  214. package/vendor/rocksdb/db/db_inplace_update_test.cc +262 -0
  215. package/vendor/rocksdb/db/db_io_failure_test.cc +589 -0
  216. package/vendor/rocksdb/db/db_iter.cc +1708 -0
  217. package/vendor/rocksdb/db/db_iter.h +411 -0
  218. package/vendor/rocksdb/db/db_iter_stress_test.cc +658 -0
  219. package/vendor/rocksdb/db/db_iter_test.cc +3195 -0
  220. package/vendor/rocksdb/db/db_iterator_test.cc +3304 -0
  221. package/vendor/rocksdb/db/db_kv_checksum_test.cc +885 -0
  222. package/vendor/rocksdb/db/db_log_iter_test.cc +297 -0
  223. package/vendor/rocksdb/db/db_logical_block_size_cache_test.cc +505 -0
  224. package/vendor/rocksdb/db/db_memtable_test.cc +344 -0
  225. package/vendor/rocksdb/db/db_merge_operand_test.cc +488 -0
  226. package/vendor/rocksdb/db/db_merge_operator_test.cc +866 -0
  227. package/vendor/rocksdb/db/db_options_test.cc +1330 -0
  228. package/vendor/rocksdb/db/db_properties_test.cc +2377 -0
  229. package/vendor/rocksdb/db/db_range_del_test.cc +3414 -0
  230. package/vendor/rocksdb/db/db_rate_limiter_test.cc +437 -0
  231. package/vendor/rocksdb/db/db_readonly_with_timestamp_test.cc +956 -0
  232. package/vendor/rocksdb/db/db_secondary_test.cc +1691 -0
  233. package/vendor/rocksdb/db/db_sst_test.cc +1865 -0
  234. package/vendor/rocksdb/db/db_statistics_test.cc +292 -0
  235. package/vendor/rocksdb/db/db_table_properties_test.cc +623 -0
  236. package/vendor/rocksdb/db/db_tailing_iter_test.cc +595 -0
  237. package/vendor/rocksdb/db/db_test.cc +7359 -0
  238. package/vendor/rocksdb/db/db_test2.cc +7679 -0
  239. package/vendor/rocksdb/db/db_test_util.cc +1759 -0
  240. package/vendor/rocksdb/db/db_test_util.h +1340 -0
  241. package/vendor/rocksdb/db/db_universal_compaction_test.cc +2227 -0
  242. package/vendor/rocksdb/db/db_wal_test.cc +2433 -0
  243. package/vendor/rocksdb/db/db_with_timestamp_basic_test.cc +4016 -0
  244. package/vendor/rocksdb/db/db_with_timestamp_compaction_test.cc +353 -0
  245. package/vendor/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  246. package/vendor/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  247. package/vendor/rocksdb/db/db_write_buffer_manager_test.cc +927 -0
  248. package/vendor/rocksdb/db/db_write_test.cc +795 -0
  249. package/vendor/rocksdb/db/dbformat.cc +213 -0
  250. package/vendor/rocksdb/db/dbformat.h +869 -0
  251. package/vendor/rocksdb/db/dbformat_test.cc +214 -0
  252. package/vendor/rocksdb/db/deletefile_test.cc +603 -0
  253. package/vendor/rocksdb/db/error_handler.cc +792 -0
  254. package/vendor/rocksdb/db/error_handler.h +124 -0
  255. package/vendor/rocksdb/db/error_handler_fs_test.cc +2862 -0
  256. package/vendor/rocksdb/db/event_helpers.cc +323 -0
  257. package/vendor/rocksdb/db/event_helpers.h +78 -0
  258. package/vendor/rocksdb/db/experimental.cc +144 -0
  259. package/vendor/rocksdb/db/external_sst_file_basic_test.cc +2084 -0
  260. package/vendor/rocksdb/db/external_sst_file_ingestion_job.cc +1104 -0
  261. package/vendor/rocksdb/db/external_sst_file_ingestion_job.h +238 -0
  262. package/vendor/rocksdb/db/external_sst_file_test.cc +2859 -0
  263. package/vendor/rocksdb/db/fault_injection_test.cc +637 -0
  264. package/vendor/rocksdb/db/file_indexer.cc +218 -0
  265. package/vendor/rocksdb/db/file_indexer.h +140 -0
  266. package/vendor/rocksdb/db/file_indexer_test.cc +352 -0
  267. package/vendor/rocksdb/db/filename_test.cc +241 -0
  268. package/vendor/rocksdb/db/flush_job.cc +1097 -0
  269. package/vendor/rocksdb/db/flush_job.h +200 -0
  270. package/vendor/rocksdb/db/flush_job_test.cc +743 -0
  271. package/vendor/rocksdb/db/flush_scheduler.cc +86 -0
  272. package/vendor/rocksdb/db/flush_scheduler.h +55 -0
  273. package/vendor/rocksdb/db/forward_iterator.cc +1070 -0
  274. package/vendor/rocksdb/db/forward_iterator.h +166 -0
  275. package/vendor/rocksdb/db/forward_iterator_bench.cc +378 -0
  276. package/vendor/rocksdb/db/history_trimming_iterator.h +95 -0
  277. package/vendor/rocksdb/db/import_column_family_job.cc +364 -0
  278. package/vendor/rocksdb/db/import_column_family_job.h +82 -0
  279. package/vendor/rocksdb/db/import_column_family_test.cc +748 -0
  280. package/vendor/rocksdb/db/internal_stats.cc +2121 -0
  281. package/vendor/rocksdb/db/internal_stats.h +875 -0
  282. package/vendor/rocksdb/db/job_context.h +237 -0
  283. package/vendor/rocksdb/db/kv_checksum.h +484 -0
  284. package/vendor/rocksdb/db/listener_test.cc +1598 -0
  285. package/vendor/rocksdb/db/log_format.h +55 -0
  286. package/vendor/rocksdb/db/log_reader.cc +934 -0
  287. package/vendor/rocksdb/db/log_reader.h +241 -0
  288. package/vendor/rocksdb/db/log_test.cc +1216 -0
  289. package/vendor/rocksdb/db/log_writer.cc +279 -0
  290. package/vendor/rocksdb/db/log_writer.h +144 -0
  291. package/vendor/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  292. package/vendor/rocksdb/db/logs_with_prep_tracker.h +62 -0
  293. package/vendor/rocksdb/db/lookup_key.h +68 -0
  294. package/vendor/rocksdb/db/malloc_stats.cc +53 -0
  295. package/vendor/rocksdb/db/malloc_stats.h +22 -0
  296. package/vendor/rocksdb/db/manual_compaction_test.cc +308 -0
  297. package/vendor/rocksdb/db/memtable.cc +1675 -0
  298. package/vendor/rocksdb/db/memtable.h +660 -0
  299. package/vendor/rocksdb/db/memtable_list.cc +987 -0
  300. package/vendor/rocksdb/db/memtable_list.h +471 -0
  301. package/vendor/rocksdb/db/memtable_list_test.cc +1037 -0
  302. package/vendor/rocksdb/db/merge_context.h +147 -0
  303. package/vendor/rocksdb/db/merge_helper.cc +606 -0
  304. package/vendor/rocksdb/db/merge_helper.h +224 -0
  305. package/vendor/rocksdb/db/merge_helper_test.cc +298 -0
  306. package/vendor/rocksdb/db/merge_operator.cc +85 -0
  307. package/vendor/rocksdb/db/merge_test.cc +621 -0
  308. package/vendor/rocksdb/db/obsolete_files_test.cc +317 -0
  309. package/vendor/rocksdb/db/options_file_test.cc +110 -0
  310. package/vendor/rocksdb/db/output_validator.cc +33 -0
  311. package/vendor/rocksdb/db/output_validator.h +48 -0
  312. package/vendor/rocksdb/db/perf_context_test.cc +1158 -0
  313. package/vendor/rocksdb/db/periodic_task_scheduler.cc +111 -0
  314. package/vendor/rocksdb/db/periodic_task_scheduler.h +108 -0
  315. package/vendor/rocksdb/db/periodic_task_scheduler_test.cc +229 -0
  316. package/vendor/rocksdb/db/pinned_iterators_manager.h +92 -0
  317. package/vendor/rocksdb/db/plain_table_db_test.cc +1348 -0
  318. package/vendor/rocksdb/db/post_memtable_callback.h +25 -0
  319. package/vendor/rocksdb/db/pre_release_callback.h +37 -0
  320. package/vendor/rocksdb/db/prefix_test.cc +894 -0
  321. package/vendor/rocksdb/db/range_del_aggregator.cc +555 -0
  322. package/vendor/rocksdb/db/range_del_aggregator.h +478 -0
  323. package/vendor/rocksdb/db/range_del_aggregator_bench.cc +280 -0
  324. package/vendor/rocksdb/db/range_del_aggregator_test.cc +713 -0
  325. package/vendor/rocksdb/db/range_tombstone_fragmenter.cc +502 -0
  326. package/vendor/rocksdb/db/range_tombstone_fragmenter.h +356 -0
  327. package/vendor/rocksdb/db/range_tombstone_fragmenter_test.cc +555 -0
  328. package/vendor/rocksdb/db/read_callback.h +54 -0
  329. package/vendor/rocksdb/db/repair.cc +839 -0
  330. package/vendor/rocksdb/db/repair_test.cc +484 -0
  331. package/vendor/rocksdb/db/seqno_time_test.cc +994 -0
  332. package/vendor/rocksdb/db/seqno_to_time_mapping.cc +341 -0
  333. package/vendor/rocksdb/db/seqno_to_time_mapping.h +189 -0
  334. package/vendor/rocksdb/db/snapshot_checker.h +58 -0
  335. package/vendor/rocksdb/db/snapshot_impl.cc +25 -0
  336. package/vendor/rocksdb/db/snapshot_impl.h +239 -0
  337. package/vendor/rocksdb/db/table_cache.cc +710 -0
  338. package/vendor/rocksdb/db/table_cache.h +283 -0
  339. package/vendor/rocksdb/db/table_cache_sync_and_async.h +130 -0
  340. package/vendor/rocksdb/db/table_properties_collector.cc +74 -0
  341. package/vendor/rocksdb/db/table_properties_collector.h +177 -0
  342. package/vendor/rocksdb/db/table_properties_collector_test.cc +512 -0
  343. package/vendor/rocksdb/db/transaction_log_impl.cc +296 -0
  344. package/vendor/rocksdb/db/transaction_log_impl.h +128 -0
  345. package/vendor/rocksdb/db/trim_history_scheduler.cc +54 -0
  346. package/vendor/rocksdb/db/trim_history_scheduler.h +46 -0
  347. package/vendor/rocksdb/db/version_builder.cc +1426 -0
  348. package/vendor/rocksdb/db/version_builder.h +93 -0
  349. package/vendor/rocksdb/db/version_builder_test.cc +1840 -0
  350. package/vendor/rocksdb/db/version_edit.cc +1059 -0
  351. package/vendor/rocksdb/db/version_edit.h +702 -0
  352. package/vendor/rocksdb/db/version_edit_handler.cc +1017 -0
  353. package/vendor/rocksdb/db/version_edit_handler.h +334 -0
  354. package/vendor/rocksdb/db/version_edit_test.cc +732 -0
  355. package/vendor/rocksdb/db/version_set.cc +7286 -0
  356. package/vendor/rocksdb/db/version_set.h +1714 -0
  357. package/vendor/rocksdb/db/version_set_sync_and_async.h +172 -0
  358. package/vendor/rocksdb/db/version_set_test.cc +3659 -0
  359. package/vendor/rocksdb/db/version_util.h +72 -0
  360. package/vendor/rocksdb/db/wal_edit.cc +211 -0
  361. package/vendor/rocksdb/db/wal_edit.h +177 -0
  362. package/vendor/rocksdb/db/wal_edit_test.cc +213 -0
  363. package/vendor/rocksdb/db/wal_manager.cc +527 -0
  364. package/vendor/rocksdb/db/wal_manager.h +136 -0
  365. package/vendor/rocksdb/db/wal_manager_test.cc +336 -0
  366. package/vendor/rocksdb/db/wide/db_wide_basic_test.cc +1042 -0
  367. package/vendor/rocksdb/db/wide/wide_column_serialization.cc +182 -0
  368. package/vendor/rocksdb/db/wide/wide_column_serialization.h +77 -0
  369. package/vendor/rocksdb/db/wide/wide_column_serialization_test.cc +338 -0
  370. package/vendor/rocksdb/db/wide/wide_columns.cc +22 -0
  371. package/vendor/rocksdb/db/write_batch.cc +3142 -0
  372. package/vendor/rocksdb/db/write_batch_base.cc +94 -0
  373. package/vendor/rocksdb/db/write_batch_internal.h +401 -0
  374. package/vendor/rocksdb/db/write_batch_test.cc +1112 -0
  375. package/vendor/rocksdb/db/write_callback.h +27 -0
  376. package/vendor/rocksdb/db/write_callback_test.cc +454 -0
  377. package/vendor/rocksdb/db/write_controller.cc +121 -0
  378. package/vendor/rocksdb/db/write_controller.h +148 -0
  379. package/vendor/rocksdb/db/write_controller_test.cc +248 -0
  380. package/vendor/rocksdb/db/write_stall_stats.cc +179 -0
  381. package/vendor/rocksdb/db/write_stall_stats.h +47 -0
  382. package/vendor/rocksdb/db/write_thread.cc +844 -0
  383. package/vendor/rocksdb/db/write_thread.h +464 -0
  384. package/vendor/rocksdb/db_stress_tool/CMakeLists.txt +18 -0
  385. package/vendor/rocksdb/db_stress_tool/batched_ops_stress.cc +593 -0
  386. package/vendor/rocksdb/db_stress_tool/cf_consistency_stress.cc +892 -0
  387. package/vendor/rocksdb/db_stress_tool/db_stress.cc +25 -0
  388. package/vendor/rocksdb/db_stress_tool/db_stress_common.cc +491 -0
  389. package/vendor/rocksdb/db_stress_tool/db_stress_common.h +674 -0
  390. package/vendor/rocksdb/db_stress_tool/db_stress_compaction_filter.h +96 -0
  391. package/vendor/rocksdb/db_stress_tool/db_stress_driver.cc +216 -0
  392. package/vendor/rocksdb/db_stress_tool/db_stress_driver.h +18 -0
  393. package/vendor/rocksdb/db_stress_tool/db_stress_env_wrapper.h +78 -0
  394. package/vendor/rocksdb/db_stress_tool/db_stress_gflags.cc +1094 -0
  395. package/vendor/rocksdb/db_stress_tool/db_stress_listener.cc +189 -0
  396. package/vendor/rocksdb/db_stress_tool/db_stress_listener.h +269 -0
  397. package/vendor/rocksdb/db_stress_tool/db_stress_shared_state.cc +17 -0
  398. package/vendor/rocksdb/db_stress_tool/db_stress_shared_state.h +437 -0
  399. package/vendor/rocksdb/db_stress_tool/db_stress_stat.cc +17 -0
  400. package/vendor/rocksdb/db_stress_tool/db_stress_stat.h +219 -0
  401. package/vendor/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +65 -0
  402. package/vendor/rocksdb/db_stress_tool/db_stress_test_base.cc +3294 -0
  403. package/vendor/rocksdb/db_stress_tool/db_stress_test_base.h +327 -0
  404. package/vendor/rocksdb/db_stress_tool/db_stress_tool.cc +371 -0
  405. package/vendor/rocksdb/db_stress_tool/expected_state.cc +780 -0
  406. package/vendor/rocksdb/db_stress_tool/expected_state.h +329 -0
  407. package/vendor/rocksdb/db_stress_tool/expected_value.cc +122 -0
  408. package/vendor/rocksdb/db_stress_tool/expected_value.h +206 -0
  409. package/vendor/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1761 -0
  410. package/vendor/rocksdb/db_stress_tool/multi_ops_txns_stress.h +446 -0
  411. package/vendor/rocksdb/db_stress_tool/no_batched_ops_stress.cc +1906 -0
  412. package/vendor/rocksdb/docs/CNAME +1 -0
  413. package/vendor/rocksdb/docs/CONTRIBUTING.md +115 -0
  414. package/vendor/rocksdb/docs/Gemfile +4 -0
  415. package/vendor/rocksdb/docs/LICENSE-DOCUMENTATION +385 -0
  416. package/vendor/rocksdb/docs/README.md +80 -0
  417. package/vendor/rocksdb/docs/TEMPLATE-INFORMATION.md +17 -0
  418. package/vendor/rocksdb/docs/_config.yml +85 -0
  419. package/vendor/rocksdb/docs/_data/authors.yml +81 -0
  420. package/vendor/rocksdb/docs/_data/features.yml +19 -0
  421. package/vendor/rocksdb/docs/_data/nav.yml +30 -0
  422. package/vendor/rocksdb/docs/_data/nav_docs.yml +3 -0
  423. package/vendor/rocksdb/docs/_data/powered_by.yml +1 -0
  424. package/vendor/rocksdb/docs/_data/powered_by_highlight.yml +1 -0
  425. package/vendor/rocksdb/docs/_data/promo.yml +6 -0
  426. package/vendor/rocksdb/docs/_docs/faq.md +48 -0
  427. package/vendor/rocksdb/docs/_docs/getting-started.md +78 -0
  428. package/vendor/rocksdb/docs/_includes/blog_pagination.html +28 -0
  429. package/vendor/rocksdb/docs/_includes/content/gridblocks.html +5 -0
  430. package/vendor/rocksdb/docs/_includes/content/items/gridblock.html +37 -0
  431. package/vendor/rocksdb/docs/_includes/doc.html +25 -0
  432. package/vendor/rocksdb/docs/_includes/doc_paging.html +0 -0
  433. package/vendor/rocksdb/docs/_includes/footer.html +34 -0
  434. package/vendor/rocksdb/docs/_includes/head.html +23 -0
  435. package/vendor/rocksdb/docs/_includes/header.html +19 -0
  436. package/vendor/rocksdb/docs/_includes/hero.html +0 -0
  437. package/vendor/rocksdb/docs/_includes/home_header.html +22 -0
  438. package/vendor/rocksdb/docs/_includes/katex_import.html +3 -0
  439. package/vendor/rocksdb/docs/_includes/katex_render.html +210 -0
  440. package/vendor/rocksdb/docs/_includes/nav/collection_nav.html +64 -0
  441. package/vendor/rocksdb/docs/_includes/nav/collection_nav_group.html +19 -0
  442. package/vendor/rocksdb/docs/_includes/nav/collection_nav_group_item.html +1 -0
  443. package/vendor/rocksdb/docs/_includes/nav/header_nav.html +30 -0
  444. package/vendor/rocksdb/docs/_includes/nav.html +37 -0
  445. package/vendor/rocksdb/docs/_includes/nav_search.html +15 -0
  446. package/vendor/rocksdb/docs/_includes/plugins/all_share.html +3 -0
  447. package/vendor/rocksdb/docs/_includes/plugins/ascii_cinema.html +2 -0
  448. package/vendor/rocksdb/docs/_includes/plugins/button.html +6 -0
  449. package/vendor/rocksdb/docs/_includes/plugins/github_star.html +4 -0
  450. package/vendor/rocksdb/docs/_includes/plugins/github_watch.html +4 -0
  451. package/vendor/rocksdb/docs/_includes/plugins/google_share.html +5 -0
  452. package/vendor/rocksdb/docs/_includes/plugins/iframe.html +6 -0
  453. package/vendor/rocksdb/docs/_includes/plugins/like_button.html +18 -0
  454. package/vendor/rocksdb/docs/_includes/plugins/plugin_row.html +5 -0
  455. package/vendor/rocksdb/docs/_includes/plugins/post_social_plugins.html +41 -0
  456. package/vendor/rocksdb/docs/_includes/plugins/slideshow.html +88 -0
  457. package/vendor/rocksdb/docs/_includes/plugins/twitter_follow.html +12 -0
  458. package/vendor/rocksdb/docs/_includes/plugins/twitter_share.html +11 -0
  459. package/vendor/rocksdb/docs/_includes/post.html +40 -0
  460. package/vendor/rocksdb/docs/_includes/powered_by.html +28 -0
  461. package/vendor/rocksdb/docs/_includes/social_plugins.html +31 -0
  462. package/vendor/rocksdb/docs/_includes/ui/button.html +1 -0
  463. package/vendor/rocksdb/docs/_layouts/basic.html +12 -0
  464. package/vendor/rocksdb/docs/_layouts/blog.html +11 -0
  465. package/vendor/rocksdb/docs/_layouts/blog_default.html +14 -0
  466. package/vendor/rocksdb/docs/_layouts/default.html +12 -0
  467. package/vendor/rocksdb/docs/_layouts/doc_default.html +14 -0
  468. package/vendor/rocksdb/docs/_layouts/doc_page.html +10 -0
  469. package/vendor/rocksdb/docs/_layouts/docs.html +5 -0
  470. package/vendor/rocksdb/docs/_layouts/home.html +26 -0
  471. package/vendor/rocksdb/docs/_layouts/page.html +3 -0
  472. package/vendor/rocksdb/docs/_layouts/plain.html +10 -0
  473. package/vendor/rocksdb/docs/_layouts/post.html +8 -0
  474. package/vendor/rocksdb/docs/_layouts/redirect.html +6 -0
  475. package/vendor/rocksdb/docs/_layouts/top-level.html +10 -0
  476. package/vendor/rocksdb/docs/_posts/2014-03-27-how-to-backup-rocksdb.markdown +135 -0
  477. package/vendor/rocksdb/docs/_posts/2014-03-27-how-to-persist-in-memory-rocksdb-database.markdown +54 -0
  478. package/vendor/rocksdb/docs/_posts/2014-04-02-the-1st-rocksdb-local-meetup-held-on-march-27-2014.markdown +53 -0
  479. package/vendor/rocksdb/docs/_posts/2014-04-07-rocksdb-2-8-release.markdown +40 -0
  480. package/vendor/rocksdb/docs/_posts/2014-04-21-indexing-sst-files-for-better-lookup-performance.markdown +28 -0
  481. package/vendor/rocksdb/docs/_posts/2014-05-14-lock.markdown +88 -0
  482. package/vendor/rocksdb/docs/_posts/2014-05-19-rocksdb-3-0-release.markdown +24 -0
  483. package/vendor/rocksdb/docs/_posts/2014-05-22-rocksdb-3-1-release.markdown +20 -0
  484. package/vendor/rocksdb/docs/_posts/2014-06-23-plaintable-a-new-file-format.markdown +47 -0
  485. package/vendor/rocksdb/docs/_posts/2014-06-27-avoid-expensive-locks-in-get.markdown +89 -0
  486. package/vendor/rocksdb/docs/_posts/2014-06-27-rocksdb-3-2-release.markdown +30 -0
  487. package/vendor/rocksdb/docs/_posts/2014-07-29-rocksdb-3-3-release.markdown +34 -0
  488. package/vendor/rocksdb/docs/_posts/2014-09-12-cuckoo.markdown +74 -0
  489. package/vendor/rocksdb/docs/_posts/2014-09-12-new-bloom-filter-format.markdown +52 -0
  490. package/vendor/rocksdb/docs/_posts/2014-09-15-rocksdb-3-5-release.markdown +38 -0
  491. package/vendor/rocksdb/docs/_posts/2015-01-16-migrating-from-leveldb-to-rocksdb-2.markdown +112 -0
  492. package/vendor/rocksdb/docs/_posts/2015-02-24-reading-rocksdb-options-from-a-file.markdown +41 -0
  493. package/vendor/rocksdb/docs/_posts/2015-02-27-write-batch-with-index.markdown +20 -0
  494. package/vendor/rocksdb/docs/_posts/2015-04-22-integrating-rocksdb-with-mongodb-2.markdown +16 -0
  495. package/vendor/rocksdb/docs/_posts/2015-06-12-rocksdb-in-osquery.markdown +10 -0
  496. package/vendor/rocksdb/docs/_posts/2015-07-15-rocksdb-2015-h2-roadmap.markdown +92 -0
  497. package/vendor/rocksdb/docs/_posts/2015-07-17-spatial-indexing-in-rocksdb.markdown +78 -0
  498. package/vendor/rocksdb/docs/_posts/2015-07-22-rocksdb-is-now-available-in-windows-platform.markdown +30 -0
  499. package/vendor/rocksdb/docs/_posts/2015-07-23-dynamic-level.markdown +29 -0
  500. package/vendor/rocksdb/docs/_posts/2015-10-27-getthreadlist.markdown +193 -0
  501. package/vendor/rocksdb/docs/_posts/2015-11-10-use-checkpoints-for-efficient-snapshots.markdown +45 -0
  502. package/vendor/rocksdb/docs/_posts/2015-11-16-analysis-file-read-latency-by-level.markdown +244 -0
  503. package/vendor/rocksdb/docs/_posts/2016-01-29-compaction_pri.markdown +51 -0
  504. package/vendor/rocksdb/docs/_posts/2016-02-24-rocksdb-4-2-release.markdown +41 -0
  505. package/vendor/rocksdb/docs/_posts/2016-02-25-rocksdb-ama.markdown +20 -0
  506. package/vendor/rocksdb/docs/_posts/2016-03-07-rocksdb-options-file.markdown +24 -0
  507. package/vendor/rocksdb/docs/_posts/2016-04-26-rocksdb-4-5-1-released.markdown +60 -0
  508. package/vendor/rocksdb/docs/_posts/2016-07-26-rocksdb-4-8-released.markdown +48 -0
  509. package/vendor/rocksdb/docs/_posts/2016-09-28-rocksdb-4-11-2-released.markdown +49 -0
  510. package/vendor/rocksdb/docs/_posts/2017-01-06-rocksdb-5-0-1-released.markdown +26 -0
  511. package/vendor/rocksdb/docs/_posts/2017-02-07-rocksdb-5-1-2-released.markdown +15 -0
  512. package/vendor/rocksdb/docs/_posts/2017-02-17-bulkoad-ingest-sst-file.markdown +50 -0
  513. package/vendor/rocksdb/docs/_posts/2017-03-02-rocksdb-5-2-1-released.markdown +22 -0
  514. package/vendor/rocksdb/docs/_posts/2017-05-12-partitioned-index-filter.markdown +34 -0
  515. package/vendor/rocksdb/docs/_posts/2017-05-14-core-local-stats.markdown +106 -0
  516. package/vendor/rocksdb/docs/_posts/2017-05-26-rocksdb-5-4-5-released.markdown +39 -0
  517. package/vendor/rocksdb/docs/_posts/2017-06-26-17-level-based-changes.markdown +60 -0
  518. package/vendor/rocksdb/docs/_posts/2017-06-29-rocksdb-5-5-1-released.markdown +22 -0
  519. package/vendor/rocksdb/docs/_posts/2017-07-25-rocksdb-5-6-1-released.markdown +22 -0
  520. package/vendor/rocksdb/docs/_posts/2017-08-24-pinnableslice.markdown +37 -0
  521. package/vendor/rocksdb/docs/_posts/2017-08-25-flushwal.markdown +26 -0
  522. package/vendor/rocksdb/docs/_posts/2017-09-28-rocksdb-5-8-released.markdown +25 -0
  523. package/vendor/rocksdb/docs/_posts/2017-12-18-17-auto-tuned-rate-limiter.markdown +28 -0
  524. package/vendor/rocksdb/docs/_posts/2017-12-19-write-prepared-txn.markdown +41 -0
  525. package/vendor/rocksdb/docs/_posts/2018-02-05-rocksdb-5-10-2-released.markdown +22 -0
  526. package/vendor/rocksdb/docs/_posts/2018-08-01-rocksdb-tuning-advisor.markdown +58 -0
  527. package/vendor/rocksdb/docs/_posts/2018-08-23-data-block-hash-index.markdown +118 -0
  528. package/vendor/rocksdb/docs/_posts/2018-11-21-delete-range.markdown +292 -0
  529. package/vendor/rocksdb/docs/_posts/2019-03-08-format-version-4.markdown +36 -0
  530. package/vendor/rocksdb/docs/_posts/2019-08-15-unordered-write.markdown +56 -0
  531. package/vendor/rocksdb/docs/_posts/2021-04-12-universal-improvements.markdown +46 -0
  532. package/vendor/rocksdb/docs/_posts/2021-05-26-integrated-blob-db.markdown +101 -0
  533. package/vendor/rocksdb/docs/_posts/2021-05-26-online-validation.markdown +17 -0
  534. package/vendor/rocksdb/docs/_posts/2021-05-27-rocksdb-secondary-cache.markdown +195 -0
  535. package/vendor/rocksdb/docs/_posts/2021-05-31-dictionary-compression.markdown +157 -0
  536. package/vendor/rocksdb/docs/_posts/2021-12-29-ribbon-filter.markdown +281 -0
  537. package/vendor/rocksdb/docs/_posts/2022-07-18-per-key-value-checksum.markdown +142 -0
  538. package/vendor/rocksdb/docs/_posts/2022-10-05-lost-buffered-write-recovery.markdown +123 -0
  539. package/vendor/rocksdb/docs/_posts/2022-10-07-asynchronous-io-in-rocksdb.markdown +133 -0
  540. package/vendor/rocksdb/docs/_posts/2022-10-31-align-compaction-output-file.markdown +107 -0
  541. package/vendor/rocksdb/docs/_posts/2022-11-09-time-aware-tiered-storage.markdown +121 -0
  542. package/vendor/rocksdb/docs/_sass/_base.scss +492 -0
  543. package/vendor/rocksdb/docs/_sass/_blog.scss +47 -0
  544. package/vendor/rocksdb/docs/_sass/_buttons.scss +47 -0
  545. package/vendor/rocksdb/docs/_sass/_footer.scss +82 -0
  546. package/vendor/rocksdb/docs/_sass/_gridBlock.scss +115 -0
  547. package/vendor/rocksdb/docs/_sass/_header.scss +139 -0
  548. package/vendor/rocksdb/docs/_sass/_poweredby.scss +69 -0
  549. package/vendor/rocksdb/docs/_sass/_promo.scss +55 -0
  550. package/vendor/rocksdb/docs/_sass/_react_docs_nav.scss +332 -0
  551. package/vendor/rocksdb/docs/_sass/_react_header_nav.scss +141 -0
  552. package/vendor/rocksdb/docs/_sass/_reset.scss +43 -0
  553. package/vendor/rocksdb/docs/_sass/_search.scss +142 -0
  554. package/vendor/rocksdb/docs/_sass/_slideshow.scss +48 -0
  555. package/vendor/rocksdb/docs/_sass/_syntax-highlighting.scss +129 -0
  556. package/vendor/rocksdb/docs/_sass/_tables.scss +47 -0
  557. package/vendor/rocksdb/docs/_top-level/support.md +22 -0
  558. package/vendor/rocksdb/docs/blog/all.html +20 -0
  559. package/vendor/rocksdb/docs/blog/index.html +12 -0
  560. package/vendor/rocksdb/docs/css/main.scss +159 -0
  561. package/vendor/rocksdb/docs/doc-type-examples/2016-04-07-blog-post-example.md +21 -0
  562. package/vendor/rocksdb/docs/doc-type-examples/docs-hello-world.md +12 -0
  563. package/vendor/rocksdb/docs/doc-type-examples/top-level-example.md +8 -0
  564. package/vendor/rocksdb/docs/docs/index.html +6 -0
  565. package/vendor/rocksdb/docs/feed.xml +30 -0
  566. package/vendor/rocksdb/docs/index.md +9 -0
  567. package/vendor/rocksdb/docs/static/favicon.png +0 -0
  568. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Black.woff +0 -0
  569. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Black.woff2 +0 -0
  570. package/vendor/rocksdb/docs/static/fonts/LatoLatin-BlackItalic.woff +0 -0
  571. package/vendor/rocksdb/docs/static/fonts/LatoLatin-BlackItalic.woff2 +0 -0
  572. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Italic.woff +0 -0
  573. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Italic.woff2 +0 -0
  574. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Light.woff +0 -0
  575. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Light.woff2 +0 -0
  576. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Regular.woff +0 -0
  577. package/vendor/rocksdb/docs/static/fonts/LatoLatin-Regular.woff2 +0 -0
  578. package/vendor/rocksdb/docs/static/images/Resize-of-20140327_200754-300x225.jpg +0 -0
  579. package/vendor/rocksdb/docs/static/images/align-compaction-output/compaction_output_file_size_compare.png +0 -0
  580. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_align.png +0 -0
  581. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_normal.png +0 -0
  582. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_cut_trival_move.png +0 -0
  583. package/vendor/rocksdb/docs/static/images/align-compaction-output/file_size_compare.png +0 -0
  584. package/vendor/rocksdb/docs/static/images/align-compaction-output/write_amp_compare.png +0 -0
  585. package/vendor/rocksdb/docs/static/images/asynchronous-io/mget_async.png +0 -0
  586. package/vendor/rocksdb/docs/static/images/asynchronous-io/scan_async.png +0 -0
  587. package/vendor/rocksdb/docs/static/images/binaryseek.png +0 -0
  588. package/vendor/rocksdb/docs/static/images/bloom_fp_vs_bpk.png +0 -0
  589. package/vendor/rocksdb/docs/static/images/compaction/full-range.png +0 -0
  590. package/vendor/rocksdb/docs/static/images/compaction/l0-l1-contend.png +0 -0
  591. package/vendor/rocksdb/docs/static/images/compaction/l1-l2-contend.png +0 -0
  592. package/vendor/rocksdb/docs/static/images/compaction/part-range-old.png +0 -0
  593. package/vendor/rocksdb/docs/static/images/data-block-hash-index/block-format-binary-seek.png +0 -0
  594. package/vendor/rocksdb/docs/static/images/data-block-hash-index/block-format-hash-index.png +0 -0
  595. package/vendor/rocksdb/docs/static/images/data-block-hash-index/hash-index-data-structure.png +0 -0
  596. package/vendor/rocksdb/docs/static/images/data-block-hash-index/perf-cache-miss.png +0 -0
  597. package/vendor/rocksdb/docs/static/images/data-block-hash-index/perf-throughput.png +0 -0
  598. package/vendor/rocksdb/docs/static/images/delrange/delrange_collapsed.png +0 -0
  599. package/vendor/rocksdb/docs/static/images/delrange/delrange_key_schema.png +0 -0
  600. package/vendor/rocksdb/docs/static/images/delrange/delrange_sst_blocks.png +0 -0
  601. package/vendor/rocksdb/docs/static/images/delrange/delrange_uncollapsed.png +0 -0
  602. package/vendor/rocksdb/docs/static/images/delrange/delrange_write_path.png +0 -0
  603. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_raw_sampled.png +0 -0
  604. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_sst_blocks.png +0 -0
  605. package/vendor/rocksdb/docs/static/images/dictcmp/dictcmp_zstd_trained.png +0 -0
  606. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Legacy_Vs_Integrated.png +0 -0
  607. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_RW_RO_Perf.png +0 -0
  608. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Write_Amp.png +0 -0
  609. package/vendor/rocksdb/docs/static/images/integrated-blob-db/BlobDB_Benchmarks_Write_Perf.png +0 -0
  610. package/vendor/rocksdb/docs/static/images/kv-checksum/Memtable-entry.png +0 -0
  611. package/vendor/rocksdb/docs/static/images/kv-checksum/Memtable-write.png +0 -0
  612. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Memtable.png +0 -0
  613. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Writebatch-to-Memtable.png +0 -0
  614. package/vendor/rocksdb/docs/static/images/kv-checksum/ProtInfo-Writebatch.png +0 -0
  615. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-fragment.png +0 -0
  616. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-read.png +0 -0
  617. package/vendor/rocksdb/docs/static/images/kv-checksum/WAL-write.png +0 -0
  618. package/vendor/rocksdb/docs/static/images/kv-checksum/Write-batch.png +0 -0
  619. package/vendor/rocksdb/docs/static/images/kv-checksum/Writebatch-write.png +0 -0
  620. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/angry-cat.png +0 -0
  621. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/basic-setup.png +0 -0
  622. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/happy-cat.png +0 -0
  623. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/replay-extension.png +0 -0
  624. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/test-fs-writable-file.png +0 -0
  625. package/vendor/rocksdb/docs/static/images/lost-buffered-write-recovery/trace-extension.png +0 -0
  626. package/vendor/rocksdb/docs/static/images/pcache-blockindex.jpg +0 -0
  627. package/vendor/rocksdb/docs/static/images/pcache-fileindex.jpg +0 -0
  628. package/vendor/rocksdb/docs/static/images/pcache-filelayout.jpg +0 -0
  629. package/vendor/rocksdb/docs/static/images/pcache-readiopath.jpg +0 -0
  630. package/vendor/rocksdb/docs/static/images/pcache-tieredstorage.jpg +0 -0
  631. package/vendor/rocksdb/docs/static/images/pcache-writeiopath.jpg +0 -0
  632. package/vendor/rocksdb/docs/static/images/promo-adapt.svg +8 -0
  633. package/vendor/rocksdb/docs/static/images/promo-flash.svg +28 -0
  634. package/vendor/rocksdb/docs/static/images/promo-operations.svg +6 -0
  635. package/vendor/rocksdb/docs/static/images/promo-performance.svg +134 -0
  636. package/vendor/rocksdb/docs/static/images/rate-limiter/auto-tuned-write-KBps-series.png +0 -0
  637. package/vendor/rocksdb/docs/static/images/rate-limiter/write-KBps-cdf.png +0 -0
  638. package/vendor/rocksdb/docs/static/images/rate-limiter/write-KBps-series.png +0 -0
  639. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/Mixgraph_hit_rate.png +0 -0
  640. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/Mixgraph_throughput.png +0 -0
  641. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/arch_diagram.png +0 -0
  642. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/insert_flow.png +0 -0
  643. package/vendor/rocksdb/docs/static/images/rocksdb-secondary-cache/lookup_flow.png +0 -0
  644. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/compaction_moving_up_conflict.png +0 -0
  645. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/per_key_placement_compaction.png +0 -0
  646. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_design.png +0 -0
  647. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_overview.png +0 -0
  648. package/vendor/rocksdb/docs/static/images/time-aware-tiered-storage/tiered_storage_problem.png +0 -0
  649. package/vendor/rocksdb/docs/static/images/tree_example1.png +0 -0
  650. package/vendor/rocksdb/docs/static/logo.svg +76 -0
  651. package/vendor/rocksdb/docs/static/og_image.png +0 -0
  652. package/vendor/rocksdb/env/composite_env.cc +534 -0
  653. package/vendor/rocksdb/env/composite_env_wrapper.h +378 -0
  654. package/vendor/rocksdb/env/emulated_clock.h +114 -0
  655. package/vendor/rocksdb/env/env.cc +1233 -0
  656. package/vendor/rocksdb/env/env_basic_test.cc +397 -0
  657. package/vendor/rocksdb/env/env_chroot.cc +148 -0
  658. package/vendor/rocksdb/env/env_chroot.h +55 -0
  659. package/vendor/rocksdb/env/env_encryption.cc +1346 -0
  660. package/vendor/rocksdb/env/env_encryption_ctr.h +114 -0
  661. package/vendor/rocksdb/env/env_posix.cc +524 -0
  662. package/vendor/rocksdb/env/env_test.cc +3577 -0
  663. package/vendor/rocksdb/env/file_system.cc +277 -0
  664. package/vendor/rocksdb/env/file_system_tracer.cc +564 -0
  665. package/vendor/rocksdb/env/file_system_tracer.h +461 -0
  666. package/vendor/rocksdb/env/fs_posix.cc +1284 -0
  667. package/vendor/rocksdb/env/fs_readonly.h +105 -0
  668. package/vendor/rocksdb/env/fs_remap.cc +341 -0
  669. package/vendor/rocksdb/env/fs_remap.h +137 -0
  670. package/vendor/rocksdb/env/io_posix.cc +1733 -0
  671. package/vendor/rocksdb/env/io_posix.h +523 -0
  672. package/vendor/rocksdb/env/io_posix_test.cc +141 -0
  673. package/vendor/rocksdb/env/mock_env.cc +1058 -0
  674. package/vendor/rocksdb/env/mock_env.h +144 -0
  675. package/vendor/rocksdb/env/mock_env_test.cc +84 -0
  676. package/vendor/rocksdb/env/unique_id_gen.cc +164 -0
  677. package/vendor/rocksdb/env/unique_id_gen.h +85 -0
  678. package/vendor/rocksdb/examples/CMakeLists.txt +45 -0
  679. package/vendor/rocksdb/examples/Makefile +58 -0
  680. package/vendor/rocksdb/examples/README.md +2 -0
  681. package/vendor/rocksdb/examples/c_simple_example.c +96 -0
  682. package/vendor/rocksdb/examples/column_families_example.cc +88 -0
  683. package/vendor/rocksdb/examples/compact_files_example.cc +177 -0
  684. package/vendor/rocksdb/examples/compaction_filter_example.cc +96 -0
  685. package/vendor/rocksdb/examples/multi_processes_example.cc +393 -0
  686. package/vendor/rocksdb/examples/optimistic_transaction_example.cc +190 -0
  687. package/vendor/rocksdb/examples/options_file_example.cc +132 -0
  688. package/vendor/rocksdb/examples/rocksdb_backup_restore_example.cc +99 -0
  689. package/vendor/rocksdb/examples/rocksdb_option_file_example.ini +142 -0
  690. package/vendor/rocksdb/examples/simple_example.cc +93 -0
  691. package/vendor/rocksdb/examples/transaction_example.cc +196 -0
  692. package/vendor/rocksdb/file/delete_scheduler.cc +409 -0
  693. package/vendor/rocksdb/file/delete_scheduler.h +147 -0
  694. package/vendor/rocksdb/file/delete_scheduler_test.cc +717 -0
  695. package/vendor/rocksdb/file/file_prefetch_buffer.cc +955 -0
  696. package/vendor/rocksdb/file/file_prefetch_buffer.h +471 -0
  697. package/vendor/rocksdb/file/file_util.cc +277 -0
  698. package/vendor/rocksdb/file/file_util.h +91 -0
  699. package/vendor/rocksdb/file/filename.cc +523 -0
  700. package/vendor/rocksdb/file/filename.h +188 -0
  701. package/vendor/rocksdb/file/line_file_reader.cc +73 -0
  702. package/vendor/rocksdb/file/line_file_reader.h +60 -0
  703. package/vendor/rocksdb/file/prefetch_test.cc +2374 -0
  704. package/vendor/rocksdb/file/random_access_file_reader.cc +599 -0
  705. package/vendor/rocksdb/file/random_access_file_reader.h +210 -0
  706. package/vendor/rocksdb/file/random_access_file_reader_test.cc +479 -0
  707. package/vendor/rocksdb/file/read_write_util.cc +33 -0
  708. package/vendor/rocksdb/file/read_write_util.h +31 -0
  709. package/vendor/rocksdb/file/readahead_file_info.h +33 -0
  710. package/vendor/rocksdb/file/readahead_raf.cc +169 -0
  711. package/vendor/rocksdb/file/readahead_raf.h +29 -0
  712. package/vendor/rocksdb/file/sequence_file_reader.cc +320 -0
  713. package/vendor/rocksdb/file/sequence_file_reader.h +119 -0
  714. package/vendor/rocksdb/file/sst_file_manager_impl.cc +507 -0
  715. package/vendor/rocksdb/file/sst_file_manager_impl.h +193 -0
  716. package/vendor/rocksdb/file/writable_file_writer.cc +989 -0
  717. package/vendor/rocksdb/file/writable_file_writer.h +320 -0
  718. package/vendor/rocksdb/fuzz/Makefile +67 -0
  719. package/vendor/rocksdb/fuzz/README.md +165 -0
  720. package/vendor/rocksdb/fuzz/db_fuzzer.cc +172 -0
  721. package/vendor/rocksdb/fuzz/db_map_fuzzer.cc +107 -0
  722. package/vendor/rocksdb/fuzz/proto/db_operation.proto +28 -0
  723. package/vendor/rocksdb/fuzz/sst_file_writer_fuzzer.cc +210 -0
  724. package/vendor/rocksdb/fuzz/util.h +29 -0
  725. package/vendor/rocksdb/include/rocksdb/advanced_cache.h +623 -0
  726. package/vendor/rocksdb/include/rocksdb/advanced_options.h +1177 -0
  727. package/vendor/rocksdb/include/rocksdb/block_cache_trace_writer.h +149 -0
  728. package/vendor/rocksdb/include/rocksdb/c.h +2864 -0
  729. package/vendor/rocksdb/include/rocksdb/cache.h +442 -0
  730. package/vendor/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  731. package/vendor/rocksdb/include/rocksdb/cleanable.h +128 -0
  732. package/vendor/rocksdb/include/rocksdb/compaction_filter.h +363 -0
  733. package/vendor/rocksdb/include/rocksdb/compaction_job_stats.h +109 -0
  734. package/vendor/rocksdb/include/rocksdb/comparator.h +164 -0
  735. package/vendor/rocksdb/include/rocksdb/compression_type.h +40 -0
  736. package/vendor/rocksdb/include/rocksdb/concurrent_task_limiter.h +51 -0
  737. package/vendor/rocksdb/include/rocksdb/configurable.h +390 -0
  738. package/vendor/rocksdb/include/rocksdb/convenience.h +466 -0
  739. package/vendor/rocksdb/include/rocksdb/customizable.h +229 -0
  740. package/vendor/rocksdb/include/rocksdb/data_structure.h +186 -0
  741. package/vendor/rocksdb/include/rocksdb/db.h +1980 -0
  742. package/vendor/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  743. package/vendor/rocksdb/include/rocksdb/db_dump_tool.h +43 -0
  744. package/vendor/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  745. package/vendor/rocksdb/include/rocksdb/env.h +1882 -0
  746. package/vendor/rocksdb/include/rocksdb/env_encryption.h +463 -0
  747. package/vendor/rocksdb/include/rocksdb/experimental.h +56 -0
  748. package/vendor/rocksdb/include/rocksdb/file_checksum.h +146 -0
  749. package/vendor/rocksdb/include/rocksdb/file_system.h +1849 -0
  750. package/vendor/rocksdb/include/rocksdb/filter_policy.h +206 -0
  751. package/vendor/rocksdb/include/rocksdb/flush_block_policy.h +75 -0
  752. package/vendor/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  753. package/vendor/rocksdb/include/rocksdb/io_status.h +244 -0
  754. package/vendor/rocksdb/include/rocksdb/iostats_context.h +98 -0
  755. package/vendor/rocksdb/include/rocksdb/iterator.h +144 -0
  756. package/vendor/rocksdb/include/rocksdb/ldb_tool.h +42 -0
  757. package/vendor/rocksdb/include/rocksdb/listener.h +840 -0
  758. package/vendor/rocksdb/include/rocksdb/memory_allocator.h +87 -0
  759. package/vendor/rocksdb/include/rocksdb/memtablerep.h +421 -0
  760. package/vendor/rocksdb/include/rocksdb/merge_operator.h +286 -0
  761. package/vendor/rocksdb/include/rocksdb/metadata.h +258 -0
  762. package/vendor/rocksdb/include/rocksdb/options.h +2083 -0
  763. package/vendor/rocksdb/include/rocksdb/perf_context.h +314 -0
  764. package/vendor/rocksdb/include/rocksdb/perf_level.h +36 -0
  765. package/vendor/rocksdb/include/rocksdb/persistent_cache.h +74 -0
  766. package/vendor/rocksdb/include/rocksdb/port_defs.h +22 -0
  767. package/vendor/rocksdb/include/rocksdb/rate_limiter.h +159 -0
  768. package/vendor/rocksdb/include/rocksdb/rocksdb_namespace.h +16 -0
  769. package/vendor/rocksdb/include/rocksdb/secondary_cache.h +139 -0
  770. package/vendor/rocksdb/include/rocksdb/slice.h +264 -0
  771. package/vendor/rocksdb/include/rocksdb/slice_transform.h +135 -0
  772. package/vendor/rocksdb/include/rocksdb/snapshot.h +53 -0
  773. package/vendor/rocksdb/include/rocksdb/sst_dump_tool.h +17 -0
  774. package/vendor/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  775. package/vendor/rocksdb/include/rocksdb/sst_file_reader.h +45 -0
  776. package/vendor/rocksdb/include/rocksdb/sst_file_writer.h +189 -0
  777. package/vendor/rocksdb/include/rocksdb/sst_partitioner.h +142 -0
  778. package/vendor/rocksdb/include/rocksdb/statistics.h +757 -0
  779. package/vendor/rocksdb/include/rocksdb/stats_history.h +70 -0
  780. package/vendor/rocksdb/include/rocksdb/status.h +574 -0
  781. package/vendor/rocksdb/include/rocksdb/system_clock.h +114 -0
  782. package/vendor/rocksdb/include/rocksdb/table.h +927 -0
  783. package/vendor/rocksdb/include/rocksdb/table_properties.h +332 -0
  784. package/vendor/rocksdb/include/rocksdb/table_reader_caller.h +41 -0
  785. package/vendor/rocksdb/include/rocksdb/thread_status.h +190 -0
  786. package/vendor/rocksdb/include/rocksdb/threadpool.h +67 -0
  787. package/vendor/rocksdb/include/rocksdb/trace_reader_writer.h +52 -0
  788. package/vendor/rocksdb/include/rocksdb/trace_record.h +248 -0
  789. package/vendor/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  790. package/vendor/rocksdb/include/rocksdb/transaction_log.h +122 -0
  791. package/vendor/rocksdb/include/rocksdb/types.h +94 -0
  792. package/vendor/rocksdb/include/rocksdb/unique_id.h +55 -0
  793. package/vendor/rocksdb/include/rocksdb/universal_compaction.h +96 -0
  794. package/vendor/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  795. package/vendor/rocksdb/include/rocksdb/utilities/backup_engine.h +689 -0
  796. package/vendor/rocksdb/include/rocksdb/utilities/cache_dump_load.h +140 -0
  797. package/vendor/rocksdb/include/rocksdb/utilities/checkpoint.h +63 -0
  798. package/vendor/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  799. package/vendor/rocksdb/include/rocksdb/utilities/customizable_util.h +322 -0
  800. package/vendor/rocksdb/include/rocksdb/utilities/db_ttl.h +70 -0
  801. package/vendor/rocksdb/include/rocksdb/utilities/debug.h +46 -0
  802. package/vendor/rocksdb/include/rocksdb/utilities/env_mirror.h +179 -0
  803. package/vendor/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  804. package/vendor/rocksdb/include/rocksdb/utilities/ldb_cmd.h +316 -0
  805. package/vendor/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +75 -0
  806. package/vendor/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  807. package/vendor/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  808. package/vendor/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  809. package/vendor/rocksdb/include/rocksdb/utilities/memory_util.h +48 -0
  810. package/vendor/rocksdb/include/rocksdb/utilities/object_registry.h +583 -0
  811. package/vendor/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +98 -0
  812. package/vendor/rocksdb/include/rocksdb/utilities/option_change_migration.h +24 -0
  813. package/vendor/rocksdb/include/rocksdb/utilities/options_type.h +1221 -0
  814. package/vendor/rocksdb/include/rocksdb/utilities/options_util.h +105 -0
  815. package/vendor/rocksdb/include/rocksdb/utilities/replayer.h +85 -0
  816. package/vendor/rocksdb/include/rocksdb/utilities/sim_cache.h +93 -0
  817. package/vendor/rocksdb/include/rocksdb/utilities/stackable_db.h +587 -0
  818. package/vendor/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +88 -0
  819. package/vendor/rocksdb/include/rocksdb/utilities/transaction.h +683 -0
  820. package/vendor/rocksdb/include/rocksdb/utilities/transaction_db.h +506 -0
  821. package/vendor/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +89 -0
  822. package/vendor/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +307 -0
  823. package/vendor/rocksdb/include/rocksdb/version.h +43 -0
  824. package/vendor/rocksdb/include/rocksdb/wal_filter.h +111 -0
  825. package/vendor/rocksdb/include/rocksdb/wide_columns.h +210 -0
  826. package/vendor/rocksdb/include/rocksdb/write_batch.h +494 -0
  827. package/vendor/rocksdb/include/rocksdb/write_batch_base.h +144 -0
  828. package/vendor/rocksdb/include/rocksdb/write_buffer_manager.h +183 -0
  829. package/vendor/rocksdb/issue_template.md +7 -0
  830. package/vendor/rocksdb/java/CMakeLists.txt +549 -0
  831. package/vendor/rocksdb/java/GetBenchmarks.md +161 -0
  832. package/vendor/rocksdb/java/HISTORY-JAVA.md +86 -0
  833. package/vendor/rocksdb/java/Makefile +453 -0
  834. package/vendor/rocksdb/java/RELEASE.md +59 -0
  835. package/vendor/rocksdb/java/benchmark/src/main/java/org/rocksdb/benchmark/DbBenchmark.java +1640 -0
  836. package/vendor/rocksdb/java/crossbuild/Vagrantfile +51 -0
  837. package/vendor/rocksdb/java/crossbuild/build-linux-alpine.sh +70 -0
  838. package/vendor/rocksdb/java/crossbuild/build-linux-centos.sh +38 -0
  839. package/vendor/rocksdb/java/crossbuild/build-linux.sh +15 -0
  840. package/vendor/rocksdb/java/crossbuild/docker-build-linux-alpine.sh +17 -0
  841. package/vendor/rocksdb/java/crossbuild/docker-build-linux-centos.sh +38 -0
  842. package/vendor/rocksdb/java/jdb_bench.sh +13 -0
  843. package/vendor/rocksdb/java/jmh/LICENSE-HEADER.txt +5 -0
  844. package/vendor/rocksdb/java/jmh/README.md +24 -0
  845. package/vendor/rocksdb/java/jmh/pom.xml +138 -0
  846. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/ComparatorBenchmarks.java +139 -0
  847. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/GetBenchmarks.java +215 -0
  848. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/MultiGetBenchmarks.java +214 -0
  849. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/jmh/PutBenchmarks.java +112 -0
  850. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/util/FileUtils.java +59 -0
  851. package/vendor/rocksdb/java/jmh/src/main/java/org/rocksdb/util/KVUtils.java +72 -0
  852. package/vendor/rocksdb/java/pom.xml.template +178 -0
  853. package/vendor/rocksdb/java/rocksjni/backup_engine_options.cc +365 -0
  854. package/vendor/rocksdb/java/rocksjni/backupenginejni.cc +279 -0
  855. package/vendor/rocksdb/java/rocksjni/cache.cc +34 -0
  856. package/vendor/rocksdb/java/rocksjni/cassandra_compactionfilterjni.cc +25 -0
  857. package/vendor/rocksdb/java/rocksjni/cassandra_value_operator.cc +50 -0
  858. package/vendor/rocksdb/java/rocksjni/checkpoint.cc +71 -0
  859. package/vendor/rocksdb/java/rocksjni/clock_cache.cc +42 -0
  860. package/vendor/rocksdb/java/rocksjni/columnfamilyhandle.cc +72 -0
  861. package/vendor/rocksdb/java/rocksjni/compact_range_options.cc +222 -0
  862. package/vendor/rocksdb/java/rocksjni/compaction_filter.cc +29 -0
  863. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory.cc +42 -0
  864. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory_jnicallback.cc +79 -0
  865. package/vendor/rocksdb/java/rocksjni/compaction_filter_factory_jnicallback.h +37 -0
  866. package/vendor/rocksdb/java/rocksjni/compaction_job_info.cc +230 -0
  867. package/vendor/rocksdb/java/rocksjni/compaction_job_stats.cc +345 -0
  868. package/vendor/rocksdb/java/rocksjni/compaction_options.cc +112 -0
  869. package/vendor/rocksdb/java/rocksjni/compaction_options_fifo.cc +83 -0
  870. package/vendor/rocksdb/java/rocksjni/compaction_options_universal.cc +209 -0
  871. package/vendor/rocksdb/java/rocksjni/comparator.cc +60 -0
  872. package/vendor/rocksdb/java/rocksjni/comparatorjnicallback.cc +647 -0
  873. package/vendor/rocksdb/java/rocksjni/comparatorjnicallback.h +137 -0
  874. package/vendor/rocksdb/java/rocksjni/compression_options.cc +214 -0
  875. package/vendor/rocksdb/java/rocksjni/concurrent_task_limiter.cc +97 -0
  876. package/vendor/rocksdb/java/rocksjni/config_options.cc +103 -0
  877. package/vendor/rocksdb/java/rocksjni/cplusplus_to_java_convert.h +37 -0
  878. package/vendor/rocksdb/java/rocksjni/env.cc +205 -0
  879. package/vendor/rocksdb/java/rocksjni/env_options.cc +305 -0
  880. package/vendor/rocksdb/java/rocksjni/event_listener.cc +44 -0
  881. package/vendor/rocksdb/java/rocksjni/event_listener_jnicallback.cc +502 -0
  882. package/vendor/rocksdb/java/rocksjni/event_listener_jnicallback.h +122 -0
  883. package/vendor/rocksdb/java/rocksjni/filter.cc +46 -0
  884. package/vendor/rocksdb/java/rocksjni/ingest_external_file_options.cc +199 -0
  885. package/vendor/rocksdb/java/rocksjni/iterator.cc +340 -0
  886. package/vendor/rocksdb/java/rocksjni/jnicallback.cc +54 -0
  887. package/vendor/rocksdb/java/rocksjni/jnicallback.h +32 -0
  888. package/vendor/rocksdb/java/rocksjni/loggerjnicallback.cc +299 -0
  889. package/vendor/rocksdb/java/rocksjni/loggerjnicallback.h +51 -0
  890. package/vendor/rocksdb/java/rocksjni/lru_cache.cc +49 -0
  891. package/vendor/rocksdb/java/rocksjni/memory_util.cc +100 -0
  892. package/vendor/rocksdb/java/rocksjni/memtablejni.cc +94 -0
  893. package/vendor/rocksdb/java/rocksjni/merge_operator.cc +98 -0
  894. package/vendor/rocksdb/java/rocksjni/native_comparator_wrapper_test.cc +45 -0
  895. package/vendor/rocksdb/java/rocksjni/optimistic_transaction_db.cc +270 -0
  896. package/vendor/rocksdb/java/rocksjni/optimistic_transaction_options.cc +78 -0
  897. package/vendor/rocksdb/java/rocksjni/options.cc +8695 -0
  898. package/vendor/rocksdb/java/rocksjni/options_util.cc +139 -0
  899. package/vendor/rocksdb/java/rocksjni/persistent_cache.cc +60 -0
  900. package/vendor/rocksdb/java/rocksjni/portal.h +8706 -0
  901. package/vendor/rocksdb/java/rocksjni/ratelimiterjni.cc +128 -0
  902. package/vendor/rocksdb/java/rocksjni/remove_emptyvalue_compactionfilterjni.cc +24 -0
  903. package/vendor/rocksdb/java/rocksjni/restorejni.cc +42 -0
  904. package/vendor/rocksdb/java/rocksjni/rocks_callback_object.cc +30 -0
  905. package/vendor/rocksdb/java/rocksjni/rocksdb_exception_test.cc +81 -0
  906. package/vendor/rocksdb/java/rocksjni/rocksjni.cc +3957 -0
  907. package/vendor/rocksdb/java/rocksjni/slice.cc +374 -0
  908. package/vendor/rocksdb/java/rocksjni/snapshot.cc +27 -0
  909. package/vendor/rocksdb/java/rocksjni/sst_file_manager.cc +250 -0
  910. package/vendor/rocksdb/java/rocksjni/sst_file_reader_iterator.cc +373 -0
  911. package/vendor/rocksdb/java/rocksjni/sst_file_readerjni.cc +118 -0
  912. package/vendor/rocksdb/java/rocksjni/sst_file_writerjni.cc +310 -0
  913. package/vendor/rocksdb/java/rocksjni/sst_partitioner.cc +43 -0
  914. package/vendor/rocksdb/java/rocksjni/statistics.cc +268 -0
  915. package/vendor/rocksdb/java/rocksjni/statisticsjni.cc +31 -0
  916. package/vendor/rocksdb/java/rocksjni/statisticsjni.h +34 -0
  917. package/vendor/rocksdb/java/rocksjni/table.cc +145 -0
  918. package/vendor/rocksdb/java/rocksjni/table_filter.cc +27 -0
  919. package/vendor/rocksdb/java/rocksjni/table_filter_jnicallback.cc +66 -0
  920. package/vendor/rocksdb/java/rocksjni/table_filter_jnicallback.h +36 -0
  921. package/vendor/rocksdb/java/rocksjni/testable_event_listener.cc +219 -0
  922. package/vendor/rocksdb/java/rocksjni/thread_status.cc +125 -0
  923. package/vendor/rocksdb/java/rocksjni/trace_writer.cc +24 -0
  924. package/vendor/rocksdb/java/rocksjni/trace_writer_jnicallback.cc +118 -0
  925. package/vendor/rocksdb/java/rocksjni/trace_writer_jnicallback.h +36 -0
  926. package/vendor/rocksdb/java/rocksjni/transaction.cc +1655 -0
  927. package/vendor/rocksdb/java/rocksjni/transaction_db.cc +451 -0
  928. package/vendor/rocksdb/java/rocksjni/transaction_db_options.cc +169 -0
  929. package/vendor/rocksdb/java/rocksjni/transaction_log.cc +80 -0
  930. package/vendor/rocksdb/java/rocksjni/transaction_notifier.cc +44 -0
  931. package/vendor/rocksdb/java/rocksjni/transaction_notifier_jnicallback.cc +42 -0
  932. package/vendor/rocksdb/java/rocksjni/transaction_notifier_jnicallback.h +42 -0
  933. package/vendor/rocksdb/java/rocksjni/transaction_options.cc +191 -0
  934. package/vendor/rocksdb/java/rocksjni/ttl.cc +212 -0
  935. package/vendor/rocksdb/java/rocksjni/wal_filter.cc +24 -0
  936. package/vendor/rocksdb/java/rocksjni/wal_filter_jnicallback.cc +139 -0
  937. package/vendor/rocksdb/java/rocksjni/wal_filter_jnicallback.h +42 -0
  938. package/vendor/rocksdb/java/rocksjni/write_batch.cc +676 -0
  939. package/vendor/rocksdb/java/rocksjni/write_batch_test.cc +199 -0
  940. package/vendor/rocksdb/java/rocksjni/write_batch_with_index.cc +953 -0
  941. package/vendor/rocksdb/java/rocksjni/write_buffer_manager.cc +47 -0
  942. package/vendor/rocksdb/java/rocksjni/writebatchhandlerjnicallback.cc +519 -0
  943. package/vendor/rocksdb/java/rocksjni/writebatchhandlerjnicallback.h +92 -0
  944. package/vendor/rocksdb/java/samples/src/main/java/OptimisticTransactionSample.java +184 -0
  945. package/vendor/rocksdb/java/samples/src/main/java/RocksDBColumnFamilySample.java +78 -0
  946. package/vendor/rocksdb/java/samples/src/main/java/RocksDBSample.java +295 -0
  947. package/vendor/rocksdb/java/samples/src/main/java/TransactionSample.java +183 -0
  948. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractCompactionFilter.java +59 -0
  949. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractCompactionFilterFactory.java +77 -0
  950. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractComparator.java +124 -0
  951. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractComparatorJniBridge.java +119 -0
  952. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractEventListener.java +334 -0
  953. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractImmutableNativeReference.java +65 -0
  954. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractMutableOptions.java +368 -0
  955. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractNativeReference.java +49 -0
  956. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractRocksIterator.java +146 -0
  957. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractSlice.java +191 -0
  958. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTableFilter.java +20 -0
  959. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTraceWriter.java +70 -0
  960. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractTransactionNotifier.java +54 -0
  961. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractWalFilter.java +49 -0
  962. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AbstractWriteBatch.java +203 -0
  963. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AccessHint.java +53 -0
  964. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AdvancedColumnFamilyOptionsInterface.java +463 -0
  965. package/vendor/rocksdb/java/src/main/java/org/rocksdb/AdvancedMutableColumnFamilyOptionsInterface.java +830 -0
  966. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackgroundErrorReason.java +46 -0
  967. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupEngine.java +259 -0
  968. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupEngineOptions.java +458 -0
  969. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BackupInfo.java +76 -0
  970. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BlockBasedTableConfig.java +951 -0
  971. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BloomFilter.java +73 -0
  972. package/vendor/rocksdb/java/src/main/java/org/rocksdb/BuiltinComparator.java +20 -0
  973. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ByteBufferGetStatus.java +50 -0
  974. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Cache.java +40 -0
  975. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CassandraCompactionFilter.java +20 -0
  976. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java +25 -0
  977. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Checkpoint.java +62 -0
  978. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ChecksumType.java +45 -0
  979. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ClockCache.java +59 -0
  980. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyDescriptor.java +84 -0
  981. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyHandle.java +151 -0
  982. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyMetaData.java +70 -0
  983. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyOptions.java +1543 -0
  984. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ColumnFamilyOptionsInterface.java +536 -0
  985. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactRangeOptions.java +245 -0
  986. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionJobInfo.java +161 -0
  987. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionJobStats.java +295 -0
  988. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptions.java +121 -0
  989. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptionsFIFO.java +87 -0
  990. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionOptionsUniversal.java +273 -0
  991. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionPriority.java +81 -0
  992. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionReason.java +141 -0
  993. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionStopStyle.java +55 -0
  994. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompactionStyle.java +81 -0
  995. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ComparatorOptions.java +133 -0
  996. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ComparatorType.java +48 -0
  997. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompressionOptions.java +150 -0
  998. package/vendor/rocksdb/java/src/main/java/org/rocksdb/CompressionType.java +121 -0
  999. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConcurrentTaskLimiter.java +44 -0
  1000. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConcurrentTaskLimiterImpl.java +48 -0
  1001. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ConfigOptions.java +53 -0
  1002. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DBOptions.java +1496 -0
  1003. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DBOptionsInterface.java +1756 -0
  1004. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DataBlockIndexType.java +32 -0
  1005. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DbPath.java +47 -0
  1006. package/vendor/rocksdb/java/src/main/java/org/rocksdb/DirectSlice.java +136 -0
  1007. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EncodingType.java +55 -0
  1008. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Env.java +167 -0
  1009. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EnvOptions.java +366 -0
  1010. package/vendor/rocksdb/java/src/main/java/org/rocksdb/EventListener.java +335 -0
  1011. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Experimental.java +23 -0
  1012. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ExternalFileIngestionInfo.java +103 -0
  1013. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FileOperationInfo.java +112 -0
  1014. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Filter.java +36 -0
  1015. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushJobInfo.java +186 -0
  1016. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushOptions.java +90 -0
  1017. package/vendor/rocksdb/java/src/main/java/org/rocksdb/FlushReason.java +53 -0
  1018. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HashLinkedListMemTableConfig.java +174 -0
  1019. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HashSkipListMemTableConfig.java +106 -0
  1020. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HistogramData.java +75 -0
  1021. package/vendor/rocksdb/java/src/main/java/org/rocksdb/HistogramType.java +214 -0
  1022. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Holder.java +46 -0
  1023. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IndexShorteningMode.java +60 -0
  1024. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IndexType.java +55 -0
  1025. package/vendor/rocksdb/java/src/main/java/org/rocksdb/InfoLogLevel.java +49 -0
  1026. package/vendor/rocksdb/java/src/main/java/org/rocksdb/IngestExternalFileOptions.java +227 -0
  1027. package/vendor/rocksdb/java/src/main/java/org/rocksdb/KeyMayExist.java +35 -0
  1028. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LRUCache.java +106 -0
  1029. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LevelMetaData.java +56 -0
  1030. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LiveFileMetaData.java +55 -0
  1031. package/vendor/rocksdb/java/src/main/java/org/rocksdb/LogFile.java +75 -0
  1032. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Logger.java +121 -0
  1033. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemTableConfig.java +29 -0
  1034. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemTableInfo.java +103 -0
  1035. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemoryUsageType.java +72 -0
  1036. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MemoryUtil.java +60 -0
  1037. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MergeOperator.java +18 -0
  1038. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableColumnFamilyOptions.java +621 -0
  1039. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableColumnFamilyOptionsInterface.java +156 -0
  1040. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableDBOptions.java +292 -0
  1041. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableDBOptionsInterface.java +440 -0
  1042. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableOptionKey.java +16 -0
  1043. package/vendor/rocksdb/java/src/main/java/org/rocksdb/MutableOptionValue.java +368 -0
  1044. package/vendor/rocksdb/java/src/main/java/org/rocksdb/NativeComparatorWrapper.java +59 -0
  1045. package/vendor/rocksdb/java/src/main/java/org/rocksdb/NativeLibraryLoader.java +172 -0
  1046. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OperationStage.java +59 -0
  1047. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OperationType.java +55 -0
  1048. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptimisticTransactionDB.java +224 -0
  1049. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptimisticTransactionOptions.java +53 -0
  1050. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptionString.java +261 -0
  1051. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Options.java +2574 -0
  1052. package/vendor/rocksdb/java/src/main/java/org/rocksdb/OptionsUtil.java +101 -0
  1053. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PersistentCache.java +26 -0
  1054. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PlainTableConfig.java +251 -0
  1055. package/vendor/rocksdb/java/src/main/java/org/rocksdb/PrepopulateBlobCache.java +117 -0
  1056. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Priority.java +49 -0
  1057. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Range.java +19 -0
  1058. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RateLimiter.java +227 -0
  1059. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RateLimiterMode.java +52 -0
  1060. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReadOptions.java +822 -0
  1061. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReadTier.java +49 -0
  1062. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RemoveEmptyValueCompactionFilter.java +18 -0
  1063. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RestoreOptions.java +32 -0
  1064. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ReusedSynchronisationType.java +65 -0
  1065. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksCallbackObject.java +73 -0
  1066. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksDB.java +4688 -0
  1067. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksDBException.java +44 -0
  1068. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksEnv.java +31 -0
  1069. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksIterator.java +140 -0
  1070. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksIteratorInterface.java +127 -0
  1071. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksMemEnv.java +31 -0
  1072. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksMutableObject.java +87 -0
  1073. package/vendor/rocksdb/java/src/main/java/org/rocksdb/RocksObject.java +45 -0
  1074. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SanityLevel.java +47 -0
  1075. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SizeApproximationFlag.java +31 -0
  1076. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SkipListMemTableConfig.java +51 -0
  1077. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Slice.java +135 -0
  1078. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Snapshot.java +41 -0
  1079. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileManager.java +249 -0
  1080. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileMetaData.java +162 -0
  1081. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileReader.java +82 -0
  1082. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileReaderIterator.java +140 -0
  1083. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstFileWriter.java +237 -0
  1084. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstPartitionerFactory.java +15 -0
  1085. package/vendor/rocksdb/java/src/main/java/org/rocksdb/SstPartitionerFixedPrefixFactory.java +19 -0
  1086. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StateType.java +53 -0
  1087. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Statistics.java +153 -0
  1088. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatisticsCollector.java +102 -0
  1089. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatisticsCollectorCallback.java +32 -0
  1090. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatsCollectorInput.java +35 -0
  1091. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StatsLevel.java +65 -0
  1092. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Status.java +155 -0
  1093. package/vendor/rocksdb/java/src/main/java/org/rocksdb/StringAppendOperator.java +29 -0
  1094. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationBriefInfo.java +107 -0
  1095. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationInfo.java +86 -0
  1096. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileCreationReason.java +46 -0
  1097. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFileDeletionInfo.java +86 -0
  1098. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFilter.java +21 -0
  1099. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableFormatConfig.java +22 -0
  1100. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TableProperties.java +426 -0
  1101. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ThreadStatus.java +224 -0
  1102. package/vendor/rocksdb/java/src/main/java/org/rocksdb/ThreadType.java +65 -0
  1103. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TickerType.java +802 -0
  1104. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TimedEnv.java +30 -0
  1105. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TraceOptions.java +32 -0
  1106. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TraceWriter.java +36 -0
  1107. package/vendor/rocksdb/java/src/main/java/org/rocksdb/Transaction.java +2162 -0
  1108. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionDB.java +401 -0
  1109. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionDBOptions.java +216 -0
  1110. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionLogIterator.java +112 -0
  1111. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionOptions.java +189 -0
  1112. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionalDB.java +65 -0
  1113. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TransactionalOptions.java +31 -0
  1114. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TtlDB.java +242 -0
  1115. package/vendor/rocksdb/java/src/main/java/org/rocksdb/TxnDBWritePolicy.java +62 -0
  1116. package/vendor/rocksdb/java/src/main/java/org/rocksdb/UInt64AddOperator.java +19 -0
  1117. package/vendor/rocksdb/java/src/main/java/org/rocksdb/VectorMemTableConfig.java +46 -0
  1118. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WALRecoveryMode.java +82 -0
  1119. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WBWIRocksIterator.java +203 -0
  1120. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalFileType.java +55 -0
  1121. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalFilter.java +86 -0
  1122. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WalProcessingOption.java +54 -0
  1123. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatch.java +394 -0
  1124. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatchInterface.java +283 -0
  1125. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBatchWithIndex.java +358 -0
  1126. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteBufferManager.java +50 -0
  1127. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteOptions.java +255 -0
  1128. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteStallCondition.java +44 -0
  1129. package/vendor/rocksdb/java/src/main/java/org/rocksdb/WriteStallInfo.java +75 -0
  1130. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/ByteUtil.java +52 -0
  1131. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/BytewiseComparator.java +121 -0
  1132. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/Environment.java +245 -0
  1133. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/IntComparator.java +67 -0
  1134. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/ReverseBytewiseComparator.java +88 -0
  1135. package/vendor/rocksdb/java/src/main/java/org/rocksdb/util/SizeUnit.java +16 -0
  1136. package/vendor/rocksdb/java/src/test/java/org/rocksdb/AbstractTransactionTest.java +979 -0
  1137. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BackupEngineOptionsTest.java +297 -0
  1138. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BackupEngineTest.java +261 -0
  1139. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BlobOptionsTest.java +353 -0
  1140. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BlockBasedTableConfigTest.java +415 -0
  1141. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BuiltinComparatorTest.java +145 -0
  1142. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ByteBufferUnsupportedOperationTest.java +132 -0
  1143. package/vendor/rocksdb/java/src/test/java/org/rocksdb/BytewiseComparatorRegressionTest.java +132 -0
  1144. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CheckPointTest.java +82 -0
  1145. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ClockCacheTest.java +25 -0
  1146. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ColumnFamilyOptionsTest.java +712 -0
  1147. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ColumnFamilyTest.java +562 -0
  1148. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactRangeOptionsTest.java +102 -0
  1149. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionFilterFactoryTest.java +61 -0
  1150. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionJobInfoTest.java +114 -0
  1151. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionJobStatsTest.java +196 -0
  1152. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsFIFOTest.java +35 -0
  1153. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsTest.java +52 -0
  1154. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionOptionsUniversalTest.java +80 -0
  1155. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionPriorityTest.java +31 -0
  1156. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompactionStopStyleTest.java +31 -0
  1157. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ComparatorOptionsTest.java +58 -0
  1158. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompressionOptionsTest.java +71 -0
  1159. package/vendor/rocksdb/java/src/test/java/org/rocksdb/CompressionTypesTest.java +25 -0
  1160. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ConcurrentTaskLimiterTest.java +56 -0
  1161. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DBOptionsTest.java +902 -0
  1162. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DefaultEnvTest.java +113 -0
  1163. package/vendor/rocksdb/java/src/test/java/org/rocksdb/DirectSliceTest.java +93 -0
  1164. package/vendor/rocksdb/java/src/test/java/org/rocksdb/EnvOptionsTest.java +145 -0
  1165. package/vendor/rocksdb/java/src/test/java/org/rocksdb/EventListenerTest.java +725 -0
  1166. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FilterTest.java +39 -0
  1167. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FlushOptionsTest.java +31 -0
  1168. package/vendor/rocksdb/java/src/test/java/org/rocksdb/FlushTest.java +49 -0
  1169. package/vendor/rocksdb/java/src/test/java/org/rocksdb/InfoLogLevelTest.java +109 -0
  1170. package/vendor/rocksdb/java/src/test/java/org/rocksdb/IngestExternalFileOptionsTest.java +107 -0
  1171. package/vendor/rocksdb/java/src/test/java/org/rocksdb/KeyMayExistTest.java +528 -0
  1172. package/vendor/rocksdb/java/src/test/java/org/rocksdb/LRUCacheTest.java +32 -0
  1173. package/vendor/rocksdb/java/src/test/java/org/rocksdb/LoggerTest.java +235 -0
  1174. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MemTableTest.java +108 -0
  1175. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MemoryUtilTest.java +136 -0
  1176. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MergeTest.java +465 -0
  1177. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MixedOptionsTest.java +85 -0
  1178. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiColumnRegressionTest.java +145 -0
  1179. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiGetManyKeysTest.java +241 -0
  1180. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MultiGetTest.java +530 -0
  1181. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableColumnFamilyOptionsTest.java +167 -0
  1182. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableDBOptionsTest.java +85 -0
  1183. package/vendor/rocksdb/java/src/test/java/org/rocksdb/MutableOptionsGetSetTest.java +429 -0
  1184. package/vendor/rocksdb/java/src/test/java/org/rocksdb/NativeComparatorWrapperTest.java +90 -0
  1185. package/vendor/rocksdb/java/src/test/java/org/rocksdb/NativeLibraryLoaderTest.java +41 -0
  1186. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionDBTest.java +131 -0
  1187. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionOptionsTest.java +38 -0
  1188. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptimisticTransactionTest.java +446 -0
  1189. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptionsTest.java +1488 -0
  1190. package/vendor/rocksdb/java/src/test/java/org/rocksdb/OptionsUtilTest.java +129 -0
  1191. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PlainTableConfigTest.java +89 -0
  1192. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PlatformRandomHelper.java +58 -0
  1193. package/vendor/rocksdb/java/src/test/java/org/rocksdb/PutMultiplePartsTest.java +164 -0
  1194. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RateLimiterTest.java +65 -0
  1195. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ReadOnlyTest.java +222 -0
  1196. package/vendor/rocksdb/java/src/test/java/org/rocksdb/ReadOptionsTest.java +374 -0
  1197. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksDBExceptionTest.java +115 -0
  1198. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksDBTest.java +1692 -0
  1199. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksIteratorTest.java +289 -0
  1200. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksMemEnvTest.java +137 -0
  1201. package/vendor/rocksdb/java/src/test/java/org/rocksdb/RocksNativeLibraryResource.java +18 -0
  1202. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SecondaryDBTest.java +135 -0
  1203. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SliceTest.java +80 -0
  1204. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SnapshotTest.java +169 -0
  1205. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileManagerTest.java +66 -0
  1206. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileReaderTest.java +222 -0
  1207. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstFileWriterTest.java +239 -0
  1208. package/vendor/rocksdb/java/src/test/java/org/rocksdb/SstPartitionerTest.java +72 -0
  1209. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatisticsCollectorTest.java +55 -0
  1210. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatisticsTest.java +168 -0
  1211. package/vendor/rocksdb/java/src/test/java/org/rocksdb/StatsCallbackMock.java +19 -0
  1212. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TableFilterTest.java +106 -0
  1213. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TimedEnvTest.java +40 -0
  1214. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionDBOptionsTest.java +64 -0
  1215. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionDBTest.java +177 -0
  1216. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionLogIteratorTest.java +139 -0
  1217. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionOptionsTest.java +72 -0
  1218. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TransactionTest.java +488 -0
  1219. package/vendor/rocksdb/java/src/test/java/org/rocksdb/TtlDBTest.java +112 -0
  1220. package/vendor/rocksdb/java/src/test/java/org/rocksdb/Types.java +43 -0
  1221. package/vendor/rocksdb/java/src/test/java/org/rocksdb/VerifyChecksumsTest.java +213 -0
  1222. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WALRecoveryModeTest.java +22 -0
  1223. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WalFilterTest.java +165 -0
  1224. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchHandlerTest.java +76 -0
  1225. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchTest.java +528 -0
  1226. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchThreadedTest.java +101 -0
  1227. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteBatchWithIndexTest.java +1068 -0
  1228. package/vendor/rocksdb/java/src/test/java/org/rocksdb/WriteOptionsTest.java +75 -0
  1229. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/RemoveEmptyValueCompactionFilterFactory.java +21 -0
  1230. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/RocksJunitRunner.java +174 -0
  1231. package/vendor/rocksdb/java/src/test/java/org/rocksdb/test/TestableEventListener.java +23 -0
  1232. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/ByteBufferAllocator.java +16 -0
  1233. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/BytewiseComparatorIntTest.java +267 -0
  1234. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/BytewiseComparatorTest.java +531 -0
  1235. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/CapturingWriteBatchHandler.java +190 -0
  1236. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/DirectByteBufferAllocator.java +18 -0
  1237. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/EnvironmentTest.java +304 -0
  1238. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/HeapByteBufferAllocator.java +18 -0
  1239. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/IntComparatorTest.java +266 -0
  1240. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/JNIComparatorTest.java +180 -0
  1241. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/ReverseBytewiseComparatorIntTest.java +270 -0
  1242. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/SizeUnitTest.java +27 -0
  1243. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/TestUtil.java +72 -0
  1244. package/vendor/rocksdb/java/src/test/java/org/rocksdb/util/WriteBatchGetter.java +139 -0
  1245. package/vendor/rocksdb/java/understanding_options.md +79 -0
  1246. package/vendor/rocksdb/logging/auto_roll_logger.cc +368 -0
  1247. package/vendor/rocksdb/logging/auto_roll_logger.h +166 -0
  1248. package/vendor/rocksdb/logging/auto_roll_logger_test.cc +731 -0
  1249. package/vendor/rocksdb/logging/env_logger.h +195 -0
  1250. package/vendor/rocksdb/logging/env_logger_test.cc +163 -0
  1251. package/vendor/rocksdb/logging/event_logger.cc +68 -0
  1252. package/vendor/rocksdb/logging/event_logger.h +202 -0
  1253. package/vendor/rocksdb/logging/event_logger_test.cc +45 -0
  1254. package/vendor/rocksdb/logging/log_buffer.cc +91 -0
  1255. package/vendor/rocksdb/logging/log_buffer.h +57 -0
  1256. package/vendor/rocksdb/logging/logging.h +62 -0
  1257. package/vendor/rocksdb/memory/allocator.h +58 -0
  1258. package/vendor/rocksdb/memory/arena.cc +170 -0
  1259. package/vendor/rocksdb/memory/arena.h +135 -0
  1260. package/vendor/rocksdb/memory/arena_test.cc +295 -0
  1261. package/vendor/rocksdb/memory/concurrent_arena.cc +45 -0
  1262. package/vendor/rocksdb/memory/concurrent_arena.h +215 -0
  1263. package/vendor/rocksdb/memory/jemalloc_nodump_allocator.cc +303 -0
  1264. package/vendor/rocksdb/memory/jemalloc_nodump_allocator.h +99 -0
  1265. package/vendor/rocksdb/memory/memkind_kmem_allocator.cc +44 -0
  1266. package/vendor/rocksdb/memory/memkind_kmem_allocator.h +43 -0
  1267. package/vendor/rocksdb/memory/memory_allocator.cc +80 -0
  1268. package/vendor/rocksdb/memory/memory_allocator_impl.h +47 -0
  1269. package/vendor/rocksdb/memory/memory_allocator_test.cc +236 -0
  1270. package/vendor/rocksdb/memory/memory_usage.h +38 -0
  1271. package/vendor/rocksdb/memtable/alloc_tracker.cc +63 -0
  1272. package/vendor/rocksdb/memtable/hash_linklist_rep.cc +924 -0
  1273. package/vendor/rocksdb/memtable/hash_skiplist_rep.cc +391 -0
  1274. package/vendor/rocksdb/memtable/inlineskiplist.h +1051 -0
  1275. package/vendor/rocksdb/memtable/inlineskiplist_test.cc +665 -0
  1276. package/vendor/rocksdb/memtable/memtablerep_bench.cc +687 -0
  1277. package/vendor/rocksdb/memtable/skiplist.h +498 -0
  1278. package/vendor/rocksdb/memtable/skiplist_test.cc +388 -0
  1279. package/vendor/rocksdb/memtable/skiplistrep.cc +368 -0
  1280. package/vendor/rocksdb/memtable/stl_wrappers.h +33 -0
  1281. package/vendor/rocksdb/memtable/vectorrep.cc +307 -0
  1282. package/vendor/rocksdb/memtable/write_buffer_manager.cc +185 -0
  1283. package/vendor/rocksdb/memtable/write_buffer_manager_test.cc +304 -0
  1284. package/vendor/rocksdb/microbench/CMakeLists.txt +17 -0
  1285. package/vendor/rocksdb/microbench/README.md +60 -0
  1286. package/vendor/rocksdb/microbench/db_basic_bench.cc +1583 -0
  1287. package/vendor/rocksdb/microbench/ribbon_bench.cc +155 -0
  1288. package/vendor/rocksdb/monitoring/file_read_sample.h +23 -0
  1289. package/vendor/rocksdb/monitoring/histogram.cc +270 -0
  1290. package/vendor/rocksdb/monitoring/histogram.h +143 -0
  1291. package/vendor/rocksdb/monitoring/histogram_test.cc +254 -0
  1292. package/vendor/rocksdb/monitoring/histogram_windowing.cc +194 -0
  1293. package/vendor/rocksdb/monitoring/histogram_windowing.h +84 -0
  1294. package/vendor/rocksdb/monitoring/in_memory_stats_history.cc +50 -0
  1295. package/vendor/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  1296. package/vendor/rocksdb/monitoring/instrumented_mutex.cc +90 -0
  1297. package/vendor/rocksdb/monitoring/instrumented_mutex.h +126 -0
  1298. package/vendor/rocksdb/monitoring/iostats_context.cc +78 -0
  1299. package/vendor/rocksdb/monitoring/iostats_context_imp.h +62 -0
  1300. package/vendor/rocksdb/monitoring/iostats_context_test.cc +31 -0
  1301. package/vendor/rocksdb/monitoring/perf_context.cc +313 -0
  1302. package/vendor/rocksdb/monitoring/perf_context_imp.h +96 -0
  1303. package/vendor/rocksdb/monitoring/perf_level.cc +23 -0
  1304. package/vendor/rocksdb/monitoring/perf_level_imp.h +14 -0
  1305. package/vendor/rocksdb/monitoring/perf_step_timer.h +77 -0
  1306. package/vendor/rocksdb/monitoring/persistent_stats_history.cc +170 -0
  1307. package/vendor/rocksdb/monitoring/persistent_stats_history.h +83 -0
  1308. package/vendor/rocksdb/monitoring/statistics.cc +534 -0
  1309. package/vendor/rocksdb/monitoring/statistics_impl.h +144 -0
  1310. package/vendor/rocksdb/monitoring/statistics_test.cc +88 -0
  1311. package/vendor/rocksdb/monitoring/stats_history_test.cc +662 -0
  1312. package/vendor/rocksdb/monitoring/thread_status_impl.cc +163 -0
  1313. package/vendor/rocksdb/monitoring/thread_status_updater.cc +328 -0
  1314. package/vendor/rocksdb/monitoring/thread_status_updater.h +226 -0
  1315. package/vendor/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  1316. package/vendor/rocksdb/monitoring/thread_status_util.cc +208 -0
  1317. package/vendor/rocksdb/monitoring/thread_status_util.h +139 -0
  1318. package/vendor/rocksdb/monitoring/thread_status_util_debug.cc +46 -0
  1319. package/vendor/rocksdb/options/cf_options.cc +1196 -0
  1320. package/vendor/rocksdb/options/cf_options.h +347 -0
  1321. package/vendor/rocksdb/options/configurable.cc +712 -0
  1322. package/vendor/rocksdb/options/configurable_helper.h +185 -0
  1323. package/vendor/rocksdb/options/configurable_test.cc +861 -0
  1324. package/vendor/rocksdb/options/configurable_test.h +116 -0
  1325. package/vendor/rocksdb/options/customizable.cc +133 -0
  1326. package/vendor/rocksdb/options/customizable_test.cc +2116 -0
  1327. package/vendor/rocksdb/options/db_options.cc +1079 -0
  1328. package/vendor/rocksdb/options/db_options.h +152 -0
  1329. package/vendor/rocksdb/options/options.cc +692 -0
  1330. package/vendor/rocksdb/options/options_helper.cc +1424 -0
  1331. package/vendor/rocksdb/options/options_helper.h +116 -0
  1332. package/vendor/rocksdb/options/options_parser.cc +736 -0
  1333. package/vendor/rocksdb/options/options_parser.h +149 -0
  1334. package/vendor/rocksdb/options/options_settable_test.cc +655 -0
  1335. package/vendor/rocksdb/options/options_test.cc +5060 -0
  1336. package/vendor/rocksdb/plugin/README.md +43 -0
  1337. package/vendor/rocksdb/port/README +10 -0
  1338. package/vendor/rocksdb/port/jemalloc_helper.h +107 -0
  1339. package/vendor/rocksdb/port/lang.h +97 -0
  1340. package/vendor/rocksdb/port/likely.h +18 -0
  1341. package/vendor/rocksdb/port/malloc.h +17 -0
  1342. package/vendor/rocksdb/port/mmap.cc +98 -0
  1343. package/vendor/rocksdb/port/mmap.h +70 -0
  1344. package/vendor/rocksdb/port/port.h +21 -0
  1345. package/vendor/rocksdb/port/port_dirent.h +44 -0
  1346. package/vendor/rocksdb/port/port_example.h +101 -0
  1347. package/vendor/rocksdb/port/port_posix.cc +300 -0
  1348. package/vendor/rocksdb/port/port_posix.h +243 -0
  1349. package/vendor/rocksdb/port/stack_trace.cc +336 -0
  1350. package/vendor/rocksdb/port/stack_trace.h +31 -0
  1351. package/vendor/rocksdb/port/sys_time.h +63 -0
  1352. package/vendor/rocksdb/port/util_logger.h +18 -0
  1353. package/vendor/rocksdb/port/win/env_default.cc +45 -0
  1354. package/vendor/rocksdb/port/win/env_win.cc +1437 -0
  1355. package/vendor/rocksdb/port/win/env_win.h +305 -0
  1356. package/vendor/rocksdb/port/win/io_win.cc +1101 -0
  1357. package/vendor/rocksdb/port/win/io_win.h +508 -0
  1358. package/vendor/rocksdb/port/win/port_win.cc +303 -0
  1359. package/vendor/rocksdb/port/win/port_win.h +379 -0
  1360. package/vendor/rocksdb/port/win/win_jemalloc.cc +80 -0
  1361. package/vendor/rocksdb/port/win/win_logger.cc +192 -0
  1362. package/vendor/rocksdb/port/win/win_logger.h +64 -0
  1363. package/vendor/rocksdb/port/win/win_thread.cc +170 -0
  1364. package/vendor/rocksdb/port/win/win_thread.h +117 -0
  1365. package/vendor/rocksdb/port/win/xpress_win.cc +210 -0
  1366. package/vendor/rocksdb/port/win/xpress_win.h +26 -0
  1367. package/vendor/rocksdb/port/xpress.h +17 -0
  1368. package/vendor/rocksdb/rocksdb.pc.in +10 -0
  1369. package/vendor/rocksdb/src.mk +713 -0
  1370. package/vendor/rocksdb/table/adaptive/adaptive_table_factory.cc +125 -0
  1371. package/vendor/rocksdb/table/adaptive/adaptive_table_factory.h +56 -0
  1372. package/vendor/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  1373. package/vendor/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  1374. package/vendor/rocksdb/table/block_based/block.cc +1291 -0
  1375. package/vendor/rocksdb/table/block_based/block.h +921 -0
  1376. package/vendor/rocksdb/table/block_based/block_based_table_builder.cc +2027 -0
  1377. package/vendor/rocksdb/table/block_based/block_based_table_builder.h +209 -0
  1378. package/vendor/rocksdb/table/block_based/block_based_table_factory.cc +962 -0
  1379. package/vendor/rocksdb/table/block_based/block_based_table_factory.h +102 -0
  1380. package/vendor/rocksdb/table/block_based/block_based_table_iterator.cc +500 -0
  1381. package/vendor/rocksdb/table/block_based/block_based_table_iterator.h +310 -0
  1382. package/vendor/rocksdb/table/block_based/block_based_table_reader.cc +3043 -0
  1383. package/vendor/rocksdb/table/block_based/block_based_table_reader.h +745 -0
  1384. package/vendor/rocksdb/table/block_based/block_based_table_reader_impl.h +203 -0
  1385. package/vendor/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +758 -0
  1386. package/vendor/rocksdb/table/block_based/block_based_table_reader_test.cc +567 -0
  1387. package/vendor/rocksdb/table/block_based/block_builder.cc +234 -0
  1388. package/vendor/rocksdb/table/block_based/block_builder.h +104 -0
  1389. package/vendor/rocksdb/table/block_based/block_cache.cc +106 -0
  1390. package/vendor/rocksdb/table/block_based/block_cache.h +140 -0
  1391. package/vendor/rocksdb/table/block_based/block_prefetcher.cc +120 -0
  1392. package/vendor/rocksdb/table/block_based/block_prefetcher.h +72 -0
  1393. package/vendor/rocksdb/table/block_based/block_prefix_index.cc +226 -0
  1394. package/vendor/rocksdb/table/block_based/block_prefix_index.h +70 -0
  1395. package/vendor/rocksdb/table/block_based/block_test.cc +1543 -0
  1396. package/vendor/rocksdb/table/block_based/block_type.h +34 -0
  1397. package/vendor/rocksdb/table/block_based/cachable_entry.h +244 -0
  1398. package/vendor/rocksdb/table/block_based/data_block_footer.cc +59 -0
  1399. package/vendor/rocksdb/table/block_based/data_block_footer.h +25 -0
  1400. package/vendor/rocksdb/table/block_based/data_block_hash_index.cc +94 -0
  1401. package/vendor/rocksdb/table/block_based/data_block_hash_index.h +137 -0
  1402. package/vendor/rocksdb/table/block_based/data_block_hash_index_test.cc +718 -0
  1403. package/vendor/rocksdb/table/block_based/filter_block.h +183 -0
  1404. package/vendor/rocksdb/table/block_based/filter_block_reader_common.cc +163 -0
  1405. package/vendor/rocksdb/table/block_based/filter_block_reader_common.h +76 -0
  1406. package/vendor/rocksdb/table/block_based/filter_policy.cc +1966 -0
  1407. package/vendor/rocksdb/table/block_based/filter_policy_internal.h +340 -0
  1408. package/vendor/rocksdb/table/block_based/flush_block_policy.cc +132 -0
  1409. package/vendor/rocksdb/table/block_based/flush_block_policy_impl.h +40 -0
  1410. package/vendor/rocksdb/table/block_based/full_filter_block.cc +290 -0
  1411. package/vendor/rocksdb/table/block_based/full_filter_block.h +147 -0
  1412. package/vendor/rocksdb/table/block_based/full_filter_block_test.cc +323 -0
  1413. package/vendor/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  1414. package/vendor/rocksdb/table/block_based/hash_index_reader.h +49 -0
  1415. package/vendor/rocksdb/table/block_based/index_builder.cc +282 -0
  1416. package/vendor/rocksdb/table/block_based/index_builder.h +455 -0
  1417. package/vendor/rocksdb/table/block_based/index_reader_common.cc +57 -0
  1418. package/vendor/rocksdb/table/block_based/index_reader_common.h +85 -0
  1419. package/vendor/rocksdb/table/block_based/mock_block_based_table.h +62 -0
  1420. package/vendor/rocksdb/table/block_based/parsed_full_filter_block.cc +23 -0
  1421. package/vendor/rocksdb/table/block_based/parsed_full_filter_block.h +47 -0
  1422. package/vendor/rocksdb/table/block_based/partitioned_filter_block.cc +554 -0
  1423. package/vendor/rocksdb/table/block_based/partitioned_filter_block.h +182 -0
  1424. package/vendor/rocksdb/table/block_based/partitioned_filter_block_test.cc +436 -0
  1425. package/vendor/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  1426. package/vendor/rocksdb/table/block_based/partitioned_index_iterator.h +160 -0
  1427. package/vendor/rocksdb/table/block_based/partitioned_index_reader.cc +224 -0
  1428. package/vendor/rocksdb/table/block_based/partitioned_index_reader.h +56 -0
  1429. package/vendor/rocksdb/table/block_based/reader_common.cc +52 -0
  1430. package/vendor/rocksdb/table/block_based/reader_common.h +34 -0
  1431. package/vendor/rocksdb/table/block_based/uncompression_dict_reader.cc +126 -0
  1432. package/vendor/rocksdb/table/block_based/uncompression_dict_reader.h +61 -0
  1433. package/vendor/rocksdb/table/block_fetcher.cc +405 -0
  1434. package/vendor/rocksdb/table/block_fetcher.h +142 -0
  1435. package/vendor/rocksdb/table/block_fetcher_test.cc +520 -0
  1436. package/vendor/rocksdb/table/cleanable_test.cc +390 -0
  1437. package/vendor/rocksdb/table/compaction_merging_iterator.cc +370 -0
  1438. package/vendor/rocksdb/table/compaction_merging_iterator.h +44 -0
  1439. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder.cc +551 -0
  1440. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  1441. package/vendor/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +631 -0
  1442. package/vendor/rocksdb/table/cuckoo/cuckoo_table_factory.cc +100 -0
  1443. package/vendor/rocksdb/table/cuckoo/cuckoo_table_factory.h +80 -0
  1444. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader.cc +412 -0
  1445. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader.h +100 -0
  1446. package/vendor/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +574 -0
  1447. package/vendor/rocksdb/table/format.cc +573 -0
  1448. package/vendor/rocksdb/table/format.h +378 -0
  1449. package/vendor/rocksdb/table/get_context.cc +616 -0
  1450. package/vendor/rocksdb/table/get_context.h +245 -0
  1451. package/vendor/rocksdb/table/internal_iterator.h +224 -0
  1452. package/vendor/rocksdb/table/iter_heap.h +44 -0
  1453. package/vendor/rocksdb/table/iterator.cc +130 -0
  1454. package/vendor/rocksdb/table/iterator_wrapper.h +190 -0
  1455. package/vendor/rocksdb/table/merger_test.cc +182 -0
  1456. package/vendor/rocksdb/table/merging_iterator.cc +1725 -0
  1457. package/vendor/rocksdb/table/merging_iterator.h +97 -0
  1458. package/vendor/rocksdb/table/meta_blocks.cc +564 -0
  1459. package/vendor/rocksdb/table/meta_blocks.h +172 -0
  1460. package/vendor/rocksdb/table/mock_table.cc +346 -0
  1461. package/vendor/rocksdb/table/mock_table.h +94 -0
  1462. package/vendor/rocksdb/table/multiget_context.h +405 -0
  1463. package/vendor/rocksdb/table/persistent_cache_helper.cc +111 -0
  1464. package/vendor/rocksdb/table/persistent_cache_helper.h +46 -0
  1465. package/vendor/rocksdb/table/persistent_cache_options.h +34 -0
  1466. package/vendor/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  1467. package/vendor/rocksdb/table/plain/plain_table_bloom.h +132 -0
  1468. package/vendor/rocksdb/table/plain/plain_table_builder.cc +335 -0
  1469. package/vendor/rocksdb/table/plain/plain_table_builder.h +152 -0
  1470. package/vendor/rocksdb/table/plain/plain_table_factory.cc +296 -0
  1471. package/vendor/rocksdb/table/plain/plain_table_factory.h +180 -0
  1472. package/vendor/rocksdb/table/plain/plain_table_index.cc +211 -0
  1473. package/vendor/rocksdb/table/plain/plain_table_index.h +246 -0
  1474. package/vendor/rocksdb/table/plain/plain_table_key_coding.cc +507 -0
  1475. package/vendor/rocksdb/table/plain/plain_table_key_coding.h +199 -0
  1476. package/vendor/rocksdb/table/plain/plain_table_reader.cc +771 -0
  1477. package/vendor/rocksdb/table/plain/plain_table_reader.h +243 -0
  1478. package/vendor/rocksdb/table/scoped_arena_iterator.h +57 -0
  1479. package/vendor/rocksdb/table/sst_file_dumper.cc +520 -0
  1480. package/vendor/rocksdb/table/sst_file_dumper.h +99 -0
  1481. package/vendor/rocksdb/table/sst_file_reader.cc +101 -0
  1482. package/vendor/rocksdb/table/sst_file_reader_test.cc +423 -0
  1483. package/vendor/rocksdb/table/sst_file_writer.cc +436 -0
  1484. package/vendor/rocksdb/table/sst_file_writer_collectors.h +95 -0
  1485. package/vendor/rocksdb/table/table_builder.h +228 -0
  1486. package/vendor/rocksdb/table/table_factory.cc +52 -0
  1487. package/vendor/rocksdb/table/table_properties.cc +351 -0
  1488. package/vendor/rocksdb/table/table_properties_internal.h +14 -0
  1489. package/vendor/rocksdb/table/table_reader.h +187 -0
  1490. package/vendor/rocksdb/table/table_reader_bench.cc +339 -0
  1491. package/vendor/rocksdb/table/table_test.cc +5882 -0
  1492. package/vendor/rocksdb/table/two_level_iterator.cc +220 -0
  1493. package/vendor/rocksdb/table/two_level_iterator.h +43 -0
  1494. package/vendor/rocksdb/table/unique_id.cc +223 -0
  1495. package/vendor/rocksdb/table/unique_id_impl.h +93 -0
  1496. package/vendor/rocksdb/test_util/mock_time_env.cc +38 -0
  1497. package/vendor/rocksdb/test_util/mock_time_env.h +78 -0
  1498. package/vendor/rocksdb/test_util/secondary_cache_test_util.cc +96 -0
  1499. package/vendor/rocksdb/test_util/secondary_cache_test_util.h +119 -0
  1500. package/vendor/rocksdb/test_util/sync_point.cc +82 -0
  1501. package/vendor/rocksdb/test_util/sync_point.h +180 -0
  1502. package/vendor/rocksdb/test_util/sync_point_impl.cc +152 -0
  1503. package/vendor/rocksdb/test_util/sync_point_impl.h +96 -0
  1504. package/vendor/rocksdb/test_util/testharness.cc +107 -0
  1505. package/vendor/rocksdb/test_util/testharness.h +124 -0
  1506. package/vendor/rocksdb/test_util/testutil.cc +722 -0
  1507. package/vendor/rocksdb/test_util/testutil.h +860 -0
  1508. package/vendor/rocksdb/test_util/testutil_test.cc +43 -0
  1509. package/vendor/rocksdb/test_util/transaction_test_util.cc +400 -0
  1510. package/vendor/rocksdb/test_util/transaction_test_util.h +147 -0
  1511. package/vendor/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  1512. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/CMakeLists.txt +4 -0
  1513. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest-all.cc +11394 -0
  1514. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest.h +22115 -0
  1515. package/vendor/rocksdb/third-party/gtest-1.8.1/fused-src/gtest/gtest_main.cc +37 -0
  1516. package/vendor/rocksdb/thirdparty.inc +268 -0
  1517. package/vendor/rocksdb/tools/CMakeLists.txt +30 -0
  1518. package/vendor/rocksdb/tools/Dockerfile +5 -0
  1519. package/vendor/rocksdb/tools/advisor/README.md +96 -0
  1520. package/vendor/rocksdb/tools/advisor/advisor/__init__.py +0 -0
  1521. package/vendor/rocksdb/tools/advisor/advisor/bench_runner.py +39 -0
  1522. package/vendor/rocksdb/tools/advisor/advisor/config_optimizer_example.py +140 -0
  1523. package/vendor/rocksdb/tools/advisor/advisor/db_bench_runner.py +237 -0
  1524. package/vendor/rocksdb/tools/advisor/advisor/db_config_optimizer.py +293 -0
  1525. package/vendor/rocksdb/tools/advisor/advisor/db_log_parser.py +134 -0
  1526. package/vendor/rocksdb/tools/advisor/advisor/db_options_parser.py +348 -0
  1527. package/vendor/rocksdb/tools/advisor/advisor/db_stats_fetcher.py +346 -0
  1528. package/vendor/rocksdb/tools/advisor/advisor/db_timeseries_parser.py +203 -0
  1529. package/vendor/rocksdb/tools/advisor/advisor/ini_parser.py +76 -0
  1530. package/vendor/rocksdb/tools/advisor/advisor/rule_parser.py +510 -0
  1531. package/vendor/rocksdb/tools/advisor/advisor/rule_parser_example.py +98 -0
  1532. package/vendor/rocksdb/tools/advisor/advisor/rules.ini +214 -0
  1533. package/vendor/rocksdb/tools/advisor/test/__init__.py +0 -0
  1534. package/vendor/rocksdb/tools/advisor/test/input_files/LOG-0 +30 -0
  1535. package/vendor/rocksdb/tools/advisor/test/input_files/LOG-1 +25 -0
  1536. package/vendor/rocksdb/tools/advisor/test/input_files/OPTIONS-000005 +49 -0
  1537. package/vendor/rocksdb/tools/advisor/test/input_files/log_stats_parser_keys_ts +3 -0
  1538. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err1.ini +56 -0
  1539. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err2.ini +15 -0
  1540. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err3.ini +15 -0
  1541. package/vendor/rocksdb/tools/advisor/test/input_files/rules_err4.ini +15 -0
  1542. package/vendor/rocksdb/tools/advisor/test/input_files/test_rules.ini +47 -0
  1543. package/vendor/rocksdb/tools/advisor/test/input_files/triggered_rules.ini +83 -0
  1544. package/vendor/rocksdb/tools/advisor/test/test_db_bench_runner.py +141 -0
  1545. package/vendor/rocksdb/tools/advisor/test/test_db_log_parser.py +96 -0
  1546. package/vendor/rocksdb/tools/advisor/test/test_db_options_parser.py +214 -0
  1547. package/vendor/rocksdb/tools/advisor/test/test_db_stats_fetcher.py +121 -0
  1548. package/vendor/rocksdb/tools/advisor/test/test_rule_parser.py +226 -0
  1549. package/vendor/rocksdb/tools/analyze_txn_stress_test.sh +77 -0
  1550. package/vendor/rocksdb/tools/auto_sanity_test.sh +93 -0
  1551. package/vendor/rocksdb/tools/backup_db.sh +15 -0
  1552. package/vendor/rocksdb/tools/benchmark.sh +1173 -0
  1553. package/vendor/rocksdb/tools/benchmark_ci.py +182 -0
  1554. package/vendor/rocksdb/tools/benchmark_compare.sh +342 -0
  1555. package/vendor/rocksdb/tools/benchmark_leveldb.sh +187 -0
  1556. package/vendor/rocksdb/tools/blob_dump.cc +103 -0
  1557. package/vendor/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  1558. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  1559. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  1560. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  1561. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2314 -0
  1562. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +397 -0
  1563. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +729 -0
  1564. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +791 -0
  1565. package/vendor/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +17 -0
  1566. package/vendor/rocksdb/tools/check_all_python.py +22 -0
  1567. package/vendor/rocksdb/tools/check_format_compatible.sh +379 -0
  1568. package/vendor/rocksdb/tools/db_bench.cc +21 -0
  1569. package/vendor/rocksdb/tools/db_bench_tool.cc +8604 -0
  1570. package/vendor/rocksdb/tools/db_bench_tool_test.cc +342 -0
  1571. package/vendor/rocksdb/tools/db_crashtest.py +1018 -0
  1572. package/vendor/rocksdb/tools/db_repl_stress.cc +132 -0
  1573. package/vendor/rocksdb/tools/db_sanity_test.cc +296 -0
  1574. package/vendor/rocksdb/tools/dbench_monitor +102 -0
  1575. package/vendor/rocksdb/tools/dump/db_dump_tool.cc +258 -0
  1576. package/vendor/rocksdb/tools/dump/rocksdb_dump.cc +60 -0
  1577. package/vendor/rocksdb/tools/dump/rocksdb_undump.cc +59 -0
  1578. package/vendor/rocksdb/tools/generate_random_db.sh +31 -0
  1579. package/vendor/rocksdb/tools/ingest_external_sst.sh +18 -0
  1580. package/vendor/rocksdb/tools/io_tracer_parser.cc +17 -0
  1581. package/vendor/rocksdb/tools/io_tracer_parser_test.cc +182 -0
  1582. package/vendor/rocksdb/tools/io_tracer_parser_tool.cc +142 -0
  1583. package/vendor/rocksdb/tools/io_tracer_parser_tool.h +38 -0
  1584. package/vendor/rocksdb/tools/ldb.cc +13 -0
  1585. package/vendor/rocksdb/tools/ldb_cmd.cc +4263 -0
  1586. package/vendor/rocksdb/tools/ldb_cmd_impl.h +744 -0
  1587. package/vendor/rocksdb/tools/ldb_cmd_test.cc +1216 -0
  1588. package/vendor/rocksdb/tools/ldb_test.py +955 -0
  1589. package/vendor/rocksdb/tools/ldb_tool.cc +182 -0
  1590. package/vendor/rocksdb/tools/pflag +217 -0
  1591. package/vendor/rocksdb/tools/reduce_levels_test.cc +212 -0
  1592. package/vendor/rocksdb/tools/regression_test.sh +525 -0
  1593. package/vendor/rocksdb/tools/restore_db.sh +15 -0
  1594. package/vendor/rocksdb/tools/rocksdb_dump_test.sh +9 -0
  1595. package/vendor/rocksdb/tools/run_blob_bench.sh +223 -0
  1596. package/vendor/rocksdb/tools/run_flash_bench.sh +359 -0
  1597. package/vendor/rocksdb/tools/run_leveldb.sh +175 -0
  1598. package/vendor/rocksdb/tools/sample-dump.dmp +0 -0
  1599. package/vendor/rocksdb/tools/simulated_hybrid_file_system.cc +243 -0
  1600. package/vendor/rocksdb/tools/simulated_hybrid_file_system.h +124 -0
  1601. package/vendor/rocksdb/tools/sst_dump.cc +12 -0
  1602. package/vendor/rocksdb/tools/sst_dump_test.cc +471 -0
  1603. package/vendor/rocksdb/tools/sst_dump_tool.cc +582 -0
  1604. package/vendor/rocksdb/tools/trace_analyzer.cc +17 -0
  1605. package/vendor/rocksdb/tools/trace_analyzer_test.cc +880 -0
  1606. package/vendor/rocksdb/tools/trace_analyzer_tool.cc +1929 -0
  1607. package/vendor/rocksdb/tools/trace_analyzer_tool.h +329 -0
  1608. package/vendor/rocksdb/tools/verify_random_db.sh +41 -0
  1609. package/vendor/rocksdb/tools/write_external_sst.sh +26 -0
  1610. package/vendor/rocksdb/tools/write_stress.cc +305 -0
  1611. package/vendor/rocksdb/tools/write_stress_runner.py +83 -0
  1612. package/vendor/rocksdb/trace_replay/block_cache_tracer.cc +509 -0
  1613. package/vendor/rocksdb/trace_replay/block_cache_tracer.h +239 -0
  1614. package/vendor/rocksdb/trace_replay/block_cache_tracer_test.cc +421 -0
  1615. package/vendor/rocksdb/trace_replay/io_tracer.cc +303 -0
  1616. package/vendor/rocksdb/trace_replay/io_tracer.h +185 -0
  1617. package/vendor/rocksdb/trace_replay/io_tracer_test.cc +353 -0
  1618. package/vendor/rocksdb/trace_replay/trace_record.cc +206 -0
  1619. package/vendor/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  1620. package/vendor/rocksdb/trace_replay/trace_record_handler.h +46 -0
  1621. package/vendor/rocksdb/trace_replay/trace_record_result.cc +146 -0
  1622. package/vendor/rocksdb/trace_replay/trace_replay.cc +622 -0
  1623. package/vendor/rocksdb/trace_replay/trace_replay.h +183 -0
  1624. package/vendor/rocksdb/util/aligned_buffer.h +235 -0
  1625. package/vendor/rocksdb/util/async_file_reader.cc +81 -0
  1626. package/vendor/rocksdb/util/async_file_reader.h +144 -0
  1627. package/vendor/rocksdb/util/autovector.h +393 -0
  1628. package/vendor/rocksdb/util/autovector_test.cc +324 -0
  1629. package/vendor/rocksdb/util/bloom_impl.h +489 -0
  1630. package/vendor/rocksdb/util/bloom_test.cc +1175 -0
  1631. package/vendor/rocksdb/util/build_version.cc.in +79 -0
  1632. package/vendor/rocksdb/util/cast_util.h +42 -0
  1633. package/vendor/rocksdb/util/channel.h +69 -0
  1634. package/vendor/rocksdb/util/cleanable.cc +181 -0
  1635. package/vendor/rocksdb/util/coding.cc +90 -0
  1636. package/vendor/rocksdb/util/coding.h +389 -0
  1637. package/vendor/rocksdb/util/coding_lean.h +101 -0
  1638. package/vendor/rocksdb/util/coding_test.cc +217 -0
  1639. package/vendor/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  1640. package/vendor/rocksdb/util/comparator.cc +383 -0
  1641. package/vendor/rocksdb/util/compression.cc +122 -0
  1642. package/vendor/rocksdb/util/compression.h +1795 -0
  1643. package/vendor/rocksdb/util/compression_context_cache.cc +106 -0
  1644. package/vendor/rocksdb/util/compression_context_cache.h +47 -0
  1645. package/vendor/rocksdb/util/concurrent_task_limiter_impl.cc +64 -0
  1646. package/vendor/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  1647. package/vendor/rocksdb/util/core_local.h +84 -0
  1648. package/vendor/rocksdb/util/coro_utils.h +112 -0
  1649. package/vendor/rocksdb/util/crc32c.cc +1292 -0
  1650. package/vendor/rocksdb/util/crc32c.h +56 -0
  1651. package/vendor/rocksdb/util/crc32c_arm64.cc +213 -0
  1652. package/vendor/rocksdb/util/crc32c_arm64.h +52 -0
  1653. package/vendor/rocksdb/util/crc32c_ppc.c +94 -0
  1654. package/vendor/rocksdb/util/crc32c_ppc.h +22 -0
  1655. package/vendor/rocksdb/util/crc32c_ppc_asm.S +756 -0
  1656. package/vendor/rocksdb/util/crc32c_ppc_constants.h +900 -0
  1657. package/vendor/rocksdb/util/crc32c_test.cc +213 -0
  1658. package/vendor/rocksdb/util/data_structure.cc +18 -0
  1659. package/vendor/rocksdb/util/defer.h +82 -0
  1660. package/vendor/rocksdb/util/defer_test.cc +51 -0
  1661. package/vendor/rocksdb/util/distributed_mutex.h +50 -0
  1662. package/vendor/rocksdb/util/duplicate_detector.h +69 -0
  1663. package/vendor/rocksdb/util/dynamic_bloom.cc +70 -0
  1664. package/vendor/rocksdb/util/dynamic_bloom.h +214 -0
  1665. package/vendor/rocksdb/util/dynamic_bloom_test.cc +325 -0
  1666. package/vendor/rocksdb/util/fastrange.h +114 -0
  1667. package/vendor/rocksdb/util/file_checksum_helper.cc +170 -0
  1668. package/vendor/rocksdb/util/file_checksum_helper.h +101 -0
  1669. package/vendor/rocksdb/util/file_reader_writer_test.cc +1058 -0
  1670. package/vendor/rocksdb/util/filelock_test.cc +148 -0
  1671. package/vendor/rocksdb/util/filter_bench.cc +840 -0
  1672. package/vendor/rocksdb/util/gflags_compat.h +29 -0
  1673. package/vendor/rocksdb/util/hash.cc +201 -0
  1674. package/vendor/rocksdb/util/hash.h +137 -0
  1675. package/vendor/rocksdb/util/hash128.h +26 -0
  1676. package/vendor/rocksdb/util/hash_containers.h +51 -0
  1677. package/vendor/rocksdb/util/hash_map.h +67 -0
  1678. package/vendor/rocksdb/util/hash_test.cc +853 -0
  1679. package/vendor/rocksdb/util/heap.h +174 -0
  1680. package/vendor/rocksdb/util/heap_test.cc +131 -0
  1681. package/vendor/rocksdb/util/kv_map.h +33 -0
  1682. package/vendor/rocksdb/util/log_write_bench.cc +88 -0
  1683. package/vendor/rocksdb/util/math.h +299 -0
  1684. package/vendor/rocksdb/util/math128.h +316 -0
  1685. package/vendor/rocksdb/util/murmurhash.cc +196 -0
  1686. package/vendor/rocksdb/util/murmurhash.h +43 -0
  1687. package/vendor/rocksdb/util/mutexlock.h +181 -0
  1688. package/vendor/rocksdb/util/ppc-opcode.h +27 -0
  1689. package/vendor/rocksdb/util/random.cc +63 -0
  1690. package/vendor/rocksdb/util/random.h +190 -0
  1691. package/vendor/rocksdb/util/random_test.cc +107 -0
  1692. package/vendor/rocksdb/util/rate_limiter.cc +376 -0
  1693. package/vendor/rocksdb/util/rate_limiter_impl.h +146 -0
  1694. package/vendor/rocksdb/util/rate_limiter_test.cc +520 -0
  1695. package/vendor/rocksdb/util/repeatable_thread.h +149 -0
  1696. package/vendor/rocksdb/util/repeatable_thread_test.cc +111 -0
  1697. package/vendor/rocksdb/util/ribbon_alg.h +1225 -0
  1698. package/vendor/rocksdb/util/ribbon_config.cc +506 -0
  1699. package/vendor/rocksdb/util/ribbon_config.h +182 -0
  1700. package/vendor/rocksdb/util/ribbon_impl.h +1137 -0
  1701. package/vendor/rocksdb/util/ribbon_test.cc +1308 -0
  1702. package/vendor/rocksdb/util/set_comparator.h +24 -0
  1703. package/vendor/rocksdb/util/single_thread_executor.h +56 -0
  1704. package/vendor/rocksdb/util/slice.cc +367 -0
  1705. package/vendor/rocksdb/util/slice_test.cc +252 -0
  1706. package/vendor/rocksdb/util/slice_transform_test.cc +159 -0
  1707. package/vendor/rocksdb/util/status.cc +162 -0
  1708. package/vendor/rocksdb/util/stderr_logger.cc +30 -0
  1709. package/vendor/rocksdb/util/stderr_logger.h +31 -0
  1710. package/vendor/rocksdb/util/stop_watch.h +136 -0
  1711. package/vendor/rocksdb/util/string_util.cc +502 -0
  1712. package/vendor/rocksdb/util/string_util.h +175 -0
  1713. package/vendor/rocksdb/util/thread_guard.h +41 -0
  1714. package/vendor/rocksdb/util/thread_list_test.cc +362 -0
  1715. package/vendor/rocksdb/util/thread_local.cc +521 -0
  1716. package/vendor/rocksdb/util/thread_local.h +100 -0
  1717. package/vendor/rocksdb/util/thread_local_test.cc +578 -0
  1718. package/vendor/rocksdb/util/thread_operation.h +113 -0
  1719. package/vendor/rocksdb/util/threadpool_imp.cc +551 -0
  1720. package/vendor/rocksdb/util/threadpool_imp.h +120 -0
  1721. package/vendor/rocksdb/util/timer.h +340 -0
  1722. package/vendor/rocksdb/util/timer_queue.h +231 -0
  1723. package/vendor/rocksdb/util/timer_queue_test.cc +73 -0
  1724. package/vendor/rocksdb/util/timer_test.cc +402 -0
  1725. package/vendor/rocksdb/util/udt_util.h +77 -0
  1726. package/vendor/rocksdb/util/user_comparator_wrapper.h +64 -0
  1727. package/vendor/rocksdb/util/vector_iterator.h +118 -0
  1728. package/vendor/rocksdb/util/work_queue.h +150 -0
  1729. package/vendor/rocksdb/util/work_queue_test.cc +272 -0
  1730. package/vendor/rocksdb/util/xxhash.cc +48 -0
  1731. package/vendor/rocksdb/util/xxhash.h +6360 -0
  1732. package/vendor/rocksdb/util/xxph3.h +1764 -0
  1733. package/vendor/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  1734. package/vendor/rocksdb/utilities/agg_merge/agg_merge_impl.h +49 -0
  1735. package/vendor/rocksdb/utilities/agg_merge/agg_merge_test.cc +135 -0
  1736. package/vendor/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  1737. package/vendor/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  1738. package/vendor/rocksdb/utilities/backup/backup_engine.cc +3355 -0
  1739. package/vendor/rocksdb/utilities/backup/backup_engine_impl.h +34 -0
  1740. package/vendor/rocksdb/utilities/backup/backup_engine_test.cc +4414 -0
  1741. package/vendor/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  1742. package/vendor/rocksdb/utilities/blob_db/blob_compaction_filter.h +202 -0
  1743. package/vendor/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  1744. package/vendor/rocksdb/utilities/blob_db/blob_db.h +264 -0
  1745. package/vendor/rocksdb/utilities/blob_db/blob_db_gc_stats.h +54 -0
  1746. package/vendor/rocksdb/utilities/blob_db/blob_db_impl.cc +2185 -0
  1747. package/vendor/rocksdb/utilities/blob_db/blob_db_impl.h +501 -0
  1748. package/vendor/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +111 -0
  1749. package/vendor/rocksdb/utilities/blob_db/blob_db_iterator.h +148 -0
  1750. package/vendor/rocksdb/utilities/blob_db/blob_db_listener.h +69 -0
  1751. package/vendor/rocksdb/utilities/blob_db/blob_db_test.cc +2430 -0
  1752. package/vendor/rocksdb/utilities/blob_db/blob_dump_tool.cc +280 -0
  1753. package/vendor/rocksdb/utilities/blob_db/blob_dump_tool.h +56 -0
  1754. package/vendor/rocksdb/utilities/blob_db/blob_file.cc +316 -0
  1755. package/vendor/rocksdb/utilities/blob_db/blob_file.h +244 -0
  1756. package/vendor/rocksdb/utilities/cache_dump_load.cc +67 -0
  1757. package/vendor/rocksdb/utilities/cache_dump_load_impl.cc +369 -0
  1758. package/vendor/rocksdb/utilities/cache_dump_load_impl.h +356 -0
  1759. package/vendor/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +106 -0
  1760. package/vendor/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +57 -0
  1761. package/vendor/rocksdb/utilities/cassandra/cassandra_format_test.cc +377 -0
  1762. package/vendor/rocksdb/utilities/cassandra/cassandra_functional_test.cc +444 -0
  1763. package/vendor/rocksdb/utilities/cassandra/cassandra_options.h +41 -0
  1764. package/vendor/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +98 -0
  1765. package/vendor/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +164 -0
  1766. package/vendor/rocksdb/utilities/cassandra/format.cc +367 -0
  1767. package/vendor/rocksdb/utilities/cassandra/format.h +183 -0
  1768. package/vendor/rocksdb/utilities/cassandra/merge_operator.cc +80 -0
  1769. package/vendor/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  1770. package/vendor/rocksdb/utilities/cassandra/serialize.h +81 -0
  1771. package/vendor/rocksdb/utilities/cassandra/test_utils.cc +69 -0
  1772. package/vendor/rocksdb/utilities/cassandra/test_utils.h +42 -0
  1773. package/vendor/rocksdb/utilities/checkpoint/checkpoint_impl.cc +470 -0
  1774. package/vendor/rocksdb/utilities/checkpoint/checkpoint_impl.h +64 -0
  1775. package/vendor/rocksdb/utilities/checkpoint/checkpoint_test.cc +988 -0
  1776. package/vendor/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +41 -0
  1777. package/vendor/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +24 -0
  1778. package/vendor/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +26 -0
  1779. package/vendor/rocksdb/utilities/compaction_filters.cc +52 -0
  1780. package/vendor/rocksdb/utilities/convenience/info_log_finder.cc +26 -0
  1781. package/vendor/rocksdb/utilities/counted_fs.cc +379 -0
  1782. package/vendor/rocksdb/utilities/counted_fs.h +158 -0
  1783. package/vendor/rocksdb/utilities/debug.cc +118 -0
  1784. package/vendor/rocksdb/utilities/env_mirror.cc +273 -0
  1785. package/vendor/rocksdb/utilities/env_mirror_test.cc +216 -0
  1786. package/vendor/rocksdb/utilities/env_timed.cc +181 -0
  1787. package/vendor/rocksdb/utilities/env_timed.h +95 -0
  1788. package/vendor/rocksdb/utilities/env_timed_test.cc +34 -0
  1789. package/vendor/rocksdb/utilities/fault_injection_env.cc +555 -0
  1790. package/vendor/rocksdb/utilities/fault_injection_env.h +258 -0
  1791. package/vendor/rocksdb/utilities/fault_injection_fs.cc +1071 -0
  1792. package/vendor/rocksdb/utilities/fault_injection_fs.h +593 -0
  1793. package/vendor/rocksdb/utilities/fault_injection_secondary_cache.cc +136 -0
  1794. package/vendor/rocksdb/utilities/fault_injection_secondary_cache.h +109 -0
  1795. package/vendor/rocksdb/utilities/leveldb_options/leveldb_options.cc +57 -0
  1796. package/vendor/rocksdb/utilities/memory/memory_test.cc +269 -0
  1797. package/vendor/rocksdb/utilities/memory/memory_util.cc +50 -0
  1798. package/vendor/rocksdb/utilities/memory_allocators.h +103 -0
  1799. package/vendor/rocksdb/utilities/merge_operators/bytesxor.cc +57 -0
  1800. package/vendor/rocksdb/utilities/merge_operators/bytesxor.h +40 -0
  1801. package/vendor/rocksdb/utilities/merge_operators/max.cc +64 -0
  1802. package/vendor/rocksdb/utilities/merge_operators/max_operator.h +35 -0
  1803. package/vendor/rocksdb/utilities/merge_operators/put.cc +74 -0
  1804. package/vendor/rocksdb/utilities/merge_operators/put_operator.h +56 -0
  1805. package/vendor/rocksdb/utilities/merge_operators/sortlist.cc +95 -0
  1806. package/vendor/rocksdb/utilities/merge_operators/sortlist.h +42 -0
  1807. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend.cc +76 -0
  1808. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend.h +32 -0
  1809. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +130 -0
  1810. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend2.h +52 -0
  1811. package/vendor/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +636 -0
  1812. package/vendor/rocksdb/utilities/merge_operators/uint64add.cc +56 -0
  1813. package/vendor/rocksdb/utilities/merge_operators/uint64add.h +35 -0
  1814. package/vendor/rocksdb/utilities/merge_operators.cc +115 -0
  1815. package/vendor/rocksdb/utilities/merge_operators.h +36 -0
  1816. package/vendor/rocksdb/utilities/object_registry.cc +381 -0
  1817. package/vendor/rocksdb/utilities/object_registry_test.cc +862 -0
  1818. package/vendor/rocksdb/utilities/option_change_migration/option_change_migration.cc +176 -0
  1819. package/vendor/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +548 -0
  1820. package/vendor/rocksdb/utilities/options/options_util.cc +117 -0
  1821. package/vendor/rocksdb/utilities/options/options_util_test.cc +782 -0
  1822. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier.cc +420 -0
  1823. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier.h +154 -0
  1824. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +608 -0
  1825. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +291 -0
  1826. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  1827. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +84 -0
  1828. package/vendor/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +122 -0
  1829. package/vendor/rocksdb/utilities/persistent_cache/hash_table.h +237 -0
  1830. package/vendor/rocksdb/utilities/persistent_cache/hash_table_bench.cc +310 -0
  1831. package/vendor/rocksdb/utilities/persistent_cache/hash_table_evictable.h +166 -0
  1832. package/vendor/rocksdb/utilities/persistent_cache/hash_table_test.cc +161 -0
  1833. package/vendor/rocksdb/utilities/persistent_cache/lrulist.h +172 -0
  1834. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +355 -0
  1835. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +413 -0
  1836. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_test.h +284 -0
  1837. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +165 -0
  1838. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +340 -0
  1839. package/vendor/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  1840. package/vendor/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +138 -0
  1841. package/vendor/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +139 -0
  1842. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator.cc +287 -0
  1843. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  1844. package/vendor/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +497 -0
  1845. package/vendor/rocksdb/utilities/simulator_cache/sim_cache.cc +372 -0
  1846. package/vendor/rocksdb/utilities/simulator_cache/sim_cache_test.cc +226 -0
  1847. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +221 -0
  1848. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +68 -0
  1849. package/vendor/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +238 -0
  1850. package/vendor/rocksdb/utilities/trace/file_trace_reader_writer.cc +133 -0
  1851. package/vendor/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  1852. package/vendor/rocksdb/utilities/trace/replayer_impl.cc +314 -0
  1853. package/vendor/rocksdb/utilities/trace/replayer_impl.h +84 -0
  1854. package/vendor/rocksdb/utilities/transactions/lock/lock_manager.cc +27 -0
  1855. package/vendor/rocksdb/utilities/transactions/lock/lock_manager.h +80 -0
  1856. package/vendor/rocksdb/utilities/transactions/lock/lock_tracker.h +207 -0
  1857. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +719 -0
  1858. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +222 -0
  1859. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +170 -0
  1860. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +324 -0
  1861. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +255 -0
  1862. package/vendor/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +97 -0
  1863. package/vendor/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +34 -0
  1864. package/vendor/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +448 -0
  1865. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  1866. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  1867. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  1868. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  1869. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  1870. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  1871. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  1872. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +137 -0
  1873. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  1874. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +220 -0
  1875. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  1876. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  1877. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +255 -0
  1878. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1021 -0
  1879. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +580 -0
  1880. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +525 -0
  1881. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +263 -0
  1882. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  1883. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +518 -0
  1884. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  1885. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +118 -0
  1886. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  1887. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +211 -0
  1888. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  1889. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  1890. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  1891. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  1892. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +83 -0
  1893. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1894. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1895. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1896. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1897. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +197 -0
  1898. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1899. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +130 -0
  1900. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +151 -0
  1901. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1902. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1903. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +199 -0
  1904. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1905. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1906. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1907. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1908. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1909. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +501 -0
  1910. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +135 -0
  1911. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +154 -0
  1912. package/vendor/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1913. package/vendor/rocksdb/utilities/transactions/optimistic_transaction.cc +194 -0
  1914. package/vendor/rocksdb/utilities/transactions/optimistic_transaction.h +99 -0
  1915. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +109 -0
  1916. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +86 -0
  1917. package/vendor/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1479 -0
  1918. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction.cc +1177 -0
  1919. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction.h +311 -0
  1920. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +780 -0
  1921. package/vendor/rocksdb/utilities/transactions/pessimistic_transaction_db.h +316 -0
  1922. package/vendor/rocksdb/utilities/transactions/snapshot_checker.cc +37 -0
  1923. package/vendor/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +457 -0
  1924. package/vendor/rocksdb/utilities/transactions/transaction_base.cc +757 -0
  1925. package/vendor/rocksdb/utilities/transactions/transaction_base.h +382 -0
  1926. package/vendor/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +133 -0
  1927. package/vendor/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +24 -0
  1928. package/vendor/rocksdb/utilities/transactions/transaction_test.cc +6751 -0
  1929. package/vendor/rocksdb/utilities/transactions/transaction_test.h +578 -0
  1930. package/vendor/rocksdb/utilities/transactions/transaction_util.cc +204 -0
  1931. package/vendor/rocksdb/utilities/transactions/transaction_util.h +83 -0
  1932. package/vendor/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +578 -0
  1933. package/vendor/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +4066 -0
  1934. package/vendor/rocksdb/utilities/transactions/write_prepared_txn.cc +515 -0
  1935. package/vendor/rocksdb/utilities/transactions/write_prepared_txn.h +117 -0
  1936. package/vendor/rocksdb/utilities/transactions/write_prepared_txn_db.cc +1038 -0
  1937. package/vendor/rocksdb/utilities/transactions/write_prepared_txn_db.h +1123 -0
  1938. package/vendor/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +779 -0
  1939. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn.cc +1056 -0
  1940. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn.h +339 -0
  1941. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +476 -0
  1942. package/vendor/rocksdb/utilities/transactions/write_unprepared_txn_db.h +106 -0
  1943. package/vendor/rocksdb/utilities/ttl/db_ttl_impl.cc +617 -0
  1944. package/vendor/rocksdb/utilities/ttl/db_ttl_impl.h +243 -0
  1945. package/vendor/rocksdb/utilities/ttl/ttl_test.cc +913 -0
  1946. package/vendor/rocksdb/utilities/util_merge_operators_test.cc +100 -0
  1947. package/vendor/rocksdb/utilities/wal_filter.cc +22 -0
  1948. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +694 -0
  1949. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +742 -0
  1950. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +342 -0
  1951. package/vendor/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +2409 -0
@@ -0,0 +1,4414 @@
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(OS_WIN)
11
+
12
+ #include "rocksdb/utilities/backup_engine.h"
13
+
14
+ #include <algorithm>
15
+ #include <array>
16
+ #include <atomic>
17
+ #include <cstddef>
18
+ #include <cstdint>
19
+ #include <exception>
20
+ #include <limits>
21
+ #include <memory>
22
+ #include <random>
23
+ #include <stdexcept>
24
+ #include <string>
25
+ #include <utility>
26
+
27
+ #include "db/db_impl/db_impl.h"
28
+ #include "db/db_test_util.h"
29
+ #include "env/composite_env_wrapper.h"
30
+ #include "env/env_chroot.h"
31
+ #include "file/filename.h"
32
+ #include "port/port.h"
33
+ #include "port/stack_trace.h"
34
+ #include "rocksdb/advanced_options.h"
35
+ #include "rocksdb/env.h"
36
+ #include "rocksdb/file_checksum.h"
37
+ #include "rocksdb/rate_limiter.h"
38
+ #include "rocksdb/statistics.h"
39
+ #include "rocksdb/transaction_log.h"
40
+ #include "rocksdb/types.h"
41
+ #include "rocksdb/utilities/options_util.h"
42
+ #include "rocksdb/utilities/stackable_db.h"
43
+ #include "test_util/sync_point.h"
44
+ #include "test_util/testharness.h"
45
+ #include "test_util/testutil.h"
46
+ #include "util/cast_util.h"
47
+ #include "util/mutexlock.h"
48
+ #include "util/random.h"
49
+ #include "util/rate_limiter_impl.h"
50
+ #include "util/stderr_logger.h"
51
+ #include "util/string_util.h"
52
+ #include "utilities/backup/backup_engine_impl.h"
53
+
54
+ namespace ROCKSDB_NAMESPACE {
55
+
56
+ namespace {
57
+ using ShareFilesNaming = BackupEngineOptions::ShareFilesNaming;
58
+ const auto kLegacyCrc32cAndFileSize =
59
+ BackupEngineOptions::kLegacyCrc32cAndFileSize;
60
+ const auto kUseDbSessionId = BackupEngineOptions::kUseDbSessionId;
61
+ const auto kFlagIncludeFileSize = BackupEngineOptions::kFlagIncludeFileSize;
62
+ const auto kNamingDefault = kUseDbSessionId | kFlagIncludeFileSize;
63
+
64
+ class DummyDB : public StackableDB {
65
+ public:
66
+ /* implicit */
67
+ DummyDB(const Options& options, const std::string& dbname)
68
+ : StackableDB(nullptr),
69
+ options_(options),
70
+ dbname_(dbname),
71
+ deletions_enabled_(true),
72
+ sequence_number_(0) {}
73
+
74
+ SequenceNumber GetLatestSequenceNumber() const override {
75
+ return ++sequence_number_;
76
+ }
77
+
78
+ const std::string& GetName() const override { return dbname_; }
79
+
80
+ Env* GetEnv() const override { return options_.env; }
81
+
82
+ using DB::GetOptions;
83
+ Options GetOptions(ColumnFamilyHandle* /*column_family*/) const override {
84
+ return options_;
85
+ }
86
+
87
+ DBOptions GetDBOptions() const override { return DBOptions(options_); }
88
+
89
+ Status EnableFileDeletions(bool /*force*/) override {
90
+ EXPECT_TRUE(!deletions_enabled_);
91
+ deletions_enabled_ = true;
92
+ return Status::OK();
93
+ }
94
+
95
+ Status DisableFileDeletions() override {
96
+ EXPECT_TRUE(deletions_enabled_);
97
+ deletions_enabled_ = false;
98
+ return Status::OK();
99
+ }
100
+
101
+ ColumnFamilyHandle* DefaultColumnFamily() const override { return nullptr; }
102
+
103
+ Status GetLiveFilesStorageInfo(
104
+ const LiveFilesStorageInfoOptions& opts,
105
+ std::vector<LiveFileStorageInfo>* files) override {
106
+ uint64_t number;
107
+ FileType type;
108
+ files->clear();
109
+ for (auto& f : live_files_) {
110
+ bool success = ParseFileName(f, &number, &type);
111
+ if (!success) {
112
+ return Status::InvalidArgument("Bad file name: " + f);
113
+ }
114
+ files->emplace_back();
115
+ LiveFileStorageInfo& info = files->back();
116
+ info.relative_filename = f;
117
+ info.directory = dbname_;
118
+ info.file_number = number;
119
+ info.file_type = type;
120
+ if (type == kDescriptorFile) {
121
+ info.size = 100; // See TestFs::GetChildrenFileAttributes below
122
+ info.trim_to_size = true;
123
+ } else if (type == kCurrentFile) {
124
+ info.size = 0;
125
+ info.trim_to_size = true;
126
+ } else {
127
+ info.size = 200; // See TestFs::GetChildrenFileAttributes below
128
+ }
129
+ if (opts.include_checksum_info) {
130
+ info.file_checksum = kUnknownFileChecksum;
131
+ info.file_checksum_func_name = kUnknownFileChecksumFuncName;
132
+ }
133
+ }
134
+ return Status::OK();
135
+ }
136
+
137
+ // To avoid FlushWAL called on stacked db which is nullptr
138
+ Status FlushWAL(bool /*sync*/) override { return Status::OK(); }
139
+
140
+ std::vector<std::string> live_files_;
141
+
142
+ private:
143
+ Options options_;
144
+ std::string dbname_;
145
+ bool deletions_enabled_;
146
+ mutable SequenceNumber sequence_number_;
147
+ }; // DummyDB
148
+
149
+ class TestFs : public FileSystemWrapper {
150
+ public:
151
+ explicit TestFs(const std::shared_ptr<FileSystem>& t)
152
+ : FileSystemWrapper(t) {}
153
+ const char* Name() const override { return "TestFs"; }
154
+
155
+ class DummySequentialFile : public FSSequentialFile {
156
+ public:
157
+ explicit DummySequentialFile(bool fail_reads)
158
+ : FSSequentialFile(), rnd_(5), fail_reads_(fail_reads) {}
159
+ IOStatus Read(size_t n, const IOOptions&, Slice* result, char* scratch,
160
+ IODebugContext*) override {
161
+ if (fail_reads_) {
162
+ return IOStatus::IOError();
163
+ }
164
+ size_t read_size = (n > size_left) ? size_left : n;
165
+ for (size_t i = 0; i < read_size; ++i) {
166
+ scratch[i] = rnd_.Next() & 255;
167
+ }
168
+ *result = Slice(scratch, read_size);
169
+ size_left -= read_size;
170
+ return IOStatus::OK();
171
+ }
172
+
173
+ IOStatus Skip(uint64_t n) override {
174
+ size_left = (n > size_left) ? size_left - n : 0;
175
+ return IOStatus::OK();
176
+ }
177
+
178
+ private:
179
+ size_t size_left = 200;
180
+ Random rnd_;
181
+ bool fail_reads_;
182
+ };
183
+
184
+ IOStatus NewSequentialFile(const std::string& f, const FileOptions& file_opts,
185
+ std::unique_ptr<FSSequentialFile>* r,
186
+ IODebugContext* dbg) override {
187
+ MutexLock l(&mutex_);
188
+ if (dummy_sequential_file_) {
189
+ r->reset(
190
+ new TestFs::DummySequentialFile(dummy_sequential_file_fail_reads_));
191
+ return IOStatus::OK();
192
+ } else {
193
+ IOStatus s = FileSystemWrapper::NewSequentialFile(f, file_opts, r, dbg);
194
+ if (s.ok()) {
195
+ if ((*r)->use_direct_io()) {
196
+ ++num_direct_seq_readers_;
197
+ }
198
+ ++num_seq_readers_;
199
+ }
200
+ return s;
201
+ }
202
+ }
203
+
204
+ IOStatus NewWritableFile(const std::string& f, const FileOptions& file_opts,
205
+ std::unique_ptr<FSWritableFile>* r,
206
+ IODebugContext* dbg) override {
207
+ MutexLock l(&mutex_);
208
+ written_files_.push_back(f);
209
+ if (limit_written_files_ == 0) {
210
+ return IOStatus::NotSupported("Limit on written files reached");
211
+ }
212
+ limit_written_files_--;
213
+ IOStatus s = FileSystemWrapper::NewWritableFile(f, file_opts, r, dbg);
214
+ if (s.ok()) {
215
+ if ((*r)->use_direct_io()) {
216
+ ++num_direct_writers_;
217
+ }
218
+ ++num_writers_;
219
+ }
220
+ return s;
221
+ }
222
+
223
+ IOStatus NewRandomAccessFile(const std::string& f,
224
+ const FileOptions& file_opts,
225
+ std::unique_ptr<FSRandomAccessFile>* r,
226
+ IODebugContext* dbg) override {
227
+ MutexLock l(&mutex_);
228
+ IOStatus s = FileSystemWrapper::NewRandomAccessFile(f, file_opts, r, dbg);
229
+ if (s.ok()) {
230
+ if ((*r)->use_direct_io()) {
231
+ ++num_direct_rand_readers_;
232
+ }
233
+ ++num_rand_readers_;
234
+ }
235
+ return s;
236
+ }
237
+
238
+ IOStatus DeleteFile(const std::string& f, const IOOptions& options,
239
+ IODebugContext* dbg) override {
240
+ MutexLock l(&mutex_);
241
+ if (fail_delete_files_) {
242
+ return IOStatus::IOError();
243
+ }
244
+ EXPECT_GT(limit_delete_files_, 0U);
245
+ limit_delete_files_--;
246
+ return FileSystemWrapper::DeleteFile(f, options, dbg);
247
+ }
248
+
249
+ IOStatus DeleteDir(const std::string& d, const IOOptions& options,
250
+ IODebugContext* dbg) override {
251
+ MutexLock l(&mutex_);
252
+ if (fail_delete_files_) {
253
+ return IOStatus::IOError();
254
+ }
255
+ return FileSystemWrapper::DeleteDir(d, options, dbg);
256
+ }
257
+
258
+ void AssertWrittenFiles(std::vector<std::string>& should_have_written) {
259
+ MutexLock l(&mutex_);
260
+ std::sort(should_have_written.begin(), should_have_written.end());
261
+ std::sort(written_files_.begin(), written_files_.end());
262
+
263
+ ASSERT_EQ(should_have_written, written_files_);
264
+ }
265
+
266
+ void ClearWrittenFiles() {
267
+ MutexLock l(&mutex_);
268
+ written_files_.clear();
269
+ }
270
+
271
+ void SetLimitWrittenFiles(uint64_t limit) {
272
+ MutexLock l(&mutex_);
273
+ limit_written_files_ = limit;
274
+ }
275
+
276
+ void SetLimitDeleteFiles(uint64_t limit) {
277
+ MutexLock l(&mutex_);
278
+ limit_delete_files_ = limit;
279
+ }
280
+
281
+ void SetDeleteFileFailure(bool fail) {
282
+ MutexLock l(&mutex_);
283
+ fail_delete_files_ = fail;
284
+ }
285
+
286
+ void SetDummySequentialFile(bool dummy_sequential_file) {
287
+ MutexLock l(&mutex_);
288
+ dummy_sequential_file_ = dummy_sequential_file;
289
+ }
290
+ void SetDummySequentialFileFailReads(bool dummy_sequential_file_fail_reads) {
291
+ MutexLock l(&mutex_);
292
+ dummy_sequential_file_fail_reads_ = dummy_sequential_file_fail_reads;
293
+ }
294
+
295
+ void SetGetChildrenFailure(bool fail) { get_children_failure_ = fail; }
296
+ IOStatus GetChildren(const std::string& dir, const IOOptions& io_opts,
297
+ std::vector<std::string>* r,
298
+ IODebugContext* dbg) override {
299
+ if (get_children_failure_) {
300
+ return IOStatus::IOError("SimulatedFailure");
301
+ }
302
+ return FileSystemWrapper::GetChildren(dir, io_opts, r, dbg);
303
+ }
304
+
305
+ // Some test cases do not actually create the test files (e.g., see
306
+ // DummyDB::live_files_) - for those cases, we mock those files' attributes
307
+ // so CreateNewBackup() can get their attributes.
308
+ void SetFilenamesForMockedAttrs(const std::vector<std::string>& filenames) {
309
+ filenames_for_mocked_attrs_ = filenames;
310
+ }
311
+ IOStatus GetChildrenFileAttributes(const std::string& dir,
312
+ const IOOptions& options,
313
+ std::vector<FileAttributes>* result,
314
+ IODebugContext* dbg) 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 TestFs
318
+ if (filename.find("MANIFEST") == 0) {
319
+ size_bytes = 100; // Match DummyDB::GetLiveFiles
320
+ }
321
+ result->push_back({dir + "/" + filename, size_bytes});
322
+ }
323
+ return IOStatus::OK();
324
+ }
325
+ return FileSystemWrapper::GetChildrenFileAttributes(dir, options, result,
326
+ dbg);
327
+ }
328
+
329
+ IOStatus GetFileSize(const std::string& f, const IOOptions& options,
330
+ uint64_t* s, IODebugContext* dbg) override {
331
+ if (filenames_for_mocked_attrs_.size() > 0) {
332
+ auto fname = f.substr(f.find_last_of('/') + 1);
333
+ auto filename_iter = std::find(filenames_for_mocked_attrs_.begin(),
334
+ filenames_for_mocked_attrs_.end(), fname);
335
+ if (filename_iter != filenames_for_mocked_attrs_.end()) {
336
+ *s = 200; // Match TestFs
337
+ if (fname.find("MANIFEST") == 0) {
338
+ *s = 100; // Match DummyDB::GetLiveFiles
339
+ }
340
+ return IOStatus::OK();
341
+ }
342
+ return IOStatus::NotFound(fname);
343
+ }
344
+ return FileSystemWrapper::GetFileSize(f, options, s, dbg);
345
+ }
346
+
347
+ void SetCreateDirIfMissingFailure(bool fail) {
348
+ create_dir_if_missing_failure_ = fail;
349
+ }
350
+ IOStatus CreateDirIfMissing(const std::string& d, const IOOptions& options,
351
+ IODebugContext* dbg) override {
352
+ if (create_dir_if_missing_failure_) {
353
+ return IOStatus::IOError("SimulatedFailure");
354
+ }
355
+ return FileSystemWrapper::CreateDirIfMissing(d, options, dbg);
356
+ }
357
+
358
+ void SetNewDirectoryFailure(bool fail) { new_directory_failure_ = fail; }
359
+ IOStatus NewDirectory(const std::string& name, const IOOptions& io_opts,
360
+ std::unique_ptr<FSDirectory>* result,
361
+ IODebugContext* dbg) override {
362
+ if (new_directory_failure_) {
363
+ return IOStatus::IOError("SimulatedFailure");
364
+ }
365
+ return FileSystemWrapper::NewDirectory(name, io_opts, result, dbg);
366
+ }
367
+
368
+ void ClearFileOpenCounters() {
369
+ MutexLock l(&mutex_);
370
+ num_rand_readers_ = 0;
371
+ num_direct_rand_readers_ = 0;
372
+ num_seq_readers_ = 0;
373
+ num_direct_seq_readers_ = 0;
374
+ num_writers_ = 0;
375
+ num_direct_writers_ = 0;
376
+ }
377
+
378
+ int num_rand_readers() { return num_rand_readers_; }
379
+ int num_direct_rand_readers() { return num_direct_rand_readers_; }
380
+ int num_seq_readers() { return num_seq_readers_; }
381
+ int num_direct_seq_readers() { return num_direct_seq_readers_; }
382
+ int num_writers() { return num_writers_; }
383
+ // FIXME(?): unused
384
+ int num_direct_writers() { return num_direct_writers_; }
385
+
386
+ private:
387
+ port::Mutex mutex_;
388
+ bool dummy_sequential_file_ = false;
389
+ bool dummy_sequential_file_fail_reads_ = false;
390
+ std::vector<std::string> written_files_;
391
+ std::vector<std::string> filenames_for_mocked_attrs_;
392
+ uint64_t limit_written_files_ = 1000000;
393
+ uint64_t limit_delete_files_ = 1000000;
394
+ bool fail_delete_files_ = false;
395
+
396
+ bool get_children_failure_ = false;
397
+ bool create_dir_if_missing_failure_ = false;
398
+ bool new_directory_failure_ = false;
399
+
400
+ // Keeps track of how many files of each type were successfully opened, and
401
+ // out of those, how many were opened with direct I/O.
402
+ std::atomic<int> num_rand_readers_{};
403
+ std::atomic<int> num_direct_rand_readers_{};
404
+ std::atomic<int> num_seq_readers_{};
405
+ std::atomic<int> num_direct_seq_readers_{};
406
+ std::atomic<int> num_writers_{};
407
+ std::atomic<int> num_direct_writers_{};
408
+ }; // TestFs
409
+
410
+ class FileManager : public EnvWrapper {
411
+ public:
412
+ explicit FileManager(Env* t) : EnvWrapper(t), rnd_(5) {}
413
+ const char* Name() const override { return "FileManager"; }
414
+
415
+ Status GetRandomFileInDir(const std::string& dir, std::string* fname,
416
+ uint64_t* fsize) {
417
+ std::vector<FileAttributes> children;
418
+ auto s = GetChildrenFileAttributes(dir, &children);
419
+ if (!s.ok()) {
420
+ return s;
421
+ } else if (children.size() <= 2) { // . and ..
422
+ return Status::NotFound("Empty directory: " + dir);
423
+ }
424
+ assert(fname != nullptr);
425
+ while (true) {
426
+ int i = rnd_.Next() % children.size();
427
+ fname->assign(dir + "/" + children[i].name);
428
+ *fsize = children[i].size_bytes;
429
+ return Status::OK();
430
+ }
431
+ // should never get here
432
+ assert(false);
433
+ return Status::NotFound("");
434
+ }
435
+
436
+ Status DeleteRandomFileInDir(const std::string& dir) {
437
+ std::vector<std::string> children;
438
+ Status s = GetChildren(dir, &children);
439
+ if (!s.ok()) {
440
+ return s;
441
+ }
442
+ while (true) {
443
+ int i = rnd_.Next() % children.size();
444
+ return DeleteFile(dir + "/" + children[i]);
445
+ }
446
+ // should never get here
447
+ assert(false);
448
+ return Status::NotFound("");
449
+ }
450
+
451
+ Status AppendToRandomFileInDir(const std::string& dir,
452
+ const std::string& data) {
453
+ std::vector<std::string> children;
454
+ Status s = GetChildren(dir, &children);
455
+ if (!s.ok()) {
456
+ return s;
457
+ }
458
+ while (true) {
459
+ int i = rnd_.Next() % children.size();
460
+ return WriteToFile(dir + "/" + children[i], data);
461
+ }
462
+ // should never get here
463
+ assert(false);
464
+ return Status::NotFound("");
465
+ }
466
+
467
+ Status CorruptFile(const std::string& fname, uint64_t bytes_to_corrupt) {
468
+ std::string file_contents;
469
+ Status s = ReadFileToString(this, fname, &file_contents);
470
+ if (!s.ok()) {
471
+ return s;
472
+ }
473
+ s = DeleteFile(fname);
474
+ if (!s.ok()) {
475
+ return s;
476
+ }
477
+
478
+ for (uint64_t i = 0; i < bytes_to_corrupt; ++i) {
479
+ std::string tmp = rnd_.RandomString(1);
480
+ file_contents[rnd_.Next() % file_contents.size()] = tmp[0];
481
+ }
482
+ return WriteToFile(fname, file_contents);
483
+ }
484
+
485
+ Status CorruptFileStart(const std::string& fname) {
486
+ std::string to_xor = "blah";
487
+ std::string file_contents;
488
+ Status s = ReadFileToString(this, fname, &file_contents);
489
+ if (!s.ok()) {
490
+ return s;
491
+ }
492
+ s = DeleteFile(fname);
493
+ if (!s.ok()) {
494
+ return s;
495
+ }
496
+ for (size_t i = 0; i < to_xor.size(); ++i) {
497
+ file_contents[i] ^= to_xor[i];
498
+ }
499
+ return WriteToFile(fname, file_contents);
500
+ }
501
+
502
+ Status CorruptChecksum(const std::string& fname, bool appear_valid) {
503
+ std::string metadata;
504
+ Status s = ReadFileToString(this, fname, &metadata);
505
+ if (!s.ok()) {
506
+ return s;
507
+ }
508
+ s = DeleteFile(fname);
509
+ if (!s.ok()) {
510
+ return s;
511
+ }
512
+
513
+ auto pos = metadata.find("private");
514
+ if (pos == std::string::npos) {
515
+ return Status::Corruption("private file is expected");
516
+ }
517
+ pos = metadata.find(" crc32 ", pos + 6);
518
+ if (pos == std::string::npos) {
519
+ return Status::Corruption("checksum not found");
520
+ }
521
+
522
+ if (metadata.size() < pos + 7) {
523
+ return Status::Corruption("bad CRC32 checksum value");
524
+ }
525
+
526
+ if (appear_valid) {
527
+ if (metadata[pos + 8] == '\n') {
528
+ // single digit value, safe to insert one more digit
529
+ metadata.insert(pos + 8, 1, '0');
530
+ } else {
531
+ metadata.erase(pos + 8, 1);
532
+ }
533
+ } else {
534
+ metadata[pos + 7] = 'a';
535
+ }
536
+
537
+ return WriteToFile(fname, metadata);
538
+ }
539
+
540
+ Status WriteToFile(const std::string& fname, const std::string& data) {
541
+ std::unique_ptr<WritableFile> file;
542
+ EnvOptions env_options;
543
+ env_options.use_mmap_writes = false;
544
+ Status s = EnvWrapper::NewWritableFile(fname, &file, env_options);
545
+ if (!s.ok()) {
546
+ return s;
547
+ }
548
+ return file->Append(Slice(data));
549
+ }
550
+
551
+ private:
552
+ Random rnd_;
553
+ }; // FileManager
554
+
555
+ // utility functions
556
+ namespace {
557
+
558
+ enum FillDBFlushAction {
559
+ kFlushMost,
560
+ kFlushAll,
561
+ kAutoFlushOnly,
562
+ };
563
+
564
+ // Many tests in this file expect FillDB to write at least one sst file,
565
+ // so the default behavior (if not kAutoFlushOnly) of FillDB is to force
566
+ // a flush. But to ensure coverage of the WAL file case, we also (by default)
567
+ // do one Put after the Flush (kFlushMost).
568
+ size_t FillDB(DB* db, int from, int to,
569
+ FillDBFlushAction flush_action = kFlushMost) {
570
+ size_t bytes_written = 0;
571
+ for (int i = from; i < to; ++i) {
572
+ std::string key = "testkey" + std::to_string(i);
573
+ std::string value = "testvalue" + std::to_string(i);
574
+ bytes_written += key.size() + value.size();
575
+
576
+ EXPECT_OK(db->Put(WriteOptions(), Slice(key), Slice(value)));
577
+
578
+ if (flush_action == kFlushMost && i == to - 2) {
579
+ EXPECT_OK(db->Flush(FlushOptions()));
580
+ }
581
+ }
582
+ if (flush_action == kFlushAll) {
583
+ EXPECT_OK(db->Flush(FlushOptions()));
584
+ }
585
+ return bytes_written;
586
+ }
587
+
588
+ void AssertExists(DB* db, int from, int to) {
589
+ for (int i = from; i < to; ++i) {
590
+ std::string key = "testkey" + std::to_string(i);
591
+ std::string value;
592
+ Status s = db->Get(ReadOptions(), Slice(key), &value);
593
+ ASSERT_EQ(value, "testvalue" + std::to_string(i));
594
+ }
595
+ }
596
+
597
+ void AssertEmpty(DB* db, int from, int to) {
598
+ for (int i = from; i < to; ++i) {
599
+ std::string key = "testkey" + std::to_string(i);
600
+ std::string value = "testvalue" + std::to_string(i);
601
+
602
+ Status s = db->Get(ReadOptions(), Slice(key), &value);
603
+ ASSERT_TRUE(s.IsNotFound());
604
+ }
605
+ }
606
+ } // namespace
607
+
608
+ class BackupEngineTest : public testing::Test {
609
+ public:
610
+ enum ShareOption {
611
+ kNoShare,
612
+ kShareNoChecksum,
613
+ kShareWithChecksum,
614
+ };
615
+
616
+ const std::vector<ShareOption> kAllShareOptions = {kNoShare, kShareNoChecksum,
617
+ kShareWithChecksum};
618
+
619
+ BackupEngineTest() {
620
+ // set up files
621
+ std::string db_chroot = test::PerThreadDBPath("db_for_backup");
622
+ std::string backup_chroot = test::PerThreadDBPath("db_backups");
623
+ EXPECT_OK(Env::Default()->CreateDirIfMissing(db_chroot));
624
+ EXPECT_OK(Env::Default()->CreateDirIfMissing(backup_chroot));
625
+ dbname_ = "/tempdb";
626
+ backupdir_ = "/tempbk";
627
+ latest_backup_ = backupdir_ + "/LATEST_BACKUP";
628
+
629
+ // set up FileSystem & Envs
630
+ db_chroot_fs_ = NewChrootFileSystem(FileSystem::Default(), db_chroot);
631
+ backup_chroot_fs_ =
632
+ NewChrootFileSystem(FileSystem::Default(), backup_chroot);
633
+ test_db_fs_ = std::make_shared<TestFs>(db_chroot_fs_);
634
+ test_backup_fs_ = std::make_shared<TestFs>(backup_chroot_fs_);
635
+ SetEnvsFromFileSystems();
636
+
637
+ // set up db options
638
+ options_.create_if_missing = true;
639
+ options_.paranoid_checks = true;
640
+ options_.write_buffer_size = 1 << 17; // 128KB
641
+ options_.wal_dir = dbname_;
642
+ options_.enable_blob_files = true;
643
+
644
+ // The sync option is not easily testable in unit tests, but should be
645
+ // smoke tested across all the other backup tests. However, it is
646
+ // certainly not worth doubling the runtime of backup tests for it.
647
+ // Thus, we can enable sync for one of our alternate testing
648
+ // configurations.
649
+ constexpr bool kUseSync =
650
+ #ifdef ROCKSDB_MODIFY_NPHASH
651
+ true;
652
+ #else
653
+ false;
654
+ #endif // ROCKSDB_MODIFY_NPHASH
655
+
656
+ // set up backup db options
657
+ engine_options_.reset(new BackupEngineOptions(
658
+ backupdir_, test_backup_env_.get(), /*share_table_files*/ true,
659
+ logger_.get(), kUseSync));
660
+
661
+ // most tests will use multi-threaded backups
662
+ engine_options_->max_background_operations = 7;
663
+
664
+ // delete old files in db
665
+ DestroyDBWithoutCheck(dbname_, options_);
666
+
667
+ // delete old LATEST_BACKUP file, which some tests create for compatibility
668
+ // testing.
669
+ backup_chroot_env_->DeleteFile(latest_backup_).PermitUncheckedError();
670
+ }
671
+
672
+ void SetEnvsFromFileSystems() {
673
+ db_chroot_env_.reset(
674
+ new CompositeEnvWrapper(Env::Default(), db_chroot_fs_));
675
+ backup_chroot_env_.reset(
676
+ new CompositeEnvWrapper(Env::Default(), backup_chroot_fs_));
677
+ test_db_env_.reset(new CompositeEnvWrapper(Env::Default(), test_db_fs_));
678
+ options_.env = test_db_env_.get();
679
+ test_backup_env_.reset(
680
+ new CompositeEnvWrapper(Env::Default(), test_backup_fs_));
681
+ if (engine_options_) {
682
+ engine_options_->backup_env = test_backup_env_.get();
683
+ }
684
+ file_manager_.reset(new FileManager(backup_chroot_env_.get()));
685
+ db_file_manager_.reset(new FileManager(db_chroot_env_.get()));
686
+
687
+ // Create logger
688
+ DBOptions logger_options;
689
+ logger_options.env = db_chroot_env_.get();
690
+ ASSERT_OK(CreateLoggerFromOptions(dbname_, logger_options, &logger_));
691
+ }
692
+
693
+ DB* OpenDB() {
694
+ DB* db;
695
+ EXPECT_OK(DB::Open(options_, dbname_, &db));
696
+ return db;
697
+ }
698
+
699
+ void CloseAndReopenDB(bool read_only = false) {
700
+ // Close DB
701
+ db_.reset();
702
+
703
+ // Open DB
704
+ test_db_fs_->SetLimitWrittenFiles(1000000);
705
+ DB* db;
706
+ if (read_only) {
707
+ ASSERT_OK(DB::OpenForReadOnly(options_, dbname_, &db));
708
+ } else {
709
+ ASSERT_OK(DB::Open(options_, dbname_, &db));
710
+ }
711
+ db_.reset(db);
712
+ }
713
+
714
+ void InitializeDBAndBackupEngine(bool dummy = false) {
715
+ // reset all the db env defaults
716
+ test_db_fs_->SetLimitWrittenFiles(1000000);
717
+ test_db_fs_->SetDummySequentialFile(dummy);
718
+
719
+ DB* db;
720
+ if (dummy) {
721
+ dummy_db_ = new DummyDB(options_, dbname_);
722
+ db = dummy_db_;
723
+ } else {
724
+ ASSERT_OK(DB::Open(options_, dbname_, &db));
725
+ }
726
+ db_.reset(db);
727
+ }
728
+
729
+ virtual void OpenDBAndBackupEngine(
730
+ bool destroy_old_data = false, bool dummy = false,
731
+ ShareOption shared_option = kShareNoChecksum) {
732
+ InitializeDBAndBackupEngine(dummy);
733
+ // reset backup env defaults
734
+ test_backup_fs_->SetLimitWrittenFiles(1000000);
735
+ engine_options_->destroy_old_data = destroy_old_data;
736
+ engine_options_->share_table_files = shared_option != kNoShare;
737
+ engine_options_->share_files_with_checksum =
738
+ shared_option == kShareWithChecksum;
739
+ OpenBackupEngine(destroy_old_data);
740
+ }
741
+
742
+ void CloseDBAndBackupEngine() {
743
+ db_.reset();
744
+ backup_engine_.reset();
745
+ }
746
+
747
+ void OpenBackupEngine(bool destroy_old_data = false) {
748
+ engine_options_->destroy_old_data = destroy_old_data;
749
+ engine_options_->info_log = logger_.get();
750
+ BackupEngine* backup_engine;
751
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
752
+ &backup_engine));
753
+ backup_engine_.reset(backup_engine);
754
+ }
755
+
756
+ void CloseBackupEngine() { backup_engine_.reset(nullptr); }
757
+
758
+ // cross-cutting test of GetBackupInfo
759
+ void AssertBackupInfoConsistency(bool allow_excluded = false) {
760
+ std::vector<BackupInfo> backup_info;
761
+ backup_engine_->GetBackupInfo(&backup_info, /*with file details*/ true);
762
+ std::map<std::string, uint64_t> file_sizes;
763
+
764
+ // Find the files that are supposed to be there
765
+ for (auto& backup : backup_info) {
766
+ uint64_t sum_for_backup = 0;
767
+ for (auto& file : backup.file_details) {
768
+ auto e = file_sizes.find(file.relative_filename);
769
+ if (e == file_sizes.end()) {
770
+ // fprintf(stderr, "Adding %s -> %u\n",
771
+ // file.relative_filename.c_str(), (unsigned)file.size);
772
+ file_sizes[file.relative_filename] = file.size;
773
+ } else {
774
+ ASSERT_EQ(file_sizes[file.relative_filename], file.size);
775
+ }
776
+ sum_for_backup += file.size;
777
+ }
778
+ ASSERT_EQ(backup.size, sum_for_backup);
779
+ if (!allow_excluded) {
780
+ ASSERT_EQ(backup.excluded_files.size(), 0);
781
+ }
782
+ }
783
+
784
+ std::vector<BackupID> corrupt_backup_ids;
785
+ backup_engine_->GetCorruptedBackups(&corrupt_backup_ids);
786
+ bool has_corrupt = corrupt_backup_ids.size() > 0;
787
+
788
+ // Compare with what's in backup dir
789
+ std::vector<std::string> child_dirs;
790
+ ASSERT_OK(
791
+ test_backup_env_->GetChildren(backupdir_ + "/private", &child_dirs));
792
+ for (auto& dir : child_dirs) {
793
+ dir = "private/" + dir;
794
+ }
795
+ child_dirs.push_back("shared"); // might not exist
796
+ child_dirs.push_back("shared_checksum"); // might not exist
797
+ for (auto& dir : child_dirs) {
798
+ std::vector<std::string> children;
799
+ test_backup_env_->GetChildren(backupdir_ + "/" + dir, &children)
800
+ .PermitUncheckedError();
801
+ // fprintf(stderr, "ls %s\n", (backupdir_ + "/" + dir).c_str());
802
+ for (auto& file : children) {
803
+ uint64_t size;
804
+ size = UINT64_MAX; // appease clang-analyze
805
+ std::string rel_file = dir + "/" + file;
806
+ // fprintf(stderr, "stat %s\n", (backupdir_ + "/" + rel_file).c_str());
807
+ ASSERT_OK(
808
+ test_backup_env_->GetFileSize(backupdir_ + "/" + rel_file, &size));
809
+ auto e = file_sizes.find(rel_file);
810
+ if (e == file_sizes.end()) {
811
+ // The only case in which we should find files not reported
812
+ ASSERT_TRUE(has_corrupt);
813
+ } else {
814
+ ASSERT_EQ(e->second, size);
815
+ file_sizes.erase(e);
816
+ }
817
+ }
818
+ }
819
+
820
+ // Everything should have been matched
821
+ ASSERT_EQ(file_sizes.size(), 0);
822
+ }
823
+
824
+ // restores backup backup_id and asserts the existence of
825
+ // [start_exist, end_exist> and not-existence of
826
+ // [end_exist, end>
827
+ //
828
+ // if backup_id == 0, it means restore from latest
829
+ // if end == 0, don't check AssertEmpty
830
+ void AssertBackupConsistency(BackupID backup_id, uint32_t start_exist,
831
+ uint32_t end_exist, uint32_t end = 0,
832
+ bool keep_log_files = false) {
833
+ RestoreOptions restore_options(keep_log_files);
834
+ bool opened_backup_engine = false;
835
+ if (backup_engine_.get() == nullptr) {
836
+ opened_backup_engine = true;
837
+ OpenBackupEngine();
838
+ }
839
+ AssertBackupInfoConsistency();
840
+
841
+ // Now perform restore
842
+ if (backup_id > 0) {
843
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(backup_id, dbname_, dbname_,
844
+ restore_options));
845
+ } else {
846
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_,
847
+ restore_options));
848
+ }
849
+ DB* db = OpenDB();
850
+ // Check DB contents
851
+ AssertExists(db, start_exist, end_exist);
852
+ if (end != 0) {
853
+ AssertEmpty(db, end_exist, end);
854
+ }
855
+ delete db;
856
+ if (opened_backup_engine) {
857
+ CloseBackupEngine();
858
+ }
859
+ }
860
+
861
+ void DeleteLogFiles() {
862
+ std::vector<std::string> delete_logs;
863
+ ASSERT_OK(db_chroot_env_->GetChildren(dbname_, &delete_logs));
864
+ for (auto f : delete_logs) {
865
+ uint64_t number;
866
+ FileType type;
867
+ bool ok = ParseFileName(f, &number, &type);
868
+ if (ok && type == kWalFile) {
869
+ ASSERT_OK(db_chroot_env_->DeleteFile(dbname_ + "/" + f));
870
+ }
871
+ }
872
+ }
873
+
874
+ Status GetDataFilesInDB(const FileType& file_type,
875
+ std::vector<FileAttributes>* files) {
876
+ std::vector<std::string> live;
877
+ uint64_t ignore_manifest_size;
878
+ Status s = db_->GetLiveFiles(live, &ignore_manifest_size, /*flush*/ false);
879
+ if (!s.ok()) {
880
+ return s;
881
+ }
882
+ std::vector<FileAttributes> children;
883
+ s = test_db_env_->GetChildrenFileAttributes(dbname_, &children);
884
+ for (const auto& child : children) {
885
+ FileType type;
886
+ uint64_t number = 0;
887
+ if (ParseFileName(child.name, &number, &type) && type == file_type &&
888
+ std::find(live.begin(), live.end(), "/" + child.name) != live.end()) {
889
+ files->push_back(child);
890
+ }
891
+ }
892
+ return s;
893
+ }
894
+
895
+ Status GetRandomDataFileInDB(const FileType& file_type,
896
+ std::string* fname_out,
897
+ uint64_t* fsize_out = nullptr) {
898
+ Random rnd(6); // NB: hardly "random"
899
+ std::vector<FileAttributes> files;
900
+ Status s = GetDataFilesInDB(file_type, &files);
901
+ if (!s.ok()) {
902
+ return s;
903
+ }
904
+ if (files.empty()) {
905
+ return Status::NotFound("");
906
+ }
907
+ size_t i = rnd.Uniform(static_cast<int>(files.size()));
908
+ *fname_out = dbname_ + "/" + files[i].name;
909
+ if (fsize_out) {
910
+ *fsize_out = files[i].size_bytes;
911
+ }
912
+ return Status::OK();
913
+ }
914
+
915
+ Status CorruptRandomDataFileInDB(const FileType& file_type) {
916
+ std::string fname;
917
+ uint64_t fsize = 0;
918
+ Status s = GetRandomDataFileInDB(file_type, &fname, &fsize);
919
+ if (!s.ok()) {
920
+ return s;
921
+ }
922
+
923
+ std::string file_contents;
924
+ s = ReadFileToString(test_db_env_.get(), fname, &file_contents);
925
+ if (!s.ok()) {
926
+ return s;
927
+ }
928
+ s = test_db_env_->DeleteFile(fname);
929
+ if (!s.ok()) {
930
+ return s;
931
+ }
932
+
933
+ file_contents[0] = (file_contents[0] + 257) % 256;
934
+ return WriteStringToFile(test_db_env_.get(), file_contents, fname);
935
+ }
936
+
937
+ void AssertDirectoryFilesMatchRegex(const std::string& dir,
938
+ const TestRegex& pattern,
939
+ const std::string& file_type,
940
+ int minimum_count) {
941
+ std::vector<FileAttributes> children;
942
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
943
+ int found_count = 0;
944
+ for (const auto& child : children) {
945
+ if (EndsWith(child.name, file_type)) {
946
+ ASSERT_MATCHES_REGEX(child.name, pattern);
947
+ ++found_count;
948
+ }
949
+ }
950
+ ASSERT_GE(found_count, minimum_count);
951
+ }
952
+
953
+ void AssertDirectoryFilesSizeIndicators(const std::string& dir,
954
+ int minimum_count) {
955
+ std::vector<FileAttributes> children;
956
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
957
+ int found_count = 0;
958
+ for (const auto& child : children) {
959
+ auto last_underscore = child.name.find_last_of('_');
960
+ auto last_dot = child.name.find_last_of('.');
961
+ ASSERT_NE(child.name, child.name.substr(0, last_underscore));
962
+ ASSERT_NE(child.name, child.name.substr(0, last_dot));
963
+ ASSERT_LT(last_underscore, last_dot);
964
+ std::string s = child.name.substr(last_underscore + 1,
965
+ last_dot - (last_underscore + 1));
966
+ ASSERT_EQ(s, std::to_string(child.size_bytes));
967
+ ++found_count;
968
+ }
969
+ ASSERT_GE(found_count, minimum_count);
970
+ }
971
+
972
+ // files
973
+ std::string dbname_;
974
+ std::string backupdir_;
975
+ std::string latest_backup_;
976
+
977
+ // logger_ must be above backup_engine_ such that the engine's destructor,
978
+ // which uses a raw pointer to the logger, executes first.
979
+ std::shared_ptr<Logger> logger_;
980
+
981
+ // FileSystems
982
+ std::shared_ptr<FileSystem> db_chroot_fs_;
983
+ std::shared_ptr<FileSystem> backup_chroot_fs_;
984
+ std::shared_ptr<TestFs> test_db_fs_;
985
+ std::shared_ptr<TestFs> test_backup_fs_;
986
+
987
+ // Env wrappers
988
+ std::unique_ptr<Env> db_chroot_env_;
989
+ std::unique_ptr<Env> backup_chroot_env_;
990
+ std::unique_ptr<Env> test_db_env_;
991
+ std::unique_ptr<Env> test_backup_env_;
992
+ std::unique_ptr<FileManager> file_manager_;
993
+ std::unique_ptr<FileManager> db_file_manager_;
994
+
995
+ // all the dbs!
996
+ DummyDB* dummy_db_; // owned as db_ when present
997
+ std::unique_ptr<DB> db_;
998
+ std::unique_ptr<BackupEngine> backup_engine_;
999
+
1000
+ // options
1001
+ Options options_;
1002
+
1003
+ protected:
1004
+ void DestroyDBWithoutCheck(const std::string& dbname,
1005
+ const Options& options) {
1006
+ // DestroyDB may fail because the db might not be existed for some tests
1007
+ DestroyDB(dbname, options).PermitUncheckedError();
1008
+ }
1009
+
1010
+ std::unique_ptr<BackupEngineOptions> engine_options_;
1011
+ }; // BackupEngineTest
1012
+
1013
+ void AppendPath(const std::string& path, std::vector<std::string>& v) {
1014
+ for (auto& f : v) {
1015
+ f = path + f;
1016
+ }
1017
+ }
1018
+
1019
+ class BackupEngineTestWithParam : public BackupEngineTest,
1020
+ public testing::WithParamInterface<bool> {
1021
+ public:
1022
+ BackupEngineTestWithParam() {
1023
+ engine_options_->share_files_with_checksum = GetParam();
1024
+ }
1025
+ void OpenDBAndBackupEngine(
1026
+ bool destroy_old_data = false, bool dummy = false,
1027
+ ShareOption shared_option = kShareNoChecksum) override {
1028
+ BackupEngineTest::InitializeDBAndBackupEngine(dummy);
1029
+ // reset backup env defaults
1030
+ test_backup_fs_->SetLimitWrittenFiles(1000000);
1031
+ engine_options_->destroy_old_data = destroy_old_data;
1032
+ engine_options_->share_table_files = shared_option != kNoShare;
1033
+ // NOTE: keep share_files_with_checksum setting from constructor
1034
+ OpenBackupEngine(destroy_old_data);
1035
+ }
1036
+ };
1037
+
1038
+ TEST_F(BackupEngineTest, FileCollision) {
1039
+ const int keys_iteration = 100;
1040
+ for (const auto& sopt : kAllShareOptions) {
1041
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
1042
+ FillDB(db_.get(), 0, keys_iteration);
1043
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1044
+ FillDB(db_.get(), keys_iteration, keys_iteration * 2);
1045
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1046
+ CloseDBAndBackupEngine();
1047
+
1048
+ // If the db directory has been cleaned up, it is sensitive to file
1049
+ // collision.
1050
+ DestroyDBWithoutCheck(dbname_, options_);
1051
+
1052
+ // open fresh DB, but old backups present
1053
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
1054
+ sopt);
1055
+ FillDB(db_.get(), 0, keys_iteration);
1056
+ ASSERT_OK(db_->Flush(FlushOptions())); // like backup would do
1057
+ FillDB(db_.get(), keys_iteration, keys_iteration * 2);
1058
+ if (sopt != kShareNoChecksum) {
1059
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1060
+ } else {
1061
+ // The new table files created in FillDB() will clash with the old
1062
+ // backup and sharing tables with no checksum will have the file
1063
+ // collision problem.
1064
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1065
+ ASSERT_OK(backup_engine_->PurgeOldBackups(0));
1066
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1067
+ }
1068
+ CloseDBAndBackupEngine();
1069
+
1070
+ // delete old data
1071
+ DestroyDBWithoutCheck(dbname_, options_);
1072
+ }
1073
+ }
1074
+
1075
+ // This test verifies that the verifyBackup method correctly identifies
1076
+ // invalid backups
1077
+ TEST_P(BackupEngineTestWithParam, VerifyBackup) {
1078
+ const int keys_iteration = 5000;
1079
+ OpenDBAndBackupEngine(true);
1080
+ // create five backups
1081
+ for (int i = 0; i < 5; ++i) {
1082
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1083
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1084
+ }
1085
+ CloseDBAndBackupEngine();
1086
+
1087
+ OpenDBAndBackupEngine();
1088
+ // ---------- case 1. - valid backup -----------
1089
+ ASSERT_TRUE(backup_engine_->VerifyBackup(1).ok());
1090
+
1091
+ // ---------- case 2. - delete a file -----------i
1092
+ ASSERT_OK(file_manager_->DeleteRandomFileInDir(backupdir_ + "/private/1"));
1093
+ ASSERT_TRUE(backup_engine_->VerifyBackup(1).IsNotFound());
1094
+
1095
+ // ---------- case 3. - corrupt a file -----------
1096
+ std::string append_data = "Corrupting a random file";
1097
+ ASSERT_OK(file_manager_->AppendToRandomFileInDir(backupdir_ + "/private/2",
1098
+ append_data));
1099
+ ASSERT_TRUE(backup_engine_->VerifyBackup(2).IsCorruption());
1100
+
1101
+ // ---------- case 4. - invalid backup -----------
1102
+ ASSERT_TRUE(backup_engine_->VerifyBackup(6).IsNotFound());
1103
+ CloseDBAndBackupEngine();
1104
+ }
1105
+
1106
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1107
+ // open DB, write, close DB, backup, restore, repeat
1108
+ TEST_P(BackupEngineTestWithParam, OfflineIntegrationTest) {
1109
+ // has to be a big number, so that it triggers the memtable flush
1110
+ const int keys_iteration = 5000;
1111
+ const int max_key = keys_iteration * 4 + 10;
1112
+ // first iter -- flush before backup
1113
+ // second iter -- don't flush before backup
1114
+ for (int iter = 0; iter < 2; ++iter) {
1115
+ // delete old data
1116
+ DestroyDBWithoutCheck(dbname_, options_);
1117
+ bool destroy_data = true;
1118
+
1119
+ // every iteration --
1120
+ // 1. insert new data in the DB
1121
+ // 2. backup the DB
1122
+ // 3. destroy the db
1123
+ // 4. restore the db, check everything is still there
1124
+ for (int i = 0; i < 5; ++i) {
1125
+ // in last iteration, put smaller amount of data,
1126
+ int fill_up_to = std::min(keys_iteration * (i + 1), max_key);
1127
+ // ---- insert new data and back up ----
1128
+ OpenDBAndBackupEngine(destroy_data);
1129
+ destroy_data = false;
1130
+ // kAutoFlushOnly to preserve legacy test behavior (consider updating)
1131
+ FillDB(db_.get(), keys_iteration * i, fill_up_to, kAutoFlushOnly);
1132
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), iter == 0))
1133
+ << "iter: " << iter << ", idx: " << i;
1134
+ CloseDBAndBackupEngine();
1135
+ DestroyDBWithoutCheck(dbname_, options_);
1136
+
1137
+ // ---- make sure it's empty ----
1138
+ DB* db = OpenDB();
1139
+ AssertEmpty(db, 0, fill_up_to);
1140
+ delete db;
1141
+
1142
+ // ---- restore the DB ----
1143
+ OpenBackupEngine();
1144
+ if (i >= 3) { // test purge old backups
1145
+ // when i == 4, purge to only 1 backup
1146
+ // when i == 3, purge to 2 backups
1147
+ ASSERT_OK(backup_engine_->PurgeOldBackups(5 - i));
1148
+ }
1149
+ // ---- make sure the data is there ---
1150
+ AssertBackupConsistency(0, 0, fill_up_to, max_key);
1151
+ CloseBackupEngine();
1152
+ }
1153
+ }
1154
+ }
1155
+
1156
+ // open DB, write, backup, write, backup, close, restore
1157
+ TEST_P(BackupEngineTestWithParam, OnlineIntegrationTest) {
1158
+ // has to be a big number, so that it triggers the memtable flush
1159
+ const int keys_iteration = 5000;
1160
+ const int max_key = keys_iteration * 4 + 10;
1161
+ Random rnd(7);
1162
+ // delete old data
1163
+ DestroyDBWithoutCheck(dbname_, options_);
1164
+
1165
+ // TODO: Implement & test db_paths support in backup (not supported in
1166
+ // restore)
1167
+ // options_.db_paths.emplace_back(dbname_, 500 * 1024);
1168
+ // options_.db_paths.emplace_back(dbname_ + "_2", 1024 * 1024 * 1024);
1169
+
1170
+ OpenDBAndBackupEngine(true);
1171
+ // write some data, backup, repeat
1172
+ for (int i = 0; i < 5; ++i) {
1173
+ if (i == 4) {
1174
+ // delete backup number 2, online delete!
1175
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
1176
+ }
1177
+ // in last iteration, put smaller amount of data,
1178
+ // so that backups can share sst files
1179
+ int fill_up_to = std::min(keys_iteration * (i + 1), max_key);
1180
+ // kAutoFlushOnly to preserve legacy test behavior (consider updating)
1181
+ FillDB(db_.get(), keys_iteration * i, fill_up_to, kAutoFlushOnly);
1182
+ // we should get consistent results with flush_before_backup
1183
+ // set to both true and false
1184
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1185
+ }
1186
+ // close and destroy
1187
+ CloseDBAndBackupEngine();
1188
+ DestroyDBWithoutCheck(dbname_, options_);
1189
+
1190
+ // ---- make sure it's empty ----
1191
+ DB* db = OpenDB();
1192
+ AssertEmpty(db, 0, max_key);
1193
+ delete db;
1194
+
1195
+ // ---- restore every backup and verify all the data is there ----
1196
+ OpenBackupEngine();
1197
+ for (int i = 1; i <= 5; ++i) {
1198
+ if (i == 2) {
1199
+ // we deleted backup 2
1200
+ Status s = backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_);
1201
+ ASSERT_TRUE(!s.ok());
1202
+ } else {
1203
+ int fill_up_to = std::min(keys_iteration * i, max_key);
1204
+ AssertBackupConsistency(i, 0, fill_up_to, max_key);
1205
+ }
1206
+ }
1207
+
1208
+ // delete some backups -- this should leave only backups 3 and 5 alive
1209
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1210
+ ASSERT_OK(backup_engine_->PurgeOldBackups(2));
1211
+
1212
+ std::vector<BackupInfo> backup_info;
1213
+ backup_engine_->GetBackupInfo(&backup_info);
1214
+ ASSERT_EQ(2UL, backup_info.size());
1215
+
1216
+ // check backup 3
1217
+ AssertBackupConsistency(3, 0, 3 * keys_iteration, max_key);
1218
+ // check backup 5
1219
+ AssertBackupConsistency(5, 0, max_key);
1220
+
1221
+ // check that "latest backup" still works after deleting latest
1222
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1223
+ AssertBackupConsistency(0, 0, 3 * keys_iteration, max_key);
1224
+
1225
+ CloseBackupEngine();
1226
+ }
1227
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1228
+
1229
+ INSTANTIATE_TEST_CASE_P(BackupEngineTestWithParam, BackupEngineTestWithParam,
1230
+ ::testing::Bool());
1231
+
1232
+ // this will make sure that backup does not copy the same file twice
1233
+ TEST_F(BackupEngineTest, NoDoubleCopy_And_AutoGC) {
1234
+ OpenDBAndBackupEngine(true, true);
1235
+
1236
+ // should write 5 DB files + one meta file
1237
+ test_backup_fs_->SetLimitWrittenFiles(7);
1238
+ test_backup_fs_->ClearWrittenFiles();
1239
+ test_db_fs_->SetLimitWrittenFiles(0);
1240
+ dummy_db_->live_files_ = {"00010.sst", "00011.sst", "CURRENT", "MANIFEST-01",
1241
+ "00011.log"};
1242
+ test_db_fs_->SetFilenamesForMockedAttrs(dummy_db_->live_files_);
1243
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
1244
+ std::vector<std::string> should_have_written = {
1245
+ "/shared/.00010.sst.tmp", "/shared/.00011.sst.tmp", "/private/1/CURRENT",
1246
+ "/private/1/MANIFEST-01", "/private/1/00011.log", "/meta/.1.tmp"};
1247
+ AppendPath(backupdir_, should_have_written);
1248
+ test_backup_fs_->AssertWrittenFiles(should_have_written);
1249
+
1250
+ char db_number = '1';
1251
+
1252
+ for (std::string other_sst : {"00015.sst", "00017.sst", "00019.sst"}) {
1253
+ // should write 4 new DB files + one meta file
1254
+ // should not write/copy 00010.sst, since it's already there!
1255
+ test_backup_fs_->SetLimitWrittenFiles(6);
1256
+ test_backup_fs_->ClearWrittenFiles();
1257
+
1258
+ dummy_db_->live_files_ = {"00010.sst", other_sst, "CURRENT", "MANIFEST-01",
1259
+ "00011.log"};
1260
+ test_db_fs_->SetFilenamesForMockedAttrs(dummy_db_->live_files_);
1261
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
1262
+ // should not open 00010.sst - it's already there
1263
+
1264
+ ++db_number;
1265
+ std::string private_dir = std::string("/private/") + db_number;
1266
+ should_have_written = {
1267
+ "/shared/." + other_sst + ".tmp", private_dir + "/CURRENT",
1268
+ private_dir + "/MANIFEST-01", private_dir + "/00011.log",
1269
+ std::string("/meta/.") + db_number + ".tmp"};
1270
+ AppendPath(backupdir_, should_have_written);
1271
+ test_backup_fs_->AssertWrittenFiles(should_have_written);
1272
+ }
1273
+
1274
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
1275
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00010.sst"));
1276
+
1277
+ // 00011.sst was only in backup 1, should be deleted
1278
+ ASSERT_EQ(Status::NotFound(),
1279
+ test_backup_env_->FileExists(backupdir_ + "/shared/00011.sst"));
1280
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00015.sst"));
1281
+
1282
+ // MANIFEST file size should be only 100
1283
+ uint64_t size = 0;
1284
+ ASSERT_OK(test_backup_env_->GetFileSize(backupdir_ + "/private/2/MANIFEST-01",
1285
+ &size));
1286
+ ASSERT_EQ(100UL, size);
1287
+ ASSERT_OK(
1288
+ test_backup_env_->GetFileSize(backupdir_ + "/shared/00015.sst", &size));
1289
+ ASSERT_EQ(200UL, size);
1290
+
1291
+ CloseBackupEngine();
1292
+
1293
+ //
1294
+ // Now simulate incomplete delete by removing just meta
1295
+ //
1296
+ ASSERT_OK(test_backup_env_->DeleteFile(backupdir_ + "/meta/2"));
1297
+
1298
+ OpenBackupEngine();
1299
+
1300
+ // 1 appears to be removed, so
1301
+ // 2 non-corrupt and 0 corrupt seen
1302
+ std::vector<BackupInfo> backup_info;
1303
+ std::vector<BackupID> corrupt_backup_ids;
1304
+ backup_engine_->GetBackupInfo(&backup_info);
1305
+ backup_engine_->GetCorruptedBackups(&corrupt_backup_ids);
1306
+ ASSERT_EQ(2UL, backup_info.size());
1307
+ ASSERT_EQ(0UL, corrupt_backup_ids.size());
1308
+
1309
+ // Keep the two we see, but this should suffice to purge unreferenced
1310
+ // shared files from incomplete delete.
1311
+ ASSERT_OK(backup_engine_->PurgeOldBackups(2));
1312
+
1313
+ // Make sure dangling sst file has been removed (somewhere along this
1314
+ // process). GarbageCollect should not be needed.
1315
+ ASSERT_EQ(Status::NotFound(),
1316
+ test_backup_env_->FileExists(backupdir_ + "/shared/00015.sst"));
1317
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00017.sst"));
1318
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00019.sst"));
1319
+
1320
+ // Now actually purge a good one
1321
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1));
1322
+
1323
+ ASSERT_EQ(Status::NotFound(),
1324
+ test_backup_env_->FileExists(backupdir_ + "/shared/00017.sst"));
1325
+ ASSERT_OK(test_backup_env_->FileExists(backupdir_ + "/shared/00019.sst"));
1326
+
1327
+ CloseDBAndBackupEngine();
1328
+ }
1329
+
1330
+ // test various kind of corruptions that may happen:
1331
+ // 1. Not able to write a file for backup - that backup should fail,
1332
+ // everything else should work
1333
+ // 2. Corrupted backup meta file or missing backuped file - we should
1334
+ // not be able to open that backup, but all other backups should be
1335
+ // fine
1336
+ // 3. Corrupted checksum value - if the checksum is not a valid uint32_t,
1337
+ // db open should fail, otherwise, it aborts during the restore process.
1338
+ TEST_F(BackupEngineTest, CorruptionsTest) {
1339
+ const int keys_iteration = 5000;
1340
+ Random rnd(6);
1341
+ Status s;
1342
+
1343
+ OpenDBAndBackupEngine(true);
1344
+ // create five backups
1345
+ for (int i = 0; i < 5; ++i) {
1346
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1347
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1348
+ }
1349
+
1350
+ // ---------- case 1. - fail a write -----------
1351
+ // try creating backup 6, but fail a write
1352
+ FillDB(db_.get(), keys_iteration * 5, keys_iteration * 6);
1353
+ test_backup_fs_->SetLimitWrittenFiles(2);
1354
+ // should fail
1355
+ s = backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2));
1356
+ ASSERT_NOK(s);
1357
+ test_backup_fs_->SetLimitWrittenFiles(1000000);
1358
+ // latest backup should have all the keys
1359
+ CloseDBAndBackupEngine();
1360
+ AssertBackupConsistency(0, 0, keys_iteration * 5, keys_iteration * 6);
1361
+
1362
+ // --------- case 2. corrupted backup meta or missing backuped file ----
1363
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/5", 3));
1364
+ // since 5 meta is now corrupted, latest backup should be 4
1365
+ AssertBackupConsistency(0, 0, keys_iteration * 4, keys_iteration * 5);
1366
+ OpenBackupEngine();
1367
+ s = backup_engine_->RestoreDBFromBackup(5, dbname_, dbname_);
1368
+ ASSERT_NOK(s);
1369
+ CloseBackupEngine();
1370
+ ASSERT_OK(file_manager_->DeleteRandomFileInDir(backupdir_ + "/private/4"));
1371
+ // 4 is corrupted, 3 is the latest backup now
1372
+ AssertBackupConsistency(0, 0, keys_iteration * 3, keys_iteration * 5);
1373
+ OpenBackupEngine();
1374
+ s = backup_engine_->RestoreDBFromBackup(4, dbname_, dbname_);
1375
+ CloseBackupEngine();
1376
+ ASSERT_NOK(s);
1377
+
1378
+ // --------- case 3. corrupted checksum value ----
1379
+ ASSERT_OK(file_manager_->CorruptChecksum(backupdir_ + "/meta/3", false));
1380
+ // checksum of backup 3 is an invalid value, this can be detected at
1381
+ // db open time, and it reverts to the previous backup automatically
1382
+ AssertBackupConsistency(0, 0, keys_iteration * 2, keys_iteration * 5);
1383
+ // checksum of the backup 2 appears to be valid, this can cause checksum
1384
+ // mismatch and abort restore process
1385
+ ASSERT_OK(file_manager_->CorruptChecksum(backupdir_ + "/meta/2", true));
1386
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1387
+ OpenBackupEngine();
1388
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1389
+ s = backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_);
1390
+ ASSERT_NOK(s);
1391
+
1392
+ // make sure that no corrupt backups have actually been deleted!
1393
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/1"));
1394
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/2"));
1395
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/3"));
1396
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/4"));
1397
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/5"));
1398
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/1"));
1399
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/2"));
1400
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/3"));
1401
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/4"));
1402
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/5"));
1403
+
1404
+ // delete the corrupt backups and then make sure they're actually deleted
1405
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1406
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1407
+ ASSERT_OK(backup_engine_->DeleteBackup(3));
1408
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
1409
+ // Should not be needed anymore with auto-GC on DeleteBackup
1410
+ //(void)backup_engine_->GarbageCollect();
1411
+ ASSERT_EQ(Status::NotFound(),
1412
+ file_manager_->FileExists(backupdir_ + "/meta/5"));
1413
+ ASSERT_EQ(Status::NotFound(),
1414
+ file_manager_->FileExists(backupdir_ + "/private/5"));
1415
+ ASSERT_EQ(Status::NotFound(),
1416
+ file_manager_->FileExists(backupdir_ + "/meta/4"));
1417
+ ASSERT_EQ(Status::NotFound(),
1418
+ file_manager_->FileExists(backupdir_ + "/private/4"));
1419
+ ASSERT_EQ(Status::NotFound(),
1420
+ file_manager_->FileExists(backupdir_ + "/meta/3"));
1421
+ ASSERT_EQ(Status::NotFound(),
1422
+ file_manager_->FileExists(backupdir_ + "/private/3"));
1423
+ ASSERT_EQ(Status::NotFound(),
1424
+ file_manager_->FileExists(backupdir_ + "/meta/2"));
1425
+ ASSERT_EQ(Status::NotFound(),
1426
+ file_manager_->FileExists(backupdir_ + "/private/2"));
1427
+ CloseBackupEngine();
1428
+ AssertBackupConsistency(0, 0, keys_iteration * 1, keys_iteration * 5);
1429
+
1430
+ // new backup should be 2!
1431
+ OpenDBAndBackupEngine();
1432
+ FillDB(db_.get(), keys_iteration * 1, keys_iteration * 2);
1433
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1434
+ CloseDBAndBackupEngine();
1435
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * 5);
1436
+ }
1437
+
1438
+ // Corrupt a file but maintain its size
1439
+ TEST_F(BackupEngineTest, CorruptFileMaintainSize) {
1440
+ const int keys_iteration = 5000;
1441
+ OpenDBAndBackupEngine(true);
1442
+ // create a backup
1443
+ FillDB(db_.get(), 0, keys_iteration);
1444
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1445
+ CloseDBAndBackupEngine();
1446
+
1447
+ OpenDBAndBackupEngine();
1448
+ // verify with file size
1449
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1450
+ // verify with file checksum
1451
+ ASSERT_OK(backup_engine_->VerifyBackup(1, true));
1452
+
1453
+ std::string file_to_corrupt;
1454
+ uint64_t file_size = 0;
1455
+ // under normal circumstance, there should be at least one nonempty file
1456
+ while (file_size == 0) {
1457
+ // get a random file in /private/1
1458
+ assert(file_manager_
1459
+ ->GetRandomFileInDir(backupdir_ + "/private/1", &file_to_corrupt,
1460
+ &file_size)
1461
+ .ok());
1462
+ // corrupt the file by replacing its content by file_size random bytes
1463
+ ASSERT_OK(file_manager_->CorruptFile(file_to_corrupt, file_size));
1464
+ }
1465
+ // file sizes match
1466
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1467
+ // file checksums mismatch
1468
+ ASSERT_NOK(backup_engine_->VerifyBackup(1, true));
1469
+ // sanity check, use default second argument
1470
+ ASSERT_OK(backup_engine_->VerifyBackup(1));
1471
+ CloseDBAndBackupEngine();
1472
+
1473
+ // an extra challenge
1474
+ // set share_files_with_checksum to true and do two more backups
1475
+ // corrupt all the table files in shared_checksum but maintain their sizes
1476
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1477
+ kShareWithChecksum);
1478
+ // creat two backups
1479
+ for (int i = 1; i < 3; ++i) {
1480
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1481
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1482
+ }
1483
+ CloseDBAndBackupEngine();
1484
+
1485
+ OpenDBAndBackupEngine();
1486
+ std::vector<FileAttributes> children;
1487
+ const std::string dir = backupdir_ + "/shared_checksum";
1488
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
1489
+ for (const auto& child : children) {
1490
+ if (child.size_bytes == 0) {
1491
+ continue;
1492
+ }
1493
+ // corrupt the file by replacing its content by file_size random bytes
1494
+ ASSERT_OK(
1495
+ file_manager_->CorruptFile(dir + "/" + child.name, child.size_bytes));
1496
+ }
1497
+ // file sizes match
1498
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1499
+ ASSERT_OK(backup_engine_->VerifyBackup(2, false));
1500
+ // file checksums mismatch
1501
+ ASSERT_NOK(backup_engine_->VerifyBackup(1, true));
1502
+ ASSERT_NOK(backup_engine_->VerifyBackup(2, true));
1503
+ CloseDBAndBackupEngine();
1504
+ }
1505
+
1506
+ // Corrupt a blob file but maintain its size
1507
+ TEST_P(BackupEngineTestWithParam, CorruptBlobFileMaintainSize) {
1508
+ const int keys_iteration = 5000;
1509
+ OpenDBAndBackupEngine(true);
1510
+ // create a backup
1511
+ FillDB(db_.get(), 0, keys_iteration);
1512
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1513
+ CloseDBAndBackupEngine();
1514
+
1515
+ OpenDBAndBackupEngine();
1516
+ // verify with file size
1517
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1518
+ // verify with file checksum
1519
+ ASSERT_OK(backup_engine_->VerifyBackup(1, true));
1520
+
1521
+ std::string file_to_corrupt;
1522
+ std::vector<FileAttributes> children;
1523
+
1524
+ std::string dir = backupdir_;
1525
+ if (engine_options_->share_files_with_checksum) {
1526
+ dir += "/shared_checksum";
1527
+ } else {
1528
+ dir += "/shared";
1529
+ }
1530
+
1531
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
1532
+
1533
+ for (const auto& child : children) {
1534
+ if (EndsWith(child.name, ".blob") && child.size_bytes != 0) {
1535
+ // corrupt the blob files by replacing its content by file_size random
1536
+ // bytes
1537
+ ASSERT_OK(
1538
+ file_manager_->CorruptFile(dir + "/" + child.name, child.size_bytes));
1539
+ }
1540
+ }
1541
+
1542
+ // file sizes match
1543
+ ASSERT_OK(backup_engine_->VerifyBackup(1, false));
1544
+ // file checksums mismatch
1545
+ ASSERT_NOK(backup_engine_->VerifyBackup(1, true));
1546
+ // sanity check, use default second argument
1547
+ ASSERT_OK(backup_engine_->VerifyBackup(1));
1548
+ CloseDBAndBackupEngine();
1549
+ }
1550
+
1551
+ // Test if BackupEngine will fail to create new backup if some table has been
1552
+ // corrupted and the table file checksum is stored in the DB manifest
1553
+ TEST_F(BackupEngineTest, TableFileCorruptedBeforeBackup) {
1554
+ const int keys_iteration = 50000;
1555
+
1556
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1557
+ kNoShare);
1558
+ FillDB(db_.get(), 0, keys_iteration);
1559
+ CloseAndReopenDB(/*read_only*/ true);
1560
+ // corrupt a random table file in the DB directory
1561
+ ASSERT_OK(CorruptRandomDataFileInDB(kTableFile));
1562
+ // file_checksum_gen_factory is null, and thus table checksum is not
1563
+ // verified for creating a new backup; no correction is detected
1564
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1565
+ CloseDBAndBackupEngine();
1566
+
1567
+ // delete old files in db
1568
+ DestroyDBWithoutCheck(dbname_, options_);
1569
+
1570
+ // Enable table file checksum in DB manifest
1571
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1572
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1573
+ kNoShare);
1574
+ FillDB(db_.get(), 0, keys_iteration);
1575
+ CloseAndReopenDB(/*read_only*/ true);
1576
+ // corrupt a random table file in the DB directory
1577
+ ASSERT_OK(CorruptRandomDataFileInDB(kTableFile));
1578
+ // table file checksum is enabled so we should be able to detect any
1579
+ // corruption
1580
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1581
+ CloseDBAndBackupEngine();
1582
+ }
1583
+
1584
+ // Test if BackupEngine will fail to create new backup if some blob files has
1585
+ // been corrupted and the blob file checksum is stored in the DB manifest
1586
+ TEST_F(BackupEngineTest, BlobFileCorruptedBeforeBackup) {
1587
+ const int keys_iteration = 50000;
1588
+
1589
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1590
+ kNoShare);
1591
+ FillDB(db_.get(), 0, keys_iteration);
1592
+ CloseAndReopenDB(/*read_only*/ true);
1593
+ // corrupt a random blob file in the DB directory
1594
+ ASSERT_OK(CorruptRandomDataFileInDB(kBlobFile));
1595
+ // file_checksum_gen_factory is null, and thus blob checksum is not
1596
+ // verified for creating a new backup; no correction is detected
1597
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1598
+ CloseDBAndBackupEngine();
1599
+
1600
+ // delete old files in db
1601
+ DestroyDBWithoutCheck(dbname_, options_);
1602
+
1603
+ // Enable file checksum in DB manifest
1604
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1605
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1606
+ kNoShare);
1607
+ FillDB(db_.get(), 0, keys_iteration);
1608
+ CloseAndReopenDB(/*read_only*/ true);
1609
+ // corrupt a random blob file in the DB directory
1610
+ ASSERT_OK(CorruptRandomDataFileInDB(kBlobFile));
1611
+
1612
+ // file checksum is enabled so we should be able to detect any
1613
+ // corruption
1614
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1615
+ CloseDBAndBackupEngine();
1616
+ }
1617
+
1618
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1619
+ // Test if BackupEngine will fail to create new backup if some table has been
1620
+ // corrupted and the table file checksum is stored in the DB manifest for the
1621
+ // case when backup table files will be stored in a shared directory
1622
+ TEST_P(BackupEngineTestWithParam, TableFileCorruptedBeforeBackup) {
1623
+ const int keys_iteration = 50000;
1624
+
1625
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1626
+ FillDB(db_.get(), 0, keys_iteration);
1627
+ CloseAndReopenDB(/*read_only*/ true);
1628
+ // corrupt a random table file in the DB directory
1629
+ ASSERT_OK(CorruptRandomDataFileInDB(kTableFile));
1630
+ // cannot detect corruption since DB manifest has no table checksums
1631
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1632
+ CloseDBAndBackupEngine();
1633
+
1634
+ // delete old files in db
1635
+ DestroyDBWithoutCheck(dbname_, options_);
1636
+
1637
+ // Enable table checksums in DB manifest
1638
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1639
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1640
+ FillDB(db_.get(), 0, keys_iteration);
1641
+ CloseAndReopenDB(/*read_only*/ true);
1642
+ // corrupt a random table file in the DB directory
1643
+ ASSERT_OK(CorruptRandomDataFileInDB(kTableFile));
1644
+ // corruption is detected
1645
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1646
+ CloseDBAndBackupEngine();
1647
+ }
1648
+
1649
+ // Test if BackupEngine will fail to create new backup if some blob files have
1650
+ // been corrupted and the blob file checksum is stored in the DB manifest for
1651
+ // the case when backup blob files will be stored in a shared directory
1652
+ TEST_P(BackupEngineTestWithParam, BlobFileCorruptedBeforeBackup) {
1653
+ const int keys_iteration = 50000;
1654
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1655
+ FillDB(db_.get(), 0, keys_iteration);
1656
+ CloseAndReopenDB(/*read_only*/ true);
1657
+ // corrupt a random blob file in the DB directory
1658
+ ASSERT_OK(CorruptRandomDataFileInDB(kBlobFile));
1659
+ // cannot detect corruption since DB manifest has no blob file checksums
1660
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1661
+ CloseDBAndBackupEngine();
1662
+
1663
+ // delete old files in db
1664
+ DestroyDBWithoutCheck(dbname_, options_);
1665
+
1666
+ // Enable blob file checksums in DB manifest
1667
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1668
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1669
+ FillDB(db_.get(), 0, keys_iteration);
1670
+ CloseAndReopenDB(/*read_only*/ true);
1671
+ // corrupt a random blob file in the DB directory
1672
+ ASSERT_OK(CorruptRandomDataFileInDB(kBlobFile));
1673
+ // corruption is detected
1674
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1675
+ CloseDBAndBackupEngine();
1676
+ }
1677
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1678
+
1679
+ TEST_F(BackupEngineTest, TableFileWithoutDbChecksumCorruptedDuringBackup) {
1680
+ const int keys_iteration = 50000;
1681
+ engine_options_->share_files_with_checksum_naming = kLegacyCrc32cAndFileSize;
1682
+ // When share_files_with_checksum is on, we calculate checksums of table
1683
+ // files before and after copying. So we can test whether a corruption has
1684
+ // happened during the file is copied to backup directory.
1685
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
1686
+ kShareWithChecksum);
1687
+
1688
+ FillDB(db_.get(), 0, keys_iteration);
1689
+ std::atomic<bool> corrupted{false};
1690
+ // corrupt files when copying to the backup directory
1691
+ SyncPoint::GetInstance()->SetCallBack(
1692
+ "BackupEngineImpl::CopyOrCreateFile:CorruptionDuringBackup",
1693
+ [&](void* data) {
1694
+ if (data != nullptr) {
1695
+ Slice* d = reinterpret_cast<Slice*>(data);
1696
+ if (!d->empty()) {
1697
+ d->remove_suffix(1);
1698
+ corrupted = true;
1699
+ }
1700
+ }
1701
+ });
1702
+ SyncPoint::GetInstance()->EnableProcessing();
1703
+ Status s = backup_engine_->CreateNewBackup(db_.get());
1704
+ if (corrupted) {
1705
+ ASSERT_NOK(s);
1706
+ } else {
1707
+ // should not in this path in normal cases
1708
+ ASSERT_OK(s);
1709
+ }
1710
+
1711
+ SyncPoint::GetInstance()->DisableProcessing();
1712
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1713
+
1714
+ CloseDBAndBackupEngine();
1715
+ // delete old files in db
1716
+ DestroyDBWithoutCheck(dbname_, options_);
1717
+ }
1718
+
1719
+ TEST_F(BackupEngineTest, TableFileWithDbChecksumCorruptedDuringBackup) {
1720
+ const int keys_iteration = 50000;
1721
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1722
+ for (auto& sopt : kAllShareOptions) {
1723
+ // Since the default DB table file checksum is on, we obtain checksums of
1724
+ // table files from the DB manifest before copying and verify it with the
1725
+ // one calculated during copying.
1726
+ // Therefore, we can test whether a corruption has happened during the file
1727
+ // being copied to backup directory.
1728
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
1729
+
1730
+ FillDB(db_.get(), 0, keys_iteration);
1731
+
1732
+ // corrupt files when copying to the backup directory
1733
+ SyncPoint::GetInstance()->SetCallBack(
1734
+ "BackupEngineImpl::CopyOrCreateFile:CorruptionDuringBackup",
1735
+ [&](void* data) {
1736
+ if (data != nullptr) {
1737
+ Slice* d = reinterpret_cast<Slice*>(data);
1738
+ if (!d->empty()) {
1739
+ d->remove_suffix(1);
1740
+ }
1741
+ }
1742
+ });
1743
+ SyncPoint::GetInstance()->EnableProcessing();
1744
+ // The only case that we can't detect a corruption is when the file
1745
+ // being backed up is empty. But as keys_iteration is large, such
1746
+ // a case shouldn't have happened and we should be able to detect
1747
+ // the corruption.
1748
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get()));
1749
+
1750
+ SyncPoint::GetInstance()->DisableProcessing();
1751
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1752
+
1753
+ CloseDBAndBackupEngine();
1754
+ // delete old files in db
1755
+ DestroyDBWithoutCheck(dbname_, options_);
1756
+ }
1757
+ }
1758
+
1759
+ TEST_F(BackupEngineTest, InterruptCreationTest) {
1760
+ // Interrupt backup creation by failing new writes and failing cleanup of the
1761
+ // partial state. Then verify a subsequent backup can still succeed.
1762
+ const int keys_iteration = 5000;
1763
+ Random rnd(6);
1764
+
1765
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
1766
+ FillDB(db_.get(), 0, keys_iteration);
1767
+ test_backup_fs_->SetLimitWrittenFiles(2);
1768
+ test_backup_fs_->SetDeleteFileFailure(true);
1769
+ // should fail creation
1770
+ ASSERT_NOK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1771
+ CloseDBAndBackupEngine();
1772
+ // should also fail cleanup so the tmp directory stays behind
1773
+ ASSERT_OK(backup_chroot_env_->FileExists(backupdir_ + "/private/1/"));
1774
+
1775
+ OpenDBAndBackupEngine(false /* destroy_old_data */);
1776
+ test_backup_fs_->SetLimitWrittenFiles(1000000);
1777
+ test_backup_fs_->SetDeleteFileFailure(false);
1778
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1779
+ // latest backup should have all the keys
1780
+ CloseDBAndBackupEngine();
1781
+ AssertBackupConsistency(0, 0, keys_iteration);
1782
+ }
1783
+
1784
+ TEST_F(BackupEngineTest, FlushCompactDuringBackupCheckpoint) {
1785
+ const int keys_iteration = 5000;
1786
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
1787
+ for (const auto& sopt : kAllShareOptions) {
1788
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */, sopt);
1789
+ FillDB(db_.get(), 0, keys_iteration);
1790
+ // That FillDB leaves a mix of flushed and unflushed data
1791
+ SyncPoint::GetInstance()->LoadDependency(
1792
+ {{"CheckpointImpl::CreateCustomCheckpoint:AfterGetLive1",
1793
+ "BackupEngineTest::FlushCompactDuringBackupCheckpoint:Before"},
1794
+ {"BackupEngineTest::FlushCompactDuringBackupCheckpoint:After",
1795
+ "CheckpointImpl::CreateCustomCheckpoint:AfterGetLive2"}});
1796
+ SyncPoint::GetInstance()->EnableProcessing();
1797
+ ROCKSDB_NAMESPACE::port::Thread flush_thread{[this]() {
1798
+ TEST_SYNC_POINT(
1799
+ "BackupEngineTest::FlushCompactDuringBackupCheckpoint:Before");
1800
+ FillDB(db_.get(), keys_iteration, 2 * keys_iteration);
1801
+ ASSERT_OK(db_->Flush(FlushOptions()));
1802
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
1803
+ ASSERT_OK(dbi->TEST_WaitForFlushMemTable());
1804
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1805
+ ASSERT_OK(dbi->TEST_WaitForCompact());
1806
+ TEST_SYNC_POINT(
1807
+ "BackupEngineTest::FlushCompactDuringBackupCheckpoint:After");
1808
+ }};
1809
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1810
+ flush_thread.join();
1811
+ CloseDBAndBackupEngine();
1812
+ SyncPoint::GetInstance()->DisableProcessing();
1813
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1814
+ /* FIXME(peterd): reinstate with option for checksum in file names
1815
+ if (sopt == kShareWithChecksum) {
1816
+ // Ensure we actually got DB manifest checksums by inspecting
1817
+ // shared_checksum file names for hex checksum component
1818
+ TestRegex expected("[^_]+_[0-9A-F]{8}_[^_]+.sst");
1819
+ std::vector<FileAttributes> children;
1820
+ const std::string dir = backupdir_ + "/shared_checksum";
1821
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(dir, &children));
1822
+ for (const auto& child : children) {
1823
+ if (child.size_bytes == 0) {
1824
+ continue;
1825
+ }
1826
+ EXPECT_MATCHES_REGEX(child.name, expected);
1827
+ }
1828
+ }
1829
+ */
1830
+ AssertBackupConsistency(0, 0, keys_iteration);
1831
+ }
1832
+ }
1833
+
1834
+ inline std::string OptionsPath(std::string ret, int backupID) {
1835
+ ret += "/private/";
1836
+ ret += std::to_string(backupID);
1837
+ ret += "/";
1838
+ return ret;
1839
+ }
1840
+
1841
+ // Backup the LATEST options file to
1842
+ // "<backup_dir>/private/<backup_id>/OPTIONS<number>"
1843
+
1844
+ TEST_F(BackupEngineTest, BackupOptions) {
1845
+ OpenDBAndBackupEngine(true);
1846
+ for (int i = 1; i < 5; i++) {
1847
+ std::string name;
1848
+ std::vector<std::string> filenames;
1849
+ // Must reset() before reset(OpenDB()) again.
1850
+ // Calling OpenDB() while *db_ is existing will cause LOCK issue
1851
+ db_.reset();
1852
+ db_.reset(OpenDB());
1853
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
1854
+ ASSERT_OK(ROCKSDB_NAMESPACE::GetLatestOptionsFileName(db_->GetName(),
1855
+ options_.env, &name));
1856
+ ASSERT_OK(file_manager_->FileExists(OptionsPath(backupdir_, i) + name));
1857
+ ASSERT_OK(backup_chroot_env_->GetChildren(OptionsPath(backupdir_, i),
1858
+ &filenames));
1859
+ for (auto fn : filenames) {
1860
+ if (fn.compare(0, 7, "OPTIONS") == 0) {
1861
+ ASSERT_EQ(name, fn);
1862
+ }
1863
+ }
1864
+ }
1865
+
1866
+ CloseDBAndBackupEngine();
1867
+ }
1868
+
1869
+ TEST_F(BackupEngineTest, SetOptionsBackupRaceCondition) {
1870
+ OpenDBAndBackupEngine(true);
1871
+ SyncPoint::GetInstance()->LoadDependency(
1872
+ {{"CheckpointImpl::CreateCheckpoint:SavedLiveFiles1",
1873
+ "BackupEngineTest::SetOptionsBackupRaceCondition:BeforeSetOptions"},
1874
+ {"BackupEngineTest::SetOptionsBackupRaceCondition:AfterSetOptions",
1875
+ "CheckpointImpl::CreateCheckpoint:SavedLiveFiles2"}});
1876
+ SyncPoint::GetInstance()->EnableProcessing();
1877
+ ROCKSDB_NAMESPACE::port::Thread setoptions_thread{[this]() {
1878
+ TEST_SYNC_POINT(
1879
+ "BackupEngineTest::SetOptionsBackupRaceCondition:BeforeSetOptions");
1880
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
1881
+ // Change arbitrary option to trigger OPTIONS file deletion
1882
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1883
+ {{"paranoid_file_checks", "false"}}));
1884
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1885
+ {{"paranoid_file_checks", "true"}}));
1886
+ ASSERT_OK(dbi->SetOptions(dbi->DefaultColumnFamily(),
1887
+ {{"paranoid_file_checks", "false"}}));
1888
+ TEST_SYNC_POINT(
1889
+ "BackupEngineTest::SetOptionsBackupRaceCondition:AfterSetOptions");
1890
+ }};
1891
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1892
+ setoptions_thread.join();
1893
+ CloseDBAndBackupEngine();
1894
+ }
1895
+
1896
+ // This test verifies we don't delete the latest backup when read-only option is
1897
+ // set
1898
+ TEST_F(BackupEngineTest, NoDeleteWithReadOnly) {
1899
+ const int keys_iteration = 5000;
1900
+ Random rnd(6);
1901
+
1902
+ OpenDBAndBackupEngine(true);
1903
+ // create five backups
1904
+ for (int i = 0; i < 5; ++i) {
1905
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1906
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(rnd.Next() % 2)));
1907
+ }
1908
+ CloseDBAndBackupEngine();
1909
+ ASSERT_OK(file_manager_->WriteToFile(latest_backup_, "4"));
1910
+
1911
+ engine_options_->destroy_old_data = false;
1912
+ BackupEngineReadOnly* read_only_backup_engine;
1913
+ ASSERT_OK(BackupEngineReadOnly::Open(
1914
+ backup_chroot_env_.get(), *engine_options_, &read_only_backup_engine));
1915
+
1916
+ // assert that data from backup 5 is still here (even though LATEST_BACKUP
1917
+ // says 4 is latest)
1918
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/meta/5"));
1919
+ ASSERT_OK(file_manager_->FileExists(backupdir_ + "/private/5"));
1920
+
1921
+ // Behavior change: We now ignore LATEST_BACKUP contents. This means that
1922
+ // we should have 5 backups, even if LATEST_BACKUP says 4.
1923
+ std::vector<BackupInfo> backup_info;
1924
+ read_only_backup_engine->GetBackupInfo(&backup_info);
1925
+ ASSERT_EQ(5UL, backup_info.size());
1926
+ delete read_only_backup_engine;
1927
+ }
1928
+
1929
+ TEST_F(BackupEngineTest, FailOverwritingBackups) {
1930
+ options_.write_buffer_size = 1024 * 1024 * 1024; // 1GB
1931
+ options_.disable_auto_compactions = true;
1932
+
1933
+ // create backups 1, 2, 3, 4, 5
1934
+ OpenDBAndBackupEngine(true);
1935
+ for (int i = 0; i < 5; ++i) {
1936
+ CloseDBAndBackupEngine();
1937
+ DeleteLogFiles();
1938
+ OpenDBAndBackupEngine(false);
1939
+ FillDB(db_.get(), 100 * i, 100 * (i + 1), kFlushAll);
1940
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1941
+ }
1942
+ CloseDBAndBackupEngine();
1943
+
1944
+ // restore 3
1945
+ OpenBackupEngine();
1946
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(3, dbname_, dbname_));
1947
+ CloseBackupEngine();
1948
+
1949
+ OpenDBAndBackupEngine(false);
1950
+ // More data, bigger SST
1951
+ FillDB(db_.get(), 1000, 1300, kFlushAll);
1952
+ Status s = backup_engine_->CreateNewBackup(db_.get());
1953
+ // the new backup fails because new table files
1954
+ // clash with old table files from backups 4 and 5
1955
+ // (since write_buffer_size is huge, we can be sure that
1956
+ // each backup will generate only one sst file and that
1957
+ // a file generated here would have the same name as an
1958
+ // sst file generated by backup 4, and will be bigger)
1959
+ ASSERT_TRUE(s.IsCorruption());
1960
+ ASSERT_OK(backup_engine_->DeleteBackup(4));
1961
+ ASSERT_OK(backup_engine_->DeleteBackup(5));
1962
+ // now, the backup can succeed
1963
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
1964
+ CloseDBAndBackupEngine();
1965
+ }
1966
+
1967
+ TEST_F(BackupEngineTest, NoShareTableFiles) {
1968
+ const int keys_iteration = 5000;
1969
+ OpenDBAndBackupEngine(true, false, kNoShare);
1970
+ for (int i = 0; i < 5; ++i) {
1971
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1972
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(i % 2)));
1973
+ }
1974
+ CloseDBAndBackupEngine();
1975
+
1976
+ for (int i = 0; i < 5; ++i) {
1977
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1978
+ keys_iteration * 6);
1979
+ }
1980
+ }
1981
+
1982
+ // Verify that you can backup and restore with share_files_with_checksum on
1983
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksums) {
1984
+ const int keys_iteration = 5000;
1985
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
1986
+ for (int i = 0; i < 5; ++i) {
1987
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
1988
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), !!(i % 2)));
1989
+ }
1990
+ CloseDBAndBackupEngine();
1991
+
1992
+ for (int i = 0; i < 5; ++i) {
1993
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
1994
+ keys_iteration * 6);
1995
+ }
1996
+ }
1997
+
1998
+ // Verify that you can backup and restore using share_files_with_checksum set to
1999
+ // false and then transition this option to true
2000
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsTransition) {
2001
+ const int keys_iteration = 5000;
2002
+ // set share_files_with_checksum to false
2003
+ OpenDBAndBackupEngine(true, false, kShareNoChecksum);
2004
+ for (int i = 0; i < 5; ++i) {
2005
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2006
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2007
+ }
2008
+ CloseDBAndBackupEngine();
2009
+
2010
+ for (int i = 0; i < 5; ++i) {
2011
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2012
+ keys_iteration * 6);
2013
+ }
2014
+
2015
+ // set share_files_with_checksum to true and do some more backups
2016
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2017
+ kShareWithChecksum);
2018
+ for (int i = 5; i < 10; ++i) {
2019
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2020
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2021
+ }
2022
+ CloseDBAndBackupEngine();
2023
+
2024
+ // Verify first (about to delete)
2025
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 11);
2026
+
2027
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
2028
+ // is OK even if we open without share_table_files
2029
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2030
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
2031
+ ASSERT_OK(backup_engine_->GarbageCollect());
2032
+ CloseDBAndBackupEngine();
2033
+
2034
+ // Verify rest (not deleted)
2035
+ for (int i = 1; i < 10; ++i) {
2036
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2037
+ keys_iteration * 11);
2038
+ }
2039
+ }
2040
+
2041
+ // Verify backup and restore with various naming options, check names
2042
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsNewNaming) {
2043
+ ASSERT_TRUE(engine_options_->share_files_with_checksum_naming ==
2044
+ kNamingDefault);
2045
+
2046
+ const int keys_iteration = 5000;
2047
+
2048
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
2049
+ FillDB(db_.get(), 0, keys_iteration);
2050
+ CloseDBAndBackupEngine();
2051
+
2052
+ static const std::map<ShareFilesNaming, TestRegex> option_to_expected = {
2053
+ {kLegacyCrc32cAndFileSize, "[0-9]+_[0-9]+_[0-9]+[.]sst"},
2054
+ // kFlagIncludeFileSize redundant here
2055
+ {kLegacyCrc32cAndFileSize | kFlagIncludeFileSize,
2056
+ "[0-9]+_[0-9]+_[0-9]+[.]sst"},
2057
+ {kUseDbSessionId, "[0-9]+_s[0-9A-Z]{20}[.]sst"},
2058
+ {kUseDbSessionId | kFlagIncludeFileSize,
2059
+ "[0-9]+_s[0-9A-Z]{20}_[0-9]+[.]sst"},
2060
+ };
2061
+
2062
+ const TestRegex blobfile_pattern = "[0-9]+_[0-9]+_[0-9]+[.]blob";
2063
+
2064
+ for (const auto& pair : option_to_expected) {
2065
+ CloseAndReopenDB();
2066
+ engine_options_->share_files_with_checksum_naming = pair.first;
2067
+ OpenBackupEngine(true /*destroy_old_data*/);
2068
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2069
+ CloseDBAndBackupEngine();
2070
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 2);
2071
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum", pair.second,
2072
+ ".sst", 1 /* minimum_count */);
2073
+ if (std::string::npos != pair.second.GetPattern().find("_[0-9]+[.]sst")) {
2074
+ AssertDirectoryFilesSizeIndicators(backupdir_ + "/shared_checksum",
2075
+ 1 /* minimum_count */);
2076
+ }
2077
+
2078
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum",
2079
+ blobfile_pattern, ".blob",
2080
+ 1 /* minimum_count */);
2081
+ }
2082
+ }
2083
+
2084
+ // Mimic SST file generated by pre-6.12 releases and verify that
2085
+ // old names are always used regardless of naming option.
2086
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsOldFileNaming) {
2087
+ const int keys_iteration = 5000;
2088
+
2089
+ // Pre-6.12 release did not include db id and db session id properties.
2090
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2091
+ "PropertyBlockBuilder::AddTableProperty:Start", [&](void* props_vs) {
2092
+ auto props = static_cast<TableProperties*>(props_vs);
2093
+ props->db_id = "";
2094
+ props->db_session_id = "";
2095
+ });
2096
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2097
+
2098
+ // Corrupting the table properties corrupts the unique id.
2099
+ // Ignore the unique id recorded in the manifest.
2100
+ options_.verify_sst_unique_id_in_manifest = false;
2101
+
2102
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
2103
+ FillDB(db_.get(), 0, keys_iteration);
2104
+ CloseDBAndBackupEngine();
2105
+
2106
+ // Old names should always be used on old files
2107
+ const TestRegex sstfile_pattern("[0-9]+_[0-9]+_[0-9]+[.]sst");
2108
+
2109
+ const TestRegex blobfile_pattern = "[0-9]+_[0-9]+_[0-9]+[.]blob";
2110
+
2111
+ for (ShareFilesNaming option : {kNamingDefault, kUseDbSessionId}) {
2112
+ CloseAndReopenDB();
2113
+ engine_options_->share_files_with_checksum_naming = option;
2114
+ OpenBackupEngine(true /*destroy_old_data*/);
2115
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2116
+ CloseDBAndBackupEngine();
2117
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * 2);
2118
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum",
2119
+ sstfile_pattern, ".sst",
2120
+ 1 /* minimum_count */);
2121
+ AssertDirectoryFilesMatchRegex(backupdir_ + "/shared_checksum",
2122
+ blobfile_pattern, ".blob",
2123
+ 1 /* minimum_count */);
2124
+ }
2125
+
2126
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2127
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2128
+ }
2129
+
2130
+ // Test how naming options interact with detecting DB corruption
2131
+ // between incremental backups
2132
+ TEST_F(BackupEngineTest, TableFileCorruptionBeforeIncremental) {
2133
+ const auto share_no_checksum = static_cast<ShareFilesNaming>(0);
2134
+
2135
+ for (bool corrupt_before_first_backup : {false, true}) {
2136
+ for (ShareFilesNaming option :
2137
+ {share_no_checksum, kLegacyCrc32cAndFileSize, kNamingDefault}) {
2138
+ auto share =
2139
+ option == share_no_checksum ? kShareNoChecksum : kShareWithChecksum;
2140
+ if (option != share_no_checksum) {
2141
+ engine_options_->share_files_with_checksum_naming = option;
2142
+ }
2143
+ OpenDBAndBackupEngine(true, false, share);
2144
+ DBImpl* dbi = static_cast<DBImpl*>(db_.get());
2145
+ // A small SST file
2146
+ ASSERT_OK(dbi->Put(WriteOptions(), "x", "y"));
2147
+ ASSERT_OK(dbi->Flush(FlushOptions()));
2148
+ // And a bigger one
2149
+ ASSERT_OK(dbi->Put(WriteOptions(), "y", Random(42).RandomString(500)));
2150
+ ASSERT_OK(dbi->Flush(FlushOptions()));
2151
+ ASSERT_OK(dbi->TEST_WaitForFlushMemTable());
2152
+ CloseAndReopenDB(/*read_only*/ true);
2153
+
2154
+ std::vector<FileAttributes> table_files;
2155
+ ASSERT_OK(GetDataFilesInDB(kTableFile, &table_files));
2156
+ ASSERT_EQ(table_files.size(), 2);
2157
+ std::string tf0 = dbname_ + "/" + table_files[0].name;
2158
+ std::string tf1 = dbname_ + "/" + table_files[1].name;
2159
+
2160
+ CloseDBAndBackupEngine();
2161
+
2162
+ if (corrupt_before_first_backup) {
2163
+ // This corrupts a data block, which does not cause DB open
2164
+ // failure, only failure on accessing the block.
2165
+ ASSERT_OK(db_file_manager_->CorruptFileStart(tf0));
2166
+ }
2167
+
2168
+ OpenDBAndBackupEngine(false, false, share);
2169
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2170
+ CloseDBAndBackupEngine();
2171
+
2172
+ // if corrupt_before_first_backup, this undoes the initial corruption
2173
+ ASSERT_OK(db_file_manager_->CorruptFileStart(tf0));
2174
+
2175
+ OpenDBAndBackupEngine(false, false, share);
2176
+ Status s = backup_engine_->CreateNewBackup(db_.get());
2177
+
2178
+ // Even though none of the naming options catch the inconsistency
2179
+ // between the first and second time backing up fname, in the case
2180
+ // of kUseDbSessionId (kNamingDefault), this is an intentional
2181
+ // trade-off to avoid full scan of files from the DB that are
2182
+ // already backed up. If we did the scan, kUseDbSessionId could catch
2183
+ // the corruption. kLegacyCrc32cAndFileSize does the scan (to
2184
+ // compute checksum for name) without catching the corruption,
2185
+ // because the corruption means the names don't merge.
2186
+ EXPECT_OK(s);
2187
+
2188
+ // VerifyBackup doesn't check DB integrity or table file internal
2189
+ // checksums
2190
+ EXPECT_OK(backup_engine_->VerifyBackup(1, true));
2191
+ EXPECT_OK(backup_engine_->VerifyBackup(2, true));
2192
+
2193
+ db_.reset();
2194
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(2, dbname_, dbname_));
2195
+ {
2196
+ DB* db = OpenDB();
2197
+ s = db->VerifyChecksum();
2198
+ delete db;
2199
+ }
2200
+ if (option != kLegacyCrc32cAndFileSize && !corrupt_before_first_backup) {
2201
+ // Second backup is OK because it used (uncorrupt) file from first
2202
+ // backup instead of (corrupt) file from DB.
2203
+ // This is arguably a good trade-off vs. treating the file as distinct
2204
+ // from the old version, because a file should be more likely to be
2205
+ // corrupt as it ages. Although the backed-up file might also corrupt
2206
+ // with age, the alternative approach (checksum in file name computed
2207
+ // from current DB file contents) wouldn't detect that case at backup
2208
+ // time either. Although you would have both copies of the file with
2209
+ // the alternative approach, that would only last until the older
2210
+ // backup is deleted.
2211
+ ASSERT_OK(s);
2212
+ } else if (option == kLegacyCrc32cAndFileSize &&
2213
+ corrupt_before_first_backup) {
2214
+ // Second backup is OK because it saved the updated (uncorrupt)
2215
+ // file from DB, instead of the sharing with first backup.
2216
+ // Recall: if corrupt_before_first_backup, [second CorruptFileStart]
2217
+ // undoes the initial corruption.
2218
+ // This is arguably a bad trade-off vs. sharing the old version of the
2219
+ // file because a file should be more likely to corrupt as it ages.
2220
+ // (Not likely that the previously backed-up version was already
2221
+ // corrupt and the new version is non-corrupt. This approach doesn't
2222
+ // help if backed-up version is corrupted after taking the backup.)
2223
+ ASSERT_OK(s);
2224
+ } else {
2225
+ // Something is legitimately corrupted, but we can't be sure what
2226
+ // with information available (TODO? unless one passes block checksum
2227
+ // test and other doesn't. Probably better to use end-to-end full file
2228
+ // checksum anyway.)
2229
+ ASSERT_TRUE(s.IsCorruption());
2230
+ }
2231
+
2232
+ CloseDBAndBackupEngine();
2233
+ DestroyDBWithoutCheck(dbname_, options_);
2234
+ }
2235
+ }
2236
+ }
2237
+
2238
+ // Test how naming options interact with detecting file size corruption
2239
+ // between incremental backups
2240
+ TEST_F(BackupEngineTest, FileSizeForIncremental) {
2241
+ const auto share_no_checksum = static_cast<ShareFilesNaming>(0);
2242
+ // TODO: enable blob files once Integrated BlobDB supports DB session id.
2243
+ options_.enable_blob_files = false;
2244
+
2245
+ for (ShareFilesNaming option : {share_no_checksum, kLegacyCrc32cAndFileSize,
2246
+ kNamingDefault, kUseDbSessionId}) {
2247
+ auto share =
2248
+ option == share_no_checksum ? kShareNoChecksum : kShareWithChecksum;
2249
+ if (option != share_no_checksum) {
2250
+ engine_options_->share_files_with_checksum_naming = option;
2251
+ }
2252
+ OpenDBAndBackupEngine(true, false, share);
2253
+
2254
+ std::vector<FileAttributes> children;
2255
+ const std::string shared_dir =
2256
+ backupdir_ +
2257
+ (option == share_no_checksum ? "/shared" : "/shared_checksum");
2258
+
2259
+ // A single small SST file
2260
+ ASSERT_OK(db_->Put(WriteOptions(), "x", "y"));
2261
+
2262
+ // First, test that we always detect file size corruption on the shared
2263
+ // backup side on incremental. (Since sizes aren't really part of backup
2264
+ // meta file, this works by querying the filesystem for the sizes.)
2265
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true /*flush*/));
2266
+ CloseDBAndBackupEngine();
2267
+
2268
+ // Corrupt backup SST file
2269
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2270
+ ASSERT_EQ(children.size(), 1U); // one sst
2271
+ for (const auto& child : children) {
2272
+ if (child.name.size() > 4 && child.size_bytes > 0) {
2273
+ ASSERT_OK(
2274
+ file_manager_->WriteToFile(shared_dir + "/" + child.name, "asdf"));
2275
+ break;
2276
+ }
2277
+ }
2278
+
2279
+ OpenDBAndBackupEngine(false, false, share);
2280
+ Status s = backup_engine_->CreateNewBackup(db_.get());
2281
+ EXPECT_TRUE(s.IsCorruption());
2282
+
2283
+ ASSERT_OK(backup_engine_->PurgeOldBackups(0));
2284
+ CloseDBAndBackupEngine();
2285
+
2286
+ // Second, test that a hypothetical db session id collision would likely
2287
+ // not suffice to corrupt a backup, because there's a good chance of
2288
+ // file size difference (in this test, guaranteed) so either no name
2289
+ // collision or detected collision.
2290
+
2291
+ // Create backup 1
2292
+ OpenDBAndBackupEngine(false, false, share);
2293
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2294
+
2295
+ // Even though we have "the same" DB state as backup 1, we need
2296
+ // to restore to recreate the same conditions as later restore.
2297
+ db_.reset();
2298
+ DestroyDBWithoutCheck(dbname_, options_);
2299
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(1, dbname_, dbname_));
2300
+ CloseDBAndBackupEngine();
2301
+
2302
+ // Forge session id
2303
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2304
+ "DBImpl::SetDbSessionId", [](void* sid_void_star) {
2305
+ std::string* sid = static_cast<std::string*>(sid_void_star);
2306
+ *sid = "01234567890123456789";
2307
+ });
2308
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2309
+
2310
+ // Create another SST file
2311
+ OpenDBAndBackupEngine(false, false, share);
2312
+ ASSERT_OK(db_->Put(WriteOptions(), "y", "x"));
2313
+
2314
+ // Create backup 2
2315
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true /*flush*/));
2316
+
2317
+ // Restore backup 1 (again)
2318
+ db_.reset();
2319
+ DestroyDBWithoutCheck(dbname_, options_);
2320
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(1, dbname_, dbname_));
2321
+ CloseDBAndBackupEngine();
2322
+
2323
+ // Create another SST file with same number and db session id, only bigger
2324
+ OpenDBAndBackupEngine(false, false, share);
2325
+ ASSERT_OK(db_->Put(WriteOptions(), "y", Random(42).RandomString(500)));
2326
+
2327
+ // Count backup SSTs files.
2328
+ children.clear();
2329
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2330
+ ASSERT_EQ(children.size(), 2U); // two sst files
2331
+
2332
+ // Try create backup 3
2333
+ s = backup_engine_->CreateNewBackup(db_.get(), true /*flush*/);
2334
+
2335
+ // Re-count backup SSTs
2336
+ children.clear();
2337
+ ASSERT_OK(file_manager_->GetChildrenFileAttributes(shared_dir, &children));
2338
+
2339
+ if (option == kUseDbSessionId) {
2340
+ // Acceptable to call it corruption if size is not in name and
2341
+ // db session id collision is practically impossible.
2342
+ EXPECT_TRUE(s.IsCorruption());
2343
+ EXPECT_EQ(children.size(), 2U); // no SST file added
2344
+ } else if (option == share_no_checksum) {
2345
+ // Good to call it corruption if both backups cannot be
2346
+ // accommodated.
2347
+ EXPECT_TRUE(s.IsCorruption());
2348
+ EXPECT_EQ(children.size(), 2U); // no SST file added
2349
+ } else {
2350
+ // Since opening a DB seems sufficient for detecting size corruption
2351
+ // on the DB side, this should be a good thing, ...
2352
+ EXPECT_OK(s);
2353
+ // ... as long as we did actually treat it as a distinct SST file.
2354
+ EXPECT_EQ(children.size(), 3U); // Another SST added
2355
+ }
2356
+ CloseDBAndBackupEngine();
2357
+ DestroyDBWithoutCheck(dbname_, options_);
2358
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2359
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
2360
+ }
2361
+ }
2362
+
2363
+ // Verify backup and restore with share_files_with_checksum off and then
2364
+ // transition this option to on and share_files_with_checksum_naming to be
2365
+ // based on kUseDbSessionId
2366
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsNewNamingTransition) {
2367
+ const int keys_iteration = 5000;
2368
+ // We may set share_files_with_checksum_naming to kLegacyCrc32cAndFileSize
2369
+ // here but even if we don't, it should have no effect when
2370
+ // share_files_with_checksum is false
2371
+ ASSERT_TRUE(engine_options_->share_files_with_checksum_naming ==
2372
+ kNamingDefault);
2373
+ // set share_files_with_checksum to false
2374
+ OpenDBAndBackupEngine(true, false, kShareNoChecksum);
2375
+ int j = 3;
2376
+ for (int i = 0; i < j; ++i) {
2377
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2378
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2379
+ }
2380
+ CloseDBAndBackupEngine();
2381
+
2382
+ for (int i = 0; i < j; ++i) {
2383
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2384
+ keys_iteration * (j + 1));
2385
+ }
2386
+
2387
+ // set share_files_with_checksum to true and do some more backups
2388
+ // and use session id in the name of SST file backup
2389
+ ASSERT_TRUE(engine_options_->share_files_with_checksum_naming ==
2390
+ kNamingDefault);
2391
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2392
+ kShareWithChecksum);
2393
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2394
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2395
+ CloseDBAndBackupEngine();
2396
+ // Use checksum in the name as well
2397
+ ++j;
2398
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
2399
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2400
+ kShareWithChecksum);
2401
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2402
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2403
+ CloseDBAndBackupEngine();
2404
+
2405
+ // Verify first (about to delete)
2406
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * (j + 1));
2407
+
2408
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
2409
+ // is OK even if we open without share_table_files but with
2410
+ // share_files_with_checksum_naming based on kUseDbSessionId
2411
+ ASSERT_TRUE(engine_options_->share_files_with_checksum_naming ==
2412
+ kNamingDefault);
2413
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2414
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
2415
+ ASSERT_OK(backup_engine_->GarbageCollect());
2416
+ CloseDBAndBackupEngine();
2417
+
2418
+ // Verify second (about to delete)
2419
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * (j + 1));
2420
+
2421
+ // Use checksum and file size for backup table file names and open without
2422
+ // share_table_files
2423
+ // Again, make sure that GarbageCollect / DeleteBackup is OK
2424
+ engine_options_->share_files_with_checksum_naming = kLegacyCrc32cAndFileSize;
2425
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2426
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
2427
+ ASSERT_OK(backup_engine_->GarbageCollect());
2428
+ CloseDBAndBackupEngine();
2429
+
2430
+ // Verify rest (not deleted)
2431
+ for (int i = 2; i < j; ++i) {
2432
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2433
+ keys_iteration * (j + 1));
2434
+ }
2435
+ }
2436
+
2437
+ // Verify backup and restore with share_files_with_checksum on and transition
2438
+ // from kLegacyCrc32cAndFileSize to kUseDbSessionId
2439
+ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsNewNamingUpgrade) {
2440
+ engine_options_->share_files_with_checksum_naming = kLegacyCrc32cAndFileSize;
2441
+ const int keys_iteration = 5000;
2442
+ // set share_files_with_checksum to true
2443
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
2444
+ int j = 3;
2445
+ for (int i = 0; i < j; ++i) {
2446
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
2447
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2448
+ }
2449
+ CloseDBAndBackupEngine();
2450
+
2451
+ for (int i = 0; i < j; ++i) {
2452
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2453
+ keys_iteration * (j + 1));
2454
+ }
2455
+
2456
+ engine_options_->share_files_with_checksum_naming = kUseDbSessionId;
2457
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2458
+ kShareWithChecksum);
2459
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2460
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2461
+ CloseDBAndBackupEngine();
2462
+
2463
+ ++j;
2464
+ options_.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
2465
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
2466
+ kShareWithChecksum);
2467
+ FillDB(db_.get(), keys_iteration * j, keys_iteration * (j + 1));
2468
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2469
+ CloseDBAndBackupEngine();
2470
+
2471
+ // Verify first (about to delete)
2472
+ AssertBackupConsistency(1, 0, keys_iteration, keys_iteration * (j + 1));
2473
+
2474
+ // For an extra challenge, make sure that GarbageCollect / DeleteBackup
2475
+ // is OK even if we open without share_table_files
2476
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2477
+ ASSERT_OK(backup_engine_->DeleteBackup(1));
2478
+ ASSERT_OK(backup_engine_->GarbageCollect());
2479
+ CloseDBAndBackupEngine();
2480
+
2481
+ // Verify second (about to delete)
2482
+ AssertBackupConsistency(2, 0, keys_iteration * 2, keys_iteration * (j + 1));
2483
+
2484
+ // Use checksum and file size for backup table file names and open without
2485
+ // share_table_files
2486
+ // Again, make sure that GarbageCollect / DeleteBackup is OK
2487
+ engine_options_->share_files_with_checksum_naming = kLegacyCrc32cAndFileSize;
2488
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false, kNoShare);
2489
+ ASSERT_OK(backup_engine_->DeleteBackup(2));
2490
+ ASSERT_OK(backup_engine_->GarbageCollect());
2491
+ CloseDBAndBackupEngine();
2492
+
2493
+ // Verify rest (not deleted)
2494
+ for (int i = 2; i < j; ++i) {
2495
+ AssertBackupConsistency(i + 1, 0, keys_iteration * (i + 1),
2496
+ keys_iteration * (j + 1));
2497
+ }
2498
+ }
2499
+
2500
+ // This test simulates cleaning up after aborted or incomplete creation
2501
+ // of a new backup.
2502
+ TEST_F(BackupEngineTest, DeleteTmpFiles) {
2503
+ for (int cleanup_fn : {1, 2, 3, 4}) {
2504
+ for (ShareOption shared_option : kAllShareOptions) {
2505
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
2506
+ shared_option);
2507
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2508
+ BackupID next_id = 1;
2509
+ BackupID oldest_id = std::numeric_limits<BackupID>::max();
2510
+ {
2511
+ std::vector<BackupInfo> backup_info;
2512
+ backup_engine_->GetBackupInfo(&backup_info);
2513
+ for (const auto& bi : backup_info) {
2514
+ next_id = std::max(next_id, bi.backup_id + 1);
2515
+ oldest_id = std::min(oldest_id, bi.backup_id);
2516
+ }
2517
+ }
2518
+ CloseDBAndBackupEngine();
2519
+
2520
+ // An aborted or incomplete new backup will always be in the next
2521
+ // id (maybe more)
2522
+ std::string next_private = "private/" + std::to_string(next_id);
2523
+
2524
+ // NOTE: both shared and shared_checksum should be cleaned up
2525
+ // regardless of how the backup engine is opened.
2526
+ std::vector<std::string> tmp_files_and_dirs;
2527
+ for (const auto& dir_and_file : {
2528
+ std::make_pair(std::string("shared"),
2529
+ std::string(".00006.sst.tmp")),
2530
+ std::make_pair(std::string("shared_checksum"),
2531
+ std::string(".00007.sst.tmp")),
2532
+ std::make_pair(next_private, std::string("00003.sst")),
2533
+ }) {
2534
+ std::string dir = backupdir_ + "/" + dir_and_file.first;
2535
+ ASSERT_OK(file_manager_->CreateDirIfMissing(dir));
2536
+ ASSERT_OK(file_manager_->FileExists(dir));
2537
+
2538
+ std::string file = dir + "/" + dir_and_file.second;
2539
+ ASSERT_OK(file_manager_->WriteToFile(file, "tmp"));
2540
+ ASSERT_OK(file_manager_->FileExists(file));
2541
+
2542
+ tmp_files_and_dirs.push_back(file);
2543
+ }
2544
+ if (cleanup_fn != /*CreateNewBackup*/ 4) {
2545
+ // This exists after CreateNewBackup because it's deleted then
2546
+ // re-created.
2547
+ tmp_files_and_dirs.push_back(backupdir_ + "/" + next_private);
2548
+ }
2549
+
2550
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false /* dummy */,
2551
+ shared_option);
2552
+ // Need to call one of these explicitly to delete tmp files
2553
+ switch (cleanup_fn) {
2554
+ case 1:
2555
+ ASSERT_OK(backup_engine_->GarbageCollect());
2556
+ break;
2557
+ case 2:
2558
+ ASSERT_OK(backup_engine_->DeleteBackup(oldest_id));
2559
+ break;
2560
+ case 3:
2561
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1));
2562
+ break;
2563
+ case 4:
2564
+ // Does a garbage collect if it sees that next private dir exists
2565
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
2566
+ break;
2567
+ default:
2568
+ assert(false);
2569
+ }
2570
+ CloseDBAndBackupEngine();
2571
+ for (std::string file_or_dir : tmp_files_and_dirs) {
2572
+ if (file_manager_->FileExists(file_or_dir) != Status::NotFound()) {
2573
+ FAIL() << file_or_dir << " was expected to be deleted." << cleanup_fn;
2574
+ }
2575
+ }
2576
+ }
2577
+ }
2578
+ }
2579
+
2580
+ TEST_F(BackupEngineTest, KeepLogFiles) {
2581
+ engine_options_->backup_log_files = false;
2582
+ // basically infinite
2583
+ options_.WAL_ttl_seconds = 24 * 60 * 60;
2584
+ OpenDBAndBackupEngine(true);
2585
+ FillDB(db_.get(), 0, 100, kFlushAll);
2586
+ FillDB(db_.get(), 100, 200, kFlushAll);
2587
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
2588
+ FillDB(db_.get(), 200, 300, kFlushAll);
2589
+ FillDB(db_.get(), 300, 400, kFlushAll);
2590
+ FillDB(db_.get(), 400, 500, kFlushAll);
2591
+ CloseDBAndBackupEngine();
2592
+
2593
+ // all data should be there if we call with keep_log_files = true
2594
+ AssertBackupConsistency(0, 0, 500, 600, true);
2595
+ }
2596
+
2597
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
2598
+ class BackupEngineRateLimitingTestWithParam
2599
+ : public BackupEngineTest,
2600
+ public testing::WithParamInterface<
2601
+ std::tuple<bool /* make throttle */,
2602
+ int /* 0 = single threaded, 1 = multi threaded*/,
2603
+ std::pair<uint64_t, uint64_t> /* limits */>> {
2604
+ public:
2605
+ BackupEngineRateLimitingTestWithParam() {}
2606
+ };
2607
+
2608
+ uint64_t const MB = 1024 * 1024;
2609
+
2610
+ INSTANTIATE_TEST_CASE_P(
2611
+ RateLimiting, BackupEngineRateLimitingTestWithParam,
2612
+ ::testing::Values(std::make_tuple(false, 0, std::make_pair(1 * MB, 5 * MB)),
2613
+ std::make_tuple(false, 0, std::make_pair(2 * MB, 3 * MB)),
2614
+ std::make_tuple(false, 1, std::make_pair(1 * MB, 5 * MB)),
2615
+ std::make_tuple(false, 1, std::make_pair(2 * MB, 3 * MB)),
2616
+ std::make_tuple(true, 0, std::make_pair(1 * MB, 5 * MB)),
2617
+ std::make_tuple(true, 0, std::make_pair(2 * MB, 3 * MB)),
2618
+ std::make_tuple(true, 1, std::make_pair(1 * MB, 5 * MB)),
2619
+ std::make_tuple(true, 1,
2620
+ std::make_pair(2 * MB, 3 * MB))));
2621
+
2622
+ TEST_P(BackupEngineRateLimitingTestWithParam, RateLimiting) {
2623
+ size_t const kMicrosPerSec = 1000 * 1000LL;
2624
+ const bool custom_rate_limiter = std::get<0>(GetParam());
2625
+ // iter 0 -- single threaded
2626
+ // iter 1 -- multi threaded
2627
+ const int iter = std::get<1>(GetParam());
2628
+ const std::pair<uint64_t, uint64_t> limit = std::get<2>(GetParam());
2629
+ std::unique_ptr<Env> special_env(
2630
+ new SpecialEnv(db_chroot_env_.get(), /*time_elapse_only_sleep*/ true));
2631
+ // destroy old data
2632
+ Options options;
2633
+ options.env = special_env.get();
2634
+ DestroyDBWithoutCheck(dbname_, options);
2635
+
2636
+ if (custom_rate_limiter) {
2637
+ std::shared_ptr<RateLimiter> backup_rate_limiter =
2638
+ std::make_shared<GenericRateLimiter>(
2639
+ limit.first, 100 * 1000 /* refill_period_us */, 10 /* fairness */,
2640
+ RateLimiter::Mode::kWritesOnly /* mode */,
2641
+ special_env->GetSystemClock(), false /* auto_tuned */);
2642
+ std::shared_ptr<RateLimiter> restore_rate_limiter =
2643
+ std::make_shared<GenericRateLimiter>(
2644
+ limit.second, 100 * 1000 /* refill_period_us */, 10 /* fairness */,
2645
+ RateLimiter::Mode::kWritesOnly /* mode */,
2646
+ special_env->GetSystemClock(), false /* auto_tuned */);
2647
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2648
+ engine_options_->restore_rate_limiter = restore_rate_limiter;
2649
+ } else {
2650
+ engine_options_->backup_rate_limit = limit.first;
2651
+ engine_options_->restore_rate_limit = limit.second;
2652
+ }
2653
+
2654
+ engine_options_->max_background_operations = (iter == 0) ? 1 : 10;
2655
+ options_.compression = kNoCompression;
2656
+
2657
+ // Rate limiter uses `CondVar::TimedWait()`, which does not have access to the
2658
+ // `Env` to advance its time according to the fake wait duration. The
2659
+ // workaround is to install a callback that advance the `Env`'s mock time.
2660
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2661
+ "GenericRateLimiter::Request:PostTimedWait", [&](void* arg) {
2662
+ int64_t time_waited_us = *static_cast<int64_t*>(arg);
2663
+ special_env->SleepForMicroseconds(static_cast<int>(time_waited_us));
2664
+ });
2665
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2666
+
2667
+ OpenDBAndBackupEngine(true);
2668
+ TEST_SetDefaultRateLimitersClock(backup_engine_.get(),
2669
+ special_env->GetSystemClock());
2670
+
2671
+ size_t bytes_written = FillDB(db_.get(), 0, 10000);
2672
+
2673
+ auto start_backup = special_env->NowMicros();
2674
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
2675
+ auto backup_time = special_env->NowMicros() - start_backup;
2676
+ CloseDBAndBackupEngine();
2677
+ auto rate_limited_backup_time = (bytes_written * kMicrosPerSec) / limit.first;
2678
+ ASSERT_GT(backup_time, 0.8 * rate_limited_backup_time);
2679
+
2680
+ OpenBackupEngine();
2681
+ TEST_SetDefaultRateLimitersClock(
2682
+ backup_engine_.get(),
2683
+ special_env->GetSystemClock() /* backup_rate_limiter_clock */,
2684
+ special_env->GetSystemClock() /* restore_rate_limiter_clock */);
2685
+
2686
+ auto start_restore = special_env->NowMicros();
2687
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
2688
+ auto restore_time = special_env->NowMicros() - start_restore;
2689
+ CloseBackupEngine();
2690
+ auto rate_limited_restore_time =
2691
+ (bytes_written * kMicrosPerSec) / limit.second;
2692
+ ASSERT_GT(restore_time, 0.8 * rate_limited_restore_time);
2693
+
2694
+ AssertBackupConsistency(0, 0, 10000, 10100);
2695
+
2696
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2697
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearCallBack(
2698
+ "GenericRateLimiter::Request:PostTimedWait");
2699
+ }
2700
+
2701
+ TEST_P(BackupEngineRateLimitingTestWithParam, RateLimitingVerifyBackup) {
2702
+ const std::size_t kMicrosPerSec = 1000 * 1000LL;
2703
+ const bool custom_rate_limiter = std::get<0>(GetParam());
2704
+ const std::uint64_t backup_rate_limiter_limit = std::get<2>(GetParam()).first;
2705
+ const bool is_single_threaded = std::get<1>(GetParam()) == 0 ? true : false;
2706
+ std::unique_ptr<Env> special_env(
2707
+ new SpecialEnv(db_chroot_env_.get(), /*time_elapse_only_sleep*/ true));
2708
+
2709
+ if (custom_rate_limiter) {
2710
+ std::shared_ptr<RateLimiter> backup_rate_limiter =
2711
+ std::make_shared<GenericRateLimiter>(
2712
+ backup_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2713
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */,
2714
+ special_env->GetSystemClock(), false /* auto_tuned */);
2715
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2716
+ } else {
2717
+ engine_options_->backup_rate_limit = backup_rate_limiter_limit;
2718
+ }
2719
+
2720
+ engine_options_->max_background_operations = is_single_threaded ? 1 : 10;
2721
+
2722
+ Options options;
2723
+ options.env = special_env.get();
2724
+ DestroyDBWithoutCheck(dbname_, options);
2725
+ // Rate limiter uses `CondVar::TimedWait()`, which does not have access to the
2726
+ // `Env` to advance its time according to the fake wait duration. The
2727
+ // workaround is to install a callback that advance the `Env`'s mock time.
2728
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2729
+ "GenericRateLimiter::Request:PostTimedWait", [&](void* arg) {
2730
+ int64_t time_waited_us = *static_cast<int64_t*>(arg);
2731
+ special_env->SleepForMicroseconds(static_cast<int>(time_waited_us));
2732
+ });
2733
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2734
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
2735
+ TEST_SetDefaultRateLimitersClock(backup_engine_.get(),
2736
+ special_env->GetSystemClock(), nullptr);
2737
+ FillDB(db_.get(), 0, 10000);
2738
+
2739
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2740
+ false /* flush_before_backup */));
2741
+
2742
+ std::vector<BackupInfo> backup_infos;
2743
+ BackupInfo backup_info;
2744
+ backup_engine_->GetBackupInfo(&backup_infos);
2745
+ ASSERT_EQ(1, backup_infos.size());
2746
+ const int backup_id = 1;
2747
+ ASSERT_EQ(backup_id, backup_infos[0].backup_id);
2748
+ ASSERT_OK(backup_engine_->GetBackupInfo(backup_id, &backup_info,
2749
+ true /* include_file_details */));
2750
+
2751
+ std::uint64_t bytes_read_during_verify_backup = 0;
2752
+ for (BackupFileInfo backup_file_info : backup_info.file_details) {
2753
+ bytes_read_during_verify_backup += backup_file_info.size;
2754
+ }
2755
+ auto start_verify_backup = special_env->NowMicros();
2756
+ ASSERT_OK(
2757
+ backup_engine_->VerifyBackup(backup_id, true /* verify_with_checksum */));
2758
+ auto verify_backup_time = special_env->NowMicros() - start_verify_backup;
2759
+ auto rate_limited_verify_backup_time =
2760
+ (bytes_read_during_verify_backup * kMicrosPerSec) /
2761
+ backup_rate_limiter_limit;
2762
+ if (custom_rate_limiter) {
2763
+ EXPECT_GE(verify_backup_time, 0.8 * rate_limited_verify_backup_time);
2764
+ }
2765
+
2766
+ CloseDBAndBackupEngine();
2767
+ AssertBackupConsistency(backup_id, 0, 10000, 10010);
2768
+ DestroyDBWithoutCheck(dbname_, options);
2769
+
2770
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2771
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearCallBack(
2772
+ "GenericRateLimiter::Request:PostTimedWait");
2773
+ }
2774
+
2775
+ TEST_P(BackupEngineRateLimitingTestWithParam, RateLimitingChargeReadInBackup) {
2776
+ bool is_single_threaded = std::get<1>(GetParam()) == 0 ? true : false;
2777
+ engine_options_->max_background_operations = is_single_threaded ? 1 : 10;
2778
+
2779
+ const std::uint64_t backup_rate_limiter_limit = std::get<2>(GetParam()).first;
2780
+ std::shared_ptr<RateLimiter> backup_rate_limiter(NewGenericRateLimiter(
2781
+ backup_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2782
+ 10 /* fairness */, RateLimiter::Mode::kWritesOnly /* mode */));
2783
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2784
+
2785
+ DestroyDBWithoutCheck(dbname_, Options());
2786
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
2787
+ kShareWithChecksum /* shared_option */);
2788
+ FillDB(db_.get(), 0, 10);
2789
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2790
+ false /* flush_before_backup */));
2791
+ std::int64_t total_bytes_through_with_no_read_charged =
2792
+ backup_rate_limiter->GetTotalBytesThrough();
2793
+ CloseBackupEngine();
2794
+
2795
+ backup_rate_limiter.reset(NewGenericRateLimiter(
2796
+ backup_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2797
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */));
2798
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2799
+
2800
+ OpenBackupEngine(true);
2801
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2802
+ false /* flush_before_backup */));
2803
+ std::int64_t total_bytes_through_with_read_charged =
2804
+ backup_rate_limiter->GetTotalBytesThrough();
2805
+ EXPECT_GT(total_bytes_through_with_read_charged,
2806
+ total_bytes_through_with_no_read_charged);
2807
+ CloseDBAndBackupEngine();
2808
+ AssertBackupConsistency(1, 0, 10, 20);
2809
+ DestroyDBWithoutCheck(dbname_, Options());
2810
+ }
2811
+
2812
+ TEST_P(BackupEngineRateLimitingTestWithParam, RateLimitingChargeReadInRestore) {
2813
+ bool is_single_threaded = std::get<1>(GetParam()) == 0 ? true : false;
2814
+ engine_options_->max_background_operations = is_single_threaded ? 1 : 10;
2815
+
2816
+ const std::uint64_t restore_rate_limiter_limit =
2817
+ std::get<2>(GetParam()).second;
2818
+ std::shared_ptr<RateLimiter> restore_rate_limiter(NewGenericRateLimiter(
2819
+ restore_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2820
+ 10 /* fairness */, RateLimiter::Mode::kWritesOnly /* mode */));
2821
+ engine_options_->restore_rate_limiter = restore_rate_limiter;
2822
+
2823
+ DestroyDBWithoutCheck(dbname_, Options());
2824
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
2825
+ FillDB(db_.get(), 0, 10);
2826
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2827
+ false /* flush_before_backup */));
2828
+ CloseDBAndBackupEngine();
2829
+ DestroyDBWithoutCheck(dbname_, Options());
2830
+
2831
+ OpenBackupEngine(false /* destroy_old_data */);
2832
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
2833
+ std::int64_t total_bytes_through_with_no_read_charged =
2834
+ restore_rate_limiter->GetTotalBytesThrough();
2835
+ CloseBackupEngine();
2836
+ DestroyDBWithoutCheck(dbname_, Options());
2837
+
2838
+ restore_rate_limiter.reset(NewGenericRateLimiter(
2839
+ restore_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2840
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */));
2841
+ engine_options_->restore_rate_limiter = restore_rate_limiter;
2842
+
2843
+ OpenBackupEngine(false /* destroy_old_data */);
2844
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
2845
+ std::int64_t total_bytes_through_with_read_charged =
2846
+ restore_rate_limiter->GetTotalBytesThrough();
2847
+ EXPECT_EQ(total_bytes_through_with_read_charged,
2848
+ total_bytes_through_with_no_read_charged * 2);
2849
+ CloseBackupEngine();
2850
+ AssertBackupConsistency(1, 0, 10, 20);
2851
+ DestroyDBWithoutCheck(dbname_, Options());
2852
+ }
2853
+
2854
+ TEST_P(BackupEngineRateLimitingTestWithParam,
2855
+ RateLimitingChargeReadInInitialize) {
2856
+ bool is_single_threaded = std::get<1>(GetParam()) == 0 ? true : false;
2857
+ engine_options_->max_background_operations = is_single_threaded ? 1 : 10;
2858
+
2859
+ const std::uint64_t backup_rate_limiter_limit = std::get<2>(GetParam()).first;
2860
+ std::shared_ptr<RateLimiter> backup_rate_limiter(NewGenericRateLimiter(
2861
+ backup_rate_limiter_limit, 100 * 1000 /* refill_period_us */,
2862
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */));
2863
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2864
+
2865
+ DestroyDBWithoutCheck(dbname_, Options());
2866
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
2867
+ FillDB(db_.get(), 0, 10);
2868
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
2869
+ false /* flush_before_backup */));
2870
+ CloseDBAndBackupEngine();
2871
+ AssertBackupConsistency(1, 0, 10, 20);
2872
+
2873
+ std::int64_t total_bytes_through_before_initialize =
2874
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2875
+ OpenDBAndBackupEngine(false /* destroy_old_data */);
2876
+ // We charge read in BackupEngineImpl::BackupMeta::LoadFromFile,
2877
+ // which is called in BackupEngineImpl::Initialize() during
2878
+ // OpenBackupEngine(false)
2879
+ EXPECT_GT(engine_options_->backup_rate_limiter->GetTotalBytesThrough(),
2880
+ total_bytes_through_before_initialize);
2881
+ CloseDBAndBackupEngine();
2882
+ DestroyDBWithoutCheck(dbname_, Options());
2883
+ }
2884
+
2885
+ class BackupEngineRateLimitingTestWithParam2
2886
+ : public BackupEngineTest,
2887
+ public testing::WithParamInterface<
2888
+ std::tuple<std::pair<uint64_t, uint64_t> /* limits */>> {
2889
+ public:
2890
+ BackupEngineRateLimitingTestWithParam2() {}
2891
+ };
2892
+
2893
+ INSTANTIATE_TEST_CASE_P(
2894
+ LowRefillBytesPerPeriod, BackupEngineRateLimitingTestWithParam2,
2895
+ ::testing::Values(std::make_tuple(std::make_pair(1, 1))));
2896
+ // To verify we don't request over-sized bytes relative to
2897
+ // refill_bytes_per_period_ in each RateLimiter::Request() called in
2898
+ // BackupEngine through verifying we don't trigger assertion
2899
+ // failure on over-sized request in GenericRateLimiter in debug builds
2900
+ TEST_P(BackupEngineRateLimitingTestWithParam2,
2901
+ RateLimitingWithLowRefillBytesPerPeriod) {
2902
+ SpecialEnv special_env(Env::Default(), /*time_elapse_only_sleep*/ true);
2903
+
2904
+ engine_options_->max_background_operations = 1;
2905
+ const uint64_t backup_rate_limiter_limit = std::get<0>(GetParam()).first;
2906
+ std::shared_ptr<RateLimiter> backup_rate_limiter(
2907
+ std::make_shared<GenericRateLimiter>(
2908
+ backup_rate_limiter_limit, 1000 * 1000 /* refill_period_us */,
2909
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */,
2910
+ special_env.GetSystemClock(), false /* auto_tuned */));
2911
+
2912
+ engine_options_->backup_rate_limiter = backup_rate_limiter;
2913
+
2914
+ const uint64_t restore_rate_limiter_limit = std::get<0>(GetParam()).second;
2915
+ std::shared_ptr<RateLimiter> restore_rate_limiter(
2916
+ std::make_shared<GenericRateLimiter>(
2917
+ restore_rate_limiter_limit, 1000 * 1000 /* refill_period_us */,
2918
+ 10 /* fairness */, RateLimiter::Mode::kAllIo /* mode */,
2919
+ special_env.GetSystemClock(), false /* auto_tuned */));
2920
+
2921
+ engine_options_->restore_rate_limiter = restore_rate_limiter;
2922
+
2923
+ // Rate limiter uses `CondVar::TimedWait()`, which does not have access to the
2924
+ // `Env` to advance its time according to the fake wait duration. The
2925
+ // workaround is to install a callback that advance the `Env`'s mock time.
2926
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2927
+ "GenericRateLimiter::Request:PostTimedWait", [&](void* arg) {
2928
+ int64_t time_waited_us = *static_cast<int64_t*>(arg);
2929
+ special_env.SleepForMicroseconds(static_cast<int>(time_waited_us));
2930
+ });
2931
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2932
+
2933
+ DestroyDBWithoutCheck(dbname_, Options());
2934
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
2935
+ kShareWithChecksum /* shared_option */);
2936
+
2937
+ FillDB(db_.get(), 0, 100);
2938
+ int64_t total_bytes_through_before_backup =
2939
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2940
+ EXPECT_OK(backup_engine_->CreateNewBackup(db_.get(),
2941
+ false /* flush_before_backup */));
2942
+ int64_t total_bytes_through_after_backup =
2943
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2944
+ ASSERT_GT(total_bytes_through_after_backup,
2945
+ total_bytes_through_before_backup);
2946
+
2947
+ std::vector<BackupInfo> backup_infos;
2948
+ BackupInfo backup_info;
2949
+ backup_engine_->GetBackupInfo(&backup_infos);
2950
+ ASSERT_EQ(1, backup_infos.size());
2951
+ const int backup_id = 1;
2952
+ ASSERT_EQ(backup_id, backup_infos[0].backup_id);
2953
+ ASSERT_OK(backup_engine_->GetBackupInfo(backup_id, &backup_info,
2954
+ true /* include_file_details */));
2955
+ int64_t total_bytes_through_before_verify_backup =
2956
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2957
+ EXPECT_OK(
2958
+ backup_engine_->VerifyBackup(backup_id, true /* verify_with_checksum */));
2959
+ int64_t total_bytes_through_after_verify_backup =
2960
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2961
+ ASSERT_GT(total_bytes_through_after_verify_backup,
2962
+ total_bytes_through_before_verify_backup);
2963
+
2964
+ CloseDBAndBackupEngine();
2965
+ AssertBackupConsistency(backup_id, 0, 100, 101);
2966
+
2967
+ int64_t total_bytes_through_before_initialize =
2968
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2969
+ OpenDBAndBackupEngine(false /* destroy_old_data */);
2970
+ // We charge read in BackupEngineImpl::BackupMeta::LoadFromFile,
2971
+ // which is called in BackupEngineImpl::Initialize() during
2972
+ // OpenBackupEngine(false)
2973
+ int64_t total_bytes_through_after_initialize =
2974
+ engine_options_->backup_rate_limiter->GetTotalBytesThrough();
2975
+ ASSERT_GT(total_bytes_through_after_initialize,
2976
+ total_bytes_through_before_initialize);
2977
+ CloseDBAndBackupEngine();
2978
+
2979
+ DestroyDBWithoutCheck(dbname_, Options());
2980
+ OpenBackupEngine(false /* destroy_old_data */);
2981
+ int64_t total_bytes_through_before_restore =
2982
+ engine_options_->restore_rate_limiter->GetTotalBytesThrough();
2983
+ EXPECT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
2984
+ int64_t total_bytes_through_after_restore =
2985
+ engine_options_->restore_rate_limiter->GetTotalBytesThrough();
2986
+ ASSERT_GT(total_bytes_through_after_restore,
2987
+ total_bytes_through_before_restore);
2988
+ CloseBackupEngine();
2989
+
2990
+ DestroyDBWithoutCheck(dbname_, Options());
2991
+
2992
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2993
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearCallBack(
2994
+ "GenericRateLimiter::Request:PostTimedWait");
2995
+ }
2996
+
2997
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
2998
+
2999
+ TEST_F(BackupEngineTest, ReadOnlyBackupEngine) {
3000
+ DestroyDBWithoutCheck(dbname_, options_);
3001
+ OpenDBAndBackupEngine(true);
3002
+ FillDB(db_.get(), 0, 100);
3003
+ // Also test read-only DB with CreateNewBackup and flush=true (no flush)
3004
+ CloseAndReopenDB(/*read_only*/ true);
3005
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
3006
+ CloseAndReopenDB(/*read_only*/ false);
3007
+ FillDB(db_.get(), 100, 200);
3008
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
3009
+ CloseDBAndBackupEngine();
3010
+ DestroyDBWithoutCheck(dbname_, options_);
3011
+
3012
+ engine_options_->destroy_old_data = false;
3013
+ test_backup_fs_->ClearWrittenFiles();
3014
+ test_backup_fs_->SetLimitDeleteFiles(0);
3015
+ BackupEngineReadOnly* read_only_backup_engine;
3016
+ ASSERT_OK(BackupEngineReadOnly::Open(db_chroot_env_.get(), *engine_options_,
3017
+ &read_only_backup_engine));
3018
+ std::vector<BackupInfo> backup_info;
3019
+ read_only_backup_engine->GetBackupInfo(&backup_info);
3020
+ ASSERT_EQ(backup_info.size(), 2U);
3021
+
3022
+ RestoreOptions restore_options(false);
3023
+ ASSERT_OK(read_only_backup_engine->RestoreDBFromLatestBackup(
3024
+ dbname_, dbname_, restore_options));
3025
+ delete read_only_backup_engine;
3026
+ std::vector<std::string> should_have_written;
3027
+ test_backup_fs_->AssertWrittenFiles(should_have_written);
3028
+
3029
+ DB* db = OpenDB();
3030
+ AssertExists(db, 0, 200);
3031
+ delete db;
3032
+ }
3033
+
3034
+ TEST_F(BackupEngineTest, OpenBackupAsReadOnlyDB) {
3035
+ DestroyDBWithoutCheck(dbname_, options_);
3036
+ options_.write_dbid_to_manifest = false;
3037
+
3038
+ OpenDBAndBackupEngine(true);
3039
+ FillDB(db_.get(), 0, 100);
3040
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ false));
3041
+
3042
+ options_.write_dbid_to_manifest = true; // exercises some read-only DB code
3043
+ CloseAndReopenDB();
3044
+
3045
+ FillDB(db_.get(), 100, 200);
3046
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ false));
3047
+ db_.reset(); // CloseDB
3048
+ DestroyDBWithoutCheck(dbname_, options_);
3049
+ BackupInfo backup_info;
3050
+ // First, check that we get empty fields without include_file_details
3051
+ ASSERT_OK(backup_engine_->GetBackupInfo(/*id*/ 1U, &backup_info,
3052
+ /*with file details*/ false));
3053
+ ASSERT_EQ(backup_info.name_for_open, "");
3054
+ ASSERT_FALSE(backup_info.env_for_open);
3055
+
3056
+ // Now for the real test
3057
+ backup_info = BackupInfo();
3058
+ ASSERT_OK(backup_engine_->GetBackupInfo(/*id*/ 1U, &backup_info,
3059
+ /*with file details*/ true));
3060
+
3061
+ // Caution: DBOptions only holds a raw pointer to Env, so something else
3062
+ // must keep it alive.
3063
+ // Case 1: Keeping BackupEngine open suffices to keep Env alive
3064
+ DB* db = nullptr;
3065
+ Options opts = options_;
3066
+ // Ensure some key defaults are set
3067
+ opts.wal_dir = "";
3068
+ opts.create_if_missing = false;
3069
+ opts.info_log.reset();
3070
+
3071
+ opts.env = backup_info.env_for_open.get();
3072
+ std::string name = backup_info.name_for_open;
3073
+ backup_info = BackupInfo();
3074
+ ASSERT_OK(DB::OpenForReadOnly(opts, name, &db));
3075
+
3076
+ AssertExists(db, 0, 100);
3077
+ AssertEmpty(db, 100, 200);
3078
+
3079
+ delete db;
3080
+ db = nullptr;
3081
+
3082
+ // Case 2: Keeping BackupInfo alive rather than BackupEngine also suffices
3083
+ ASSERT_OK(backup_engine_->GetBackupInfo(/*id*/ 2U, &backup_info,
3084
+ /*with file details*/ true));
3085
+ CloseBackupEngine();
3086
+ opts.create_if_missing = true; // check also OK (though pointless)
3087
+ opts.env = backup_info.env_for_open.get();
3088
+ name = backup_info.name_for_open;
3089
+ // Note: keeping backup_info alive
3090
+ ASSERT_OK(DB::OpenForReadOnly(opts, name, &db));
3091
+
3092
+ AssertExists(db, 0, 200);
3093
+ delete db;
3094
+ db = nullptr;
3095
+
3096
+ // Now try opening read-write and make sure it fails, for safety.
3097
+ ASSERT_TRUE(DB::Open(opts, name, &db).IsIOError());
3098
+ }
3099
+
3100
+ TEST_F(BackupEngineTest, ProgressCallbackDuringBackup) {
3101
+ DestroyDBWithoutCheck(dbname_, options_);
3102
+
3103
+ OpenDBAndBackupEngine(true);
3104
+ FillDB(db_.get(), 0, 100);
3105
+
3106
+ // First test exception handling
3107
+ // Easily small enough for this small DB
3108
+ engine_options_->callback_trigger_interval_size = 1000;
3109
+ OpenBackupEngine();
3110
+ ASSERT_TRUE(
3111
+ backup_engine_->CreateNewBackup(db_.get(), true, []() { throw 42; })
3112
+ .IsAborted());
3113
+ ASSERT_TRUE(backup_engine_
3114
+ ->CreateNewBackup(db_.get(), true,
3115
+ []() { throw std::out_of_range("blah"); })
3116
+ .IsAborted());
3117
+
3118
+ // Too big for this small DB
3119
+ engine_options_->callback_trigger_interval_size = 100000;
3120
+ OpenBackupEngine();
3121
+ bool is_callback_invoked = false;
3122
+ ASSERT_OK(backup_engine_->CreateNewBackup(
3123
+ db_.get(), true,
3124
+ [&is_callback_invoked]() { is_callback_invoked = true; }));
3125
+ ASSERT_FALSE(is_callback_invoked);
3126
+ CloseBackupEngine();
3127
+
3128
+ // Easily small enough for this small DB
3129
+ engine_options_->callback_trigger_interval_size = 1000;
3130
+ OpenBackupEngine();
3131
+ ASSERT_OK(backup_engine_->CreateNewBackup(
3132
+ db_.get(), true,
3133
+ [&is_callback_invoked]() { is_callback_invoked = true; }));
3134
+ ASSERT_TRUE(is_callback_invoked);
3135
+ CloseDBAndBackupEngine();
3136
+ DestroyDBWithoutCheck(dbname_, options_);
3137
+ }
3138
+
3139
+ TEST_F(BackupEngineTest, GarbageCollectionBeforeBackup) {
3140
+ DestroyDBWithoutCheck(dbname_, options_);
3141
+ OpenDBAndBackupEngine(true);
3142
+
3143
+ ASSERT_OK(backup_chroot_env_->CreateDirIfMissing(backupdir_ + "/shared"));
3144
+ std::string file_five = backupdir_ + "/shared/000009.sst";
3145
+ std::string file_five_contents = "I'm not really a sst file";
3146
+ // this depends on the fact that 00009.sst is the first file created by the DB
3147
+ ASSERT_OK(file_manager_->WriteToFile(file_five, file_five_contents));
3148
+
3149
+ FillDB(db_.get(), 0, 100);
3150
+ // backup overwrites file 000009.sst
3151
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3152
+
3153
+ std::string new_file_five_contents;
3154
+ ASSERT_OK(ReadFileToString(backup_chroot_env_.get(), file_five,
3155
+ &new_file_five_contents));
3156
+ // file 000009.sst was overwritten
3157
+ ASSERT_TRUE(new_file_five_contents != file_five_contents);
3158
+
3159
+ CloseDBAndBackupEngine();
3160
+
3161
+ AssertBackupConsistency(0, 0, 100);
3162
+ }
3163
+
3164
+ // Test that we properly propagate Env failures
3165
+ TEST_F(BackupEngineTest, EnvFailures) {
3166
+ BackupEngine* backup_engine;
3167
+
3168
+ // get children failure
3169
+ {
3170
+ test_backup_fs_->SetGetChildrenFailure(true);
3171
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
3172
+ &backup_engine));
3173
+ test_backup_fs_->SetGetChildrenFailure(false);
3174
+ }
3175
+
3176
+ // created dir failure
3177
+ {
3178
+ test_backup_fs_->SetCreateDirIfMissingFailure(true);
3179
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
3180
+ &backup_engine));
3181
+ test_backup_fs_->SetCreateDirIfMissingFailure(false);
3182
+ }
3183
+
3184
+ // new directory failure
3185
+ {
3186
+ test_backup_fs_->SetNewDirectoryFailure(true);
3187
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
3188
+ &backup_engine));
3189
+ test_backup_fs_->SetNewDirectoryFailure(false);
3190
+ }
3191
+
3192
+ // Read from meta-file failure
3193
+ {
3194
+ DestroyDBWithoutCheck(dbname_, options_);
3195
+ OpenDBAndBackupEngine(true);
3196
+ FillDB(db_.get(), 0, 100);
3197
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3198
+ CloseDBAndBackupEngine();
3199
+ test_backup_fs_->SetDummySequentialFile(true);
3200
+ test_backup_fs_->SetDummySequentialFileFailReads(true);
3201
+ engine_options_->destroy_old_data = false;
3202
+ ASSERT_NOK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
3203
+ &backup_engine));
3204
+ test_backup_fs_->SetDummySequentialFile(false);
3205
+ test_backup_fs_->SetDummySequentialFileFailReads(false);
3206
+ }
3207
+
3208
+ // no failure
3209
+ {
3210
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), *engine_options_,
3211
+ &backup_engine));
3212
+ delete backup_engine;
3213
+ }
3214
+ }
3215
+
3216
+ // Verify manifest can roll while a backup is being created with the old
3217
+ // manifest.
3218
+ TEST_F(BackupEngineTest, ChangeManifestDuringBackupCreation) {
3219
+ DestroyDBWithoutCheck(dbname_, options_);
3220
+ options_.max_manifest_file_size = 0; // always rollover manifest for file add
3221
+ OpenDBAndBackupEngine(true);
3222
+ FillDB(db_.get(), 0, 100, kAutoFlushOnly);
3223
+
3224
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
3225
+ {"CheckpointImpl::CreateCheckpoint:SavedLiveFiles1",
3226
+ "VersionSet::LogAndApply:WriteManifest"},
3227
+ {"VersionSet::LogAndApply:WriteManifestDone",
3228
+ "CheckpointImpl::CreateCheckpoint:SavedLiveFiles2"},
3229
+ });
3230
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3231
+
3232
+ ROCKSDB_NAMESPACE::port::Thread flush_thread{
3233
+ [this]() { ASSERT_OK(db_->Flush(FlushOptions())); }};
3234
+
3235
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), false));
3236
+
3237
+ flush_thread.join();
3238
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3239
+
3240
+ // The last manifest roll would've already been cleaned up by the full scan
3241
+ // that happens when CreateNewBackup invokes EnableFileDeletions. We need to
3242
+ // trigger another roll to verify non-full scan purges stale manifests.
3243
+ DBImpl* db_impl = static_cast_with_check<DBImpl>(db_.get());
3244
+ std::string prev_manifest_path =
3245
+ DescriptorFileName(dbname_, db_impl->TEST_Current_Manifest_FileNo());
3246
+ FillDB(db_.get(), 0, 100, kAutoFlushOnly);
3247
+ ASSERT_OK(db_chroot_env_->FileExists(prev_manifest_path));
3248
+ ASSERT_OK(db_->Flush(FlushOptions()));
3249
+ // Even though manual flush completed above, the background thread may not
3250
+ // have finished its cleanup work. `TEST_WaitForBackgroundWork()` will wait
3251
+ // until all the background thread's work has completed, including cleanup.
3252
+ ASSERT_OK(db_impl->TEST_WaitForBackgroundWork());
3253
+ ASSERT_TRUE(db_chroot_env_->FileExists(prev_manifest_path).IsNotFound());
3254
+
3255
+ CloseDBAndBackupEngine();
3256
+ DestroyDBWithoutCheck(dbname_, options_);
3257
+ AssertBackupConsistency(0, 0, 100);
3258
+ }
3259
+
3260
+ // see https://github.com/facebook/rocksdb/issues/921
3261
+ TEST_F(BackupEngineTest, Issue921Test) {
3262
+ BackupEngine* backup_engine;
3263
+ engine_options_->share_table_files = false;
3264
+ ASSERT_OK(
3265
+ backup_chroot_env_->CreateDirIfMissing(engine_options_->backup_dir));
3266
+ engine_options_->backup_dir += "/new_dir";
3267
+ ASSERT_OK(BackupEngine::Open(backup_chroot_env_.get(), *engine_options_,
3268
+ &backup_engine));
3269
+
3270
+ delete backup_engine;
3271
+ }
3272
+
3273
+ TEST_F(BackupEngineTest, BackupWithMetadata) {
3274
+ const int keys_iteration = 5000;
3275
+ OpenDBAndBackupEngine(true);
3276
+ // create five backups
3277
+ for (int i = 0; i < 5; ++i) {
3278
+ const std::string metadata = std::to_string(i);
3279
+ FillDB(db_.get(), keys_iteration * i, keys_iteration * (i + 1));
3280
+ // Here also test CreateNewBackupWithMetadata with CreateBackupOptions
3281
+ // and outputting saved BackupID.
3282
+ CreateBackupOptions opts;
3283
+ opts.flush_before_backup = true;
3284
+ BackupID new_id = 0;
3285
+ ASSERT_OK(backup_engine_->CreateNewBackupWithMetadata(opts, db_.get(),
3286
+ metadata, &new_id));
3287
+ ASSERT_EQ(new_id, static_cast<BackupID>(i + 1));
3288
+ }
3289
+ CloseDBAndBackupEngine();
3290
+
3291
+ OpenDBAndBackupEngine();
3292
+ { // Verify in bulk BackupInfo
3293
+ std::vector<BackupInfo> backup_infos;
3294
+ backup_engine_->GetBackupInfo(&backup_infos);
3295
+ ASSERT_EQ(5, backup_infos.size());
3296
+ for (int i = 0; i < 5; i++) {
3297
+ ASSERT_EQ(std::to_string(i), backup_infos[i].app_metadata);
3298
+ }
3299
+ }
3300
+ // Also verify in individual BackupInfo
3301
+ for (int i = 0; i < 5; i++) {
3302
+ BackupInfo backup_info;
3303
+ ASSERT_OK(backup_engine_->GetBackupInfo(static_cast<BackupID>(i + 1),
3304
+ &backup_info));
3305
+ ASSERT_EQ(std::to_string(i), backup_info.app_metadata);
3306
+ }
3307
+ CloseDBAndBackupEngine();
3308
+ DestroyDBWithoutCheck(dbname_, options_);
3309
+ }
3310
+
3311
+ TEST_F(BackupEngineTest, BinaryMetadata) {
3312
+ OpenDBAndBackupEngine(true);
3313
+ std::string binaryMetadata = "abc\ndef";
3314
+ binaryMetadata.push_back('\0');
3315
+ binaryMetadata.append("ghi");
3316
+ ASSERT_OK(
3317
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), binaryMetadata));
3318
+ CloseDBAndBackupEngine();
3319
+
3320
+ OpenDBAndBackupEngine();
3321
+ std::vector<BackupInfo> backup_infos;
3322
+ backup_engine_->GetBackupInfo(&backup_infos);
3323
+ ASSERT_EQ(1, backup_infos.size());
3324
+ ASSERT_EQ(binaryMetadata, backup_infos[0].app_metadata);
3325
+ CloseDBAndBackupEngine();
3326
+ DestroyDBWithoutCheck(dbname_, options_);
3327
+ }
3328
+
3329
+ TEST_F(BackupEngineTest, MetadataTooLarge) {
3330
+ OpenDBAndBackupEngine(true);
3331
+ std::string largeMetadata(1024 * 1024 + 1, 0);
3332
+ ASSERT_NOK(
3333
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), largeMetadata));
3334
+ CloseDBAndBackupEngine();
3335
+ DestroyDBWithoutCheck(dbname_, options_);
3336
+ }
3337
+
3338
+ TEST_F(BackupEngineTest, MetaSchemaVersion2_SizeCorruption) {
3339
+ engine_options_->schema_version = 1;
3340
+ OpenDBAndBackupEngine(/*destroy_old_data*/ true);
3341
+
3342
+ // Backup 1: no future schema, no sizes, with checksums
3343
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3344
+
3345
+ CloseDBAndBackupEngine();
3346
+ engine_options_->schema_version = 2;
3347
+ OpenDBAndBackupEngine(/*destroy_old_data*/ false);
3348
+
3349
+ // Backup 2: no checksums, no sizes
3350
+ TEST_BackupMetaSchemaOptions test_opts;
3351
+ test_opts.crc32c_checksums = false;
3352
+ test_opts.file_sizes = false;
3353
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3354
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3355
+
3356
+ // Backup 3: no checksums, with sizes
3357
+ test_opts.file_sizes = true;
3358
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3359
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3360
+
3361
+ // Backup 4: with checksums and sizes
3362
+ test_opts.crc32c_checksums = true;
3363
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3364
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3365
+
3366
+ CloseDBAndBackupEngine();
3367
+
3368
+ // Corrupt all the CURRENT files with the wrong size
3369
+ const std::string private_dir = backupdir_ + "/private";
3370
+
3371
+ for (int id = 1; id <= 3; ++id) {
3372
+ ASSERT_OK(file_manager_->WriteToFile(
3373
+ private_dir + "/" + std::to_string(id) + "/CURRENT", "x"));
3374
+ }
3375
+ // Except corrupt Backup 4 with same size CURRENT file
3376
+ {
3377
+ uint64_t size = 0;
3378
+ ASSERT_OK(test_backup_env_->GetFileSize(private_dir + "/4/CURRENT", &size));
3379
+ ASSERT_OK(file_manager_->WriteToFile(private_dir + "/4/CURRENT",
3380
+ std::string(size, 'x')));
3381
+ }
3382
+
3383
+ OpenBackupEngine();
3384
+
3385
+ // Only the one with sizes in metadata will be immediately detected
3386
+ // as corrupt
3387
+ std::vector<BackupID> corrupted;
3388
+ backup_engine_->GetCorruptedBackups(&corrupted);
3389
+ ASSERT_EQ(corrupted.size(), 1);
3390
+ ASSERT_EQ(corrupted[0], 3);
3391
+
3392
+ // Size corruption detected on Restore with checksum
3393
+ ASSERT_TRUE(backup_engine_->RestoreDBFromBackup(1 /*id*/, dbname_, dbname_)
3394
+ .IsCorruption());
3395
+
3396
+ // Size corruption not detected without checksums nor sizes
3397
+ ASSERT_OK(backup_engine_->RestoreDBFromBackup(2 /*id*/, dbname_, dbname_));
3398
+
3399
+ // Non-size corruption detected on Restore with checksum
3400
+ ASSERT_TRUE(backup_engine_->RestoreDBFromBackup(4 /*id*/, dbname_, dbname_)
3401
+ .IsCorruption());
3402
+
3403
+ CloseBackupEngine();
3404
+ }
3405
+
3406
+ TEST_F(BackupEngineTest, MetaSchemaVersion2_NotSupported) {
3407
+ engine_options_->schema_version = 2;
3408
+ TEST_BackupMetaSchemaOptions test_opts;
3409
+ std::string app_metadata = "abc\ndef";
3410
+
3411
+ OpenDBAndBackupEngine(true);
3412
+ // Start with supported
3413
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3414
+ ASSERT_OK(
3415
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3416
+
3417
+ // Because we are injecting badness with a TEST API, the badness is only
3418
+ // detected on attempt to restore.
3419
+ // Not supported versions
3420
+ test_opts.version = "3";
3421
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3422
+ ASSERT_OK(
3423
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3424
+ test_opts.version = "23.45.67";
3425
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3426
+ ASSERT_OK(
3427
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3428
+ test_opts.version = "2";
3429
+
3430
+ // Non-ignorable fields
3431
+ test_opts.meta_fields["ni::blah"] = "123";
3432
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3433
+ ASSERT_OK(
3434
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3435
+ test_opts.meta_fields.clear();
3436
+
3437
+ test_opts.file_fields["ni::123"] = "xyz";
3438
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3439
+ ASSERT_OK(
3440
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3441
+ test_opts.file_fields.clear();
3442
+
3443
+ test_opts.footer_fields["ni::123"] = "xyz";
3444
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3445
+ ASSERT_OK(
3446
+ backup_engine_->CreateNewBackupWithMetadata(db_.get(), app_metadata));
3447
+ test_opts.footer_fields.clear();
3448
+ CloseDBAndBackupEngine();
3449
+
3450
+ OpenBackupEngine();
3451
+ std::vector<BackupID> corrupted;
3452
+ backup_engine_->GetCorruptedBackups(&corrupted);
3453
+ ASSERT_EQ(corrupted.size(), 5);
3454
+
3455
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(dbname_, dbname_));
3456
+ CloseBackupEngine();
3457
+ }
3458
+
3459
+ TEST_F(BackupEngineTest, MetaSchemaVersion2_Restore) {
3460
+ engine_options_->schema_version = 2;
3461
+ TEST_BackupMetaSchemaOptions test_opts;
3462
+ const int keys_iteration = 5000;
3463
+
3464
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
3465
+ FillDB(db_.get(), 0, keys_iteration);
3466
+ // Start with minimum metadata to ensure it works without it being filled
3467
+ // based on shared files also in other backups with the metadata.
3468
+ test_opts.crc32c_checksums = false;
3469
+ test_opts.file_sizes = false;
3470
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3471
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3472
+ CloseDBAndBackupEngine();
3473
+
3474
+ AssertBackupConsistency(1 /* id */, 0, keys_iteration, keys_iteration * 2);
3475
+
3476
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
3477
+ kShareWithChecksum);
3478
+ test_opts.file_sizes = true;
3479
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3480
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3481
+ CloseDBAndBackupEngine();
3482
+
3483
+ for (int id = 1; id <= 2; ++id) {
3484
+ AssertBackupConsistency(id, 0, keys_iteration, keys_iteration * 2);
3485
+ }
3486
+
3487
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
3488
+ kShareWithChecksum);
3489
+ test_opts.crc32c_checksums = true;
3490
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3491
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3492
+ CloseDBAndBackupEngine();
3493
+
3494
+ for (int id = 1; id <= 3; ++id) {
3495
+ AssertBackupConsistency(id, 0, keys_iteration, keys_iteration * 2);
3496
+ }
3497
+
3498
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
3499
+ kShareWithChecksum);
3500
+ // No TEST_EnableWriteFutureSchemaVersion2
3501
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3502
+ CloseDBAndBackupEngine();
3503
+
3504
+ for (int id = 1; id <= 4; ++id) {
3505
+ AssertBackupConsistency(id, 0, keys_iteration, keys_iteration * 2);
3506
+ }
3507
+
3508
+ OpenDBAndBackupEngine(false /* destroy_old_data */, false,
3509
+ kShareWithChecksum);
3510
+ // Minor version updates should be forward-compatible
3511
+ test_opts.version = "2.5.70";
3512
+ test_opts.meta_fields["asdf.3456"] = "-42";
3513
+ test_opts.meta_fields["__QRST"] = " 1 $ %%& ";
3514
+ test_opts.file_fields["z94._"] = "^\\";
3515
+ test_opts.file_fields["_7yyyyyyyyy"] = "111111111111";
3516
+ test_opts.footer_fields["Qwzn.tz89"] = "ASDF!!@# ##=\t ";
3517
+ test_opts.footer_fields["yes"] = "no!";
3518
+ TEST_SetBackupMetaSchemaOptions(backup_engine_.get(), test_opts);
3519
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3520
+ CloseDBAndBackupEngine();
3521
+
3522
+ for (int id = 1; id <= 5; ++id) {
3523
+ AssertBackupConsistency(id, 0, keys_iteration, keys_iteration * 2);
3524
+ }
3525
+ }
3526
+
3527
+ TEST_F(BackupEngineTest, Concurrency) {
3528
+ // Check that we can simultaneously:
3529
+ // * Run several read operations in different threads on a single
3530
+ // BackupEngine object, and
3531
+ // * With another BackupEngine object on the same
3532
+ // backup_dir, run the same read operations in another thread, and
3533
+ // * With yet another BackupEngine object on the same
3534
+ // backup_dir, create two new backups in parallel threads.
3535
+ //
3536
+ // Because of the challenges of integrating this into db_stress,
3537
+ // this is a non-deterministic mini-stress test here instead.
3538
+
3539
+ // To check for a race condition in handling buffer size based on byte
3540
+ // burst limit, we need a (generous) rate limiter
3541
+ std::shared_ptr<RateLimiter> limiter{NewGenericRateLimiter(1000000000)};
3542
+ engine_options_->backup_rate_limiter = limiter;
3543
+ engine_options_->restore_rate_limiter = limiter;
3544
+
3545
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
3546
+
3547
+ static constexpr int keys_iteration = 5000;
3548
+ FillDB(db_.get(), 0, keys_iteration);
3549
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3550
+
3551
+ FillDB(db_.get(), keys_iteration, 2 * keys_iteration);
3552
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
3553
+
3554
+ static constexpr int max_factor = 3;
3555
+ FillDB(db_.get(), 2 * keys_iteration, max_factor * keys_iteration);
3556
+ // will create another backup soon...
3557
+
3558
+ Options db_opts = options_;
3559
+ db_opts.wal_dir = "";
3560
+ db_opts.create_if_missing = false;
3561
+ BackupEngineOptions be_opts = *engine_options_;
3562
+ be_opts.destroy_old_data = false;
3563
+
3564
+ std::mt19937 rng{std::random_device()()};
3565
+
3566
+ std::array<std::thread, 4> read_threads;
3567
+ std::array<std::thread, 4> restore_verify_threads;
3568
+ for (uint32_t i = 0; i < read_threads.size(); ++i) {
3569
+ uint32_t sleep_micros = rng() % 100000;
3570
+ read_threads[i] = std::thread([this, i, sleep_micros, &db_opts, &be_opts,
3571
+ &restore_verify_threads, &limiter] {
3572
+ test_db_env_->SleepForMicroseconds(sleep_micros);
3573
+
3574
+ // Whether to also re-open the BackupEngine, potentially seeing
3575
+ // additional backups
3576
+ bool reopen = i == 3;
3577
+ // Whether we are going to restore "latest"
3578
+ bool latest = i > 1;
3579
+
3580
+ BackupEngine* my_be;
3581
+ if (reopen) {
3582
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), be_opts, &my_be));
3583
+ } else {
3584
+ my_be = backup_engine_.get();
3585
+ }
3586
+
3587
+ // Verify metadata (we don't receive updates from concurrently
3588
+ // creating a new backup)
3589
+ std::vector<BackupInfo> infos;
3590
+ my_be->GetBackupInfo(&infos);
3591
+ const uint32_t count = static_cast<uint32_t>(infos.size());
3592
+ infos.clear();
3593
+ if (reopen) {
3594
+ ASSERT_GE(count, 2U);
3595
+ ASSERT_LE(count, 4U);
3596
+ fprintf(stderr, "Reopen saw %u backups\n", count);
3597
+ } else {
3598
+ ASSERT_EQ(count, 2U);
3599
+ }
3600
+ std::vector<BackupID> ids;
3601
+ my_be->GetCorruptedBackups(&ids);
3602
+ ASSERT_EQ(ids.size(), 0U);
3603
+
3604
+ // (Eventually, see below) Restore one of the backups, or "latest"
3605
+ std::string restore_db_dir = dbname_ + "/restore" + std::to_string(i);
3606
+ DestroyDir(test_db_env_.get(), restore_db_dir).PermitUncheckedError();
3607
+ BackupID to_restore;
3608
+ if (latest) {
3609
+ to_restore = count;
3610
+ } else {
3611
+ to_restore = i + 1;
3612
+ }
3613
+
3614
+ // Open restored DB to verify its contents, but test atomic restore
3615
+ // by doing it async and ensuring we either get OK or InvalidArgument
3616
+ restore_verify_threads[i] =
3617
+ std::thread([this, &db_opts, restore_db_dir, to_restore] {
3618
+ DB* restored;
3619
+ Status s;
3620
+ for (;;) {
3621
+ s = DB::Open(db_opts, restore_db_dir, &restored);
3622
+ if (s.IsInvalidArgument()) {
3623
+ // Restore hasn't finished
3624
+ test_db_env_->SleepForMicroseconds(1000);
3625
+ continue;
3626
+ } else {
3627
+ // We should only get InvalidArgument if restore is
3628
+ // incomplete, or OK if complete
3629
+ ASSERT_OK(s);
3630
+ break;
3631
+ }
3632
+ }
3633
+ int factor = std::min(static_cast<int>(to_restore), max_factor);
3634
+ AssertExists(restored, 0, factor * keys_iteration);
3635
+ AssertEmpty(restored, factor * keys_iteration,
3636
+ (factor + 1) * keys_iteration);
3637
+ delete restored;
3638
+ });
3639
+
3640
+ // (Ok now) Restore one of the backups, or "latest"
3641
+ if (latest) {
3642
+ ASSERT_OK(
3643
+ my_be->RestoreDBFromLatestBackup(restore_db_dir, restore_db_dir));
3644
+ } else {
3645
+ ASSERT_OK(my_be->VerifyBackup(to_restore, true));
3646
+ ASSERT_OK(my_be->RestoreDBFromBackup(to_restore, restore_db_dir,
3647
+ restore_db_dir));
3648
+ }
3649
+
3650
+ // Test for race condition in reconfiguring limiter
3651
+ // FIXME: this could set to a different value in all threads, except
3652
+ // GenericRateLimiter::SetBytesPerSecond has a write-write race
3653
+ // reported by TSAN
3654
+ if (i == 0) {
3655
+ limiter->SetBytesPerSecond(2000000000);
3656
+ }
3657
+
3658
+ // Re-verify metadata (we don't receive updates from concurrently
3659
+ // creating a new backup)
3660
+ my_be->GetBackupInfo(&infos);
3661
+ ASSERT_EQ(infos.size(), count);
3662
+ my_be->GetCorruptedBackups(&ids);
3663
+ ASSERT_EQ(ids.size(), 0);
3664
+ // fprintf(stderr, "Finished read thread\n");
3665
+
3666
+ if (reopen) {
3667
+ delete my_be;
3668
+ }
3669
+ });
3670
+ }
3671
+
3672
+ BackupEngine* alt_be;
3673
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), be_opts, &alt_be));
3674
+
3675
+ std::array<std::thread, 2> append_threads;
3676
+ for (unsigned i = 0; i < append_threads.size(); ++i) {
3677
+ uint32_t sleep_micros = rng() % 100000;
3678
+ append_threads[i] = std::thread([this, sleep_micros, alt_be] {
3679
+ test_db_env_->SleepForMicroseconds(sleep_micros);
3680
+ // WART: CreateNewBackup doesn't tell you the BackupID it just created,
3681
+ // which is ugly for multithreaded setting.
3682
+ // TODO: add delete backup also when that is added
3683
+ ASSERT_OK(alt_be->CreateNewBackup(db_.get()));
3684
+ // fprintf(stderr, "Finished append thread\n");
3685
+ });
3686
+ }
3687
+
3688
+ for (auto& t : append_threads) {
3689
+ t.join();
3690
+ }
3691
+ // Verify metadata
3692
+ std::vector<BackupInfo> infos;
3693
+ alt_be->GetBackupInfo(&infos);
3694
+ ASSERT_EQ(infos.size(), 2 + append_threads.size());
3695
+
3696
+ for (auto& t : read_threads) {
3697
+ t.join();
3698
+ }
3699
+
3700
+ delete alt_be;
3701
+
3702
+ for (auto& t : restore_verify_threads) {
3703
+ t.join();
3704
+ }
3705
+
3706
+ CloseDBAndBackupEngine();
3707
+ }
3708
+
3709
+ TEST_F(BackupEngineTest, LimitBackupsOpened) {
3710
+ // Verify the specified max backups are opened, including skipping over
3711
+ // corrupted backups.
3712
+ //
3713
+ // Setup:
3714
+ // - backups 1, 2, and 4 are valid
3715
+ // - backup 3 is corrupt
3716
+ // - max_valid_backups_to_open == 2
3717
+ //
3718
+ // Expectation: the engine opens backups 4 and 2 since those are latest two
3719
+ // non-corrupt backups.
3720
+ const int kNumKeys = 5000;
3721
+ OpenDBAndBackupEngine(true);
3722
+ for (int i = 1; i <= 4; ++i) {
3723
+ FillDB(db_.get(), kNumKeys * i, kNumKeys * (i + 1));
3724
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3725
+ if (i == 3) {
3726
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/3", 3));
3727
+ }
3728
+ }
3729
+ CloseDBAndBackupEngine();
3730
+
3731
+ engine_options_->max_valid_backups_to_open = 2;
3732
+ engine_options_->destroy_old_data = false;
3733
+ BackupEngineReadOnly* read_only_backup_engine;
3734
+ ASSERT_OK(BackupEngineReadOnly::Open(
3735
+ backup_chroot_env_.get(), *engine_options_, &read_only_backup_engine));
3736
+
3737
+ std::vector<BackupInfo> backup_infos;
3738
+ read_only_backup_engine->GetBackupInfo(&backup_infos);
3739
+ ASSERT_EQ(2, backup_infos.size());
3740
+ ASSERT_EQ(2, backup_infos[0].backup_id);
3741
+ ASSERT_EQ(4, backup_infos[1].backup_id);
3742
+ delete read_only_backup_engine;
3743
+ }
3744
+
3745
+ TEST_F(BackupEngineTest, IgnoreLimitBackupsOpenedWhenNotReadOnly) {
3746
+ // Verify the specified max_valid_backups_to_open is ignored if the engine
3747
+ // is not read-only.
3748
+ //
3749
+ // Setup:
3750
+ // - backups 1, 2, and 4 are valid
3751
+ // - backup 3 is corrupt
3752
+ // - max_valid_backups_to_open == 2
3753
+ //
3754
+ // Expectation: the engine opens backups 4, 2, and 1 since those are latest
3755
+ // non-corrupt backups, by ignoring max_valid_backups_to_open == 2.
3756
+ const int kNumKeys = 5000;
3757
+ OpenDBAndBackupEngine(true);
3758
+ for (int i = 1; i <= 4; ++i) {
3759
+ FillDB(db_.get(), kNumKeys * i, kNumKeys * (i + 1));
3760
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3761
+ if (i == 3) {
3762
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/3", 3));
3763
+ }
3764
+ }
3765
+ CloseDBAndBackupEngine();
3766
+
3767
+ engine_options_->max_valid_backups_to_open = 2;
3768
+ OpenDBAndBackupEngine();
3769
+ std::vector<BackupInfo> backup_infos;
3770
+ backup_engine_->GetBackupInfo(&backup_infos);
3771
+ ASSERT_EQ(3, backup_infos.size());
3772
+ ASSERT_EQ(1, backup_infos[0].backup_id);
3773
+ ASSERT_EQ(2, backup_infos[1].backup_id);
3774
+ ASSERT_EQ(4, backup_infos[2].backup_id);
3775
+ CloseDBAndBackupEngine();
3776
+ DestroyDBWithoutCheck(dbname_, options_);
3777
+ }
3778
+
3779
+ TEST_F(BackupEngineTest, CreateWhenLatestBackupCorrupted) {
3780
+ // we should pick an ID greater than corrupted backups' IDs so creation can
3781
+ // succeed even when latest backup is corrupted.
3782
+ const int kNumKeys = 5000;
3783
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
3784
+ BackupInfo backup_info;
3785
+ ASSERT_TRUE(backup_engine_->GetLatestBackupInfo(&backup_info).IsNotFound());
3786
+ FillDB(db_.get(), 0 /* from */, kNumKeys);
3787
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
3788
+ true /* flush_before_backup */));
3789
+ ASSERT_OK(file_manager_->CorruptFile(backupdir_ + "/meta/1",
3790
+ 3 /* bytes_to_corrupt */));
3791
+ CloseDBAndBackupEngine();
3792
+
3793
+ OpenDBAndBackupEngine();
3794
+ ASSERT_TRUE(backup_engine_->GetLatestBackupInfo(&backup_info).IsNotFound());
3795
+
3796
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
3797
+ true /* flush_before_backup */));
3798
+
3799
+ ASSERT_TRUE(backup_engine_->GetLatestBackupInfo(&backup_info).ok());
3800
+ ASSERT_EQ(2, backup_info.backup_id);
3801
+
3802
+ std::vector<BackupInfo> backup_infos;
3803
+ backup_engine_->GetBackupInfo(&backup_infos);
3804
+ ASSERT_EQ(1, backup_infos.size());
3805
+ ASSERT_EQ(2, backup_infos[0].backup_id);
3806
+
3807
+ // Verify individual GetBackupInfo by ID
3808
+ ASSERT_TRUE(backup_engine_->GetBackupInfo(0U, &backup_info).IsNotFound());
3809
+ ASSERT_TRUE(backup_engine_->GetBackupInfo(1U, &backup_info).IsCorruption());
3810
+ ASSERT_TRUE(backup_engine_->GetBackupInfo(2U, &backup_info).ok());
3811
+ ASSERT_TRUE(backup_engine_->GetBackupInfo(3U, &backup_info).IsNotFound());
3812
+ ASSERT_TRUE(
3813
+ backup_engine_->GetBackupInfo(999999U, &backup_info).IsNotFound());
3814
+ }
3815
+
3816
+ TEST_F(BackupEngineTest, WriteOnlyEngineNoSharedFileDeletion) {
3817
+ // Verifies a write-only BackupEngine does not delete files belonging to valid
3818
+ // backups when GarbageCollect, PurgeOldBackups, or DeleteBackup are called.
3819
+ const int kNumKeys = 5000;
3820
+ for (int i = 0; i < 3; ++i) {
3821
+ OpenDBAndBackupEngine(i == 0 /* destroy_old_data */);
3822
+ FillDB(db_.get(), i * kNumKeys, (i + 1) * kNumKeys);
3823
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
3824
+ CloseDBAndBackupEngine();
3825
+
3826
+ engine_options_->max_valid_backups_to_open = 0;
3827
+ OpenDBAndBackupEngine();
3828
+ switch (i) {
3829
+ case 0:
3830
+ ASSERT_OK(backup_engine_->GarbageCollect());
3831
+ break;
3832
+ case 1:
3833
+ ASSERT_OK(backup_engine_->PurgeOldBackups(1 /* num_backups_to_keep */));
3834
+ break;
3835
+ case 2:
3836
+ ASSERT_OK(backup_engine_->DeleteBackup(2 /* backup_id */));
3837
+ break;
3838
+ default:
3839
+ assert(false);
3840
+ }
3841
+ CloseDBAndBackupEngine();
3842
+
3843
+ engine_options_->max_valid_backups_to_open =
3844
+ std::numeric_limits<int32_t>::max();
3845
+ AssertBackupConsistency(i + 1, 0, (i + 1) * kNumKeys);
3846
+ }
3847
+ }
3848
+
3849
+ TEST_P(BackupEngineTestWithParam, BackupUsingDirectIO) {
3850
+ // Tests direct I/O on the backup engine's reads and writes on the DB env and
3851
+ // backup env
3852
+ // We use ChrootEnv underneath so the below line checks for direct I/O support
3853
+ // in the chroot directory, not the true filesystem root.
3854
+ if (!test::IsDirectIOSupported(test_db_env_.get(), "/")) {
3855
+ ROCKSDB_GTEST_SKIP("Test requires Direct I/O Support");
3856
+ return;
3857
+ }
3858
+ const int kNumKeysPerBackup = 100;
3859
+ const int kNumBackups = 3;
3860
+ options_.use_direct_reads = true;
3861
+ OpenDBAndBackupEngine(true /* destroy_old_data */);
3862
+ for (int i = 0; i < kNumBackups; ++i) {
3863
+ FillDB(db_.get(), i * kNumKeysPerBackup /* from */,
3864
+ (i + 1) * kNumKeysPerBackup /* to */, kFlushAll);
3865
+
3866
+ // Clear the file open counters and then do a bunch of backup engine ops.
3867
+ // For all ops, files should be opened in direct mode.
3868
+ test_backup_fs_->ClearFileOpenCounters();
3869
+ test_db_fs_->ClearFileOpenCounters();
3870
+ CloseBackupEngine();
3871
+ OpenBackupEngine();
3872
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
3873
+ false /* flush_before_backup */));
3874
+ ASSERT_OK(backup_engine_->VerifyBackup(i + 1));
3875
+ CloseBackupEngine();
3876
+ OpenBackupEngine();
3877
+ std::vector<BackupInfo> backup_infos;
3878
+ backup_engine_->GetBackupInfo(&backup_infos);
3879
+ ASSERT_EQ(static_cast<size_t>(i + 1), backup_infos.size());
3880
+
3881
+ // Verify backup engine always opened files with direct I/O
3882
+ ASSERT_EQ(0, test_db_fs_->num_writers());
3883
+ ASSERT_GE(test_db_fs_->num_direct_rand_readers(), 0);
3884
+ ASSERT_GT(test_db_fs_->num_direct_seq_readers(), 0);
3885
+ // Currently the DB doesn't support reading WALs or manifest with direct
3886
+ // I/O, so subtract two.
3887
+ ASSERT_EQ(test_db_fs_->num_seq_readers() - 2,
3888
+ test_db_fs_->num_direct_seq_readers());
3889
+ ASSERT_EQ(test_db_fs_->num_rand_readers(),
3890
+ test_db_fs_->num_direct_rand_readers());
3891
+ }
3892
+ CloseDBAndBackupEngine();
3893
+
3894
+ for (int i = 0; i < kNumBackups; ++i) {
3895
+ AssertBackupConsistency(i + 1 /* backup_id */,
3896
+ i * kNumKeysPerBackup /* start_exist */,
3897
+ (i + 1) * kNumKeysPerBackup /* end_exist */,
3898
+ (i + 2) * kNumKeysPerBackup /* end */);
3899
+ }
3900
+ }
3901
+
3902
+ TEST_F(BackupEngineTest, BackgroundThreadCpuPriority) {
3903
+ std::atomic<CpuPriority> priority(CpuPriority::kNormal);
3904
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
3905
+ "BackupEngineImpl::Initialize:SetCpuPriority", [&](void* new_priority) {
3906
+ priority.store(*reinterpret_cast<CpuPriority*>(new_priority));
3907
+ });
3908
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3909
+
3910
+ // 1 thread is easier to test, otherwise, we may not be sure which thread
3911
+ // actually does the work during CreateNewBackup.
3912
+ engine_options_->max_background_operations = 1;
3913
+ OpenDBAndBackupEngine(true);
3914
+
3915
+ {
3916
+ FillDB(db_.get(), 0, 100);
3917
+
3918
+ // by default, cpu priority is not changed.
3919
+ CreateBackupOptions options;
3920
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
3921
+
3922
+ ASSERT_EQ(priority, CpuPriority::kNormal);
3923
+ }
3924
+
3925
+ {
3926
+ FillDB(db_.get(), 101, 200);
3927
+
3928
+ // decrease cpu priority from normal to low.
3929
+ CreateBackupOptions options;
3930
+ options.decrease_background_thread_cpu_priority = true;
3931
+ options.background_thread_cpu_priority = CpuPriority::kLow;
3932
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
3933
+
3934
+ ASSERT_EQ(priority, CpuPriority::kLow);
3935
+ }
3936
+
3937
+ {
3938
+ FillDB(db_.get(), 201, 300);
3939
+
3940
+ // try to upgrade cpu priority back to normal,
3941
+ // the priority should still low.
3942
+ CreateBackupOptions options;
3943
+ options.decrease_background_thread_cpu_priority = true;
3944
+ options.background_thread_cpu_priority = CpuPriority::kNormal;
3945
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
3946
+
3947
+ ASSERT_EQ(priority, CpuPriority::kLow);
3948
+ }
3949
+
3950
+ {
3951
+ FillDB(db_.get(), 301, 400);
3952
+
3953
+ // decrease cpu priority from low to idle.
3954
+ CreateBackupOptions options;
3955
+ options.decrease_background_thread_cpu_priority = true;
3956
+ options.background_thread_cpu_priority = CpuPriority::kIdle;
3957
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get()));
3958
+
3959
+ ASSERT_EQ(priority, CpuPriority::kIdle);
3960
+ }
3961
+
3962
+ {
3963
+ FillDB(db_.get(), 301, 400);
3964
+
3965
+ // reset priority to later verify that it's not updated by SetCpuPriority.
3966
+ priority = CpuPriority::kNormal;
3967
+
3968
+ // setting the same cpu priority won't call SetCpuPriority.
3969
+ CreateBackupOptions options;
3970
+ options.decrease_background_thread_cpu_priority = true;
3971
+ options.background_thread_cpu_priority = CpuPriority::kIdle;
3972
+
3973
+ // Also check output backup_id with CreateNewBackup
3974
+ BackupID new_id = 0;
3975
+ ASSERT_OK(backup_engine_->CreateNewBackup(options, db_.get(), &new_id));
3976
+ ASSERT_EQ(new_id, 5U);
3977
+
3978
+ ASSERT_EQ(priority, CpuPriority::kNormal);
3979
+ }
3980
+
3981
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3982
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
3983
+ CloseDBAndBackupEngine();
3984
+ DestroyDBWithoutCheck(dbname_, options_);
3985
+ }
3986
+
3987
+ // Populates `*total_size` with the size of all files under `backup_dir`.
3988
+ // We don't go through `BackupEngine` currently because it's hard to figure out
3989
+ // the metadata file size.
3990
+ Status GetSizeOfBackupFiles(FileSystem* backup_fs,
3991
+ const std::string& backup_dir, size_t* total_size) {
3992
+ *total_size = 0;
3993
+ std::vector<std::string> dir_stack = {backup_dir};
3994
+ Status s;
3995
+ while (s.ok() && !dir_stack.empty()) {
3996
+ std::string dir = std::move(dir_stack.back());
3997
+ dir_stack.pop_back();
3998
+ std::vector<std::string> children;
3999
+ s = backup_fs->GetChildren(dir, IOOptions(), &children, nullptr /* dbg */);
4000
+ for (size_t i = 0; s.ok() && i < children.size(); ++i) {
4001
+ std::string path = dir + "/" + children[i];
4002
+ bool is_dir;
4003
+ s = backup_fs->IsDirectory(path, IOOptions(), &is_dir, nullptr /* dbg */);
4004
+ uint64_t file_size = 0;
4005
+ if (s.ok()) {
4006
+ if (is_dir) {
4007
+ dir_stack.emplace_back(std::move(path));
4008
+ } else {
4009
+ s = backup_fs->GetFileSize(path, IOOptions(), &file_size,
4010
+ nullptr /* dbg */);
4011
+ }
4012
+ }
4013
+ if (s.ok()) {
4014
+ *total_size += file_size;
4015
+ }
4016
+ }
4017
+ }
4018
+ return s;
4019
+ }
4020
+
4021
+ TEST_F(BackupEngineTest, IOStats) {
4022
+ // Tests the `BACKUP_READ_BYTES` and `BACKUP_WRITE_BYTES` ticker stats have
4023
+ // the expected values according to the files in the backups.
4024
+
4025
+ // These ticker stats are expected to be populated regardless of `PerfLevel`
4026
+ // in user thread
4027
+ SetPerfLevel(kDisable);
4028
+
4029
+ options_.statistics = CreateDBStatistics();
4030
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
4031
+ kShareWithChecksum);
4032
+
4033
+ FillDB(db_.get(), 0 /* from */, 100 /* to */, kFlushMost);
4034
+
4035
+ ASSERT_EQ(0, options_.statistics->getTickerCount(BACKUP_READ_BYTES));
4036
+ ASSERT_EQ(0, options_.statistics->getTickerCount(BACKUP_WRITE_BYTES));
4037
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
4038
+ false /* flush_before_backup */));
4039
+
4040
+ size_t orig_backup_files_size;
4041
+ ASSERT_OK(GetSizeOfBackupFiles(test_backup_env_->GetFileSystem().get(),
4042
+ backupdir_, &orig_backup_files_size));
4043
+ size_t expected_bytes_written = orig_backup_files_size;
4044
+ ASSERT_EQ(expected_bytes_written,
4045
+ options_.statistics->getTickerCount(BACKUP_WRITE_BYTES));
4046
+ // Bytes read is more difficult to pin down since there are reads for many
4047
+ // purposes other than creating file, like `GetSortedWalFiles()` to find first
4048
+ // sequence number, or `CreateNewBackup()` thread to find SST file session ID.
4049
+ // So we loosely require there are at least as many reads as needed for
4050
+ // copying, but not as many as twice that.
4051
+ ASSERT_GE(options_.statistics->getTickerCount(BACKUP_READ_BYTES),
4052
+ expected_bytes_written);
4053
+ ASSERT_LT(expected_bytes_written,
4054
+ 2 * options_.statistics->getTickerCount(BACKUP_READ_BYTES));
4055
+
4056
+ FillDB(db_.get(), 100 /* from */, 200 /* to */, kFlushMost);
4057
+
4058
+ ASSERT_OK(options_.statistics->Reset());
4059
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(),
4060
+ false /* flush_before_backup */));
4061
+ size_t final_backup_files_size;
4062
+ ASSERT_OK(GetSizeOfBackupFiles(test_backup_env_->GetFileSystem().get(),
4063
+ backupdir_, &final_backup_files_size));
4064
+ expected_bytes_written = final_backup_files_size - orig_backup_files_size;
4065
+ ASSERT_EQ(expected_bytes_written,
4066
+ options_.statistics->getTickerCount(BACKUP_WRITE_BYTES));
4067
+ // See above for why these bounds were chosen.
4068
+ ASSERT_GE(options_.statistics->getTickerCount(BACKUP_READ_BYTES),
4069
+ expected_bytes_written);
4070
+ ASSERT_LT(expected_bytes_written,
4071
+ 2 * options_.statistics->getTickerCount(BACKUP_READ_BYTES));
4072
+ }
4073
+
4074
+ TEST_F(BackupEngineTest, FileTemperatures) {
4075
+ CloseDBAndBackupEngine();
4076
+
4077
+ // Required for recording+restoring temperatures
4078
+ engine_options_->schema_version = 2;
4079
+
4080
+ // More file IO instrumentation
4081
+ auto my_db_fs = std::make_shared<FileTemperatureTestFS>(db_chroot_fs_);
4082
+ test_db_fs_ = std::make_shared<TestFs>(my_db_fs);
4083
+ SetEnvsFromFileSystems();
4084
+
4085
+ // Use temperatures
4086
+ options_.bottommost_temperature = Temperature::kWarm;
4087
+ options_.level0_file_num_compaction_trigger = 2;
4088
+ // set dynamic_level to true so the compaction would compact the data to the
4089
+ // last level directly which will have the last_level_temperature
4090
+ options_.level_compaction_dynamic_level_bytes = true;
4091
+
4092
+ OpenDBAndBackupEngine(true /* destroy_old_data */, false /* dummy */,
4093
+ kShareWithChecksum);
4094
+
4095
+ // generate a bottommost file (combined from 2) and a non-bottommost file
4096
+ DBImpl* dbi = static_cast_with_check<DBImpl>(db_.get());
4097
+ ASSERT_OK(db_->Put(WriteOptions(), "a", "val"));
4098
+ ASSERT_OK(db_->Put(WriteOptions(), "c", "val"));
4099
+ ASSERT_OK(db_->Flush(FlushOptions()));
4100
+ ASSERT_OK(db_->Put(WriteOptions(), "b", "val"));
4101
+ ASSERT_OK(db_->Put(WriteOptions(), "d", "val"));
4102
+ ASSERT_OK(db_->Flush(FlushOptions()));
4103
+ ASSERT_OK(dbi->TEST_WaitForCompact());
4104
+ ASSERT_OK(db_->Put(WriteOptions(), "e", "val"));
4105
+ ASSERT_OK(db_->Flush(FlushOptions()));
4106
+
4107
+ // Get temperatures from manifest
4108
+ std::map<uint64_t, Temperature> manifest_temps;
4109
+ std::map<Temperature, int> manifest_temp_counts;
4110
+ {
4111
+ std::vector<LiveFileStorageInfo> infos;
4112
+ ASSERT_OK(
4113
+ db_->GetLiveFilesStorageInfo(LiveFilesStorageInfoOptions(), &infos));
4114
+ for (auto info : infos) {
4115
+ if (info.file_type == kTableFile) {
4116
+ manifest_temps.emplace(info.file_number, info.temperature);
4117
+ manifest_temp_counts[info.temperature]++;
4118
+ }
4119
+ }
4120
+ }
4121
+
4122
+ // Verify expected manifest temperatures
4123
+ ASSERT_EQ(manifest_temp_counts.size(), 2);
4124
+ ASSERT_EQ(manifest_temp_counts[Temperature::kWarm], 1);
4125
+ ASSERT_EQ(manifest_temp_counts[Temperature::kUnknown], 1);
4126
+
4127
+ // Verify manifest temperatures match FS temperatures
4128
+ std::map<uint64_t, Temperature> current_temps;
4129
+ my_db_fs->CopyCurrentSstFileTemperatures(&current_temps);
4130
+ for (const auto& manifest_temp : manifest_temps) {
4131
+ ASSERT_EQ(current_temps[manifest_temp.first], manifest_temp.second);
4132
+ }
4133
+
4134
+ // Try a few different things
4135
+ for (int i = 1; i <= 5; ++i) {
4136
+ // Expected temperatures after restore are based on manifest temperatures
4137
+ std::map<uint64_t, Temperature> expected_temps = manifest_temps;
4138
+
4139
+ if (i >= 2) {
4140
+ // For iterations 2 & 3, override current temperature of one file
4141
+ // and vary which temperature is authoritative (current or manifest).
4142
+ // For iterations 4 & 5, override current temperature of both files
4143
+ // but make sure an current temperate always takes precedence over
4144
+ // unknown regardless of current_temperatures_override_manifest setting.
4145
+ bool use_current = ((i % 2) == 1);
4146
+ engine_options_->current_temperatures_override_manifest = use_current;
4147
+ CloseBackupEngine();
4148
+ OpenBackupEngine();
4149
+ for (const auto& manifest_temp : manifest_temps) {
4150
+ if (i <= 3) {
4151
+ if (manifest_temp.second == Temperature::kWarm) {
4152
+ my_db_fs->OverrideSstFileTemperature(manifest_temp.first,
4153
+ Temperature::kCold);
4154
+ if (use_current) {
4155
+ expected_temps[manifest_temp.first] = Temperature::kCold;
4156
+ }
4157
+ }
4158
+ } else {
4159
+ assert(i <= 5);
4160
+ if (manifest_temp.second == Temperature::kWarm) {
4161
+ my_db_fs->OverrideSstFileTemperature(manifest_temp.first,
4162
+ Temperature::kUnknown);
4163
+ } else {
4164
+ ASSERT_EQ(manifest_temp.second, Temperature::kUnknown);
4165
+ my_db_fs->OverrideSstFileTemperature(manifest_temp.first,
4166
+ Temperature::kHot);
4167
+ // regardless of use_current
4168
+ expected_temps[manifest_temp.first] = Temperature::kHot;
4169
+ }
4170
+ }
4171
+ }
4172
+ }
4173
+
4174
+ // Sample requested temperatures in opening files for backup
4175
+ my_db_fs->PopRequestedSstFileTemperatures();
4176
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get()));
4177
+
4178
+ // Verify requested temperatures against manifest temperatures (before
4179
+ // retry with kUnknown if needed, and before backup finds out current
4180
+ // temperatures in FileSystem)
4181
+ std::vector<std::pair<uint64_t, Temperature>> requested_temps;
4182
+ my_db_fs->PopRequestedSstFileTemperatures(&requested_temps);
4183
+ std::set<uint64_t> distinct_requests;
4184
+ for (const auto& requested_temp : requested_temps) {
4185
+ // Matching manifest temperatures, except allow retry request with
4186
+ // kUnknown
4187
+ auto manifest_temp = manifest_temps.at(requested_temp.first);
4188
+ if (manifest_temp == Temperature::kUnknown ||
4189
+ requested_temp.second != Temperature::kUnknown) {
4190
+ ASSERT_EQ(manifest_temp, requested_temp.second);
4191
+ }
4192
+ distinct_requests.insert(requested_temp.first);
4193
+ }
4194
+ // Two distinct requests
4195
+ ASSERT_EQ(distinct_requests.size(), 2);
4196
+
4197
+ // Verify against backup info file details API
4198
+ BackupInfo info;
4199
+ ASSERT_OK(backup_engine_->GetLatestBackupInfo(
4200
+ &info, /*include_file_details*/ true));
4201
+ ASSERT_GT(info.file_details.size(), 2);
4202
+ for (auto& e : info.file_details) {
4203
+ EXPECT_EQ(expected_temps[e.file_number], e.temperature);
4204
+ }
4205
+
4206
+ // Restore backup to another virtual (tiered) dir
4207
+ const std::string restore_dir = "/restore" + std::to_string(i);
4208
+ ASSERT_OK(backup_engine_->RestoreDBFromLatestBackup(
4209
+ RestoreOptions(), restore_dir, restore_dir));
4210
+
4211
+ // Verify restored FS temperatures match expectation
4212
+ // (FileTemperatureTestFS doesn't distinguish directories when reporting
4213
+ // current temperatures, just whatever SST was written or overridden last
4214
+ // with that file number.)
4215
+ my_db_fs->CopyCurrentSstFileTemperatures(&current_temps);
4216
+ for (const auto& expected_temp : expected_temps) {
4217
+ ASSERT_EQ(current_temps[expected_temp.first], expected_temp.second);
4218
+ }
4219
+
4220
+ // Delete backup to force next backup to copy files
4221
+ ASSERT_OK(backup_engine_->PurgeOldBackups(0));
4222
+ }
4223
+ }
4224
+
4225
+ TEST_F(BackupEngineTest, ExcludeFiles) {
4226
+ // Required for excluding files
4227
+ engine_options_->schema_version = 2;
4228
+
4229
+ // Need a sufficent set of file numbers
4230
+ options_.level0_file_num_compaction_trigger = 100;
4231
+
4232
+ OpenDBAndBackupEngine(true, false, kShareWithChecksum);
4233
+ // Need a sufficent set of file numbers
4234
+ const int keys_iteration = 5000;
4235
+ FillDB(db_.get(), 0, keys_iteration / 3);
4236
+ FillDB(db_.get(), keys_iteration / 3, keys_iteration * 2 / 3);
4237
+ FillDB(db_.get(), keys_iteration * 2 / 3, keys_iteration);
4238
+ CloseAndReopenDB();
4239
+
4240
+ BackupEngine* alt_backup_engine;
4241
+ BackupEngineOptions alt_engine_options{*engine_options_};
4242
+ // Use an alternate Env to test that support
4243
+ std::string backup_alt_chroot = test::PerThreadDBPath("db_alt_backups");
4244
+ EXPECT_OK(Env::Default()->CreateDirIfMissing(backup_alt_chroot));
4245
+ alt_engine_options.backup_dir = "/altbk";
4246
+ std::shared_ptr<FileSystem> alt_fs{
4247
+ NewChrootFileSystem(FileSystem::Default(), backup_alt_chroot)};
4248
+ std::unique_ptr<Env> alt_env{new CompositeEnvWrapper(Env::Default(), alt_fs)};
4249
+ alt_engine_options.backup_env = alt_env.get();
4250
+
4251
+ ASSERT_OK(BackupEngine::Open(test_db_env_.get(), alt_engine_options,
4252
+ &alt_backup_engine));
4253
+
4254
+ // Ensure each backup is same set of files
4255
+ db_.reset();
4256
+ DB* db = nullptr;
4257
+ ASSERT_OK(DB::OpenForReadOnly(options_, dbname_, &db));
4258
+
4259
+ // A callback that throws should cleanly fail the backup creation.
4260
+ // Do this early to ensure later operations still work.
4261
+ CreateBackupOptions cbo;
4262
+ cbo.exclude_files_callback = [](MaybeExcludeBackupFile* /*files_begin*/,
4263
+ MaybeExcludeBackupFile* /*files_end*/) {
4264
+ throw 42;
4265
+ };
4266
+ ASSERT_TRUE(backup_engine_->CreateNewBackup(cbo, db).IsAborted());
4267
+ cbo.exclude_files_callback = [](MaybeExcludeBackupFile* /*files_begin*/,
4268
+ MaybeExcludeBackupFile* /*files_end*/) {
4269
+ throw std::out_of_range("blah");
4270
+ };
4271
+ ASSERT_TRUE(backup_engine_->CreateNewBackup(cbo, db).IsAborted());
4272
+
4273
+ // Include files only in given bucket, based on modulus and remainder
4274
+ constexpr int modulus = 4;
4275
+ int remainder = 0;
4276
+
4277
+ cbo.exclude_files_callback = [&remainder](MaybeExcludeBackupFile* files_begin,
4278
+ MaybeExcludeBackupFile* files_end) {
4279
+ for (auto* f = files_begin; f != files_end; ++f) {
4280
+ std::string s = StringSplit(f->info.relative_file, '/').back();
4281
+ s = s.substr(0, s.find("_"));
4282
+ int64_t num = std::strtoll(s.c_str(), nullptr, /*base*/ 10);
4283
+ // Exclude if not a match
4284
+ f->exclude_decision = (num % modulus) != remainder;
4285
+ }
4286
+ };
4287
+
4288
+ BackupID first_id{};
4289
+ BackupID last_alt_id{};
4290
+ remainder = 0;
4291
+ ASSERT_OK(backup_engine_->CreateNewBackup(cbo, db, &first_id));
4292
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4293
+ remainder = 1;
4294
+ ASSERT_OK(alt_backup_engine->CreateNewBackup(cbo, db));
4295
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4296
+ remainder = 2;
4297
+ ASSERT_OK(backup_engine_->CreateNewBackup(cbo, db));
4298
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4299
+ remainder = 3;
4300
+ ASSERT_OK(alt_backup_engine->CreateNewBackup(cbo, db, &last_alt_id));
4301
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4302
+
4303
+ // Close DB
4304
+ ASSERT_OK(db->Close());
4305
+ delete db;
4306
+ db = nullptr;
4307
+
4308
+ for (auto be_pair :
4309
+ {std::make_pair(backup_engine_.get(), alt_backup_engine),
4310
+ std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4311
+ DestroyDB(dbname_, options_);
4312
+ RestoreOptions ro;
4313
+ // Fails without alternate dir
4314
+ ASSERT_TRUE(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro)
4315
+ .IsInvalidArgument());
4316
+
4317
+ DestroyDB(dbname_, options_);
4318
+ // Works with alternate dir
4319
+ ro.alternate_dirs.push_front(be_pair.second);
4320
+ ASSERT_OK(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro));
4321
+
4322
+ // Check DB contents
4323
+ db = OpenDB();
4324
+ AssertExists(db, 0, keys_iteration);
4325
+ delete db;
4326
+ }
4327
+
4328
+ // Should still work after close and re-open
4329
+ CloseBackupEngine();
4330
+ OpenBackupEngine();
4331
+
4332
+ for (auto be_pair :
4333
+ {std::make_pair(backup_engine_.get(), alt_backup_engine),
4334
+ std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4335
+ DestroyDB(dbname_, options_);
4336
+ RestoreOptions ro;
4337
+ ro.alternate_dirs.push_front(be_pair.second);
4338
+ ASSERT_OK(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro));
4339
+ }
4340
+
4341
+ // Deletion semantics are tricky when within a single backup dir one backup
4342
+ // includes a file and the other backup excluded the file. The excluded one
4343
+ // does not have a persistent record of metadata like file checksum, etc.
4344
+ // Although it would be possible to amend the backup with the excluded file,
4345
+ // that is not currently supported (unless you open the backup as read-only
4346
+ // DB and take another backup of it). The "excluded" reference to the file
4347
+ // is like a weak reference: it doesn't prevent the file from being deleted
4348
+ // if all the backups with "included" references to it are deleted.
4349
+ CloseBackupEngine();
4350
+ OpenBackupEngine();
4351
+
4352
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4353
+
4354
+ ASSERT_OK(backup_engine_->DeleteBackup(first_id));
4355
+ ASSERT_OK(alt_backup_engine->DeleteBackup(last_alt_id));
4356
+
4357
+ // Includes check for any leaked backup files
4358
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4359
+
4360
+ // Excluded file(s) deleted, unable to restore
4361
+ for (auto be_pair :
4362
+ {std::make_pair(backup_engine_.get(), alt_backup_engine),
4363
+ std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4364
+ RestoreOptions ro;
4365
+ ro.alternate_dirs.push_front(be_pair.second);
4366
+ ASSERT_TRUE(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro)
4367
+ .IsInvalidArgument());
4368
+ }
4369
+
4370
+ // Close & Re-open (no crash, etc.)
4371
+ CloseBackupEngine();
4372
+ OpenBackupEngine();
4373
+
4374
+ AssertBackupInfoConsistency(/*allow excluded*/ true);
4375
+
4376
+ // Excluded file(s) deleted, unable to restore
4377
+ for (auto be_pair :
4378
+ {std::make_pair(backup_engine_.get(), alt_backup_engine),
4379
+ std::make_pair(alt_backup_engine, backup_engine_.get())}) {
4380
+ RestoreOptions ro;
4381
+ ro.alternate_dirs.push_front(be_pair.second);
4382
+ ASSERT_TRUE(be_pair.first->RestoreDBFromLatestBackup(dbname_, dbname_, ro)
4383
+ .IsInvalidArgument());
4384
+ }
4385
+
4386
+ // Ensure files are not leaked after removing everything.
4387
+ ASSERT_OK(backup_engine_->DeleteBackup(first_id + 1));
4388
+ ASSERT_OK(alt_backup_engine->DeleteBackup(last_alt_id - 1));
4389
+
4390
+ // Includes check for leaked backups files
4391
+ AssertBackupInfoConsistency(/*allow excluded*/ false);
4392
+
4393
+ delete alt_backup_engine;
4394
+ }
4395
+
4396
+ } // namespace
4397
+
4398
+ } // namespace ROCKSDB_NAMESPACE
4399
+
4400
+ int main(int argc, char** argv) {
4401
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
4402
+ ::testing::InitGoogleTest(&argc, argv);
4403
+ return RUN_ALL_TESTS();
4404
+ }
4405
+
4406
+ #else
4407
+ #include <stdio.h>
4408
+
4409
+ int main(int /*argc*/, char** /*argv*/) {
4410
+ fprintf(stderr, "SKIPPED as BackupEngine is not supported in Windows\n");
4411
+ return 0;
4412
+ }
4413
+
4414
+ #endif // !defined(OS_WIN)