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,3202 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #include <atomic>
11
+ #include <limits>
12
+
13
+ #include "db/db_impl/db_impl.h"
14
+ #include "db/db_test_util.h"
15
+ #include "env/mock_env.h"
16
+ #include "file/filename.h"
17
+ #include "port/port.h"
18
+ #include "port/stack_trace.h"
19
+ #include "rocksdb/utilities/transaction_db.h"
20
+ #include "test_util/sync_point.h"
21
+ #include "test_util/testutil.h"
22
+ #include "util/cast_util.h"
23
+ #include "util/mutexlock.h"
24
+ #include "utilities/fault_injection_env.h"
25
+ #include "utilities/fault_injection_fs.h"
26
+
27
+ namespace ROCKSDB_NAMESPACE {
28
+
29
+ // This is a static filter used for filtering
30
+ // kvs during the compaction process.
31
+ static std::string NEW_VALUE = "NewValue";
32
+
33
+ class DBFlushTest : public DBTestBase {
34
+ public:
35
+ DBFlushTest() : DBTestBase("db_flush_test", /*env_do_fsync=*/true) {}
36
+ };
37
+
38
+ class DBFlushDirectIOTest : public DBFlushTest,
39
+ public ::testing::WithParamInterface<bool> {
40
+ public:
41
+ DBFlushDirectIOTest() : DBFlushTest() {}
42
+ };
43
+
44
+ class DBAtomicFlushTest : public DBFlushTest,
45
+ public ::testing::WithParamInterface<bool> {
46
+ public:
47
+ DBAtomicFlushTest() : DBFlushTest() {}
48
+ };
49
+
50
+ // We had issue when two background threads trying to flush at the same time,
51
+ // only one of them get committed. The test verifies the issue is fixed.
52
+ TEST_F(DBFlushTest, FlushWhileWritingManifest) {
53
+ Options options;
54
+ options.disable_auto_compactions = true;
55
+ options.max_background_flushes = 2;
56
+ options.env = env_;
57
+ Reopen(options);
58
+ FlushOptions no_wait;
59
+ no_wait.wait = false;
60
+ no_wait.allow_write_stall = true;
61
+
62
+ SyncPoint::GetInstance()->LoadDependency(
63
+ {{"VersionSet::LogAndApply:WriteManifest",
64
+ "DBFlushTest::FlushWhileWritingManifest:1"},
65
+ {"MemTableList::TryInstallMemtableFlushResults:InProgress",
66
+ "VersionSet::LogAndApply:WriteManifestDone"}});
67
+ SyncPoint::GetInstance()->EnableProcessing();
68
+
69
+ ASSERT_OK(Put("foo", "v"));
70
+ ASSERT_OK(dbfull()->Flush(no_wait));
71
+ TEST_SYNC_POINT("DBFlushTest::FlushWhileWritingManifest:1");
72
+ ASSERT_OK(Put("bar", "v"));
73
+ ASSERT_OK(dbfull()->Flush(no_wait));
74
+ // If the issue is hit we will wait here forever.
75
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
76
+ ASSERT_EQ(2, TotalTableFiles());
77
+ }
78
+
79
+ // Disable this test temporarily on Travis as it fails intermittently.
80
+ // Github issue: #4151
81
+ TEST_F(DBFlushTest, SyncFail) {
82
+ std::unique_ptr<FaultInjectionTestEnv> fault_injection_env(
83
+ new FaultInjectionTestEnv(env_));
84
+ Options options;
85
+ options.disable_auto_compactions = true;
86
+ options.env = fault_injection_env.get();
87
+
88
+ SyncPoint::GetInstance()->LoadDependency(
89
+ {{"DBFlushTest::SyncFail:1", "DBImpl::SyncClosedLogs:Start"},
90
+ {"DBImpl::SyncClosedLogs:Failed", "DBFlushTest::SyncFail:2"}});
91
+ SyncPoint::GetInstance()->EnableProcessing();
92
+
93
+ CreateAndReopenWithCF({"pikachu"}, options);
94
+ ASSERT_OK(Put("key", "value"));
95
+ FlushOptions flush_options;
96
+ flush_options.wait = false;
97
+ ASSERT_OK(dbfull()->Flush(flush_options));
98
+ // Flush installs a new super-version. Get the ref count after that.
99
+ fault_injection_env->SetFilesystemActive(false);
100
+ TEST_SYNC_POINT("DBFlushTest::SyncFail:1");
101
+ TEST_SYNC_POINT("DBFlushTest::SyncFail:2");
102
+ fault_injection_env->SetFilesystemActive(true);
103
+ // Now the background job will do the flush; wait for it.
104
+ // Returns the IO error happend during flush.
105
+ ASSERT_NOK(dbfull()->TEST_WaitForFlushMemTable());
106
+ ASSERT_EQ("", FilesPerLevel()); // flush failed.
107
+ Destroy(options);
108
+ }
109
+
110
+ TEST_F(DBFlushTest, SyncSkip) {
111
+ Options options = CurrentOptions();
112
+
113
+ SyncPoint::GetInstance()->LoadDependency(
114
+ {{"DBFlushTest::SyncSkip:1", "DBImpl::SyncClosedLogs:Skip"},
115
+ {"DBImpl::SyncClosedLogs:Skip", "DBFlushTest::SyncSkip:2"}});
116
+ SyncPoint::GetInstance()->EnableProcessing();
117
+
118
+ Reopen(options);
119
+ ASSERT_OK(Put("key", "value"));
120
+
121
+ FlushOptions flush_options;
122
+ flush_options.wait = false;
123
+ ASSERT_OK(dbfull()->Flush(flush_options));
124
+
125
+ TEST_SYNC_POINT("DBFlushTest::SyncSkip:1");
126
+ TEST_SYNC_POINT("DBFlushTest::SyncSkip:2");
127
+
128
+ // Now the background job will do the flush; wait for it.
129
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
130
+
131
+ Destroy(options);
132
+ }
133
+
134
+ TEST_F(DBFlushTest, FlushInLowPriThreadPool) {
135
+ // Verify setting an empty high-pri (flush) thread pool causes flushes to be
136
+ // scheduled in the low-pri (compaction) thread pool.
137
+ Options options = CurrentOptions();
138
+ options.level0_file_num_compaction_trigger = 4;
139
+ options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
140
+ Reopen(options);
141
+ env_->SetBackgroundThreads(0, Env::HIGH);
142
+
143
+ std::thread::id tid;
144
+ int num_flushes = 0, num_compactions = 0;
145
+ SyncPoint::GetInstance()->SetCallBack(
146
+ "DBImpl::BGWorkFlush", [&](void* /*arg*/) {
147
+ if (tid == std::thread::id()) {
148
+ tid = std::this_thread::get_id();
149
+ } else {
150
+ ASSERT_EQ(tid, std::this_thread::get_id());
151
+ }
152
+ ++num_flushes;
153
+ });
154
+ SyncPoint::GetInstance()->SetCallBack(
155
+ "DBImpl::BGWorkCompaction", [&](void* /*arg*/) {
156
+ ASSERT_EQ(tid, std::this_thread::get_id());
157
+ ++num_compactions;
158
+ });
159
+ SyncPoint::GetInstance()->EnableProcessing();
160
+
161
+ ASSERT_OK(Put("key", "val"));
162
+ for (int i = 0; i < 4; ++i) {
163
+ ASSERT_OK(Put("key", "val"));
164
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
165
+ }
166
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
167
+ ASSERT_EQ(4, num_flushes);
168
+ ASSERT_EQ(1, num_compactions);
169
+ }
170
+
171
+ // Test when flush job is submitted to low priority thread pool and when DB is
172
+ // closed in the meanwhile, CloseHelper doesn't hang.
173
+ TEST_F(DBFlushTest, CloseDBWhenFlushInLowPri) {
174
+ Options options = CurrentOptions();
175
+ options.max_background_flushes = 1;
176
+ options.max_total_wal_size = 8192;
177
+
178
+ DestroyAndReopen(options);
179
+ CreateColumnFamilies({"cf1", "cf2"}, options);
180
+
181
+ env_->SetBackgroundThreads(0, Env::HIGH);
182
+ env_->SetBackgroundThreads(1, Env::LOW);
183
+ test::SleepingBackgroundTask sleeping_task_low;
184
+ int num_flushes = 0;
185
+
186
+ SyncPoint::GetInstance()->SetCallBack("DBImpl::BGWorkFlush",
187
+ [&](void* /*arg*/) { ++num_flushes; });
188
+
189
+ int num_low_flush_unscheduled = 0;
190
+ SyncPoint::GetInstance()->SetCallBack(
191
+ "DBImpl::UnscheduleLowFlushCallback", [&](void* /*arg*/) {
192
+ num_low_flush_unscheduled++;
193
+ // There should be one flush job in low pool that needs to be
194
+ // unscheduled
195
+ ASSERT_EQ(num_low_flush_unscheduled, 1);
196
+ });
197
+
198
+ int num_high_flush_unscheduled = 0;
199
+ SyncPoint::GetInstance()->SetCallBack(
200
+ "DBImpl::UnscheduleHighFlushCallback", [&](void* /*arg*/) {
201
+ num_high_flush_unscheduled++;
202
+ // There should be no flush job in high pool
203
+ ASSERT_EQ(num_high_flush_unscheduled, 0);
204
+ });
205
+
206
+ SyncPoint::GetInstance()->EnableProcessing();
207
+
208
+ ASSERT_OK(Put(0, "key1", DummyString(8192)));
209
+ // Block thread so that flush cannot be run and can be removed from the queue
210
+ // when called Unschedule.
211
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
212
+ Env::Priority::LOW);
213
+ sleeping_task_low.WaitUntilSleeping();
214
+
215
+ // Trigger flush and flush job will be scheduled to LOW priority thread.
216
+ ASSERT_OK(Put(0, "key2", DummyString(8192)));
217
+
218
+ // Close DB and flush job in low priority queue will be removed without
219
+ // running.
220
+ Close();
221
+ sleeping_task_low.WakeUp();
222
+ sleeping_task_low.WaitUntilDone();
223
+ ASSERT_EQ(0, num_flushes);
224
+
225
+ TryReopenWithColumnFamilies({"default", "cf1", "cf2"}, options);
226
+ ASSERT_OK(Put(0, "key3", DummyString(8192)));
227
+ ASSERT_OK(Flush(0));
228
+ ASSERT_EQ(1, num_flushes);
229
+ }
230
+
231
+ TEST_F(DBFlushTest, ManualFlushWithMinWriteBufferNumberToMerge) {
232
+ Options options = CurrentOptions();
233
+ options.write_buffer_size = 100;
234
+ options.max_write_buffer_number = 4;
235
+ options.min_write_buffer_number_to_merge = 3;
236
+ Reopen(options);
237
+
238
+ SyncPoint::GetInstance()->LoadDependency(
239
+ {{"DBImpl::BGWorkFlush",
240
+ "DBFlushTest::ManualFlushWithMinWriteBufferNumberToMerge:1"},
241
+ {"DBFlushTest::ManualFlushWithMinWriteBufferNumberToMerge:2",
242
+ "FlushJob::WriteLevel0Table"}});
243
+ SyncPoint::GetInstance()->EnableProcessing();
244
+
245
+ ASSERT_OK(Put("key1", "value1"));
246
+
247
+ port::Thread t([&]() {
248
+ // The call wait for flush to finish, i.e. with flush_options.wait = true.
249
+ ASSERT_OK(Flush());
250
+ });
251
+
252
+ // Wait for flush start.
253
+ TEST_SYNC_POINT("DBFlushTest::ManualFlushWithMinWriteBufferNumberToMerge:1");
254
+ // Insert a second memtable before the manual flush finish.
255
+ // At the end of the manual flush job, it will check if further flush
256
+ // is needed, but it will not trigger flush of the second memtable because
257
+ // min_write_buffer_number_to_merge is not reached.
258
+ ASSERT_OK(Put("key2", "value2"));
259
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
260
+ TEST_SYNC_POINT("DBFlushTest::ManualFlushWithMinWriteBufferNumberToMerge:2");
261
+
262
+ // Manual flush should return, without waiting for flush indefinitely.
263
+ t.join();
264
+ }
265
+
266
+ TEST_F(DBFlushTest, ScheduleOnlyOneBgThread) {
267
+ Options options = CurrentOptions();
268
+ Reopen(options);
269
+ SyncPoint::GetInstance()->DisableProcessing();
270
+ SyncPoint::GetInstance()->ClearAllCallBacks();
271
+ int called = 0;
272
+ SyncPoint::GetInstance()->SetCallBack(
273
+ "DBImpl::MaybeScheduleFlushOrCompaction:AfterSchedule:0", [&](void* arg) {
274
+ ASSERT_NE(nullptr, arg);
275
+ auto unscheduled_flushes = *reinterpret_cast<int*>(arg);
276
+ ASSERT_EQ(0, unscheduled_flushes);
277
+ ++called;
278
+ });
279
+ SyncPoint::GetInstance()->EnableProcessing();
280
+
281
+ ASSERT_OK(Put("a", "foo"));
282
+ FlushOptions flush_opts;
283
+ ASSERT_OK(dbfull()->Flush(flush_opts));
284
+ ASSERT_EQ(1, called);
285
+
286
+ SyncPoint::GetInstance()->DisableProcessing();
287
+ SyncPoint::GetInstance()->ClearAllCallBacks();
288
+ }
289
+
290
+ // The following 3 tests are designed for testing garbage statistics at flush
291
+ // time.
292
+ //
293
+ // ======= General Information ======= (from GitHub Wiki).
294
+ // There are three scenarios where memtable flush can be triggered:
295
+ //
296
+ // 1 - Memtable size exceeds ColumnFamilyOptions::write_buffer_size
297
+ // after a write.
298
+ // 2 - Total memtable size across all column families exceeds
299
+ // DBOptions::db_write_buffer_size,
300
+ // or DBOptions::write_buffer_manager signals a flush. In this scenario
301
+ // the largest memtable will be flushed.
302
+ // 3 - Total WAL file size exceeds DBOptions::max_total_wal_size.
303
+ // In this scenario the memtable with the oldest data will be flushed,
304
+ // in order to allow the WAL file with data from this memtable to be
305
+ // purged.
306
+ //
307
+ // As a result, a memtable can be flushed before it is full. This is one
308
+ // reason the generated SST file can be smaller than the corresponding
309
+ // memtable. Compression is another factor to make SST file smaller than
310
+ // corresponding memtable, since data in memtable is uncompressed.
311
+
312
+ TEST_F(DBFlushTest, StatisticsGarbageBasic) {
313
+ Options options = CurrentOptions();
314
+
315
+ // The following options are used to enforce several values that
316
+ // may already exist as default values to make this test resilient
317
+ // to default value updates in the future.
318
+ options.statistics = CreateDBStatistics();
319
+
320
+ // Record all statistics.
321
+ options.statistics->set_stats_level(StatsLevel::kAll);
322
+
323
+ // create the DB if it's not already present
324
+ options.create_if_missing = true;
325
+
326
+ // Useful for now as we are trying to compare uncompressed data savings on
327
+ // flush().
328
+ options.compression = kNoCompression;
329
+
330
+ // Prevent memtable in place updates. Should already be disabled
331
+ // (from Wiki:
332
+ // In place updates can be enabled by toggling on the bool
333
+ // inplace_update_support flag. However, this flag is by default set to
334
+ // false
335
+ // because this thread-safe in-place update support is not compatible
336
+ // with concurrent memtable writes. Note that the bool
337
+ // allow_concurrent_memtable_write is set to true by default )
338
+ options.inplace_update_support = false;
339
+ options.allow_concurrent_memtable_write = true;
340
+
341
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
342
+ options.write_buffer_size = 64 << 20;
343
+
344
+ ASSERT_OK(TryReopen(options));
345
+
346
+ // Put multiple times the same key-values.
347
+ // The encoded length of a db entry in the memtable is
348
+ // defined in db/memtable.cc (MemTable::Add) as the variable:
349
+ // encoded_len= VarintLength(internal_key_size) --> =
350
+ // log_256(internal_key).
351
+ // Min # of bytes
352
+ // necessary to
353
+ // store
354
+ // internal_key_size.
355
+ // + internal_key_size --> = actual key string,
356
+ // (size key_size: w/o term null char)
357
+ // + 8 bytes for
358
+ // fixed uint64 "seq
359
+ // number
360
+ // +
361
+ // insertion type"
362
+ // + VarintLength(val_size) --> = min # of bytes to
363
+ // store val_size
364
+ // + val_size --> = actual value
365
+ // string
366
+ // For example, in our situation, "key1" : size 4, "value1" : size 6
367
+ // (the terminating null characters are not copied over to the memtable).
368
+ // And therefore encoded_len = 1 + (4+8) + 1 + 6 = 20 bytes per entry.
369
+ // However in terms of raw data contained in the memtable, and written
370
+ // over to the SSTable, we only count internal_key_size and val_size,
371
+ // because this is the only raw chunk of bytes that contains everything
372
+ // necessary to reconstruct a user entry: sequence number, insertion type,
373
+ // key, and value.
374
+
375
+ // To test the relevance of our Memtable garbage statistics,
376
+ // namely MEMTABLE_PAYLOAD_BYTES_AT_FLUSH and MEMTABLE_GARBAGE_BYTES_AT_FLUSH,
377
+ // we insert K-V pairs with 3 distinct keys (of length 4),
378
+ // and random values of arbitrary length RAND_VALUES_LENGTH,
379
+ // and we repeat this step NUM_REPEAT times total.
380
+ // At the end, we insert 3 final K-V pairs with the same 3 keys
381
+ // and known values (these will be the final values, of length 6).
382
+ // I chose NUM_REPEAT=2,000 such that no automatic flush is
383
+ // triggered (the number of bytes in the memtable is therefore
384
+ // well below any meaningful heuristic for a memtable of size 64MB).
385
+ // As a result, since each K-V pair is inserted as a payload
386
+ // of N meaningful bytes (sequence number, insertion type,
387
+ // key, and value = 8 + 4 + RAND_VALUE_LENGTH),
388
+ // MEMTABLE_GARBAGE_BYTES_AT_FLUSH should be equal to 2,000 * N bytes
389
+ // and MEMTABLE_PAYLAOD_BYTES_AT_FLUSH = MEMTABLE_GARBAGE_BYTES_AT_FLUSH +
390
+ // (3*(8 + 4 + 6)) bytes. For RAND_VALUE_LENGTH = 172 (arbitrary value), we
391
+ // expect:
392
+ // N = 8 + 4 + 172 = 184 bytes
393
+ // MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 2,000 * 184 = 368,000 bytes.
394
+ // MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 368,000 + 3*18 = 368,054 bytes.
395
+
396
+ const size_t NUM_REPEAT = 2000;
397
+ const size_t RAND_VALUES_LENGTH = 172;
398
+ const std::string KEY1 = "key1";
399
+ const std::string KEY2 = "key2";
400
+ const std::string KEY3 = "key3";
401
+ const std::string VALUE1 = "value1";
402
+ const std::string VALUE2 = "value2";
403
+ const std::string VALUE3 = "value3";
404
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
405
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
406
+
407
+ Random rnd(301);
408
+ // Insertion of of K-V pairs, multiple times.
409
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
410
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
411
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
412
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
413
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
414
+ ASSERT_OK(Put(KEY1, p_v1));
415
+ ASSERT_OK(Put(KEY2, p_v2));
416
+ ASSERT_OK(Put(KEY3, p_v3));
417
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
418
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
419
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
420
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
421
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
422
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
423
+ }
424
+
425
+ // The memtable data bytes includes the "garbage"
426
+ // bytes along with the useful payload.
427
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
428
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
429
+
430
+ ASSERT_OK(Put(KEY1, VALUE1));
431
+ ASSERT_OK(Put(KEY2, VALUE2));
432
+ ASSERT_OK(Put(KEY3, VALUE3));
433
+
434
+ // Add useful payload to the memtable data bytes:
435
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
436
+ KEY1.size() + VALUE1.size() + KEY2.size() + VALUE2.size() + KEY3.size() +
437
+ VALUE3.size() + 3 * sizeof(uint64_t);
438
+
439
+ // We assert that the last K-V pairs have been successfully inserted,
440
+ // and that the valid values are VALUE1, VALUE2, VALUE3.
441
+ PinnableSlice value;
442
+ ASSERT_OK(Get(KEY1, &value));
443
+ ASSERT_EQ(value.ToString(), VALUE1);
444
+ ASSERT_OK(Get(KEY2, &value));
445
+ ASSERT_EQ(value.ToString(), VALUE2);
446
+ ASSERT_OK(Get(KEY3, &value));
447
+ ASSERT_EQ(value.ToString(), VALUE3);
448
+
449
+ // Force flush to SST. Increments the statistics counter.
450
+ ASSERT_OK(Flush());
451
+
452
+ // Collect statistics.
453
+ uint64_t mem_data_bytes =
454
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
455
+ uint64_t mem_garbage_bytes =
456
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
457
+
458
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
459
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
460
+
461
+ Close();
462
+ }
463
+
464
+ TEST_F(DBFlushTest, StatisticsGarbageInsertAndDeletes) {
465
+ Options options = CurrentOptions();
466
+ options.statistics = CreateDBStatistics();
467
+ options.statistics->set_stats_level(StatsLevel::kAll);
468
+ options.create_if_missing = true;
469
+ options.compression = kNoCompression;
470
+ options.inplace_update_support = false;
471
+ options.allow_concurrent_memtable_write = true;
472
+ options.write_buffer_size = 67108864;
473
+
474
+ ASSERT_OK(TryReopen(options));
475
+
476
+ const size_t NUM_REPEAT = 2000;
477
+ const size_t RAND_VALUES_LENGTH = 37;
478
+ const std::string KEY1 = "key1";
479
+ const std::string KEY2 = "key2";
480
+ const std::string KEY3 = "key3";
481
+ const std::string KEY4 = "key4";
482
+ const std::string KEY5 = "key5";
483
+ const std::string KEY6 = "key6";
484
+
485
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
486
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
487
+
488
+ WriteBatch batch;
489
+
490
+ Random rnd(301);
491
+ // Insertion of of K-V pairs, multiple times.
492
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
493
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
494
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
495
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
496
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
497
+ ASSERT_OK(Put(KEY1, p_v1));
498
+ ASSERT_OK(Put(KEY2, p_v2));
499
+ ASSERT_OK(Put(KEY3, p_v3));
500
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
501
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
502
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
503
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
504
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
505
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
506
+ ASSERT_OK(Delete(KEY1));
507
+ ASSERT_OK(Delete(KEY2));
508
+ ASSERT_OK(Delete(KEY3));
509
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
510
+ KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
511
+ }
512
+
513
+ // The memtable data bytes includes the "garbage"
514
+ // bytes along with the useful payload.
515
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
516
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
517
+
518
+ // Note : one set of delete for KEY1, KEY2, KEY3 is written to
519
+ // SSTable to propagate the delete operations to K-V pairs
520
+ // that could have been inserted into the database during past Flush
521
+ // opeartions.
522
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
523
+ KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
524
+
525
+ // Additional useful paylaod.
526
+ ASSERT_OK(Delete(KEY4));
527
+ ASSERT_OK(Delete(KEY5));
528
+ ASSERT_OK(Delete(KEY6));
529
+
530
+ // // Add useful payload to the memtable data bytes:
531
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
532
+ KEY4.size() + KEY5.size() + KEY6.size() + 3 * sizeof(uint64_t);
533
+
534
+ // We assert that the K-V pairs have been successfully deleted.
535
+ PinnableSlice value;
536
+ ASSERT_NOK(Get(KEY1, &value));
537
+ ASSERT_NOK(Get(KEY2, &value));
538
+ ASSERT_NOK(Get(KEY3, &value));
539
+
540
+ // Force flush to SST. Increments the statistics counter.
541
+ ASSERT_OK(Flush());
542
+
543
+ // Collect statistics.
544
+ uint64_t mem_data_bytes =
545
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
546
+ uint64_t mem_garbage_bytes =
547
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
548
+
549
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
550
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
551
+
552
+ Close();
553
+ }
554
+
555
+ TEST_F(DBFlushTest, StatisticsGarbageRangeDeletes) {
556
+ Options options = CurrentOptions();
557
+ options.statistics = CreateDBStatistics();
558
+ options.statistics->set_stats_level(StatsLevel::kAll);
559
+ options.create_if_missing = true;
560
+ options.compression = kNoCompression;
561
+ options.inplace_update_support = false;
562
+ options.allow_concurrent_memtable_write = true;
563
+ options.write_buffer_size = 67108864;
564
+
565
+ ASSERT_OK(TryReopen(options));
566
+
567
+ const size_t NUM_REPEAT = 1000;
568
+ const size_t RAND_VALUES_LENGTH = 42;
569
+ const std::string KEY1 = "key1";
570
+ const std::string KEY2 = "key2";
571
+ const std::string KEY3 = "key3";
572
+ const std::string KEY4 = "key4";
573
+ const std::string KEY5 = "key5";
574
+ const std::string KEY6 = "key6";
575
+ const std::string VALUE3 = "value3";
576
+
577
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
578
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
579
+
580
+ Random rnd(301);
581
+ // Insertion of of K-V pairs, multiple times.
582
+ // Also insert DeleteRange
583
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
584
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
585
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
586
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
587
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
588
+ ASSERT_OK(Put(KEY1, p_v1));
589
+ ASSERT_OK(Put(KEY2, p_v2));
590
+ ASSERT_OK(Put(KEY3, p_v3));
591
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
592
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
593
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
594
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
595
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
596
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
597
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
598
+ KEY2));
599
+ // Note: DeleteRange have an exclusive upper bound, e.g. here: [KEY2,KEY3)
600
+ // is deleted.
601
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
602
+ KEY3));
603
+ // Delete ranges are stored as a regular K-V pair, with key=STARTKEY,
604
+ // value=ENDKEY.
605
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
606
+ (KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
607
+ (KEY2.size() + KEY3.size() + sizeof(uint64_t));
608
+ }
609
+
610
+ // The memtable data bytes includes the "garbage"
611
+ // bytes along with the useful payload.
612
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
613
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
614
+
615
+ // Note : one set of deleteRange for (KEY1, KEY2) and (KEY2, KEY3) is written
616
+ // to SSTable to propagate the deleteRange operations to K-V pairs that could
617
+ // have been inserted into the database during past Flush opeartions.
618
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
619
+ (KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
620
+ (KEY2.size() + KEY3.size() + sizeof(uint64_t));
621
+
622
+ // Overwrite KEY3 with known value (VALUE3)
623
+ // Note that during the whole time KEY3 has never been deleted
624
+ // by the RangeDeletes.
625
+ ASSERT_OK(Put(KEY3, VALUE3));
626
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
627
+ KEY3.size() + VALUE3.size() + sizeof(uint64_t);
628
+
629
+ // Additional useful paylaod.
630
+ ASSERT_OK(
631
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY4, KEY5));
632
+ ASSERT_OK(
633
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY5, KEY6));
634
+
635
+ // Add useful payload to the memtable data bytes:
636
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
637
+ (KEY4.size() + KEY5.size() + sizeof(uint64_t)) +
638
+ (KEY5.size() + KEY6.size() + sizeof(uint64_t));
639
+
640
+ // We assert that the K-V pairs have been successfully deleted.
641
+ PinnableSlice value;
642
+ ASSERT_NOK(Get(KEY1, &value));
643
+ ASSERT_NOK(Get(KEY2, &value));
644
+ // And that KEY3's value is correct.
645
+ ASSERT_OK(Get(KEY3, &value));
646
+ ASSERT_EQ(value, VALUE3);
647
+
648
+ // Force flush to SST. Increments the statistics counter.
649
+ ASSERT_OK(Flush());
650
+
651
+ // Collect statistics.
652
+ uint64_t mem_data_bytes =
653
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
654
+ uint64_t mem_garbage_bytes =
655
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
656
+
657
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
658
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
659
+
660
+ Close();
661
+ }
662
+
663
+ // This simple Listener can only handle one flush at a time.
664
+ class TestFlushListener : public EventListener {
665
+ public:
666
+ TestFlushListener(Env* env, DBFlushTest* test)
667
+ : slowdown_count(0), stop_count(0), db_closed(), env_(env), test_(test) {
668
+ db_closed = false;
669
+ }
670
+
671
+ ~TestFlushListener() override {
672
+ prev_fc_info_.status.PermitUncheckedError(); // Ignore the status
673
+ }
674
+
675
+ void OnTableFileCreated(const TableFileCreationInfo& info) override {
676
+ // remember the info for later checking the FlushJobInfo.
677
+ prev_fc_info_ = info;
678
+ ASSERT_GT(info.db_name.size(), 0U);
679
+ ASSERT_GT(info.cf_name.size(), 0U);
680
+ ASSERT_GT(info.file_path.size(), 0U);
681
+ ASSERT_GT(info.job_id, 0);
682
+ ASSERT_GT(info.table_properties.data_size, 0U);
683
+ ASSERT_GT(info.table_properties.raw_key_size, 0U);
684
+ ASSERT_GT(info.table_properties.raw_value_size, 0U);
685
+ ASSERT_GT(info.table_properties.num_data_blocks, 0U);
686
+ ASSERT_GT(info.table_properties.num_entries, 0U);
687
+ ASSERT_EQ(info.file_checksum, kUnknownFileChecksum);
688
+ ASSERT_EQ(info.file_checksum_func_name, kUnknownFileChecksumFuncName);
689
+ }
690
+
691
+ void OnFlushCompleted(DB* db, const FlushJobInfo& info) override {
692
+ flushed_dbs_.push_back(db);
693
+ flushed_column_family_names_.push_back(info.cf_name);
694
+ if (info.triggered_writes_slowdown) {
695
+ slowdown_count++;
696
+ }
697
+ if (info.triggered_writes_stop) {
698
+ stop_count++;
699
+ }
700
+ // verify whether the previously created file matches the flushed file.
701
+ ASSERT_EQ(prev_fc_info_.db_name, db->GetName());
702
+ ASSERT_EQ(prev_fc_info_.cf_name, info.cf_name);
703
+ ASSERT_EQ(prev_fc_info_.job_id, info.job_id);
704
+ ASSERT_EQ(prev_fc_info_.file_path, info.file_path);
705
+ ASSERT_EQ(TableFileNameToNumber(info.file_path), info.file_number);
706
+
707
+ // Note: the following chunk relies on the notification pertaining to the
708
+ // database pointed to by DBTestBase::db_, and is thus bypassed when
709
+ // that assumption does not hold (see the test case MultiDBMultiListeners
710
+ // below).
711
+ ASSERT_TRUE(test_);
712
+ if (db == test_->db_) {
713
+ std::vector<std::vector<FileMetaData>> files_by_level;
714
+ test_->dbfull()->TEST_GetFilesMetaData(db->DefaultColumnFamily(),
715
+ &files_by_level);
716
+
717
+ ASSERT_FALSE(files_by_level.empty());
718
+ auto it = std::find_if(files_by_level[0].begin(), files_by_level[0].end(),
719
+ [&](const FileMetaData& meta) {
720
+ return meta.fd.GetNumber() == info.file_number;
721
+ });
722
+ ASSERT_NE(it, files_by_level[0].end());
723
+ ASSERT_EQ(info.oldest_blob_file_number, it->oldest_blob_file_number);
724
+ }
725
+
726
+ ASSERT_EQ(db->GetEnv()->GetThreadID(), info.thread_id);
727
+ ASSERT_GT(info.thread_id, 0U);
728
+ }
729
+
730
+ std::vector<std::string> flushed_column_family_names_;
731
+ std::vector<DB*> flushed_dbs_;
732
+ int slowdown_count;
733
+ int stop_count;
734
+ bool db_closing;
735
+ std::atomic_bool db_closed;
736
+ TableFileCreationInfo prev_fc_info_;
737
+
738
+ protected:
739
+ Env* env_;
740
+ DBFlushTest* test_;
741
+ };
742
+
743
+ TEST_F(
744
+ DBFlushTest,
745
+ FixUnrecoverableWriteDuringAtomicFlushWaitUntilFlushWouldNotStallWrites) {
746
+ Options options = CurrentOptions();
747
+ options.atomic_flush = true;
748
+
749
+ // To simulate a real-life crash where we can't flush during db's shutdown
750
+ options.avoid_flush_during_shutdown = true;
751
+
752
+ // Set 3 low thresholds (while `disable_auto_compactions=false`) here so flush
753
+ // adding one more L0 file during `GetLiveFiles()` will have to wait till such
754
+ // flush will not stall writes
755
+ options.level0_stop_writes_trigger = 2;
756
+ options.level0_slowdown_writes_trigger = 2;
757
+ // Disable level-0 compaction triggered by number of files to avoid
758
+ // stalling check being skipped (resulting in the flush mentioned above didn't
759
+ // wait)
760
+ options.level0_file_num_compaction_trigger = -1;
761
+
762
+ CreateAndReopenWithCF({"cf1"}, options);
763
+
764
+ // Manually pause compaction thread to ensure enough L0 files as
765
+ // `disable_auto_compactions=false`is needed, in order to meet the 3 low
766
+ // thresholds above
767
+ std::unique_ptr<test::SleepingBackgroundTask> sleeping_task_;
768
+ sleeping_task_.reset(new test::SleepingBackgroundTask());
769
+ env_->SetBackgroundThreads(1, Env::LOW);
770
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask,
771
+ sleeping_task_.get(), Env::Priority::LOW);
772
+ sleeping_task_->WaitUntilSleeping();
773
+
774
+ // Create some initial file to help meet the 3 low thresholds above
775
+ ASSERT_OK(Put(1, "dontcare", "dontcare"));
776
+ ASSERT_OK(Flush(1));
777
+
778
+ // Insert some initial data so we have something to atomic-flush later
779
+ // triggered by `GetLiveFiles()`
780
+ WriteOptions write_opts;
781
+ write_opts.disableWAL = true;
782
+ ASSERT_OK(Put(1, "k1", "v1", write_opts));
783
+
784
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({{
785
+ "DBImpl::WaitUntilFlushWouldNotStallWrites:StallWait",
786
+ "DBFlushTest::"
787
+ "UnrecoverableWriteInAtomicFlushWaitUntilFlushWouldNotStallWrites::Write",
788
+ }});
789
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
790
+
791
+ // Write to db when atomic flush releases the lock to wait on write stall
792
+ // condition to be gone in `WaitUntilFlushWouldNotStallWrites()`
793
+ port::Thread write_thread([&] {
794
+ TEST_SYNC_POINT(
795
+ "DBFlushTest::"
796
+ "UnrecoverableWriteInAtomicFlushWaitUntilFlushWouldNotStallWrites::"
797
+ "Write");
798
+ // Before the fix, the empty default CF would've been prematurely excluded
799
+ // from this atomic flush. The following two writes together make default CF
800
+ // later contain data that should've been included in the atomic flush.
801
+ ASSERT_OK(Put(0, "k2", "v2", write_opts));
802
+ // The following write increases the max seqno of this atomic flush to be 3,
803
+ // which is greater than the seqno of default CF's data. This then violates
804
+ // the invariant that all entries of seqno less than the max seqno
805
+ // of this atomic flush should've been flushed by the time of this atomic
806
+ // flush finishes.
807
+ ASSERT_OK(Put(1, "k3", "v3", write_opts));
808
+
809
+ // Resume compaction threads and reduce L0 files so `GetLiveFiles()` can
810
+ // resume from the wait
811
+ sleeping_task_->WakeUp();
812
+ sleeping_task_->WaitUntilDone();
813
+ MoveFilesToLevel(1, 1);
814
+ });
815
+
816
+ // Trigger an atomic flush by `GetLiveFiles()`
817
+ std::vector<std::string> files;
818
+ uint64_t manifest_file_size;
819
+ ASSERT_OK(db_->GetLiveFiles(files, &manifest_file_size, /*flush*/ true));
820
+
821
+ write_thread.join();
822
+
823
+ ReopenWithColumnFamilies({"default", "cf1"}, options);
824
+
825
+ ASSERT_EQ(Get(1, "k3"), "v3");
826
+ // Prior to the fix, `Get()` will return `NotFound as "k2" entry in default CF
827
+ // can't be recovered from a crash right after the atomic flush finishes,
828
+ // resulting in a "recovery hole" as "k3" can be recovered. It's due to the
829
+ // invariant violation described above.
830
+ ASSERT_EQ(Get(0, "k2"), "v2");
831
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
832
+ }
833
+
834
+ TEST_F(DBFlushTest, FixFlushReasonRaceFromConcurrentFlushes) {
835
+ Options options = CurrentOptions();
836
+ options.atomic_flush = true;
837
+ options.disable_auto_compactions = true;
838
+ CreateAndReopenWithCF({"cf1"}, options);
839
+
840
+ for (int idx = 0; idx < 1; ++idx) {
841
+ ASSERT_OK(Put(0, Key(idx), std::string(1, 'v')));
842
+ ASSERT_OK(Put(1, Key(idx), std::string(1, 'v')));
843
+ }
844
+
845
+ // To coerce a manual flush happenning in the middle of GetLiveFiles's flush,
846
+ // we need to pause background flush thread and enable it later.
847
+ std::shared_ptr<test::SleepingBackgroundTask> sleeping_task =
848
+ std::make_shared<test::SleepingBackgroundTask>();
849
+ env_->SetBackgroundThreads(1, Env::HIGH);
850
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask,
851
+ sleeping_task.get(), Env::Priority::HIGH);
852
+ sleeping_task->WaitUntilSleeping();
853
+
854
+ // Coerce a manual flush happenning in the middle of GetLiveFiles's flush
855
+ bool get_live_files_paused_at_sync_point = false;
856
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
857
+ "DBImpl::AtomicFlushMemTables:AfterScheduleFlush", [&](void* /* arg */) {
858
+ if (get_live_files_paused_at_sync_point) {
859
+ // To prevent non-GetLiveFiles() flush from pausing at this sync point
860
+ return;
861
+ }
862
+ get_live_files_paused_at_sync_point = true;
863
+
864
+ FlushOptions fo;
865
+ fo.wait = false;
866
+ fo.allow_write_stall = true;
867
+ ASSERT_OK(dbfull()->Flush(fo));
868
+
869
+ // Resume background flush thread so GetLiveFiles() can finish
870
+ sleeping_task->WakeUp();
871
+ sleeping_task->WaitUntilDone();
872
+ });
873
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
874
+
875
+ std::vector<std::string> files;
876
+ uint64_t manifest_file_size;
877
+ // Before the fix, a race condition on default cf's flush reason due to
878
+ // concurrent GetLiveFiles's flush and manual flush will fail
879
+ // an internal assertion.
880
+ // After the fix, such race condition is fixed and there is no assertion
881
+ // failure.
882
+ ASSERT_OK(db_->GetLiveFiles(files, &manifest_file_size, /*flush*/ true));
883
+ ASSERT_TRUE(get_live_files_paused_at_sync_point);
884
+
885
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->ClearAllCallBacks();
886
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
887
+ }
888
+
889
+ TEST_F(DBFlushTest, MemPurgeBasic) {
890
+ Options options = CurrentOptions();
891
+
892
+ // The following options are used to enforce several values that
893
+ // may already exist as default values to make this test resilient
894
+ // to default value updates in the future.
895
+ options.statistics = CreateDBStatistics();
896
+
897
+ // Record all statistics.
898
+ options.statistics->set_stats_level(StatsLevel::kAll);
899
+
900
+ // create the DB if it's not already present
901
+ options.create_if_missing = true;
902
+
903
+ // Useful for now as we are trying to compare uncompressed data savings on
904
+ // flush().
905
+ options.compression = kNoCompression;
906
+
907
+ // Prevent memtable in place updates. Should already be disabled
908
+ // (from Wiki:
909
+ // In place updates can be enabled by toggling on the bool
910
+ // inplace_update_support flag. However, this flag is by default set to
911
+ // false
912
+ // because this thread-safe in-place update support is not compatible
913
+ // with concurrent memtable writes. Note that the bool
914
+ // allow_concurrent_memtable_write is set to true by default )
915
+ options.inplace_update_support = false;
916
+ options.allow_concurrent_memtable_write = true;
917
+
918
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
919
+ options.write_buffer_size = 1 << 20;
920
+ // Initially deactivate the MemPurge prototype.
921
+ options.experimental_mempurge_threshold = 0.0;
922
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
923
+ options.listeners.emplace_back(listener);
924
+ ASSERT_OK(TryReopen(options));
925
+
926
+ // RocksDB lite does not support dynamic options
927
+ // Dynamically activate the MemPurge prototype without restarting the DB.
928
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
929
+ ASSERT_OK(db_->SetOptions(cfh, {{"experimental_mempurge_threshold", "1.0"}}));
930
+
931
+ std::atomic<uint32_t> mempurge_count{0};
932
+ std::atomic<uint32_t> sst_count{0};
933
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
934
+ "DBImpl::FlushJob:MemPurgeSuccessful",
935
+ [&](void* /*arg*/) { mempurge_count++; });
936
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
937
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
938
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
939
+
940
+ std::string KEY1 = "IamKey1";
941
+ std::string KEY2 = "IamKey2";
942
+ std::string KEY3 = "IamKey3";
943
+ std::string KEY4 = "IamKey4";
944
+ std::string KEY5 = "IamKey5";
945
+ std::string KEY6 = "IamKey6";
946
+ std::string KEY7 = "IamKey7";
947
+ std::string KEY8 = "IamKey8";
948
+ std::string KEY9 = "IamKey9";
949
+ std::string RNDKEY1, RNDKEY2, RNDKEY3;
950
+ const std::string NOT_FOUND = "NOT_FOUND";
951
+
952
+ // Heavy overwrite workload,
953
+ // more than would fit in maximum allowed memtables.
954
+ Random rnd(719);
955
+ const size_t NUM_REPEAT = 100;
956
+ const size_t RAND_KEYS_LENGTH = 57;
957
+ const size_t RAND_VALUES_LENGTH = 10240;
958
+ std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9, p_rv1,
959
+ p_rv2, p_rv3;
960
+
961
+ // Insert a very first set of keys that will be
962
+ // mempurged at least once.
963
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
964
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
965
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
966
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
967
+ ASSERT_OK(Put(KEY1, p_v1));
968
+ ASSERT_OK(Put(KEY2, p_v2));
969
+ ASSERT_OK(Put(KEY3, p_v3));
970
+ ASSERT_OK(Put(KEY4, p_v4));
971
+ ASSERT_EQ(Get(KEY1), p_v1);
972
+ ASSERT_EQ(Get(KEY2), p_v2);
973
+ ASSERT_EQ(Get(KEY3), p_v3);
974
+ ASSERT_EQ(Get(KEY4), p_v4);
975
+
976
+ // Insertion of of K-V pairs, multiple times (overwrites).
977
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
978
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
979
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
980
+ p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
981
+ p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
982
+ p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
983
+ p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
984
+
985
+ ASSERT_OK(Put(KEY5, p_v5));
986
+ ASSERT_OK(Put(KEY6, p_v6));
987
+ ASSERT_OK(Put(KEY7, p_v7));
988
+ ASSERT_OK(Put(KEY8, p_v8));
989
+ ASSERT_OK(Put(KEY9, p_v9));
990
+
991
+ ASSERT_EQ(Get(KEY1), p_v1);
992
+ ASSERT_EQ(Get(KEY2), p_v2);
993
+ ASSERT_EQ(Get(KEY3), p_v3);
994
+ ASSERT_EQ(Get(KEY4), p_v4);
995
+ ASSERT_EQ(Get(KEY5), p_v5);
996
+ ASSERT_EQ(Get(KEY6), p_v6);
997
+ ASSERT_EQ(Get(KEY7), p_v7);
998
+ ASSERT_EQ(Get(KEY8), p_v8);
999
+ ASSERT_EQ(Get(KEY9), p_v9);
1000
+ }
1001
+
1002
+ // Check that there was at least one mempurge
1003
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1004
+ // Check that there was no SST files created during flush.
1005
+ const uint32_t EXPECTED_SST_COUNT = 0;
1006
+
1007
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1008
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1009
+
1010
+ // Insertion of of K-V pairs, no overwrites.
1011
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1012
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1013
+ RNDKEY1 = rnd.RandomString(RAND_KEYS_LENGTH);
1014
+ RNDKEY2 = rnd.RandomString(RAND_KEYS_LENGTH);
1015
+ RNDKEY3 = rnd.RandomString(RAND_KEYS_LENGTH);
1016
+ p_rv1 = rnd.RandomString(RAND_VALUES_LENGTH);
1017
+ p_rv2 = rnd.RandomString(RAND_VALUES_LENGTH);
1018
+ p_rv3 = rnd.RandomString(RAND_VALUES_LENGTH);
1019
+
1020
+ ASSERT_OK(Put(RNDKEY1, p_rv1));
1021
+ ASSERT_OK(Put(RNDKEY2, p_rv2));
1022
+ ASSERT_OK(Put(RNDKEY3, p_rv3));
1023
+
1024
+ ASSERT_EQ(Get(KEY1), p_v1);
1025
+ ASSERT_EQ(Get(KEY2), p_v2);
1026
+ ASSERT_EQ(Get(KEY3), p_v3);
1027
+ ASSERT_EQ(Get(KEY4), p_v4);
1028
+ ASSERT_EQ(Get(KEY5), p_v5);
1029
+ ASSERT_EQ(Get(KEY6), p_v6);
1030
+ ASSERT_EQ(Get(KEY7), p_v7);
1031
+ ASSERT_EQ(Get(KEY8), p_v8);
1032
+ ASSERT_EQ(Get(KEY9), p_v9);
1033
+ ASSERT_EQ(Get(RNDKEY1), p_rv1);
1034
+ ASSERT_EQ(Get(RNDKEY2), p_rv2);
1035
+ ASSERT_EQ(Get(RNDKEY3), p_rv3);
1036
+ }
1037
+
1038
+ // Assert that at least one flush to storage has been performed
1039
+ EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
1040
+ // (which will consequently increase the number of mempurges recorded too).
1041
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1042
+
1043
+ // Assert that there is no data corruption, even with
1044
+ // a flush to storage.
1045
+ ASSERT_EQ(Get(KEY1), p_v1);
1046
+ ASSERT_EQ(Get(KEY2), p_v2);
1047
+ ASSERT_EQ(Get(KEY3), p_v3);
1048
+ ASSERT_EQ(Get(KEY4), p_v4);
1049
+ ASSERT_EQ(Get(KEY5), p_v5);
1050
+ ASSERT_EQ(Get(KEY6), p_v6);
1051
+ ASSERT_EQ(Get(KEY7), p_v7);
1052
+ ASSERT_EQ(Get(KEY8), p_v8);
1053
+ ASSERT_EQ(Get(KEY9), p_v9);
1054
+ ASSERT_EQ(Get(RNDKEY1), p_rv1);
1055
+ ASSERT_EQ(Get(RNDKEY2), p_rv2);
1056
+ ASSERT_EQ(Get(RNDKEY3), p_rv3);
1057
+
1058
+ Close();
1059
+ }
1060
+
1061
+ // RocksDB lite does not support dynamic options
1062
+ TEST_F(DBFlushTest, MemPurgeBasicToggle) {
1063
+ Options options = CurrentOptions();
1064
+
1065
+ // The following options are used to enforce several values that
1066
+ // may already exist as default values to make this test resilient
1067
+ // to default value updates in the future.
1068
+ options.statistics = CreateDBStatistics();
1069
+
1070
+ // Record all statistics.
1071
+ options.statistics->set_stats_level(StatsLevel::kAll);
1072
+
1073
+ // create the DB if it's not already present
1074
+ options.create_if_missing = true;
1075
+
1076
+ // Useful for now as we are trying to compare uncompressed data savings on
1077
+ // flush().
1078
+ options.compression = kNoCompression;
1079
+
1080
+ // Prevent memtable in place updates. Should already be disabled
1081
+ // (from Wiki:
1082
+ // In place updates can be enabled by toggling on the bool
1083
+ // inplace_update_support flag. However, this flag is by default set to
1084
+ // false
1085
+ // because this thread-safe in-place update support is not compatible
1086
+ // with concurrent memtable writes. Note that the bool
1087
+ // allow_concurrent_memtable_write is set to true by default )
1088
+ options.inplace_update_support = false;
1089
+ options.allow_concurrent_memtable_write = true;
1090
+
1091
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
1092
+ options.write_buffer_size = 1 << 20;
1093
+ // Initially deactivate the MemPurge prototype.
1094
+ // (negative values are equivalent to 0.0).
1095
+ options.experimental_mempurge_threshold = -25.3;
1096
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
1097
+ options.listeners.emplace_back(listener);
1098
+
1099
+ ASSERT_OK(TryReopen(options));
1100
+ // Dynamically activate the MemPurge prototype without restarting the DB.
1101
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
1102
+ // Values greater than 1.0 are equivalent to 1.0
1103
+ ASSERT_OK(
1104
+ db_->SetOptions(cfh, {{"experimental_mempurge_threshold", "3.7898"}}));
1105
+ std::atomic<uint32_t> mempurge_count{0};
1106
+ std::atomic<uint32_t> sst_count{0};
1107
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1108
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1109
+ [&](void* /*arg*/) { mempurge_count++; });
1110
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1111
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1112
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1113
+ const size_t KVSIZE = 3;
1114
+ std::vector<std::string> KEYS(KVSIZE);
1115
+ for (size_t k = 0; k < KVSIZE; k++) {
1116
+ KEYS[k] = "IamKey" + std::to_string(k);
1117
+ }
1118
+
1119
+ std::vector<std::string> RNDVALS(KVSIZE);
1120
+ const std::string NOT_FOUND = "NOT_FOUND";
1121
+
1122
+ // Heavy overwrite workload,
1123
+ // more than would fit in maximum allowed memtables.
1124
+ Random rnd(719);
1125
+ const size_t NUM_REPEAT = 100;
1126
+ const size_t RAND_VALUES_LENGTH = 10240;
1127
+
1128
+ // Insertion of of K-V pairs, multiple times (overwrites).
1129
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1130
+ for (size_t j = 0; j < KEYS.size(); j++) {
1131
+ RNDVALS[j] = rnd.RandomString(RAND_VALUES_LENGTH);
1132
+ ASSERT_OK(Put(KEYS[j], RNDVALS[j]));
1133
+ ASSERT_EQ(Get(KEYS[j]), RNDVALS[j]);
1134
+ }
1135
+ for (size_t j = 0; j < KEYS.size(); j++) {
1136
+ ASSERT_EQ(Get(KEYS[j]), RNDVALS[j]);
1137
+ }
1138
+ }
1139
+
1140
+ // Check that there was at least one mempurge
1141
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1142
+ // Check that there was no SST files created during flush.
1143
+ const uint32_t EXPECTED_SST_COUNT = 0;
1144
+
1145
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1146
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1147
+
1148
+ // Dynamically deactivate MemPurge.
1149
+ ASSERT_OK(
1150
+ db_->SetOptions(cfh, {{"experimental_mempurge_threshold", "-1023.0"}}));
1151
+
1152
+ // Insertion of of K-V pairs, multiple times (overwrites).
1153
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1154
+ for (size_t j = 0; j < KEYS.size(); j++) {
1155
+ RNDVALS[j] = rnd.RandomString(RAND_VALUES_LENGTH);
1156
+ ASSERT_OK(Put(KEYS[j], RNDVALS[j]));
1157
+ ASSERT_EQ(Get(KEYS[j]), RNDVALS[j]);
1158
+ }
1159
+ for (size_t j = 0; j < KEYS.size(); j++) {
1160
+ ASSERT_EQ(Get(KEYS[j]), RNDVALS[j]);
1161
+ }
1162
+ }
1163
+
1164
+ // Check that there was at least one mempurge
1165
+ const uint32_t ZERO = 0;
1166
+ // Assert that at least one flush to storage has been performed
1167
+ EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
1168
+ // The mempurge count is expected to be set to 0 when the options are updated.
1169
+ // We expect no mempurge at all.
1170
+ EXPECT_EQ(mempurge_count.exchange(0), ZERO);
1171
+
1172
+ Close();
1173
+ }
1174
+ // End of MemPurgeBasicToggle, which is not
1175
+ // supported with RocksDB LITE because it
1176
+ // relies on dynamically changing the option
1177
+ // flag experimental_mempurge_threshold.
1178
+
1179
+ // At the moment, MemPurge feature is deactivated
1180
+ // when atomic_flush is enabled. This is because the level
1181
+ // of garbage between Column Families is not guaranteed to
1182
+ // be consistent, therefore a CF could hypothetically
1183
+ // trigger a MemPurge while another CF would trigger
1184
+ // a regular Flush.
1185
+ TEST_F(DBFlushTest, MemPurgeWithAtomicFlush) {
1186
+ Options options = CurrentOptions();
1187
+
1188
+ // The following options are used to enforce several values that
1189
+ // may already exist as default values to make this test resilient
1190
+ // to default value updates in the future.
1191
+ options.statistics = CreateDBStatistics();
1192
+
1193
+ // Record all statistics.
1194
+ options.statistics->set_stats_level(StatsLevel::kAll);
1195
+
1196
+ // create the DB if it's not already present
1197
+ options.create_if_missing = true;
1198
+
1199
+ // Useful for now as we are trying to compare uncompressed data savings on
1200
+ // flush().
1201
+ options.compression = kNoCompression;
1202
+
1203
+ // Prevent memtable in place updates. Should already be disabled
1204
+ // (from Wiki:
1205
+ // In place updates can be enabled by toggling on the bool
1206
+ // inplace_update_support flag. However, this flag is by default set to
1207
+ // false
1208
+ // because this thread-safe in-place update support is not compatible
1209
+ // with concurrent memtable writes. Note that the bool
1210
+ // allow_concurrent_memtable_write is set to true by default )
1211
+ options.inplace_update_support = false;
1212
+ options.allow_concurrent_memtable_write = true;
1213
+
1214
+ // Enforce size of a single MemTable to 64KB (64KB = 65,536 bytes).
1215
+ options.write_buffer_size = 1 << 20;
1216
+ // Activate the MemPurge prototype.
1217
+ options.experimental_mempurge_threshold = 153.245;
1218
+ // Activate atomic_flush.
1219
+ options.atomic_flush = true;
1220
+
1221
+ const std::vector<std::string> new_cf_names = {"pikachu", "eevie"};
1222
+ CreateColumnFamilies(new_cf_names, options);
1223
+
1224
+ Close();
1225
+
1226
+ // 3 CFs: default will be filled with overwrites (would normally trigger
1227
+ // mempurge)
1228
+ // new_cf_names[1] will be filled with random values (would trigger
1229
+ // flush) new_cf_names[2] not filled with anything.
1230
+ ReopenWithColumnFamilies(
1231
+ {kDefaultColumnFamilyName, new_cf_names[0], new_cf_names[1]}, options);
1232
+ size_t num_cfs = handles_.size();
1233
+ ASSERT_EQ(3, num_cfs);
1234
+ ASSERT_OK(Put(1, "foo", "bar"));
1235
+ ASSERT_OK(Put(2, "bar", "baz"));
1236
+
1237
+ std::atomic<uint32_t> mempurge_count{0};
1238
+ std::atomic<uint32_t> sst_count{0};
1239
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1240
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1241
+ [&](void* /*arg*/) { mempurge_count++; });
1242
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1243
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1244
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1245
+
1246
+ const size_t KVSIZE = 3;
1247
+ std::vector<std::string> KEYS(KVSIZE);
1248
+ for (size_t k = 0; k < KVSIZE; k++) {
1249
+ KEYS[k] = "IamKey" + std::to_string(k);
1250
+ }
1251
+
1252
+ std::string RNDKEY;
1253
+ std::vector<std::string> RNDVALS(KVSIZE);
1254
+ const std::string NOT_FOUND = "NOT_FOUND";
1255
+
1256
+ // Heavy overwrite workload,
1257
+ // more than would fit in maximum allowed memtables.
1258
+ Random rnd(106);
1259
+ const size_t NUM_REPEAT = 100;
1260
+ const size_t RAND_KEY_LENGTH = 128;
1261
+ const size_t RAND_VALUES_LENGTH = 10240;
1262
+
1263
+ // Insertion of of K-V pairs, multiple times (overwrites).
1264
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1265
+ for (size_t j = 0; j < KEYS.size(); j++) {
1266
+ RNDKEY = rnd.RandomString(RAND_KEY_LENGTH);
1267
+ RNDVALS[j] = rnd.RandomString(RAND_VALUES_LENGTH);
1268
+ ASSERT_OK(Put(KEYS[j], RNDVALS[j]));
1269
+ ASSERT_OK(Put(1, RNDKEY, RNDVALS[j]));
1270
+ ASSERT_EQ(Get(KEYS[j]), RNDVALS[j]);
1271
+ ASSERT_EQ(Get(1, RNDKEY), RNDVALS[j]);
1272
+ }
1273
+ }
1274
+
1275
+ // Check that there was no mempurge because atomic_flush option is true.
1276
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 0;
1277
+ // Check that there was at least one SST files created during flush.
1278
+ const uint32_t EXPECTED_SST_COUNT = 1;
1279
+
1280
+ EXPECT_EQ(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1281
+ EXPECT_GE(sst_count.exchange(0), EXPECTED_SST_COUNT);
1282
+
1283
+ Close();
1284
+ }
1285
+
1286
+ TEST_F(DBFlushTest, MemPurgeDeleteAndDeleteRange) {
1287
+ Options options = CurrentOptions();
1288
+
1289
+ options.statistics = CreateDBStatistics();
1290
+ options.statistics->set_stats_level(StatsLevel::kAll);
1291
+ options.create_if_missing = true;
1292
+ options.compression = kNoCompression;
1293
+ options.inplace_update_support = false;
1294
+ options.allow_concurrent_memtable_write = true;
1295
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
1296
+ options.listeners.emplace_back(listener);
1297
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
1298
+ options.write_buffer_size = 1 << 20;
1299
+ // Activate the MemPurge prototype.
1300
+ options.experimental_mempurge_threshold = 15.0;
1301
+
1302
+ ASSERT_OK(TryReopen(options));
1303
+
1304
+ std::atomic<uint32_t> mempurge_count{0};
1305
+ std::atomic<uint32_t> sst_count{0};
1306
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1307
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1308
+ [&](void* /*arg*/) { mempurge_count++; });
1309
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1310
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1311
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1312
+
1313
+ std::string KEY1 = "ThisIsKey1";
1314
+ std::string KEY2 = "ThisIsKey2";
1315
+ std::string KEY3 = "ThisIsKey3";
1316
+ std::string KEY4 = "ThisIsKey4";
1317
+ std::string KEY5 = "ThisIsKey5";
1318
+ const std::string NOT_FOUND = "NOT_FOUND";
1319
+
1320
+ Random rnd(117);
1321
+ const size_t NUM_REPEAT = 100;
1322
+ const size_t RAND_VALUES_LENGTH = 10240;
1323
+
1324
+ std::string key, value, p_v1, p_v2, p_v3, p_v3b, p_v4, p_v5;
1325
+ int count = 0;
1326
+ const int EXPECTED_COUNT_FORLOOP = 3;
1327
+ const int EXPECTED_COUNT_END = 4;
1328
+
1329
+ ReadOptions ropt;
1330
+ ropt.pin_data = true;
1331
+ ropt.total_order_seek = true;
1332
+ Iterator* iter = nullptr;
1333
+
1334
+ // Insertion of of K-V pairs, multiple times.
1335
+ // Also insert DeleteRange
1336
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1337
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1338
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
1339
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
1340
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
1341
+ p_v3b = rnd.RandomString(RAND_VALUES_LENGTH);
1342
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
1343
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
1344
+ ASSERT_OK(Put(KEY1, p_v1));
1345
+ ASSERT_OK(Put(KEY2, p_v2));
1346
+ ASSERT_OK(Put(KEY3, p_v3));
1347
+ ASSERT_OK(Put(KEY4, p_v4));
1348
+ ASSERT_OK(Put(KEY5, p_v5));
1349
+ ASSERT_OK(Delete(KEY2));
1350
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
1351
+ KEY4));
1352
+ ASSERT_OK(Put(KEY3, p_v3b));
1353
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
1354
+ KEY3));
1355
+ ASSERT_OK(Delete(KEY1));
1356
+
1357
+ ASSERT_EQ(Get(KEY1), NOT_FOUND);
1358
+ ASSERT_EQ(Get(KEY2), NOT_FOUND);
1359
+ ASSERT_EQ(Get(KEY3), p_v3b);
1360
+ ASSERT_EQ(Get(KEY4), p_v4);
1361
+ ASSERT_EQ(Get(KEY5), p_v5);
1362
+
1363
+ iter = db_->NewIterator(ropt);
1364
+ iter->SeekToFirst();
1365
+ count = 0;
1366
+ for (; iter->Valid(); iter->Next()) {
1367
+ ASSERT_OK(iter->status());
1368
+ key = (iter->key()).ToString(false);
1369
+ value = (iter->value()).ToString(false);
1370
+ if (key.compare(KEY3) == 0)
1371
+ ASSERT_EQ(value, p_v3b);
1372
+ else if (key.compare(KEY4) == 0)
1373
+ ASSERT_EQ(value, p_v4);
1374
+ else if (key.compare(KEY5) == 0)
1375
+ ASSERT_EQ(value, p_v5);
1376
+ else
1377
+ ASSERT_EQ(value, NOT_FOUND);
1378
+ count++;
1379
+ }
1380
+
1381
+ // Expected count here is 3: KEY3, KEY4, KEY5.
1382
+ ASSERT_EQ(count, EXPECTED_COUNT_FORLOOP);
1383
+ if (iter) {
1384
+ delete iter;
1385
+ }
1386
+ }
1387
+
1388
+ // Check that there was at least one mempurge
1389
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1390
+ // Check that there was no SST files created during flush.
1391
+ const uint32_t EXPECTED_SST_COUNT = 0;
1392
+
1393
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1394
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1395
+
1396
+ // Additional test for the iterator+memPurge.
1397
+ ASSERT_OK(Put(KEY2, p_v2));
1398
+ iter = db_->NewIterator(ropt);
1399
+ iter->SeekToFirst();
1400
+ ASSERT_OK(Put(KEY4, p_v4));
1401
+ count = 0;
1402
+ for (; iter->Valid(); iter->Next()) {
1403
+ ASSERT_OK(iter->status());
1404
+ key = (iter->key()).ToString(false);
1405
+ value = (iter->value()).ToString(false);
1406
+ if (key.compare(KEY2) == 0)
1407
+ ASSERT_EQ(value, p_v2);
1408
+ else if (key.compare(KEY3) == 0)
1409
+ ASSERT_EQ(value, p_v3b);
1410
+ else if (key.compare(KEY4) == 0)
1411
+ ASSERT_EQ(value, p_v4);
1412
+ else if (key.compare(KEY5) == 0)
1413
+ ASSERT_EQ(value, p_v5);
1414
+ else
1415
+ ASSERT_EQ(value, NOT_FOUND);
1416
+ count++;
1417
+ }
1418
+
1419
+ // Expected count here is 4: KEY2, KEY3, KEY4, KEY5.
1420
+ ASSERT_EQ(count, EXPECTED_COUNT_END);
1421
+ if (iter) delete iter;
1422
+
1423
+ Close();
1424
+ }
1425
+
1426
+ // Create a Compaction Fitler that will be invoked
1427
+ // at flush time and will update the value of a KV pair
1428
+ // if the key string is "lower" than the filter_key_ string.
1429
+ class ConditionalUpdateFilter : public CompactionFilter {
1430
+ public:
1431
+ explicit ConditionalUpdateFilter(const std::string* filtered_key)
1432
+ : filtered_key_(filtered_key) {}
1433
+ bool Filter(int /*level*/, const Slice& key, const Slice& /*value*/,
1434
+ std::string* new_value, bool* value_changed) const override {
1435
+ // If key<filtered_key_, update the value of the KV-pair.
1436
+ if (key.compare(*filtered_key_) < 0) {
1437
+ assert(new_value != nullptr);
1438
+ *new_value = NEW_VALUE;
1439
+ *value_changed = true;
1440
+ }
1441
+ return false /*do not remove this KV-pair*/;
1442
+ }
1443
+
1444
+ const char* Name() const override { return "ConditionalUpdateFilter"; }
1445
+
1446
+ private:
1447
+ const std::string* filtered_key_;
1448
+ };
1449
+
1450
+ class ConditionalUpdateFilterFactory : public CompactionFilterFactory {
1451
+ public:
1452
+ explicit ConditionalUpdateFilterFactory(const Slice& filtered_key)
1453
+ : filtered_key_(filtered_key.ToString()) {}
1454
+
1455
+ std::unique_ptr<CompactionFilter> CreateCompactionFilter(
1456
+ const CompactionFilter::Context& /*context*/) override {
1457
+ return std::unique_ptr<CompactionFilter>(
1458
+ new ConditionalUpdateFilter(&filtered_key_));
1459
+ }
1460
+
1461
+ const char* Name() const override { return "ConditionalUpdateFilterFactory"; }
1462
+
1463
+ bool ShouldFilterTableFileCreation(
1464
+ TableFileCreationReason reason) const override {
1465
+ // This compaction filter will be invoked
1466
+ // at flush time (and therefore at MemPurge time).
1467
+ return (reason == TableFileCreationReason::kFlush);
1468
+ }
1469
+
1470
+ private:
1471
+ std::string filtered_key_;
1472
+ };
1473
+
1474
+ TEST_F(DBFlushTest, MemPurgeAndCompactionFilter) {
1475
+ Options options = CurrentOptions();
1476
+
1477
+ std::string KEY1 = "ThisIsKey1";
1478
+ std::string KEY2 = "ThisIsKey2";
1479
+ std::string KEY3 = "ThisIsKey3";
1480
+ std::string KEY4 = "ThisIsKey4";
1481
+ std::string KEY5 = "ThisIsKey5";
1482
+ std::string KEY6 = "ThisIsKey6";
1483
+ std::string KEY7 = "ThisIsKey7";
1484
+ std::string KEY8 = "ThisIsKey8";
1485
+ std::string KEY9 = "ThisIsKey9";
1486
+ const std::string NOT_FOUND = "NOT_FOUND";
1487
+
1488
+ options.statistics = CreateDBStatistics();
1489
+ options.statistics->set_stats_level(StatsLevel::kAll);
1490
+ options.create_if_missing = true;
1491
+ options.compression = kNoCompression;
1492
+ options.inplace_update_support = false;
1493
+ options.allow_concurrent_memtable_write = true;
1494
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
1495
+ options.listeners.emplace_back(listener);
1496
+ // Create a ConditionalUpdate compaction filter
1497
+ // that will update all the values of the KV pairs
1498
+ // where the keys are "lower" than KEY4.
1499
+ options.compaction_filter_factory =
1500
+ std::make_shared<ConditionalUpdateFilterFactory>(KEY4);
1501
+
1502
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
1503
+ options.write_buffer_size = 1 << 20;
1504
+ // Activate the MemPurge prototype.
1505
+ options.experimental_mempurge_threshold = 26.55;
1506
+
1507
+ ASSERT_OK(TryReopen(options));
1508
+
1509
+ std::atomic<uint32_t> mempurge_count{0};
1510
+ std::atomic<uint32_t> sst_count{0};
1511
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1512
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1513
+ [&](void* /*arg*/) { mempurge_count++; });
1514
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1515
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1516
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1517
+
1518
+ Random rnd(53);
1519
+ const size_t NUM_REPEAT = 1000;
1520
+ const size_t RAND_VALUES_LENGTH = 10240;
1521
+ std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9;
1522
+
1523
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
1524
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
1525
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
1526
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
1527
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
1528
+ ASSERT_OK(Put(KEY1, p_v1));
1529
+ ASSERT_OK(Put(KEY2, p_v2));
1530
+ ASSERT_OK(Put(KEY3, p_v3));
1531
+ ASSERT_OK(Put(KEY4, p_v4));
1532
+ ASSERT_OK(Put(KEY5, p_v5));
1533
+ ASSERT_OK(Delete(KEY1));
1534
+
1535
+ // Insertion of of K-V pairs, multiple times.
1536
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1537
+ // Create value strings of arbitrary
1538
+ // length RAND_VALUES_LENGTH bytes.
1539
+ p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
1540
+ p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
1541
+ p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
1542
+ p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
1543
+ ASSERT_OK(Put(KEY6, p_v6));
1544
+ ASSERT_OK(Put(KEY7, p_v7));
1545
+ ASSERT_OK(Put(KEY8, p_v8));
1546
+ ASSERT_OK(Put(KEY9, p_v9));
1547
+
1548
+ ASSERT_OK(Delete(KEY7));
1549
+ }
1550
+
1551
+ // Check that there was at least one mempurge
1552
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1553
+ // Check that there was no SST files created during flush.
1554
+ const uint32_t EXPECTED_SST_COUNT = 0;
1555
+
1556
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1557
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1558
+
1559
+ // Verify that the ConditionalUpdateCompactionFilter
1560
+ // updated the values of KEY2 and KEY3, and not KEY4 and KEY5.
1561
+ ASSERT_EQ(Get(KEY1), NOT_FOUND);
1562
+ ASSERT_EQ(Get(KEY2), NEW_VALUE);
1563
+ ASSERT_EQ(Get(KEY3), NEW_VALUE);
1564
+ ASSERT_EQ(Get(KEY4), p_v4);
1565
+ ASSERT_EQ(Get(KEY5), p_v5);
1566
+ }
1567
+
1568
+ TEST_F(DBFlushTest, DISABLED_MemPurgeWALSupport) {
1569
+ Options options = CurrentOptions();
1570
+
1571
+ options.statistics = CreateDBStatistics();
1572
+ options.statistics->set_stats_level(StatsLevel::kAll);
1573
+ options.create_if_missing = true;
1574
+ options.compression = kNoCompression;
1575
+ options.inplace_update_support = false;
1576
+ options.allow_concurrent_memtable_write = true;
1577
+
1578
+ // Enforce size of a single MemTable to 128KB.
1579
+ options.write_buffer_size = 128 << 10;
1580
+ // Activate the MemPurge prototype
1581
+ // (values >1.0 are equivalent to 1.0).
1582
+ options.experimental_mempurge_threshold = 2.5;
1583
+
1584
+ ASSERT_OK(TryReopen(options));
1585
+
1586
+ const size_t KVSIZE = 10;
1587
+
1588
+ do {
1589
+ CreateAndReopenWithCF({"pikachu"}, options);
1590
+ ASSERT_OK(Put(1, "foo", "v1"));
1591
+ ASSERT_OK(Put(1, "baz", "v5"));
1592
+
1593
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1594
+ ASSERT_EQ("v1", Get(1, "foo"));
1595
+
1596
+ ASSERT_EQ("v1", Get(1, "foo"));
1597
+ ASSERT_EQ("v5", Get(1, "baz"));
1598
+ ASSERT_OK(Put(0, "bar", "v2"));
1599
+ ASSERT_OK(Put(1, "bar", "v2"));
1600
+ ASSERT_OK(Put(1, "foo", "v3"));
1601
+ std::atomic<uint32_t> mempurge_count{0};
1602
+ std::atomic<uint32_t> sst_count{0};
1603
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1604
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1605
+ [&](void* /*arg*/) { mempurge_count++; });
1606
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1607
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1608
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1609
+
1610
+ std::vector<std::string> keys;
1611
+ for (size_t k = 0; k < KVSIZE; k++) {
1612
+ keys.push_back("IamKey" + std::to_string(k));
1613
+ }
1614
+
1615
+ std::string RNDKEY, RNDVALUE;
1616
+ const std::string NOT_FOUND = "NOT_FOUND";
1617
+
1618
+ // Heavy overwrite workload,
1619
+ // more than would fit in maximum allowed memtables.
1620
+ Random rnd(719);
1621
+ const size_t NUM_REPEAT = 100;
1622
+ const size_t RAND_KEY_LENGTH = 4096;
1623
+ const size_t RAND_VALUES_LENGTH = 1024;
1624
+ std::vector<std::string> values_default(KVSIZE), values_pikachu(KVSIZE);
1625
+
1626
+ // Insert a very first set of keys that will be
1627
+ // mempurged at least once.
1628
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1629
+ values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1630
+ values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1631
+ }
1632
+
1633
+ // Insert keys[0:KVSIZE/2] to
1634
+ // both 'default' and 'pikachu' CFs.
1635
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1636
+ ASSERT_OK(Put(0, keys[k], values_default[k]));
1637
+ ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
1638
+ }
1639
+
1640
+ // Check that the insertion was seamless.
1641
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1642
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1643
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1644
+ }
1645
+
1646
+ // Insertion of of K-V pairs, multiple times (overwrites)
1647
+ // into 'default' CF. Will trigger mempurge.
1648
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1649
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1650
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1651
+ values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1652
+ }
1653
+
1654
+ // Insert K-V into default CF.
1655
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1656
+ ASSERT_OK(Put(0, keys[k], values_default[k]));
1657
+ }
1658
+
1659
+ // Check key validity, for all keys, both in
1660
+ // default and pikachu CFs.
1661
+ for (size_t k = 0; k < KVSIZE; k++) {
1662
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1663
+ }
1664
+ // Note that at this point, only keys[0:KVSIZE/2]
1665
+ // have been inserted into Pikachu.
1666
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1667
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1668
+ }
1669
+ }
1670
+
1671
+ // Insertion of of K-V pairs, multiple times (overwrites)
1672
+ // into 'pikachu' CF. Will trigger mempurge.
1673
+ // Check that we keep the older logs for 'default' imm().
1674
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1675
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1676
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1677
+ values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1678
+ }
1679
+
1680
+ // Insert K-V into pikachu CF.
1681
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1682
+ ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
1683
+ }
1684
+
1685
+ // Check key validity, for all keys,
1686
+ // both in default and pikachu.
1687
+ for (size_t k = 0; k < KVSIZE; k++) {
1688
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1689
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1690
+ }
1691
+ }
1692
+
1693
+ // Check that there was at least one mempurge
1694
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1695
+ // Check that there was no SST files created during flush.
1696
+ const uint32_t EXPECTED_SST_COUNT = 0;
1697
+
1698
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1699
+ if (options.experimental_mempurge_threshold ==
1700
+ std::numeric_limits<double>::max()) {
1701
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1702
+ }
1703
+
1704
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1705
+ // Check that there was no data corruption anywhere,
1706
+ // not in 'default' nor in 'Pikachu' CFs.
1707
+ ASSERT_EQ("v3", Get(1, "foo"));
1708
+ ASSERT_OK(Put(1, "foo", "v4"));
1709
+ ASSERT_EQ("v4", Get(1, "foo"));
1710
+ ASSERT_EQ("v2", Get(1, "bar"));
1711
+ ASSERT_EQ("v5", Get(1, "baz"));
1712
+ // Check keys in 'Default' and 'Pikachu'.
1713
+ // keys[0:KVSIZE/2] were for sure contained
1714
+ // in the imm() at Reopen/recovery time.
1715
+ for (size_t k = 0; k < KVSIZE; k++) {
1716
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1717
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1718
+ }
1719
+ // Insertion of random K-V pairs to trigger
1720
+ // a flush in the Pikachu CF.
1721
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1722
+ RNDKEY = rnd.RandomString(RAND_KEY_LENGTH);
1723
+ RNDVALUE = rnd.RandomString(RAND_VALUES_LENGTH);
1724
+ ASSERT_OK(Put(1, RNDKEY, RNDVALUE));
1725
+ }
1726
+ // ASsert than there was at least one flush to storage.
1727
+ EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
1728
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1729
+ ASSERT_EQ("v4", Get(1, "foo"));
1730
+ ASSERT_EQ("v2", Get(1, "bar"));
1731
+ ASSERT_EQ("v5", Get(1, "baz"));
1732
+ // Since values in default are held in mutable mem()
1733
+ // and imm(), check if the flush in pikachu didn't
1734
+ // affect these values.
1735
+ for (size_t k = 0; k < KVSIZE; k++) {
1736
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1737
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1738
+ }
1739
+ ASSERT_EQ(Get(1, RNDKEY), RNDVALUE);
1740
+ } while (ChangeWalOptions());
1741
+ }
1742
+
1743
+ TEST_F(DBFlushTest, MemPurgeCorrectLogNumberAndSSTFileCreation) {
1744
+ // Before our bug fix, we noticed that when 2 memtables were
1745
+ // being flushed (with one memtable being the output of a
1746
+ // previous MemPurge and one memtable being a newly-sealed memtable),
1747
+ // the SST file created was not properly added to the DB version
1748
+ // (via the VersionEdit obj), leading to data loss (the SST file
1749
+ // was later being purged as an obsolete file).
1750
+ // Therefore, we reproduce this scenario to test our fix.
1751
+ Options options = CurrentOptions();
1752
+
1753
+ options.create_if_missing = true;
1754
+ options.compression = kNoCompression;
1755
+ options.inplace_update_support = false;
1756
+ options.allow_concurrent_memtable_write = true;
1757
+
1758
+ // Enforce size of a single MemTable to 1MB (64MB = 1048576 bytes).
1759
+ options.write_buffer_size = 1 << 20;
1760
+ // Activate the MemPurge prototype.
1761
+ options.experimental_mempurge_threshold = 1.0;
1762
+
1763
+ // Force to have more than one memtable to trigger a flush.
1764
+ // For some reason this option does not seem to be enforced,
1765
+ // so the following test is designed to make sure that we
1766
+ // are testing the correct test case.
1767
+ options.min_write_buffer_number_to_merge = 3;
1768
+ options.max_write_buffer_number = 5;
1769
+ options.max_write_buffer_size_to_maintain = 2 * (options.write_buffer_size);
1770
+ options.disable_auto_compactions = true;
1771
+ ASSERT_OK(TryReopen(options));
1772
+
1773
+ std::atomic<uint32_t> mempurge_count{0};
1774
+ std::atomic<uint32_t> sst_count{0};
1775
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1776
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1777
+ [&](void* /*arg*/) { mempurge_count++; });
1778
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1779
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1780
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1781
+
1782
+ // Dummy variable used for the following callback function.
1783
+ uint64_t ZERO = 0;
1784
+ // We will first execute mempurge operations exclusively.
1785
+ // Therefore, when the first flush is triggered, we want to make
1786
+ // sure there is at least 2 memtables being flushed: one output
1787
+ // from a previous mempurge, and one newly sealed memtable.
1788
+ // This is when we observed in the past that some SST files created
1789
+ // were not properly added to the DB version (via the VersionEdit obj).
1790
+ std::atomic<uint64_t> num_memtable_at_first_flush(0);
1791
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1792
+ "FlushJob::WriteLevel0Table:num_memtables", [&](void* arg) {
1793
+ uint64_t* mems_size = reinterpret_cast<uint64_t*>(arg);
1794
+ // atomic_compare_exchange_strong sometimes updates the value
1795
+ // of ZERO (the "expected" object), so we make sure ZERO is indeed...
1796
+ // zero.
1797
+ ZERO = 0;
1798
+ std::atomic_compare_exchange_strong(&num_memtable_at_first_flush, &ZERO,
1799
+ *mems_size);
1800
+ });
1801
+
1802
+ const std::vector<std::string> KEYS = {
1803
+ "ThisIsKey1", "ThisIsKey2", "ThisIsKey3", "ThisIsKey4", "ThisIsKey5",
1804
+ "ThisIsKey6", "ThisIsKey7", "ThisIsKey8", "ThisIsKey9"};
1805
+ const std::string NOT_FOUND = "NOT_FOUND";
1806
+
1807
+ Random rnd(117);
1808
+ const uint64_t NUM_REPEAT_OVERWRITES = 100;
1809
+ const uint64_t NUM_RAND_INSERTS = 500;
1810
+ const uint64_t RAND_VALUES_LENGTH = 10240;
1811
+
1812
+ std::string key, value;
1813
+ std::vector<std::string> values(9, "");
1814
+
1815
+ // Keys used to check that no SST file disappeared.
1816
+ for (uint64_t k = 0; k < 5; k++) {
1817
+ values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1818
+ ASSERT_OK(Put(KEYS[k], values[k]));
1819
+ }
1820
+
1821
+ // Insertion of of K-V pairs, multiple times.
1822
+ // Trigger at least one mempurge and no SST file creation.
1823
+ for (size_t i = 0; i < NUM_REPEAT_OVERWRITES; i++) {
1824
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1825
+ for (uint64_t k = 5; k < values.size(); k++) {
1826
+ values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1827
+ ASSERT_OK(Put(KEYS[k], values[k]));
1828
+ }
1829
+ // Check database consistency.
1830
+ for (uint64_t k = 0; k < values.size(); k++) {
1831
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1832
+ }
1833
+ }
1834
+
1835
+ // Check that there was at least one mempurge
1836
+ uint32_t expected_min_mempurge_count = 1;
1837
+ // Check that there was no SST files created during flush.
1838
+ uint32_t expected_sst_count = 0;
1839
+ EXPECT_GE(mempurge_count.load(), expected_min_mempurge_count);
1840
+ EXPECT_EQ(sst_count.load(), expected_sst_count);
1841
+
1842
+ // Trigger an SST file creation and no mempurge.
1843
+ for (size_t i = 0; i < NUM_RAND_INSERTS; i++) {
1844
+ key = rnd.RandomString(RAND_VALUES_LENGTH);
1845
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1846
+ value = rnd.RandomString(RAND_VALUES_LENGTH);
1847
+ ASSERT_OK(Put(key, value));
1848
+ // Check database consistency.
1849
+ for (uint64_t k = 0; k < values.size(); k++) {
1850
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1851
+ }
1852
+ ASSERT_EQ(Get(key), value);
1853
+ }
1854
+
1855
+ // Check that there was at least one SST files created during flush.
1856
+ expected_sst_count = 1;
1857
+ EXPECT_GE(sst_count.load(), expected_sst_count);
1858
+
1859
+ // Oddly enough, num_memtable_at_first_flush is not enforced to be
1860
+ // equal to min_write_buffer_number_to_merge. So by asserting that
1861
+ // the first SST file creation comes from one output memtable
1862
+ // from a previous mempurge, and one newly sealed memtable. This
1863
+ // is the scenario where we observed that some SST files created
1864
+ // were not properly added to the DB version before our bug fix.
1865
+ ASSERT_GE(num_memtable_at_first_flush.load(), 2);
1866
+
1867
+ // Check that no data was lost after SST file creation.
1868
+ for (uint64_t k = 0; k < values.size(); k++) {
1869
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1870
+ }
1871
+ // Extra check of database consistency.
1872
+ ASSERT_EQ(Get(key), value);
1873
+
1874
+ Close();
1875
+ }
1876
+
1877
+ TEST_P(DBFlushDirectIOTest, DirectIO) {
1878
+ Options options;
1879
+ options.create_if_missing = true;
1880
+ options.disable_auto_compactions = true;
1881
+ options.max_background_flushes = 2;
1882
+ options.use_direct_io_for_flush_and_compaction = GetParam();
1883
+ options.env = MockEnv::Create(Env::Default());
1884
+ SyncPoint::GetInstance()->SetCallBack(
1885
+ "BuildTable:create_file", [&](void* arg) {
1886
+ bool* use_direct_writes = static_cast<bool*>(arg);
1887
+ ASSERT_EQ(*use_direct_writes,
1888
+ options.use_direct_io_for_flush_and_compaction);
1889
+ });
1890
+
1891
+ SyncPoint::GetInstance()->EnableProcessing();
1892
+ Reopen(options);
1893
+ ASSERT_OK(Put("foo", "v"));
1894
+ FlushOptions flush_options;
1895
+ flush_options.wait = true;
1896
+ ASSERT_OK(dbfull()->Flush(flush_options));
1897
+ Destroy(options);
1898
+ delete options.env;
1899
+ }
1900
+
1901
+ TEST_F(DBFlushTest, FlushError) {
1902
+ Options options;
1903
+ std::unique_ptr<FaultInjectionTestEnv> fault_injection_env(
1904
+ new FaultInjectionTestEnv(env_));
1905
+ options.write_buffer_size = 100;
1906
+ options.max_write_buffer_number = 4;
1907
+ options.min_write_buffer_number_to_merge = 3;
1908
+ options.disable_auto_compactions = true;
1909
+ options.env = fault_injection_env.get();
1910
+ Reopen(options);
1911
+
1912
+ ASSERT_OK(Put("key1", "value1"));
1913
+ ASSERT_OK(Put("key2", "value2"));
1914
+ fault_injection_env->SetFilesystemActive(false);
1915
+ Status s = dbfull()->TEST_SwitchMemtable();
1916
+ fault_injection_env->SetFilesystemActive(true);
1917
+ Destroy(options);
1918
+ ASSERT_NE(s, Status::OK());
1919
+ }
1920
+
1921
+ TEST_F(DBFlushTest, ManualFlushFailsInReadOnlyMode) {
1922
+ // Regression test for bug where manual flush hangs forever when the DB
1923
+ // is in read-only mode. Verify it now at least returns, despite failing.
1924
+ Options options;
1925
+ std::unique_ptr<FaultInjectionTestEnv> fault_injection_env(
1926
+ new FaultInjectionTestEnv(env_));
1927
+ options.env = fault_injection_env.get();
1928
+ options.max_write_buffer_number = 2;
1929
+ Reopen(options);
1930
+
1931
+ // Trigger a first flush but don't let it run
1932
+ ASSERT_OK(db_->PauseBackgroundWork());
1933
+ ASSERT_OK(Put("key1", "value1"));
1934
+ FlushOptions flush_opts;
1935
+ flush_opts.wait = false;
1936
+ ASSERT_OK(db_->Flush(flush_opts));
1937
+
1938
+ // Write a key to the second memtable so we have something to flush later
1939
+ // after the DB is in read-only mode.
1940
+ ASSERT_OK(Put("key2", "value2"));
1941
+
1942
+ // Let the first flush continue, hit an error, and put the DB in read-only
1943
+ // mode.
1944
+ fault_injection_env->SetFilesystemActive(false);
1945
+ ASSERT_OK(db_->ContinueBackgroundWork());
1946
+ // We ingested the error to env, so the returned status is not OK.
1947
+ ASSERT_NOK(dbfull()->TEST_WaitForFlushMemTable());
1948
+ uint64_t num_bg_errors;
1949
+ ASSERT_TRUE(
1950
+ db_->GetIntProperty(DB::Properties::kBackgroundErrors, &num_bg_errors));
1951
+ ASSERT_GT(num_bg_errors, 0);
1952
+
1953
+ // In the bug scenario, triggering another flush would cause the second flush
1954
+ // to hang forever. After the fix we expect it to return an error.
1955
+ ASSERT_NOK(db_->Flush(FlushOptions()));
1956
+
1957
+ Close();
1958
+ }
1959
+
1960
+ TEST_F(DBFlushTest, CFDropRaceWithWaitForFlushMemTables) {
1961
+ Options options = CurrentOptions();
1962
+ options.create_if_missing = true;
1963
+ CreateAndReopenWithCF({"pikachu"}, options);
1964
+ SyncPoint::GetInstance()->DisableProcessing();
1965
+ SyncPoint::GetInstance()->LoadDependency(
1966
+ {{"DBImpl::FlushMemTable:AfterScheduleFlush",
1967
+ "DBFlushTest::CFDropRaceWithWaitForFlushMemTables:BeforeDrop"},
1968
+ {"DBFlushTest::CFDropRaceWithWaitForFlushMemTables:AfterFree",
1969
+ "DBImpl::BackgroundCallFlush:start"},
1970
+ {"DBImpl::BackgroundCallFlush:start",
1971
+ "DBImpl::FlushMemTable:BeforeWaitForBgFlush"}});
1972
+ SyncPoint::GetInstance()->EnableProcessing();
1973
+ ASSERT_EQ(2, handles_.size());
1974
+ ASSERT_OK(Put(1, "key", "value"));
1975
+ auto* cfd = static_cast<ColumnFamilyHandleImpl*>(handles_[1])->cfd();
1976
+ port::Thread drop_cf_thr([&]() {
1977
+ TEST_SYNC_POINT(
1978
+ "DBFlushTest::CFDropRaceWithWaitForFlushMemTables:BeforeDrop");
1979
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
1980
+ ASSERT_OK(dbfull()->DestroyColumnFamilyHandle(handles_[1]));
1981
+ handles_.resize(1);
1982
+ TEST_SYNC_POINT(
1983
+ "DBFlushTest::CFDropRaceWithWaitForFlushMemTables:AfterFree");
1984
+ });
1985
+ FlushOptions flush_opts;
1986
+ flush_opts.allow_write_stall = true;
1987
+ ASSERT_NOK(dbfull()->TEST_FlushMemTable(cfd, flush_opts));
1988
+ drop_cf_thr.join();
1989
+ Close();
1990
+ SyncPoint::GetInstance()->DisableProcessing();
1991
+ }
1992
+
1993
+ TEST_F(DBFlushTest, FireOnFlushCompletedAfterCommittedResult) {
1994
+ class TestListener : public EventListener {
1995
+ public:
1996
+ void OnFlushCompleted(DB* db, const FlushJobInfo& info) override {
1997
+ // There's only one key in each flush.
1998
+ ASSERT_EQ(info.smallest_seqno, info.largest_seqno);
1999
+ ASSERT_NE(0, info.smallest_seqno);
2000
+ if (info.smallest_seqno == seq1) {
2001
+ // First flush completed
2002
+ ASSERT_FALSE(completed1);
2003
+ completed1 = true;
2004
+ CheckFlushResultCommitted(db, seq1);
2005
+ } else {
2006
+ // Second flush completed
2007
+ ASSERT_FALSE(completed2);
2008
+ completed2 = true;
2009
+ ASSERT_EQ(info.smallest_seqno, seq2);
2010
+ CheckFlushResultCommitted(db, seq2);
2011
+ }
2012
+ }
2013
+
2014
+ void CheckFlushResultCommitted(DB* db, SequenceNumber seq) {
2015
+ DBImpl* db_impl = static_cast_with_check<DBImpl>(db);
2016
+ InstrumentedMutex* mutex = db_impl->mutex();
2017
+ mutex->Lock();
2018
+ auto* cfd = static_cast_with_check<ColumnFamilyHandleImpl>(
2019
+ db->DefaultColumnFamily())
2020
+ ->cfd();
2021
+ ASSERT_LT(seq, cfd->imm()->current()->GetEarliestSequenceNumber());
2022
+ mutex->Unlock();
2023
+ }
2024
+
2025
+ std::atomic<SequenceNumber> seq1{0};
2026
+ std::atomic<SequenceNumber> seq2{0};
2027
+ std::atomic<bool> completed1{false};
2028
+ std::atomic<bool> completed2{false};
2029
+ };
2030
+ std::shared_ptr<TestListener> listener = std::make_shared<TestListener>();
2031
+
2032
+ SyncPoint::GetInstance()->LoadDependency(
2033
+ {{"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables",
2034
+ "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitFirst"},
2035
+ {"DBImpl::FlushMemTableToOutputFile:Finish",
2036
+ "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitSecond"}});
2037
+ SyncPoint::GetInstance()->SetCallBack(
2038
+ "FlushJob::WriteLevel0Table", [&listener](void* arg) {
2039
+ // Wait for the second flush finished, out of mutex.
2040
+ auto* mems = reinterpret_cast<autovector<MemTable*>*>(arg);
2041
+ if (mems->front()->GetEarliestSequenceNumber() == listener->seq1 - 1) {
2042
+ TEST_SYNC_POINT(
2043
+ "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:"
2044
+ "WaitSecond");
2045
+ }
2046
+ });
2047
+
2048
+ Options options = CurrentOptions();
2049
+ options.create_if_missing = true;
2050
+ options.listeners.push_back(listener);
2051
+ // Setting max_flush_jobs = max_background_jobs / 4 = 2.
2052
+ options.max_background_jobs = 8;
2053
+ // Allow 2 immutable memtables.
2054
+ options.max_write_buffer_number = 3;
2055
+ Reopen(options);
2056
+ SyncPoint::GetInstance()->EnableProcessing();
2057
+ ASSERT_OK(Put("foo", "v"));
2058
+ listener->seq1 = db_->GetLatestSequenceNumber();
2059
+ // t1 will wait for the second flush complete before committing flush result.
2060
+ auto t1 = port::Thread([&]() {
2061
+ // flush_opts.wait = true
2062
+ ASSERT_OK(db_->Flush(FlushOptions()));
2063
+ });
2064
+ // Wait for first flush started.
2065
+ TEST_SYNC_POINT(
2066
+ "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitFirst");
2067
+ // The second flush will exit early without commit its result. The work
2068
+ // is delegated to the first flush.
2069
+ ASSERT_OK(Put("bar", "v"));
2070
+ listener->seq2 = db_->GetLatestSequenceNumber();
2071
+ FlushOptions flush_opts;
2072
+ flush_opts.wait = false;
2073
+ ASSERT_OK(db_->Flush(flush_opts));
2074
+ t1.join();
2075
+ // Ensure background work is fully finished including listener callbacks
2076
+ // before accessing listener state.
2077
+ ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
2078
+ ASSERT_TRUE(listener->completed1);
2079
+ ASSERT_TRUE(listener->completed2);
2080
+ SyncPoint::GetInstance()->DisableProcessing();
2081
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2082
+ }
2083
+
2084
+ TEST_F(DBFlushTest, FlushWithBlob) {
2085
+ constexpr uint64_t min_blob_size = 10;
2086
+
2087
+ Options options;
2088
+ options.enable_blob_files = true;
2089
+ options.min_blob_size = min_blob_size;
2090
+ options.disable_auto_compactions = true;
2091
+ options.env = env_;
2092
+
2093
+ Reopen(options);
2094
+
2095
+ constexpr char short_value[] = "short";
2096
+ static_assert(sizeof(short_value) - 1 < min_blob_size,
2097
+ "short_value too long");
2098
+
2099
+ constexpr char long_value[] = "long_value";
2100
+ static_assert(sizeof(long_value) - 1 >= min_blob_size,
2101
+ "long_value too short");
2102
+
2103
+ ASSERT_OK(Put("key1", short_value));
2104
+ ASSERT_OK(Put("key2", long_value));
2105
+
2106
+ ASSERT_OK(Flush());
2107
+
2108
+ ASSERT_EQ(Get("key1"), short_value);
2109
+ ASSERT_EQ(Get("key2"), long_value);
2110
+
2111
+ VersionSet* const versions = dbfull()->GetVersionSet();
2112
+ assert(versions);
2113
+
2114
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
2115
+ assert(cfd);
2116
+
2117
+ Version* const current = cfd->current();
2118
+ assert(current);
2119
+
2120
+ const VersionStorageInfo* const storage_info = current->storage_info();
2121
+ assert(storage_info);
2122
+
2123
+ const auto& l0_files = storage_info->LevelFiles(0);
2124
+ ASSERT_EQ(l0_files.size(), 1);
2125
+
2126
+ const FileMetaData* const table_file = l0_files[0];
2127
+ assert(table_file);
2128
+
2129
+ const auto& blob_files = storage_info->GetBlobFiles();
2130
+ ASSERT_EQ(blob_files.size(), 1);
2131
+
2132
+ const auto& blob_file = blob_files.front();
2133
+ assert(blob_file);
2134
+
2135
+ ASSERT_EQ(table_file->smallest.user_key(), "key1");
2136
+ ASSERT_EQ(table_file->largest.user_key(), "key2");
2137
+ ASSERT_EQ(table_file->fd.smallest_seqno, 1);
2138
+ ASSERT_EQ(table_file->fd.largest_seqno, 2);
2139
+ ASSERT_EQ(table_file->oldest_blob_file_number,
2140
+ blob_file->GetBlobFileNumber());
2141
+
2142
+ ASSERT_EQ(blob_file->GetTotalBlobCount(), 1);
2143
+
2144
+ const InternalStats* const internal_stats = cfd->internal_stats();
2145
+ assert(internal_stats);
2146
+
2147
+ const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
2148
+ ASSERT_FALSE(compaction_stats.empty());
2149
+ ASSERT_EQ(compaction_stats[0].bytes_written, table_file->fd.GetFileSize());
2150
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob,
2151
+ blob_file->GetTotalBlobBytes());
2152
+ ASSERT_EQ(compaction_stats[0].num_output_files, 1);
2153
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 1);
2154
+
2155
+ const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
2156
+ ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
2157
+ compaction_stats[0].bytes_written +
2158
+ compaction_stats[0].bytes_written_blob);
2159
+ }
2160
+
2161
+ TEST_F(DBFlushTest, FlushWithChecksumHandoff1) {
2162
+ if (mem_env_ || encrypted_env_) {
2163
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
2164
+ return;
2165
+ }
2166
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
2167
+ new FaultInjectionTestFS(FileSystem::Default()));
2168
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
2169
+ Options options = CurrentOptions();
2170
+ options.write_buffer_size = 100;
2171
+ options.max_write_buffer_number = 4;
2172
+ options.min_write_buffer_number_to_merge = 3;
2173
+ options.disable_auto_compactions = true;
2174
+ options.env = fault_fs_env.get();
2175
+ options.checksum_handoff_file_types.Add(FileType::kTableFile);
2176
+ Reopen(options);
2177
+
2178
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2179
+ ASSERT_OK(Put("key1", "value1"));
2180
+ ASSERT_OK(Put("key2", "value2"));
2181
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
2182
+
2183
+ // The hash does not match, write fails
2184
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
2185
+ // Since the file system returns IOStatus::Corruption, it is an
2186
+ // unrecoverable error.
2187
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
2188
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
2189
+ });
2190
+ ASSERT_OK(Put("key3", "value3"));
2191
+ ASSERT_OK(Put("key4", "value4"));
2192
+ SyncPoint::GetInstance()->EnableProcessing();
2193
+ Status s = Flush();
2194
+ ASSERT_EQ(s.severity(),
2195
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
2196
+ SyncPoint::GetInstance()->DisableProcessing();
2197
+ Destroy(options);
2198
+ Reopen(options);
2199
+
2200
+ // The file system does not support checksum handoff. The check
2201
+ // will be ignored.
2202
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
2203
+ ASSERT_OK(Put("key5", "value5"));
2204
+ ASSERT_OK(Put("key6", "value6"));
2205
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
2206
+
2207
+ // Each write will be similated as corrupted.
2208
+ // Since the file system returns IOStatus::Corruption, it is an
2209
+ // unrecoverable error.
2210
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2211
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
2212
+ fault_fs->IngestDataCorruptionBeforeWrite();
2213
+ });
2214
+ ASSERT_OK(Put("key7", "value7"));
2215
+ ASSERT_OK(Put("key8", "value8"));
2216
+ SyncPoint::GetInstance()->EnableProcessing();
2217
+ s = Flush();
2218
+ ASSERT_EQ(s.severity(),
2219
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
2220
+ SyncPoint::GetInstance()->DisableProcessing();
2221
+
2222
+ Destroy(options);
2223
+ }
2224
+
2225
+ TEST_F(DBFlushTest, FlushWithChecksumHandoff2) {
2226
+ if (mem_env_ || encrypted_env_) {
2227
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
2228
+ return;
2229
+ }
2230
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
2231
+ new FaultInjectionTestFS(FileSystem::Default()));
2232
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
2233
+ Options options = CurrentOptions();
2234
+ options.write_buffer_size = 100;
2235
+ options.max_write_buffer_number = 4;
2236
+ options.min_write_buffer_number_to_merge = 3;
2237
+ options.disable_auto_compactions = true;
2238
+ options.env = fault_fs_env.get();
2239
+ Reopen(options);
2240
+
2241
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2242
+ ASSERT_OK(Put("key1", "value1"));
2243
+ ASSERT_OK(Put("key2", "value2"));
2244
+ ASSERT_OK(Flush());
2245
+
2246
+ // options is not set, the checksum handoff will not be triggered
2247
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
2248
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
2249
+ });
2250
+ ASSERT_OK(Put("key3", "value3"));
2251
+ ASSERT_OK(Put("key4", "value4"));
2252
+ SyncPoint::GetInstance()->EnableProcessing();
2253
+ ASSERT_OK(Flush());
2254
+ SyncPoint::GetInstance()->DisableProcessing();
2255
+ Destroy(options);
2256
+ Reopen(options);
2257
+
2258
+ // The file system does not support checksum handoff. The check
2259
+ // will be ignored.
2260
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
2261
+ ASSERT_OK(Put("key5", "value5"));
2262
+ ASSERT_OK(Put("key6", "value6"));
2263
+ ASSERT_OK(Flush());
2264
+
2265
+ // options is not set, the checksum handoff will not be triggered
2266
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2267
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
2268
+ fault_fs->IngestDataCorruptionBeforeWrite();
2269
+ });
2270
+ ASSERT_OK(Put("key7", "value7"));
2271
+ ASSERT_OK(Put("key8", "value8"));
2272
+ SyncPoint::GetInstance()->EnableProcessing();
2273
+ ASSERT_OK(Flush());
2274
+ SyncPoint::GetInstance()->DisableProcessing();
2275
+
2276
+ Destroy(options);
2277
+ }
2278
+
2279
+ TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest1) {
2280
+ if (mem_env_ || encrypted_env_) {
2281
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
2282
+ return;
2283
+ }
2284
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
2285
+ new FaultInjectionTestFS(FileSystem::Default()));
2286
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
2287
+ Options options = CurrentOptions();
2288
+ options.write_buffer_size = 100;
2289
+ options.max_write_buffer_number = 4;
2290
+ options.min_write_buffer_number_to_merge = 3;
2291
+ options.disable_auto_compactions = true;
2292
+ options.env = fault_fs_env.get();
2293
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
2294
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2295
+ Reopen(options);
2296
+
2297
+ ASSERT_OK(Put("key1", "value1"));
2298
+ ASSERT_OK(Put("key2", "value2"));
2299
+ ASSERT_OK(Flush());
2300
+
2301
+ // The hash does not match, write fails
2302
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
2303
+ // Since the file system returns IOStatus::Corruption, it is mapped to
2304
+ // kFatalError error.
2305
+ ASSERT_OK(Put("key3", "value3"));
2306
+ SyncPoint::GetInstance()->SetCallBack(
2307
+ "VersionSet::LogAndApply:WriteManifest", [&](void*) {
2308
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
2309
+ });
2310
+ ASSERT_OK(Put("key3", "value3"));
2311
+ ASSERT_OK(Put("key4", "value4"));
2312
+ SyncPoint::GetInstance()->EnableProcessing();
2313
+ Status s = Flush();
2314
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
2315
+ SyncPoint::GetInstance()->DisableProcessing();
2316
+ Destroy(options);
2317
+ }
2318
+
2319
+ TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest2) {
2320
+ if (mem_env_ || encrypted_env_) {
2321
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
2322
+ return;
2323
+ }
2324
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
2325
+ new FaultInjectionTestFS(FileSystem::Default()));
2326
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
2327
+ Options options = CurrentOptions();
2328
+ options.write_buffer_size = 100;
2329
+ options.max_write_buffer_number = 4;
2330
+ options.min_write_buffer_number_to_merge = 3;
2331
+ options.disable_auto_compactions = true;
2332
+ options.env = fault_fs_env.get();
2333
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
2334
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
2335
+ Reopen(options);
2336
+ // The file system does not support checksum handoff. The check
2337
+ // will be ignored.
2338
+ ASSERT_OK(Put("key5", "value5"));
2339
+ ASSERT_OK(Put("key6", "value6"));
2340
+ ASSERT_OK(Flush());
2341
+
2342
+ // Each write will be similated as corrupted.
2343
+ // Since the file system returns IOStatus::Corruption, it is mapped to
2344
+ // kFatalError error.
2345
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
2346
+ SyncPoint::GetInstance()->SetCallBack(
2347
+ "VersionSet::LogAndApply:WriteManifest",
2348
+ [&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
2349
+ ASSERT_OK(Put("key7", "value7"));
2350
+ ASSERT_OK(Put("key8", "value8"));
2351
+ SyncPoint::GetInstance()->EnableProcessing();
2352
+ Status s = Flush();
2353
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
2354
+ SyncPoint::GetInstance()->DisableProcessing();
2355
+
2356
+ Destroy(options);
2357
+ }
2358
+
2359
+ TEST_F(DBFlushTest, PickRightMemtables) {
2360
+ Options options = CurrentOptions();
2361
+ DestroyAndReopen(options);
2362
+ options.create_if_missing = true;
2363
+
2364
+ const std::string test_cf_name = "test_cf";
2365
+ options.max_write_buffer_number = 128;
2366
+ CreateColumnFamilies({test_cf_name}, options);
2367
+
2368
+ Close();
2369
+
2370
+ ReopenWithColumnFamilies({kDefaultColumnFamilyName, test_cf_name}, options);
2371
+
2372
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "value"));
2373
+
2374
+ ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "key", "value"));
2375
+
2376
+ SyncPoint::GetInstance()->DisableProcessing();
2377
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2378
+ SyncPoint::GetInstance()->SetCallBack(
2379
+ "DBImpl::SyncClosedLogs:BeforeReLock", [&](void* /*arg*/) {
2380
+ ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "what", "v"));
2381
+ auto* cfhi =
2382
+ static_cast_with_check<ColumnFamilyHandleImpl>(handles_[1]);
2383
+ assert(cfhi);
2384
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable(cfhi->cfd()));
2385
+ });
2386
+ SyncPoint::GetInstance()->SetCallBack(
2387
+ "DBImpl::FlushMemTableToOutputFile:AfterPickMemtables", [&](void* arg) {
2388
+ auto* job = reinterpret_cast<FlushJob*>(arg);
2389
+ assert(job);
2390
+ const auto& mems = job->GetMemTables();
2391
+ assert(mems.size() == 1);
2392
+ assert(mems[0]);
2393
+ ASSERT_EQ(1, mems[0]->GetID());
2394
+ });
2395
+ SyncPoint::GetInstance()->EnableProcessing();
2396
+
2397
+ ASSERT_OK(db_->Flush(FlushOptions(), handles_[1]));
2398
+
2399
+ SyncPoint::GetInstance()->DisableProcessing();
2400
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2401
+ }
2402
+
2403
+ class DBFlushTestBlobError : public DBFlushTest,
2404
+ public testing::WithParamInterface<std::string> {
2405
+ public:
2406
+ DBFlushTestBlobError() : sync_point_(GetParam()) {}
2407
+
2408
+ std::string sync_point_;
2409
+ };
2410
+
2411
+ INSTANTIATE_TEST_CASE_P(DBFlushTestBlobError, DBFlushTestBlobError,
2412
+ ::testing::ValuesIn(std::vector<std::string>{
2413
+ "BlobFileBuilder::WriteBlobToFile:AddRecord",
2414
+ "BlobFileBuilder::WriteBlobToFile:AppendFooter"}));
2415
+
2416
+ TEST_P(DBFlushTestBlobError, FlushError) {
2417
+ Options options;
2418
+ options.enable_blob_files = true;
2419
+ options.disable_auto_compactions = true;
2420
+ options.env = env_;
2421
+
2422
+ Reopen(options);
2423
+
2424
+ ASSERT_OK(Put("key", "blob"));
2425
+
2426
+ SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* arg) {
2427
+ Status* const s = static_cast<Status*>(arg);
2428
+ assert(s);
2429
+
2430
+ (*s) = Status::IOError(sync_point_);
2431
+ });
2432
+ SyncPoint::GetInstance()->EnableProcessing();
2433
+
2434
+ ASSERT_NOK(Flush());
2435
+
2436
+ SyncPoint::GetInstance()->DisableProcessing();
2437
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2438
+
2439
+ VersionSet* const versions = dbfull()->GetVersionSet();
2440
+ assert(versions);
2441
+
2442
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
2443
+ assert(cfd);
2444
+
2445
+ Version* const current = cfd->current();
2446
+ assert(current);
2447
+
2448
+ const VersionStorageInfo* const storage_info = current->storage_info();
2449
+ assert(storage_info);
2450
+
2451
+ const auto& l0_files = storage_info->LevelFiles(0);
2452
+ ASSERT_TRUE(l0_files.empty());
2453
+
2454
+ const auto& blob_files = storage_info->GetBlobFiles();
2455
+ ASSERT_TRUE(blob_files.empty());
2456
+
2457
+ // Make sure the files generated by the failed job have been deleted
2458
+ std::vector<std::string> files;
2459
+ ASSERT_OK(env_->GetChildren(dbname_, &files));
2460
+ for (const auto& file : files) {
2461
+ uint64_t number = 0;
2462
+ FileType type = kTableFile;
2463
+
2464
+ if (!ParseFileName(file, &number, &type)) {
2465
+ continue;
2466
+ }
2467
+
2468
+ ASSERT_NE(type, kTableFile);
2469
+ ASSERT_NE(type, kBlobFile);
2470
+ }
2471
+
2472
+ const InternalStats* const internal_stats = cfd->internal_stats();
2473
+ assert(internal_stats);
2474
+
2475
+ const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
2476
+ ASSERT_FALSE(compaction_stats.empty());
2477
+
2478
+ if (sync_point_ == "BlobFileBuilder::WriteBlobToFile:AddRecord") {
2479
+ ASSERT_EQ(compaction_stats[0].bytes_written, 0);
2480
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
2481
+ ASSERT_EQ(compaction_stats[0].num_output_files, 0);
2482
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
2483
+ } else {
2484
+ // SST file writing succeeded; blob file writing failed (during Finish)
2485
+ ASSERT_GT(compaction_stats[0].bytes_written, 0);
2486
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
2487
+ ASSERT_EQ(compaction_stats[0].num_output_files, 1);
2488
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
2489
+ }
2490
+
2491
+ const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
2492
+ ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
2493
+ compaction_stats[0].bytes_written +
2494
+ compaction_stats[0].bytes_written_blob);
2495
+ }
2496
+
2497
+ TEST_F(DBFlushTest, TombstoneVisibleInSnapshot) {
2498
+ class SimpleTestFlushListener : public EventListener {
2499
+ public:
2500
+ explicit SimpleTestFlushListener(DBFlushTest* _test) : test_(_test) {}
2501
+ ~SimpleTestFlushListener() override {}
2502
+
2503
+ void OnFlushBegin(DB* db, const FlushJobInfo& info) override {
2504
+ ASSERT_EQ(static_cast<uint32_t>(0), info.cf_id);
2505
+
2506
+ ASSERT_OK(db->Delete(WriteOptions(), "foo"));
2507
+ snapshot_ = db->GetSnapshot();
2508
+ ASSERT_OK(db->Put(WriteOptions(), "foo", "value"));
2509
+
2510
+ auto* dbimpl = static_cast_with_check<DBImpl>(db);
2511
+ assert(dbimpl);
2512
+
2513
+ ColumnFamilyHandle* cfh = db->DefaultColumnFamily();
2514
+ auto* cfhi = static_cast_with_check<ColumnFamilyHandleImpl>(cfh);
2515
+ assert(cfhi);
2516
+ ASSERT_OK(dbimpl->TEST_SwitchMemtable(cfhi->cfd()));
2517
+ }
2518
+
2519
+ DBFlushTest* test_ = nullptr;
2520
+ const Snapshot* snapshot_ = nullptr;
2521
+ };
2522
+
2523
+ Options options = CurrentOptions();
2524
+ options.create_if_missing = true;
2525
+ auto* listener = new SimpleTestFlushListener(this);
2526
+ options.listeners.emplace_back(listener);
2527
+ DestroyAndReopen(options);
2528
+
2529
+ ASSERT_OK(db_->Put(WriteOptions(), "foo", "value0"));
2530
+
2531
+ ManagedSnapshot snapshot_guard(db_);
2532
+
2533
+ ColumnFamilyHandle* default_cf = db_->DefaultColumnFamily();
2534
+ ASSERT_OK(db_->Flush(FlushOptions(), default_cf));
2535
+
2536
+ const Snapshot* snapshot = listener->snapshot_;
2537
+ assert(snapshot);
2538
+
2539
+ ReadOptions read_opts;
2540
+ read_opts.snapshot = snapshot;
2541
+
2542
+ // Using snapshot should not see "foo".
2543
+ {
2544
+ std::string value;
2545
+ Status s = db_->Get(read_opts, "foo", &value);
2546
+ ASSERT_TRUE(s.IsNotFound());
2547
+ }
2548
+
2549
+ db_->ReleaseSnapshot(snapshot);
2550
+ }
2551
+
2552
+ TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
2553
+ Options options = CurrentOptions();
2554
+ options.create_if_missing = true;
2555
+ options.allow_2pc = true;
2556
+ options.atomic_flush = GetParam();
2557
+ // 64MB so that memtable flush won't be trigger by the small writes.
2558
+ options.write_buffer_size = (static_cast<size_t>(64) << 20);
2559
+ auto flush_listener = std::make_shared<FlushCounterListener>();
2560
+ flush_listener->expected_flush_reason = FlushReason::kManualFlush;
2561
+ options.listeners.push_back(flush_listener);
2562
+ // Destroy the DB to recreate as a TransactionDB.
2563
+ Close();
2564
+ Destroy(options, true);
2565
+
2566
+ // Create a TransactionDB.
2567
+ TransactionDB* txn_db = nullptr;
2568
+ TransactionDBOptions txn_db_opts;
2569
+ txn_db_opts.write_policy = TxnDBWritePolicy::WRITE_COMMITTED;
2570
+ ASSERT_OK(TransactionDB::Open(options, txn_db_opts, dbname_, &txn_db));
2571
+ ASSERT_NE(txn_db, nullptr);
2572
+ db_ = txn_db;
2573
+
2574
+ // Create two more columns other than default CF.
2575
+ std::vector<std::string> cfs = {"puppy", "kitty"};
2576
+ CreateColumnFamilies(cfs, options);
2577
+ ASSERT_EQ(handles_.size(), 2);
2578
+ ASSERT_EQ(handles_[0]->GetName(), cfs[0]);
2579
+ ASSERT_EQ(handles_[1]->GetName(), cfs[1]);
2580
+ const size_t kNumCfToFlush = options.atomic_flush ? 2 : 1;
2581
+
2582
+ WriteOptions wopts;
2583
+ TransactionOptions txn_opts;
2584
+ // txn1 only prepare, but does not commit.
2585
+ // The WAL containing the prepared but uncommitted data must be kept.
2586
+ Transaction* txn1 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
2587
+ // txn2 not only prepare, but also commit.
2588
+ Transaction* txn2 = txn_db->BeginTransaction(wopts, txn_opts, nullptr);
2589
+ ASSERT_NE(txn1, nullptr);
2590
+ ASSERT_NE(txn2, nullptr);
2591
+ for (size_t i = 0; i < kNumCfToFlush; i++) {
2592
+ ASSERT_OK(txn1->Put(handles_[i], "k1", "v1"));
2593
+ ASSERT_OK(txn2->Put(handles_[i], "k2", "v2"));
2594
+ }
2595
+ // A txn must be named before prepare.
2596
+ ASSERT_OK(txn1->SetName("txn1"));
2597
+ ASSERT_OK(txn2->SetName("txn2"));
2598
+ // Prepare writes to WAL, but not to memtable. (WriteCommitted)
2599
+ ASSERT_OK(txn1->Prepare());
2600
+ ASSERT_OK(txn2->Prepare());
2601
+ // Commit writes to memtable.
2602
+ ASSERT_OK(txn2->Commit());
2603
+ delete txn1;
2604
+ delete txn2;
2605
+
2606
+ // There are still data in memtable not flushed.
2607
+ // But since data is small enough to reside in the active memtable,
2608
+ // there are no immutable memtable.
2609
+ for (size_t i = 0; i < kNumCfToFlush; i++) {
2610
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2611
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2612
+ ASSERT_FALSE(cfh->cfd()->mem()->IsEmpty());
2613
+ }
2614
+
2615
+ // Atomic flush memtables,
2616
+ // the min log with prepared data should be written to MANIFEST.
2617
+ std::vector<ColumnFamilyHandle*> cfs_to_flush(kNumCfToFlush);
2618
+ for (size_t i = 0; i < kNumCfToFlush; i++) {
2619
+ cfs_to_flush[i] = handles_[i];
2620
+ }
2621
+ ASSERT_OK(txn_db->Flush(FlushOptions(), cfs_to_flush));
2622
+
2623
+ // There are no remaining data in memtable after flush.
2624
+ for (size_t i = 0; i < kNumCfToFlush; i++) {
2625
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2626
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2627
+ ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
2628
+ }
2629
+
2630
+ // The recovered min log number with prepared data should be non-zero.
2631
+ // In 2pc mode, MinLogNumberToKeep returns the
2632
+ // VersionSet::min_log_number_to_keep recovered from MANIFEST, if it's 0,
2633
+ // it means atomic flush didn't write the min_log_number_to_keep to MANIFEST.
2634
+ cfs.push_back(kDefaultColumnFamilyName);
2635
+ ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
2636
+ DBImpl* db_impl = reinterpret_cast<DBImpl*>(db_);
2637
+ ASSERT_TRUE(db_impl->allow_2pc());
2638
+ ASSERT_NE(db_impl->MinLogNumberToKeep(), 0);
2639
+ }
2640
+
2641
+ TEST_P(DBAtomicFlushTest, ManualAtomicFlush) {
2642
+ Options options = CurrentOptions();
2643
+ options.create_if_missing = true;
2644
+ options.atomic_flush = GetParam();
2645
+ options.write_buffer_size = (static_cast<size_t>(64) << 20);
2646
+ auto flush_listener = std::make_shared<FlushCounterListener>();
2647
+ flush_listener->expected_flush_reason = FlushReason::kManualFlush;
2648
+ options.listeners.push_back(flush_listener);
2649
+
2650
+ CreateAndReopenWithCF({"pikachu", "eevee"}, options);
2651
+ size_t num_cfs = handles_.size();
2652
+ ASSERT_EQ(3, num_cfs);
2653
+ WriteOptions wopts;
2654
+ wopts.disableWAL = true;
2655
+ for (size_t i = 0; i != num_cfs; ++i) {
2656
+ ASSERT_OK(Put(static_cast<int>(i) /*cf*/, "key", "value", wopts));
2657
+ }
2658
+
2659
+ for (size_t i = 0; i != num_cfs; ++i) {
2660
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2661
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2662
+ ASSERT_FALSE(cfh->cfd()->mem()->IsEmpty());
2663
+ }
2664
+
2665
+ std::vector<int> cf_ids;
2666
+ for (size_t i = 0; i != num_cfs; ++i) {
2667
+ cf_ids.emplace_back(static_cast<int>(i));
2668
+ }
2669
+ ASSERT_OK(Flush(cf_ids));
2670
+
2671
+ for (size_t i = 0; i != num_cfs; ++i) {
2672
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2673
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2674
+ ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
2675
+ }
2676
+ }
2677
+
2678
+ TEST_P(DBAtomicFlushTest, PrecomputeMinLogNumberToKeepNon2PC) {
2679
+ Options options = CurrentOptions();
2680
+ options.create_if_missing = true;
2681
+ options.atomic_flush = GetParam();
2682
+ options.write_buffer_size = (static_cast<size_t>(64) << 20);
2683
+ CreateAndReopenWithCF({"pikachu"}, options);
2684
+
2685
+ const size_t num_cfs = handles_.size();
2686
+ ASSERT_EQ(num_cfs, 2);
2687
+ WriteOptions wopts;
2688
+ for (size_t i = 0; i != num_cfs; ++i) {
2689
+ ASSERT_OK(Put(static_cast<int>(i) /*cf*/, "key", "value", wopts));
2690
+ }
2691
+
2692
+ {
2693
+ // Flush the default CF only.
2694
+ std::vector<int> cf_ids{0};
2695
+ ASSERT_OK(Flush(cf_ids));
2696
+
2697
+ autovector<ColumnFamilyData*> flushed_cfds;
2698
+ autovector<autovector<VersionEdit*>> flush_edits;
2699
+ auto flushed_cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[0]);
2700
+ flushed_cfds.push_back(flushed_cfh->cfd());
2701
+ flush_edits.push_back({});
2702
+ auto unflushed_cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[1]);
2703
+
2704
+ ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
2705
+ flushed_cfds, flush_edits),
2706
+ unflushed_cfh->cfd()->GetLogNumber());
2707
+ }
2708
+
2709
+ {
2710
+ // Flush all CFs.
2711
+ std::vector<int> cf_ids;
2712
+ for (size_t i = 0; i != num_cfs; ++i) {
2713
+ cf_ids.emplace_back(static_cast<int>(i));
2714
+ }
2715
+ ASSERT_OK(Flush(cf_ids));
2716
+ uint64_t log_num_after_flush = dbfull()->TEST_GetCurrentLogNumber();
2717
+
2718
+ uint64_t min_log_number_to_keep = std::numeric_limits<uint64_t>::max();
2719
+ autovector<ColumnFamilyData*> flushed_cfds;
2720
+ autovector<autovector<VersionEdit*>> flush_edits;
2721
+ for (size_t i = 0; i != num_cfs; ++i) {
2722
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2723
+ flushed_cfds.push_back(cfh->cfd());
2724
+ flush_edits.push_back({});
2725
+ min_log_number_to_keep =
2726
+ std::min(min_log_number_to_keep, cfh->cfd()->GetLogNumber());
2727
+ }
2728
+ ASSERT_EQ(min_log_number_to_keep, log_num_after_flush);
2729
+ ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
2730
+ flushed_cfds, flush_edits),
2731
+ min_log_number_to_keep);
2732
+ }
2733
+ }
2734
+
2735
+ TEST_P(DBAtomicFlushTest, AtomicFlushTriggeredByMemTableFull) {
2736
+ Options options = CurrentOptions();
2737
+ options.create_if_missing = true;
2738
+ options.atomic_flush = GetParam();
2739
+ // 4KB so that we can easily trigger auto flush.
2740
+ options.write_buffer_size = 4096;
2741
+
2742
+ SyncPoint::GetInstance()->LoadDependency(
2743
+ {{"DBImpl::BackgroundCallFlush:FlushFinish:0",
2744
+ "DBAtomicFlushTest::AtomicFlushTriggeredByMemTableFull:BeforeCheck"}});
2745
+ SyncPoint::GetInstance()->EnableProcessing();
2746
+
2747
+ CreateAndReopenWithCF({"pikachu", "eevee"}, options);
2748
+ size_t num_cfs = handles_.size();
2749
+ ASSERT_EQ(3, num_cfs);
2750
+ WriteOptions wopts;
2751
+ wopts.disableWAL = true;
2752
+ for (size_t i = 0; i != num_cfs; ++i) {
2753
+ ASSERT_OK(Put(static_cast<int>(i) /*cf*/, "key", "value", wopts));
2754
+ }
2755
+ // Keep writing to one of them column families to trigger auto flush.
2756
+ for (int i = 0; i != 4000; ++i) {
2757
+ ASSERT_OK(Put(static_cast<int>(num_cfs) - 1 /*cf*/,
2758
+ "key" + std::to_string(i), "value" + std::to_string(i),
2759
+ wopts));
2760
+ }
2761
+
2762
+ TEST_SYNC_POINT(
2763
+ "DBAtomicFlushTest::AtomicFlushTriggeredByMemTableFull:BeforeCheck");
2764
+ if (options.atomic_flush) {
2765
+ for (size_t i = 0; i + 1 != num_cfs; ++i) {
2766
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2767
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2768
+ ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
2769
+ }
2770
+ } else {
2771
+ for (size_t i = 0; i + 1 != num_cfs; ++i) {
2772
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2773
+ ASSERT_EQ(0, cfh->cfd()->imm()->NumNotFlushed());
2774
+ ASSERT_FALSE(cfh->cfd()->mem()->IsEmpty());
2775
+ }
2776
+ }
2777
+ SyncPoint::GetInstance()->DisableProcessing();
2778
+ }
2779
+
2780
+ TEST_P(DBAtomicFlushTest, AtomicFlushRollbackSomeJobs) {
2781
+ bool atomic_flush = GetParam();
2782
+ if (!atomic_flush) {
2783
+ return;
2784
+ }
2785
+ std::unique_ptr<FaultInjectionTestEnv> fault_injection_env(
2786
+ new FaultInjectionTestEnv(env_));
2787
+ Options options = CurrentOptions();
2788
+ options.create_if_missing = true;
2789
+ options.atomic_flush = atomic_flush;
2790
+ options.env = fault_injection_env.get();
2791
+ SyncPoint::GetInstance()->DisableProcessing();
2792
+ SyncPoint::GetInstance()->LoadDependency(
2793
+ {{"DBImpl::AtomicFlushMemTablesToOutputFiles:SomeFlushJobsComplete:1",
2794
+ "DBAtomicFlushTest::AtomicFlushRollbackSomeJobs:1"},
2795
+ {"DBAtomicFlushTest::AtomicFlushRollbackSomeJobs:2",
2796
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:SomeFlushJobsComplete:2"}});
2797
+ SyncPoint::GetInstance()->EnableProcessing();
2798
+
2799
+ CreateAndReopenWithCF({"pikachu", "eevee"}, options);
2800
+ size_t num_cfs = handles_.size();
2801
+ ASSERT_EQ(3, num_cfs);
2802
+ WriteOptions wopts;
2803
+ wopts.disableWAL = true;
2804
+ for (size_t i = 0; i != num_cfs; ++i) {
2805
+ int cf_id = static_cast<int>(i);
2806
+ ASSERT_OK(Put(cf_id, "key", "value", wopts));
2807
+ }
2808
+ FlushOptions flush_opts;
2809
+ flush_opts.wait = false;
2810
+ ASSERT_OK(dbfull()->Flush(flush_opts, handles_));
2811
+ TEST_SYNC_POINT("DBAtomicFlushTest::AtomicFlushRollbackSomeJobs:1");
2812
+ fault_injection_env->SetFilesystemActive(false);
2813
+ TEST_SYNC_POINT("DBAtomicFlushTest::AtomicFlushRollbackSomeJobs:2");
2814
+ for (auto* cfh : handles_) {
2815
+ // Returns the IO error happend during flush.
2816
+ ASSERT_NOK(dbfull()->TEST_WaitForFlushMemTable(cfh));
2817
+ }
2818
+ for (size_t i = 0; i != num_cfs; ++i) {
2819
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[i]);
2820
+ ASSERT_EQ(1, cfh->cfd()->imm()->NumNotFlushed());
2821
+ ASSERT_TRUE(cfh->cfd()->mem()->IsEmpty());
2822
+ }
2823
+ fault_injection_env->SetFilesystemActive(true);
2824
+ Destroy(options);
2825
+ }
2826
+
2827
+ TEST_P(DBAtomicFlushTest, FlushMultipleCFs_DropSomeBeforeRequestFlush) {
2828
+ bool atomic_flush = GetParam();
2829
+ if (!atomic_flush) {
2830
+ return;
2831
+ }
2832
+ Options options = CurrentOptions();
2833
+ options.create_if_missing = true;
2834
+ options.atomic_flush = atomic_flush;
2835
+ SyncPoint::GetInstance()->DisableProcessing();
2836
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2837
+ SyncPoint::GetInstance()->EnableProcessing();
2838
+
2839
+ CreateAndReopenWithCF({"pikachu", "eevee"}, options);
2840
+ size_t num_cfs = handles_.size();
2841
+ ASSERT_EQ(3, num_cfs);
2842
+ WriteOptions wopts;
2843
+ wopts.disableWAL = true;
2844
+ std::vector<int> cf_ids;
2845
+ for (size_t i = 0; i != num_cfs; ++i) {
2846
+ int cf_id = static_cast<int>(i);
2847
+ ASSERT_OK(Put(cf_id, "key", "value", wopts));
2848
+ cf_ids.push_back(cf_id);
2849
+ }
2850
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
2851
+ ASSERT_TRUE(Flush(cf_ids).IsColumnFamilyDropped());
2852
+ Destroy(options);
2853
+ }
2854
+
2855
+ TEST_P(DBAtomicFlushTest,
2856
+ FlushMultipleCFs_DropSomeAfterScheduleFlushBeforeFlushJobRun) {
2857
+ bool atomic_flush = GetParam();
2858
+ if (!atomic_flush) {
2859
+ return;
2860
+ }
2861
+ Options options = CurrentOptions();
2862
+ options.create_if_missing = true;
2863
+ options.atomic_flush = atomic_flush;
2864
+
2865
+ CreateAndReopenWithCF({"pikachu", "eevee"}, options);
2866
+
2867
+ SyncPoint::GetInstance()->DisableProcessing();
2868
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2869
+ SyncPoint::GetInstance()->LoadDependency(
2870
+ {{"DBImpl::AtomicFlushMemTables:AfterScheduleFlush",
2871
+ "DBAtomicFlushTest::BeforeDropCF"},
2872
+ {"DBAtomicFlushTest::AfterDropCF",
2873
+ "DBImpl::BackgroundCallFlush:start"}});
2874
+ SyncPoint::GetInstance()->EnableProcessing();
2875
+
2876
+ size_t num_cfs = handles_.size();
2877
+ ASSERT_EQ(3, num_cfs);
2878
+ WriteOptions wopts;
2879
+ wopts.disableWAL = true;
2880
+ for (size_t i = 0; i != num_cfs; ++i) {
2881
+ int cf_id = static_cast<int>(i);
2882
+ ASSERT_OK(Put(cf_id, "key", "value", wopts));
2883
+ }
2884
+ port::Thread user_thread([&]() {
2885
+ TEST_SYNC_POINT("DBAtomicFlushTest::BeforeDropCF");
2886
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
2887
+ TEST_SYNC_POINT("DBAtomicFlushTest::AfterDropCF");
2888
+ });
2889
+ FlushOptions flush_opts;
2890
+ flush_opts.wait = true;
2891
+ ASSERT_OK(dbfull()->Flush(flush_opts, handles_));
2892
+ user_thread.join();
2893
+ for (size_t i = 0; i != num_cfs; ++i) {
2894
+ int cf_id = static_cast<int>(i);
2895
+ ASSERT_EQ("value", Get(cf_id, "key"));
2896
+ }
2897
+
2898
+ ReopenWithColumnFamilies({kDefaultColumnFamilyName, "eevee"}, options);
2899
+ num_cfs = handles_.size();
2900
+ ASSERT_EQ(2, num_cfs);
2901
+ for (size_t i = 0; i != num_cfs; ++i) {
2902
+ int cf_id = static_cast<int>(i);
2903
+ ASSERT_EQ("value", Get(cf_id, "key"));
2904
+ }
2905
+ Destroy(options);
2906
+ }
2907
+
2908
+ TEST_P(DBAtomicFlushTest, TriggerFlushAndClose) {
2909
+ bool atomic_flush = GetParam();
2910
+ if (!atomic_flush) {
2911
+ return;
2912
+ }
2913
+ const int kNumKeysTriggerFlush = 4;
2914
+ Options options = CurrentOptions();
2915
+ options.create_if_missing = true;
2916
+ options.atomic_flush = atomic_flush;
2917
+ options.memtable_factory.reset(
2918
+ test::NewSpecialSkipListFactory(kNumKeysTriggerFlush));
2919
+ CreateAndReopenWithCF({"pikachu"}, options);
2920
+
2921
+ for (int i = 0; i != kNumKeysTriggerFlush; ++i) {
2922
+ ASSERT_OK(Put(0, "key" + std::to_string(i), "value" + std::to_string(i)));
2923
+ }
2924
+ SyncPoint::GetInstance()->DisableProcessing();
2925
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2926
+ SyncPoint::GetInstance()->EnableProcessing();
2927
+ ASSERT_OK(Put(0, "key", "value"));
2928
+ Close();
2929
+
2930
+ ReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"}, options);
2931
+ ASSERT_EQ("value", Get(0, "key"));
2932
+ }
2933
+
2934
+ TEST_P(DBAtomicFlushTest, PickMemtablesRaceWithBackgroundFlush) {
2935
+ bool atomic_flush = GetParam();
2936
+ Options options = CurrentOptions();
2937
+ options.create_if_missing = true;
2938
+ options.atomic_flush = atomic_flush;
2939
+ options.max_write_buffer_number = 4;
2940
+ // Set min_write_buffer_number_to_merge to be greater than 1, so that
2941
+ // a column family with one memtable in the imm will not cause IsFlushPending
2942
+ // to return true when flush_requested_ is false.
2943
+ options.min_write_buffer_number_to_merge = 2;
2944
+ CreateAndReopenWithCF({"pikachu"}, options);
2945
+ ASSERT_EQ(2, handles_.size());
2946
+ ASSERT_OK(dbfull()->PauseBackgroundWork());
2947
+ ASSERT_OK(Put(0, "key00", "value00"));
2948
+ ASSERT_OK(Put(1, "key10", "value10"));
2949
+ FlushOptions flush_opts;
2950
+ flush_opts.wait = false;
2951
+ ASSERT_OK(dbfull()->Flush(flush_opts, handles_));
2952
+ ASSERT_OK(Put(0, "key01", "value01"));
2953
+ // Since max_write_buffer_number is 4, the following flush won't cause write
2954
+ // stall.
2955
+ ASSERT_OK(dbfull()->Flush(flush_opts));
2956
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
2957
+ ASSERT_OK(dbfull()->DestroyColumnFamilyHandle(handles_[1]));
2958
+ handles_[1] = nullptr;
2959
+ ASSERT_OK(dbfull()->ContinueBackgroundWork());
2960
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable(handles_[0]));
2961
+ delete handles_[0];
2962
+ handles_.clear();
2963
+ }
2964
+
2965
+ TEST_P(DBAtomicFlushTest, CFDropRaceWithWaitForFlushMemTables) {
2966
+ bool atomic_flush = GetParam();
2967
+ if (!atomic_flush) {
2968
+ return;
2969
+ }
2970
+ Options options = CurrentOptions();
2971
+ options.create_if_missing = true;
2972
+ options.atomic_flush = atomic_flush;
2973
+ CreateAndReopenWithCF({"pikachu"}, options);
2974
+ SyncPoint::GetInstance()->DisableProcessing();
2975
+ SyncPoint::GetInstance()->LoadDependency(
2976
+ {{"DBImpl::AtomicFlushMemTables:AfterScheduleFlush",
2977
+ "DBAtomicFlushTest::CFDropRaceWithWaitForFlushMemTables:BeforeDrop"},
2978
+ {"DBAtomicFlushTest::CFDropRaceWithWaitForFlushMemTables:AfterFree",
2979
+ "DBImpl::BackgroundCallFlush:start"},
2980
+ {"DBImpl::BackgroundCallFlush:start",
2981
+ "DBImpl::AtomicFlushMemTables:BeforeWaitForBgFlush"}});
2982
+ SyncPoint::GetInstance()->EnableProcessing();
2983
+ ASSERT_EQ(2, handles_.size());
2984
+ ASSERT_OK(Put(0, "key", "value"));
2985
+ ASSERT_OK(Put(1, "key", "value"));
2986
+ auto* cfd_default =
2987
+ static_cast<ColumnFamilyHandleImpl*>(dbfull()->DefaultColumnFamily())
2988
+ ->cfd();
2989
+ auto* cfd_pikachu = static_cast<ColumnFamilyHandleImpl*>(handles_[1])->cfd();
2990
+ port::Thread drop_cf_thr([&]() {
2991
+ TEST_SYNC_POINT(
2992
+ "DBAtomicFlushTest::CFDropRaceWithWaitForFlushMemTables:BeforeDrop");
2993
+ ASSERT_OK(dbfull()->DropColumnFamily(handles_[1]));
2994
+ delete handles_[1];
2995
+ handles_.resize(1);
2996
+ TEST_SYNC_POINT(
2997
+ "DBAtomicFlushTest::CFDropRaceWithWaitForFlushMemTables:AfterFree");
2998
+ });
2999
+ FlushOptions flush_opts;
3000
+ flush_opts.allow_write_stall = true;
3001
+ ASSERT_OK(dbfull()->TEST_AtomicFlushMemTables({cfd_default, cfd_pikachu},
3002
+ flush_opts));
3003
+ drop_cf_thr.join();
3004
+ Close();
3005
+ SyncPoint::GetInstance()->DisableProcessing();
3006
+ }
3007
+
3008
+ TEST_P(DBAtomicFlushTest, RollbackAfterFailToInstallResults) {
3009
+ bool atomic_flush = GetParam();
3010
+ if (!atomic_flush) {
3011
+ return;
3012
+ }
3013
+ auto fault_injection_env = std::make_shared<FaultInjectionTestEnv>(env_);
3014
+ Options options = CurrentOptions();
3015
+ options.env = fault_injection_env.get();
3016
+ options.create_if_missing = true;
3017
+ options.atomic_flush = atomic_flush;
3018
+ CreateAndReopenWithCF({"pikachu"}, options);
3019
+ ASSERT_EQ(2, handles_.size());
3020
+ for (size_t cf = 0; cf < handles_.size(); ++cf) {
3021
+ ASSERT_OK(Put(static_cast<int>(cf), "a", "value"));
3022
+ }
3023
+ SyncPoint::GetInstance()->DisableProcessing();
3024
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3025
+ SyncPoint::GetInstance()->SetCallBack(
3026
+ "VersionSet::ProcessManifestWrites:BeforeWriteLastVersionEdit:0",
3027
+ [&](void* /*arg*/) { fault_injection_env->SetFilesystemActive(false); });
3028
+ SyncPoint::GetInstance()->EnableProcessing();
3029
+ FlushOptions flush_opts;
3030
+ Status s = db_->Flush(flush_opts, handles_);
3031
+ ASSERT_NOK(s);
3032
+ fault_injection_env->SetFilesystemActive(true);
3033
+ Close();
3034
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3035
+ }
3036
+
3037
+ // In atomic flush, concurrent bg flush threads commit to the MANIFEST in
3038
+ // serial, in the order of their picked memtables for each column family.
3039
+ // Only when a bg flush thread finds out that its memtables are the earliest
3040
+ // unflushed ones for all the included column families will this bg flush
3041
+ // thread continue to commit to MANIFEST.
3042
+ // This unit test uses sync point to coordinate the execution of two bg threads
3043
+ // executing the same sequence of functions. The interleaving are as follows.
3044
+ // time bg1 bg2
3045
+ // | pick memtables to flush
3046
+ // | flush memtables cf1_m1, cf2_m1
3047
+ // | join MANIFEST write queue
3048
+ // | pick memtabls to flush
3049
+ // | flush memtables cf1_(m1+1)
3050
+ // | join MANIFEST write queue
3051
+ // | wait to write MANIFEST
3052
+ // | write MANIFEST
3053
+ // | IO error
3054
+ // | detect IO error and stop waiting
3055
+ // V
3056
+ TEST_P(DBAtomicFlushTest, BgThreadNoWaitAfterManifestError) {
3057
+ bool atomic_flush = GetParam();
3058
+ if (!atomic_flush) {
3059
+ return;
3060
+ }
3061
+ auto fault_injection_env = std::make_shared<FaultInjectionTestEnv>(env_);
3062
+ Options options = GetDefaultOptions();
3063
+ options.create_if_missing = true;
3064
+ options.atomic_flush = true;
3065
+ options.env = fault_injection_env.get();
3066
+ // Set a larger value than default so that RocksDB can schedule concurrent
3067
+ // background flush threads.
3068
+ options.max_background_jobs = 8;
3069
+ options.max_write_buffer_number = 8;
3070
+ CreateAndReopenWithCF({"pikachu"}, options);
3071
+
3072
+ assert(2 == handles_.size());
3073
+
3074
+ WriteOptions write_opts;
3075
+ write_opts.disableWAL = true;
3076
+
3077
+ ASSERT_OK(Put(0, "a", "v_0_a", write_opts));
3078
+ ASSERT_OK(Put(1, "a", "v_1_a", write_opts));
3079
+
3080
+ SyncPoint::GetInstance()->DisableProcessing();
3081
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3082
+
3083
+ SyncPoint::GetInstance()->LoadDependency({
3084
+ {"BgFlushThr2:WaitToCommit", "BgFlushThr1:BeforeWriteManifest"},
3085
+ });
3086
+
3087
+ std::thread::id bg_flush_thr1, bg_flush_thr2;
3088
+ SyncPoint::GetInstance()->SetCallBack(
3089
+ "DBImpl::BackgroundCallFlush:start", [&](void*) {
3090
+ if (bg_flush_thr1 == std::thread::id()) {
3091
+ bg_flush_thr1 = std::this_thread::get_id();
3092
+ } else if (bg_flush_thr2 == std::thread::id()) {
3093
+ bg_flush_thr2 = std::this_thread::get_id();
3094
+ }
3095
+ });
3096
+
3097
+ int called = 0;
3098
+ SyncPoint::GetInstance()->SetCallBack(
3099
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:WaitToCommit", [&](void* arg) {
3100
+ if (std::this_thread::get_id() == bg_flush_thr2) {
3101
+ const auto* ptr = reinterpret_cast<std::pair<Status, bool>*>(arg);
3102
+ assert(ptr);
3103
+ if (0 == called) {
3104
+ // When bg flush thread 2 reaches here for the first time.
3105
+ ASSERT_OK(ptr->first);
3106
+ ASSERT_TRUE(ptr->second);
3107
+ } else if (1 == called) {
3108
+ // When bg flush thread 2 reaches here for the second time.
3109
+ ASSERT_TRUE(ptr->first.IsIOError());
3110
+ ASSERT_FALSE(ptr->second);
3111
+ }
3112
+ ++called;
3113
+ TEST_SYNC_POINT("BgFlushThr2:WaitToCommit");
3114
+ }
3115
+ });
3116
+
3117
+ SyncPoint::GetInstance()->SetCallBack(
3118
+ "VersionSet::ProcessManifestWrites:BeforeWriteLastVersionEdit:0",
3119
+ [&](void*) {
3120
+ if (std::this_thread::get_id() == bg_flush_thr1) {
3121
+ TEST_SYNC_POINT("BgFlushThr1:BeforeWriteManifest");
3122
+ }
3123
+ });
3124
+
3125
+ SyncPoint::GetInstance()->SetCallBack(
3126
+ "VersionSet::LogAndApply:WriteManifest", [&](void*) {
3127
+ if (std::this_thread::get_id() != bg_flush_thr1) {
3128
+ return;
3129
+ }
3130
+ ASSERT_OK(db_->Put(write_opts, "b", "v_1_b"));
3131
+
3132
+ FlushOptions flush_opts;
3133
+ flush_opts.wait = false;
3134
+ std::vector<ColumnFamilyHandle*> cfhs(1, db_->DefaultColumnFamily());
3135
+ ASSERT_OK(dbfull()->Flush(flush_opts, cfhs));
3136
+ });
3137
+
3138
+ SyncPoint::GetInstance()->SetCallBack(
3139
+ "VersionSet::ProcessManifestWrites:AfterSyncManifest", [&](void* arg) {
3140
+ auto* ptr = reinterpret_cast<IOStatus*>(arg);
3141
+ assert(ptr);
3142
+ *ptr = IOStatus::IOError("Injected failure");
3143
+ });
3144
+ SyncPoint::GetInstance()->EnableProcessing();
3145
+
3146
+ ASSERT_TRUE(dbfull()->Flush(FlushOptions(), handles_).IsIOError());
3147
+
3148
+ Close();
3149
+ SyncPoint::GetInstance()->DisableProcessing();
3150
+ SyncPoint::GetInstance()->ClearAllCallBacks();
3151
+ }
3152
+
3153
+ TEST_P(DBAtomicFlushTest, NoWaitWhenWritesStopped) {
3154
+ Options options = GetDefaultOptions();
3155
+ options.create_if_missing = true;
3156
+ options.atomic_flush = GetParam();
3157
+ options.max_write_buffer_number = 2;
3158
+ options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
3159
+
3160
+ Reopen(options);
3161
+
3162
+ SyncPoint::GetInstance()->DisableProcessing();
3163
+ SyncPoint::GetInstance()->LoadDependency(
3164
+ {{"DBImpl::DelayWrite:Start",
3165
+ "DBAtomicFlushTest::NoWaitWhenWritesStopped:0"}});
3166
+ SyncPoint::GetInstance()->EnableProcessing();
3167
+
3168
+ ASSERT_OK(dbfull()->PauseBackgroundWork());
3169
+ for (int i = 0; i < options.max_write_buffer_number; ++i) {
3170
+ ASSERT_OK(Put("k" + std::to_string(i), "v" + std::to_string(i)));
3171
+ }
3172
+ std::thread stalled_writer([&]() { ASSERT_OK(Put("k", "v")); });
3173
+
3174
+ TEST_SYNC_POINT("DBAtomicFlushTest::NoWaitWhenWritesStopped:0");
3175
+
3176
+ {
3177
+ FlushOptions flush_opts;
3178
+ flush_opts.wait = false;
3179
+ flush_opts.allow_write_stall = true;
3180
+ ASSERT_TRUE(db_->Flush(flush_opts).IsTryAgain());
3181
+ }
3182
+
3183
+ ASSERT_OK(dbfull()->ContinueBackgroundWork());
3184
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
3185
+
3186
+ stalled_writer.join();
3187
+
3188
+ SyncPoint::GetInstance()->DisableProcessing();
3189
+ }
3190
+
3191
+ INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
3192
+ testing::Bool());
3193
+
3194
+ INSTANTIATE_TEST_CASE_P(DBAtomicFlushTest, DBAtomicFlushTest, testing::Bool());
3195
+
3196
+ } // namespace ROCKSDB_NAMESPACE
3197
+
3198
+ int main(int argc, char** argv) {
3199
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3200
+ ::testing::InitGoogleTest(&argc, argv);
3201
+ return RUN_ALL_TESTS();
3202
+ }