@nxtedition/rocksdb 5.2.21 → 5.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (909) hide show
  1. package/binding.cc +216 -252
  2. package/binding.gyp +78 -72
  3. package/deps/rocksdb/build_version.cc +70 -4
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  5. package/deps/rocksdb/rocksdb/Makefile +459 -469
  6. package/deps/rocksdb/rocksdb/README.md +4 -4
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  33. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  51. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  60. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  61. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  62. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  63. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  64. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  65. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  67. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  68. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  69. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  71. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  96. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  97. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  98. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  100. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  101. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  102. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  103. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  104. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  105. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  106. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  107. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  108. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  110. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  111. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  112. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  124. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  125. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  126. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  127. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  128. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  129. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  131. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  132. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  133. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  134. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  135. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  136. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  137. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  139. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  140. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  141. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  142. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  143. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  144. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  145. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  146. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  147. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  148. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  149. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  150. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  151. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  152. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  153. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  154. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  155. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  156. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  157. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  158. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  159. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  160. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  161. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  162. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  163. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  164. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  165. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  166. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  167. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  168. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  169. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  171. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  172. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  174. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  175. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  176. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  180. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  182. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  183. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  184. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  185. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  186. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  187. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  188. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  189. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  190. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  191. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  192. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  193. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  194. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  195. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  196. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  197. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  198. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  199. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  200. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  201. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  202. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  203. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  204. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  205. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  206. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  207. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  210. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  212. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  213. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  216. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  217. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  218. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  219. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  220. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  223. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  224. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  226. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  227. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  228. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  229. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  230. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  231. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  233. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  234. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  235. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  236. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  246. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  248. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  249. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  250. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  251. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  252. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  253. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  254. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  255. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  256. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  257. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  258. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  259. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  260. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  261. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  262. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  263. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  266. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  267. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  274. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  280. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  285. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  286. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  287. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  288. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  289. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  290. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  291. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  292. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  293. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  294. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  295. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  296. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  298. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  299. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  300. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  301. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  302. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  303. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  304. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  305. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  306. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  307. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  308. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  309. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  310. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  313. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  315. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  316. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  317. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  318. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  319. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  320. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  321. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  324. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  325. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  326. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  327. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  334. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  335. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  336. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  342. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  343. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  344. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  345. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  346. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  348. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  349. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  350. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  353. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  354. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  357. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  358. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  359. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  360. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  361. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  362. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  364. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  365. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  366. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  367. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  368. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  371. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  378. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  380. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  381. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  383. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  386. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  387. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  407. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  408. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  410. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  412. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  413. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  414. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  415. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  416. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  417. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  418. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  419. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  420. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  421. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  422. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  423. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  424. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  425. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  426. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  427. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  428. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  429. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  430. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  431. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  432. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  433. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  434. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  435. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  436. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  437. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  438. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  439. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  440. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  441. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  442. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  443. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  444. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  445. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  446. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  447. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  448. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  449. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  450. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  451. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  452. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  453. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  454. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  455. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  456. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  457. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  458. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  459. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  460. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  461. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  462. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  463. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  464. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  465. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  466. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  467. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  468. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  469. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  470. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  471. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  472. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  473. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  474. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  475. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  476. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  477. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  478. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  479. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  480. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  481. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  482. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  483. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  484. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  485. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  486. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  487. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  488. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  489. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  490. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  491. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  492. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  493. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  494. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  495. package/deps/rocksdb/rocksdb/python.mk +9 -0
  496. package/deps/rocksdb/rocksdb/src.mk +82 -34
  497. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  498. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  500. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  501. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  502. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  503. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  504. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  505. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  506. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  507. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  508. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  514. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  515. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  516. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  517. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  518. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  519. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  520. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  521. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  522. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  523. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  524. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  525. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  526. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  527. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  529. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  530. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  531. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  532. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  534. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  535. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  536. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  537. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  539. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  540. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  541. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  542. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  543. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  544. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  546. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  547. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  548. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  549. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  550. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  551. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  552. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  553. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  554. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  555. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  556. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  557. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  558. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  559. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  560. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  561. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  562. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  563. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  564. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  565. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  566. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  567. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  568. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  569. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  570. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  571. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  572. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  573. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  574. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  575. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  576. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  577. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  578. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  579. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  580. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  581. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  582. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  586. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  587. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  588. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  589. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  590. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  591. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  592. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  593. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  594. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  595. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  596. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  597. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  598. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  599. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  600. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  601. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  602. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  603. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  604. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  605. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  606. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  607. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  608. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  609. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  610. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  611. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  612. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  613. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  614. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  615. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  616. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  617. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  618. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  619. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  620. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  621. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  622. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  623. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  624. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  625. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  626. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  627. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  628. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  629. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  630. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  631. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  632. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  633. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  634. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  635. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  636. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  637. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  638. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  639. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  640. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  641. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  642. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  643. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  644. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  645. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  646. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  647. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  648. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  649. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  650. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  651. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  652. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  653. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  654. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  655. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  656. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  657. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  658. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  659. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  660. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  661. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  662. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  663. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  664. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  665. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  666. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  667. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  668. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  669. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  670. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  671. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  672. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  673. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  674. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  675. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  676. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  677. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  678. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  679. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  680. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  681. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  682. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  683. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  684. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  685. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  686. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  687. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  688. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  689. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  690. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  691. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  692. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  693. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  694. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  695. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  696. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  697. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  698. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  699. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  700. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  701. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  702. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  703. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  704. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  705. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  706. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  707. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  708. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  709. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  710. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  711. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  712. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  713. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  714. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  715. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  716. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  717. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  718. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  719. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  720. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  721. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  722. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  723. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  724. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  725. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  726. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  727. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  728. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  729. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  730. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  731. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  732. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  733. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  734. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  741. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  742. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  743. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  744. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  745. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  746. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  747. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  748. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  749. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  750. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  751. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  752. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  753. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  754. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  755. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  756. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  757. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  758. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  759. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  760. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  761. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  762. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  763. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  764. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  765. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  766. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  767. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  768. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  769. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  770. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  771. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  772. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  773. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  774. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  775. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  776. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  777. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  778. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  779. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  780. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  786. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  787. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  788. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  789. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  790. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  791. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  792. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  793. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  794. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  795. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  796. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  797. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  798. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  799. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  802. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  803. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  804. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  805. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  806. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  807. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  808. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  809. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  810. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  811. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  812. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  813. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  814. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  815. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  816. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  817. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  818. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  821. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  822. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  823. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  824. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  825. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  826. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  827. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  828. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  829. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  830. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  831. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  832. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  833. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  834. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  835. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  836. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  837. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  838. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  839. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  840. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  841. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  842. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  843. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  844. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  845. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  846. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  847. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  848. package/deps/rocksdb/rocksdb.gyp +425 -446
  849. package/package.json +8 -8
  850. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  851. package/prebuilds/darwin-x86/node.napi.node +0 -0
  852. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  853. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  854. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  855. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  856. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  857. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  858. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  859. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  860. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  861. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  862. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  863. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  864. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  865. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  866. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  867. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  868. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  869. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  870. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  871. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  872. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  873. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  874. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  904. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  905. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  906. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  907. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  908. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  909. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -8,23 +8,31 @@
8
8
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
9
 
10
10
  #include <atomic>
11
+ #include <limits>
11
12
 
12
13
  #include "db/db_impl/db_impl.h"
13
14
  #include "db/db_test_util.h"
15
+ #include "env/mock_env.h"
14
16
  #include "file/filename.h"
15
17
  #include "port/port.h"
16
18
  #include "port/stack_trace.h"
17
19
  #include "rocksdb/utilities/transaction_db.h"
18
20
  #include "test_util/sync_point.h"
21
+ #include "test_util/testutil.h"
19
22
  #include "util/cast_util.h"
20
23
  #include "util/mutexlock.h"
21
24
  #include "utilities/fault_injection_env.h"
25
+ #include "utilities/fault_injection_fs.h"
22
26
 
