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,3980 @@
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
+ #include <cinttypes>
10
+ #include <deque>
11
+
12
+ #include "db/builder.h"
13
+ #include "db/db_impl/db_impl.h"
14
+ #include "db/error_handler.h"
15
+ #include "db/event_helpers.h"
16
+ #include "file/sst_file_manager_impl.h"
17
+ #include "logging/logging.h"
18
+ #include "monitoring/iostats_context_imp.h"
19
+ #include "monitoring/perf_context_imp.h"
20
+ #include "monitoring/thread_status_updater.h"
21
+ #include "monitoring/thread_status_util.h"
22
+ #include "test_util/sync_point.h"
23
+ #include "util/cast_util.h"
24
+ #include "util/concurrent_task_limiter_impl.h"
25
+
26
+ namespace ROCKSDB_NAMESPACE {
27
+
28
+ bool DBImpl::EnoughRoomForCompaction(
29
+ ColumnFamilyData* cfd, const std::vector<CompactionInputFiles>& inputs,
30
+ bool* sfm_reserved_compact_space, LogBuffer* log_buffer) {
31
+ // Check if we have enough room to do the compaction
32
+ bool enough_room = true;
33
+ auto sfm = static_cast<SstFileManagerImpl*>(
34
+ immutable_db_options_.sst_file_manager.get());
35
+ if (sfm) {
36
+ // Pass the current bg_error_ to SFM so it can decide what checks to
37
+ // perform. If this DB instance hasn't seen any error yet, the SFM can be
38
+ // optimistic and not do disk space checks
39
+ Status bg_error = error_handler_.GetBGError();
40
+ enough_room = sfm->EnoughRoomForCompaction(cfd, inputs, bg_error);
41
+ bg_error.PermitUncheckedError(); // bg_error is just a copy of the Status
42
+ // from the error_handler_
43
+ if (enough_room) {
44
+ *sfm_reserved_compact_space = true;
45
+ }
46
+ }
47
+ if (!enough_room) {
48
+ // Just in case tests want to change the value of enough_room
49
+ TEST_SYNC_POINT_CALLBACK(
50
+ "DBImpl::BackgroundCompaction():CancelledCompaction", &enough_room);
51
+ ROCKS_LOG_BUFFER(log_buffer,
52
+ "Cancelled compaction because not enough room");
53
+ RecordTick(stats_, COMPACTION_CANCELLED, 1);
54
+ }
55
+ return enough_room;
56
+ }
57
+
58
+ bool DBImpl::RequestCompactionToken(ColumnFamilyData* cfd, bool force,
59
+ std::unique_ptr<TaskLimiterToken>* token,
60
+ LogBuffer* log_buffer) {
61
+ assert(*token == nullptr);
62
+ auto limiter = static_cast<ConcurrentTaskLimiterImpl*>(
63
+ cfd->ioptions()->compaction_thread_limiter.get());
64
+ if (limiter == nullptr) {
65
+ return true;
66
+ }
67
+ *token = limiter->GetToken(force);
68
+ if (*token != nullptr) {
69
+ ROCKS_LOG_BUFFER(log_buffer,
70
+ "Thread limiter [%s] increase [%s] compaction task, "
71
+ "force: %s, tasks after: %d",
72
+ limiter->GetName().c_str(), cfd->GetName().c_str(),
73
+ force ? "true" : "false", limiter->GetOutstandingTask());
74
+ return true;
75
+ }
76
+ return false;
77
+ }
78
+
79
+ IOStatus DBImpl::SyncClosedLogs(JobContext* job_context,
80
+ VersionEdit* synced_wals) {
81
+ TEST_SYNC_POINT("DBImpl::SyncClosedLogs:Start");
82
+ InstrumentedMutexLock l(&log_write_mutex_);
83
+ autovector<log::Writer*, 1> logs_to_sync;
84
+ uint64_t current_log_number = logfile_number_;
85
+ while (logs_.front().number < current_log_number &&
86
+ logs_.front().IsSyncing()) {
87
+ log_sync_cv_.Wait();
88
+ }
89
+ for (auto it = logs_.begin();
90
+ it != logs_.end() && it->number < current_log_number; ++it) {
91
+ auto& log = *it;
92
+ log.PrepareForSync();
93
+ logs_to_sync.push_back(log.writer);
94
+ }
95
+
96
+ IOStatus io_s;
97
+ if (!logs_to_sync.empty()) {
98
+ log_write_mutex_.Unlock();
99
+
100
+ assert(job_context);
101
+
102
+ for (log::Writer* log : logs_to_sync) {
103
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
104
+ "[JOB %d] Syncing log #%" PRIu64, job_context->job_id,
105
+ log->get_log_number());
106
+ if (error_handler_.IsRecoveryInProgress()) {
107
+ log->file()->reset_seen_error();
108
+ }
109
+ io_s = log->file()->Sync(immutable_db_options_.use_fsync);
110
+ if (!io_s.ok()) {
111
+ break;
112
+ }
113
+
114
+ if (immutable_db_options_.recycle_log_file_num > 0) {
115
+ if (error_handler_.IsRecoveryInProgress()) {
116
+ log->file()->reset_seen_error();
117
+ }
118
+ io_s = log->Close();
119
+ if (!io_s.ok()) {
120
+ break;
121
+ }
122
+ }
123
+ }
124
+ if (io_s.ok()) {
125
+ io_s = directories_.GetWalDir()->FsyncWithDirOptions(
126
+ IOOptions(), nullptr,
127
+ DirFsyncOptions(DirFsyncOptions::FsyncReason::kNewFileSynced));
128
+ }
129
+
130
+ TEST_SYNC_POINT_CALLBACK("DBImpl::SyncClosedLogs:BeforeReLock",
131
+ /*arg=*/nullptr);
132
+ log_write_mutex_.Lock();
133
+
134
+ // "number <= current_log_number - 1" is equivalent to
135
+ // "number < current_log_number".
136
+ if (io_s.ok()) {
137
+ MarkLogsSynced(current_log_number - 1, true, synced_wals);
138
+ } else {
139
+ MarkLogsNotSynced(current_log_number - 1);
140
+ }
141
+ if (!io_s.ok()) {
142
+ TEST_SYNC_POINT("DBImpl::SyncClosedLogs:Failed");
143
+ return io_s;
144
+ }
145
+ }
146
+ TEST_SYNC_POINT("DBImpl::SyncClosedLogs:end");
147
+ return io_s;
148
+ }
149
+
150
+ Status DBImpl::FlushMemTableToOutputFile(
151
+ ColumnFamilyData* cfd, const MutableCFOptions& mutable_cf_options,
152
+ bool* made_progress, JobContext* job_context, FlushReason flush_reason,
153
+ SuperVersionContext* superversion_context,
154
+ std::vector<SequenceNumber>& snapshot_seqs,
155
+ SequenceNumber earliest_write_conflict_snapshot,
156
+ SnapshotChecker* snapshot_checker, LogBuffer* log_buffer,
157
+ Env::Priority thread_pri) {
158
+ mutex_.AssertHeld();
159
+ assert(cfd);
160
+ assert(cfd->imm());
161
+ assert(cfd->imm()->NumNotFlushed() != 0);
162
+ assert(cfd->imm()->IsFlushPending());
163
+ assert(versions_);
164
+ assert(versions_->GetColumnFamilySet());
165
+ // If there are more than one column families, we need to make sure that
166
+ // all the log files except the most recent one are synced. Otherwise if
167
+ // the host crashes after flushing and before WAL is persistent, the
168
+ // flushed SST may contain data from write batches whose updates to
169
+ // other (unflushed) column families are missing.
170
+ const bool needs_to_sync_closed_wals =
171
+ logfile_number_ > 0 &&
172
+ versions_->GetColumnFamilySet()->NumberOfColumnFamilies() > 1;
173
+
174
+ // If needs_to_sync_closed_wals is true, we need to record the current
175
+ // maximum memtable ID of this column family so that a later PickMemtables()
176
+ // call will not pick memtables whose IDs are higher. This is due to the fact
177
+ // that SyncClosedLogs() may release the db mutex, and memtable switch can
178
+ // happen for this column family in the meantime. The newly created memtables
179
+ // have their data backed by unsynced WALs, thus they cannot be included in
180
+ // this flush job.
181
+ // Another reason why we must record the current maximum memtable ID of this
182
+ // column family: SyncClosedLogs() may release db mutex, thus it's possible
183
+ // for application to continue to insert into memtables increasing db's
184
+ // sequence number. The application may take a snapshot, but this snapshot is
185
+ // not included in `snapshot_seqs` which will be passed to flush job because
186
+ // `snapshot_seqs` has already been computed before this function starts.
187
+ // Recording the max memtable ID ensures that the flush job does not flush
188
+ // a memtable without knowing such snapshot(s).
189
+ uint64_t max_memtable_id = needs_to_sync_closed_wals
190
+ ? cfd->imm()->GetLatestMemTableID()
191
+ : std::numeric_limits<uint64_t>::max();
192
+
193
+ // If needs_to_sync_closed_wals is false, then the flush job will pick ALL
194
+ // existing memtables of the column family when PickMemTable() is called
195
+ // later. Although we won't call SyncClosedLogs() in this case, we may still
196
+ // call the callbacks of the listeners, i.e. NotifyOnFlushBegin() which also
197
+ // releases and re-acquires the db mutex. In the meantime, the application
198
+ // can still insert into the memtables and increase the db's sequence number.
199
+ // The application can take a snapshot, hoping that the latest visible state
200
+ // to this snapshto is preserved. This is hard to guarantee since db mutex
201
+ // not held. This newly-created snapshot is not included in `snapshot_seqs`
202
+ // and the flush job is unaware of its presence. Consequently, the flush job
203
+ // may drop certain keys when generating the L0, causing incorrect data to be
204
+ // returned for snapshot read using this snapshot.
205
+ // To address this, we make sure NotifyOnFlushBegin() executes after memtable
206
+ // picking so that no new snapshot can be taken between the two functions.
207
+
208
+ FlushJob flush_job(
209
+ dbname_, cfd, immutable_db_options_, mutable_cf_options, max_memtable_id,
210
+ file_options_for_compaction_, versions_.get(), &mutex_, &shutting_down_,
211
+ snapshot_seqs, earliest_write_conflict_snapshot, snapshot_checker,
212
+ job_context, flush_reason, log_buffer, directories_.GetDbDir(),
213
+ GetDataDir(cfd, 0U),
214
+ GetCompressionFlush(*cfd->ioptions(), mutable_cf_options), stats_,
215
+ &event_logger_, mutable_cf_options.report_bg_io_stats,
216
+ true /* sync_output_directory */, true /* write_manifest */, thread_pri,
217
+ io_tracer_, seqno_time_mapping_, db_id_, db_session_id_,
218
+ cfd->GetFullHistoryTsLow(), &blob_callback_);
219
+ FileMetaData file_meta;
220
+
221
+ Status s;
222
+ bool need_cancel = false;
223
+ IOStatus log_io_s = IOStatus::OK();
224
+ if (needs_to_sync_closed_wals) {
225
+ // SyncClosedLogs() may unlock and re-lock the log_write_mutex multiple
226
+ // times.
227
+ VersionEdit synced_wals;
228
+ mutex_.Unlock();
229
+ log_io_s = SyncClosedLogs(job_context, &synced_wals);
230
+ mutex_.Lock();
231
+ if (log_io_s.ok() && synced_wals.IsWalAddition()) {
232
+ const ReadOptions read_options(Env::IOActivity::kFlush);
233
+ log_io_s =
234
+ status_to_io_status(ApplyWALToManifest(read_options, &synced_wals));
235
+ TEST_SYNC_POINT_CALLBACK("DBImpl::FlushMemTableToOutputFile:CommitWal:1",
236
+ nullptr);
237
+ }
238
+
239
+ if (!log_io_s.ok() && !log_io_s.IsShutdownInProgress() &&
240
+ !log_io_s.IsColumnFamilyDropped()) {
241
+ error_handler_.SetBGError(log_io_s, BackgroundErrorReason::kFlush);
242
+ }
243
+ } else {
244
+ TEST_SYNC_POINT("DBImpl::SyncClosedLogs:Skip");
245
+ }
246
+ s = log_io_s;
247
+
248
+ // If the log sync failed, we do not need to pick memtable. Otherwise,
249
+ // num_flush_not_started_ needs to be rollback.
250
+ TEST_SYNC_POINT("DBImpl::FlushMemTableToOutputFile:BeforePickMemtables");
251
+ if (s.ok()) {
252
+ flush_job.PickMemTable();
253
+ need_cancel = true;
254
+ }
255
+ TEST_SYNC_POINT_CALLBACK(
256
+ "DBImpl::FlushMemTableToOutputFile:AfterPickMemtables", &flush_job);
257
+
258
+ // may temporarily unlock and lock the mutex.
259
+ NotifyOnFlushBegin(cfd, &file_meta, mutable_cf_options, job_context->job_id,
260
+ flush_reason);
261
+
262
+ bool switched_to_mempurge = false;
263
+ // Within flush_job.Run, rocksdb may call event listener to notify
264
+ // file creation and deletion.
265
+ //
266
+ // Note that flush_job.Run will unlock and lock the db_mutex,
267
+ // and EventListener callback will be called when the db_mutex
268
+ // is unlocked by the current thread.
269
+ if (s.ok()) {
270
+ s = flush_job.Run(&logs_with_prep_tracker_, &file_meta,
271
+ &switched_to_mempurge);
272
+ need_cancel = false;
273
+ }
274
+
275
+ if (!s.ok() && need_cancel) {
276
+ flush_job.Cancel();
277
+ }
278
+
279
+ if (s.ok()) {
280
+ InstallSuperVersionAndScheduleWork(cfd, superversion_context,
281
+ mutable_cf_options);
282
+ if (made_progress) {
283
+ *made_progress = true;
284
+ }
285
+
286
+ const std::string& column_family_name = cfd->GetName();
287
+
288
+ Version* const current = cfd->current();
289
+ assert(current);
290
+
291
+ const VersionStorageInfo* const storage_info = current->storage_info();
292
+ assert(storage_info);
293
+
294
+ VersionStorageInfo::LevelSummaryStorage tmp;
295
+ ROCKS_LOG_BUFFER(log_buffer, "[%s] Level summary: %s\n",
296
+ column_family_name.c_str(),
297
+ storage_info->LevelSummary(&tmp));
298
+
299
+ const auto& blob_files = storage_info->GetBlobFiles();
300
+ if (!blob_files.empty()) {
301
+ assert(blob_files.front());
302
+ assert(blob_files.back());
303
+
304
+ ROCKS_LOG_BUFFER(
305
+ log_buffer,
306
+ "[%s] Blob file summary: head=%" PRIu64 ", tail=%" PRIu64 "\n",
307
+ column_family_name.c_str(), blob_files.front()->GetBlobFileNumber(),
308
+ blob_files.back()->GetBlobFileNumber());
309
+ }
310
+ }
311
+
312
+ if (!s.ok() && !s.IsShutdownInProgress() && !s.IsColumnFamilyDropped()) {
313
+ if (log_io_s.ok()) {
314
+ // Error while writing to MANIFEST.
315
+ // In fact, versions_->io_status() can also be the result of renaming
316
+ // CURRENT file. With current code, it's just difficult to tell. So just
317
+ // be pessimistic and try write to a new MANIFEST.
318
+ // TODO: distinguish between MANIFEST write and CURRENT renaming
319
+ if (!versions_->io_status().ok()) {
320
+ // If WAL sync is successful (either WAL size is 0 or there is no IO
321
+ // error), all the Manifest write will be map to soft error.
322
+ // TODO: kManifestWriteNoWAL and kFlushNoWAL are misleading. Refactor is
323
+ // needed.
324
+ error_handler_.SetBGError(s,
325
+ BackgroundErrorReason::kManifestWriteNoWAL);
326
+ } else {
327
+ // If WAL sync is successful (either WAL size is 0 or there is no IO
328
+ // error), all the other SST file write errors will be set as
329
+ // kFlushNoWAL.
330
+ error_handler_.SetBGError(s, BackgroundErrorReason::kFlushNoWAL);
331
+ }
332
+ } else {
333
+ assert(s == log_io_s);
334
+ Status new_bg_error = s;
335
+ error_handler_.SetBGError(new_bg_error, BackgroundErrorReason::kFlush);
336
+ }
337
+ }
338
+ // If flush ran smoothly and no mempurge happened
339
+ // install new SST file path.
340
+ if (s.ok() && (!switched_to_mempurge)) {
341
+ // may temporarily unlock and lock the mutex.
342
+ NotifyOnFlushCompleted(cfd, mutable_cf_options,
343
+ flush_job.GetCommittedFlushJobsInfo());
344
+ auto sfm = static_cast<SstFileManagerImpl*>(
345
+ immutable_db_options_.sst_file_manager.get());
346
+ if (sfm) {
347
+ // Notify sst_file_manager that a new file was added
348
+ std::string file_path = MakeTableFileName(
349
+ cfd->ioptions()->cf_paths[0].path, file_meta.fd.GetNumber());
350
+ // TODO (PR7798). We should only add the file to the FileManager if it
351
+ // exists. Otherwise, some tests may fail. Ignore the error in the
352
+ // interim.
353
+ sfm->OnAddFile(file_path).PermitUncheckedError();
354
+ if (sfm->IsMaxAllowedSpaceReached()) {
355
+ Status new_bg_error =
356
+ Status::SpaceLimit("Max allowed space was reached");
357
+ TEST_SYNC_POINT_CALLBACK(
358
+ "DBImpl::FlushMemTableToOutputFile:MaxAllowedSpaceReached",
359
+ &new_bg_error);
360
+ error_handler_.SetBGError(new_bg_error, BackgroundErrorReason::kFlush);
361
+ }
362
+ }
363
+ }
364
+ TEST_SYNC_POINT("DBImpl::FlushMemTableToOutputFile:Finish");
365
+ return s;
366
+ }
367
+
368
+ Status DBImpl::FlushMemTablesToOutputFiles(
369
+ const autovector<BGFlushArg>& bg_flush_args, bool* made_progress,
370
+ JobContext* job_context, LogBuffer* log_buffer, Env::Priority thread_pri) {
371
+ if (immutable_db_options_.atomic_flush) {
372
+ return AtomicFlushMemTablesToOutputFiles(
373
+ bg_flush_args, made_progress, job_context, log_buffer, thread_pri);
374
+ }
375
+ assert(bg_flush_args.size() == 1);
376
+ std::vector<SequenceNumber> snapshot_seqs;
377
+ SequenceNumber earliest_write_conflict_snapshot;
378
+ SnapshotChecker* snapshot_checker;
379
+ GetSnapshotContext(job_context, &snapshot_seqs,
380
+ &earliest_write_conflict_snapshot, &snapshot_checker);
381
+ const auto& bg_flush_arg = bg_flush_args[0];
382
+ ColumnFamilyData* cfd = bg_flush_arg.cfd_;
383
+ // intentional infrequent copy for each flush
384
+ MutableCFOptions mutable_cf_options_copy = *cfd->GetLatestMutableCFOptions();
385
+ SuperVersionContext* superversion_context =
386
+ bg_flush_arg.superversion_context_;
387
+ FlushReason flush_reason = bg_flush_arg.flush_reason_;
388
+ Status s = FlushMemTableToOutputFile(
389
+ cfd, mutable_cf_options_copy, made_progress, job_context, flush_reason,
390
+ superversion_context, snapshot_seqs, earliest_write_conflict_snapshot,
391
+ snapshot_checker, log_buffer, thread_pri);
392
+ return s;
393
+ }
394
+
395
+ /*
396
+ * Atomically flushes multiple column families.
397
+ *
398
+ * For each column family, all memtables with ID smaller than or equal to the
399
+ * ID specified in bg_flush_args will be flushed. Only after all column
400
+ * families finish flush will this function commit to MANIFEST. If any of the
401
+ * column families are not flushed successfully, this function does not have
402
+ * any side-effect on the state of the database.
403
+ */
404
+ Status DBImpl::AtomicFlushMemTablesToOutputFiles(
405
+ const autovector<BGFlushArg>& bg_flush_args, bool* made_progress,
406
+ JobContext* job_context, LogBuffer* log_buffer, Env::Priority thread_pri) {
407
+ mutex_.AssertHeld();
408
+
409
+ autovector<ColumnFamilyData*> cfds;
410
+ for (const auto& arg : bg_flush_args) {
411
+ cfds.emplace_back(arg.cfd_);
412
+ }
413
+
414
+ #ifndef NDEBUG
415
+ for (const auto cfd : cfds) {
416
+ assert(cfd->imm()->NumNotFlushed() != 0);
417
+ assert(cfd->imm()->IsFlushPending());
418
+ }
419
+ for (const auto& bg_flush_arg : bg_flush_args) {
420
+ assert(bg_flush_arg.flush_reason_ == bg_flush_args[0].flush_reason_);
421
+ }
422
+ #endif /* !NDEBUG */
423
+
424
+ std::vector<SequenceNumber> snapshot_seqs;
425
+ SequenceNumber earliest_write_conflict_snapshot;
426
+ SnapshotChecker* snapshot_checker;
427
+ GetSnapshotContext(job_context, &snapshot_seqs,
428
+ &earliest_write_conflict_snapshot, &snapshot_checker);
429
+
430
+ autovector<FSDirectory*> distinct_output_dirs;
431
+ autovector<std::string> distinct_output_dir_paths;
432
+ std::vector<std::unique_ptr<FlushJob>> jobs;
433
+ std::vector<MutableCFOptions> all_mutable_cf_options;
434
+ int num_cfs = static_cast<int>(cfds.size());
435
+ all_mutable_cf_options.reserve(num_cfs);
436
+ for (int i = 0; i < num_cfs; ++i) {
437
+ auto cfd = cfds[i];
438
+ FSDirectory* data_dir = GetDataDir(cfd, 0U);
439
+ const std::string& curr_path = cfd->ioptions()->cf_paths[0].path;
440
+
441
+ // Add to distinct output directories if eligible. Use linear search. Since
442
+ // the number of elements in the vector is not large, performance should be
443
+ // tolerable.
444
+ bool found = false;
445
+ for (const auto& path : distinct_output_dir_paths) {
446
+ if (path == curr_path) {
447
+ found = true;
448
+ break;
449
+ }
450
+ }
451
+ if (!found) {
452
+ distinct_output_dir_paths.emplace_back(curr_path);
453
+ distinct_output_dirs.emplace_back(data_dir);
454
+ }
455
+
456
+ all_mutable_cf_options.emplace_back(*cfd->GetLatestMutableCFOptions());
457
+ const MutableCFOptions& mutable_cf_options = all_mutable_cf_options.back();
458
+ uint64_t max_memtable_id = bg_flush_args[i].max_memtable_id_;
459
+ FlushReason flush_reason = bg_flush_args[i].flush_reason_;
460
+ jobs.emplace_back(new FlushJob(
461
+ dbname_, cfd, immutable_db_options_, mutable_cf_options,
462
+ max_memtable_id, file_options_for_compaction_, versions_.get(), &mutex_,
463
+ &shutting_down_, snapshot_seqs, earliest_write_conflict_snapshot,
464
+ snapshot_checker, job_context, flush_reason, log_buffer,
465
+ directories_.GetDbDir(), data_dir,
466
+ GetCompressionFlush(*cfd->ioptions(), mutable_cf_options), stats_,
467
+ &event_logger_, mutable_cf_options.report_bg_io_stats,
468
+ false /* sync_output_directory */, false /* write_manifest */,
469
+ thread_pri, io_tracer_, seqno_time_mapping_, db_id_, db_session_id_,
470
+ cfd->GetFullHistoryTsLow(), &blob_callback_));
471
+ }
472
+
473
+ std::vector<FileMetaData> file_meta(num_cfs);
474
+ // Use of deque<bool> because vector<bool>
475
+ // is specific and doesn't allow &v[i].
476
+ std::deque<bool> switched_to_mempurge(num_cfs, false);
477
+ Status s;
478
+ IOStatus log_io_s = IOStatus::OK();
479
+ assert(num_cfs == static_cast<int>(jobs.size()));
480
+
481
+ for (int i = 0; i != num_cfs; ++i) {
482
+ const MutableCFOptions& mutable_cf_options = all_mutable_cf_options.at(i);
483
+ // may temporarily unlock and lock the mutex.
484
+ FlushReason flush_reason = bg_flush_args[i].flush_reason_;
485
+ NotifyOnFlushBegin(cfds[i], &file_meta[i], mutable_cf_options,
486
+ job_context->job_id, flush_reason);
487
+ }
488
+
489
+ if (logfile_number_ > 0) {
490
+ // TODO (yanqin) investigate whether we should sync the closed logs for
491
+ // single column family case.
492
+ VersionEdit synced_wals;
493
+ mutex_.Unlock();
494
+ log_io_s = SyncClosedLogs(job_context, &synced_wals);
495
+ mutex_.Lock();
496
+ if (log_io_s.ok() && synced_wals.IsWalAddition()) {
497
+ const ReadOptions read_options(Env::IOActivity::kFlush);
498
+ log_io_s =
499
+ status_to_io_status(ApplyWALToManifest(read_options, &synced_wals));
500
+ }
501
+
502
+ if (!log_io_s.ok() && !log_io_s.IsShutdownInProgress() &&
503
+ !log_io_s.IsColumnFamilyDropped()) {
504
+ if (total_log_size_ > 0) {
505
+ error_handler_.SetBGError(log_io_s, BackgroundErrorReason::kFlush);
506
+ } else {
507
+ // If the WAL is empty, we use different error reason
508
+ error_handler_.SetBGError(log_io_s, BackgroundErrorReason::kFlushNoWAL);
509
+ }
510
+ }
511
+ }
512
+ s = log_io_s;
513
+
514
+ // exec_status stores the execution status of flush_jobs as
515
+ // <bool /* executed */, Status /* status code */>
516
+ autovector<std::pair<bool, Status>> exec_status;
517
+ std::vector<bool> pick_status;
518
+ for (int i = 0; i != num_cfs; ++i) {
519
+ // Initially all jobs are not executed, with status OK.
520
+ exec_status.emplace_back(false, Status::OK());
521
+ pick_status.push_back(false);
522
+ }
523
+
524
+ if (s.ok()) {
525
+ for (int i = 0; i != num_cfs; ++i) {
526
+ jobs[i]->PickMemTable();
527
+ pick_status[i] = true;
528
+ }
529
+ }
530
+
531
+ if (s.ok()) {
532
+ assert(switched_to_mempurge.size() ==
533
+ static_cast<long unsigned int>(num_cfs));
534
+ // TODO (yanqin): parallelize jobs with threads.
535
+ for (int i = 1; i != num_cfs; ++i) {
536
+ exec_status[i].second =
537
+ jobs[i]->Run(&logs_with_prep_tracker_, &file_meta[i],
538
+ &(switched_to_mempurge.at(i)));
539
+ exec_status[i].first = true;
540
+ }
541
+ if (num_cfs > 1) {
542
+ TEST_SYNC_POINT(
543
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:SomeFlushJobsComplete:1");
544
+ TEST_SYNC_POINT(
545
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:SomeFlushJobsComplete:2");
546
+ }
547
+ assert(exec_status.size() > 0);
548
+ assert(!file_meta.empty());
549
+ exec_status[0].second = jobs[0]->Run(
550
+ &logs_with_prep_tracker_, file_meta.data() /* &file_meta[0] */,
551
+ switched_to_mempurge.empty() ? nullptr : &(switched_to_mempurge.at(0)));
552
+ exec_status[0].first = true;
553
+
554
+ Status error_status;
555
+ for (const auto& e : exec_status) {
556
+ if (!e.second.ok()) {
557
+ s = e.second;
558
+ if (!e.second.IsShutdownInProgress() &&
559
+ !e.second.IsColumnFamilyDropped()) {
560
+ // If a flush job did not return OK, and the CF is not dropped, and
561
+ // the DB is not shutting down, then we have to return this result to
562
+ // caller later.
563
+ error_status = e.second;
564
+ }
565
+ }
566
+ }
567
+
568
+ s = error_status.ok() ? s : error_status;
569
+ }
570
+
571
+ if (s.IsColumnFamilyDropped()) {
572
+ s = Status::OK();
573
+ }
574
+
575
+ if (s.ok() || s.IsShutdownInProgress()) {
576
+ // Sync on all distinct output directories.
577
+ for (auto dir : distinct_output_dirs) {
578
+ if (dir != nullptr) {
579
+ Status error_status = dir->FsyncWithDirOptions(
580
+ IOOptions(), nullptr,
581
+ DirFsyncOptions(DirFsyncOptions::FsyncReason::kNewFileSynced));
582
+ if (!error_status.ok()) {
583
+ s = error_status;
584
+ break;
585
+ }
586
+ }
587
+ }
588
+ } else {
589
+ // Need to undo atomic flush if something went wrong, i.e. s is not OK and
590
+ // it is not because of CF drop.
591
+ // Have to cancel the flush jobs that have NOT executed because we need to
592
+ // unref the versions.
593
+ for (int i = 0; i != num_cfs; ++i) {
594
+ if (pick_status[i] && !exec_status[i].first) {
595
+ jobs[i]->Cancel();
596
+ }
597
+ }
598
+ for (int i = 0; i != num_cfs; ++i) {
599
+ if (exec_status[i].second.ok() && exec_status[i].first) {
600
+ auto& mems = jobs[i]->GetMemTables();
601
+ cfds[i]->imm()->RollbackMemtableFlush(mems,
602
+ file_meta[i].fd.GetNumber());
603
+ }
604
+ }
605
+ }
606
+
607
+ if (s.ok()) {
608
+ const auto wait_to_install_func =
609
+ [&]() -> std::pair<Status, bool /*continue to wait*/> {
610
+ if (!versions_->io_status().ok()) {
611
+ // Something went wrong elsewhere, we cannot count on waiting for our
612
+ // turn to write/sync to MANIFEST or CURRENT. Just return.
613
+ return std::make_pair(versions_->io_status(), false);
614
+ } else if (shutting_down_.load(std::memory_order_acquire)) {
615
+ return std::make_pair(Status::ShutdownInProgress(), false);
616
+ }
617
+ bool ready = true;
618
+ for (size_t i = 0; i != cfds.size(); ++i) {
619
+ const auto& mems = jobs[i]->GetMemTables();
620
+ if (cfds[i]->IsDropped()) {
621
+ // If the column family is dropped, then do not wait.
622
+ continue;
623
+ } else if (!mems.empty() &&
624
+ cfds[i]->imm()->GetEarliestMemTableID() < mems[0]->GetID()) {
625
+ // If a flush job needs to install the flush result for mems and
626
+ // mems[0] is not the earliest memtable, it means another thread must
627
+ // be installing flush results for the same column family, then the
628
+ // current thread needs to wait.
629
+ ready = false;
630
+ break;
631
+ } else if (mems.empty() && cfds[i]->imm()->GetEarliestMemTableID() <=
632
+ bg_flush_args[i].max_memtable_id_) {
633
+ // If a flush job does not need to install flush results, then it has
634
+ // to wait until all memtables up to max_memtable_id_ (inclusive) are
635
+ // installed.
636
+ ready = false;
637
+ break;
638
+ }
639
+ }
640
+ return std::make_pair(Status::OK(), !ready);
641
+ };
642
+
643
+ bool resuming_from_bg_err =
644
+ error_handler_.IsDBStopped() ||
645
+ (bg_flush_args[0].flush_reason_ == FlushReason::kErrorRecovery ||
646
+ bg_flush_args[0].flush_reason_ ==
647
+ FlushReason::kErrorRecoveryRetryFlush);
648
+ while ((!resuming_from_bg_err || error_handler_.GetRecoveryError().ok())) {
649
+ std::pair<Status, bool> res = wait_to_install_func();
650
+
651
+ TEST_SYNC_POINT_CALLBACK(
652
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:WaitToCommit", &res);
653
+
654
+ if (!res.first.ok()) {
655
+ s = res.first;
656
+ break;
657
+ } else if (!res.second) {
658
+ break;
659
+ }
660
+ atomic_flush_install_cv_.Wait();
661
+
662
+ resuming_from_bg_err =
663
+ error_handler_.IsDBStopped() ||
664
+ (bg_flush_args[0].flush_reason_ == FlushReason::kErrorRecovery ||
665
+ bg_flush_args[0].flush_reason_ ==
666
+ FlushReason::kErrorRecoveryRetryFlush);
667
+ }
668
+
669
+ if (!resuming_from_bg_err) {
670
+ // If not resuming from bg err, then we determine future action based on
671
+ // whether we hit background error.
672
+ if (s.ok()) {
673
+ s = error_handler_.GetBGError();
674
+ }
675
+ } else if (s.ok()) {
676
+ // If resuming from bg err, we still rely on wait_to_install_func()'s
677
+ // result to determine future action. If wait_to_install_func() returns
678
+ // non-ok already, then we should not proceed to flush result
679
+ // installation.
680
+ s = error_handler_.GetRecoveryError();
681
+ }
682
+ }
683
+
684
+ if (s.ok()) {
685
+ autovector<ColumnFamilyData*> tmp_cfds;
686
+ autovector<const autovector<MemTable*>*> mems_list;
687
+ autovector<const MutableCFOptions*> mutable_cf_options_list;
688
+ autovector<FileMetaData*> tmp_file_meta;
689
+ autovector<std::list<std::unique_ptr<FlushJobInfo>>*>
690
+ committed_flush_jobs_info;
691
+ for (int i = 0; i != num_cfs; ++i) {
692
+ const auto& mems = jobs[i]->GetMemTables();
693
+ if (!cfds[i]->IsDropped() && !mems.empty()) {
694
+ tmp_cfds.emplace_back(cfds[i]);
695
+ mems_list.emplace_back(&mems);
696
+ mutable_cf_options_list.emplace_back(&all_mutable_cf_options[i]);
697
+ tmp_file_meta.emplace_back(&file_meta[i]);
698
+ committed_flush_jobs_info.emplace_back(
699
+ jobs[i]->GetCommittedFlushJobsInfo());
700
+ }
701
+ }
702
+
703
+ s = InstallMemtableAtomicFlushResults(
704
+ nullptr /* imm_lists */, tmp_cfds, mutable_cf_options_list, mems_list,
705
+ versions_.get(), &logs_with_prep_tracker_, &mutex_, tmp_file_meta,
706
+ committed_flush_jobs_info, &job_context->memtables_to_free,
707
+ directories_.GetDbDir(), log_buffer);
708
+ }
709
+
710
+ if (s.ok()) {
711
+ assert(num_cfs ==
712
+ static_cast<int>(job_context->superversion_contexts.size()));
713
+ for (int i = 0; i != num_cfs; ++i) {
714
+ assert(cfds[i]);
715
+
716
+ if (cfds[i]->IsDropped()) {
717
+ continue;
718
+ }
719
+ InstallSuperVersionAndScheduleWork(cfds[i],
720
+ &job_context->superversion_contexts[i],
721
+ all_mutable_cf_options[i]);
722
+
723
+ const std::string& column_family_name = cfds[i]->GetName();
724
+
725
+ Version* const current = cfds[i]->current();
726
+ assert(current);
727
+
728
+ const VersionStorageInfo* const storage_info = current->storage_info();
729
+ assert(storage_info);
730
+
731
+ VersionStorageInfo::LevelSummaryStorage tmp;
732
+ ROCKS_LOG_BUFFER(log_buffer, "[%s] Level summary: %s\n",
733
+ column_family_name.c_str(),
734
+ storage_info->LevelSummary(&tmp));
735
+
736
+ const auto& blob_files = storage_info->GetBlobFiles();
737
+ if (!blob_files.empty()) {
738
+ assert(blob_files.front());
739
+ assert(blob_files.back());
740
+
741
+ ROCKS_LOG_BUFFER(
742
+ log_buffer,
743
+ "[%s] Blob file summary: head=%" PRIu64 ", tail=%" PRIu64 "\n",
744
+ column_family_name.c_str(), blob_files.front()->GetBlobFileNumber(),
745
+ blob_files.back()->GetBlobFileNumber());
746
+ }
747
+ }
748
+ if (made_progress) {
749
+ *made_progress = true;
750
+ }
751
+ auto sfm = static_cast<SstFileManagerImpl*>(
752
+ immutable_db_options_.sst_file_manager.get());
753
+ assert(all_mutable_cf_options.size() == static_cast<size_t>(num_cfs));
754
+ for (int i = 0; s.ok() && i != num_cfs; ++i) {
755
+ // If mempurge happened instead of Flush,
756
+ // no NotifyOnFlushCompleted call (no SST file created).
757
+ if (switched_to_mempurge[i]) {
758
+ continue;
759
+ }
760
+ if (cfds[i]->IsDropped()) {
761
+ continue;
762
+ }
763
+ NotifyOnFlushCompleted(cfds[i], all_mutable_cf_options[i],
764
+ jobs[i]->GetCommittedFlushJobsInfo());
765
+ if (sfm) {
766
+ std::string file_path = MakeTableFileName(
767
+ cfds[i]->ioptions()->cf_paths[0].path, file_meta[i].fd.GetNumber());
768
+ // TODO (PR7798). We should only add the file to the FileManager if it
769
+ // exists. Otherwise, some tests may fail. Ignore the error in the
770
+ // interim.
771
+ sfm->OnAddFile(file_path).PermitUncheckedError();
772
+ if (sfm->IsMaxAllowedSpaceReached() &&
773
+ error_handler_.GetBGError().ok()) {
774
+ Status new_bg_error =
775
+ Status::SpaceLimit("Max allowed space was reached");
776
+ error_handler_.SetBGError(new_bg_error,
777
+ BackgroundErrorReason::kFlush);
778
+ }
779
+ }
780
+ }
781
+ }
782
+
783
+ // Need to undo atomic flush if something went wrong, i.e. s is not OK and
784
+ // it is not because of CF drop.
785
+ if (!s.ok() && !s.IsColumnFamilyDropped()) {
786
+ if (log_io_s.ok()) {
787
+ // Error while writing to MANIFEST.
788
+ // In fact, versions_->io_status() can also be the result of renaming
789
+ // CURRENT file. With current code, it's just difficult to tell. So just
790
+ // be pessimistic and try write to a new MANIFEST.
791
+ // TODO: distinguish between MANIFEST write and CURRENT renaming
792
+ if (!versions_->io_status().ok()) {
793
+ // If WAL sync is successful (either WAL size is 0 or there is no IO
794
+ // error), all the Manifest write will be map to soft error.
795
+ // TODO: kManifestWriteNoWAL and kFlushNoWAL are misleading. Refactor
796
+ // is needed.
797
+ error_handler_.SetBGError(s,
798
+ BackgroundErrorReason::kManifestWriteNoWAL);
799
+ } else {
800
+ // If WAL sync is successful (either WAL size is 0 or there is no IO
801
+ // error), all the other SST file write errors will be set as
802
+ // kFlushNoWAL.
803
+ error_handler_.SetBGError(s, BackgroundErrorReason::kFlushNoWAL);
804
+ }
805
+ } else {
806
+ assert(s == log_io_s);
807
+ Status new_bg_error = s;
808
+ error_handler_.SetBGError(new_bg_error, BackgroundErrorReason::kFlush);
809
+ }
810
+ }
811
+
812
+ return s;
813
+ }
814
+
815
+ void DBImpl::NotifyOnFlushBegin(ColumnFamilyData* cfd, FileMetaData* file_meta,
816
+ const MutableCFOptions& mutable_cf_options,
817
+ int job_id, FlushReason flush_reason) {
818
+ if (immutable_db_options_.listeners.size() == 0U) {
819
+ return;
820
+ }
821
+ mutex_.AssertHeld();
822
+ if (shutting_down_.load(std::memory_order_acquire)) {
823
+ return;
824
+ }
825
+ bool triggered_writes_slowdown =
826
+ (cfd->current()->storage_info()->NumLevelFiles(0) >=
827
+ mutable_cf_options.level0_slowdown_writes_trigger);
828
+ bool triggered_writes_stop =
829
+ (cfd->current()->storage_info()->NumLevelFiles(0) >=
830
+ mutable_cf_options.level0_stop_writes_trigger);
831
+ // release lock while notifying events
832
+ mutex_.Unlock();
833
+ {
834
+ FlushJobInfo info{};
835
+ info.cf_id = cfd->GetID();
836
+ info.cf_name = cfd->GetName();
837
+ // TODO(yhchiang): make db_paths dynamic in case flush does not
838
+ // go to L0 in the future.
839
+ const uint64_t file_number = file_meta->fd.GetNumber();
840
+ info.file_path =
841
+ MakeTableFileName(cfd->ioptions()->cf_paths[0].path, file_number);
842
+ info.file_number = file_number;
843
+ info.thread_id = env_->GetThreadID();
844
+ info.job_id = job_id;
845
+ info.triggered_writes_slowdown = triggered_writes_slowdown;
846
+ info.triggered_writes_stop = triggered_writes_stop;
847
+ info.smallest_seqno = file_meta->fd.smallest_seqno;
848
+ info.largest_seqno = file_meta->fd.largest_seqno;
849
+ info.flush_reason = flush_reason;
850
+ for (auto listener : immutable_db_options_.listeners) {
851
+ listener->OnFlushBegin(this, info);
852
+ }
853
+ }
854
+ mutex_.Lock();
855
+ // no need to signal bg_cv_ as it will be signaled at the end of the
856
+ // flush process.
857
+ }
858
+
859
+ void DBImpl::NotifyOnFlushCompleted(
860
+ ColumnFamilyData* cfd, const MutableCFOptions& mutable_cf_options,
861
+ std::list<std::unique_ptr<FlushJobInfo>>* flush_jobs_info) {
862
+ assert(flush_jobs_info != nullptr);
863
+ if (immutable_db_options_.listeners.size() == 0U) {
864
+ return;
865
+ }
866
+ mutex_.AssertHeld();
867
+ if (shutting_down_.load(std::memory_order_acquire)) {
868
+ return;
869
+ }
870
+ bool triggered_writes_slowdown =
871
+ (cfd->current()->storage_info()->NumLevelFiles(0) >=
872
+ mutable_cf_options.level0_slowdown_writes_trigger);
873
+ bool triggered_writes_stop =
874
+ (cfd->current()->storage_info()->NumLevelFiles(0) >=
875
+ mutable_cf_options.level0_stop_writes_trigger);
876
+ // release lock while notifying events
877
+ mutex_.Unlock();
878
+ {
879
+ for (auto& info : *flush_jobs_info) {
880
+ info->triggered_writes_slowdown = triggered_writes_slowdown;
881
+ info->triggered_writes_stop = triggered_writes_stop;
882
+ for (auto listener : immutable_db_options_.listeners) {
883
+ listener->OnFlushCompleted(this, *info);
884
+ }
885
+ TEST_SYNC_POINT(
886
+ "DBImpl::NotifyOnFlushCompleted::PostAllOnFlushCompleted");
887
+ }
888
+ flush_jobs_info->clear();
889
+ }
890
+ mutex_.Lock();
891
+ // no need to signal bg_cv_ as it will be signaled at the end of the
892
+ // flush process.
893
+ }
894
+
895
+ Status DBImpl::CompactRange(const CompactRangeOptions& options,
896
+ ColumnFamilyHandle* column_family,
897
+ const Slice* begin_without_ts,
898
+ const Slice* end_without_ts) {
899
+ if (manual_compaction_paused_.load(std::memory_order_acquire) > 0) {
900
+ return Status::Incomplete(Status::SubCode::kManualCompactionPaused);
901
+ }
902
+
903
+ if (options.canceled && options.canceled->load(std::memory_order_acquire)) {
904
+ return Status::Incomplete(Status::SubCode::kManualCompactionPaused);
905
+ }
906
+
907
+ const Comparator* const ucmp = column_family->GetComparator();
908
+ assert(ucmp);
909
+ size_t ts_sz = ucmp->timestamp_size();
910
+ if (ts_sz == 0) {
911
+ return CompactRangeInternal(options, column_family, begin_without_ts,
912
+ end_without_ts, "" /*trim_ts*/);
913
+ }
914
+
915
+ std::string begin_str;
916
+ std::string end_str;
917
+
918
+ // CompactRange compact all keys: [begin, end] inclusively. Add maximum
919
+ // timestamp to include all `begin` keys, and add minimal timestamp to include
920
+ // all `end` keys.
921
+ if (begin_without_ts != nullptr) {
922
+ AppendKeyWithMaxTimestamp(&begin_str, *begin_without_ts, ts_sz);
923
+ }
924
+ if (end_without_ts != nullptr) {
925
+ AppendKeyWithMinTimestamp(&end_str, *end_without_ts, ts_sz);
926
+ }
927
+ Slice begin(begin_str);
928
+ Slice end(end_str);
929
+
930
+ Slice* begin_with_ts = begin_without_ts ? &begin : nullptr;
931
+ Slice* end_with_ts = end_without_ts ? &end : nullptr;
932
+
933
+ return CompactRangeInternal(options, column_family, begin_with_ts,
934
+ end_with_ts, "" /*trim_ts*/);
935
+ }
936
+
937
+ Status DBImpl::IncreaseFullHistoryTsLow(ColumnFamilyHandle* column_family,
938
+ std::string ts_low) {
939
+ ColumnFamilyData* cfd = nullptr;
940
+ if (column_family == nullptr) {
941
+ cfd = default_cf_handle_->cfd();
942
+ } else {
943
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(column_family);
944
+ assert(cfh != nullptr);
945
+ cfd = cfh->cfd();
946
+ }
947
+ assert(cfd != nullptr && cfd->user_comparator() != nullptr);
948
+ if (cfd->user_comparator()->timestamp_size() == 0) {
949
+ return Status::InvalidArgument(
950
+ "Timestamp is not enabled in this column family");
951
+ }
952
+ if (cfd->user_comparator()->timestamp_size() != ts_low.size()) {
953
+ return Status::InvalidArgument("ts_low size mismatch");
954
+ }
955
+ return IncreaseFullHistoryTsLowImpl(cfd, ts_low);
956
+ }
957
+
958
+ Status DBImpl::IncreaseFullHistoryTsLowImpl(ColumnFamilyData* cfd,
959
+ std::string ts_low) {
960
+ VersionEdit edit;
961
+ edit.SetColumnFamily(cfd->GetID());
962
+ edit.SetFullHistoryTsLow(ts_low);
963
+
964
+ // TODO: plumb Env::IOActivity
965
+ const ReadOptions read_options;
966
+ TEST_SYNC_POINT_CALLBACK("DBImpl::IncreaseFullHistoryTsLowImpl:BeforeEdit",
967
+ &edit);
968
+
969
+ InstrumentedMutexLock l(&mutex_);
970
+ std::string current_ts_low = cfd->GetFullHistoryTsLow();
971
+ const Comparator* ucmp = cfd->user_comparator();
972
+ assert(ucmp->timestamp_size() == ts_low.size() && !ts_low.empty());
973
+ if (!current_ts_low.empty() &&
974
+ ucmp->CompareTimestamp(ts_low, current_ts_low) < 0) {
975
+ return Status::InvalidArgument("Cannot decrease full_history_ts_low");
976
+ }
977
+
978
+ Status s = versions_->LogAndApply(cfd, *cfd->GetLatestMutableCFOptions(),
979
+ read_options, &edit, &mutex_,
980
+ directories_.GetDbDir());
981
+ if (!s.ok()) {
982
+ return s;
983
+ }
984
+ current_ts_low = cfd->GetFullHistoryTsLow();
985
+ if (!current_ts_low.empty() &&
986
+ ucmp->CompareTimestamp(current_ts_low, ts_low) > 0) {
987
+ std::stringstream oss;
988
+ oss << "full_history_ts_low: " << Slice(current_ts_low).ToString(true)
989
+ << " is set to be higher than the requested "
990
+ "timestamp: "
991
+ << Slice(ts_low).ToString(true) << std::endl;
992
+ return Status::TryAgain(oss.str());
993
+ }
994
+ return Status::OK();
995
+ }
996
+
997
+ Status DBImpl::CompactRangeInternal(const CompactRangeOptions& options,
998
+ ColumnFamilyHandle* column_family,
999
+ const Slice* begin, const Slice* end,
1000
+ const std::string& trim_ts) {
1001
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(column_family);
1002
+ auto cfd = cfh->cfd();
1003
+
1004
+ if (options.target_path_id >= cfd->ioptions()->cf_paths.size()) {
1005
+ return Status::InvalidArgument("Invalid target path ID");
1006
+ }
1007
+
1008
+ bool flush_needed = true;
1009
+
1010
+ // Update full_history_ts_low if it's set
1011
+ if (options.full_history_ts_low != nullptr &&
1012
+ !options.full_history_ts_low->empty()) {
1013
+ std::string ts_low = options.full_history_ts_low->ToString();
1014
+ if (begin != nullptr || end != nullptr) {
1015
+ return Status::InvalidArgument(
1016
+ "Cannot specify compaction range with full_history_ts_low");
1017
+ }
1018
+ Status s = IncreaseFullHistoryTsLowImpl(cfd, ts_low);
1019
+ if (!s.ok()) {
1020
+ LogFlush(immutable_db_options_.info_log);
1021
+ return s;
1022
+ }
1023
+ }
1024
+
1025
+ Status s;
1026
+ if (begin != nullptr && end != nullptr) {
1027
+ // TODO(ajkr): We could also optimize away the flush in certain cases where
1028
+ // one/both sides of the interval are unbounded. But it requires more
1029
+ // changes to RangesOverlapWithMemtables.
1030
+ Range range(*begin, *end);
1031
+ SuperVersion* super_version = cfd->GetReferencedSuperVersion(this);
1032
+ s = cfd->RangesOverlapWithMemtables(
1033
+ {range}, super_version, immutable_db_options_.allow_data_in_errors,
1034
+ &flush_needed);
1035
+ CleanupSuperVersion(super_version);
1036
+ }
1037
+
1038
+ if (s.ok() && flush_needed) {
1039
+ FlushOptions fo;
1040
+ fo.allow_write_stall = options.allow_write_stall;
1041
+ if (immutable_db_options_.atomic_flush) {
1042
+ s = AtomicFlushMemTables(fo, FlushReason::kManualCompaction);
1043
+ } else {
1044
+ s = FlushMemTable(cfd, fo, FlushReason::kManualCompaction);
1045
+ }
1046
+ if (!s.ok()) {
1047
+ LogFlush(immutable_db_options_.info_log);
1048
+ return s;
1049
+ }
1050
+ }
1051
+
1052
+ constexpr int kInvalidLevel = -1;
1053
+ int final_output_level = kInvalidLevel;
1054
+ bool exclusive = options.exclusive_manual_compaction;
1055
+ if (cfd->ioptions()->compaction_style == kCompactionStyleUniversal &&
1056
+ cfd->NumberLevels() > 1) {
1057
+ // Always compact all files together.
1058
+ final_output_level = cfd->NumberLevels() - 1;
1059
+ // if bottom most level is reserved
1060
+ if (immutable_db_options_.allow_ingest_behind) {
1061
+ final_output_level--;
1062
+ }
1063
+ s = RunManualCompaction(cfd, ColumnFamilyData::kCompactAllLevels,
1064
+ final_output_level, options, begin, end, exclusive,
1065
+ false /* disable_trivial_move */,
1066
+ std::numeric_limits<uint64_t>::max(), trim_ts);
1067
+ } else {
1068
+ int first_overlapped_level = kInvalidLevel;
1069
+ int max_overlapped_level = kInvalidLevel;
1070
+ {
1071
+ SuperVersion* super_version = cfd->GetReferencedSuperVersion(this);
1072
+ Version* current_version = super_version->current;
1073
+
1074
+ // Might need to query the partitioner
1075
+ SstPartitionerFactory* partitioner_factory =
1076
+ current_version->cfd()->ioptions()->sst_partitioner_factory.get();
1077
+ std::unique_ptr<SstPartitioner> partitioner;
1078
+ if (partitioner_factory && begin != nullptr && end != nullptr) {
1079
+ SstPartitioner::Context context;
1080
+ context.is_full_compaction = false;
1081
+ context.is_manual_compaction = true;
1082
+ context.output_level = /*unknown*/ -1;
1083
+ // Small lies about compaction range
1084
+ context.smallest_user_key = *begin;
1085
+ context.largest_user_key = *end;
1086
+ partitioner = partitioner_factory->CreatePartitioner(context);
1087
+ }
1088
+
1089
+ ReadOptions ro;
1090
+ ro.total_order_seek = true;
1091
+ ro.io_activity = Env::IOActivity::kCompaction;
1092
+ bool overlap;
1093
+ for (int level = 0;
1094
+ level < current_version->storage_info()->num_non_empty_levels();
1095
+ level++) {
1096
+ overlap = true;
1097
+
1098
+ // Whether to look at specific keys within files for overlap with
1099
+ // compaction range, other than largest and smallest keys of the file
1100
+ // known in Version metadata.
1101
+ bool check_overlap_within_file = false;
1102
+ if (begin != nullptr && end != nullptr) {
1103
+ // Typically checking overlap within files in this case
1104
+ check_overlap_within_file = true;
1105
+ // WART: Not known why we don't check within file in one-sided bound
1106
+ // cases
1107
+ if (partitioner) {
1108
+ // Especially if the partitioner is new, the manual compaction
1109
+ // might be used to enforce the partitioning. Checking overlap
1110
+ // within files might miss cases where compaction is needed to
1111
+ // partition the files, as in this example:
1112
+ // * File has two keys "001" and "111"
1113
+ // * Compaction range is ["011", "101")
1114
+ // * Partition boundary at "100"
1115
+ // In cases like this, file-level overlap with the compaction
1116
+ // range is sufficient to force any partitioning that is needed
1117
+ // within the compaction range.
1118
+ //
1119
+ // But if there's no partitioning boundary within the compaction
1120
+ // range, we can be sure there's no need to fix partitioning
1121
+ // within that range, thus safe to check overlap within file.
1122
+ //
1123
+ // Use a hypothetical trivial move query to check for partition
1124
+ // boundary in range. (NOTE: in defiance of all conventions,
1125
+ // `begin` and `end` here are both INCLUSIVE bounds, which makes
1126
+ // this analogy to CanDoTrivialMove() accurate even when `end` is
1127
+ // the first key in a partition.)
1128
+ if (!partitioner->CanDoTrivialMove(*begin, *end)) {
1129
+ check_overlap_within_file = false;
1130
+ }
1131
+ }
1132
+ }
1133
+ if (check_overlap_within_file) {
1134
+ Status status = current_version->OverlapWithLevelIterator(
1135
+ ro, file_options_, *begin, *end, level, &overlap);
1136
+ if (!status.ok()) {
1137
+ check_overlap_within_file = false;
1138
+ }
1139
+ }
1140
+ if (!check_overlap_within_file) {
1141
+ overlap = current_version->storage_info()->OverlapInLevel(level,
1142
+ begin, end);
1143
+ }
1144
+ if (overlap) {
1145
+ if (first_overlapped_level == kInvalidLevel) {
1146
+ first_overlapped_level = level;
1147
+ }
1148
+ max_overlapped_level = level;
1149
+ }
1150
+ }
1151
+ CleanupSuperVersion(super_version);
1152
+ }
1153
+ if (s.ok() && first_overlapped_level != kInvalidLevel) {
1154
+ if (cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1155
+ cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
1156
+ assert(first_overlapped_level == 0);
1157
+ s = RunManualCompaction(
1158
+ cfd, first_overlapped_level, first_overlapped_level, options, begin,
1159
+ end, exclusive, true /* disallow_trivial_move */,
1160
+ std::numeric_limits<uint64_t>::max() /* max_file_num_to_ignore */,
1161
+ trim_ts);
1162
+ final_output_level = max_overlapped_level;
1163
+ } else {
1164
+ assert(cfd->ioptions()->compaction_style == kCompactionStyleLevel);
1165
+ uint64_t next_file_number = versions_->current_next_file_number();
1166
+ // Start compaction from `first_overlapped_level`, one level down at a
1167
+ // time, until output level >= max_overlapped_level.
1168
+ // When max_overlapped_level == 0, we will still compact from L0 -> L1
1169
+ // (or LBase), and followed by a bottommost level intra-level compaction
1170
+ // at L1 (or LBase), if applicable.
1171
+ int level = first_overlapped_level;
1172
+ final_output_level = level;
1173
+ int output_level = 0, base_level = 0;
1174
+ while (level < max_overlapped_level || level == 0) {
1175
+ output_level = level + 1;
1176
+ if (cfd->ioptions()->level_compaction_dynamic_level_bytes &&
1177
+ level == 0) {
1178
+ output_level = ColumnFamilyData::kCompactToBaseLevel;
1179
+ }
1180
+ // Use max value for `max_file_num_to_ignore` to always compact
1181
+ // files down.
1182
+ s = RunManualCompaction(
1183
+ cfd, level, output_level, options, begin, end, exclusive,
1184
+ !trim_ts.empty() /* disallow_trivial_move */,
1185
+ std::numeric_limits<uint64_t>::max() /* max_file_num_to_ignore */,
1186
+ trim_ts,
1187
+ output_level == ColumnFamilyData::kCompactToBaseLevel
1188
+ ? &base_level
1189
+ : nullptr);
1190
+ if (!s.ok()) {
1191
+ break;
1192
+ }
1193
+ if (output_level == ColumnFamilyData::kCompactToBaseLevel) {
1194
+ assert(base_level > 0);
1195
+ level = base_level;
1196
+ } else {
1197
+ ++level;
1198
+ }
1199
+ final_output_level = level;
1200
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction()::1");
1201
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction()::2");
1202
+ }
1203
+ if (s.ok()) {
1204
+ assert(final_output_level > 0);
1205
+ // bottommost level intra-level compaction
1206
+ // TODO(cbi): this preserves earlier behavior where if
1207
+ // max_overlapped_level = 0 and bottommost_level_compaction is
1208
+ // kIfHaveCompactionFilter, we only do a L0 -> LBase compaction
1209
+ // and do not do intra-LBase compaction even when user configures
1210
+ // compaction filter. We may want to still do a LBase -> LBase
1211
+ // compaction in case there is some file in LBase that did not go
1212
+ // through L0 -> LBase compaction, and hence did not go through
1213
+ // compaction filter.
1214
+ if ((options.bottommost_level_compaction ==
1215
+ BottommostLevelCompaction::kIfHaveCompactionFilter &&
1216
+ max_overlapped_level != 0 &&
1217
+ (cfd->ioptions()->compaction_filter != nullptr ||
1218
+ cfd->ioptions()->compaction_filter_factory != nullptr)) ||
1219
+ options.bottommost_level_compaction ==
1220
+ BottommostLevelCompaction::kForceOptimized ||
1221
+ options.bottommost_level_compaction ==
1222
+ BottommostLevelCompaction::kForce) {
1223
+ // Use `next_file_number` as `max_file_num_to_ignore` to avoid
1224
+ // rewriting newly compacted files when it is kForceOptimized.
1225
+ s = RunManualCompaction(
1226
+ cfd, final_output_level, final_output_level, options, begin,
1227
+ end, exclusive, !trim_ts.empty() /* disallow_trivial_move */,
1228
+ next_file_number /* max_file_num_to_ignore */, trim_ts);
1229
+ }
1230
+ }
1231
+ }
1232
+ }
1233
+ }
1234
+ if (!s.ok() || final_output_level == kInvalidLevel) {
1235
+ LogFlush(immutable_db_options_.info_log);
1236
+ return s;
1237
+ }
1238
+
1239
+ if (options.change_level) {
1240
+ TEST_SYNC_POINT("DBImpl::CompactRange:BeforeRefit:1");
1241
+ TEST_SYNC_POINT("DBImpl::CompactRange:BeforeRefit:2");
1242
+
1243
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1244
+ "[RefitLevel] waiting for background threads to stop");
1245
+ // TODO(hx235): remove `Enable/DisableManualCompaction` and
1246
+ // `Continue/PauseBackgroundWork` once we ensure registering RefitLevel()'s
1247
+ // range is sufficient (if not, what else is needed) for avoiding range
1248
+ // conflicts with other activities (e.g, compaction, flush) that are
1249
+ // currently avoided by `Enable/DisableManualCompaction` and
1250
+ // `Continue/PauseBackgroundWork`.
1251
+ DisableManualCompaction();
1252
+ s = PauseBackgroundWork();
1253
+ if (s.ok()) {
1254
+ TEST_SYNC_POINT("DBImpl::CompactRange:PreRefitLevel");
1255
+ s = ReFitLevel(cfd, final_output_level, options.target_level);
1256
+ TEST_SYNC_POINT("DBImpl::CompactRange:PostRefitLevel");
1257
+ // ContinueBackgroundWork always return Status::OK().
1258
+ Status temp_s = ContinueBackgroundWork();
1259
+ assert(temp_s.ok());
1260
+ }
1261
+ EnableManualCompaction();
1262
+ TEST_SYNC_POINT(
1263
+ "DBImpl::CompactRange:PostRefitLevel:ManualCompactionEnabled");
1264
+ }
1265
+ LogFlush(immutable_db_options_.info_log);
1266
+
1267
+ {
1268
+ InstrumentedMutexLock l(&mutex_);
1269
+ // an automatic compaction that has been scheduled might have been
1270
+ // preempted by the manual compactions. Need to schedule it back.
1271
+ MaybeScheduleFlushOrCompaction();
1272
+ }
1273
+
1274
+ return s;
1275
+ }
1276
+
1277
+ Status DBImpl::CompactFiles(const CompactionOptions& compact_options,
1278
+ ColumnFamilyHandle* column_family,
1279
+ const std::vector<std::string>& input_file_names,
1280
+ const int output_level, const int output_path_id,
1281
+ std::vector<std::string>* const output_file_names,
1282
+ CompactionJobInfo* compaction_job_info) {
1283
+ if (column_family == nullptr) {
1284
+ return Status::InvalidArgument("ColumnFamilyHandle must be non-null.");
1285
+ }
1286
+
1287
+ auto cfd =
1288
+ static_cast_with_check<ColumnFamilyHandleImpl>(column_family)->cfd();
1289
+ assert(cfd);
1290
+
1291
+ Status s;
1292
+ JobContext job_context(next_job_id_.fetch_add(1), true);
1293
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL,
1294
+ immutable_db_options_.info_log.get());
1295
+
1296
+ // Perform CompactFiles
1297
+ TEST_SYNC_POINT("TestCompactFiles::IngestExternalFile2");
1298
+ TEST_SYNC_POINT_CALLBACK(
1299
+ "TestCompactFiles:PausingManualCompaction:3",
1300
+ reinterpret_cast<void*>(
1301
+ const_cast<std::atomic<int>*>(&manual_compaction_paused_)));
1302
+ {
1303
+ InstrumentedMutexLock l(&mutex_);
1304
+ auto* current = cfd->current();
1305
+ current->Ref();
1306
+
1307
+ s = CompactFilesImpl(compact_options, cfd, current, input_file_names,
1308
+ output_file_names, output_level, output_path_id,
1309
+ &job_context, &log_buffer, compaction_job_info);
1310
+
1311
+ current->Unref();
1312
+ }
1313
+
1314
+ // Find and delete obsolete files
1315
+ {
1316
+ InstrumentedMutexLock l(&mutex_);
1317
+ // If !s.ok(), this means that Compaction failed. In that case, we want
1318
+ // to delete all obsolete files we might have created and we force
1319
+ // FindObsoleteFiles(). This is because job_context does not
1320
+ // catch all created files if compaction failed.
1321
+ FindObsoleteFiles(&job_context, !s.ok());
1322
+ } // release the mutex
1323
+
1324
+ // delete unnecessary files if any, this is done outside the mutex
1325
+ if (job_context.HaveSomethingToClean() ||
1326
+ job_context.HaveSomethingToDelete() || !log_buffer.IsEmpty()) {
1327
+ // Have to flush the info logs before bg_compaction_scheduled_--
1328
+ // because if bg_flush_scheduled_ becomes 0 and the lock is
1329
+ // released, the deconstructor of DB can kick in and destroy all the
1330
+ // states of DB so info_log might not be available after that point.
1331
+ // It also applies to access other states that DB owns.
1332
+ log_buffer.FlushBufferToLog();
1333
+ if (job_context.HaveSomethingToDelete()) {
1334
+ // no mutex is locked here. No need to Unlock() and Lock() here.
1335
+ PurgeObsoleteFiles(job_context);
1336
+ }
1337
+ job_context.Clean();
1338
+ }
1339
+
1340
+ return s;
1341
+ }
1342
+
1343
+ Status DBImpl::CompactFilesImpl(
1344
+ const CompactionOptions& compact_options, ColumnFamilyData* cfd,
1345
+ Version* version, const std::vector<std::string>& input_file_names,
1346
+ std::vector<std::string>* const output_file_names, const int output_level,
1347
+ int output_path_id, JobContext* job_context, LogBuffer* log_buffer,
1348
+ CompactionJobInfo* compaction_job_info) {
1349
+ mutex_.AssertHeld();
1350
+
1351
+ if (shutting_down_.load(std::memory_order_acquire)) {
1352
+ return Status::ShutdownInProgress();
1353
+ }
1354
+ if (manual_compaction_paused_.load(std::memory_order_acquire) > 0) {
1355
+ return Status::Incomplete(Status::SubCode::kManualCompactionPaused);
1356
+ }
1357
+
1358
+ std::unordered_set<uint64_t> input_set;
1359
+ for (const auto& file_name : input_file_names) {
1360
+ input_set.insert(TableFileNameToNumber(file_name));
1361
+ }
1362
+
1363
+ ColumnFamilyMetaData cf_meta;
1364
+ // TODO(yhchiang): can directly use version here if none of the
1365
+ // following functions call is pluggable to external developers.
1366
+ version->GetColumnFamilyMetaData(&cf_meta);
1367
+
1368
+ if (output_path_id < 0) {
1369
+ if (cfd->ioptions()->cf_paths.size() == 1U) {
1370
+ output_path_id = 0;
1371
+ } else {
1372
+ return Status::NotSupported(
1373
+ "Automatic output path selection is not "
1374
+ "yet supported in CompactFiles()");
1375
+ }
1376
+ }
1377
+
1378
+ Status s = cfd->compaction_picker()->SanitizeCompactionInputFiles(
1379
+ &input_set, cf_meta, output_level);
1380
+ TEST_SYNC_POINT("DBImpl::CompactFilesImpl::PostSanitizeCompactionInputFiles");
1381
+ if (!s.ok()) {
1382
+ return s;
1383
+ }
1384
+
1385
+ std::vector<CompactionInputFiles> input_files;
1386
+ s = cfd->compaction_picker()->GetCompactionInputsFromFileNumbers(
1387
+ &input_files, &input_set, version->storage_info(), compact_options);
1388
+ if (!s.ok()) {
1389
+ return s;
1390
+ }
1391
+
1392
+ for (const auto& inputs : input_files) {
1393
+ if (cfd->compaction_picker()->AreFilesInCompaction(inputs.files)) {
1394
+ return Status::Aborted(
1395
+ "Some of the necessary compaction input "
1396
+ "files are already being compacted");
1397
+ }
1398
+ }
1399
+ bool sfm_reserved_compact_space = false;
1400
+ // First check if we have enough room to do the compaction
1401
+ bool enough_room = EnoughRoomForCompaction(
1402
+ cfd, input_files, &sfm_reserved_compact_space, log_buffer);
1403
+
1404
+ if (!enough_room) {
1405
+ // m's vars will get set properly at the end of this function,
1406
+ // as long as status == CompactionTooLarge
1407
+ return Status::CompactionTooLarge();
1408
+ }
1409
+
1410
+ // At this point, CompactFiles will be run.
1411
+ bg_compaction_scheduled_++;
1412
+
1413
+ std::unique_ptr<Compaction> c;
1414
+ assert(cfd->compaction_picker());
1415
+ c.reset(cfd->compaction_picker()->CompactFiles(
1416
+ compact_options, input_files, output_level, version->storage_info(),
1417
+ *cfd->GetLatestMutableCFOptions(), mutable_db_options_, output_path_id));
1418
+ // we already sanitized the set of input files and checked for conflicts
1419
+ // without releasing the lock, so we're guaranteed a compaction can be formed.
1420
+ assert(c != nullptr);
1421
+
1422
+ c->SetInputVersion(version);
1423
+ // deletion compaction currently not allowed in CompactFiles.
1424
+ assert(!c->deletion_compaction());
1425
+
1426
+ std::vector<SequenceNumber> snapshot_seqs;
1427
+ SequenceNumber earliest_write_conflict_snapshot;
1428
+ SnapshotChecker* snapshot_checker;
1429
+ GetSnapshotContext(job_context, &snapshot_seqs,
1430
+ &earliest_write_conflict_snapshot, &snapshot_checker);
1431
+
1432
+ std::unique_ptr<std::list<uint64_t>::iterator> pending_outputs_inserted_elem(
1433
+ new std::list<uint64_t>::iterator(
1434
+ CaptureCurrentFileNumberInPendingOutputs()));
1435
+
1436
+ assert(is_snapshot_supported_ || snapshots_.empty());
1437
+ CompactionJobStats compaction_job_stats;
1438
+ CompactionJob compaction_job(
1439
+ job_context->job_id, c.get(), immutable_db_options_, mutable_db_options_,
1440
+ file_options_for_compaction_, versions_.get(), &shutting_down_,
1441
+ log_buffer, directories_.GetDbDir(),
1442
+ GetDataDir(c->column_family_data(), c->output_path_id()),
1443
+ GetDataDir(c->column_family_data(), 0), stats_, &mutex_, &error_handler_,
1444
+ snapshot_seqs, earliest_write_conflict_snapshot, snapshot_checker,
1445
+ job_context, table_cache_, &event_logger_,
1446
+ c->mutable_cf_options()->paranoid_file_checks,
1447
+ c->mutable_cf_options()->report_bg_io_stats, dbname_,
1448
+ &compaction_job_stats, Env::Priority::USER, io_tracer_,
1449
+ kManualCompactionCanceledFalse_, db_id_, db_session_id_,
1450
+ c->column_family_data()->GetFullHistoryTsLow(), c->trim_ts(),
1451
+ &blob_callback_, &bg_compaction_scheduled_,
1452
+ &bg_bottom_compaction_scheduled_);
1453
+
1454
+ // Creating a compaction influences the compaction score because the score
1455
+ // takes running compactions into account (by skipping files that are already
1456
+ // being compacted). Since we just changed compaction score, we recalculate it
1457
+ // here.
1458
+ version->storage_info()->ComputeCompactionScore(*cfd->ioptions(),
1459
+ *c->mutable_cf_options());
1460
+
1461
+ compaction_job.Prepare();
1462
+
1463
+ mutex_.Unlock();
1464
+ TEST_SYNC_POINT("CompactFilesImpl:0");
1465
+ TEST_SYNC_POINT("CompactFilesImpl:1");
1466
+ // Ignore the status here, as it will be checked in the Install down below...
1467
+ compaction_job.Run().PermitUncheckedError();
1468
+ TEST_SYNC_POINT("CompactFilesImpl:2");
1469
+ TEST_SYNC_POINT("CompactFilesImpl:3");
1470
+ mutex_.Lock();
1471
+
1472
+ Status status = compaction_job.Install(*c->mutable_cf_options());
1473
+ if (status.ok()) {
1474
+ assert(compaction_job.io_status().ok());
1475
+ InstallSuperVersionAndScheduleWork(c->column_family_data(),
1476
+ &job_context->superversion_contexts[0],
1477
+ *c->mutable_cf_options());
1478
+ }
1479
+ // status above captures any error during compaction_job.Install, so its ok
1480
+ // not check compaction_job.io_status() explicitly if we're not calling
1481
+ // SetBGError
1482
+ compaction_job.io_status().PermitUncheckedError();
1483
+ c->ReleaseCompactionFiles(s);
1484
+ // Need to make sure SstFileManager does its bookkeeping
1485
+ auto sfm = static_cast<SstFileManagerImpl*>(
1486
+ immutable_db_options_.sst_file_manager.get());
1487
+ if (sfm && sfm_reserved_compact_space) {
1488
+ sfm->OnCompactionCompletion(c.get());
1489
+ }
1490
+
1491
+ ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
1492
+
1493
+ if (compaction_job_info != nullptr) {
1494
+ BuildCompactionJobInfo(cfd, c.get(), s, compaction_job_stats,
1495
+ job_context->job_id, version, compaction_job_info);
1496
+ }
1497
+
1498
+ if (status.ok()) {
1499
+ // Done
1500
+ } else if (status.IsColumnFamilyDropped() || status.IsShutdownInProgress()) {
1501
+ // Ignore compaction errors found during shutting down
1502
+ } else if (status.IsManualCompactionPaused()) {
1503
+ // Don't report stopping manual compaction as error
1504
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1505
+ "[%s] [JOB %d] Stopping manual compaction",
1506
+ c->column_family_data()->GetName().c_str(),
1507
+ job_context->job_id);
1508
+ } else {
1509
+ ROCKS_LOG_WARN(immutable_db_options_.info_log,
1510
+ "[%s] [JOB %d] Compaction error: %s",
1511
+ c->column_family_data()->GetName().c_str(),
1512
+ job_context->job_id, status.ToString().c_str());
1513
+ IOStatus io_s = compaction_job.io_status();
1514
+ if (!io_s.ok()) {
1515
+ error_handler_.SetBGError(io_s, BackgroundErrorReason::kCompaction);
1516
+ } else {
1517
+ error_handler_.SetBGError(status, BackgroundErrorReason::kCompaction);
1518
+ }
1519
+ }
1520
+
1521
+ if (output_file_names != nullptr) {
1522
+ for (const auto& newf : c->edit()->GetNewFiles()) {
1523
+ output_file_names->push_back(TableFileName(
1524
+ c->immutable_options()->cf_paths, newf.second.fd.GetNumber(),
1525
+ newf.second.fd.GetPathId()));
1526
+ }
1527
+
1528
+ for (const auto& blob_file : c->edit()->GetBlobFileAdditions()) {
1529
+ output_file_names->push_back(
1530
+ BlobFileName(c->immutable_options()->cf_paths.front().path,
1531
+ blob_file.GetBlobFileNumber()));
1532
+ }
1533
+ }
1534
+
1535
+ c.reset();
1536
+
1537
+ bg_compaction_scheduled_--;
1538
+ if (bg_compaction_scheduled_ == 0) {
1539
+ bg_cv_.SignalAll();
1540
+ }
1541
+ MaybeScheduleFlushOrCompaction();
1542
+ TEST_SYNC_POINT("CompactFilesImpl:End");
1543
+
1544
+ return status;
1545
+ }
1546
+
1547
+ Status DBImpl::PauseBackgroundWork() {
1548
+ InstrumentedMutexLock guard_lock(&mutex_);
1549
+ bg_compaction_paused_++;
1550
+ while (bg_bottom_compaction_scheduled_ > 0 || bg_compaction_scheduled_ > 0 ||
1551
+ bg_flush_scheduled_ > 0) {
1552
+ bg_cv_.Wait();
1553
+ }
1554
+ bg_work_paused_++;
1555
+ return Status::OK();
1556
+ }
1557
+
1558
+ Status DBImpl::ContinueBackgroundWork() {
1559
+ InstrumentedMutexLock guard_lock(&mutex_);
1560
+ if (bg_work_paused_ == 0) {
1561
+ return Status::InvalidArgument();
1562
+ }
1563
+ assert(bg_work_paused_ > 0);
1564
+ assert(bg_compaction_paused_ > 0);
1565
+ bg_compaction_paused_--;
1566
+ bg_work_paused_--;
1567
+ // It's sufficient to check just bg_work_paused_ here since
1568
+ // bg_work_paused_ is always no greater than bg_compaction_paused_
1569
+ if (bg_work_paused_ == 0) {
1570
+ MaybeScheduleFlushOrCompaction();
1571
+ }
1572
+ return Status::OK();
1573
+ }
1574
+
1575
+ void DBImpl::NotifyOnCompactionBegin(ColumnFamilyData* cfd, Compaction* c,
1576
+ const Status& st,
1577
+ const CompactionJobStats& job_stats,
1578
+ int job_id) {
1579
+ if (immutable_db_options_.listeners.empty()) {
1580
+ return;
1581
+ }
1582
+ mutex_.AssertHeld();
1583
+ if (shutting_down_.load(std::memory_order_acquire)) {
1584
+ return;
1585
+ }
1586
+ if (c->is_manual_compaction() &&
1587
+ manual_compaction_paused_.load(std::memory_order_acquire) > 0) {
1588
+ return;
1589
+ }
1590
+
1591
+ c->SetNotifyOnCompactionCompleted();
1592
+ Version* current = cfd->current();
1593
+ current->Ref();
1594
+ // release lock while notifying events
1595
+ mutex_.Unlock();
1596
+ TEST_SYNC_POINT("DBImpl::NotifyOnCompactionBegin::UnlockMutex");
1597
+ {
1598
+ CompactionJobInfo info{};
1599
+ BuildCompactionJobInfo(cfd, c, st, job_stats, job_id, current, &info);
1600
+ for (auto listener : immutable_db_options_.listeners) {
1601
+ listener->OnCompactionBegin(this, info);
1602
+ }
1603
+ info.status.PermitUncheckedError();
1604
+ }
1605
+ mutex_.Lock();
1606
+ current->Unref();
1607
+ }
1608
+
1609
+ void DBImpl::NotifyOnCompactionCompleted(
1610
+ ColumnFamilyData* cfd, Compaction* c, const Status& st,
1611
+ const CompactionJobStats& compaction_job_stats, const int job_id) {
1612
+ if (immutable_db_options_.listeners.size() == 0U) {
1613
+ return;
1614
+ }
1615
+ mutex_.AssertHeld();
1616
+ if (shutting_down_.load(std::memory_order_acquire)) {
1617
+ return;
1618
+ }
1619
+
1620
+ if (c->ShouldNotifyOnCompactionCompleted() == false) {
1621
+ return;
1622
+ }
1623
+
1624
+ Version* current = cfd->current();
1625
+ current->Ref();
1626
+ // release lock while notifying events
1627
+ mutex_.Unlock();
1628
+ TEST_SYNC_POINT("DBImpl::NotifyOnCompactionCompleted::UnlockMutex");
1629
+ {
1630
+ CompactionJobInfo info{};
1631
+ BuildCompactionJobInfo(cfd, c, st, compaction_job_stats, job_id, current,
1632
+ &info);
1633
+ for (auto listener : immutable_db_options_.listeners) {
1634
+ listener->OnCompactionCompleted(this, info);
1635
+ }
1636
+ }
1637
+ mutex_.Lock();
1638
+ current->Unref();
1639
+ // no need to signal bg_cv_ as it will be signaled at the end of the
1640
+ // flush process.
1641
+ }
1642
+
1643
+ // REQUIREMENT: block all background work by calling PauseBackgroundWork()
1644
+ // before calling this function
1645
+ Status DBImpl::ReFitLevel(ColumnFamilyData* cfd, int level, int target_level) {
1646
+ assert(level < cfd->NumberLevels());
1647
+ if (target_level >= cfd->NumberLevels()) {
1648
+ return Status::InvalidArgument("Target level exceeds number of levels");
1649
+ }
1650
+
1651
+ const ReadOptions read_options(Env::IOActivity::kCompaction);
1652
+
1653
+ SuperVersionContext sv_context(/* create_superversion */ true);
1654
+
1655
+ InstrumentedMutexLock guard_lock(&mutex_);
1656
+
1657
+ auto* vstorage = cfd->current()->storage_info();
1658
+ if (vstorage->LevelFiles(level).empty()) {
1659
+ return Status::OK();
1660
+ }
1661
+ // only allow one thread refitting
1662
+ if (refitting_level_) {
1663
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1664
+ "[ReFitLevel] another thread is refitting");
1665
+ return Status::NotSupported("another thread is refitting");
1666
+ }
1667
+ refitting_level_ = true;
1668
+
1669
+ const MutableCFOptions mutable_cf_options = *cfd->GetLatestMutableCFOptions();
1670
+ // move to a smaller level
1671
+ int to_level = target_level;
1672
+ if (target_level < 0) {
1673
+ to_level = FindMinimumEmptyLevelFitting(cfd, mutable_cf_options, level);
1674
+ }
1675
+
1676
+ if (to_level != level) {
1677
+ std::vector<CompactionInputFiles> input(1);
1678
+ input[0].level = level;
1679
+ for (auto& f : vstorage->LevelFiles(level)) {
1680
+ input[0].files.push_back(f);
1681
+ }
1682
+ InternalKey refit_level_smallest;
1683
+ InternalKey refit_level_largest;
1684
+ cfd->compaction_picker()->GetRange(input[0], &refit_level_smallest,
1685
+ &refit_level_largest);
1686
+ if (to_level > level) {
1687
+ if (level == 0) {
1688
+ refitting_level_ = false;
1689
+ return Status::NotSupported(
1690
+ "Cannot change from level 0 to other levels.");
1691
+ }
1692
+ // Check levels are empty for a trivial move
1693
+ for (int l = level + 1; l <= to_level; l++) {
1694
+ if (vstorage->NumLevelFiles(l) > 0) {
1695
+ refitting_level_ = false;
1696
+ return Status::NotSupported(
1697
+ "Levels between source and target are not empty for a move.");
1698
+ }
1699
+ if (cfd->RangeOverlapWithCompaction(refit_level_smallest.user_key(),
1700
+ refit_level_largest.user_key(),
1701
+ l)) {
1702
+ refitting_level_ = false;
1703
+ return Status::NotSupported(
1704
+ "Levels between source and target "
1705
+ "will have some ongoing compaction's output.");
1706
+ }
1707
+ }
1708
+ } else {
1709
+ // to_level < level
1710
+ // Check levels are empty for a trivial move
1711
+ for (int l = to_level; l < level; l++) {
1712
+ if (vstorage->NumLevelFiles(l) > 0) {
1713
+ refitting_level_ = false;
1714
+ return Status::NotSupported(
1715
+ "Levels between source and target are not empty for a move.");
1716
+ }
1717
+ if (cfd->RangeOverlapWithCompaction(refit_level_smallest.user_key(),
1718
+ refit_level_largest.user_key(),
1719
+ l)) {
1720
+ refitting_level_ = false;
1721
+ return Status::NotSupported(
1722
+ "Levels between source and target "
1723
+ "will have some ongoing compaction's output.");
1724
+ }
1725
+ }
1726
+ }
1727
+ ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
1728
+ "[%s] Before refitting:\n%s", cfd->GetName().c_str(),
1729
+ cfd->current()->DebugString().data());
1730
+
1731
+ std::unique_ptr<Compaction> c(new Compaction(
1732
+ vstorage, *cfd->ioptions(), mutable_cf_options, mutable_db_options_,
1733
+ {input}, to_level,
1734
+ MaxFileSizeForLevel(
1735
+ mutable_cf_options, to_level,
1736
+ cfd->ioptions()
1737
+ ->compaction_style) /* output file size limit, not applicable */
1738
+ ,
1739
+ LLONG_MAX /* max compaction bytes, not applicable */,
1740
+ 0 /* output path ID, not applicable */, mutable_cf_options.compression,
1741
+ mutable_cf_options.compression_opts, Temperature::kUnknown,
1742
+ 0 /* max_subcompactions, not applicable */,
1743
+ {} /* grandparents, not applicable */, false /* is manual */,
1744
+ "" /* trim_ts */, -1 /* score, not applicable */,
1745
+ false /* is deletion compaction, not applicable */,
1746
+ false /* l0_files_might_overlap, not applicable */,
1747
+ CompactionReason::kRefitLevel));
1748
+ cfd->compaction_picker()->RegisterCompaction(c.get());
1749
+ TEST_SYNC_POINT("DBImpl::ReFitLevel:PostRegisterCompaction");
1750
+ VersionEdit edit;
1751
+ edit.SetColumnFamily(cfd->GetID());
1752
+
1753
+ for (const auto& f : vstorage->LevelFiles(level)) {
1754
+ edit.DeleteFile(level, f->fd.GetNumber());
1755
+ edit.AddFile(
1756
+ to_level, f->fd.GetNumber(), f->fd.GetPathId(), f->fd.GetFileSize(),
1757
+ f->smallest, f->largest, f->fd.smallest_seqno, f->fd.largest_seqno,
1758
+ f->marked_for_compaction, f->temperature, f->oldest_blob_file_number,
1759
+ f->oldest_ancester_time, f->file_creation_time, f->epoch_number,
1760
+ f->file_checksum, f->file_checksum_func_name, f->unique_id,
1761
+ f->compensated_range_deletion_size, f->tail_size);
1762
+ }
1763
+ ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
1764
+ "[%s] Apply version edit:\n%s", cfd->GetName().c_str(),
1765
+ edit.DebugString().data());
1766
+
1767
+ Status status =
1768
+ versions_->LogAndApply(cfd, mutable_cf_options, read_options, &edit,
1769
+ &mutex_, directories_.GetDbDir());
1770
+
1771
+ cfd->compaction_picker()->UnregisterCompaction(c.get());
1772
+ c.reset();
1773
+
1774
+ InstallSuperVersionAndScheduleWork(cfd, &sv_context, mutable_cf_options);
1775
+
1776
+ ROCKS_LOG_DEBUG(immutable_db_options_.info_log, "[%s] LogAndApply: %s\n",
1777
+ cfd->GetName().c_str(), status.ToString().data());
1778
+
1779
+ if (status.ok()) {
1780
+ ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
1781
+ "[%s] After refitting:\n%s", cfd->GetName().c_str(),
1782
+ cfd->current()->DebugString().data());
1783
+ }
1784
+ sv_context.Clean();
1785
+ refitting_level_ = false;
1786
+
1787
+ return status;
1788
+ }
1789
+
1790
+ refitting_level_ = false;
1791
+ return Status::OK();
1792
+ }
1793
+
1794
+ int DBImpl::NumberLevels(ColumnFamilyHandle* column_family) {
1795
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(column_family);
1796
+ return cfh->cfd()->NumberLevels();
1797
+ }
1798
+
1799
+ int DBImpl::MaxMemCompactionLevel(ColumnFamilyHandle* /*column_family*/) {
1800
+ return 0;
1801
+ }
1802
+
1803
+ int DBImpl::Level0StopWriteTrigger(ColumnFamilyHandle* column_family) {
1804
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(column_family);
1805
+ InstrumentedMutexLock l(&mutex_);
1806
+ return cfh->cfd()
1807
+ ->GetSuperVersion()
1808
+ ->mutable_cf_options.level0_stop_writes_trigger;
1809
+ }
1810
+
1811
+ Status DBImpl::Flush(const FlushOptions& flush_options,
1812
+ ColumnFamilyHandle* column_family) {
1813
+ auto cfh = static_cast_with_check<ColumnFamilyHandleImpl>(column_family);
1814
+ ROCKS_LOG_INFO(immutable_db_options_.info_log, "[%s] Manual flush start.",
1815
+ cfh->GetName().c_str());
1816
+ Status s;
1817
+ if (immutable_db_options_.atomic_flush) {
1818
+ s = AtomicFlushMemTables(flush_options, FlushReason::kManualFlush,
1819
+ {cfh->cfd()});
1820
+ } else {
1821
+ s = FlushMemTable(cfh->cfd(), flush_options, FlushReason::kManualFlush);
1822
+ }
1823
+
1824
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1825
+ "[%s] Manual flush finished, status: %s\n",
1826
+ cfh->GetName().c_str(), s.ToString().c_str());
1827
+ return s;
1828
+ }
1829
+
1830
+ Status DBImpl::Flush(const FlushOptions& flush_options,
1831
+ const std::vector<ColumnFamilyHandle*>& column_families) {
1832
+ Status s;
1833
+ if (!immutable_db_options_.atomic_flush) {
1834
+ for (auto cfh : column_families) {
1835
+ s = Flush(flush_options, cfh);
1836
+ if (!s.ok()) {
1837
+ break;
1838
+ }
1839
+ }
1840
+ } else {
1841
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1842
+ "Manual atomic flush start.\n"
1843
+ "=====Column families:=====");
1844
+ for (auto cfh : column_families) {
1845
+ auto cfhi = static_cast<ColumnFamilyHandleImpl*>(cfh);
1846
+ ROCKS_LOG_INFO(immutable_db_options_.info_log, "%s",
1847
+ cfhi->GetName().c_str());
1848
+ }
1849
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1850
+ "=====End of column families list=====");
1851
+ autovector<ColumnFamilyData*> cfds;
1852
+ std::for_each(column_families.begin(), column_families.end(),
1853
+ [&cfds](ColumnFamilyHandle* elem) {
1854
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(elem);
1855
+ cfds.emplace_back(cfh->cfd());
1856
+ });
1857
+ s = AtomicFlushMemTables(flush_options, FlushReason::kManualFlush, cfds);
1858
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1859
+ "Manual atomic flush finished, status: %s\n"
1860
+ "=====Column families:=====",
1861
+ s.ToString().c_str());
1862
+ for (auto cfh : column_families) {
1863
+ auto cfhi = static_cast<ColumnFamilyHandleImpl*>(cfh);
1864
+ ROCKS_LOG_INFO(immutable_db_options_.info_log, "%s",
1865
+ cfhi->GetName().c_str());
1866
+ }
1867
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
1868
+ "=====End of column families list=====");
1869
+ }
1870
+ return s;
1871
+ }
1872
+
1873
+ Status DBImpl::RunManualCompaction(
1874
+ ColumnFamilyData* cfd, int input_level, int output_level,
1875
+ const CompactRangeOptions& compact_range_options, const Slice* begin,
1876
+ const Slice* end, bool exclusive, bool disallow_trivial_move,
1877
+ uint64_t max_file_num_to_ignore, const std::string& trim_ts,
1878
+ int* final_output_level) {
1879
+ assert(input_level == ColumnFamilyData::kCompactAllLevels ||
1880
+ input_level >= 0);
1881
+
1882
+ InternalKey begin_storage, end_storage;
1883
+ CompactionArg* ca = nullptr;
1884
+
1885
+ bool scheduled = false;
1886
+ bool unscheduled = false;
1887
+ Env::Priority thread_pool_priority = Env::Priority::TOTAL;
1888
+ bool manual_conflict = false;
1889
+
1890
+ ManualCompactionState manual(
1891
+ cfd, input_level, output_level, compact_range_options.target_path_id,
1892
+ exclusive, disallow_trivial_move, compact_range_options.canceled);
1893
+ // For universal compaction, we enforce every manual compaction to compact
1894
+ // all files.
1895
+ if (begin == nullptr ||
1896
+ cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1897
+ cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
1898
+ manual.begin = nullptr;
1899
+ } else {
1900
+ begin_storage.SetMinPossibleForUserKey(*begin);
1901
+ manual.begin = &begin_storage;
1902
+ }
1903
+ if (end == nullptr ||
1904
+ cfd->ioptions()->compaction_style == kCompactionStyleUniversal ||
1905
+ cfd->ioptions()->compaction_style == kCompactionStyleFIFO) {
1906
+ manual.end = nullptr;
1907
+ } else {
1908
+ end_storage.SetMaxPossibleForUserKey(*end);
1909
+ manual.end = &end_storage;
1910
+ }
1911
+
1912
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:0");
1913
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:1");
1914
+ InstrumentedMutexLock l(&mutex_);
1915
+
1916
+ if (manual_compaction_paused_ > 0) {
1917
+ // Does not make sense to `AddManualCompaction()` in this scenario since
1918
+ // `DisableManualCompaction()` just waited for the manual compaction queue
1919
+ // to drain. So return immediately.
1920
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:PausedAtStart");
1921
+ manual.status =
1922
+ Status::Incomplete(Status::SubCode::kManualCompactionPaused);
1923
+ manual.done = true;
1924
+ return manual.status;
1925
+ }
1926
+
1927
+ // When a manual compaction arrives, temporarily disable scheduling of
1928
+ // non-manual compactions and wait until the number of scheduled compaction
1929
+ // jobs drops to zero. This used to be needed to ensure that this manual
1930
+ // compaction can compact any range of keys/files. Now it is optional
1931
+ // (see `CompactRangeOptions::exclusive_manual_compaction`). The use case for
1932
+ // `exclusive_manual_compaction=true` is unclear beyond not trusting the code.
1933
+ //
1934
+ // HasPendingManualCompaction() is true when at least one thread is inside
1935
+ // RunManualCompaction(), i.e. during that time no other compaction will
1936
+ // get scheduled (see MaybeScheduleFlushOrCompaction).
1937
+ //
1938
+ // Note that the following loop doesn't stop more that one thread calling
1939
+ // RunManualCompaction() from getting to the second while loop below.
1940
+ // However, only one of them will actually schedule compaction, while
1941
+ // others will wait on a condition variable until it completes.
1942
+
1943
+ AddManualCompaction(&manual);
1944
+ TEST_SYNC_POINT_CALLBACK("DBImpl::RunManualCompaction:NotScheduled", &mutex_);
1945
+ if (exclusive) {
1946
+ // Limitation: there's no way to wake up the below loop when user sets
1947
+ // `*manual.canceled`. So `CompactRangeOptions::exclusive_manual_compaction`
1948
+ // and `CompactRangeOptions::canceled` might not work well together.
1949
+ while (bg_bottom_compaction_scheduled_ > 0 ||
1950
+ bg_compaction_scheduled_ > 0) {
1951
+ if (manual_compaction_paused_ > 0 || manual.canceled == true) {
1952
+ // Pretend the error came from compaction so the below cleanup/error
1953
+ // handling code can process it.
1954
+ manual.done = true;
1955
+ manual.status =
1956
+ Status::Incomplete(Status::SubCode::kManualCompactionPaused);
1957
+ break;
1958
+ }
1959
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:WaitScheduled");
1960
+ ROCKS_LOG_INFO(
1961
+ immutable_db_options_.info_log,
1962
+ "[%s] Manual compaction waiting for all other scheduled background "
1963
+ "compactions to finish",
1964
+ cfd->GetName().c_str());
1965
+ bg_cv_.Wait();
1966
+ }
1967
+ }
1968
+
1969
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL,
1970
+ immutable_db_options_.info_log.get());
1971
+
1972
+ ROCKS_LOG_BUFFER(&log_buffer, "[%s] Manual compaction starting",
1973
+ cfd->GetName().c_str());
1974
+
1975
+ // We don't check bg_error_ here, because if we get the error in compaction,
1976
+ // the compaction will set manual.status to bg_error_ and set manual.done to
1977
+ // true.
1978
+ while (!manual.done) {
1979
+ assert(HasPendingManualCompaction());
1980
+ manual_conflict = false;
1981
+ Compaction* compaction = nullptr;
1982
+ if (ShouldntRunManualCompaction(&manual) || (manual.in_progress == true) ||
1983
+ scheduled ||
1984
+ (((manual.manual_end = &manual.tmp_storage1) != nullptr) &&
1985
+ ((compaction = manual.cfd->CompactRange(
1986
+ *manual.cfd->GetLatestMutableCFOptions(), mutable_db_options_,
1987
+ manual.input_level, manual.output_level, compact_range_options,
1988
+ manual.begin, manual.end, &manual.manual_end, &manual_conflict,
1989
+ max_file_num_to_ignore, trim_ts)) == nullptr &&
1990
+ manual_conflict))) {
1991
+ if (!scheduled) {
1992
+ // There is a conflicting compaction
1993
+ if (manual_compaction_paused_ > 0 || manual.canceled == true) {
1994
+ // Stop waiting since it was canceled. Pretend the error came from
1995
+ // compaction so the below cleanup/error handling code can process it.
1996
+ manual.done = true;
1997
+ manual.status =
1998
+ Status::Incomplete(Status::SubCode::kManualCompactionPaused);
1999
+ }
2000
+ }
2001
+ if (!manual.done) {
2002
+ bg_cv_.Wait();
2003
+ }
2004
+ if (manual_compaction_paused_ > 0 && scheduled && !unscheduled) {
2005
+ assert(thread_pool_priority != Env::Priority::TOTAL);
2006
+ // unschedule all manual compactions
2007
+ auto unscheduled_task_num = env_->UnSchedule(
2008
+ GetTaskTag(TaskType::kManualCompaction), thread_pool_priority);
2009
+ if (unscheduled_task_num > 0) {
2010
+ ROCKS_LOG_INFO(
2011
+ immutable_db_options_.info_log,
2012
+ "[%s] Unscheduled %d number of manual compactions from the "
2013
+ "thread-pool",
2014
+ cfd->GetName().c_str(), unscheduled_task_num);
2015
+ // it may unschedule other manual compactions, notify others.
2016
+ bg_cv_.SignalAll();
2017
+ }
2018
+ unscheduled = true;
2019
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:Unscheduled");
2020
+ }
2021
+ if (scheduled && manual.incomplete == true) {
2022
+ assert(!manual.in_progress);
2023
+ scheduled = false;
2024
+ manual.incomplete = false;
2025
+ }
2026
+ } else if (!scheduled) {
2027
+ if (compaction == nullptr) {
2028
+ manual.done = true;
2029
+ if (final_output_level) {
2030
+ // No compaction needed or there is a conflicting compaction.
2031
+ // Still set `final_output_level` to the level where we would
2032
+ // have compacted to.
2033
+ *final_output_level = output_level;
2034
+ if (output_level == ColumnFamilyData::kCompactToBaseLevel) {
2035
+ *final_output_level = cfd->current()->storage_info()->base_level();
2036
+ }
2037
+ }
2038
+ bg_cv_.SignalAll();
2039
+ continue;
2040
+ }
2041
+ ca = new CompactionArg;
2042
+ ca->db = this;
2043
+ ca->prepicked_compaction = new PrepickedCompaction;
2044
+ ca->prepicked_compaction->manual_compaction_state = &manual;
2045
+ ca->prepicked_compaction->compaction = compaction;
2046
+ if (!RequestCompactionToken(
2047
+ cfd, true, &ca->prepicked_compaction->task_token, &log_buffer)) {
2048
+ // Don't throttle manual compaction, only count outstanding tasks.
2049
+ assert(false);
2050
+ }
2051
+ manual.incomplete = false;
2052
+ if (compaction->bottommost_level() &&
2053
+ env_->GetBackgroundThreads(Env::Priority::BOTTOM) > 0) {
2054
+ bg_bottom_compaction_scheduled_++;
2055
+ ca->compaction_pri_ = Env::Priority::BOTTOM;
2056
+ env_->Schedule(&DBImpl::BGWorkBottomCompaction, ca,
2057
+ Env::Priority::BOTTOM,
2058
+ GetTaskTag(TaskType::kManualCompaction),
2059
+ &DBImpl::UnscheduleCompactionCallback);
2060
+ thread_pool_priority = Env::Priority::BOTTOM;
2061
+ } else {
2062
+ bg_compaction_scheduled_++;
2063
+ ca->compaction_pri_ = Env::Priority::LOW;
2064
+ env_->Schedule(&DBImpl::BGWorkCompaction, ca, Env::Priority::LOW,
2065
+ GetTaskTag(TaskType::kManualCompaction),
2066
+ &DBImpl::UnscheduleCompactionCallback);
2067
+ thread_pool_priority = Env::Priority::LOW;
2068
+ }
2069
+ scheduled = true;
2070
+ TEST_SYNC_POINT("DBImpl::RunManualCompaction:Scheduled");
2071
+ if (final_output_level) {
2072
+ *final_output_level = compaction->output_level();
2073
+ }
2074
+ }
2075
+ }
2076
+
2077
+ log_buffer.FlushBufferToLog();
2078
+ assert(!manual.in_progress);
2079
+ assert(HasPendingManualCompaction());
2080
+ RemoveManualCompaction(&manual);
2081
+ // if the manual job is unscheduled, try schedule other jobs in case there's
2082
+ // any unscheduled compaction job which was blocked by exclusive manual
2083
+ // compaction.
2084
+ if (manual.status.IsIncomplete() &&
2085
+ manual.status.subcode() == Status::SubCode::kManualCompactionPaused) {
2086
+ MaybeScheduleFlushOrCompaction();
2087
+ }
2088
+ bg_cv_.SignalAll();
2089
+ return manual.status;
2090
+ }
2091
+
2092
+ void DBImpl::GenerateFlushRequest(const autovector<ColumnFamilyData*>& cfds,
2093
+ FlushReason flush_reason, FlushRequest* req) {
2094
+ assert(req != nullptr);
2095
+ req->flush_reason = flush_reason;
2096
+ req->cfd_to_max_mem_id_to_persist.reserve(cfds.size());
2097
+ for (const auto cfd : cfds) {
2098
+ if (nullptr == cfd) {
2099
+ // cfd may be null, see DBImpl::ScheduleFlushes
2100
+ continue;
2101
+ }
2102
+ uint64_t max_memtable_id = cfd->imm()->GetLatestMemTableID();
2103
+ req->cfd_to_max_mem_id_to_persist.emplace(cfd, max_memtable_id);
2104
+ }
2105
+ }
2106
+
2107
+ Status DBImpl::FlushMemTable(ColumnFamilyData* cfd,
2108
+ const FlushOptions& flush_options,
2109
+ FlushReason flush_reason,
2110
+ bool entered_write_thread) {
2111
+ // This method should not be called if atomic_flush is true.
2112
+ assert(!immutable_db_options_.atomic_flush);
2113
+ if (!flush_options.wait && write_controller_.IsStopped()) {
2114
+ std::ostringstream oss;
2115
+ oss << "Writes have been stopped, thus unable to perform manual flush. "
2116
+ "Please try again later after writes are resumed";
2117
+ return Status::TryAgain(oss.str());
2118
+ }
2119
+ Status s;
2120
+ if (!flush_options.allow_write_stall) {
2121
+ bool flush_needed = true;
2122
+ s = WaitUntilFlushWouldNotStallWrites(cfd, &flush_needed);
2123
+ TEST_SYNC_POINT("DBImpl::FlushMemTable:StallWaitDone");
2124
+ if (!s.ok() || !flush_needed) {
2125
+ return s;
2126
+ }
2127
+ }
2128
+
2129
+ const bool needs_to_join_write_thread = !entered_write_thread;
2130
+ autovector<FlushRequest> flush_reqs;
2131
+ autovector<uint64_t> memtable_ids_to_wait;
2132
+ {
2133
+ WriteContext context;
2134
+ InstrumentedMutexLock guard_lock(&mutex_);
2135
+
2136
+ WriteThread::Writer w;
2137
+ WriteThread::Writer nonmem_w;
2138
+ if (needs_to_join_write_thread) {
2139
+ write_thread_.EnterUnbatched(&w, &mutex_);
2140
+ if (two_write_queues_) {
2141
+ nonmem_write_thread_.EnterUnbatched(&nonmem_w, &mutex_);
2142
+ }
2143
+ }
2144
+ WaitForPendingWrites();
2145
+
2146
+ if (flush_reason != FlushReason::kErrorRecoveryRetryFlush &&
2147
+ (!cfd->mem()->IsEmpty() || !cached_recoverable_state_empty_.load())) {
2148
+ // Note that, when flush reason is kErrorRecoveryRetryFlush, during the
2149
+ // auto retry resume, we want to avoid creating new small memtables.
2150
+ // Therefore, SwitchMemtable will not be called. Also, since ResumeImpl
2151
+ // will iterate through all the CFs and call FlushMemtable during auto
2152
+ // retry resume, it is possible that in some CFs,
2153
+ // cfd->imm()->NumNotFlushed() = 0. In this case, so no flush request will
2154
+ // be created and scheduled, status::OK() will be returned.
2155
+ s = SwitchMemtable(cfd, &context);
2156
+ }
2157
+ const uint64_t flush_memtable_id = std::numeric_limits<uint64_t>::max();
2158
+ if (s.ok()) {
2159
+ if (cfd->imm()->NumNotFlushed() != 0 || !cfd->mem()->IsEmpty() ||
2160
+ !cached_recoverable_state_empty_.load()) {
2161
+ FlushRequest req{flush_reason, {{cfd, flush_memtable_id}}};
2162
+ flush_reqs.emplace_back(std::move(req));
2163
+ memtable_ids_to_wait.emplace_back(cfd->imm()->GetLatestMemTableID());
2164
+ }
2165
+ if (immutable_db_options_.persist_stats_to_disk &&
2166
+ flush_reason != FlushReason::kErrorRecoveryRetryFlush) {
2167
+ ColumnFamilyData* cfd_stats =
2168
+ versions_->GetColumnFamilySet()->GetColumnFamily(
2169
+ kPersistentStatsColumnFamilyName);
2170
+ if (cfd_stats != nullptr && cfd_stats != cfd &&
2171
+ !cfd_stats->mem()->IsEmpty()) {
2172
+ // only force flush stats CF when it will be the only CF lagging
2173
+ // behind after the current flush
2174
+ bool stats_cf_flush_needed = true;
2175
+ for (auto* loop_cfd : *versions_->GetColumnFamilySet()) {
2176
+ if (loop_cfd == cfd_stats || loop_cfd == cfd) {
2177
+ continue;
2178
+ }
2179
+ if (loop_cfd->GetLogNumber() <= cfd_stats->GetLogNumber()) {
2180
+ stats_cf_flush_needed = false;
2181
+ }
2182
+ }
2183
+ if (stats_cf_flush_needed) {
2184
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
2185
+ "Force flushing stats CF with manual flush of %s "
2186
+ "to avoid holding old logs",
2187
+ cfd->GetName().c_str());
2188
+ s = SwitchMemtable(cfd_stats, &context);
2189
+ FlushRequest req{flush_reason, {{cfd_stats, flush_memtable_id}}};
2190
+ flush_reqs.emplace_back(std::move(req));
2191
+ memtable_ids_to_wait.emplace_back(
2192
+ cfd_stats->imm()->GetLatestMemTableID());
2193
+ }
2194
+ }
2195
+ }
2196
+ }
2197
+
2198
+ if (s.ok() && !flush_reqs.empty()) {
2199
+ for (const auto& req : flush_reqs) {
2200
+ assert(req.cfd_to_max_mem_id_to_persist.size() == 1);
2201
+ ColumnFamilyData* loop_cfd =
2202
+ req.cfd_to_max_mem_id_to_persist.begin()->first;
2203
+ loop_cfd->imm()->FlushRequested();
2204
+ }
2205
+ // If the caller wants to wait for this flush to complete, it indicates
2206
+ // that the caller expects the ColumnFamilyData not to be free'ed by
2207
+ // other threads which may drop the column family concurrently.
2208
+ // Therefore, we increase the cfd's ref count.
2209
+ if (flush_options.wait) {
2210
+ for (const auto& req : flush_reqs) {
2211
+ assert(req.cfd_to_max_mem_id_to_persist.size() == 1);
2212
+ ColumnFamilyData* loop_cfd =
2213
+ req.cfd_to_max_mem_id_to_persist.begin()->first;
2214
+ loop_cfd->Ref();
2215
+ }
2216
+ }
2217
+ for (const auto& req : flush_reqs) {
2218
+ SchedulePendingFlush(req);
2219
+ }
2220
+ MaybeScheduleFlushOrCompaction();
2221
+ }
2222
+
2223
+ if (needs_to_join_write_thread) {
2224
+ write_thread_.ExitUnbatched(&w);
2225
+ if (two_write_queues_) {
2226
+ nonmem_write_thread_.ExitUnbatched(&nonmem_w);
2227
+ }
2228
+ }
2229
+ }
2230
+ TEST_SYNC_POINT("DBImpl::FlushMemTable:AfterScheduleFlush");
2231
+ TEST_SYNC_POINT("DBImpl::FlushMemTable:BeforeWaitForBgFlush");
2232
+ if (s.ok() && flush_options.wait) {
2233
+ autovector<ColumnFamilyData*> cfds;
2234
+ autovector<const uint64_t*> flush_memtable_ids;
2235
+ assert(flush_reqs.size() == memtable_ids_to_wait.size());
2236
+ for (size_t i = 0; i < flush_reqs.size(); ++i) {
2237
+ assert(flush_reqs[i].cfd_to_max_mem_id_to_persist.size() == 1);
2238
+ cfds.push_back(flush_reqs[i].cfd_to_max_mem_id_to_persist.begin()->first);
2239
+ flush_memtable_ids.push_back(&(memtable_ids_to_wait[i]));
2240
+ }
2241
+ s = WaitForFlushMemTables(
2242
+ cfds, flush_memtable_ids,
2243
+ (flush_reason == FlushReason::kErrorRecovery ||
2244
+ flush_reason == FlushReason::kErrorRecoveryRetryFlush));
2245
+ InstrumentedMutexLock lock_guard(&mutex_);
2246
+ for (auto* tmp_cfd : cfds) {
2247
+ tmp_cfd->UnrefAndTryDelete();
2248
+ }
2249
+ }
2250
+ TEST_SYNC_POINT("DBImpl::FlushMemTable:FlushMemTableFinished");
2251
+ return s;
2252
+ }
2253
+
2254
+ Status DBImpl::AtomicFlushMemTables(
2255
+ const FlushOptions& flush_options, FlushReason flush_reason,
2256
+ const autovector<ColumnFamilyData*>& provided_candidate_cfds,
2257
+ bool entered_write_thread) {
2258
+ assert(immutable_db_options_.atomic_flush);
2259
+ if (!flush_options.wait && write_controller_.IsStopped()) {
2260
+ std::ostringstream oss;
2261
+ oss << "Writes have been stopped, thus unable to perform manual flush. "
2262
+ "Please try again later after writes are resumed";
2263
+ return Status::TryAgain(oss.str());
2264
+ }
2265
+ Status s;
2266
+ autovector<ColumnFamilyData*> candidate_cfds;
2267
+ if (provided_candidate_cfds.empty()) {
2268
+ // Generate candidate cfds if not provided
2269
+ {
2270
+ InstrumentedMutexLock l(&mutex_);
2271
+ for (ColumnFamilyData* cfd : *versions_->GetColumnFamilySet()) {
2272
+ if (!cfd->IsDropped() && cfd->initialized()) {
2273
+ cfd->Ref();
2274
+ candidate_cfds.push_back(cfd);
2275
+ }
2276
+ }
2277
+ }
2278
+ } else {
2279
+ candidate_cfds = provided_candidate_cfds;
2280
+ }
2281
+
2282
+ if (!flush_options.allow_write_stall) {
2283
+ int num_cfs_to_flush = 0;
2284
+ for (auto cfd : candidate_cfds) {
2285
+ bool flush_needed = true;
2286
+ s = WaitUntilFlushWouldNotStallWrites(cfd, &flush_needed);
2287
+ if (!s.ok()) {
2288
+ // Unref the newly generated candidate cfds (when not provided) in
2289
+ // `candidate_cfds`
2290
+ if (provided_candidate_cfds.empty()) {
2291
+ for (auto candidate_cfd : candidate_cfds) {
2292
+ candidate_cfd->UnrefAndTryDelete();
2293
+ }
2294
+ }
2295
+ return s;
2296
+ } else if (flush_needed) {
2297
+ ++num_cfs_to_flush;
2298
+ }
2299
+ }
2300
+ if (0 == num_cfs_to_flush) {
2301
+ // Unref the newly generated candidate cfds (when not provided) in
2302
+ // `candidate_cfds`
2303
+ if (provided_candidate_cfds.empty()) {
2304
+ for (auto candidate_cfd : candidate_cfds) {
2305
+ candidate_cfd->UnrefAndTryDelete();
2306
+ }
2307
+ }
2308
+ return s;
2309
+ }
2310
+ }
2311
+ const bool needs_to_join_write_thread = !entered_write_thread;
2312
+ FlushRequest flush_req;
2313
+ autovector<ColumnFamilyData*> cfds;
2314
+ {
2315
+ WriteContext context;
2316
+ InstrumentedMutexLock guard_lock(&mutex_);
2317
+
2318
+ WriteThread::Writer w;
2319
+ WriteThread::Writer nonmem_w;
2320
+ if (needs_to_join_write_thread) {
2321
+ write_thread_.EnterUnbatched(&w, &mutex_);
2322
+ if (two_write_queues_) {
2323
+ nonmem_write_thread_.EnterUnbatched(&nonmem_w, &mutex_);
2324
+ }
2325
+ }
2326
+ WaitForPendingWrites();
2327
+
2328
+ SelectColumnFamiliesForAtomicFlush(&cfds, candidate_cfds);
2329
+
2330
+ // Unref the newly generated candidate cfds (when not provided) in
2331
+ // `candidate_cfds`
2332
+ if (provided_candidate_cfds.empty()) {
2333
+ for (auto candidate_cfd : candidate_cfds) {
2334
+ candidate_cfd->UnrefAndTryDelete();
2335
+ }
2336
+ }
2337
+
2338
+ for (auto cfd : cfds) {
2339
+ if ((cfd->mem()->IsEmpty() && cached_recoverable_state_empty_.load()) ||
2340
+ flush_reason == FlushReason::kErrorRecoveryRetryFlush) {
2341
+ continue;
2342
+ }
2343
+ cfd->Ref();
2344
+ s = SwitchMemtable(cfd, &context);
2345
+ cfd->UnrefAndTryDelete();
2346
+ if (!s.ok()) {
2347
+ break;
2348
+ }
2349
+ }
2350
+ if (s.ok()) {
2351
+ AssignAtomicFlushSeq(cfds);
2352
+ for (auto cfd : cfds) {
2353
+ cfd->imm()->FlushRequested();
2354
+ }
2355
+ // If the caller wants to wait for this flush to complete, it indicates
2356
+ // that the caller expects the ColumnFamilyData not to be free'ed by
2357
+ // other threads which may drop the column family concurrently.
2358
+ // Therefore, we increase the cfd's ref count.
2359
+ if (flush_options.wait) {
2360
+ for (auto cfd : cfds) {
2361
+ cfd->Ref();
2362
+ }
2363
+ }
2364
+ GenerateFlushRequest(cfds, flush_reason, &flush_req);
2365
+ SchedulePendingFlush(flush_req);
2366
+ MaybeScheduleFlushOrCompaction();
2367
+ }
2368
+
2369
+ if (needs_to_join_write_thread) {
2370
+ write_thread_.ExitUnbatched(&w);
2371
+ if (two_write_queues_) {
2372
+ nonmem_write_thread_.ExitUnbatched(&nonmem_w);
2373
+ }
2374
+ }
2375
+ }
2376
+ TEST_SYNC_POINT("DBImpl::AtomicFlushMemTables:AfterScheduleFlush");
2377
+ TEST_SYNC_POINT("DBImpl::AtomicFlushMemTables:BeforeWaitForBgFlush");
2378
+ if (s.ok() && flush_options.wait) {
2379
+ autovector<const uint64_t*> flush_memtable_ids;
2380
+ for (auto& iter : flush_req.cfd_to_max_mem_id_to_persist) {
2381
+ flush_memtable_ids.push_back(&(iter.second));
2382
+ }
2383
+ s = WaitForFlushMemTables(
2384
+ cfds, flush_memtable_ids,
2385
+ (flush_reason == FlushReason::kErrorRecovery ||
2386
+ flush_reason == FlushReason::kErrorRecoveryRetryFlush));
2387
+ InstrumentedMutexLock lock_guard(&mutex_);
2388
+ for (auto* cfd : cfds) {
2389
+ cfd->UnrefAndTryDelete();
2390
+ }
2391
+ }
2392
+ return s;
2393
+ }
2394
+
2395
+ // Calling FlushMemTable(), whether from DB::Flush() or from Backup Engine, can
2396
+ // cause write stall, for example if one memtable is being flushed already.
2397
+ // This method tries to avoid write stall (similar to CompactRange() behavior)
2398
+ // it emulates how the SuperVersion / LSM would change if flush happens, checks
2399
+ // it against various constrains and delays flush if it'd cause write stall.
2400
+ // Caller should check status and flush_needed to see if flush already happened.
2401
+ Status DBImpl::WaitUntilFlushWouldNotStallWrites(ColumnFamilyData* cfd,
2402
+ bool* flush_needed) {
2403
+ {
2404
+ *flush_needed = true;
2405
+ InstrumentedMutexLock l(&mutex_);
2406
+ uint64_t orig_active_memtable_id = cfd->mem()->GetID();
2407
+ WriteStallCondition write_stall_condition = WriteStallCondition::kNormal;
2408
+ do {
2409
+ if (write_stall_condition != WriteStallCondition::kNormal) {
2410
+ // Same error handling as user writes: Don't wait if there's a
2411
+ // background error, even if it's a soft error. We might wait here
2412
+ // indefinitely as the pending flushes/compactions may never finish
2413
+ // successfully, resulting in the stall condition lasting indefinitely
2414
+ if (error_handler_.IsBGWorkStopped()) {
2415
+ return error_handler_.GetBGError();
2416
+ }
2417
+
2418
+ TEST_SYNC_POINT("DBImpl::WaitUntilFlushWouldNotStallWrites:StallWait");
2419
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
2420
+ "[%s] WaitUntilFlushWouldNotStallWrites"
2421
+ " waiting on stall conditions to clear",
2422
+ cfd->GetName().c_str());
2423
+ bg_cv_.Wait();
2424
+ }
2425
+ if (cfd->IsDropped()) {
2426
+ return Status::ColumnFamilyDropped();
2427
+ }
2428
+ if (shutting_down_.load(std::memory_order_acquire)) {
2429
+ return Status::ShutdownInProgress();
2430
+ }
2431
+
2432
+ uint64_t earliest_memtable_id =
2433
+ std::min(cfd->mem()->GetID(), cfd->imm()->GetEarliestMemTableID());
2434
+ if (earliest_memtable_id > orig_active_memtable_id) {
2435
+ // We waited so long that the memtable we were originally waiting on was
2436
+ // flushed.
2437
+ *flush_needed = false;
2438
+ return Status::OK();
2439
+ }
2440
+
2441
+ const auto& mutable_cf_options = *cfd->GetLatestMutableCFOptions();
2442
+ const auto* vstorage = cfd->current()->storage_info();
2443
+
2444
+ // Skip stalling check if we're below auto-flush and auto-compaction
2445
+ // triggers. If it stalled in these conditions, that'd mean the stall
2446
+ // triggers are so low that stalling is needed for any background work. In
2447
+ // that case we shouldn't wait since background work won't be scheduled.
2448
+ if (cfd->imm()->NumNotFlushed() <
2449
+ cfd->ioptions()->min_write_buffer_number_to_merge &&
2450
+ vstorage->l0_delay_trigger_count() <
2451
+ mutable_cf_options.level0_file_num_compaction_trigger) {
2452
+ break;
2453
+ }
2454
+
2455
+ // check whether one extra immutable memtable or an extra L0 file would
2456
+ // cause write stalling mode to be entered. It could still enter stall
2457
+ // mode due to pending compaction bytes, but that's less common
2458
+ write_stall_condition = ColumnFamilyData::GetWriteStallConditionAndCause(
2459
+ cfd->imm()->NumNotFlushed() + 1,
2460
+ vstorage->l0_delay_trigger_count() + 1,
2461
+ vstorage->estimated_compaction_needed_bytes(),
2462
+ mutable_cf_options, *cfd->ioptions())
2463
+ .first;
2464
+ } while (write_stall_condition != WriteStallCondition::kNormal);
2465
+ }
2466
+ return Status::OK();
2467
+ }
2468
+
2469
+ // Wait for memtables to be flushed for multiple column families.
2470
+ // let N = cfds.size()
2471
+ // for i in [0, N),
2472
+ // 1) if flush_memtable_ids[i] is not null, then the memtables with lower IDs
2473
+ // have to be flushed for THIS column family;
2474
+ // 2) if flush_memtable_ids[i] is null, then all memtables in THIS column
2475
+ // family have to be flushed.
2476
+ // Finish waiting when ALL column families finish flushing memtables.
2477
+ // resuming_from_bg_err indicates whether the caller is trying to resume from
2478
+ // background error or in normal processing.
2479
+ Status DBImpl::WaitForFlushMemTables(
2480
+ const autovector<ColumnFamilyData*>& cfds,
2481
+ const autovector<const uint64_t*>& flush_memtable_ids,
2482
+ bool resuming_from_bg_err) {
2483
+ int num = static_cast<int>(cfds.size());
2484
+ // Wait until the compaction completes
2485
+ InstrumentedMutexLock l(&mutex_);
2486
+ Status s;
2487
+ // If the caller is trying to resume from bg error, then
2488
+ // error_handler_.IsDBStopped() is true.
2489
+ while (resuming_from_bg_err || !error_handler_.IsDBStopped()) {
2490
+ if (shutting_down_.load(std::memory_order_acquire)) {
2491
+ s = Status::ShutdownInProgress();
2492
+ return s;
2493
+ }
2494
+ // If an error has occurred during resumption, then no need to wait.
2495
+ // But flush operation may fail because of this error, so need to
2496
+ // return the status.
2497
+ if (!error_handler_.GetRecoveryError().ok()) {
2498
+ s = error_handler_.GetRecoveryError();
2499
+ break;
2500
+ }
2501
+ // If BGWorkStopped, which indicate that there is a BG error and
2502
+ // 1) soft error but requires no BG work, 2) no in auto_recovery_
2503
+ if (!resuming_from_bg_err && error_handler_.IsBGWorkStopped() &&
2504
+ error_handler_.GetBGError().severity() < Status::Severity::kHardError) {
2505
+ s = error_handler_.GetBGError();
2506
+ return s;
2507
+ }
2508
+
2509
+ // Number of column families that have been dropped.
2510
+ int num_dropped = 0;
2511
+ // Number of column families that have finished flush.
2512
+ int num_finished = 0;
2513
+ for (int i = 0; i < num; ++i) {
2514
+ if (cfds[i]->IsDropped()) {
2515
+ ++num_dropped;
2516
+ } else if (cfds[i]->imm()->NumNotFlushed() == 0 ||
2517
+ (flush_memtable_ids[i] != nullptr &&
2518
+ cfds[i]->imm()->GetEarliestMemTableID() >
2519
+ *flush_memtable_ids[i])) {
2520
+ ++num_finished;
2521
+ }
2522
+ }
2523
+ if (1 == num_dropped && 1 == num) {
2524
+ s = Status::ColumnFamilyDropped();
2525
+ return s;
2526
+ }
2527
+ // Column families involved in this flush request have either been dropped
2528
+ // or finished flush. Then it's time to finish waiting.
2529
+ if (num_dropped + num_finished == num) {
2530
+ break;
2531
+ }
2532
+ bg_cv_.Wait();
2533
+ }
2534
+ // If not resuming from bg error, and an error has caused the DB to stop,
2535
+ // then report the bg error to caller.
2536
+ if (!resuming_from_bg_err && error_handler_.IsDBStopped()) {
2537
+ s = error_handler_.GetBGError();
2538
+ }
2539
+ return s;
2540
+ }
2541
+
2542
+ Status DBImpl::EnableAutoCompaction(
2543
+ const std::vector<ColumnFamilyHandle*>& column_family_handles) {
2544
+ Status s;
2545
+ for (auto cf_ptr : column_family_handles) {
2546
+ Status status =
2547
+ this->SetOptions(cf_ptr, {{"disable_auto_compactions", "false"}});
2548
+ if (!status.ok()) {
2549
+ s = status;
2550
+ }
2551
+ }
2552
+
2553
+ return s;
2554
+ }
2555
+
2556
+ // NOTE: Calling DisableManualCompaction() may overwrite the
2557
+ // user-provided canceled variable in CompactRangeOptions
2558
+ void DBImpl::DisableManualCompaction() {
2559
+ InstrumentedMutexLock l(&mutex_);
2560
+ manual_compaction_paused_.fetch_add(1, std::memory_order_release);
2561
+
2562
+ // Mark the canceled as true when the cancellation is triggered by
2563
+ // manual_compaction_paused (may overwrite user-provided `canceled`)
2564
+ for (const auto& manual_compaction : manual_compaction_dequeue_) {
2565
+ manual_compaction->canceled = true;
2566
+ }
2567
+
2568
+ // Wake up manual compactions waiting to start.
2569
+ bg_cv_.SignalAll();
2570
+
2571
+ // Wait for any pending manual compactions to finish (typically through
2572
+ // failing with `Status::Incomplete`) prior to returning. This way we are
2573
+ // guaranteed no pending manual compaction will commit while manual
2574
+ // compactions are "disabled".
2575
+ while (HasPendingManualCompaction()) {
2576
+ bg_cv_.Wait();
2577
+ }
2578
+ }
2579
+
2580
+ // NOTE: In contrast to DisableManualCompaction(), calling
2581
+ // EnableManualCompaction() does NOT overwrite the user-provided *canceled
2582
+ // variable to be false since there is NO CHANCE a canceled compaction
2583
+ // is uncanceled. In other words, a canceled compaction must have been
2584
+ // dropped out of the manual compaction queue, when we disable it.
2585
+ void DBImpl::EnableManualCompaction() {
2586
+ InstrumentedMutexLock l(&mutex_);
2587
+ assert(manual_compaction_paused_ > 0);
2588
+ manual_compaction_paused_.fetch_sub(1, std::memory_order_release);
2589
+ }
2590
+
2591
+ void DBImpl::MaybeScheduleFlushOrCompaction() {
2592
+ mutex_.AssertHeld();
2593
+ if (!opened_successfully_) {
2594
+ // Compaction may introduce data race to DB open
2595
+ return;
2596
+ }
2597
+ if (bg_work_paused_ > 0) {
2598
+ // we paused the background work
2599
+ return;
2600
+ } else if (error_handler_.IsBGWorkStopped() &&
2601
+ !error_handler_.IsRecoveryInProgress()) {
2602
+ // There has been a hard error and this call is not part of the recovery
2603
+ // sequence. Bail out here so we don't get into an endless loop of
2604
+ // scheduling BG work which will again call this function
2605
+ return;
2606
+ } else if (shutting_down_.load(std::memory_order_acquire)) {
2607
+ // DB is being deleted; no more background compactions
2608
+ return;
2609
+ }
2610
+ auto bg_job_limits = GetBGJobLimits();
2611
+ bool is_flush_pool_empty =
2612
+ env_->GetBackgroundThreads(Env::Priority::HIGH) == 0;
2613
+ while (!is_flush_pool_empty && unscheduled_flushes_ > 0 &&
2614
+ bg_flush_scheduled_ < bg_job_limits.max_flushes) {
2615
+ bg_flush_scheduled_++;
2616
+ FlushThreadArg* fta = new FlushThreadArg;
2617
+ fta->db_ = this;
2618
+ fta->thread_pri_ = Env::Priority::HIGH;
2619
+ env_->Schedule(&DBImpl::BGWorkFlush, fta, Env::Priority::HIGH, this,
2620
+ &DBImpl::UnscheduleFlushCallback);
2621
+ --unscheduled_flushes_;
2622
+ TEST_SYNC_POINT_CALLBACK(
2623
+ "DBImpl::MaybeScheduleFlushOrCompaction:AfterSchedule:0",
2624
+ &unscheduled_flushes_);
2625
+ }
2626
+
2627
+ // special case -- if high-pri (flush) thread pool is empty, then schedule
2628
+ // flushes in low-pri (compaction) thread pool.
2629
+ if (is_flush_pool_empty) {
2630
+ while (unscheduled_flushes_ > 0 &&
2631
+ bg_flush_scheduled_ + bg_compaction_scheduled_ <
2632
+ bg_job_limits.max_flushes) {
2633
+ bg_flush_scheduled_++;
2634
+ FlushThreadArg* fta = new FlushThreadArg;
2635
+ fta->db_ = this;
2636
+ fta->thread_pri_ = Env::Priority::LOW;
2637
+ env_->Schedule(&DBImpl::BGWorkFlush, fta, Env::Priority::LOW, this,
2638
+ &DBImpl::UnscheduleFlushCallback);
2639
+ --unscheduled_flushes_;
2640
+ }
2641
+ }
2642
+
2643
+ if (bg_compaction_paused_ > 0) {
2644
+ // we paused the background compaction
2645
+ return;
2646
+ } else if (error_handler_.IsBGWorkStopped()) {
2647
+ // Compaction is not part of the recovery sequence from a hard error. We
2648
+ // might get here because recovery might do a flush and install a new
2649
+ // super version, which will try to schedule pending compactions. Bail
2650
+ // out here and let the higher level recovery handle compactions
2651
+ return;
2652
+ }
2653
+
2654
+ if (HasExclusiveManualCompaction()) {
2655
+ // only manual compactions are allowed to run. don't schedule automatic
2656
+ // compactions
2657
+ TEST_SYNC_POINT("DBImpl::MaybeScheduleFlushOrCompaction:Conflict");
2658
+ return;
2659
+ }
2660
+
2661
+ while (bg_compaction_scheduled_ + bg_bottom_compaction_scheduled_ <
2662
+ bg_job_limits.max_compactions &&
2663
+ unscheduled_compactions_ > 0) {
2664
+ CompactionArg* ca = new CompactionArg;
2665
+ ca->db = this;
2666
+ ca->compaction_pri_ = Env::Priority::LOW;
2667
+ ca->prepicked_compaction = nullptr;
2668
+ bg_compaction_scheduled_++;
2669
+ unscheduled_compactions_--;
2670
+ env_->Schedule(&DBImpl::BGWorkCompaction, ca, Env::Priority::LOW, this,
2671
+ &DBImpl::UnscheduleCompactionCallback);
2672
+ }
2673
+ }
2674
+
2675
+ DBImpl::BGJobLimits DBImpl::GetBGJobLimits() const {
2676
+ mutex_.AssertHeld();
2677
+ return GetBGJobLimits(mutable_db_options_.max_background_flushes,
2678
+ mutable_db_options_.max_background_compactions,
2679
+ mutable_db_options_.max_background_jobs,
2680
+ write_controller_.NeedSpeedupCompaction());
2681
+ }
2682
+
2683
+ DBImpl::BGJobLimits DBImpl::GetBGJobLimits(int max_background_flushes,
2684
+ int max_background_compactions,
2685
+ int max_background_jobs,
2686
+ bool parallelize_compactions) {
2687
+ BGJobLimits res;
2688
+ if (max_background_flushes == -1 && max_background_compactions == -1) {
2689
+ // for our first stab implementing max_background_jobs, simply allocate a
2690
+ // quarter of the threads to flushes.
2691
+ res.max_flushes = std::max(1, max_background_jobs / 4);
2692
+ res.max_compactions = std::max(1, max_background_jobs - res.max_flushes);
2693
+ } else {
2694
+ // compatibility code in case users haven't migrated to max_background_jobs,
2695
+ // which automatically computes flush/compaction limits
2696
+ res.max_flushes = std::max(1, max_background_flushes);
2697
+ res.max_compactions = std::max(1, max_background_compactions);
2698
+ }
2699
+ if (!parallelize_compactions) {
2700
+ // throttle background compactions until we deem necessary
2701
+ res.max_compactions = 1;
2702
+ }
2703
+ return res;
2704
+ }
2705
+
2706
+ void DBImpl::AddToCompactionQueue(ColumnFamilyData* cfd) {
2707
+ assert(!cfd->queued_for_compaction());
2708
+ cfd->Ref();
2709
+ compaction_queue_.push_back(cfd);
2710
+ cfd->set_queued_for_compaction(true);
2711
+ }
2712
+
2713
+ ColumnFamilyData* DBImpl::PopFirstFromCompactionQueue() {
2714
+ assert(!compaction_queue_.empty());
2715
+ auto cfd = *compaction_queue_.begin();
2716
+ compaction_queue_.pop_front();
2717
+ assert(cfd->queued_for_compaction());
2718
+ cfd->set_queued_for_compaction(false);
2719
+ return cfd;
2720
+ }
2721
+
2722
+ DBImpl::FlushRequest DBImpl::PopFirstFromFlushQueue() {
2723
+ assert(!flush_queue_.empty());
2724
+ FlushRequest flush_req = flush_queue_.front();
2725
+ flush_queue_.pop_front();
2726
+ if (!immutable_db_options_.atomic_flush) {
2727
+ assert(flush_req.cfd_to_max_mem_id_to_persist.size() == 1);
2728
+ }
2729
+ for (const auto& elem : flush_req.cfd_to_max_mem_id_to_persist) {
2730
+ if (!immutable_db_options_.atomic_flush) {
2731
+ ColumnFamilyData* cfd = elem.first;
2732
+ assert(cfd);
2733
+ assert(cfd->queued_for_flush());
2734
+ cfd->set_queued_for_flush(false);
2735
+ }
2736
+ }
2737
+ return flush_req;
2738
+ }
2739
+
2740
+ ColumnFamilyData* DBImpl::PickCompactionFromQueue(
2741
+ std::unique_ptr<TaskLimiterToken>* token, LogBuffer* log_buffer) {
2742
+ assert(!compaction_queue_.empty());
2743
+ assert(*token == nullptr);
2744
+ autovector<ColumnFamilyData*> throttled_candidates;
2745
+ ColumnFamilyData* cfd = nullptr;
2746
+ while (!compaction_queue_.empty()) {
2747
+ auto first_cfd = *compaction_queue_.begin();
2748
+ compaction_queue_.pop_front();
2749
+ assert(first_cfd->queued_for_compaction());
2750
+ if (!RequestCompactionToken(first_cfd, false, token, log_buffer)) {
2751
+ throttled_candidates.push_back(first_cfd);
2752
+ continue;
2753
+ }
2754
+ cfd = first_cfd;
2755
+ cfd->set_queued_for_compaction(false);
2756
+ break;
2757
+ }
2758
+ // Add throttled compaction candidates back to queue in the original order.
2759
+ for (auto iter = throttled_candidates.rbegin();
2760
+ iter != throttled_candidates.rend(); ++iter) {
2761
+ compaction_queue_.push_front(*iter);
2762
+ }
2763
+ return cfd;
2764
+ }
2765
+
2766
+ void DBImpl::SchedulePendingFlush(const FlushRequest& flush_req) {
2767
+ mutex_.AssertHeld();
2768
+ if (flush_req.cfd_to_max_mem_id_to_persist.empty()) {
2769
+ return;
2770
+ }
2771
+ if (!immutable_db_options_.atomic_flush) {
2772
+ // For the non-atomic flush case, we never schedule multiple column
2773
+ // families in the same flush request.
2774
+ assert(flush_req.cfd_to_max_mem_id_to_persist.size() == 1);
2775
+ ColumnFamilyData* cfd =
2776
+ flush_req.cfd_to_max_mem_id_to_persist.begin()->first;
2777
+ assert(cfd);
2778
+
2779
+ if (!cfd->queued_for_flush() && cfd->imm()->IsFlushPending()) {
2780
+ cfd->Ref();
2781
+ cfd->set_queued_for_flush(true);
2782
+ ++unscheduled_flushes_;
2783
+ flush_queue_.push_back(flush_req);
2784
+ }
2785
+ } else {
2786
+ for (auto& iter : flush_req.cfd_to_max_mem_id_to_persist) {
2787
+ ColumnFamilyData* cfd = iter.first;
2788
+ cfd->Ref();
2789
+ }
2790
+ ++unscheduled_flushes_;
2791
+ flush_queue_.push_back(flush_req);
2792
+ }
2793
+ }
2794
+
2795
+ void DBImpl::SchedulePendingCompaction(ColumnFamilyData* cfd) {
2796
+ mutex_.AssertHeld();
2797
+ if (!cfd->queued_for_compaction() && cfd->NeedsCompaction()) {
2798
+ AddToCompactionQueue(cfd);
2799
+ ++unscheduled_compactions_;
2800
+ }
2801
+ }
2802
+
2803
+ void DBImpl::SchedulePendingPurge(std::string fname, std::string dir_to_sync,
2804
+ FileType type, uint64_t number, int job_id) {
2805
+ mutex_.AssertHeld();
2806
+ PurgeFileInfo file_info(fname, dir_to_sync, type, number, job_id);
2807
+ purge_files_.insert({{number, std::move(file_info)}});
2808
+ }
2809
+
2810
+ void DBImpl::BGWorkFlush(void* arg) {
2811
+ FlushThreadArg fta = *(reinterpret_cast<FlushThreadArg*>(arg));
2812
+ delete reinterpret_cast<FlushThreadArg*>(arg);
2813
+
2814
+ IOSTATS_SET_THREAD_POOL_ID(fta.thread_pri_);
2815
+ TEST_SYNC_POINT("DBImpl::BGWorkFlush");
2816
+ static_cast_with_check<DBImpl>(fta.db_)->BackgroundCallFlush(fta.thread_pri_);
2817
+ TEST_SYNC_POINT("DBImpl::BGWorkFlush:done");
2818
+ }
2819
+
2820
+ void DBImpl::BGWorkCompaction(void* arg) {
2821
+ CompactionArg ca = *(reinterpret_cast<CompactionArg*>(arg));
2822
+ delete reinterpret_cast<CompactionArg*>(arg);
2823
+ IOSTATS_SET_THREAD_POOL_ID(Env::Priority::LOW);
2824
+ TEST_SYNC_POINT("DBImpl::BGWorkCompaction");
2825
+ auto prepicked_compaction =
2826
+ static_cast<PrepickedCompaction*>(ca.prepicked_compaction);
2827
+ static_cast_with_check<DBImpl>(ca.db)->BackgroundCallCompaction(
2828
+ prepicked_compaction, Env::Priority::LOW);
2829
+ delete prepicked_compaction;
2830
+ }
2831
+
2832
+ void DBImpl::BGWorkBottomCompaction(void* arg) {
2833
+ CompactionArg ca = *(static_cast<CompactionArg*>(arg));
2834
+ delete static_cast<CompactionArg*>(arg);
2835
+ IOSTATS_SET_THREAD_POOL_ID(Env::Priority::BOTTOM);
2836
+ TEST_SYNC_POINT("DBImpl::BGWorkBottomCompaction");
2837
+ auto* prepicked_compaction = ca.prepicked_compaction;
2838
+ assert(prepicked_compaction && prepicked_compaction->compaction);
2839
+ ca.db->BackgroundCallCompaction(prepicked_compaction, Env::Priority::BOTTOM);
2840
+ delete prepicked_compaction;
2841
+ }
2842
+
2843
+ void DBImpl::BGWorkPurge(void* db) {
2844
+ IOSTATS_SET_THREAD_POOL_ID(Env::Priority::HIGH);
2845
+ TEST_SYNC_POINT("DBImpl::BGWorkPurge:start");
2846
+ reinterpret_cast<DBImpl*>(db)->BackgroundCallPurge();
2847
+ TEST_SYNC_POINT("DBImpl::BGWorkPurge:end");
2848
+ }
2849
+
2850
+ void DBImpl::UnscheduleCompactionCallback(void* arg) {
2851
+ CompactionArg* ca_ptr = reinterpret_cast<CompactionArg*>(arg);
2852
+ Env::Priority compaction_pri = ca_ptr->compaction_pri_;
2853
+ if (Env::Priority::BOTTOM == compaction_pri) {
2854
+ // Decrement bg_bottom_compaction_scheduled_ if priority is BOTTOM
2855
+ ca_ptr->db->bg_bottom_compaction_scheduled_--;
2856
+ } else if (Env::Priority::LOW == compaction_pri) {
2857
+ // Decrement bg_compaction_scheduled_ if priority is LOW
2858
+ ca_ptr->db->bg_compaction_scheduled_--;
2859
+ }
2860
+ CompactionArg ca = *(ca_ptr);
2861
+ delete reinterpret_cast<CompactionArg*>(arg);
2862
+ if (ca.prepicked_compaction != nullptr) {
2863
+ // if it's a manual compaction, set status to ManualCompactionPaused
2864
+ if (ca.prepicked_compaction->manual_compaction_state) {
2865
+ ca.prepicked_compaction->manual_compaction_state->done = true;
2866
+ ca.prepicked_compaction->manual_compaction_state->status =
2867
+ Status::Incomplete(Status::SubCode::kManualCompactionPaused);
2868
+ }
2869
+ if (ca.prepicked_compaction->compaction != nullptr) {
2870
+ ca.prepicked_compaction->compaction->ReleaseCompactionFiles(
2871
+ Status::Incomplete(Status::SubCode::kManualCompactionPaused));
2872
+ delete ca.prepicked_compaction->compaction;
2873
+ }
2874
+ delete ca.prepicked_compaction;
2875
+ }
2876
+ TEST_SYNC_POINT("DBImpl::UnscheduleCompactionCallback");
2877
+ }
2878
+
2879
+ void DBImpl::UnscheduleFlushCallback(void* arg) {
2880
+ // Decrement bg_flush_scheduled_ in flush callback
2881
+ reinterpret_cast<FlushThreadArg*>(arg)->db_->bg_flush_scheduled_--;
2882
+ Env::Priority flush_pri = reinterpret_cast<FlushThreadArg*>(arg)->thread_pri_;
2883
+ if (Env::Priority::LOW == flush_pri) {
2884
+ TEST_SYNC_POINT("DBImpl::UnscheduleLowFlushCallback");
2885
+ } else if (Env::Priority::HIGH == flush_pri) {
2886
+ TEST_SYNC_POINT("DBImpl::UnscheduleHighFlushCallback");
2887
+ }
2888
+ delete reinterpret_cast<FlushThreadArg*>(arg);
2889
+ TEST_SYNC_POINT("DBImpl::UnscheduleFlushCallback");
2890
+ }
2891
+
2892
+ Status DBImpl::BackgroundFlush(bool* made_progress, JobContext* job_context,
2893
+ LogBuffer* log_buffer, FlushReason* reason,
2894
+ Env::Priority thread_pri) {
2895
+ mutex_.AssertHeld();
2896
+
2897
+ Status status;
2898
+ *reason = FlushReason::kOthers;
2899
+ // If BG work is stopped due to an error, but a recovery is in progress,
2900
+ // that means this flush is part of the recovery. So allow it to go through
2901
+ if (!error_handler_.IsBGWorkStopped()) {
2902
+ if (shutting_down_.load(std::memory_order_acquire)) {
2903
+ status = Status::ShutdownInProgress();
2904
+ }
2905
+ } else if (!error_handler_.IsRecoveryInProgress()) {
2906
+ status = error_handler_.GetBGError();
2907
+ }
2908
+
2909
+ if (!status.ok()) {
2910
+ return status;
2911
+ }
2912
+
2913
+ autovector<BGFlushArg> bg_flush_args;
2914
+ std::vector<SuperVersionContext>& superversion_contexts =
2915
+ job_context->superversion_contexts;
2916
+ autovector<ColumnFamilyData*> column_families_not_to_flush;
2917
+ while (!flush_queue_.empty()) {
2918
+ // This cfd is already referenced
2919
+ const FlushRequest& flush_req = PopFirstFromFlushQueue();
2920
+ FlushReason flush_reason = flush_req.flush_reason;
2921
+ superversion_contexts.clear();
2922
+ superversion_contexts.reserve(
2923
+ flush_req.cfd_to_max_mem_id_to_persist.size());
2924
+
2925
+ for (const auto& iter : flush_req.cfd_to_max_mem_id_to_persist) {
2926
+ ColumnFamilyData* cfd = iter.first;
2927
+ if (cfd->GetMempurgeUsed()) {
2928
+ // If imm() contains silent memtables (e.g.: because
2929
+ // MemPurge was activated), requesting a flush will
2930
+ // mark the imm_needed as true.
2931
+ cfd->imm()->FlushRequested();
2932
+ }
2933
+
2934
+ if (cfd->IsDropped() || !cfd->imm()->IsFlushPending()) {
2935
+ // can't flush this CF, try next one
2936
+ column_families_not_to_flush.push_back(cfd);
2937
+ continue;
2938
+ }
2939
+ superversion_contexts.emplace_back(SuperVersionContext(true));
2940
+ bg_flush_args.emplace_back(cfd, iter.second,
2941
+ &(superversion_contexts.back()), flush_reason);
2942
+ }
2943
+ if (!bg_flush_args.empty()) {
2944
+ break;
2945
+ }
2946
+ }
2947
+
2948
+ if (!bg_flush_args.empty()) {
2949
+ auto bg_job_limits = GetBGJobLimits();
2950
+ for (const auto& arg : bg_flush_args) {
2951
+ ColumnFamilyData* cfd = arg.cfd_;
2952
+ ROCKS_LOG_BUFFER(
2953
+ log_buffer,
2954
+ "Calling FlushMemTableToOutputFile with column "
2955
+ "family [%s], flush slots available %d, compaction slots available "
2956
+ "%d, "
2957
+ "flush slots scheduled %d, compaction slots scheduled %d",
2958
+ cfd->GetName().c_str(), bg_job_limits.max_flushes,
2959
+ bg_job_limits.max_compactions, bg_flush_scheduled_,
2960
+ bg_compaction_scheduled_);
2961
+ }
2962
+ status = FlushMemTablesToOutputFiles(bg_flush_args, made_progress,
2963
+ job_context, log_buffer, thread_pri);
2964
+ TEST_SYNC_POINT("DBImpl::BackgroundFlush:BeforeFlush");
2965
+ // All the CFD/bg_flush_arg in the FlushReq must have the same flush reason, so
2966
+ // just grab the first one
2967
+ #ifndef NDEBUG
2968
+ for (const auto& bg_flush_arg : bg_flush_args) {
2969
+ assert(bg_flush_arg.flush_reason_ == bg_flush_args[0].flush_reason_);
2970
+ }
2971
+ #endif /* !NDEBUG */
2972
+ *reason = bg_flush_args[0].flush_reason_;
2973
+ for (auto& arg : bg_flush_args) {
2974
+ ColumnFamilyData* cfd = arg.cfd_;
2975
+ if (cfd->UnrefAndTryDelete()) {
2976
+ arg.cfd_ = nullptr;
2977
+ }
2978
+ }
2979
+ }
2980
+ for (auto cfd : column_families_not_to_flush) {
2981
+ cfd->UnrefAndTryDelete();
2982
+ }
2983
+ return status;
2984
+ }
2985
+
2986
+ void DBImpl::BackgroundCallFlush(Env::Priority thread_pri) {
2987
+ bool made_progress = false;
2988
+ JobContext job_context(next_job_id_.fetch_add(1), true);
2989
+
2990
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCallFlush:start", nullptr);
2991
+
2992
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL,
2993
+ immutable_db_options_.info_log.get());
2994
+ TEST_SYNC_POINT("DBImpl::BackgroundCallFlush:Start:1");
2995
+ TEST_SYNC_POINT("DBImpl::BackgroundCallFlush:Start:2");
2996
+ {
2997
+ InstrumentedMutexLock l(&mutex_);
2998
+ assert(bg_flush_scheduled_);
2999
+ num_running_flushes_++;
3000
+
3001
+ std::unique_ptr<std::list<uint64_t>::iterator>
3002
+ pending_outputs_inserted_elem(new std::list<uint64_t>::iterator(
3003
+ CaptureCurrentFileNumberInPendingOutputs()));
3004
+ FlushReason reason;
3005
+
3006
+ Status s = BackgroundFlush(&made_progress, &job_context, &log_buffer,
3007
+ &reason, thread_pri);
3008
+ if (!s.ok() && !s.IsShutdownInProgress() && !s.IsColumnFamilyDropped() &&
3009
+ reason != FlushReason::kErrorRecovery) {
3010
+ // Wait a little bit before retrying background flush in
3011
+ // case this is an environmental problem and we do not want to
3012
+ // chew up resources for failed flushes for the duration of
3013
+ // the problem.
3014
+ uint64_t error_cnt =
3015
+ default_cf_internal_stats_->BumpAndGetBackgroundErrorCount();
3016
+ bg_cv_.SignalAll(); // In case a waiter can proceed despite the error
3017
+ mutex_.Unlock();
3018
+ ROCKS_LOG_ERROR(immutable_db_options_.info_log,
3019
+ "Waiting after background flush error: %s"
3020
+ "Accumulated background error counts: %" PRIu64,
3021
+ s.ToString().c_str(), error_cnt);
3022
+ log_buffer.FlushBufferToLog();
3023
+ LogFlush(immutable_db_options_.info_log);
3024
+ immutable_db_options_.clock->SleepForMicroseconds(1000000);
3025
+ mutex_.Lock();
3026
+ }
3027
+
3028
+ TEST_SYNC_POINT("DBImpl::BackgroundCallFlush:FlushFinish:0");
3029
+ ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
3030
+
3031
+ // If flush failed, we want to delete all temporary files that we might have
3032
+ // created. Thus, we force full scan in FindObsoleteFiles()
3033
+ FindObsoleteFiles(&job_context, !s.ok() && !s.IsShutdownInProgress() &&
3034
+ !s.IsColumnFamilyDropped());
3035
+ // delete unnecessary files if any, this is done outside the mutex
3036
+ if (job_context.HaveSomethingToClean() ||
3037
+ job_context.HaveSomethingToDelete() || !log_buffer.IsEmpty()) {
3038
+ mutex_.Unlock();
3039
+ TEST_SYNC_POINT("DBImpl::BackgroundCallFlush:FilesFound");
3040
+ // Have to flush the info logs before bg_flush_scheduled_--
3041
+ // because if bg_flush_scheduled_ becomes 0 and the lock is
3042
+ // released, the deconstructor of DB can kick in and destroy all the
3043
+ // states of DB so info_log might not be available after that point.
3044
+ // It also applies to access other states that DB owns.
3045
+ log_buffer.FlushBufferToLog();
3046
+ if (job_context.HaveSomethingToDelete()) {
3047
+ PurgeObsoleteFiles(job_context);
3048
+ }
3049
+ job_context.Clean();
3050
+ mutex_.Lock();
3051
+ }
3052
+ TEST_SYNC_POINT("DBImpl::BackgroundCallFlush:ContextCleanedUp");
3053
+
3054
+ assert(num_running_flushes_ > 0);
3055
+ num_running_flushes_--;
3056
+ bg_flush_scheduled_--;
3057
+ // See if there's more work to be done
3058
+ MaybeScheduleFlushOrCompaction();
3059
+ atomic_flush_install_cv_.SignalAll();
3060
+ bg_cv_.SignalAll();
3061
+ // IMPORTANT: there should be no code after calling SignalAll. This call may
3062
+ // signal the DB destructor that it's OK to proceed with destruction. In
3063
+ // that case, all DB variables will be dealloacated and referencing them
3064
+ // will cause trouble.
3065
+ }
3066
+ }
3067
+
3068
+ void DBImpl::BackgroundCallCompaction(PrepickedCompaction* prepicked_compaction,
3069
+ Env::Priority bg_thread_pri) {
3070
+ bool made_progress = false;
3071
+ JobContext job_context(next_job_id_.fetch_add(1), true);
3072
+ TEST_SYNC_POINT("BackgroundCallCompaction:0");
3073
+ LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL,
3074
+ immutable_db_options_.info_log.get());
3075
+ {
3076
+ InstrumentedMutexLock l(&mutex_);
3077
+
3078
+ num_running_compactions_++;
3079
+
3080
+ std::unique_ptr<std::list<uint64_t>::iterator>
3081
+ pending_outputs_inserted_elem(new std::list<uint64_t>::iterator(
3082
+ CaptureCurrentFileNumberInPendingOutputs()));
3083
+
3084
+ assert((bg_thread_pri == Env::Priority::BOTTOM &&
3085
+ bg_bottom_compaction_scheduled_) ||
3086
+ (bg_thread_pri == Env::Priority::LOW && bg_compaction_scheduled_));
3087
+ Status s = BackgroundCompaction(&made_progress, &job_context, &log_buffer,
3088
+ prepicked_compaction, bg_thread_pri);
3089
+ TEST_SYNC_POINT("BackgroundCallCompaction:1");
3090
+ if (s.IsBusy()) {
3091
+ bg_cv_.SignalAll(); // In case a waiter can proceed despite the error
3092
+ mutex_.Unlock();
3093
+ immutable_db_options_.clock->SleepForMicroseconds(
3094
+ 10000); // prevent hot loop
3095
+ mutex_.Lock();
3096
+ } else if (!s.ok() && !s.IsShutdownInProgress() &&
3097
+ !s.IsManualCompactionPaused() && !s.IsColumnFamilyDropped()) {
3098
+ // Wait a little bit before retrying background compaction in
3099
+ // case this is an environmental problem and we do not want to
3100
+ // chew up resources for failed compactions for the duration of
3101
+ // the problem.
3102
+ uint64_t error_cnt =
3103
+ default_cf_internal_stats_->BumpAndGetBackgroundErrorCount();
3104
+ bg_cv_.SignalAll(); // In case a waiter can proceed despite the error
3105
+ mutex_.Unlock();
3106
+ log_buffer.FlushBufferToLog();
3107
+ ROCKS_LOG_ERROR(immutable_db_options_.info_log,
3108
+ "Waiting after background compaction error: %s, "
3109
+ "Accumulated background error counts: %" PRIu64,
3110
+ s.ToString().c_str(), error_cnt);
3111
+ LogFlush(immutable_db_options_.info_log);
3112
+ immutable_db_options_.clock->SleepForMicroseconds(1000000);
3113
+ mutex_.Lock();
3114
+ } else if (s.IsManualCompactionPaused()) {
3115
+ assert(prepicked_compaction);
3116
+ ManualCompactionState* m = prepicked_compaction->manual_compaction_state;
3117
+ assert(m);
3118
+ ROCKS_LOG_BUFFER(&log_buffer, "[%s] [JOB %d] Manual compaction paused",
3119
+ m->cfd->GetName().c_str(), job_context.job_id);
3120
+ }
3121
+
3122
+ ReleaseFileNumberFromPendingOutputs(pending_outputs_inserted_elem);
3123
+
3124
+ // If compaction failed, we want to delete all temporary files that we
3125
+ // might have created (they might not be all recorded in job_context in
3126
+ // case of a failure). Thus, we force full scan in FindObsoleteFiles()
3127
+ FindObsoleteFiles(&job_context, !s.ok() && !s.IsShutdownInProgress() &&
3128
+ !s.IsManualCompactionPaused() &&
3129
+ !s.IsColumnFamilyDropped() &&
3130
+ !s.IsBusy());
3131
+ TEST_SYNC_POINT("DBImpl::BackgroundCallCompaction:FoundObsoleteFiles");
3132
+
3133
+ // delete unnecessary files if any, this is done outside the mutex
3134
+ if (job_context.HaveSomethingToClean() ||
3135
+ job_context.HaveSomethingToDelete() || !log_buffer.IsEmpty()) {
3136
+ mutex_.Unlock();
3137
+ // Have to flush the info logs before bg_compaction_scheduled_--
3138
+ // because if bg_flush_scheduled_ becomes 0 and the lock is
3139
+ // released, the deconstructor of DB can kick in and destroy all the
3140
+ // states of DB so info_log might not be available after that point.
3141
+ // It also applies to access other states that DB owns.
3142
+ log_buffer.FlushBufferToLog();
3143
+ if (job_context.HaveSomethingToDelete()) {
3144
+ PurgeObsoleteFiles(job_context);
3145
+ TEST_SYNC_POINT("DBImpl::BackgroundCallCompaction:PurgedObsoleteFiles");
3146
+ }
3147
+ job_context.Clean();
3148
+ mutex_.Lock();
3149
+ }
3150
+
3151
+ assert(num_running_compactions_ > 0);
3152
+ num_running_compactions_--;
3153
+
3154
+ if (bg_thread_pri == Env::Priority::LOW) {
3155
+ bg_compaction_scheduled_--;
3156
+ } else {
3157
+ assert(bg_thread_pri == Env::Priority::BOTTOM);
3158
+ bg_bottom_compaction_scheduled_--;
3159
+ }
3160
+
3161
+ // See if there's more work to be done
3162
+ MaybeScheduleFlushOrCompaction();
3163
+
3164
+ if (prepicked_compaction != nullptr &&
3165
+ prepicked_compaction->task_token != nullptr) {
3166
+ // Releasing task tokens affects (and asserts on) the DB state, so
3167
+ // must be done before we potentially signal the DB close process to
3168
+ // proceed below.
3169
+ prepicked_compaction->task_token.reset();
3170
+ }
3171
+
3172
+ if (made_progress ||
3173
+ (bg_compaction_scheduled_ == 0 &&
3174
+ bg_bottom_compaction_scheduled_ == 0) ||
3175
+ HasPendingManualCompaction() || unscheduled_compactions_ == 0) {
3176
+ // signal if
3177
+ // * made_progress -- need to wakeup DelayWrite
3178
+ // * bg_{bottom,}_compaction_scheduled_ == 0 -- need to wakeup ~DBImpl
3179
+ // * HasPendingManualCompaction -- need to wakeup RunManualCompaction
3180
+ // If none of this is true, there is no need to signal since nobody is
3181
+ // waiting for it
3182
+ bg_cv_.SignalAll();
3183
+ }
3184
+ // IMPORTANT: there should be no code after calling SignalAll. This call may
3185
+ // signal the DB destructor that it's OK to proceed with destruction. In
3186
+ // that case, all DB variables will be dealloacated and referencing them
3187
+ // will cause trouble.
3188
+ }
3189
+ }
3190
+
3191
+ Status DBImpl::BackgroundCompaction(bool* made_progress,
3192
+ JobContext* job_context,
3193
+ LogBuffer* log_buffer,
3194
+ PrepickedCompaction* prepicked_compaction,
3195
+ Env::Priority thread_pri) {
3196
+ ManualCompactionState* manual_compaction =
3197
+ prepicked_compaction == nullptr
3198
+ ? nullptr
3199
+ : prepicked_compaction->manual_compaction_state;
3200
+ *made_progress = false;
3201
+ mutex_.AssertHeld();
3202
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:Start");
3203
+
3204
+ const ReadOptions read_options(Env::IOActivity::kCompaction);
3205
+
3206
+ bool is_manual = (manual_compaction != nullptr);
3207
+ std::unique_ptr<Compaction> c;
3208
+ if (prepicked_compaction != nullptr &&
3209
+ prepicked_compaction->compaction != nullptr) {
3210
+ c.reset(prepicked_compaction->compaction);
3211
+ }
3212
+ bool is_prepicked = is_manual || c;
3213
+
3214
+ // (manual_compaction->in_progress == false);
3215
+ bool trivial_move_disallowed =
3216
+ is_manual && manual_compaction->disallow_trivial_move;
3217
+
3218
+ CompactionJobStats compaction_job_stats;
3219
+ Status status;
3220
+ if (!error_handler_.IsBGWorkStopped()) {
3221
+ if (shutting_down_.load(std::memory_order_acquire)) {
3222
+ status = Status::ShutdownInProgress();
3223
+ } else if (is_manual &&
3224
+ manual_compaction->canceled.load(std::memory_order_acquire)) {
3225
+ status = Status::Incomplete(Status::SubCode::kManualCompactionPaused);
3226
+ }
3227
+ } else {
3228
+ status = error_handler_.GetBGError();
3229
+ // If we get here, it means a hard error happened after this compaction
3230
+ // was scheduled by MaybeScheduleFlushOrCompaction(), but before it got
3231
+ // a chance to execute. Since we didn't pop a cfd from the compaction
3232
+ // queue, increment unscheduled_compactions_
3233
+ unscheduled_compactions_++;
3234
+ }
3235
+
3236
+ if (!status.ok()) {
3237
+ if (is_manual) {
3238
+ manual_compaction->status = status;
3239
+ manual_compaction->done = true;
3240
+ manual_compaction->in_progress = false;
3241
+ manual_compaction = nullptr;
3242
+ }
3243
+ if (c) {
3244
+ c->ReleaseCompactionFiles(status);
3245
+ c.reset();
3246
+ }
3247
+ return status;
3248
+ }
3249
+
3250
+ if (is_manual) {
3251
+ // another thread cannot pick up the same work
3252
+ manual_compaction->in_progress = true;
3253
+ }
3254
+
3255
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:InProgress");
3256
+
3257
+ std::unique_ptr<TaskLimiterToken> task_token;
3258
+
3259
+ // InternalKey manual_end_storage;
3260
+ // InternalKey* manual_end = &manual_end_storage;
3261
+ bool sfm_reserved_compact_space = false;
3262
+ if (is_manual) {
3263
+ ManualCompactionState* m = manual_compaction;
3264
+ assert(m->in_progress);
3265
+ if (!c) {
3266
+ m->done = true;
3267
+ m->manual_end = nullptr;
3268
+ ROCKS_LOG_BUFFER(
3269
+ log_buffer,
3270
+ "[%s] Manual compaction from level-%d from %s .. "
3271
+ "%s; nothing to do\n",
3272
+ m->cfd->GetName().c_str(), m->input_level,
3273
+ (m->begin ? m->begin->DebugString(true).c_str() : "(begin)"),
3274
+ (m->end ? m->end->DebugString(true).c_str() : "(end)"));
3275
+ } else {
3276
+ // First check if we have enough room to do the compaction
3277
+ bool enough_room = EnoughRoomForCompaction(
3278
+ m->cfd, *(c->inputs()), &sfm_reserved_compact_space, log_buffer);
3279
+
3280
+ if (!enough_room) {
3281
+ // Then don't do the compaction
3282
+ c->ReleaseCompactionFiles(status);
3283
+ c.reset();
3284
+ // m's vars will get set properly at the end of this function,
3285
+ // as long as status == CompactionTooLarge
3286
+ status = Status::CompactionTooLarge();
3287
+ } else {
3288
+ ROCKS_LOG_BUFFER(
3289
+ log_buffer,
3290
+ "[%s] Manual compaction from level-%d to level-%d from %s .. "
3291
+ "%s; will stop at %s\n",
3292
+ m->cfd->GetName().c_str(), m->input_level, c->output_level(),
3293
+ (m->begin ? m->begin->DebugString(true).c_str() : "(begin)"),
3294
+ (m->end ? m->end->DebugString(true).c_str() : "(end)"),
3295
+ ((m->done || m->manual_end == nullptr)
3296
+ ? "(end)"
3297
+ : m->manual_end->DebugString(true).c_str()));
3298
+ }
3299
+ }
3300
+ } else if (!is_prepicked && !compaction_queue_.empty()) {
3301
+ if (HasExclusiveManualCompaction()) {
3302
+ // Can't compact right now, but try again later
3303
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction()::Conflict");
3304
+
3305
+ // Stay in the compaction queue.
3306
+ unscheduled_compactions_++;
3307
+
3308
+ return Status::OK();
3309
+ }
3310
+
3311
+ auto cfd = PickCompactionFromQueue(&task_token, log_buffer);
3312
+ if (cfd == nullptr) {
3313
+ // Can't find any executable task from the compaction queue.
3314
+ // All tasks have been throttled by compaction thread limiter.
3315
+ ++unscheduled_compactions_;
3316
+ return Status::Busy();
3317
+ }
3318
+
3319
+ // We unreference here because the following code will take a Ref() on
3320
+ // this cfd if it is going to use it (Compaction class holds a
3321
+ // reference).
3322
+ // This will all happen under a mutex so we don't have to be afraid of
3323
+ // somebody else deleting it.
3324
+ if (cfd->UnrefAndTryDelete()) {
3325
+ // This was the last reference of the column family, so no need to
3326
+ // compact.
3327
+ return Status::OK();
3328
+ }
3329
+
3330
+ // Pick up latest mutable CF Options and use it throughout the
3331
+ // compaction job
3332
+ // Compaction makes a copy of the latest MutableCFOptions. It should be used
3333
+ // throughout the compaction procedure to make sure consistency. It will
3334
+ // eventually be installed into SuperVersion
3335
+ auto* mutable_cf_options = cfd->GetLatestMutableCFOptions();
3336
+ if (!mutable_cf_options->disable_auto_compactions && !cfd->IsDropped()) {
3337
+ // NOTE: try to avoid unnecessary copy of MutableCFOptions if
3338
+ // compaction is not necessary. Need to make sure mutex is held
3339
+ // until we make a copy in the following code
3340
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction():BeforePickCompaction");
3341
+ c.reset(cfd->PickCompaction(*mutable_cf_options, mutable_db_options_,
3342
+ log_buffer));
3343
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction():AfterPickCompaction");
3344
+
3345
+ if (c != nullptr) {
3346
+ bool enough_room = EnoughRoomForCompaction(
3347
+ cfd, *(c->inputs()), &sfm_reserved_compact_space, log_buffer);
3348
+
3349
+ if (!enough_room) {
3350
+ // Then don't do the compaction
3351
+ c->ReleaseCompactionFiles(status);
3352
+ c->column_family_data()
3353
+ ->current()
3354
+ ->storage_info()
3355
+ ->ComputeCompactionScore(*(c->immutable_options()),
3356
+ *(c->mutable_cf_options()));
3357
+ AddToCompactionQueue(cfd);
3358
+ ++unscheduled_compactions_;
3359
+
3360
+ c.reset();
3361
+ // Don't need to sleep here, because BackgroundCallCompaction
3362
+ // will sleep if !s.ok()
3363
+ status = Status::CompactionTooLarge();
3364
+ } else {
3365
+ // update statistics
3366
+ size_t num_files = 0;
3367
+ for (auto& each_level : *c->inputs()) {
3368
+ num_files += each_level.files.size();
3369
+ }
3370
+ RecordInHistogram(stats_, NUM_FILES_IN_SINGLE_COMPACTION, num_files);
3371
+
3372
+ // There are three things that can change compaction score:
3373
+ // 1) When flush or compaction finish. This case is covered by
3374
+ // InstallSuperVersionAndScheduleWork
3375
+ // 2) When MutableCFOptions changes. This case is also covered by
3376
+ // InstallSuperVersionAndScheduleWork, because this is when the new
3377
+ // options take effect.
3378
+ // 3) When we Pick a new compaction, we "remove" those files being
3379
+ // compacted from the calculation, which then influences compaction
3380
+ // score. Here we check if we need the new compaction even without the
3381
+ // files that are currently being compacted. If we need another
3382
+ // compaction, we might be able to execute it in parallel, so we add
3383
+ // it to the queue and schedule a new thread.
3384
+ if (cfd->NeedsCompaction()) {
3385
+ // Yes, we need more compactions!
3386
+ AddToCompactionQueue(cfd);
3387
+ ++unscheduled_compactions_;
3388
+ MaybeScheduleFlushOrCompaction();
3389
+ }
3390
+ }
3391
+ }
3392
+ }
3393
+ }
3394
+
3395
+ IOStatus io_s;
3396
+ if (!c) {
3397
+ // Nothing to do
3398
+ ROCKS_LOG_BUFFER(log_buffer, "Compaction nothing to do");
3399
+ } else if (c->deletion_compaction()) {
3400
+ // TODO(icanadi) Do we want to honor snapshots here? i.e. not delete old
3401
+ // file if there is alive snapshot pointing to it
3402
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:BeforeCompaction",
3403
+ c->column_family_data());
3404
+ assert(c->num_input_files(1) == 0);
3405
+ assert(c->column_family_data()->ioptions()->compaction_style ==
3406
+ kCompactionStyleFIFO);
3407
+
3408
+ compaction_job_stats.num_input_files = c->num_input_files(0);
3409
+
3410
+ NotifyOnCompactionBegin(c->column_family_data(), c.get(), status,
3411
+ compaction_job_stats, job_context->job_id);
3412
+
3413
+ for (const auto& f : *c->inputs(0)) {
3414
+ c->edit()->DeleteFile(c->level(), f->fd.GetNumber());
3415
+ }
3416
+ status = versions_->LogAndApply(
3417
+ c->column_family_data(), *c->mutable_cf_options(), read_options,
3418
+ c->edit(), &mutex_, directories_.GetDbDir());
3419
+ io_s = versions_->io_status();
3420
+ InstallSuperVersionAndScheduleWork(c->column_family_data(),
3421
+ &job_context->superversion_contexts[0],
3422
+ *c->mutable_cf_options());
3423
+ ROCKS_LOG_BUFFER(log_buffer, "[%s] Deleted %d files\n",
3424
+ c->column_family_data()->GetName().c_str(),
3425
+ c->num_input_files(0));
3426
+ *made_progress = true;
3427
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:AfterCompaction",
3428
+ c->column_family_data());
3429
+ } else if (!trivial_move_disallowed && c->IsTrivialMove()) {
3430
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:TrivialMove");
3431
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:BeforeCompaction",
3432
+ c->column_family_data());
3433
+ // Instrument for event update
3434
+ // TODO(yhchiang): add op details for showing trivial-move.
3435
+ ThreadStatusUtil::SetColumnFamily(c->column_family_data());
3436
+ ThreadStatusUtil::SetThreadOperation(ThreadStatus::OP_COMPACTION);
3437
+
3438
+ compaction_job_stats.num_input_files = c->num_input_files(0);
3439
+
3440
+ NotifyOnCompactionBegin(c->column_family_data(), c.get(), status,
3441
+ compaction_job_stats, job_context->job_id);
3442
+
3443
+ // Move files to next level
3444
+ int32_t moved_files = 0;
3445
+ int64_t moved_bytes = 0;
3446
+ for (unsigned int l = 0; l < c->num_input_levels(); l++) {
3447
+ if (c->level(l) == c->output_level()) {
3448
+ continue;
3449
+ }
3450
+ for (size_t i = 0; i < c->num_input_files(l); i++) {
3451
+ FileMetaData* f = c->input(l, i);
3452
+ c->edit()->DeleteFile(c->level(l), f->fd.GetNumber());
3453
+ c->edit()->AddFile(
3454
+ c->output_level(), f->fd.GetNumber(), f->fd.GetPathId(),
3455
+ f->fd.GetFileSize(), f->smallest, f->largest, f->fd.smallest_seqno,
3456
+ f->fd.largest_seqno, f->marked_for_compaction, f->temperature,
3457
+ f->oldest_blob_file_number, f->oldest_ancester_time,
3458
+ f->file_creation_time, f->epoch_number, f->file_checksum,
3459
+ f->file_checksum_func_name, f->unique_id,
3460
+ f->compensated_range_deletion_size, f->tail_size);
3461
+
3462
+ ROCKS_LOG_BUFFER(
3463
+ log_buffer,
3464
+ "[%s] Moving #%" PRIu64 " to level-%d %" PRIu64 " bytes\n",
3465
+ c->column_family_data()->GetName().c_str(), f->fd.GetNumber(),
3466
+ c->output_level(), f->fd.GetFileSize());
3467
+ ++moved_files;
3468
+ moved_bytes += f->fd.GetFileSize();
3469
+ }
3470
+ }
3471
+ if (c->compaction_reason() == CompactionReason::kLevelMaxLevelSize &&
3472
+ c->immutable_options()->compaction_pri == kRoundRobin) {
3473
+ int start_level = c->start_level();
3474
+ if (start_level > 0) {
3475
+ auto vstorage = c->input_version()->storage_info();
3476
+ c->edit()->AddCompactCursor(
3477
+ start_level,
3478
+ vstorage->GetNextCompactCursor(start_level, c->num_input_files(0)));
3479
+ }
3480
+ }
3481
+ status = versions_->LogAndApply(
3482
+ c->column_family_data(), *c->mutable_cf_options(), read_options,
3483
+ c->edit(), &mutex_, directories_.GetDbDir());
3484
+ io_s = versions_->io_status();
3485
+ // Use latest MutableCFOptions
3486
+ InstallSuperVersionAndScheduleWork(c->column_family_data(),
3487
+ &job_context->superversion_contexts[0],
3488
+ *c->mutable_cf_options());
3489
+
3490
+ VersionStorageInfo::LevelSummaryStorage tmp;
3491
+ c->column_family_data()->internal_stats()->IncBytesMoved(c->output_level(),
3492
+ moved_bytes);
3493
+ {
3494
+ event_logger_.LogToBuffer(log_buffer)
3495
+ << "job" << job_context->job_id << "event"
3496
+ << "trivial_move"
3497
+ << "destination_level" << c->output_level() << "files" << moved_files
3498
+ << "total_files_size" << moved_bytes;
3499
+ }
3500
+ ROCKS_LOG_BUFFER(
3501
+ log_buffer,
3502
+ "[%s] Moved #%d files to level-%d %" PRIu64 " bytes %s: %s\n",
3503
+ c->column_family_data()->GetName().c_str(), moved_files,
3504
+ c->output_level(), moved_bytes, status.ToString().c_str(),
3505
+ c->column_family_data()->current()->storage_info()->LevelSummary(&tmp));
3506
+ *made_progress = true;
3507
+
3508
+ // Clear Instrument
3509
+ ThreadStatusUtil::ResetThreadStatus();
3510
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:AfterCompaction",
3511
+ c->column_family_data());
3512
+ } else if (!is_prepicked && c->output_level() > 0 &&
3513
+ c->output_level() ==
3514
+ c->column_family_data()
3515
+ ->current()
3516
+ ->storage_info()
3517
+ ->MaxOutputLevel(
3518
+ immutable_db_options_.allow_ingest_behind) &&
3519
+ env_->GetBackgroundThreads(Env::Priority::BOTTOM) > 0) {
3520
+ // Forward compactions involving last level to the bottom pool if it exists,
3521
+ // such that compactions unlikely to contribute to write stalls can be
3522
+ // delayed or deprioritized.
3523
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:ForwardToBottomPriPool");
3524
+ CompactionArg* ca = new CompactionArg;
3525
+ ca->db = this;
3526
+ ca->compaction_pri_ = Env::Priority::BOTTOM;
3527
+ ca->prepicked_compaction = new PrepickedCompaction;
3528
+ ca->prepicked_compaction->compaction = c.release();
3529
+ ca->prepicked_compaction->manual_compaction_state = nullptr;
3530
+ // Transfer requested token, so it doesn't need to do it again.
3531
+ ca->prepicked_compaction->task_token = std::move(task_token);
3532
+ ++bg_bottom_compaction_scheduled_;
3533
+ env_->Schedule(&DBImpl::BGWorkBottomCompaction, ca, Env::Priority::BOTTOM,
3534
+ this, &DBImpl::UnscheduleCompactionCallback);
3535
+ } else {
3536
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:BeforeCompaction",
3537
+ c->column_family_data());
3538
+ int output_level __attribute__((__unused__));
3539
+ output_level = c->output_level();
3540
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:NonTrivial",
3541
+ &output_level);
3542
+ std::vector<SequenceNumber> snapshot_seqs;
3543
+ SequenceNumber earliest_write_conflict_snapshot;
3544
+ SnapshotChecker* snapshot_checker;
3545
+ GetSnapshotContext(job_context, &snapshot_seqs,
3546
+ &earliest_write_conflict_snapshot, &snapshot_checker);
3547
+ assert(is_snapshot_supported_ || snapshots_.empty());
3548
+
3549
+ CompactionJob compaction_job(
3550
+ job_context->job_id, c.get(), immutable_db_options_,
3551
+ mutable_db_options_, file_options_for_compaction_, versions_.get(),
3552
+ &shutting_down_, log_buffer, directories_.GetDbDir(),
3553
+ GetDataDir(c->column_family_data(), c->output_path_id()),
3554
+ GetDataDir(c->column_family_data(), 0), stats_, &mutex_,
3555
+ &error_handler_, snapshot_seqs, earliest_write_conflict_snapshot,
3556
+ snapshot_checker, job_context, table_cache_, &event_logger_,
3557
+ c->mutable_cf_options()->paranoid_file_checks,
3558
+ c->mutable_cf_options()->report_bg_io_stats, dbname_,
3559
+ &compaction_job_stats, thread_pri, io_tracer_,
3560
+ is_manual ? manual_compaction->canceled
3561
+ : kManualCompactionCanceledFalse_,
3562
+ db_id_, db_session_id_, c->column_family_data()->GetFullHistoryTsLow(),
3563
+ c->trim_ts(), &blob_callback_, &bg_compaction_scheduled_,
3564
+ &bg_bottom_compaction_scheduled_);
3565
+ compaction_job.Prepare();
3566
+
3567
+ NotifyOnCompactionBegin(c->column_family_data(), c.get(), status,
3568
+ compaction_job_stats, job_context->job_id);
3569
+ mutex_.Unlock();
3570
+ TEST_SYNC_POINT_CALLBACK(
3571
+ "DBImpl::BackgroundCompaction:NonTrivial:BeforeRun", nullptr);
3572
+ // Should handle error?
3573
+ compaction_job.Run().PermitUncheckedError();
3574
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:NonTrivial:AfterRun");
3575
+ mutex_.Lock();
3576
+
3577
+ status = compaction_job.Install(*c->mutable_cf_options());
3578
+ io_s = compaction_job.io_status();
3579
+ if (status.ok()) {
3580
+ InstallSuperVersionAndScheduleWork(c->column_family_data(),
3581
+ &job_context->superversion_contexts[0],
3582
+ *c->mutable_cf_options());
3583
+ }
3584
+ *made_progress = true;
3585
+ TEST_SYNC_POINT_CALLBACK("DBImpl::BackgroundCompaction:AfterCompaction",
3586
+ c->column_family_data());
3587
+ }
3588
+
3589
+ if (status.ok() && !io_s.ok()) {
3590
+ status = io_s;
3591
+ } else {
3592
+ io_s.PermitUncheckedError();
3593
+ }
3594
+
3595
+ if (c != nullptr) {
3596
+ c->ReleaseCompactionFiles(status);
3597
+ *made_progress = true;
3598
+
3599
+ // Need to make sure SstFileManager does its bookkeeping
3600
+ auto sfm = static_cast<SstFileManagerImpl*>(
3601
+ immutable_db_options_.sst_file_manager.get());
3602
+ if (sfm && sfm_reserved_compact_space) {
3603
+ sfm->OnCompactionCompletion(c.get());
3604
+ }
3605
+
3606
+ NotifyOnCompactionCompleted(c->column_family_data(), c.get(), status,
3607
+ compaction_job_stats, job_context->job_id);
3608
+ }
3609
+
3610
+ if (status.ok() || status.IsCompactionTooLarge() ||
3611
+ status.IsManualCompactionPaused()) {
3612
+ // Done
3613
+ } else if (status.IsColumnFamilyDropped() || status.IsShutdownInProgress()) {
3614
+ // Ignore compaction errors found during shutting down
3615
+ } else {
3616
+ ROCKS_LOG_WARN(immutable_db_options_.info_log, "Compaction error: %s",
3617
+ status.ToString().c_str());
3618
+ if (!io_s.ok()) {
3619
+ // Error while writing to MANIFEST.
3620
+ // In fact, versions_->io_status() can also be the result of renaming
3621
+ // CURRENT file. With current code, it's just difficult to tell. So just
3622
+ // be pessimistic and try write to a new MANIFEST.
3623
+ // TODO: distinguish between MANIFEST write and CURRENT renaming
3624
+ auto err_reason = versions_->io_status().ok()
3625
+ ? BackgroundErrorReason::kCompaction
3626
+ : BackgroundErrorReason::kManifestWrite;
3627
+ error_handler_.SetBGError(io_s, err_reason);
3628
+ } else {
3629
+ error_handler_.SetBGError(status, BackgroundErrorReason::kCompaction);
3630
+ }
3631
+ if (c != nullptr && !is_manual && !error_handler_.IsBGWorkStopped()) {
3632
+ // Put this cfd back in the compaction queue so we can retry after some
3633
+ // time
3634
+ auto cfd = c->column_family_data();
3635
+ assert(cfd != nullptr);
3636
+ // Since this compaction failed, we need to recompute the score so it
3637
+ // takes the original input files into account
3638
+ c->column_family_data()
3639
+ ->current()
3640
+ ->storage_info()
3641
+ ->ComputeCompactionScore(*(c->immutable_options()),
3642
+ *(c->mutable_cf_options()));
3643
+ if (!cfd->queued_for_compaction()) {
3644
+ AddToCompactionQueue(cfd);
3645
+ ++unscheduled_compactions_;
3646
+ }
3647
+ }
3648
+ }
3649
+ // this will unref its input_version and column_family_data
3650
+ c.reset();
3651
+
3652
+ if (is_manual) {
3653
+ ManualCompactionState* m = manual_compaction;
3654
+ if (!status.ok()) {
3655
+ m->status = status;
3656
+ m->done = true;
3657
+ }
3658
+ // For universal compaction:
3659
+ // Because universal compaction always happens at level 0, so one
3660
+ // compaction will pick up all overlapped files. No files will be
3661
+ // filtered out due to size limit and left for a successive compaction.
3662
+ // So we can safely conclude the current compaction.
3663
+ //
3664
+ // Also note that, if we don't stop here, then the current compaction
3665
+ // writes a new file back to level 0, which will be used in successive
3666
+ // compaction. Hence the manual compaction will never finish.
3667
+ //
3668
+ // Stop the compaction if manual_end points to nullptr -- this means
3669
+ // that we compacted the whole range. manual_end should always point
3670
+ // to nullptr in case of universal compaction
3671
+ if (m->manual_end == nullptr) {
3672
+ m->done = true;
3673
+ }
3674
+ if (!m->done) {
3675
+ // We only compacted part of the requested range. Update *m
3676
+ // to the range that is left to be compacted.
3677
+ // Universal and FIFO compactions should always compact the whole range
3678
+ assert(m->cfd->ioptions()->compaction_style !=
3679
+ kCompactionStyleUniversal ||
3680
+ m->cfd->ioptions()->num_levels > 1);
3681
+ assert(m->cfd->ioptions()->compaction_style != kCompactionStyleFIFO);
3682
+ m->tmp_storage = *m->manual_end;
3683
+ m->begin = &m->tmp_storage;
3684
+ m->incomplete = true;
3685
+ }
3686
+ m->in_progress = false; // not being processed anymore
3687
+ }
3688
+ TEST_SYNC_POINT("DBImpl::BackgroundCompaction:Finish");
3689
+ return status;
3690
+ }
3691
+
3692
+ bool DBImpl::HasPendingManualCompaction() {
3693
+ return (!manual_compaction_dequeue_.empty());
3694
+ }
3695
+
3696
+ void DBImpl::AddManualCompaction(DBImpl::ManualCompactionState* m) {
3697
+ assert(manual_compaction_paused_ == 0);
3698
+ manual_compaction_dequeue_.push_back(m);
3699
+ }
3700
+
3701
+ void DBImpl::RemoveManualCompaction(DBImpl::ManualCompactionState* m) {
3702
+ // Remove from queue
3703
+ std::deque<ManualCompactionState*>::iterator it =
3704
+ manual_compaction_dequeue_.begin();
3705
+ while (it != manual_compaction_dequeue_.end()) {
3706
+ if (m == (*it)) {
3707
+ it = manual_compaction_dequeue_.erase(it);
3708
+ return;
3709
+ }
3710
+ ++it;
3711
+ }
3712
+ assert(false);
3713
+ return;
3714
+ }
3715
+
3716
+ bool DBImpl::ShouldntRunManualCompaction(ManualCompactionState* m) {
3717
+ if (m->exclusive) {
3718
+ return (bg_bottom_compaction_scheduled_ > 0 ||
3719
+ bg_compaction_scheduled_ > 0);
3720
+ }
3721
+ std::deque<ManualCompactionState*>::iterator it =
3722
+ manual_compaction_dequeue_.begin();
3723
+ bool seen = false;
3724
+ while (it != manual_compaction_dequeue_.end()) {
3725
+ if (m == (*it)) {
3726
+ ++it;
3727
+ seen = true;
3728
+ continue;
3729
+ } else if (MCOverlap(m, (*it)) && (!seen && !(*it)->in_progress)) {
3730
+ // Consider the other manual compaction *it, conflicts if:
3731
+ // overlaps with m
3732
+ // and (*it) is ahead in the queue and is not yet in progress
3733
+ return true;
3734
+ }
3735
+ ++it;
3736
+ }
3737
+ return false;
3738
+ }
3739
+
3740
+ bool DBImpl::HaveManualCompaction(ColumnFamilyData* cfd) {
3741
+ // Remove from priority queue
3742
+ std::deque<ManualCompactionState*>::iterator it =
3743
+ manual_compaction_dequeue_.begin();
3744
+ while (it != manual_compaction_dequeue_.end()) {
3745
+ if ((*it)->exclusive) {
3746
+ return true;
3747
+ }
3748
+ if ((cfd == (*it)->cfd) && (!((*it)->in_progress || (*it)->done))) {
3749
+ // Allow automatic compaction if manual compaction is
3750
+ // in progress
3751
+ return true;
3752
+ }
3753
+ ++it;
3754
+ }
3755
+ return false;
3756
+ }
3757
+
3758
+ bool DBImpl::HasExclusiveManualCompaction() {
3759
+ // Remove from priority queue
3760
+ std::deque<ManualCompactionState*>::iterator it =
3761
+ manual_compaction_dequeue_.begin();
3762
+ while (it != manual_compaction_dequeue_.end()) {
3763
+ if ((*it)->exclusive) {
3764
+ return true;
3765
+ }
3766
+ ++it;
3767
+ }
3768
+ return false;
3769
+ }
3770
+
3771
+ bool DBImpl::MCOverlap(ManualCompactionState* m, ManualCompactionState* m1) {
3772
+ if ((m->exclusive) || (m1->exclusive)) {
3773
+ return true;
3774
+ }
3775
+ if (m->cfd != m1->cfd) {
3776
+ return false;
3777
+ }
3778
+ return false;
3779
+ }
3780
+
3781
+ void DBImpl::BuildCompactionJobInfo(
3782
+ const ColumnFamilyData* cfd, Compaction* c, const Status& st,
3783
+ const CompactionJobStats& compaction_job_stats, const int job_id,
3784
+ const Version* current, CompactionJobInfo* compaction_job_info) const {
3785
+ assert(compaction_job_info != nullptr);
3786
+ compaction_job_info->cf_id = cfd->GetID();
3787
+ compaction_job_info->cf_name = cfd->GetName();
3788
+ compaction_job_info->status = st;
3789
+ compaction_job_info->thread_id = env_->GetThreadID();
3790
+ compaction_job_info->job_id = job_id;
3791
+ compaction_job_info->base_input_level = c->start_level();
3792
+ compaction_job_info->output_level = c->output_level();
3793
+ compaction_job_info->stats = compaction_job_stats;
3794
+ compaction_job_info->table_properties = c->GetOutputTableProperties();
3795
+ compaction_job_info->compaction_reason = c->compaction_reason();
3796
+ compaction_job_info->compression = c->output_compression();
3797
+
3798
+ const ReadOptions read_options(Env::IOActivity::kCompaction);
3799
+ for (size_t i = 0; i < c->num_input_levels(); ++i) {
3800
+ for (const auto fmd : *c->inputs(i)) {
3801
+ const FileDescriptor& desc = fmd->fd;
3802
+ const uint64_t file_number = desc.GetNumber();
3803
+ auto fn = TableFileName(c->immutable_options()->cf_paths, file_number,
3804
+ desc.GetPathId());
3805
+ compaction_job_info->input_files.push_back(fn);
3806
+ compaction_job_info->input_file_infos.push_back(CompactionFileInfo{
3807
+ static_cast<int>(i), file_number, fmd->oldest_blob_file_number});
3808
+ if (compaction_job_info->table_properties.count(fn) == 0) {
3809
+ std::shared_ptr<const TableProperties> tp;
3810
+ auto s = current->GetTableProperties(read_options, &tp, fmd, &fn);
3811
+ if (s.ok()) {
3812
+ compaction_job_info->table_properties[fn] = tp;
3813
+ }
3814
+ }
3815
+ }
3816
+ }
3817
+ for (const auto& newf : c->edit()->GetNewFiles()) {
3818
+ const FileMetaData& meta = newf.second;
3819
+ const FileDescriptor& desc = meta.fd;
3820
+ const uint64_t file_number = desc.GetNumber();
3821
+ compaction_job_info->output_files.push_back(TableFileName(
3822
+ c->immutable_options()->cf_paths, file_number, desc.GetPathId()));
3823
+ compaction_job_info->output_file_infos.push_back(CompactionFileInfo{
3824
+ newf.first, file_number, meta.oldest_blob_file_number});
3825
+ }
3826
+ compaction_job_info->blob_compression_type =
3827
+ c->mutable_cf_options()->blob_compression_type;
3828
+
3829
+ // Update BlobFilesInfo.
3830
+ for (const auto& blob_file : c->edit()->GetBlobFileAdditions()) {
3831
+ BlobFileAdditionInfo blob_file_addition_info(
3832
+ BlobFileName(c->immutable_options()->cf_paths.front().path,
3833
+ blob_file.GetBlobFileNumber()) /*blob_file_path*/,
3834
+ blob_file.GetBlobFileNumber(), blob_file.GetTotalBlobCount(),
3835
+ blob_file.GetTotalBlobBytes());
3836
+ compaction_job_info->blob_file_addition_infos.emplace_back(
3837
+ std::move(blob_file_addition_info));
3838
+ }
3839
+
3840
+ // Update BlobFilesGarbageInfo.
3841
+ for (const auto& blob_file : c->edit()->GetBlobFileGarbages()) {
3842
+ BlobFileGarbageInfo blob_file_garbage_info(
3843
+ BlobFileName(c->immutable_options()->cf_paths.front().path,
3844
+ blob_file.GetBlobFileNumber()) /*blob_file_path*/,
3845
+ blob_file.GetBlobFileNumber(), blob_file.GetGarbageBlobCount(),
3846
+ blob_file.GetGarbageBlobBytes());
3847
+ compaction_job_info->blob_file_garbage_infos.emplace_back(
3848
+ std::move(blob_file_garbage_info));
3849
+ }
3850
+ }
3851
+
3852
+ // SuperVersionContext gets created and destructed outside of the lock --
3853
+ // we use this conveniently to:
3854
+ // * malloc one SuperVersion() outside of the lock -- new_superversion
3855
+ // * delete SuperVersion()s outside of the lock -- superversions_to_free
3856
+ //
3857
+ // However, if InstallSuperVersionAndScheduleWork() gets called twice with the
3858
+ // same sv_context, we can't reuse the SuperVersion() that got
3859
+ // malloced because
3860
+ // first call already used it. In that rare case, we take a hit and create a
3861
+ // new SuperVersion() inside of the mutex. We do similar thing
3862
+ // for superversion_to_free
3863
+
3864
+ void DBImpl::InstallSuperVersionAndScheduleWork(
3865
+ ColumnFamilyData* cfd, SuperVersionContext* sv_context,
3866
+ const MutableCFOptions& mutable_cf_options) {
3867
+ mutex_.AssertHeld();
3868
+
3869
+ // Update max_total_in_memory_state_
3870
+ size_t old_memtable_size = 0;
3871
+ auto* old_sv = cfd->GetSuperVersion();
3872
+ if (old_sv) {
3873
+ old_memtable_size = old_sv->mutable_cf_options.write_buffer_size *
3874
+ old_sv->mutable_cf_options.max_write_buffer_number;
3875
+ }
3876
+
3877
+ // this branch is unlikely to step in
3878
+ if (UNLIKELY(sv_context->new_superversion == nullptr)) {
3879
+ sv_context->NewSuperVersion();
3880
+ }
3881
+ cfd->InstallSuperVersion(sv_context, mutable_cf_options);
3882
+
3883
+ // There may be a small data race here. The snapshot tricking bottommost
3884
+ // compaction may already be released here. But assuming there will always be
3885
+ // newer snapshot created and released frequently, the compaction will be
3886
+ // triggered soon anyway.
3887
+ bottommost_files_mark_threshold_ = kMaxSequenceNumber;
3888
+ for (auto* my_cfd : *versions_->GetColumnFamilySet()) {
3889
+ if (!my_cfd->ioptions()->allow_ingest_behind) {
3890
+ bottommost_files_mark_threshold_ = std::min(
3891
+ bottommost_files_mark_threshold_,
3892
+ my_cfd->current()->storage_info()->bottommost_files_mark_threshold());
3893
+ }
3894
+ }
3895
+
3896
+ // Whenever we install new SuperVersion, we might need to issue new flushes or
3897
+ // compactions.
3898
+ SchedulePendingCompaction(cfd);
3899
+ MaybeScheduleFlushOrCompaction();
3900
+
3901
+ // Update max_total_in_memory_state_
3902
+ max_total_in_memory_state_ = max_total_in_memory_state_ - old_memtable_size +
3903
+ mutable_cf_options.write_buffer_size *
3904
+ mutable_cf_options.max_write_buffer_number;
3905
+ }
3906
+
3907
+ // ShouldPurge is called by FindObsoleteFiles when doing a full scan,
3908
+ // and db mutex (mutex_) should already be held.
3909
+ // Actually, the current implementation of FindObsoleteFiles with
3910
+ // full_scan=true can issue I/O requests to obtain list of files in
3911
+ // directories, e.g. env_->getChildren while holding db mutex.
3912
+ bool DBImpl::ShouldPurge(uint64_t file_number) const {
3913
+ return files_grabbed_for_purge_.find(file_number) ==
3914
+ files_grabbed_for_purge_.end() &&
3915
+ purge_files_.find(file_number) == purge_files_.end();
3916
+ }
3917
+
3918
+ // MarkAsGrabbedForPurge is called by FindObsoleteFiles, and db mutex
3919
+ // (mutex_) should already be held.
3920
+ void DBImpl::MarkAsGrabbedForPurge(uint64_t file_number) {
3921
+ files_grabbed_for_purge_.insert(file_number);
3922
+ }
3923
+
3924
+ void DBImpl::SetSnapshotChecker(SnapshotChecker* snapshot_checker) {
3925
+ InstrumentedMutexLock l(&mutex_);
3926
+ // snapshot_checker_ should only set once. If we need to set it multiple
3927
+ // times, we need to make sure the old one is not deleted while it is still
3928
+ // using by a compaction job.
3929
+ assert(!snapshot_checker_);
3930
+ snapshot_checker_.reset(snapshot_checker);
3931
+ }
3932
+
3933
+ void DBImpl::GetSnapshotContext(
3934
+ JobContext* job_context, std::vector<SequenceNumber>* snapshot_seqs,
3935
+ SequenceNumber* earliest_write_conflict_snapshot,
3936
+ SnapshotChecker** snapshot_checker_ptr) {
3937
+ mutex_.AssertHeld();
3938
+ assert(job_context != nullptr);
3939
+ assert(snapshot_seqs != nullptr);
3940
+ assert(earliest_write_conflict_snapshot != nullptr);
3941
+ assert(snapshot_checker_ptr != nullptr);
3942
+
3943
+ *snapshot_checker_ptr = snapshot_checker_.get();
3944
+ if (use_custom_gc_ && *snapshot_checker_ptr == nullptr) {
3945
+ *snapshot_checker_ptr = DisableGCSnapshotChecker::Instance();
3946
+ }
3947
+ if (*snapshot_checker_ptr != nullptr) {
3948
+ // If snapshot_checker is used, that means the flush/compaction may
3949
+ // contain values not visible to snapshot taken after
3950
+ // flush/compaction job starts. Take a snapshot and it will appear
3951
+ // in snapshot_seqs and force compaction iterator to consider such
3952
+ // snapshots.
3953
+ const Snapshot* job_snapshot =
3954
+ GetSnapshotImpl(false /*write_conflict_boundary*/, false /*lock*/);
3955
+ job_context->job_snapshot.reset(new ManagedSnapshot(this, job_snapshot));
3956
+ }
3957
+ *snapshot_seqs = snapshots_.GetAll(earliest_write_conflict_snapshot);
3958
+ }
3959
+
3960
+ Status DBImpl::WaitForCompact(bool abort_on_pause) {
3961
+ InstrumentedMutexLock l(&mutex_);
3962
+ for (;;) {
3963
+ if (shutting_down_.load(std::memory_order_acquire)) {
3964
+ return Status::ShutdownInProgress();
3965
+ }
3966
+ if (bg_work_paused_ && abort_on_pause) {
3967
+ return Status::Aborted();
3968
+ }
3969
+ if ((bg_bottom_compaction_scheduled_ || bg_compaction_scheduled_ ||
3970
+ bg_flush_scheduled_ || unscheduled_compactions_ ||
3971
+ unscheduled_flushes_) &&
3972
+ (error_handler_.GetBGError().ok())) {
3973
+ bg_cv_.Wait();
3974
+ } else {
3975
+ return error_handler_.GetBGError();
3976
+ }
3977
+ }
3978
+ }
3979
+
3980
+ } // namespace ROCKSDB_NAMESPACE