23
27
  namespace ROCKSDB_NAMESPACE {
24
28
 
29
+ // This is a static filter used for filtering
30
+ // kvs during the compaction process.
31
+ static std::string NEW_VALUE = "NewValue";
32
+
25
33
  class DBFlushTest : public DBTestBase {
26
34
  public:
27
- DBFlushTest() : DBTestBase("/db_flush_test", /*env_do_fsync=*/true) {}
35
+ DBFlushTest() : DBTestBase("db_flush_test", /*env_do_fsync=*/true) {}
28
36
  };
29
37
 
30
38
  class DBFlushDirectIOTest : public DBFlushTest,
@@ -80,29 +88,16 @@ TEST_F(DBFlushTest, SyncFail) {
80
88
  options.env = fault_injection_env.get();
81
89
 
82
90
  SyncPoint::GetInstance()->LoadDependency(
83
- {{"DBFlushTest::SyncFail:GetVersionRefCount:1",
84
- "DBImpl::FlushMemTableToOutputFile:BeforePickMemtables"},
85
- {"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables",
86
- "DBFlushTest::SyncFail:GetVersionRefCount:2"},
87
- {"DBFlushTest::SyncFail:1", "DBImpl::SyncClosedLogs:Start"},
91
+ {{"DBFlushTest::SyncFail:1", "DBImpl::SyncClosedLogs:Start"},
88
92
  {"DBImpl::SyncClosedLogs:Failed", "DBFlushTest::SyncFail:2"}});
89
93
  SyncPoint::GetInstance()->EnableProcessing();
90
94
 
91
95
  CreateAndReopenWithCF({"pikachu"}, options);
92
96
  ASSERT_OK(Put("key", "value"));
93
- auto* cfd =
94
- static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
95
- ->cfd();
96
97
  FlushOptions flush_options;
97
98
  flush_options.wait = false;
98
99
  ASSERT_OK(dbfull()->Flush(flush_options));
99
100
  // Flush installs a new super-version. Get the ref count after that.
100
- auto current_before = cfd->current();
101
- int refs_before = cfd->current()->TEST_refs();
102
- TEST_SYNC_POINT("DBFlushTest::SyncFail:GetVersionRefCount:1");
103
- TEST_SYNC_POINT("DBFlushTest::SyncFail:GetVersionRefCount:2");
104
- int refs_after_picking_memtables = cfd->current()->TEST_refs();
105
- ASSERT_EQ(refs_before + 1, refs_after_picking_memtables);
106
101
  fault_injection_env->SetFilesystemActive(false);
107
102
  TEST_SYNC_POINT("DBFlushTest::SyncFail:1");
108
103
  TEST_SYNC_POINT("DBFlushTest::SyncFail:2");
@@ -113,9 +108,6 @@ TEST_F(DBFlushTest, SyncFail) {
113
108
  #ifndef ROCKSDB_LITE
114
109
  ASSERT_EQ("", FilesPerLevel()); // flush failed.
115
110
  #endif // ROCKSDB_LITE
116
- // Backgroun flush job should release ref count to current version.
117
- ASSERT_EQ(current_before, cfd->current());
118
- ASSERT_EQ(refs_before, cfd->current()->TEST_refs());
119
111
  Destroy(options);
120
112
  }
121
113
 
@@ -148,7 +140,7 @@ TEST_F(DBFlushTest, FlushInLowPriThreadPool) {
148
140
  // scheduled in the low-pri (compaction) thread pool.
149
141
  Options options = CurrentOptions();
150
142
  options.level0_file_num_compaction_trigger = 4;
151
- options.memtable_factory.reset(new SpecialSkipListFactory(1));
143
+ options.memtable_factory.reset(test::NewSpecialSkipListFactory(1));
152
144
  Reopen(options);
153
145
  env_->SetBackgroundThreads(0, Env::HIGH);
154
146
 
@@ -180,6 +172,66 @@ TEST_F(DBFlushTest, FlushInLowPriThreadPool) {
180
172
  ASSERT_EQ(1, num_compactions);
181
173
  }
182
174
 
175
+ // Test when flush job is submitted to low priority thread pool and when DB is
176
+ // closed in the meanwhile, CloseHelper doesn't hang.
177
+ TEST_F(DBFlushTest, CloseDBWhenFlushInLowPri) {
178
+ Options options = CurrentOptions();
179
+ options.max_background_flushes = 1;
180
+ options.max_total_wal_size = 8192;
181
+
182
+ DestroyAndReopen(options);
183
+ CreateColumnFamilies({"cf1", "cf2"}, options);
184
+
185
+ env_->SetBackgroundThreads(0, Env::HIGH);
186
+ env_->SetBackgroundThreads(1, Env::LOW);
187
+ test::SleepingBackgroundTask sleeping_task_low;
188
+ int num_flushes = 0;
189
+
190
+ SyncPoint::GetInstance()->SetCallBack("DBImpl::BGWorkFlush",
191
+ [&](void* /*arg*/) { ++num_flushes; });
192
+
193
+ int num_low_flush_unscheduled = 0;
194
+ SyncPoint::GetInstance()->SetCallBack(
195
+ "DBImpl::UnscheduleLowFlushCallback", [&](void* /*arg*/) {
196
+ num_low_flush_unscheduled++;
197
+ // There should be one flush job in low pool that needs to be
198
+ // unscheduled
199
+ ASSERT_EQ(num_low_flush_unscheduled, 1);
200
+ });
201
+
202
+ int num_high_flush_unscheduled = 0;
203
+ SyncPoint::GetInstance()->SetCallBack(
204
+ "DBImpl::UnscheduleHighFlushCallback", [&](void* /*arg*/) {
205
+ num_high_flush_unscheduled++;
206
+ // There should be no flush job in high pool
207
+ ASSERT_EQ(num_high_flush_unscheduled, 0);
208
+ });
209
+
210
+ SyncPoint::GetInstance()->EnableProcessing();
211
+
212
+ ASSERT_OK(Put(0, "key1", DummyString(8192)));
213
+ // Block thread so that flush cannot be run and can be removed from the queue
214
+ // when called Unschedule.
215
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
216
+ Env::Priority::LOW);
217
+ sleeping_task_low.WaitUntilSleeping();
218
+
219
+ // Trigger flush and flush job will be scheduled to LOW priority thread.
220
+ ASSERT_OK(Put(0, "key2", DummyString(8192)));
221
+
222
+ // Close DB and flush job in low priority queue will be removed without
223
+ // running.
224
+ Close();
225
+ sleeping_task_low.WakeUp();
226
+ sleeping_task_low.WaitUntilDone();
227
+ ASSERT_EQ(0, num_flushes);
228
+
229
+ TryReopenWithColumnFamilies({"default", "cf1", "cf2"}, options);
230
+ ASSERT_OK(Put(0, "key3", DummyString(8192)));
231
+ ASSERT_OK(Flush(0));
232
+ ASSERT_EQ(1, num_flushes);
233
+ }
234
+
183
235
  TEST_F(DBFlushTest, ManualFlushWithMinWriteBufferNumberToMerge) {
184
236
  Options options = CurrentOptions();
185
237
  options.write_buffer_size = 100;
@@ -239,13 +291,1230 @@ TEST_F(DBFlushTest, ScheduleOnlyOneBgThread) {
239
291
  SyncPoint::GetInstance()->ClearAllCallBacks();
240
292
  }
241
293
 
294
+ // The following 3 tests are designed for testing garbage statistics at flush
295
+ // time.
296
+ //
297
+ // ======= General Information ======= (from GitHub Wiki).
298
+ // There are three scenarios where memtable flush can be triggered:
299
+ //
300
+ // 1 - Memtable size exceeds ColumnFamilyOptions::write_buffer_size
301
+ // after a write.
302
+ // 2 - Total memtable size across all column families exceeds
303
+ // DBOptions::db_write_buffer_size,
304
+ // or DBOptions::write_buffer_manager signals a flush. In this scenario
305
+ // the largest memtable will be flushed.
306
+ // 3 - Total WAL file size exceeds DBOptions::max_total_wal_size.
307
+ // In this scenario the memtable with the oldest data will be flushed,
308
+ // in order to allow the WAL file with data from this memtable to be
309
+ // purged.
310
+ //
311
+ // As a result, a memtable can be flushed before it is full. This is one
312
+ // reason the generated SST file can be smaller than the corresponding
313
+ // memtable. Compression is another factor to make SST file smaller than
314
+ // corresponding memtable, since data in memtable is uncompressed.
315
+
316
+ TEST_F(DBFlushTest, StatisticsGarbageBasic) {
317
+ Options options = CurrentOptions();
318
+
319
+ // The following options are used to enforce several values that
320
+ // may already exist as default values to make this test resilient
321
+ // to default value updates in the future.
322
+ options.statistics = CreateDBStatistics();
323
+
324
+ // Record all statistics.
325
+ options.statistics->set_stats_level(StatsLevel::kAll);
326
+
327
+ // create the DB if it's not already present
328
+ options.create_if_missing = true;
329
+
330
+ // Useful for now as we are trying to compare uncompressed data savings on
331
+ // flush().
332
+ options.compression = kNoCompression;
333
+
334
+ // Prevent memtable in place updates. Should already be disabled
335
+ // (from Wiki:
336
+ // In place updates can be enabled by toggling on the bool
337
+ // inplace_update_support flag. However, this flag is by default set to
338
+ // false
339
+ // because this thread-safe in-place update support is not compatible
340
+ // with concurrent memtable writes. Note that the bool
341
+ // allow_concurrent_memtable_write is set to true by default )
342
+ options.inplace_update_support = false;
343
+ options.allow_concurrent_memtable_write = true;
344
+
345
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
346
+ options.write_buffer_size = 64 << 20;
347
+
348
+ ASSERT_OK(TryReopen(options));
349
+
350
+ // Put multiple times the same key-values.
351
+ // The encoded length of a db entry in the memtable is
352
+ // defined in db/memtable.cc (MemTable::Add) as the variable:
353
+ // encoded_len= VarintLength(internal_key_size) --> =
354
+ // log_256(internal_key).
355
+ // Min # of bytes
356
+ // necessary to
357
+ // store
358
+ // internal_key_size.
359
+ // + internal_key_size --> = actual key string,
360
+ // (size key_size: w/o term null char)
361
+ // + 8 bytes for
362
+ // fixed uint64 "seq
363
+ // number
364
+ // +
365
+ // insertion type"
366
+ // + VarintLength(val_size) --> = min # of bytes to
367
+ // store val_size
368
+ // + val_size --> = actual value
369
+ // string
370
+ // For example, in our situation, "key1" : size 4, "value1" : size 6
371
+ // (the terminating null characters are not copied over to the memtable).
372
+ // And therefore encoded_len = 1 + (4+8) + 1 + 6 = 20 bytes per entry.
373
+ // However in terms of raw data contained in the memtable, and written
374
+ // over to the SSTable, we only count internal_key_size and val_size,
375
+ // because this is the only raw chunk of bytes that contains everything
376
+ // necessary to reconstruct a user entry: sequence number, insertion type,
377
+ // key, and value.
378
+
379
+ // To test the relevance of our Memtable garbage statistics,
380
+ // namely MEMTABLE_PAYLOAD_BYTES_AT_FLUSH and MEMTABLE_GARBAGE_BYTES_AT_FLUSH,
381
+ // we insert K-V pairs with 3 distinct keys (of length 4),
382
+ // and random values of arbitrary length RAND_VALUES_LENGTH,
383
+ // and we repeat this step NUM_REPEAT times total.
384
+ // At the end, we insert 3 final K-V pairs with the same 3 keys
385
+ // and known values (these will be the final values, of length 6).
386
+ // I chose NUM_REPEAT=2,000 such that no automatic flush is
387
+ // triggered (the number of bytes in the memtable is therefore
388
+ // well below any meaningful heuristic for a memtable of size 64MB).
389
+ // As a result, since each K-V pair is inserted as a payload
390
+ // of N meaningful bytes (sequence number, insertion type,
391
+ // key, and value = 8 + 4 + RAND_VALUE_LENGTH),
392
+ // MEMTABLE_GARBAGE_BYTES_AT_FLUSH should be equal to 2,000 * N bytes
393
+ // and MEMTABLE_PAYLAOD_BYTES_AT_FLUSH = MEMTABLE_GARBAGE_BYTES_AT_FLUSH +
394
+ // (3*(8 + 4 + 6)) bytes. For RAND_VALUE_LENGTH = 172 (arbitrary value), we
395
+ // expect:
396
+ // N = 8 + 4 + 172 = 184 bytes
397
+ // MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 2,000 * 184 = 368,000 bytes.
398
+ // MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 368,000 + 3*18 = 368,054 bytes.
399
+
400
+ const size_t NUM_REPEAT = 2000;
401
+ const size_t RAND_VALUES_LENGTH = 172;
402
+ const std::string KEY1 = "key1";
403
+ const std::string KEY2 = "key2";
404
+ const std::string KEY3 = "key3";
405
+ const std::string VALUE1 = "value1";
406
+ const std::string VALUE2 = "value2";
407
+ const std::string VALUE3 = "value3";
408
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
409
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
410
+
411
+ Random rnd(301);
412
+ // Insertion of of K-V pairs, multiple times.
413
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
414
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
415
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
416
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
417
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
418
+ ASSERT_OK(Put(KEY1, p_v1));
419
+ ASSERT_OK(Put(KEY2, p_v2));
420
+ ASSERT_OK(Put(KEY3, p_v3));
421
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
422
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
423
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
424
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
425
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
426
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
427
+ }
428
+
429
+ // The memtable data bytes includes the "garbage"
430
+ // bytes along with the useful payload.
431
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
432
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
433
+
434
+ ASSERT_OK(Put(KEY1, VALUE1));
435
+ ASSERT_OK(Put(KEY2, VALUE2));
436
+ ASSERT_OK(Put(KEY3, VALUE3));
437
+
438
+ // Add useful payload to the memtable data bytes:
439
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
440
+ KEY1.size() + VALUE1.size() + KEY2.size() + VALUE2.size() + KEY3.size() +
441
+ VALUE3.size() + 3 * sizeof(uint64_t);
442
+
443
+ // We assert that the last K-V pairs have been successfully inserted,
444
+ // and that the valid values are VALUE1, VALUE2, VALUE3.
445
+ PinnableSlice value;
446
+ ASSERT_OK(Get(KEY1, &value));
447
+ ASSERT_EQ(value.ToString(), VALUE1);
448
+ ASSERT_OK(Get(KEY2, &value));
449
+ ASSERT_EQ(value.ToString(), VALUE2);
450
+ ASSERT_OK(Get(KEY3, &value));
451
+ ASSERT_EQ(value.ToString(), VALUE3);
452
+
453
+ // Force flush to SST. Increments the statistics counter.
454
+ ASSERT_OK(Flush());
455
+
456
+ // Collect statistics.
457
+ uint64_t mem_data_bytes =
458
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
459
+ uint64_t mem_garbage_bytes =
460
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
461
+
462
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
463
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
464
+
465
+ Close();
466
+ }
467
+
468
+ TEST_F(DBFlushTest, StatisticsGarbageInsertAndDeletes) {
469
+ Options options = CurrentOptions();
470
+ options.statistics = CreateDBStatistics();
471
+ options.statistics->set_stats_level(StatsLevel::kAll);
472
+ options.create_if_missing = true;
473
+ options.compression = kNoCompression;
474
+ options.inplace_update_support = false;
475
+ options.allow_concurrent_memtable_write = true;
476
+ options.write_buffer_size = 67108864;
477
+
478
+ ASSERT_OK(TryReopen(options));
479
+
480
+ const size_t NUM_REPEAT = 2000;
481
+ const size_t RAND_VALUES_LENGTH = 37;
482
+ const std::string KEY1 = "key1";
483
+ const std::string KEY2 = "key2";
484
+ const std::string KEY3 = "key3";
485
+ const std::string KEY4 = "key4";
486
+ const std::string KEY5 = "key5";
487
+ const std::string KEY6 = "key6";
488
+
489
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
490
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
491
+
492
+ WriteBatch batch;
493
+
494
+ Random rnd(301);
495
+ // Insertion of of K-V pairs, multiple times.
496
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
497
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
498
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
499
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
500
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
501
+ ASSERT_OK(Put(KEY1, p_v1));
502
+ ASSERT_OK(Put(KEY2, p_v2));
503
+ ASSERT_OK(Put(KEY3, p_v3));
504
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
505
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
506
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
507
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
508
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
509
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
510
+ ASSERT_OK(Delete(KEY1));
511
+ ASSERT_OK(Delete(KEY2));
512
+ ASSERT_OK(Delete(KEY3));
513
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
514
+ KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
515
+ }
516
+
517
+ // The memtable data bytes includes the "garbage"
518
+ // bytes along with the useful payload.
519
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
520
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
521
+
522
+ // Note : one set of delete for KEY1, KEY2, KEY3 is written to
523
+ // SSTable to propagate the delete operations to K-V pairs
524
+ // that could have been inserted into the database during past Flush
525
+ // opeartions.
526
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
527
+ KEY1.size() + KEY2.size() + KEY3.size() + 3 * sizeof(uint64_t);
528
+
529
+ // Additional useful paylaod.
530
+ ASSERT_OK(Delete(KEY4));
531
+ ASSERT_OK(Delete(KEY5));
532
+ ASSERT_OK(Delete(KEY6));
533
+
534
+ // // Add useful payload to the memtable data bytes:
535
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
536
+ KEY4.size() + KEY5.size() + KEY6.size() + 3 * sizeof(uint64_t);
537
+
538
+ // We assert that the K-V pairs have been successfully deleted.
539
+ PinnableSlice value;
540
+ ASSERT_NOK(Get(KEY1, &value));
541
+ ASSERT_NOK(Get(KEY2, &value));
542
+ ASSERT_NOK(Get(KEY3, &value));
543
+
544
+ // Force flush to SST. Increments the statistics counter.
545
+ ASSERT_OK(Flush());
546
+
547
+ // Collect statistics.
548
+ uint64_t mem_data_bytes =
549
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
550
+ uint64_t mem_garbage_bytes =
551
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
552
+
553
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
554
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
555
+
556
+ Close();
557
+ }
558
+
559
+ TEST_F(DBFlushTest, StatisticsGarbageRangeDeletes) {
560
+ Options options = CurrentOptions();
561
+ options.statistics = CreateDBStatistics();
562
+ options.statistics->set_stats_level(StatsLevel::kAll);
563
+ options.create_if_missing = true;
564
+ options.compression = kNoCompression;
565
+ options.inplace_update_support = false;
566
+ options.allow_concurrent_memtable_write = true;
567
+ options.write_buffer_size = 67108864;
568
+
569
+ ASSERT_OK(TryReopen(options));
570
+
571
+ const size_t NUM_REPEAT = 1000;
572
+ const size_t RAND_VALUES_LENGTH = 42;
573
+ const std::string KEY1 = "key1";
574
+ const std::string KEY2 = "key2";
575
+ const std::string KEY3 = "key3";
576
+ const std::string KEY4 = "key4";
577
+ const std::string KEY5 = "key5";
578
+ const std::string KEY6 = "key6";
579
+ const std::string VALUE3 = "value3";
580
+
581
+ uint64_t EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH = 0;
582
+ uint64_t EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH = 0;
583
+
584
+ Random rnd(301);
585
+ // Insertion of of K-V pairs, multiple times.
586
+ // Also insert DeleteRange
587
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
588
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
589
+ std::string p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
590
+ std::string p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
591
+ std::string p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
592
+ ASSERT_OK(Put(KEY1, p_v1));
593
+ ASSERT_OK(Put(KEY2, p_v2));
594
+ ASSERT_OK(Put(KEY3, p_v3));
595
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
596
+ KEY1.size() + p_v1.size() + sizeof(uint64_t);
597
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
598
+ KEY2.size() + p_v2.size() + sizeof(uint64_t);
599
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
600
+ KEY3.size() + p_v3.size() + sizeof(uint64_t);
601
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
602
+ KEY2));
603
+ // Note: DeleteRange have an exclusive upper bound, e.g. here: [KEY2,KEY3)
604
+ // is deleted.
605
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
606
+ KEY3));
607
+ // Delete ranges are stored as a regular K-V pair, with key=STARTKEY,
608
+ // value=ENDKEY.
609
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH +=
610
+ (KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
611
+ (KEY2.size() + KEY3.size() + sizeof(uint64_t));
612
+ }
613
+
614
+ // The memtable data bytes includes the "garbage"
615
+ // bytes along with the useful payload.
616
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH =
617
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH;
618
+
619
+ // Note : one set of deleteRange for (KEY1, KEY2) and (KEY2, KEY3) is written
620
+ // to SSTable to propagate the deleteRange operations to K-V pairs that could
621
+ // have been inserted into the database during past Flush opeartions.
622
+ EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH -=
623
+ (KEY1.size() + KEY2.size() + sizeof(uint64_t)) +
624
+ (KEY2.size() + KEY3.size() + sizeof(uint64_t));
625
+
626
+ // Overwrite KEY3 with known value (VALUE3)
627
+ // Note that during the whole time KEY3 has never been deleted
628
+ // by the RangeDeletes.
629
+ ASSERT_OK(Put(KEY3, VALUE3));
630
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
631
+ KEY3.size() + VALUE3.size() + sizeof(uint64_t);
632
+
633
+ // Additional useful paylaod.
634
+ ASSERT_OK(
635
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY4, KEY5));
636
+ ASSERT_OK(
637
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY5, KEY6));
638
+
639
+ // Add useful payload to the memtable data bytes:
640
+ EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH +=
641
+ (KEY4.size() + KEY5.size() + sizeof(uint64_t)) +
642
+ (KEY5.size() + KEY6.size() + sizeof(uint64_t));
643
+
644
+ // We assert that the K-V pairs have been successfully deleted.
645
+ PinnableSlice value;
646
+ ASSERT_NOK(Get(KEY1, &value));
647
+ ASSERT_NOK(Get(KEY2, &value));
648
+ // And that KEY3's value is correct.
649
+ ASSERT_OK(Get(KEY3, &value));
650
+ ASSERT_EQ(value, VALUE3);
651
+
652
+ // Force flush to SST. Increments the statistics counter.
653
+ ASSERT_OK(Flush());
654
+
655
+ // Collect statistics.
656
+ uint64_t mem_data_bytes =
657
+ TestGetTickerCount(options, MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
658
+ uint64_t mem_garbage_bytes =
659
+ TestGetTickerCount(options, MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
660
+
661
+ EXPECT_EQ(mem_data_bytes, EXPECTED_MEMTABLE_PAYLOAD_BYTES_AT_FLUSH);
662
+ EXPECT_EQ(mem_garbage_bytes, EXPECTED_MEMTABLE_GARBAGE_BYTES_AT_FLUSH);
663
+
664
+ Close();
665
+ }
666
+
667
+ #ifndef ROCKSDB_LITE
668
+ // This simple Listener can only handle one flush at a time.
669
+ class TestFlushListener : public EventListener {
670
+ public:
671
+ TestFlushListener(Env* env, DBFlushTest* test)
672
+ : slowdown_count(0), stop_count(0), db_closed(), env_(env), test_(test) {
673
+ db_closed = false;
674
+ }
675
+
676
+ ~TestFlushListener() override {
677
+ prev_fc_info_.status.PermitUncheckedError(); // Ignore the status
678
+ }
679
+
680
+ void OnTableFileCreated(const TableFileCreationInfo& info) override {
681
+ // remember the info for later checking the FlushJobInfo.
682
+ prev_fc_info_ = info;
683
+ ASSERT_GT(info.db_name.size(), 0U);
684
+ ASSERT_GT(info.cf_name.size(), 0U);
685
+ ASSERT_GT(info.file_path.size(), 0U);
686
+ ASSERT_GT(info.job_id, 0);
687
+ ASSERT_GT(info.table_properties.data_size, 0U);
688
+ ASSERT_GT(info.table_properties.raw_key_size, 0U);
689
+ ASSERT_GT(info.table_properties.raw_value_size, 0U);
690
+ ASSERT_GT(info.table_properties.num_data_blocks, 0U);
691
+ ASSERT_GT(info.table_properties.num_entries, 0U);
692
+ ASSERT_EQ(info.file_checksum, kUnknownFileChecksum);
693
+ ASSERT_EQ(info.file_checksum_func_name, kUnknownFileChecksumFuncName);
694
+ }
695
+
696
+ void OnFlushCompleted(DB* db, const FlushJobInfo& info) override {
697
+ flushed_dbs_.push_back(db);
698
+ flushed_column_family_names_.push_back(info.cf_name);
699
+ if (info.triggered_writes_slowdown) {
700
+ slowdown_count++;
701
+ }
702
+ if (info.triggered_writes_stop) {
703
+ stop_count++;
704
+ }
705
+ // verify whether the previously created file matches the flushed file.
706
+ ASSERT_EQ(prev_fc_info_.db_name, db->GetName());
707
+ ASSERT_EQ(prev_fc_info_.cf_name, info.cf_name);
708
+ ASSERT_EQ(prev_fc_info_.job_id, info.job_id);
709
+ ASSERT_EQ(prev_fc_info_.file_path, info.file_path);
710
+ ASSERT_EQ(TableFileNameToNumber(info.file_path), info.file_number);
711
+
712
+ // Note: the following chunk relies on the notification pertaining to the
713
+ // database pointed to by DBTestBase::db_, and is thus bypassed when
714
+ // that assumption does not hold (see the test case MultiDBMultiListeners
715
+ // below).
716
+ ASSERT_TRUE(test_);
717
+ if (db == test_->db_) {
718
+ std::vector<std::vector<FileMetaData>> files_by_level;
719
+ test_->dbfull()->TEST_GetFilesMetaData(db->DefaultColumnFamily(),
720
+ &files_by_level);
721
+
722
+ ASSERT_FALSE(files_by_level.empty());
723
+ auto it = std::find_if(files_by_level[0].begin(), files_by_level[0].end(),
724
+ [&](const FileMetaData& meta) {
725
+ return meta.fd.GetNumber() == info.file_number;
726
+ });
727
+ ASSERT_NE(it, files_by_level[0].end());
728
+ ASSERT_EQ(info.oldest_blob_file_number, it->oldest_blob_file_number);
729
+ }
730
+
731
+ ASSERT_EQ(db->GetEnv()->GetThreadID(), info.thread_id);
732
+ ASSERT_GT(info.thread_id, 0U);
733
+ }
734
+
735
+ std::vector<std::string> flushed_column_family_names_;
736
+ std::vector<DB*> flushed_dbs_;
737
+ int slowdown_count;
738
+ int stop_count;
739
+ bool db_closing;
740
+ std::atomic_bool db_closed;
741
+ TableFileCreationInfo prev_fc_info_;
742
+
743
+ protected:
744
+ Env* env_;
745
+ DBFlushTest* test_;
746
+ };
747
+ #endif // !ROCKSDB_LITE
748
+
749
+ TEST_F(DBFlushTest, MemPurgeBasic) {
750
+ Options options = CurrentOptions();
751
+
752
+ // The following options are used to enforce several values that
753
+ // may already exist as default values to make this test resilient
754
+ // to default value updates in the future.
755
+ options.statistics = CreateDBStatistics();
756
+
757
+ // Record all statistics.
758
+ options.statistics->set_stats_level(StatsLevel::kAll);
759
+
760
+ // create the DB if it's not already present
761
+ options.create_if_missing = true;
762
+
763
+ // Useful for now as we are trying to compare uncompressed data savings on
764
+ // flush().
765
+ options.compression = kNoCompression;
766
+
767
+ // Prevent memtable in place updates. Should already be disabled
768
+ // (from Wiki:
769
+ // In place updates can be enabled by toggling on the bool
770
+ // inplace_update_support flag. However, this flag is by default set to
771
+ // false
772
+ // because this thread-safe in-place update support is not compatible
773
+ // with concurrent memtable writes. Note that the bool
774
+ // allow_concurrent_memtable_write is set to true by default )
775
+ options.inplace_update_support = false;
776
+ options.allow_concurrent_memtable_write = true;
777
+
778
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
779
+ options.write_buffer_size = 1 << 20;
780
+ // Activate the MemPurge prototype.
781
+ options.experimental_mempurge_threshold = 1.0;
782
+ #ifndef ROCKSDB_LITE
783
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
784
+ options.listeners.emplace_back(listener);
785
+ #endif // !ROCKSDB_LITE
786
+ ASSERT_OK(TryReopen(options));
787
+ std::atomic<uint32_t> mempurge_count{0};
788
+ std::atomic<uint32_t> sst_count{0};
789
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
790
+ "DBImpl::FlushJob:MemPurgeSuccessful",
791
+ [&](void* /*arg*/) { mempurge_count++; });
792
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
793
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
794
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
795
+
796
+ std::string KEY1 = "IamKey1";
797
+ std::string KEY2 = "IamKey2";
798
+ std::string KEY3 = "IamKey3";
799
+ std::string KEY4 = "IamKey4";
800
+ std::string KEY5 = "IamKey5";
801
+ std::string KEY6 = "IamKey6";
802
+ std::string KEY7 = "IamKey7";
803
+ std::string KEY8 = "IamKey8";
804
+ std::string KEY9 = "IamKey9";
805
+ std::string RNDKEY1, RNDKEY2, RNDKEY3;
806
+ const std::string NOT_FOUND = "NOT_FOUND";
807
+
808
+ // Heavy overwrite workload,
809
+ // more than would fit in maximum allowed memtables.
810
+ Random rnd(719);
811
+ const size_t NUM_REPEAT = 100;
812
+ const size_t RAND_KEYS_LENGTH = 57;
813
+ const size_t RAND_VALUES_LENGTH = 10240;
814
+ std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9, p_rv1,
815
+ p_rv2, p_rv3;
816
+
817
+ // Insert a very first set of keys that will be
818
+ // mempurged at least once.
819
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
820
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
821
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
822
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
823
+ ASSERT_OK(Put(KEY1, p_v1));
824
+ ASSERT_OK(Put(KEY2, p_v2));
825
+ ASSERT_OK(Put(KEY3, p_v3));
826
+ ASSERT_OK(Put(KEY4, p_v4));
827
+ ASSERT_EQ(Get(KEY1), p_v1);
828
+ ASSERT_EQ(Get(KEY2), p_v2);
829
+ ASSERT_EQ(Get(KEY3), p_v3);
830
+ ASSERT_EQ(Get(KEY4), p_v4);
831
+
832
+ // Insertion of of K-V pairs, multiple times (overwrites).
833
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
834
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
835
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
836
+ p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
837
+ p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
838
+ p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
839
+ p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
840
+
841
+ ASSERT_OK(Put(KEY5, p_v5));
842
+ ASSERT_OK(Put(KEY6, p_v6));
843
+ ASSERT_OK(Put(KEY7, p_v7));
844
+ ASSERT_OK(Put(KEY8, p_v8));
845
+ ASSERT_OK(Put(KEY9, p_v9));
846
+
847
+ ASSERT_EQ(Get(KEY1), p_v1);
848
+ ASSERT_EQ(Get(KEY2), p_v2);
849
+ ASSERT_EQ(Get(KEY3), p_v3);
850
+ ASSERT_EQ(Get(KEY4), p_v4);
851
+ ASSERT_EQ(Get(KEY5), p_v5);
852
+ ASSERT_EQ(Get(KEY6), p_v6);
853
+ ASSERT_EQ(Get(KEY7), p_v7);
854
+ ASSERT_EQ(Get(KEY8), p_v8);
855
+ ASSERT_EQ(Get(KEY9), p_v9);
856
+ }
857
+
858
+ // Check that there was at least one mempurge
859
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
860
+ // Check that there was no SST files created during flush.
861
+ const uint32_t EXPECTED_SST_COUNT = 0;
862
+
863
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
864
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
865
+
866
+ // Insertion of of K-V pairs, no overwrites.
867
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
868
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
869
+ RNDKEY1 = rnd.RandomString(RAND_KEYS_LENGTH);
870
+ RNDKEY2 = rnd.RandomString(RAND_KEYS_LENGTH);
871
+ RNDKEY3 = rnd.RandomString(RAND_KEYS_LENGTH);
872
+ p_rv1 = rnd.RandomString(RAND_VALUES_LENGTH);
873
+ p_rv2 = rnd.RandomString(RAND_VALUES_LENGTH);
874
+ p_rv3 = rnd.RandomString(RAND_VALUES_LENGTH);
875
+
876
+ ASSERT_OK(Put(RNDKEY1, p_rv1));
877
+ ASSERT_OK(Put(RNDKEY2, p_rv2));
878
+ ASSERT_OK(Put(RNDKEY3, p_rv3));
879
+
880
+ ASSERT_EQ(Get(KEY1), p_v1);
881
+ ASSERT_EQ(Get(KEY2), p_v2);
882
+ ASSERT_EQ(Get(KEY3), p_v3);
883
+ ASSERT_EQ(Get(KEY4), p_v4);
884
+ ASSERT_EQ(Get(KEY5), p_v5);
885
+ ASSERT_EQ(Get(KEY6), p_v6);
886
+ ASSERT_EQ(Get(KEY7), p_v7);
887
+ ASSERT_EQ(Get(KEY8), p_v8);
888
+ ASSERT_EQ(Get(KEY9), p_v9);
889
+ ASSERT_EQ(Get(RNDKEY1), p_rv1);
890
+ ASSERT_EQ(Get(RNDKEY2), p_rv2);
891
+ ASSERT_EQ(Get(RNDKEY3), p_rv3);
892
+ }
893
+
894
+ // Assert that at least one flush to storage has been performed
895
+ EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
896
+ // (which will consequently increase the number of mempurges recorded too).
897
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
898
+
899
+ // Assert that there is no data corruption, even with
900
+ // a flush to storage.
901
+ ASSERT_EQ(Get(KEY1), p_v1);
902
+ ASSERT_EQ(Get(KEY2), p_v2);
903
+ ASSERT_EQ(Get(KEY3), p_v3);
904
+ ASSERT_EQ(Get(KEY4), p_v4);
905
+ ASSERT_EQ(Get(KEY5), p_v5);
906
+ ASSERT_EQ(Get(KEY6), p_v6);
907
+ ASSERT_EQ(Get(KEY7), p_v7);
908
+ ASSERT_EQ(Get(KEY8), p_v8);
909
+ ASSERT_EQ(Get(KEY9), p_v9);
910
+ ASSERT_EQ(Get(RNDKEY1), p_rv1);
911
+ ASSERT_EQ(Get(RNDKEY2), p_rv2);
912
+ ASSERT_EQ(Get(RNDKEY3), p_rv3);
913
+
914
+ Close();
915
+ }
916
+
917
+ TEST_F(DBFlushTest, MemPurgeDeleteAndDeleteRange) {
918
+ Options options = CurrentOptions();
919
+
920
+ options.statistics = CreateDBStatistics();
921
+ options.statistics->set_stats_level(StatsLevel::kAll);
922
+ options.create_if_missing = true;
923
+ options.compression = kNoCompression;
924
+ options.inplace_update_support = false;
925
+ options.allow_concurrent_memtable_write = true;
926
+ #ifndef ROCKSDB_LITE
927
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
928
+ options.listeners.emplace_back(listener);
929
+ #endif // !ROCKSDB_LITE
930
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
931
+ options.write_buffer_size = 1 << 20;
932
+ // Activate the MemPurge prototype.
933
+ options.experimental_mempurge_threshold = 1.0;
934
+
935
+ ASSERT_OK(TryReopen(options));
936
+
937
+ std::atomic<uint32_t> mempurge_count{0};
938
+ std::atomic<uint32_t> sst_count{0};
939
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
940
+ "DBImpl::FlushJob:MemPurgeSuccessful",
941
+ [&](void* /*arg*/) { mempurge_count++; });
942
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
943
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
944
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
945
+
946
+ std::string KEY1 = "ThisIsKey1";
947
+ std::string KEY2 = "ThisIsKey2";
948
+ std::string KEY3 = "ThisIsKey3";
949
+ std::string KEY4 = "ThisIsKey4";
950
+ std::string KEY5 = "ThisIsKey5";
951
+ const std::string NOT_FOUND = "NOT_FOUND";
952
+
953
+ Random rnd(117);
954
+ const size_t NUM_REPEAT = 100;
955
+ const size_t RAND_VALUES_LENGTH = 10240;
956
+
957
+ std::string key, value, p_v1, p_v2, p_v3, p_v3b, p_v4, p_v5;
958
+ int count = 0;
959
+ const int EXPECTED_COUNT_FORLOOP = 3;
960
+ const int EXPECTED_COUNT_END = 4;
961
+
962
+ ReadOptions ropt;
963
+ ropt.pin_data = true;
964
+ ropt.total_order_seek = true;
965
+ Iterator* iter = nullptr;
966
+
967
+ // Insertion of of K-V pairs, multiple times.
968
+ // Also insert DeleteRange
969
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
970
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
971
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
972
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
973
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
974
+ p_v3b = rnd.RandomString(RAND_VALUES_LENGTH);
975
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
976
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
977
+ ASSERT_OK(Put(KEY1, p_v1));
978
+ ASSERT_OK(Put(KEY2, p_v2));
979
+ ASSERT_OK(Put(KEY3, p_v3));
980
+ ASSERT_OK(Put(KEY4, p_v4));
981
+ ASSERT_OK(Put(KEY5, p_v5));
982
+ ASSERT_OK(Delete(KEY2));
983
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY2,
984
+ KEY4));
985
+ ASSERT_OK(Put(KEY3, p_v3b));
986
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), KEY1,
987
+ KEY3));
988
+ ASSERT_OK(Delete(KEY1));
989
+
990
+ ASSERT_EQ(Get(KEY1), NOT_FOUND);
991
+ ASSERT_EQ(Get(KEY2), NOT_FOUND);
992
+ ASSERT_EQ(Get(KEY3), p_v3b);
993
+ ASSERT_EQ(Get(KEY4), p_v4);
994
+ ASSERT_EQ(Get(KEY5), p_v5);
995
+
996
+ iter = db_->NewIterator(ropt);
997
+ iter->SeekToFirst();
998
+ count = 0;
999
+ for (; iter->Valid(); iter->Next()) {
1000
+ ASSERT_OK(iter->status());
1001
+ key = (iter->key()).ToString(false);
1002
+ value = (iter->value()).ToString(false);
1003
+ if (key.compare(KEY3) == 0)
1004
+ ASSERT_EQ(value, p_v3b);
1005
+ else if (key.compare(KEY4) == 0)
1006
+ ASSERT_EQ(value, p_v4);
1007
+ else if (key.compare(KEY5) == 0)
1008
+ ASSERT_EQ(value, p_v5);
1009
+ else
1010
+ ASSERT_EQ(value, NOT_FOUND);
1011
+ count++;
1012
+ }
1013
+
1014
+ // Expected count here is 3: KEY3, KEY4, KEY5.
1015
+ ASSERT_EQ(count, EXPECTED_COUNT_FORLOOP);
1016
+ if (iter) {
1017
+ delete iter;
1018
+ }
1019
+ }
1020
+
1021
+ // Check that there was at least one mempurge
1022
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1023
+ // Check that there was no SST files created during flush.
1024
+ const uint32_t EXPECTED_SST_COUNT = 0;
1025
+
1026
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1027
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1028
+
1029
+ // Additional test for the iterator+memPurge.
1030
+ ASSERT_OK(Put(KEY2, p_v2));
1031
+ iter = db_->NewIterator(ropt);
1032
+ iter->SeekToFirst();
1033
+ ASSERT_OK(Put(KEY4, p_v4));
1034
+ count = 0;
1035
+ for (; iter->Valid(); iter->Next()) {
1036
+ ASSERT_OK(iter->status());
1037
+ key = (iter->key()).ToString(false);
1038
+ value = (iter->value()).ToString(false);
1039
+ if (key.compare(KEY2) == 0)
1040
+ ASSERT_EQ(value, p_v2);
1041
+ else if (key.compare(KEY3) == 0)
1042
+ ASSERT_EQ(value, p_v3b);
1043
+ else if (key.compare(KEY4) == 0)
1044
+ ASSERT_EQ(value, p_v4);
1045
+ else if (key.compare(KEY5) == 0)
1046
+ ASSERT_EQ(value, p_v5);
1047
+ else
1048
+ ASSERT_EQ(value, NOT_FOUND);
1049
+ count++;
1050
+ }
1051
+
1052
+ // Expected count here is 4: KEY2, KEY3, KEY4, KEY5.
1053
+ ASSERT_EQ(count, EXPECTED_COUNT_END);
1054
+ if (iter) delete iter;
1055
+
1056
+ Close();
1057
+ }
1058
+
1059
+ // Create a Compaction Fitler that will be invoked
1060
+ // at flush time and will update the value of a KV pair
1061
+ // if the key string is "lower" than the filter_key_ string.
1062
+ class ConditionalUpdateFilter : public CompactionFilter {
1063
+ public:
1064
+ explicit ConditionalUpdateFilter(const std::string* filtered_key)
1065
+ : filtered_key_(filtered_key) {}
1066
+ bool Filter(int /*level*/, const Slice& key, const Slice& /*value*/,
1067
+ std::string* new_value, bool* value_changed) const override {
1068
+ // If key<filtered_key_, update the value of the KV-pair.
1069
+ if (key.compare(*filtered_key_) < 0) {
1070
+ assert(new_value != nullptr);
1071
+ *new_value = NEW_VALUE;
1072
+ *value_changed = true;
1073
+ }
1074
+ return false /*do not remove this KV-pair*/;
1075
+ }
1076
+
1077
+ const char* Name() const override { return "ConditionalUpdateFilter"; }
1078
+
1079
+ private:
1080
+ const std::string* filtered_key_;
1081
+ };
1082
+
1083
+ class ConditionalUpdateFilterFactory : public CompactionFilterFactory {
1084
+ public:
1085
+ explicit ConditionalUpdateFilterFactory(const Slice& filtered_key)
1086
+ : filtered_key_(filtered_key.ToString()) {}
1087
+
1088
+ std::unique_ptr<CompactionFilter> CreateCompactionFilter(
1089
+ const CompactionFilter::Context& /*context*/) override {
1090
+ return std::unique_ptr<CompactionFilter>(
1091
+ new ConditionalUpdateFilter(&filtered_key_));
1092
+ }
1093
+
1094
+ const char* Name() const override { return "ConditionalUpdateFilterFactory"; }
1095
+
1096
+ bool ShouldFilterTableFileCreation(
1097
+ TableFileCreationReason reason) const override {
1098
+ // This compaction filter will be invoked
1099
+ // at flush time (and therefore at MemPurge time).
1100
+ return (reason == TableFileCreationReason::kFlush);
1101
+ }
1102
+
1103
+ private:
1104
+ std::string filtered_key_;
1105
+ };
1106
+
1107
+ TEST_F(DBFlushTest, MemPurgeAndCompactionFilter) {
1108
+ Options options = CurrentOptions();
1109
+
1110
+ std::string KEY1 = "ThisIsKey1";
1111
+ std::string KEY2 = "ThisIsKey2";
1112
+ std::string KEY3 = "ThisIsKey3";
1113
+ std::string KEY4 = "ThisIsKey4";
1114
+ std::string KEY5 = "ThisIsKey5";
1115
+ std::string KEY6 = "ThisIsKey6";
1116
+ std::string KEY7 = "ThisIsKey7";
1117
+ std::string KEY8 = "ThisIsKey8";
1118
+ std::string KEY9 = "ThisIsKey9";
1119
+ const std::string NOT_FOUND = "NOT_FOUND";
1120
+
1121
+ options.statistics = CreateDBStatistics();
1122
+ options.statistics->set_stats_level(StatsLevel::kAll);
1123
+ options.create_if_missing = true;
1124
+ options.compression = kNoCompression;
1125
+ options.inplace_update_support = false;
1126
+ options.allow_concurrent_memtable_write = true;
1127
+ #ifndef ROCKSDB_LITE
1128
+ TestFlushListener* listener = new TestFlushListener(options.env, this);
1129
+ options.listeners.emplace_back(listener);
1130
+ #endif // !ROCKSDB_LITE
1131
+ // Create a ConditionalUpdate compaction filter
1132
+ // that will update all the values of the KV pairs
1133
+ // where the keys are "lower" than KEY4.
1134
+ options.compaction_filter_factory =
1135
+ std::make_shared<ConditionalUpdateFilterFactory>(KEY4);
1136
+
1137
+ // Enforce size of a single MemTable to 64MB (64MB = 67108864 bytes).
1138
+ options.write_buffer_size = 1 << 20;
1139
+ // Activate the MemPurge prototype.
1140
+ options.experimental_mempurge_threshold = 1.0;
1141
+
1142
+ ASSERT_OK(TryReopen(options));
1143
+
1144
+ std::atomic<uint32_t> mempurge_count{0};
1145
+ std::atomic<uint32_t> sst_count{0};
1146
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1147
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1148
+ [&](void* /*arg*/) { mempurge_count++; });
1149
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1150
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1151
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1152
+
1153
+ Random rnd(53);
1154
+ const size_t NUM_REPEAT = 1000;
1155
+ const size_t RAND_VALUES_LENGTH = 10240;
1156
+ std::string p_v1, p_v2, p_v3, p_v4, p_v5, p_v6, p_v7, p_v8, p_v9;
1157
+
1158
+ p_v1 = rnd.RandomString(RAND_VALUES_LENGTH);
1159
+ p_v2 = rnd.RandomString(RAND_VALUES_LENGTH);
1160
+ p_v3 = rnd.RandomString(RAND_VALUES_LENGTH);
1161
+ p_v4 = rnd.RandomString(RAND_VALUES_LENGTH);
1162
+ p_v5 = rnd.RandomString(RAND_VALUES_LENGTH);
1163
+ ASSERT_OK(Put(KEY1, p_v1));
1164
+ ASSERT_OK(Put(KEY2, p_v2));
1165
+ ASSERT_OK(Put(KEY3, p_v3));
1166
+ ASSERT_OK(Put(KEY4, p_v4));
1167
+ ASSERT_OK(Put(KEY5, p_v5));
1168
+ ASSERT_OK(Delete(KEY1));
1169
+
1170
+ // Insertion of of K-V pairs, multiple times.
1171
+ for (size_t i = 0; i < NUM_REPEAT; i++) {
1172
+ // Create value strings of arbitrary
1173
+ // length RAND_VALUES_LENGTH bytes.
1174
+ p_v6 = rnd.RandomString(RAND_VALUES_LENGTH);
1175
+ p_v7 = rnd.RandomString(RAND_VALUES_LENGTH);
1176
+ p_v8 = rnd.RandomString(RAND_VALUES_LENGTH);
1177
+ p_v9 = rnd.RandomString(RAND_VALUES_LENGTH);
1178
+ ASSERT_OK(Put(KEY6, p_v6));
1179
+ ASSERT_OK(Put(KEY7, p_v7));
1180
+ ASSERT_OK(Put(KEY8, p_v8));
1181
+ ASSERT_OK(Put(KEY9, p_v9));
1182
+
1183
+ ASSERT_OK(Delete(KEY7));
1184
+ }
1185
+
1186
+ // Check that there was at least one mempurge
1187
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1188
+ // Check that there was no SST files created during flush.
1189
+ const uint32_t EXPECTED_SST_COUNT = 0;
1190
+
1191
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1192
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1193
+
1194
+ // Verify that the ConditionalUpdateCompactionFilter
1195
+ // updated the values of KEY2 and KEY3, and not KEY4 and KEY5.
1196
+ ASSERT_EQ(Get(KEY1), NOT_FOUND);
1197
+ ASSERT_EQ(Get(KEY2), NEW_VALUE);
1198
+ ASSERT_EQ(Get(KEY3), NEW_VALUE);
1199
+ ASSERT_EQ(Get(KEY4), p_v4);
1200
+ ASSERT_EQ(Get(KEY5), p_v5);
1201
+ }
1202
+
1203
+ TEST_F(DBFlushTest, DISABLED_MemPurgeWALSupport) {
1204
+ Options options = CurrentOptions();
1205
+
1206
+ options.statistics = CreateDBStatistics();
1207
+ options.statistics->set_stats_level(StatsLevel::kAll);
1208
+ options.create_if_missing = true;
1209
+ options.compression = kNoCompression;
1210
+ options.inplace_update_support = false;
1211
+ options.allow_concurrent_memtable_write = true;
1212
+
1213
+ // Enforce size of a single MemTable to 128KB.
1214
+ options.write_buffer_size = 128 << 10;
1215
+ // Activate the MemPurge prototype.
1216
+ options.experimental_mempurge_threshold = 1.0;
1217
+
1218
+ ASSERT_OK(TryReopen(options));
1219
+
1220
+ const size_t KVSIZE = 10;
1221
+
1222
+ do {
1223
+ CreateAndReopenWithCF({"pikachu"}, options);
1224
+ ASSERT_OK(Put(1, "foo", "v1"));
1225
+ ASSERT_OK(Put(1, "baz", "v5"));
1226
+
1227
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1228
+ ASSERT_EQ("v1", Get(1, "foo"));
1229
+
1230
+ ASSERT_EQ("v1", Get(1, "foo"));
1231
+ ASSERT_EQ("v5", Get(1, "baz"));
1232
+ ASSERT_OK(Put(0, "bar", "v2"));
1233
+ ASSERT_OK(Put(1, "bar", "v2"));
1234
+ ASSERT_OK(Put(1, "foo", "v3"));
1235
+ std::atomic<uint32_t> mempurge_count{0};
1236
+ std::atomic<uint32_t> sst_count{0};
1237
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1238
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1239
+ [&](void* /*arg*/) { mempurge_count++; });
1240
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1241
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1242
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1243
+
1244
+ std::vector<std::string> keys;
1245
+ for (size_t k = 0; k < KVSIZE; k++) {
1246
+ keys.push_back("IamKey" + std::to_string(k));
1247
+ }
1248
+
1249
+ std::string RNDKEY, RNDVALUE;
1250
+ const std::string NOT_FOUND = "NOT_FOUND";
1251
+
1252
+ // Heavy overwrite workload,
1253
+ // more than would fit in maximum allowed memtables.
1254
+ Random rnd(719);
1255
+ const size_t NUM_REPEAT = 100;
1256
+ const size_t RAND_KEY_LENGTH = 4096;
1257
+ const size_t RAND_VALUES_LENGTH = 1024;
1258
+ std::vector<std::string> values_default(KVSIZE), values_pikachu(KVSIZE);
1259
+
1260
+ // Insert a very first set of keys that will be
1261
+ // mempurged at least once.
1262
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1263
+ values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1264
+ values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1265
+ }
1266
+
1267
+ // Insert keys[0:KVSIZE/2] to
1268
+ // both 'default' and 'pikachu' CFs.
1269
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1270
+ ASSERT_OK(Put(0, keys[k], values_default[k]));
1271
+ ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
1272
+ }
1273
+
1274
+ // Check that the insertion was seamless.
1275
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1276
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1277
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1278
+ }
1279
+
1280
+ // Insertion of of K-V pairs, multiple times (overwrites)
1281
+ // into 'default' CF. Will trigger mempurge.
1282
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1283
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1284
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1285
+ values_default[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1286
+ }
1287
+
1288
+ // Insert K-V into default CF.
1289
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1290
+ ASSERT_OK(Put(0, keys[k], values_default[k]));
1291
+ }
1292
+
1293
+ // Check key validity, for all keys, both in
1294
+ // default and pikachu CFs.
1295
+ for (size_t k = 0; k < KVSIZE; k++) {
1296
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1297
+ }
1298
+ // Note that at this point, only keys[0:KVSIZE/2]
1299
+ // have been inserted into Pikachu.
1300
+ for (size_t k = 0; k < KVSIZE / 2; k++) {
1301
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1302
+ }
1303
+ }
1304
+
1305
+ // Insertion of of K-V pairs, multiple times (overwrites)
1306
+ // into 'pikachu' CF. Will trigger mempurge.
1307
+ // Check that we keep the older logs for 'default' imm().
1308
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1309
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1310
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1311
+ values_pikachu[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1312
+ }
1313
+
1314
+ // Insert K-V into pikachu CF.
1315
+ for (size_t k = KVSIZE / 2; k < KVSIZE; k++) {
1316
+ ASSERT_OK(Put(1, keys[k], values_pikachu[k]));
1317
+ }
1318
+
1319
+ // Check key validity, for all keys,
1320
+ // both in default and pikachu.
1321
+ for (size_t k = 0; k < KVSIZE; k++) {
1322
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1323
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1324
+ }
1325
+ }
1326
+
1327
+ // Check that there was at least one mempurge
1328
+ const uint32_t EXPECTED_MIN_MEMPURGE_COUNT = 1;
1329
+ // Check that there was no SST files created during flush.
1330
+ const uint32_t EXPECTED_SST_COUNT = 0;
1331
+
1332
+ EXPECT_GE(mempurge_count.exchange(0), EXPECTED_MIN_MEMPURGE_COUNT);
1333
+ if (options.experimental_mempurge_threshold ==
1334
+ std::numeric_limits<double>::max()) {
1335
+ EXPECT_EQ(sst_count.exchange(0), EXPECTED_SST_COUNT);
1336
+ }
1337
+
1338
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1339
+ // Check that there was no data corruption anywhere,
1340
+ // not in 'default' nor in 'Pikachu' CFs.
1341
+ ASSERT_EQ("v3", Get(1, "foo"));
1342
+ ASSERT_OK(Put(1, "foo", "v4"));
1343
+ ASSERT_EQ("v4", Get(1, "foo"));
1344
+ ASSERT_EQ("v2", Get(1, "bar"));
1345
+ ASSERT_EQ("v5", Get(1, "baz"));
1346
+ // Check keys in 'Default' and 'Pikachu'.
1347
+ // keys[0:KVSIZE/2] were for sure contained
1348
+ // in the imm() at Reopen/recovery time.
1349
+ for (size_t k = 0; k < KVSIZE; k++) {
1350
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1351
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1352
+ }
1353
+ // Insertion of random K-V pairs to trigger
1354
+ // a flush in the Pikachu CF.
1355
+ for (size_t j = 0; j < NUM_REPEAT; j++) {
1356
+ RNDKEY = rnd.RandomString(RAND_KEY_LENGTH);
1357
+ RNDVALUE = rnd.RandomString(RAND_VALUES_LENGTH);
1358
+ ASSERT_OK(Put(1, RNDKEY, RNDVALUE));
1359
+ }
1360
+ // ASsert than there was at least one flush to storage.
1361
+ EXPECT_GT(sst_count.exchange(0), EXPECTED_SST_COUNT);
1362
+ ReopenWithColumnFamilies({"default", "pikachu"}, options);
1363
+ ASSERT_EQ("v4", Get(1, "foo"));
1364
+ ASSERT_EQ("v2", Get(1, "bar"));
1365
+ ASSERT_EQ("v5", Get(1, "baz"));
1366
+ // Since values in default are held in mutable mem()
1367
+ // and imm(), check if the flush in pikachu didn't
1368
+ // affect these values.
1369
+ for (size_t k = 0; k < KVSIZE; k++) {
1370
+ ASSERT_EQ(Get(0, keys[k]), values_default[k]);
1371
+ ASSERT_EQ(Get(1, keys[k]), values_pikachu[k]);
1372
+ }
1373
+ ASSERT_EQ(Get(1, RNDKEY), RNDVALUE);
1374
+ } while (ChangeWalOptions());
1375
+ }
1376
+
1377
+ TEST_F(DBFlushTest, MemPurgeCorrectLogNumberAndSSTFileCreation) {
1378
+ // Before our bug fix, we noticed that when 2 memtables were
1379
+ // being flushed (with one memtable being the output of a
1380
+ // previous MemPurge and one memtable being a newly-sealed memtable),
1381
+ // the SST file created was not properly added to the DB version
1382
+ // (via the VersionEdit obj), leading to data loss (the SST file
1383
+ // was later being purged as an obsolete file).
1384
+ // Therefore, we reproduce this scenario to test our fix.
1385
+ Options options = CurrentOptions();
1386
+
1387
+ options.create_if_missing = true;
1388
+ options.compression = kNoCompression;
1389
+ options.inplace_update_support = false;
1390
+ options.allow_concurrent_memtable_write = true;
1391
+
1392
+ // Enforce size of a single MemTable to 1MB (64MB = 1048576 bytes).
1393
+ options.write_buffer_size = 1 << 20;
1394
+ // Activate the MemPurge prototype.
1395
+ options.experimental_mempurge_threshold = 1.0;
1396
+
1397
+ // Force to have more than one memtable to trigger a flush.
1398
+ // For some reason this option does not seem to be enforced,
1399
+ // so the following test is designed to make sure that we
1400
+ // are testing the correct test case.
1401
+ options.min_write_buffer_number_to_merge = 3;
1402
+ options.max_write_buffer_number = 5;
1403
+ options.max_write_buffer_size_to_maintain = 2 * (options.write_buffer_size);
1404
+ options.disable_auto_compactions = true;
1405
+ ASSERT_OK(TryReopen(options));
1406
+
1407
+ std::atomic<uint32_t> mempurge_count{0};
1408
+ std::atomic<uint32_t> sst_count{0};
1409
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1410
+ "DBImpl::FlushJob:MemPurgeSuccessful",
1411
+ [&](void* /*arg*/) { mempurge_count++; });
1412
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1413
+ "DBImpl::FlushJob:SSTFileCreated", [&](void* /*arg*/) { sst_count++; });
1414
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1415
+
1416
+ // Dummy variable used for the following callback function.
1417
+ uint64_t ZERO = 0;
1418
+ // We will first execute mempurge operations exclusively.
1419
+ // Therefore, when the first flush is triggered, we want to make
1420
+ // sure there is at least 2 memtables being flushed: one output
1421
+ // from a previous mempurge, and one newly sealed memtable.
1422
+ // This is when we observed in the past that some SST files created
1423
+ // were not properly added to the DB version (via the VersionEdit obj).
1424
+ std::atomic<uint64_t> num_memtable_at_first_flush(0);
1425
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1426
+ "FlushJob::WriteLevel0Table:num_memtables", [&](void* arg) {
1427
+ uint64_t* mems_size = reinterpret_cast<uint64_t*>(arg);
1428
+ // atomic_compare_exchange_strong sometimes updates the value
1429
+ // of ZERO (the "expected" object), so we make sure ZERO is indeed...
1430
+ // zero.
1431
+ ZERO = 0;
1432
+ std::atomic_compare_exchange_strong(&num_memtable_at_first_flush, &ZERO,
1433
+ *mems_size);
1434
+ });
1435
+
1436
+ const std::vector<std::string> KEYS = {
1437
+ "ThisIsKey1", "ThisIsKey2", "ThisIsKey3", "ThisIsKey4", "ThisIsKey5",
1438
+ "ThisIsKey6", "ThisIsKey7", "ThisIsKey8", "ThisIsKey9"};
1439
+ const std::string NOT_FOUND = "NOT_FOUND";
1440
+
1441
+ Random rnd(117);
1442
+ const uint64_t NUM_REPEAT_OVERWRITES = 100;
1443
+ const uint64_t NUM_RAND_INSERTS = 500;
1444
+ const uint64_t RAND_VALUES_LENGTH = 10240;
1445
+
1446
+ std::string key, value;
1447
+ std::vector<std::string> values(9, "");
1448
+
1449
+ // Keys used to check that no SST file disappeared.
1450
+ for (uint64_t k = 0; k < 5; k++) {
1451
+ values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1452
+ ASSERT_OK(Put(KEYS[k], values[k]));
1453
+ }
1454
+
1455
+ // Insertion of of K-V pairs, multiple times.
1456
+ // Trigger at least one mempurge and no SST file creation.
1457
+ for (size_t i = 0; i < NUM_REPEAT_OVERWRITES; i++) {
1458
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1459
+ for (uint64_t k = 5; k < values.size(); k++) {
1460
+ values[k] = rnd.RandomString(RAND_VALUES_LENGTH);
1461
+ ASSERT_OK(Put(KEYS[k], values[k]));
1462
+ }
1463
+ // Check database consistency.
1464
+ for (uint64_t k = 0; k < values.size(); k++) {
1465
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1466
+ }
1467
+ }
1468
+
1469
+ // Check that there was at least one mempurge
1470
+ uint32_t expected_min_mempurge_count = 1;
1471
+ // Check that there was no SST files created during flush.
1472
+ uint32_t expected_sst_count = 0;
1473
+ EXPECT_GE(mempurge_count.load(), expected_min_mempurge_count);
1474
+ EXPECT_EQ(sst_count.load(), expected_sst_count);
1475
+
1476
+ // Trigger an SST file creation and no mempurge.
1477
+ for (size_t i = 0; i < NUM_RAND_INSERTS; i++) {
1478
+ key = rnd.RandomString(RAND_VALUES_LENGTH);
1479
+ // Create value strings of arbitrary length RAND_VALUES_LENGTH bytes.
1480
+ value = rnd.RandomString(RAND_VALUES_LENGTH);
1481
+ ASSERT_OK(Put(key, value));
1482
+ // Check database consistency.
1483
+ for (uint64_t k = 0; k < values.size(); k++) {
1484
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1485
+ }
1486
+ ASSERT_EQ(Get(key), value);
1487
+ }
1488
+
1489
+ // Check that there was at least one SST files created during flush.
1490
+ expected_sst_count = 1;
1491
+ EXPECT_GE(sst_count.load(), expected_sst_count);
1492
+
1493
+ // Oddly enough, num_memtable_at_first_flush is not enforced to be
1494
+ // equal to min_write_buffer_number_to_merge. So by asserting that
1495
+ // the first SST file creation comes from one output memtable
1496
+ // from a previous mempurge, and one newly sealed memtable. This
1497
+ // is the scenario where we observed that some SST files created
1498
+ // were not properly added to the DB version before our bug fix.
1499
+ ASSERT_GE(num_memtable_at_first_flush.load(), 2);
1500
+
1501
+ // Check that no data was lost after SST file creation.
1502
+ for (uint64_t k = 0; k < values.size(); k++) {
1503
+ ASSERT_EQ(Get(KEYS[k]), values[k]);
1504
+ }
1505
+ // Extra check of database consistency.
1506
+ ASSERT_EQ(Get(key), value);
1507
+
1508
+ Close();
1509
+ }
1510
+
242
1511
  TEST_P(DBFlushDirectIOTest, DirectIO) {
243
1512
  Options options;
244
1513
  options.create_if_missing = true;
245
1514
  options.disable_auto_compactions = true;
246
1515
  options.max_background_flushes = 2;
247
1516
  options.use_direct_io_for_flush_and_compaction = GetParam();
248
- options.env = new MockEnv(Env::Default());
1517
+ options.env = MockEnv::Create(Env::Default());
249
1518
  SyncPoint::GetInstance()->SetCallBack(
250
1519
  "BuildTable:create_file", [&](void* arg) {
251
1520
  bool* use_direct_writes = static_cast<bool*>(arg);
@@ -398,7 +1667,7 @@ TEST_F(DBFlushTest, FireOnFlushCompletedAfterCommittedResult) {
398
1667
  std::shared_ptr<TestListener> listener = std::make_shared<TestListener>();
399
1668
 
400
1669
  SyncPoint::GetInstance()->LoadDependency(
401
- {{"DBImpl::BackgroundCallFlush:start",
1670
+ {{"DBImpl::FlushMemTableToOutputFile:AfterPickMemtables",
402
1671
  "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitFirst"},
403
1672
  {"DBImpl::FlushMemTableToOutputFile:Finish",
404
1673
  "DBFlushTest::FireOnFlushCompletedAfterCommittedResult:WaitSecond"}});
@@ -440,6 +1709,9 @@ TEST_F(DBFlushTest, FireOnFlushCompletedAfterCommittedResult) {
440
1709
  flush_opts.wait = false;
441
1710
  ASSERT_OK(db_->Flush(flush_opts));
442
1711
  t1.join();
1712
+ // Ensure background work is fully finished including listener callbacks
1713
+ // before accessing listener state.
1714
+ ASSERT_OK(dbfull()->TEST_WaitForBackgroundWork());
443
1715
  ASSERT_TRUE(listener->completed1);
444
1716
  ASSERT_TRUE(listener->completed2);
445
1717
  SyncPoint::GetInstance()->DisableProcessing();
@@ -451,7 +1723,6 @@ TEST_F(DBFlushTest, FlushWithBlob) {
451
1723
  constexpr uint64_t min_blob_size = 10;
452
1724
 
453
1725
  Options options;
454
- options.env = CurrentOptions().env;
455
1726
  options.enable_blob_files = true;
456
1727
  options.min_blob_size = min_blob_size;
457
1728
  options.disable_auto_compactions = true;
@@ -475,7 +1746,7 @@ TEST_F(DBFlushTest, FlushWithBlob) {
475
1746
  ASSERT_EQ(Get("key1"), short_value);
476
1747
  ASSERT_EQ(Get("key2"), long_value);
477
1748
 
478
- VersionSet* const versions = dbfull()->TEST_GetVersionSet();
1749
+ VersionSet* const versions = dbfull()->GetVersionSet();
479
1750
  assert(versions);
480
1751
 
481
1752
  ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
@@ -496,7 +1767,7 @@ TEST_F(DBFlushTest, FlushWithBlob) {
496
1767
  const auto& blob_files = storage_info->GetBlobFiles();
497
1768
  ASSERT_EQ(blob_files.size(), 1);
498
1769
 
499
- const auto& blob_file = blob_files.begin()->second;
1770
+ const auto& blob_file = blob_files.front();
500
1771
  assert(blob_file);
501
1772
 
502
1773
  ASSERT_EQ(table_file->smallest.user_key(), "key1");
@@ -512,27 +1783,268 @@ TEST_F(DBFlushTest, FlushWithBlob) {
512
1783
  const InternalStats* const internal_stats = cfd->internal_stats();
513
1784
  assert(internal_stats);
514
1785
 
515
- const uint64_t expected_bytes =
516
- table_file->fd.GetFileSize() + blob_file->GetTotalBlobBytes();
517
-
518
1786
  const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
519
1787
  ASSERT_FALSE(compaction_stats.empty());
520
- ASSERT_EQ(compaction_stats[0].bytes_written, expected_bytes);
521
- ASSERT_EQ(compaction_stats[0].num_output_files, 2);
1788
+ ASSERT_EQ(compaction_stats[0].bytes_written, table_file->fd.GetFileSize());
1789
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob,
1790
+ blob_file->GetTotalBlobBytes());
1791
+ ASSERT_EQ(compaction_stats[0].num_output_files, 1);
1792
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 1);
522
1793
 
523
1794
  const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
524
- ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED], expected_bytes);
1795
+ ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
1796
+ compaction_stats[0].bytes_written +
1797
+ compaction_stats[0].bytes_written_blob);
525
1798
  #endif // ROCKSDB_LITE
526
1799
  }
527
1800
 
1801
+ TEST_F(DBFlushTest, FlushWithChecksumHandoff1) {
1802
+ if (mem_env_ || encrypted_env_) {
1803
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1804
+ return;
1805
+ }
1806
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
1807
+ new FaultInjectionTestFS(FileSystem::Default()));
1808
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
1809
+ Options options = CurrentOptions();
1810
+ options.write_buffer_size = 100;
1811
+ options.max_write_buffer_number = 4;
1812
+ options.min_write_buffer_number_to_merge = 3;
1813
+ options.disable_auto_compactions = true;
1814
+ options.env = fault_fs_env.get();
1815
+ options.checksum_handoff_file_types.Add(FileType::kTableFile);
1816
+ Reopen(options);
1817
+
1818
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1819
+ ASSERT_OK(Put("key1", "value1"));
1820
+ ASSERT_OK(Put("key2", "value2"));
1821
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
1822
+
1823
+ // The hash does not match, write fails
1824
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
1825
+ // Since the file system returns IOStatus::Corruption, it is an
1826
+ // unrecoverable error.
1827
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
1828
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
1829
+ });
1830
+ ASSERT_OK(Put("key3", "value3"));
1831
+ ASSERT_OK(Put("key4", "value4"));
1832
+ SyncPoint::GetInstance()->EnableProcessing();
1833
+ Status s = Flush();
1834
+ ASSERT_EQ(s.severity(),
1835
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
1836
+ SyncPoint::GetInstance()->DisableProcessing();
1837
+ Destroy(options);
1838
+ Reopen(options);
1839
+
1840
+ // The file system does not support checksum handoff. The check
1841
+ // will be ignored.
1842
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
1843
+ ASSERT_OK(Put("key5", "value5"));
1844
+ ASSERT_OK(Put("key6", "value6"));
1845
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
1846
+
1847
+ // Each write will be similated as corrupted.
1848
+ // Since the file system returns IOStatus::Corruption, it is an
1849
+ // unrecoverable error.
1850
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1851
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
1852
+ fault_fs->IngestDataCorruptionBeforeWrite();
1853
+ });
1854
+ ASSERT_OK(Put("key7", "value7"));
1855
+ ASSERT_OK(Put("key8", "value8"));
1856
+ SyncPoint::GetInstance()->EnableProcessing();
1857
+ s = Flush();
1858
+ ASSERT_EQ(s.severity(),
1859
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
1860
+ SyncPoint::GetInstance()->DisableProcessing();
1861
+
1862
+ Destroy(options);
1863
+ }
1864
+
1865
+ TEST_F(DBFlushTest, FlushWithChecksumHandoff2) {
1866
+ if (mem_env_ || encrypted_env_) {
1867
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1868
+ return;
1869
+ }
1870
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
1871
+ new FaultInjectionTestFS(FileSystem::Default()));
1872
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
1873
+ Options options = CurrentOptions();
1874
+ options.write_buffer_size = 100;
1875
+ options.max_write_buffer_number = 4;
1876
+ options.min_write_buffer_number_to_merge = 3;
1877
+ options.disable_auto_compactions = true;
1878
+ options.env = fault_fs_env.get();
1879
+ Reopen(options);
1880
+
1881
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1882
+ ASSERT_OK(Put("key1", "value1"));
1883
+ ASSERT_OK(Put("key2", "value2"));
1884
+ ASSERT_OK(Flush());
1885
+
1886
+ // options is not set, the checksum handoff will not be triggered
1887
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
1888
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
1889
+ });
1890
+ ASSERT_OK(Put("key3", "value3"));
1891
+ ASSERT_OK(Put("key4", "value4"));
1892
+ SyncPoint::GetInstance()->EnableProcessing();
1893
+ ASSERT_OK(Flush());
1894
+ SyncPoint::GetInstance()->DisableProcessing();
1895
+ Destroy(options);
1896
+ Reopen(options);
1897
+
1898
+ // The file system does not support checksum handoff. The check
1899
+ // will be ignored.
1900
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
1901
+ ASSERT_OK(Put("key5", "value5"));
1902
+ ASSERT_OK(Put("key6", "value6"));
1903
+ ASSERT_OK(Flush());
1904
+
1905
+ // options is not set, the checksum handoff will not be triggered
1906
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1907
+ SyncPoint::GetInstance()->SetCallBack("FlushJob::Start", [&](void*) {
1908
+ fault_fs->IngestDataCorruptionBeforeWrite();
1909
+ });
1910
+ ASSERT_OK(Put("key7", "value7"));
1911
+ ASSERT_OK(Put("key8", "value8"));
1912
+ SyncPoint::GetInstance()->EnableProcessing();
1913
+ ASSERT_OK(Flush());
1914
+ SyncPoint::GetInstance()->DisableProcessing();
1915
+
1916
+ Destroy(options);
1917
+ }
1918
+
1919
+ TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest1) {
1920
+ if (mem_env_ || encrypted_env_) {
1921
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1922
+ return;
1923
+ }
1924
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
1925
+ new FaultInjectionTestFS(FileSystem::Default()));
1926
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
1927
+ Options options = CurrentOptions();
1928
+ options.write_buffer_size = 100;
1929
+ options.max_write_buffer_number = 4;
1930
+ options.min_write_buffer_number_to_merge = 3;
1931
+ options.disable_auto_compactions = true;
1932
+ options.env = fault_fs_env.get();
1933
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
1934
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1935
+ Reopen(options);
1936
+
1937
+ ASSERT_OK(Put("key1", "value1"));
1938
+ ASSERT_OK(Put("key2", "value2"));
1939
+ ASSERT_OK(Flush());
1940
+
1941
+ // The hash does not match, write fails
1942
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
1943
+ // Since the file system returns IOStatus::Corruption, it is mapped to
1944
+ // kFatalError error.
1945
+ ASSERT_OK(Put("key3", "value3"));
1946
+ SyncPoint::GetInstance()->SetCallBack(
1947
+ "VersionSet::LogAndApply:WriteManifest", [&](void*) {
1948
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
1949
+ });
1950
+ ASSERT_OK(Put("key3", "value3"));
1951
+ ASSERT_OK(Put("key4", "value4"));
1952
+ SyncPoint::GetInstance()->EnableProcessing();
1953
+ Status s = Flush();
1954
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
1955
+ SyncPoint::GetInstance()->DisableProcessing();
1956
+ Destroy(options);
1957
+ }
1958
+
1959
+ TEST_F(DBFlushTest, FlushWithChecksumHandoffManifest2) {
1960
+ if (mem_env_ || encrypted_env_) {
1961
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
1962
+ return;
1963
+ }
1964
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
1965
+ new FaultInjectionTestFS(FileSystem::Default()));
1966
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
1967
+ Options options = CurrentOptions();
1968
+ options.write_buffer_size = 100;
1969
+ options.max_write_buffer_number = 4;
1970
+ options.min_write_buffer_number_to_merge = 3;
1971
+ options.disable_auto_compactions = true;
1972
+ options.env = fault_fs_env.get();
1973
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
1974
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
1975
+ Reopen(options);
1976
+ // The file system does not support checksum handoff. The check
1977
+ // will be ignored.
1978
+ ASSERT_OK(Put("key5", "value5"));
1979
+ ASSERT_OK(Put("key6", "value6"));
1980
+ ASSERT_OK(Flush());
1981
+
1982
+ // Each write will be similated as corrupted.
1983
+ // Since the file system returns IOStatus::Corruption, it is mapped to
1984
+ // kFatalError error.
1985
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
1986
+ SyncPoint::GetInstance()->SetCallBack(
1987
+ "VersionSet::LogAndApply:WriteManifest",
1988
+ [&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
1989
+ ASSERT_OK(Put("key7", "value7"));
1990
+ ASSERT_OK(Put("key8", "value8"));
1991
+ SyncPoint::GetInstance()->EnableProcessing();
1992
+ Status s = Flush();
1993
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
1994
+ SyncPoint::GetInstance()->DisableProcessing();
1995
+
1996
+ Destroy(options);
1997
+ }
1998
+
1999
+ TEST_F(DBFlushTest, PickRightMemtables) {
2000
+ Options options = CurrentOptions();
2001
+ DestroyAndReopen(options);
2002
+ options.create_if_missing = true;
2003
+
2004
+ const std::string test_cf_name = "test_cf";
2005
+ options.max_write_buffer_number = 128;
2006
+ CreateColumnFamilies({test_cf_name}, options);
2007
+
2008
+ Close();
2009
+
2010
+ ReopenWithColumnFamilies({kDefaultColumnFamilyName, test_cf_name}, options);
2011
+
2012
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "value"));
2013
+
2014
+ ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "key", "value"));
2015
+
2016
+ SyncPoint::GetInstance()->DisableProcessing();
2017
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2018
+ SyncPoint::GetInstance()->SetCallBack(
2019
+ "DBImpl::SyncClosedLogs:BeforeReLock", [&](void* /*arg*/) {
2020
+ ASSERT_OK(db_->Put(WriteOptions(), handles_[1], "what", "v"));
2021
+ auto* cfhi =
2022
+ static_cast_with_check<ColumnFamilyHandleImpl>(handles_[1]);
2023
+ assert(cfhi);
2024
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable(cfhi->cfd()));
2025
+ });
2026
+ SyncPoint::GetInstance()->SetCallBack(
2027
+ "DBImpl::FlushMemTableToOutputFile:AfterPickMemtables", [&](void* arg) {
2028
+ auto* job = reinterpret_cast<FlushJob*>(arg);
2029
+ assert(job);
2030
+ const auto& mems = job->GetMemTables();
2031
+ assert(mems.size() == 1);
2032
+ assert(mems[0]);
2033
+ ASSERT_EQ(1, mems[0]->GetID());
2034
+ });
2035
+ SyncPoint::GetInstance()->EnableProcessing();
2036
+
2037
+ ASSERT_OK(db_->Flush(FlushOptions(), handles_[1]));
2038
+
2039
+ SyncPoint::GetInstance()->DisableProcessing();
2040
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2041
+ }
2042
+
528
2043
  class DBFlushTestBlobError : public DBFlushTest,
529
2044
  public testing::WithParamInterface<std::string> {
530
2045
  public:
531
- DBFlushTestBlobError()
532
- : fault_injection_env_(env_), sync_point_(GetParam()) {}
533
- ~DBFlushTestBlobError() { Close(); }
2046
+ DBFlushTestBlobError() : sync_point_(GetParam()) {}
534
2047
 
535
- FaultInjectionTestEnv fault_injection_env_;
536
2048
  std::string sync_point_;
537
2049
  };
538
2050
 
@@ -545,20 +2057,18 @@ TEST_P(DBFlushTestBlobError, FlushError) {
545
2057
  Options options;
546
2058
  options.enable_blob_files = true;
547
2059
  options.disable_auto_compactions = true;
548
- options.env = &fault_injection_env_;
2060
+ options.env = env_;
549
2061
 
550
2062
  Reopen(options);
551
2063
 
552
2064
  ASSERT_OK(Put("key", "blob"));
553
2065
 
554
- SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* /* arg */) {
555
- fault_injection_env_.SetFilesystemActive(false,
556
- Status::IOError(sync_point_));
2066
+ SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* arg) {
2067
+ Status* const s = static_cast<Status*>(arg);
2068
+ assert(s);
2069
+
2070
+ (*s) = Status::IOError(sync_point_);
557
2071
  });
558
- SyncPoint::GetInstance()->SetCallBack(
559
- "BuildTable:BeforeDeleteFile", [this](void* /* arg */) {
560
- fault_injection_env_.SetFilesystemActive(true);
561
- });
562
2072
  SyncPoint::GetInstance()->EnableProcessing();
563
2073
 
564
2074
  ASSERT_NOK(Flush());
@@ -566,7 +2076,7 @@ TEST_P(DBFlushTestBlobError, FlushError) {
566
2076
  SyncPoint::GetInstance()->DisableProcessing();
567
2077
  SyncPoint::GetInstance()->ClearAllCallBacks();
568
2078
 
569
- VersionSet* const versions = dbfull()->TEST_GetVersionSet();
2079
+ VersionSet* const versions = dbfull()->GetVersionSet();
570
2080
  assert(versions);
571
2081
 
572
2082
  ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
@@ -608,20 +2118,80 @@ TEST_P(DBFlushTestBlobError, FlushError) {
608
2118
 
609
2119
  if (sync_point_ == "BlobFileBuilder::WriteBlobToFile:AddRecord") {
610
2120
  ASSERT_EQ(compaction_stats[0].bytes_written, 0);
2121
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
611
2122
  ASSERT_EQ(compaction_stats[0].num_output_files, 0);
2123
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
612
2124
  } else {
613
2125
  // SST file writing succeeded; blob file writing failed (during Finish)
614
2126
  ASSERT_GT(compaction_stats[0].bytes_written, 0);
2127
+ ASSERT_EQ(compaction_stats[0].bytes_written_blob, 0);
615
2128
  ASSERT_EQ(compaction_stats[0].num_output_files, 1);
2129
+ ASSERT_EQ(compaction_stats[0].num_output_files_blob, 0);
616
2130
  }
617
2131
 
618
2132
  const uint64_t* const cf_stats_value = internal_stats->TEST_GetCFStatsValue();
619
2133
  ASSERT_EQ(cf_stats_value[InternalStats::BYTES_FLUSHED],
620
- compaction_stats[0].bytes_written);
2134
+ compaction_stats[0].bytes_written +
2135
+ compaction_stats[0].bytes_written_blob);
621
2136
  #endif // ROCKSDB_LITE
622
2137
  }
623
2138
 
624
2139
  #ifndef ROCKSDB_LITE
2140
+ TEST_F(DBFlushTest, TombstoneVisibleInSnapshot) {
2141
+ class SimpleTestFlushListener : public EventListener {
2142
+ public:
2143
+ explicit SimpleTestFlushListener(DBFlushTest* _test) : test_(_test) {}
2144
+ ~SimpleTestFlushListener() override {}
2145
+
2146
+ void OnFlushBegin(DB* db, const FlushJobInfo& info) override {
2147
+ ASSERT_EQ(static_cast<uint32_t>(0), info.cf_id);
2148
+
2149
+ ASSERT_OK(db->Delete(WriteOptions(), "foo"));
2150
+ snapshot_ = db->GetSnapshot();
2151
+ ASSERT_OK(db->Put(WriteOptions(), "foo", "value"));
2152
+
2153
+ auto* dbimpl = static_cast_with_check<DBImpl>(db);
2154
+ assert(dbimpl);
2155
+
2156
+ ColumnFamilyHandle* cfh = db->DefaultColumnFamily();
2157
+ auto* cfhi = static_cast_with_check<ColumnFamilyHandleImpl>(cfh);
2158
+ assert(cfhi);
2159
+ ASSERT_OK(dbimpl->TEST_SwitchMemtable(cfhi->cfd()));
2160
+ }
2161
+
2162
+ DBFlushTest* test_ = nullptr;
2163
+ const Snapshot* snapshot_ = nullptr;
2164
+ };
2165
+
2166
+ Options options = CurrentOptions();
2167
+ options.create_if_missing = true;
2168
+ auto* listener = new SimpleTestFlushListener(this);
2169
+ options.listeners.emplace_back(listener);
2170
+ DestroyAndReopen(options);
2171
+
2172
+ ASSERT_OK(db_->Put(WriteOptions(), "foo", "value0"));
2173
+
2174
+ ManagedSnapshot snapshot_guard(db_);
2175
+
2176
+ ColumnFamilyHandle* default_cf = db_->DefaultColumnFamily();
2177
+ ASSERT_OK(db_->Flush(FlushOptions(), default_cf));
2178
+
2179
+ const Snapshot* snapshot = listener->snapshot_;
2180
+ assert(snapshot);
2181
+
2182
+ ReadOptions read_opts;
2183
+ read_opts.snapshot = snapshot;
2184
+
2185
+ // Using snapshot should not see "foo".
2186
+ {
2187
+ std::string value;
2188
+ Status s = db_->Get(read_opts, "foo", &value);
2189
+ ASSERT_TRUE(s.IsNotFound());
2190
+ }
2191
+
2192
+ db_->ReleaseSnapshot(snapshot);
2193
+ }
2194
+
625
2195
  TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
626
2196
  Options options = CurrentOptions();
627
2197
  options.create_if_missing = true;
@@ -701,7 +2271,7 @@ TEST_P(DBAtomicFlushTest, ManualFlushUnder2PC) {
701
2271
 
702
2272
  // The recovered min log number with prepared data should be non-zero.
703
2273
  // In 2pc mode, MinLogNumberToKeep returns the
704
- // VersionSet::min_log_number_to_keep_2pc recovered from MANIFEST, if it's 0,
2274
+ // VersionSet::min_log_number_to_keep recovered from MANIFEST, if it's 0,
705
2275
  // it means atomic flush didn't write the min_log_number_to_keep to MANIFEST.
706
2276
  cfs.push_back(kDefaultColumnFamilyName);
707
2277
  ASSERT_OK(TryReopenWithColumnFamilies(cfs, options));
@@ -772,7 +2342,7 @@ TEST_P(DBAtomicFlushTest, PrecomputeMinLogNumberToKeepNon2PC) {
772
2342
  flush_edits.push_back({});
773
2343
  auto unflushed_cfh = static_cast<ColumnFamilyHandleImpl*>(handles_[1]);
774
2344
 
775
- ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->TEST_GetVersionSet(),
2345
+ ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
776
2346
  flushed_cfds, flush_edits),
777
2347
  unflushed_cfh->cfd()->GetLogNumber());
778
2348
  }
@@ -797,7 +2367,7 @@ TEST_P(DBAtomicFlushTest, PrecomputeMinLogNumberToKeepNon2PC) {
797
2367
  std::min(min_log_number_to_keep, cfh->cfd()->GetLogNumber());
798
2368
  }
799
2369
  ASSERT_EQ(min_log_number_to_keep, log_num_after_flush);
800
- ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->TEST_GetVersionSet(),
2370
+ ASSERT_EQ(PrecomputeMinLogNumberToKeepNon2PC(dbfull()->GetVersionSet(),
801
2371
  flushed_cfds, flush_edits),
802
2372
  min_log_number_to_keep);
803
2373
  }
@@ -986,7 +2556,7 @@ TEST_P(DBAtomicFlushTest, TriggerFlushAndClose) {
986
2556
  options.create_if_missing = true;
987
2557
  options.atomic_flush = atomic_flush;
988
2558
  options.memtable_factory.reset(
989
- new SpecialSkipListFactory(kNumKeysTriggerFlush));
2559
+ test::NewSpecialSkipListFactory(kNumKeysTriggerFlush));
990
2560
  CreateAndReopenWithCF({"pikachu"}, options);
991
2561
 
992
2562
  for (int i = 0; i != kNumKeysTriggerFlush; ++i) {
@@ -1105,6 +2675,122 @@ TEST_P(DBAtomicFlushTest, RollbackAfterFailToInstallResults) {
1105
2675
  SyncPoint::GetInstance()->ClearAllCallBacks();
1106
2676
  }
1107
2677
 
2678
+ // In atomic flush, concurrent bg flush threads commit to the MANIFEST in
2679
+ // serial, in the order of their picked memtables for each column family.
2680
+ // Only when a bg flush thread finds out that its memtables are the earliest
2681
+ // unflushed ones for all the included column families will this bg flush
2682
+ // thread continue to commit to MANIFEST.
2683
+ // This unit test uses sync point to coordinate the execution of two bg threads
2684
+ // executing the same sequence of functions. The interleaving are as follows.
2685
+ // time bg1 bg2
2686
+ // | pick memtables to flush
2687
+ // | flush memtables cf1_m1, cf2_m1
2688
+ // | join MANIFEST write queue
2689
+ // | pick memtabls to flush
2690
+ // | flush memtables cf1_(m1+1)
2691
+ // | join MANIFEST write queue
2692
+ // | wait to write MANIFEST
2693
+ // | write MANIFEST
2694
+ // | IO error
2695
+ // | detect IO error and stop waiting
2696
+ // V
2697
+ TEST_P(DBAtomicFlushTest, BgThreadNoWaitAfterManifestError) {
2698
+ bool atomic_flush = GetParam();
2699
+ if (!atomic_flush) {
2700
+ return;
2701
+ }
2702
+ auto fault_injection_env = std::make_shared<FaultInjectionTestEnv>(env_);
2703
+ Options options = GetDefaultOptions();
2704
+ options.create_if_missing = true;
2705
+ options.atomic_flush = true;
2706
+ options.env = fault_injection_env.get();
2707
+ // Set a larger value than default so that RocksDB can schedule concurrent
2708
+ // background flush threads.
2709
+ options.max_background_jobs = 8;
2710
+ options.max_write_buffer_number = 8;
2711
+ CreateAndReopenWithCF({"pikachu"}, options);
2712
+
2713
+ assert(2 == handles_.size());
2714
+
2715
+ WriteOptions write_opts;
2716
+ write_opts.disableWAL = true;
2717
+
2718
+ ASSERT_OK(Put(0, "a", "v_0_a", write_opts));
2719
+ ASSERT_OK(Put(1, "a", "v_1_a", write_opts));
2720
+
2721
+ SyncPoint::GetInstance()->DisableProcessing();
2722
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2723
+
2724
+ SyncPoint::GetInstance()->LoadDependency({
2725
+ {"BgFlushThr2:WaitToCommit", "BgFlushThr1:BeforeWriteManifest"},
2726
+ });
2727
+
2728
+ std::thread::id bg_flush_thr1, bg_flush_thr2;
2729
+ SyncPoint::GetInstance()->SetCallBack(
2730
+ "DBImpl::BackgroundCallFlush:start", [&](void*) {
2731
+ if (bg_flush_thr1 == std::thread::id()) {
2732
+ bg_flush_thr1 = std::this_thread::get_id();
2733
+ } else if (bg_flush_thr2 == std::thread::id()) {
2734
+ bg_flush_thr2 = std::this_thread::get_id();
2735
+ }
2736
+ });
2737
+
2738
+ int called = 0;
2739
+ SyncPoint::GetInstance()->SetCallBack(
2740
+ "DBImpl::AtomicFlushMemTablesToOutputFiles:WaitToCommit", [&](void* arg) {
2741
+ if (std::this_thread::get_id() == bg_flush_thr2) {
2742
+ const auto* ptr = reinterpret_cast<std::pair<Status, bool>*>(arg);
2743
+ assert(ptr);
2744
+ if (0 == called) {
2745
+ // When bg flush thread 2 reaches here for the first time.
2746
+ ASSERT_OK(ptr->first);
2747
+ ASSERT_TRUE(ptr->second);
2748
+ } else if (1 == called) {
2749
+ // When bg flush thread 2 reaches here for the second time.
2750
+ ASSERT_TRUE(ptr->first.IsIOError());
2751
+ ASSERT_FALSE(ptr->second);
2752
+ }
2753
+ ++called;
2754
+ TEST_SYNC_POINT("BgFlushThr2:WaitToCommit");
2755
+ }
2756
+ });
2757
+
2758
+ SyncPoint::GetInstance()->SetCallBack(
2759
+ "VersionSet::ProcessManifestWrites:BeforeWriteLastVersionEdit:0",
2760
+ [&](void*) {
2761
+ if (std::this_thread::get_id() == bg_flush_thr1) {
2762
+ TEST_SYNC_POINT("BgFlushThr1:BeforeWriteManifest");
2763
+ }
2764
+ });
2765
+
2766
+ SyncPoint::GetInstance()->SetCallBack(
2767
+ "VersionSet::LogAndApply:WriteManifest", [&](void*) {
2768
+ if (std::this_thread::get_id() != bg_flush_thr1) {
2769
+ return;
2770
+ }
2771
+ ASSERT_OK(db_->Put(write_opts, "b", "v_1_b"));
2772
+
2773
+ FlushOptions flush_opts;
2774
+ flush_opts.wait = false;
2775
+ std::vector<ColumnFamilyHandle*> cfhs(1, db_->DefaultColumnFamily());
2776
+ ASSERT_OK(dbfull()->Flush(flush_opts, cfhs));
2777
+ });
2778
+
2779
+ SyncPoint::GetInstance()->SetCallBack(
2780
+ "VersionSet::ProcessManifestWrites:AfterSyncManifest", [&](void* arg) {
2781
+ auto* ptr = reinterpret_cast<IOStatus*>(arg);
2782
+ assert(ptr);
2783
+ *ptr = IOStatus::IOError("Injected failure");
2784
+ });
2785
+ SyncPoint::GetInstance()->EnableProcessing();
2786
+
2787
+ ASSERT_TRUE(dbfull()->Flush(FlushOptions(), handles_).IsIOError());
2788
+
2789
+ Close();
2790
+ SyncPoint::GetInstance()->DisableProcessing();
2791
+ SyncPoint::GetInstance()->ClearAllCallBacks();
2792
+ }
2793
+
1108
2794
  INSTANTIATE_TEST_CASE_P(DBFlushDirectIOTest, DBFlushDirectIOTest,
1109
2795
  testing::Bool());
1110
2796