@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  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/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -11,6 +11,7 @@
11
11
 
12
12
  #include "db/blob/blob_index.h"
13
13
  #include "db/db_test_util.h"
14
+ #include "env/mock_env.h"
14
15
  #include "port/port.h"
15
16
  #include "port/stack_trace.h"
16
17
  #include "rocksdb/concurrent_task_limiter.h"
@@ -18,9 +19,11 @@
18
19
  #include "rocksdb/sst_file_writer.h"
19
20
  #include "rocksdb/utilities/convenience.h"
20
21
  #include "test_util/sync_point.h"
22
+ #include "test_util/testutil.h"
21
23
  #include "util/concurrent_task_limiter_impl.h"
22
24
  #include "util/random.h"
23
25
  #include "utilities/fault_injection_env.h"
26
+ #include "utilities/fault_injection_fs.h"
24
27
 
25
28
  namespace ROCKSDB_NAMESPACE {
26
29
 
@@ -30,32 +33,7 @@ namespace ROCKSDB_NAMESPACE {
30
33
  class DBCompactionTest : public DBTestBase {
31
34
  public:
32
35
  DBCompactionTest()
33
- : DBTestBase("/db_compaction_test", /*env_do_fsync=*/true) {}
34
-
35
- std::vector<uint64_t> GetBlobFileNumbers() {
36
- VersionSet* const versions = dbfull()->TEST_GetVersionSet();
37
- assert(versions);
38
-
39
- ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
40
- assert(cfd);
41
-
42
- Version* const current = cfd->current();
43
- assert(current);
44
-
45
- const VersionStorageInfo* const storage_info = current->storage_info();
46
- assert(storage_info);
47
-
48
- const auto& blob_files = storage_info->GetBlobFiles();
49
-
50
- std::vector<uint64_t> result;
51
- result.reserve(blob_files.size());
52
-
53
- for (const auto& blob_file : blob_files) {
54
- result.emplace_back(blob_file.first);
55
- }
56
-
57
- return result;
58
- }
36
+ : DBTestBase("db_compaction_test", /*env_do_fsync=*/true) {}
59
37
  };
60
38
 
61
39
  class DBCompactionTestWithParam
@@ -63,7 +41,7 @@ class DBCompactionTestWithParam
63
41
  public testing::WithParamInterface<std::tuple<uint32_t, bool>> {
64
42
  public:
65
43
  DBCompactionTestWithParam()
66
- : DBTestBase("/db_compaction_test", /*env_do_fsync=*/true) {
44
+ : DBTestBase("db_compaction_test", /*env_do_fsync=*/true) {
67
45
  max_subcompactions_ = std::get<0>(GetParam());
68
46
  exclusive_manual_compaction_ = std::get<1>(GetParam());
69
47
  }
@@ -81,7 +59,7 @@ class DBCompactionTestWithBottommostParam
81
59
  public testing::WithParamInterface<BottommostLevelCompaction> {
82
60
  public:
83
61
  DBCompactionTestWithBottommostParam()
84
- : DBTestBase("/db_compaction_test", /*env_do_fsync=*/true) {
62
+ : DBTestBase("db_compaction_test", /*env_do_fsync=*/true) {
85
63
  bottommost_level_compaction_ = GetParam();
86
64
  }
87
65
 
@@ -204,6 +182,7 @@ Options DeletionTriggerOptions(Options options) {
204
182
  options.target_file_size_base * options.target_file_size_multiplier;
205
183
  options.max_bytes_for_level_multiplier = 2;
206
184
  options.disable_auto_compactions = false;
185
+ options.compaction_options_universal.max_size_amplification_percent = 100;
207
186
  return options;
208
187
  }
209
188
 
@@ -323,7 +302,7 @@ const SstFileMetaData* PickFileRandomly(
323
302
  }
324
303
  } // anonymous namespace
325
304
 
326
- #ifndef ROCKSDB_VALGRIND_RUN
305
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
327
306
  // All the TEST_P tests run once with sub_compactions disabled (i.e.
328
307
  // options.max_subcompactions = 1) and once with it enabled
329
308
  TEST_P(DBCompactionTestWithParam, CompactionDeletionTrigger) {
@@ -358,98 +337,37 @@ TEST_P(DBCompactionTestWithParam, CompactionDeletionTrigger) {
358
337
  for (int k = 0; k < kTestSize; ++k) {
359
338
  ASSERT_OK(Delete(Key(k)));
360
339
  }
361
- ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
340
+ ASSERT_OK(Flush());
362
341
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
363
342
  ASSERT_OK(Size(Key(0), Key(kTestSize - 1), &db_size[1]));
364
343
 
365
- // must have much smaller db size.
366
- ASSERT_GT(db_size[0] / 3, db_size[1]);
367
- }
368
- }
369
- #endif // ROCKSDB_VALGRIND_RUN
370
-
371
- TEST_P(DBCompactionTestWithParam, CompactionsPreserveDeletes) {
372
- // For each options type we test following
373
- // - Enable preserve_deletes
374
- // - write bunch of keys and deletes
375
- // - Set start_seqnum to the beginning; compact; check that keys are present
376
- // - rewind start_seqnum way forward; compact; check that keys are gone
377
-
378
- for (int tid = 0; tid < 3; ++tid) {
379
- Options options = DeletionTriggerOptions(CurrentOptions());
380
- options.max_subcompactions = max_subcompactions_;
381
- options.preserve_deletes=true;
382
- options.num_levels = 2;
383
-
384
- if (tid == 1) {
385
- options.skip_stats_update_on_db_open = true;
386
- } else if (tid == 2) {
387
- // third pass with universal compaction
388
- options.compaction_style = kCompactionStyleUniversal;
389
- }
390
-
391
- DestroyAndReopen(options);
392
- Random rnd(301);
393
- // highlight the default; all deletes should be preserved
394
- SetPreserveDeletesSequenceNumber(0);
395
-
396
- const int kTestSize = kCDTKeysPerBuffer;
397
- std::vector<std::string> values;
398
- for (int k = 0; k < kTestSize; ++k) {
399
- values.push_back(rnd.RandomString(kCDTValueSize));
400
- ASSERT_OK(Put(Key(k), values[k]));
401
- }
402
-
403
- for (int k = 0; k < kTestSize; ++k) {
404
- ASSERT_OK(Delete(Key(k)));
405
- }
406
- // to ensure we tackle all tombstones
407
- CompactRangeOptions cro;
408
- cro.change_level = true;
409
- cro.target_level = 2;
410
- cro.bottommost_level_compaction =
411
- BottommostLevelCompaction::kForceOptimized;
412
-
413
- ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
414
- ASSERT_TRUE(
415
- dbfull()->CompactRange(cro, nullptr, nullptr).IsInvalidArgument());
416
-
417
- // check that normal user iterator doesn't see anything
418
- Iterator* db_iter = dbfull()->NewIterator(ReadOptions());
419
- int i = 0;
420
- for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
421
- i++;
422
- }
423
- ASSERT_OK(db_iter->status());
424
- ASSERT_EQ(i, 0);
425
- delete db_iter;
426
-
427
- // check that iterator that sees internal keys sees tombstones
428
- ReadOptions ro;
429
- ro.iter_start_seqnum=1;
430
- db_iter = dbfull()->NewIterator(ro);
431
- ASSERT_OK(db_iter->status());
432
- i = 0;
433
- for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
434
- i++;
435
- }
436
- ASSERT_EQ(i, 4);
437
- delete db_iter;
438
-
439
- // now all deletes should be gone
440
- SetPreserveDeletesSequenceNumber(100000000);
441
- ASSERT_NOK(dbfull()->CompactRange(cro, nullptr, nullptr));
442
-
443
- db_iter = dbfull()->NewIterator(ro);
444
- ASSERT_TRUE(db_iter->status().IsInvalidArgument());
445
- i = 0;
446
- for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
447
- i++;
344
+ if (options.compaction_style == kCompactionStyleUniversal) {
345
+ // Claim: in universal compaction none of the original data will remain
346
+ // once compactions settle.
347
+ //
348
+ // Proof: The compensated size of the file containing the most tombstones
349
+ // is enough on its own to trigger size amp compaction. Size amp
350
+ // compaction is a full compaction, so all tombstones meet the obsolete
351
+ // keys they cover.
352
+ ASSERT_EQ(0, db_size[1]);
353
+ } else {
354
+ // Claim: in level compaction at most `db_size[0] / 2` of the original
355
+ // data will remain once compactions settle.
356
+ //
357
+ // Proof: Assume the original data is all in the bottom level. If it were
358
+ // not, it would meet its tombstone sooner. The original data size is
359
+ // large enough to require fanout to bottom level to be greater than
360
+ // `max_bytes_for_level_multiplier == 2`. In the level just above,
361
+ // tombstones must cover less than `db_size[0] / 4` bytes since fanout >=
362
+ // 2 and file size is compensated by doubling the size of values we expect
363
+ // are covered (`kDeletionWeightOnCompaction == 2`). The tombstones in
364
+ // levels above must cover less than `db_size[0] / 8` bytes of original
365
+ // data, `db_size[0] / 16`, and so on.
366
+ ASSERT_GT(db_size[0] / 2, db_size[1]);
448
367
  }
449
- ASSERT_EQ(i, 0);
450
- delete db_iter;
451
368
  }
452
369
  }
370
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
453
371
 
454
372
  TEST_F(DBCompactionTest, SkipStatsUpdateTest) {
455
373
  // This test verify UpdateAccumulatedStats is not on
@@ -500,9 +418,12 @@ TEST_F(DBCompactionTest, SkipStatsUpdateTest) {
500
418
  TEST_F(DBCompactionTest, TestTableReaderForCompaction) {
501
419
  Options options = CurrentOptions();
502
420
  options.env = env_;
503
- options.new_table_reader_for_compaction_inputs = true;
504
421
  options.max_open_files = 20;
505
422
  options.level0_file_num_compaction_trigger = 3;
423
+ // Avoid many shards with small max_open_files, where as little as
424
+ // two table insertions could lead to an LRU eviction, depending on
425
+ // hash values.
426
+ options.table_cache_numshardbits = 2;
506
427
  DestroyAndReopen(options);
507
428
  Random rnd(301);
508
429
 
@@ -630,9 +551,8 @@ TEST_P(DBCompactionTestWithParam, CompactionDeletionTriggerReopen) {
630
551
  }
631
552
  ASSERT_OK(Size(Key(0), Key(kTestSize - 1), &db_size[1]));
632
553
  Close();
633
- // as auto_compaction is off, we shouldn't see too much reduce
634
- // in db size.
635
- ASSERT_LT(db_size[0] / 3, db_size[1]);
554
+ // as auto_compaction is off, we shouldn't see any reduction in db size.
555
+ ASSERT_LE(db_size[0], db_size[1]);
636
556
 
637
557
  // round 3 --- reopen db with auto_compaction on and see if
638
558
  // deletion compensation still work.
@@ -646,7 +566,13 @@ TEST_P(DBCompactionTestWithParam, CompactionDeletionTriggerReopen) {
646
566
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
647
567
  ASSERT_OK(Size(Key(0), Key(kTestSize - 1), &db_size[2]));
648
568
  // this time we're expecting significant drop in size.
649
- ASSERT_GT(db_size[0] / 3, db_size[2]);
569
+ //
570
+ // See "CompactionDeletionTrigger" test for proof that at most
571
+ // `db_size[0] / 2` of the original data remains. In addition to that, this
572
+ // test inserts `db_size[0] / 10` to push the tombstones into SST files and
573
+ // then through automatic compactions. So in total `3 * db_size[0] / 5` of
574
+ // the original data may remain.
575
+ ASSERT_GT(3 * db_size[0] / 5, db_size[2]);
650
576
  }
651
577
  }
652
578
 
@@ -733,8 +659,15 @@ TEST_F(DBCompactionTest, DisableStatsUpdateReopen) {
733
659
  values.push_back(rnd.RandomString(kCDTValueSize));
734
660
  ASSERT_OK(Put(Key(k), values[k]));
735
661
  }
736
- ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
662
+ ASSERT_OK(Flush());
737
663
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
664
+ // L1 and L2 can fit deletions iff size compensation does not take effect,
665
+ // i.e., when `skip_stats_update_on_db_open == true`. Move any remaining
666
+ // files at or above L2 down to L3 to ensure obsolete data does not
667
+ // accidentally meet its tombstone above L3. This makes the final size more
668
+ // deterministic and easy to see whether size compensation for deletions
669
+ // took effect.
670
+ MoveFilesToLevel(3 /* level */);
738
671
  ASSERT_OK(Size(Key(0), Key(kTestSize - 1), &db_size[0]));
739
672
  Close();
740
673
 
@@ -750,9 +683,8 @@ TEST_F(DBCompactionTest, DisableStatsUpdateReopen) {
750
683
  }
751
684
  ASSERT_OK(Size(Key(0), Key(kTestSize - 1), &db_size[1]));
752
685
  Close();
753
- // as auto_compaction is off, we shouldn't see too much reduce
754
- // in db size.
755
- ASSERT_LT(db_size[0] / 3, db_size[1]);
686
+ // as auto_compaction is off, we shouldn't see any reduction in db size.
687
+ ASSERT_LE(db_size[0], db_size[1]);
756
688
 
757
689
  // round 3 --- reopen db with auto_compaction on and see if
758
690
  // deletion compensation still work.
@@ -765,10 +697,17 @@ TEST_F(DBCompactionTest, DisableStatsUpdateReopen) {
765
697
  if (options.skip_stats_update_on_db_open) {
766
698
  // If update stats on DB::Open is disable, we don't expect
767
699
  // deletion entries taking effect.
768
- ASSERT_LT(db_size[0] / 3, db_size[2]);
700
+ //
701
+ // The deletions are small enough to fit in L1 and L2, and obsolete keys
702
+ // were moved to L3+, so none of the original data should have been
703
+ // dropped.
704
+ ASSERT_LE(db_size[0], db_size[2]);
769
705
  } else {
770
706
  // Otherwise, we should see a significant drop in db size.
771
- ASSERT_GT(db_size[0] / 3, db_size[2]);
707
+ //
708
+ // See "CompactionDeletionTrigger" test for proof that at most
709
+ // `db_size[0] / 2` of the original data remains.
710
+ ASSERT_GT(db_size[0] / 2, db_size[2]);
772
711
  }
773
712
  }
774
713
  }
@@ -783,7 +722,8 @@ TEST_P(DBCompactionTestWithParam, CompactionTrigger) {
783
722
  options.num_levels = 3;
784
723
  options.level0_file_num_compaction_trigger = 3;
785
724
  options.max_subcompactions = max_subcompactions_;
786
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
725
+ options.memtable_factory.reset(
726
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
787
727
  CreateAndReopenWithCF({"pikachu"}, options);
788
728
 
789
729
  Random rnd(301);
@@ -830,7 +770,8 @@ TEST_F(DBCompactionTest, BGCompactionsAllowed) {
830
770
  options.level0_slowdown_writes_trigger = 20;
831
771
  options.soft_pending_compaction_bytes_limit = 1 << 30; // Infinitely large
832
772
  options.max_background_compactions = 3;
833
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
773
+ options.memtable_factory.reset(
774
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
834
775
 
835
776
  // Block all threads in thread pool.
836
777
  const size_t kTotalTasks = 4;
@@ -1413,6 +1354,74 @@ TEST_P(DBCompactionTestWithParam, TrivialMoveTargetLevel) {
1413
1354
  }
1414
1355
  }
1415
1356
 
1357
+ TEST_P(DBCompactionTestWithParam, PartialOverlappingL0) {
1358
+ class SubCompactionEventListener : public EventListener {
1359
+ public:
1360
+ void OnSubcompactionCompleted(const SubcompactionJobInfo&) override {
1361
+ sub_compaction_finished_++;
1362
+ }
1363
+ std::atomic<int> sub_compaction_finished_{0};
1364
+ };
1365
+
1366
+ Options options = CurrentOptions();
1367
+ options.disable_auto_compactions = true;
1368
+ options.write_buffer_size = 10 * 1024 * 1024;
1369
+ options.max_subcompactions = max_subcompactions_;
1370
+ SubCompactionEventListener* listener = new SubCompactionEventListener();
1371
+ options.listeners.emplace_back(listener);
1372
+
1373
+ DestroyAndReopen(options);
1374
+
1375
+ // For subcompactino to trigger, output level needs to be non-empty.
1376
+ ASSERT_OK(Put("key", ""));
1377
+ ASSERT_OK(Put("kez", ""));
1378
+ ASSERT_OK(Flush());
1379
+ ASSERT_OK(Put("key", ""));
1380
+ ASSERT_OK(Put("kez", ""));
1381
+ ASSERT_OK(Flush());
1382
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1383
+
1384
+ // Ranges that are only briefly overlapping so that they won't be trivially
1385
+ // moved but subcompaction ranges would only contain a subset of files.
1386
+ std::vector<std::pair<int32_t, int32_t>> ranges = {
1387
+ {100, 199}, {198, 399}, {397, 600}, {598, 800}, {799, 900}, {895, 999},
1388
+ };
1389
+ int32_t value_size = 10 * 1024; // 10 KB
1390
+
1391
+ Random rnd(301);
1392
+ std::map<int32_t, std::string> values;
1393
+ for (size_t i = 0; i < ranges.size(); i++) {
1394
+ for (int32_t j = ranges[i].first; j <= ranges[i].second; j++) {
1395
+ values[j] = rnd.RandomString(value_size);
1396
+ ASSERT_OK(Put(Key(j), values[j]));
1397
+ }
1398
+ ASSERT_OK(Flush());
1399
+ }
1400
+
1401
+ int32_t level0_files = NumTableFilesAtLevel(0, 0);
1402
+ ASSERT_EQ(level0_files, ranges.size()); // Multiple files in L0
1403
+ ASSERT_EQ(NumTableFilesAtLevel(1, 0), 1); // One file in L1
1404
+
1405
+ listener->sub_compaction_finished_ = 0;
1406
+ ASSERT_OK(db_->EnableAutoCompaction({db_->DefaultColumnFamily()}));
1407
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1408
+ if (max_subcompactions_ > 3) {
1409
+ // RocksDB might not generate the exact number of sub compactions.
1410
+ // Here we validate that at least subcompaction happened.
1411
+ ASSERT_GT(listener->sub_compaction_finished_.load(), 2);
1412
+ }
1413
+
1414
+ // We expect that all the files were compacted to L1
1415
+ ASSERT_EQ(NumTableFilesAtLevel(0, 0), 0);
1416
+ ASSERT_GT(NumTableFilesAtLevel(1, 0), 1);
1417
+
1418
+ for (size_t i = 0; i < ranges.size(); i++) {
1419
+ for (int32_t j = ranges[i].first; j <= ranges[i].second; j++) {
1420
+ ASSERT_EQ(Get(Key(j)), values[j]);
1421
+ }
1422
+ }
1423
+ }
1424
+
1416
1425
  TEST_P(DBCompactionTestWithParam, ManualCompactionPartial) {
1417
1426
  int32_t trivial_move = 0;
1418
1427
  int32_t non_trivial_move = 0;
@@ -2072,7 +2081,7 @@ TEST_P(DBCompactionTestWithParam, LevelCompactionThirdPath) {
2072
2081
  options.db_paths.emplace_back(dbname_ + "_2", 4 * 1024 * 1024);
2073
2082
  options.db_paths.emplace_back(dbname_ + "_3", 1024 * 1024 * 1024);
2074
2083
  options.memtable_factory.reset(
2075
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2084
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2076
2085
  options.compaction_style = kCompactionStyleLevel;
2077
2086
  options.write_buffer_size = 110 << 10; // 110KB
2078
2087
  options.arena_block_size = 4 << 10;
@@ -2181,7 +2190,7 @@ TEST_P(DBCompactionTestWithParam, LevelCompactionPathUse) {
2181
2190
  options.db_paths.emplace_back(dbname_ + "_2", 4 * 1024 * 1024);
2182
2191
  options.db_paths.emplace_back(dbname_ + "_3", 1024 * 1024 * 1024);
2183
2192
  options.memtable_factory.reset(
2184
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2193
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2185
2194
  options.compaction_style = kCompactionStyleLevel;
2186
2195
  options.write_buffer_size = 110 << 10; // 110KB
2187
2196
  options.arena_block_size = 4 << 10;
@@ -2291,7 +2300,7 @@ TEST_P(DBCompactionTestWithParam, LevelCompactionCFPathUse) {
2291
2300
  options.db_paths.emplace_back(dbname_ + "_2", 4 * 1024 * 1024);
2292
2301
  options.db_paths.emplace_back(dbname_ + "_3", 1024 * 1024 * 1024);
2293
2302
  options.memtable_factory.reset(
2294
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2303
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2295
2304
  options.compaction_style = kCompactionStyleLevel;
2296
2305
  options.write_buffer_size = 110 << 10; // 110KB
2297
2306
  options.arena_block_size = 4 << 10;
@@ -2310,7 +2319,7 @@ TEST_P(DBCompactionTestWithParam, LevelCompactionCFPathUse) {
2310
2319
  option_vector.emplace_back(DBOptions(options), cf_opt1);
2311
2320
  CreateColumnFamilies({"one"},option_vector[1]);
2312
2321
 
2313
- // Configura CF2 specific paths.
2322
+ // Configure CF2 specific paths.
2314
2323
  cf_opt2.cf_paths.emplace_back(dbname_ + "cf2", 500 * 1024);
2315
2324
  cf_opt2.cf_paths.emplace_back(dbname_ + "cf2_2", 4 * 1024 * 1024);
2316
2325
  cf_opt2.cf_paths.emplace_back(dbname_ + "cf2_3", 1024 * 1024 * 1024);
@@ -2365,13 +2374,16 @@ TEST_P(DBCompactionTestWithParam, LevelCompactionCFPathUse) {
2365
2374
  // Check that default column family uses db_paths.
2366
2375
  // And Column family "one" uses cf_paths.
2367
2376
 
2368
- // First three 110KB files are not going to second path.
2369
- // After that, (100K, 200K)
2377
+ // The compaction in level0 outputs the sst files in level1.
2378
+ // The first path cannot hold level1's data(400KB+400KB > 500KB),
2379
+ // so every compaction move a sst file to second path. Please
2380
+ // refer to LevelCompactionBuilder::GetPathId.
2370
2381
  for (int num = 0; num < 3; num++) {
2371
2382
  generate_file();
2372
2383
  }
2384
+ check_sstfilecount(0, 1);
2385
+ check_sstfilecount(1, 2);
2373
2386
 
2374
- // Another 110KB triggers a compaction to 400K file to fill up first path
2375
2387
  generate_file();
2376
2388
  check_sstfilecount(1, 3);
2377
2389
 
@@ -2987,7 +2999,7 @@ TEST_P(DBCompactionTestWithParam, CompressLevelCompaction) {
2987
2999
  }
2988
3000
  Options options = CurrentOptions();
2989
3001
  options.memtable_factory.reset(
2990
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
3002
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
2991
3003
  options.compaction_style = kCompactionStyleLevel;
2992
3004
  options.write_buffer_size = 110 << 10; // 110KB
2993
3005
  options.arena_block_size = 4 << 10;
@@ -3578,6 +3590,41 @@ TEST_F(DBCompactionTest, CompactFilesOverlapInL0Bug) {
3578
3590
  ASSERT_EQ("new_val", Get(Key(0)));
3579
3591
  }
3580
3592
 
3593
+ TEST_F(DBCompactionTest, DeleteFilesInRangeConflictWithCompaction) {
3594
+ Options options = CurrentOptions();
3595
+ DestroyAndReopen(options);
3596
+ const Snapshot* snapshot = nullptr;
3597
+ const int kMaxKey = 10;
3598
+
3599
+ for (int i = 0; i < kMaxKey; i++) {
3600
+ ASSERT_OK(Put(Key(i), Key(i)));
3601
+ ASSERT_OK(Delete(Key(i)));
3602
+ if (!snapshot) {
3603
+ snapshot = db_->GetSnapshot();
3604
+ }
3605
+ }
3606
+ ASSERT_OK(Flush());
3607
+ MoveFilesToLevel(1);
3608
+ ASSERT_OK(Put(Key(kMaxKey), Key(kMaxKey)));
3609
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
3610
+ // test DeleteFilesInRange() deletes the files already picked for compaction
3611
+ SyncPoint::GetInstance()->LoadDependency(
3612
+ {{"VersionSet::LogAndApply:WriteManifestStart",
3613
+ "BackgroundCallCompaction:0"},
3614
+ {"DBImpl::BackgroundCompaction:Finish",
3615
+ "VersionSet::LogAndApply:WriteManifestDone"}});
3616
+ SyncPoint::GetInstance()->EnableProcessing();
3617
+
3618
+ // release snapshot which mark bottommost file for compaction
3619
+ db_->ReleaseSnapshot(snapshot);
3620
+ std::string begin_string = Key(0);
3621
+ std::string end_string = Key(kMaxKey + 1);
3622
+ Slice begin(begin_string);
3623
+ Slice end(end_string);
3624
+ ASSERT_OK(DeleteFilesInRange(db_, db_->DefaultColumnFamily(), &begin, &end));
3625
+ SyncPoint::GetInstance()->DisableProcessing();
3626
+ }
3627
+
3581
3628
  TEST_F(DBCompactionTest, CompactBottomLevelFilesWithDeletions) {
3582
3629
  // bottom-level files may contain deletions due to snapshots protecting the
3583
3630
  // deleted keys. Once the snapshot is released, we should see files with many
@@ -4239,6 +4286,67 @@ TEST_F(DBCompactionTest, LevelPeriodicAndTtlCompaction) {
4239
4286
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
4240
4287
  }
4241
4288
 
4289
+ TEST_F(DBCompactionTest, LevelTtlBooster) {
4290
+ const int kNumKeysPerFile = 32;
4291
+ const int kNumLevelFiles = 3;
4292
+ const int kValueSize = 1000;
4293
+
4294
+ Options options = CurrentOptions();
4295
+ options.ttl = 10 * 60 * 60; // 10 hours
4296
+ options.periodic_compaction_seconds = 480 * 60 * 60; // very long
4297
+ options.level0_file_num_compaction_trigger = 2;
4298
+ options.max_bytes_for_level_base = 5 * uint64_t{kNumKeysPerFile * kValueSize};
4299
+ options.max_open_files = -1; // needed for both periodic and ttl compactions
4300
+ options.compaction_pri = CompactionPri::kMinOverlappingRatio;
4301
+ env_->SetMockSleep();
4302
+ options.env = env_;
4303
+
4304
+ // NOTE: Presumed unnecessary and removed: resetting mock time in env
4305
+
4306
+ DestroyAndReopen(options);
4307
+
4308
+ Random rnd(301);
4309
+ for (int i = 0; i < kNumLevelFiles; ++i) {
4310
+ for (int j = 0; j < kNumKeysPerFile; ++j) {
4311
+ ASSERT_OK(
4312
+ Put(Key(i * kNumKeysPerFile + j), rnd.RandomString(kValueSize)));
4313
+ }
4314
+ ASSERT_OK(Flush());
4315
+ }
4316
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
4317
+
4318
+ MoveFilesToLevel(2);
4319
+
4320
+ ASSERT_EQ("0,0,3", FilesPerLevel());
4321
+
4322
+ // Create some files for L1
4323
+ for (int i = 0; i < 2; i++) {
4324
+ for (int j = 0; j < kNumKeysPerFile; ++j) {
4325
+ ASSERT_OK(Put(Key(2 * j + i), rnd.RandomString(kValueSize)));
4326
+ }
4327
+ ASSERT_OK(Flush());
4328
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
4329
+ }
4330
+
4331
+ ASSERT_EQ("0,1,3", FilesPerLevel());
4332
+
4333
+ // Make the new L0 files qualify TTL boosting and generate one more to trigger
4334
+ // L1 -> L2 compaction. Old files will be picked even if their priority is
4335
+ // lower without boosting.
4336
+ env_->MockSleepForSeconds(8 * 60 * 60);
4337
+ for (int i = 0; i < 2; i++) {
4338
+ for (int j = 0; j < kNumKeysPerFile; ++j) {
4339
+ ASSERT_OK(Put(Key(kNumKeysPerFile * 2 + 2 * j + i),
4340
+ rnd.RandomString(kValueSize * 2)));
4341
+ }
4342
+ ASSERT_OK(Flush());
4343
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
4344
+ }
4345
+ ASSERT_EQ("0,1,2", FilesPerLevel());
4346
+
4347
+ ASSERT_GT(SizeAtLevel(1), kNumKeysPerFile * 4 * kValueSize);
4348
+ }
4349
+
4242
4350
  TEST_F(DBCompactionTest, LevelPeriodicCompactionWithCompactionFilters) {
4243
4351
  class TestCompactionFilter : public CompactionFilter {
4244
4352
  const char* Name() const override { return "TestCompactionFilter"; }
@@ -4631,6 +4739,98 @@ TEST_F(DBCompactionTest, CompactionStatsTest) {
4631
4739
  VerifyCompactionStats(*cfd, *collector);
4632
4740
  }
4633
4741
 
4742
+ TEST_F(DBCompactionTest, SubcompactionEvent) {
4743
+ class SubCompactionEventListener : public EventListener {
4744
+ public:
4745
+ void OnCompactionBegin(DB* /*db*/, const CompactionJobInfo& ci) override {
4746
+ InstrumentedMutexLock l(&mutex_);
4747
+ ASSERT_EQ(running_compactions_.find(ci.job_id),
4748
+ running_compactions_.end());
4749
+ running_compactions_.emplace(ci.job_id, std::unordered_set<int>());
4750
+ }
4751
+
4752
+ void OnCompactionCompleted(DB* /*db*/,
4753
+ const CompactionJobInfo& ci) override {
4754
+ InstrumentedMutexLock l(&mutex_);
4755
+ auto it = running_compactions_.find(ci.job_id);
4756
+ ASSERT_NE(it, running_compactions_.end());
4757
+ ASSERT_EQ(it->second.size(), 0);
4758
+ running_compactions_.erase(it);
4759
+ }
4760
+
4761
+ void OnSubcompactionBegin(const SubcompactionJobInfo& si) override {
4762
+ InstrumentedMutexLock l(&mutex_);
4763
+ auto it = running_compactions_.find(si.job_id);
4764
+ ASSERT_NE(it, running_compactions_.end());
4765
+ auto r = it->second.insert(si.subcompaction_job_id);
4766
+ ASSERT_TRUE(r.second); // each subcompaction_job_id should be different
4767
+ total_subcompaction_cnt_++;
4768
+ }
4769
+
4770
+ void OnSubcompactionCompleted(const SubcompactionJobInfo& si) override {
4771
+ InstrumentedMutexLock l(&mutex_);
4772
+ auto it = running_compactions_.find(si.job_id);
4773
+ ASSERT_NE(it, running_compactions_.end());
4774
+ auto r = it->second.erase(si.subcompaction_job_id);
4775
+ ASSERT_EQ(r, 1);
4776
+ }
4777
+
4778
+ size_t GetRunningCompactionCount() {
4779
+ InstrumentedMutexLock l(&mutex_);
4780
+ return running_compactions_.size();
4781
+ }
4782
+
4783
+ size_t GetTotalSubcompactionCount() {
4784
+ InstrumentedMutexLock l(&mutex_);
4785
+ return total_subcompaction_cnt_;
4786
+ }
4787
+
4788
+ private:
4789
+ InstrumentedMutex mutex_;
4790
+ std::unordered_map<int, std::unordered_set<int>> running_compactions_;
4791
+ size_t total_subcompaction_cnt_ = 0;
4792
+ };
4793
+
4794
+ Options options = CurrentOptions();
4795
+ options.target_file_size_base = 1024;
4796
+ options.level0_file_num_compaction_trigger = 10;
4797
+ auto* listener = new SubCompactionEventListener();
4798
+ options.listeners.emplace_back(listener);
4799
+
4800
+ DestroyAndReopen(options);
4801
+
4802
+ // generate 4 files @ L2
4803
+ for (int i = 0; i < 4; i++) {
4804
+ for (int j = 0; j < 10; j++) {
4805
+ int key_id = i * 10 + j;
4806
+ ASSERT_OK(Put(Key(key_id), "value" + ToString(key_id)));
4807
+ }
4808
+ ASSERT_OK(Flush());
4809
+ }
4810
+ MoveFilesToLevel(2);
4811
+
4812
+ // generate 2 files @ L1 which overlaps with L2 files
4813
+ for (int i = 0; i < 2; i++) {
4814
+ for (int j = 0; j < 10; j++) {
4815
+ int key_id = i * 20 + j * 2;
4816
+ ASSERT_OK(Put(Key(key_id), "value" + ToString(key_id)));
4817
+ }
4818
+ ASSERT_OK(Flush());
4819
+ }
4820
+ MoveFilesToLevel(1);
4821
+ ASSERT_EQ(FilesPerLevel(), "0,2,4");
4822
+
4823
+ CompactRangeOptions comp_opts;
4824
+ comp_opts.max_subcompactions = 4;
4825
+ Status s = dbfull()->CompactRange(comp_opts, nullptr, nullptr);
4826
+ ASSERT_OK(s);
4827
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
4828
+ // make sure there's no running compaction
4829
+ ASSERT_EQ(listener->GetRunningCompactionCount(), 0);
4830
+ // and sub compaction is triggered
4831
+ ASSERT_GT(listener->GetTotalSubcompactionCount(), 0);
4832
+ }
4833
+
4634
4834
  TEST_F(DBCompactionTest, CompactFilesOutputRangeConflict) {
4635
4835
  // LSM setup:
4636
4836
  // L1: [ba bz]
@@ -4755,7 +4955,8 @@ TEST_F(DBCompactionTest, CompactionLimiter) {
4755
4955
  options.level0_slowdown_writes_trigger = 64;
4756
4956
  options.level0_stop_writes_trigger = 64;
4757
4957
  options.max_background_jobs = kMaxBackgroundThreads; // Enough threads
4758
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
4958
+ options.memtable_factory.reset(
4959
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
4759
4960
  options.max_write_buffer_number = 10; // Enough memtables
4760
4961
  DestroyAndReopen(options);
4761
4962
 
@@ -4915,7 +5116,7 @@ TEST_P(DBCompactionDirectIOTest, DirectIO) {
4915
5116
  options.create_if_missing = true;
4916
5117
  options.disable_auto_compactions = true;
4917
5118
  options.use_direct_io_for_flush_and_compaction = GetParam();
4918
- options.env = new MockEnv(Env::Default());
5119
+ options.env = MockEnv::Create(Env::Default());
4919
5120
  Reopen(options);
4920
5121
  bool readahead = false;
4921
5122
  SyncPoint::GetInstance()->SetCallBack(
@@ -4948,7 +5149,7 @@ class CompactionPriTest : public DBTestBase,
4948
5149
  public testing::WithParamInterface<uint32_t> {
4949
5150
  public:
4950
5151
  CompactionPriTest()
4951
- : DBTestBase("/compaction_pri_test", /*env_do_fsync=*/true) {
5152
+ : DBTestBase("compaction_pri_test", /*env_do_fsync=*/true) {
4952
5153
  compaction_pri_ = GetParam();
4953
5154
  }
4954
5155
 
@@ -5131,6 +5332,97 @@ TEST_F(DBCompactionTest, ManualCompactionBottomLevelOptimized) {
5131
5332
  ASSERT_EQ(num, 0);
5132
5333
  }
5133
5334
 
5335
+ TEST_F(DBCompactionTest, ManualCompactionMax) {
5336
+ uint64_t l1_avg_size = 0, l2_avg_size = 0;
5337
+ auto generate_sst_func = [&]() {
5338
+ Random rnd(301);
5339
+ for (auto i = 0; i < 100; i++) {
5340
+ for (auto j = 0; j < 10; j++) {
5341
+ ASSERT_OK(Put(Key(i * 10 + j), rnd.RandomString(1024)));
5342
+ }
5343
+ ASSERT_OK(Flush());
5344
+ }
5345
+ MoveFilesToLevel(2);
5346
+
5347
+ for (auto i = 0; i < 10; i++) {
5348
+ for (auto j = 0; j < 10; j++) {
5349
+ ASSERT_OK(Put(Key(i * 100 + j * 10), rnd.RandomString(1024)));
5350
+ }
5351
+ ASSERT_OK(Flush());
5352
+ }
5353
+ MoveFilesToLevel(1);
5354
+
5355
+ std::vector<std::vector<FileMetaData>> level_to_files;
5356
+ dbfull()->TEST_GetFilesMetaData(dbfull()->DefaultColumnFamily(),
5357
+ &level_to_files);
5358
+
5359
+ uint64_t total = 0;
5360
+ for (const auto& file : level_to_files[1]) {
5361
+ total += file.compensated_file_size;
5362
+ }
5363
+ l1_avg_size = total / level_to_files[1].size();
5364
+
5365
+ total = 0;
5366
+ for (const auto& file : level_to_files[2]) {
5367
+ total += file.compensated_file_size;
5368
+ }
5369
+ l2_avg_size = total / level_to_files[2].size();
5370
+ };
5371
+
5372
+ std::atomic_int num_compactions(0);
5373
+ SyncPoint::GetInstance()->SetCallBack(
5374
+ "DBImpl::BGWorkCompaction", [&](void* /*arg*/) { ++num_compactions; });
5375
+ SyncPoint::GetInstance()->EnableProcessing();
5376
+
5377
+ Options opts = CurrentOptions();
5378
+ opts.disable_auto_compactions = true;
5379
+
5380
+ // with default setting (1.6G by default), it should cover all files in 1
5381
+ // compaction
5382
+ DestroyAndReopen(opts);
5383
+ generate_sst_func();
5384
+ num_compactions.store(0);
5385
+ CompactRangeOptions cro;
5386
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
5387
+ ASSERT_TRUE(num_compactions.load() == 1);
5388
+
5389
+ // split the compaction to 5
5390
+ int num_split = 5;
5391
+ DestroyAndReopen(opts);
5392
+ generate_sst_func();
5393
+ uint64_t total_size = (l1_avg_size * 10) + (l2_avg_size * 100);
5394
+ opts.max_compaction_bytes = total_size / num_split;
5395
+ opts.target_file_size_base = total_size / num_split;
5396
+ Reopen(opts);
5397
+ num_compactions.store(0);
5398
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
5399
+ ASSERT_TRUE(num_compactions.load() == num_split);
5400
+
5401
+ // very small max_compaction_bytes, it should still move forward
5402
+ opts.max_compaction_bytes = l1_avg_size / 2;
5403
+ opts.target_file_size_base = l1_avg_size / 2;
5404
+ DestroyAndReopen(opts);
5405
+ generate_sst_func();
5406
+ num_compactions.store(0);
5407
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
5408
+ ASSERT_TRUE(num_compactions.load() > 10);
5409
+
5410
+ // dynamically set the option
5411
+ num_split = 2;
5412
+ opts.max_compaction_bytes = 0;
5413
+ DestroyAndReopen(opts);
5414
+ generate_sst_func();
5415
+ total_size = (l1_avg_size * 10) + (l2_avg_size * 100);
5416
+ Status s = db_->SetOptions(
5417
+ {{"max_compaction_bytes", std::to_string(total_size / num_split)},
5418
+ {"target_file_size_base", std::to_string(total_size / num_split)}});
5419
+ ASSERT_OK(s);
5420
+
5421
+ num_compactions.store(0);
5422
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
5423
+ ASSERT_TRUE(num_compactions.load() == num_split);
5424
+ }
5425
+
5134
5426
  TEST_F(DBCompactionTest, CompactionDuringShutdown) {
5135
5427
  Options opts = CurrentOptions();
5136
5428
  opts.level0_file_num_compaction_trigger = 2;
@@ -5190,7 +5482,8 @@ TEST_P(DBCompactionTestWithParam, FixFileIngestionCompactionDeadlock) {
5190
5482
  options.level0_file_num_compaction_trigger =
5191
5483
  options.level0_stop_writes_trigger;
5192
5484
  options.max_subcompactions = max_subcompactions_;
5193
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
5485
+ options.memtable_factory.reset(
5486
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
5194
5487
  DestroyAndReopen(options);
5195
5488
  Random rnd(301);
5196
5489
 
@@ -5716,7 +6009,7 @@ TEST_F(DBCompactionTest, ChangeLevelCompactRangeConflictsWithManual) {
5716
6009
  // `Status::Incomplete`.
5717
6010
  Options options = CurrentOptions();
5718
6011
  options.memtable_factory.reset(
5719
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
6012
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
5720
6013
  options.level0_file_num_compaction_trigger = 2;
5721
6014
  options.num_levels = 3;
5722
6015
  Reopen(options);
@@ -5804,7 +6097,7 @@ TEST_F(DBCompactionTest, ChangeLevelErrorPathTest) {
5804
6097
  // succeeds
5805
6098
  Options options = CurrentOptions();
5806
6099
  options.memtable_factory.reset(
5807
- new SpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
6100
+ test::NewSpecialSkipListFactory(KNumKeysByGenerateNewFile - 1));
5808
6101
  options.level0_file_num_compaction_trigger = 2;
5809
6102
  options.num_levels = 3;
5810
6103
  Reopen(options);
@@ -5910,7 +6203,7 @@ TEST_F(DBCompactionTest, CompactionWithBlob) {
5910
6203
  ASSERT_EQ(Get(first_key), third_value);
5911
6204
  ASSERT_EQ(Get(second_key), third_value);
5912
6205
 
5913
- VersionSet* const versions = dbfull()->TEST_GetVersionSet();
6206
+ VersionSet* const versions = dbfull()->GetVersionSet();
5914
6207
  assert(versions);
5915
6208
 
5916
6209
  ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
@@ -5931,7 +6224,7 @@ TEST_F(DBCompactionTest, CompactionWithBlob) {
5931
6224
  const auto& blob_files = storage_info->GetBlobFiles();
5932
6225
  ASSERT_EQ(blob_files.size(), 1);
5933
6226
 
5934
- const auto& blob_file = blob_files.begin()->second;
6227
+ const auto& blob_file = blob_files.front();
5935
6228
  ASSERT_NE(blob_file, nullptr);
5936
6229
 
5937
6230
  ASSERT_EQ(table_file->smallest.user_key(), first_key);
@@ -5944,24 +6237,22 @@ TEST_F(DBCompactionTest, CompactionWithBlob) {
5944
6237
  const InternalStats* const internal_stats = cfd->internal_stats();
5945
6238
  ASSERT_NE(internal_stats, nullptr);
5946
6239
 
5947
- const uint64_t expected_bytes =
5948
- table_file->fd.GetFileSize() + blob_file->GetTotalBlobBytes();
5949
-
5950
6240
  const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
5951
6241
  ASSERT_GE(compaction_stats.size(), 2);
5952
- ASSERT_EQ(compaction_stats[1].bytes_written, expected_bytes);
5953
- ASSERT_EQ(compaction_stats[1].num_output_files, 2);
6242
+ ASSERT_EQ(compaction_stats[1].bytes_read_blob, 0);
6243
+ ASSERT_EQ(compaction_stats[1].bytes_written, table_file->fd.GetFileSize());
6244
+ ASSERT_EQ(compaction_stats[1].bytes_written_blob,
6245
+ blob_file->GetTotalBlobBytes());
6246
+ ASSERT_EQ(compaction_stats[1].num_output_files, 1);
6247
+ ASSERT_EQ(compaction_stats[1].num_output_files_blob, 1);
5954
6248
  }
5955
6249
 
5956
6250
  class DBCompactionTestBlobError
5957
6251
  : public DBCompactionTest,
5958
6252
  public testing::WithParamInterface<std::string> {
5959
6253
  public:
5960
- DBCompactionTestBlobError()
5961
- : fault_injection_env_(env_), sync_point_(GetParam()) {}
5962
- ~DBCompactionTestBlobError() { Close(); }
6254
+ DBCompactionTestBlobError() : sync_point_(GetParam()) {}
5963
6255
 
5964
- FaultInjectionTestEnv fault_injection_env_;
5965
6256
  std::string sync_point_;
5966
6257
  };
5967
6258
 
@@ -5996,13 +6287,14 @@ TEST_P(DBCompactionTestBlobError, CompactionError) {
5996
6287
  ASSERT_OK(Flush());
5997
6288
 
5998
6289
  options.enable_blob_files = true;
5999
- options.env = &fault_injection_env_;
6000
6290
 
6001
6291
  Reopen(options);
6002
6292
 
6003
- SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* /* arg */) {
6004
- fault_injection_env_.SetFilesystemActive(false,
6005
- Status::IOError(sync_point_));
6293
+ SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* arg) {
6294
+ Status* const s = static_cast<Status*>(arg);
6295
+ assert(s);
6296
+
6297
+ (*s) = Status::IOError(sync_point_);
6006
6298
  });
6007
6299
  SyncPoint::GetInstance()->EnableProcessing();
6008
6300
 
@@ -6014,7 +6306,7 @@ TEST_P(DBCompactionTestBlobError, CompactionError) {
6014
6306
  SyncPoint::GetInstance()->DisableProcessing();
6015
6307
  SyncPoint::GetInstance()->ClearAllCallBacks();
6016
6308
 
6017
- VersionSet* const versions = dbfull()->TEST_GetVersionSet();
6309
+ VersionSet* const versions = dbfull()->GetVersionSet();
6018
6310
  assert(versions);
6019
6311
 
6020
6312
  ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
@@ -6039,12 +6331,18 @@ TEST_P(DBCompactionTestBlobError, CompactionError) {
6039
6331
  ASSERT_GE(compaction_stats.size(), 2);
6040
6332
 
6041
6333
  if (sync_point_ == "BlobFileBuilder::WriteBlobToFile:AddRecord") {
6334
+ ASSERT_EQ(compaction_stats[1].bytes_read_blob, 0);
6042
6335
  ASSERT_EQ(compaction_stats[1].bytes_written, 0);
6336
+ ASSERT_EQ(compaction_stats[1].bytes_written_blob, 0);
6043
6337
  ASSERT_EQ(compaction_stats[1].num_output_files, 0);
6338
+ ASSERT_EQ(compaction_stats[1].num_output_files_blob, 0);
6044
6339
  } else {
6045
6340
  // SST file writing succeeded; blob file writing failed (during Finish)
6341
+ ASSERT_EQ(compaction_stats[1].bytes_read_blob, 0);
6046
6342
  ASSERT_GT(compaction_stats[1].bytes_written, 0);
6343
+ ASSERT_EQ(compaction_stats[1].bytes_written_blob, 0);
6047
6344
  ASSERT_EQ(compaction_stats[1].num_output_files, 1);
6345
+ ASSERT_EQ(compaction_stats[1].num_output_files_blob, 0);
6048
6346
  }
6049
6347
  }
6050
6348
 
@@ -6129,6 +6427,36 @@ TEST_P(DBCompactionTestBlobGC, CompactionWithBlobGC) {
6129
6427
  for (size_t i = cutoff_index; i < original_blob_files.size(); ++i) {
6130
6428
  ASSERT_EQ(new_blob_files[i - cutoff_index], original_blob_files[i]);
6131
6429
  }
6430
+
6431
+ VersionSet* const versions = dbfull()->GetVersionSet();
6432
+ assert(versions);
6433
+ assert(versions->GetColumnFamilySet());
6434
+
6435
+ ColumnFamilyData* const cfd = versions->GetColumnFamilySet()->GetDefault();
6436
+ assert(cfd);
6437
+
6438
+ const InternalStats* const internal_stats = cfd->internal_stats();
6439
+ assert(internal_stats);
6440
+
6441
+ const auto& compaction_stats = internal_stats->TEST_GetCompactionStats();
6442
+ ASSERT_GE(compaction_stats.size(), 2);
6443
+
6444
+ if (blob_gc_age_cutoff_ > 0.0) {
6445
+ ASSERT_GT(compaction_stats[1].bytes_read_blob, 0);
6446
+
6447
+ if (updated_enable_blob_files_) {
6448
+ // GC relocated some blobs to new blob files
6449
+ ASSERT_GT(compaction_stats[1].bytes_written_blob, 0);
6450
+ ASSERT_EQ(compaction_stats[1].bytes_read_blob,
6451
+ compaction_stats[1].bytes_written_blob);
6452
+ } else {
6453
+ // GC moved some blobs back to the LSM, no new blob files
6454
+ ASSERT_EQ(compaction_stats[1].bytes_written_blob, 0);
6455
+ }
6456
+ } else {
6457
+ ASSERT_EQ(compaction_stats[1].bytes_read_blob, 0);
6458
+ ASSERT_EQ(compaction_stats[1].bytes_written_blob, 0);
6459
+ }
6132
6460
  }
6133
6461
 
6134
6462
  TEST_F(DBCompactionTest, CompactionWithBlobGCError_CorruptIndex) {
@@ -6156,20 +6484,29 @@ TEST_F(DBCompactionTest, CompactionWithBlobGCError_CorruptIndex) {
6156
6484
  ASSERT_OK(Put(third_key, third_value));
6157
6485
 
6158
6486
  constexpr char fourth_key[] = "fourth_key";
6159
- constexpr char corrupt_blob_index[] = "foobar";
6160
-
6161
- WriteBatch batch;
6162
- ASSERT_OK(WriteBatchInternal::PutBlobIndex(&batch, 0, fourth_key,
6163
- corrupt_blob_index));
6164
- ASSERT_OK(db_->Write(WriteOptions(), &batch));
6487
+ constexpr char fourth_value[] = "fourth_value";
6488
+ ASSERT_OK(Put(fourth_key, fourth_value));
6165
6489
 
6166
6490
  ASSERT_OK(Flush());
6167
6491
 
6168
- constexpr Slice* begin = nullptr;
6169
- constexpr Slice* end = nullptr;
6492
+ SyncPoint::GetInstance()->SetCallBack(
6493
+ "CompactionIterator::GarbageCollectBlobIfNeeded::TamperWithBlobIndex",
6494
+ [](void* arg) {
6495
+ Slice* const blob_index = static_cast<Slice*>(arg);
6496
+ assert(blob_index);
6497
+ assert(!blob_index->empty());
6498
+ blob_index->remove_prefix(1);
6499
+ });
6500
+ SyncPoint::GetInstance()->EnableProcessing();
6501
+
6502
+ constexpr Slice* begin = nullptr;
6503
+ constexpr Slice* end = nullptr;
6170
6504
 
6171
6505
  ASSERT_TRUE(
6172
6506
  db_->CompactRange(CompactRangeOptions(), begin, end).IsCorruption());
6507
+
6508
+ SyncPoint::GetInstance()->DisableProcessing();
6509
+ SyncPoint::GetInstance()->ClearAllCallBacks();
6173
6510
  }
6174
6511
 
6175
6512
  TEST_F(DBCompactionTest, CompactionWithBlobGCError_InlinedTTLIndex) {
@@ -6275,6 +6612,851 @@ TEST_F(DBCompactionTest, CompactionWithBlobGCError_IndexWithInvalidFileNumber) {
6275
6612
  db_->CompactRange(CompactRangeOptions(), begin, end).IsCorruption());
6276
6613
  }
6277
6614
 
6615
+ TEST_F(DBCompactionTest, CompactionWithChecksumHandoff1) {
6616
+ if (mem_env_ || encrypted_env_) {
6617
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
6618
+ return;
6619
+ }
6620
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
6621
+ new FaultInjectionTestFS(FileSystem::Default()));
6622
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
6623
+ Options options = CurrentOptions();
6624
+ options.level0_file_num_compaction_trigger = 2;
6625
+ options.num_levels = 3;
6626
+ options.env = fault_fs_env.get();
6627
+ options.create_if_missing = true;
6628
+ options.checksum_handoff_file_types.Add(FileType::kTableFile);
6629
+ Status s;
6630
+ Reopen(options);
6631
+
6632
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6633
+ ASSERT_OK(Put(Key(0), "value1"));
6634
+ ASSERT_OK(Put(Key(2), "value2"));
6635
+ s = Flush();
6636
+ ASSERT_EQ(s, Status::OK());
6637
+ ASSERT_OK(Put(Key(1), "value3"));
6638
+ s = Flush();
6639
+ ASSERT_EQ(s, Status::OK());
6640
+ s = dbfull()->TEST_WaitForCompact();
6641
+ ASSERT_EQ(s, Status::OK());
6642
+ Destroy(options);
6643
+ Reopen(options);
6644
+
6645
+ // The hash does not match, compaction write fails
6646
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
6647
+ // Since the file system returns IOStatus::Corruption, it is an
6648
+ // unrecoverable error.
6649
+ ASSERT_OK(Put(Key(0), "value1"));
6650
+ ASSERT_OK(Put(Key(2), "value2"));
6651
+ s = Flush();
6652
+ ASSERT_EQ(s, Status::OK());
6653
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6654
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6655
+ "BackgroundCallCompaction:0"}});
6656
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6657
+ "BackgroundCallCompaction:0", [&](void*) {
6658
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
6659
+ });
6660
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6661
+ ASSERT_OK(Put(Key(1), "value3"));
6662
+ s = Flush();
6663
+ ASSERT_EQ(s, Status::OK());
6664
+ s = dbfull()->TEST_WaitForCompact();
6665
+ ASSERT_EQ(s.severity(),
6666
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
6667
+ SyncPoint::GetInstance()->DisableProcessing();
6668
+ Destroy(options);
6669
+ Reopen(options);
6670
+
6671
+ // The file system does not support checksum handoff. The check
6672
+ // will be ignored.
6673
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
6674
+ ASSERT_OK(Put(Key(0), "value1"));
6675
+ ASSERT_OK(Put(Key(2), "value2"));
6676
+ s = Flush();
6677
+ ASSERT_EQ(s, Status::OK());
6678
+ ASSERT_OK(Put(Key(1), "value3"));
6679
+ s = Flush();
6680
+ ASSERT_EQ(s, Status::OK());
6681
+ s = dbfull()->TEST_WaitForCompact();
6682
+ ASSERT_EQ(s, Status::OK());
6683
+
6684
+ // Each write will be similated as corrupted.
6685
+ // Since the file system returns IOStatus::Corruption, it is an
6686
+ // unrecoverable error.
6687
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6688
+ ASSERT_OK(Put(Key(0), "value1"));
6689
+ ASSERT_OK(Put(Key(2), "value2"));
6690
+ s = Flush();
6691
+ ASSERT_EQ(s, Status::OK());
6692
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6693
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6694
+ "BackgroundCallCompaction:0"}});
6695
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6696
+ "BackgroundCallCompaction:0",
6697
+ [&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
6698
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6699
+ ASSERT_OK(Put(Key(1), "value3"));
6700
+ s = Flush();
6701
+ ASSERT_EQ(s, Status::OK());
6702
+ s = dbfull()->TEST_WaitForCompact();
6703
+ ASSERT_EQ(s.severity(),
6704
+ ROCKSDB_NAMESPACE::Status::Severity::kUnrecoverableError);
6705
+ SyncPoint::GetInstance()->DisableProcessing();
6706
+
6707
+ Destroy(options);
6708
+ }
6709
+
6710
+ TEST_F(DBCompactionTest, CompactionWithChecksumHandoff2) {
6711
+ if (mem_env_ || encrypted_env_) {
6712
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
6713
+ return;
6714
+ }
6715
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
6716
+ new FaultInjectionTestFS(FileSystem::Default()));
6717
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
6718
+ Options options = CurrentOptions();
6719
+ options.level0_file_num_compaction_trigger = 2;
6720
+ options.num_levels = 3;
6721
+ options.env = fault_fs_env.get();
6722
+ options.create_if_missing = true;
6723
+ Status s;
6724
+ Reopen(options);
6725
+
6726
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6727
+ ASSERT_OK(Put(Key(0), "value1"));
6728
+ ASSERT_OK(Put(Key(2), "value2"));
6729
+ s = Flush();
6730
+ ASSERT_EQ(s, Status::OK());
6731
+ ASSERT_OK(Put(Key(1), "value3"));
6732
+ s = Flush();
6733
+ ASSERT_EQ(s, Status::OK());
6734
+ s = dbfull()->TEST_WaitForCompact();
6735
+ ASSERT_EQ(s, Status::OK());
6736
+ Destroy(options);
6737
+ Reopen(options);
6738
+
6739
+ // options is not set, the checksum handoff will not be triggered
6740
+ ASSERT_OK(Put(Key(0), "value1"));
6741
+ ASSERT_OK(Put(Key(2), "value2"));
6742
+ s = Flush();
6743
+ ASSERT_EQ(s, Status::OK());
6744
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6745
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6746
+ "BackgroundCallCompaction:0"}});
6747
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6748
+ "BackgroundCallCompaction:0", [&](void*) {
6749
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
6750
+ });
6751
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6752
+ ASSERT_OK(Put(Key(1), "value3"));
6753
+ s = Flush();
6754
+ ASSERT_EQ(s, Status::OK());
6755
+ s = dbfull()->TEST_WaitForCompact();
6756
+ ASSERT_EQ(s, Status::OK());
6757
+ SyncPoint::GetInstance()->DisableProcessing();
6758
+ Destroy(options);
6759
+ Reopen(options);
6760
+
6761
+ // The file system does not support checksum handoff. The check
6762
+ // will be ignored.
6763
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
6764
+ ASSERT_OK(Put(Key(0), "value1"));
6765
+ ASSERT_OK(Put(Key(2), "value2"));
6766
+ s = Flush();
6767
+ ASSERT_EQ(s, Status::OK());
6768
+ ASSERT_OK(Put(Key(1), "value3"));
6769
+ s = Flush();
6770
+ ASSERT_EQ(s, Status::OK());
6771
+ s = dbfull()->TEST_WaitForCompact();
6772
+ ASSERT_EQ(s, Status::OK());
6773
+
6774
+ // options is not set, the checksum handoff will not be triggered
6775
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6776
+ ASSERT_OK(Put(Key(0), "value1"));
6777
+ ASSERT_OK(Put(Key(2), "value2"));
6778
+ s = Flush();
6779
+ ASSERT_EQ(s, Status::OK());
6780
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6781
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6782
+ "BackgroundCallCompaction:0"}});
6783
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6784
+ "BackgroundCallCompaction:0",
6785
+ [&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
6786
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6787
+ ASSERT_OK(Put(Key(1), "value3"));
6788
+ s = Flush();
6789
+ ASSERT_EQ(s, Status::OK());
6790
+ s = dbfull()->TEST_WaitForCompact();
6791
+ ASSERT_EQ(s, Status::OK());
6792
+
6793
+ Destroy(options);
6794
+ }
6795
+
6796
+ TEST_F(DBCompactionTest, CompactionWithChecksumHandoffManifest1) {
6797
+ if (mem_env_ || encrypted_env_) {
6798
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
6799
+ return;
6800
+ }
6801
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
6802
+ new FaultInjectionTestFS(FileSystem::Default()));
6803
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
6804
+ Options options = CurrentOptions();
6805
+ options.level0_file_num_compaction_trigger = 2;
6806
+ options.num_levels = 3;
6807
+ options.env = fault_fs_env.get();
6808
+ options.create_if_missing = true;
6809
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
6810
+ Status s;
6811
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6812
+ Reopen(options);
6813
+
6814
+ ASSERT_OK(Put(Key(0), "value1"));
6815
+ ASSERT_OK(Put(Key(2), "value2"));
6816
+ s = Flush();
6817
+ ASSERT_EQ(s, Status::OK());
6818
+ ASSERT_OK(Put(Key(1), "value3"));
6819
+ s = Flush();
6820
+ ASSERT_EQ(s, Status::OK());
6821
+ s = dbfull()->TEST_WaitForCompact();
6822
+ ASSERT_EQ(s, Status::OK());
6823
+ Destroy(options);
6824
+ Reopen(options);
6825
+
6826
+ // The hash does not match, compaction write fails
6827
+ // fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
6828
+ // Since the file system returns IOStatus::Corruption, it is mapped to
6829
+ // kFatalError error.
6830
+ ASSERT_OK(Put(Key(0), "value1"));
6831
+ ASSERT_OK(Put(Key(2), "value2"));
6832
+ s = Flush();
6833
+ ASSERT_EQ(s, Status::OK());
6834
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6835
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6836
+ "BackgroundCallCompaction:0"}});
6837
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6838
+ "BackgroundCallCompaction:0", [&](void*) {
6839
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kxxHash);
6840
+ });
6841
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6842
+ ASSERT_OK(Put(Key(1), "value3"));
6843
+ s = Flush();
6844
+ ASSERT_EQ(s, Status::OK());
6845
+ s = dbfull()->TEST_WaitForCompact();
6846
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
6847
+ SyncPoint::GetInstance()->DisableProcessing();
6848
+ Destroy(options);
6849
+ }
6850
+
6851
+ TEST_F(DBCompactionTest, CompactionWithChecksumHandoffManifest2) {
6852
+ if (mem_env_ || encrypted_env_) {
6853
+ ROCKSDB_GTEST_SKIP("Test requires non-mem or non-encrypted environment");
6854
+ return;
6855
+ }
6856
+ std::shared_ptr<FaultInjectionTestFS> fault_fs(
6857
+ new FaultInjectionTestFS(FileSystem::Default()));
6858
+ std::unique_ptr<Env> fault_fs_env(NewCompositeEnv(fault_fs));
6859
+ Options options = CurrentOptions();
6860
+ options.level0_file_num_compaction_trigger = 2;
6861
+ options.num_levels = 3;
6862
+ options.env = fault_fs_env.get();
6863
+ options.create_if_missing = true;
6864
+ options.checksum_handoff_file_types.Add(FileType::kDescriptorFile);
6865
+ Status s;
6866
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kNoChecksum);
6867
+ Reopen(options);
6868
+
6869
+ // The file system does not support checksum handoff. The check
6870
+ // will be ignored.
6871
+ ASSERT_OK(Put(Key(0), "value1"));
6872
+ ASSERT_OK(Put(Key(2), "value2"));
6873
+ s = Flush();
6874
+ ASSERT_EQ(s, Status::OK());
6875
+ ASSERT_OK(Put(Key(1), "value3"));
6876
+ s = Flush();
6877
+ ASSERT_EQ(s, Status::OK());
6878
+ s = dbfull()->TEST_WaitForCompact();
6879
+ ASSERT_EQ(s, Status::OK());
6880
+
6881
+ // Each write will be similated as corrupted.
6882
+ // Since the file system returns IOStatus::Corruption, it is mapped to
6883
+ // kFatalError error.
6884
+ fault_fs->SetChecksumHandoffFuncType(ChecksumType::kCRC32c);
6885
+ ASSERT_OK(Put(Key(0), "value1"));
6886
+ ASSERT_OK(Put(Key(2), "value2"));
6887
+ s = Flush();
6888
+ ASSERT_EQ(s, Status::OK());
6889
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
6890
+ {{"DBImpl::FlushMemTable:FlushMemTableFinished",
6891
+ "BackgroundCallCompaction:0"}});
6892
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6893
+ "BackgroundCallCompaction:0",
6894
+ [&](void*) { fault_fs->IngestDataCorruptionBeforeWrite(); });
6895
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6896
+ ASSERT_OK(Put(Key(1), "value3"));
6897
+ s = Flush();
6898
+ ASSERT_EQ(s, Status::OK());
6899
+ s = dbfull()->TEST_WaitForCompact();
6900
+ ASSERT_EQ(s.severity(), ROCKSDB_NAMESPACE::Status::Severity::kFatalError);
6901
+ SyncPoint::GetInstance()->DisableProcessing();
6902
+
6903
+ Destroy(options);
6904
+ }
6905
+
6906
+ TEST_F(DBCompactionTest, FIFOWarm) {
6907
+ Options options = CurrentOptions();
6908
+ options.compaction_style = kCompactionStyleFIFO;
6909
+ options.num_levels = 1;
6910
+ options.max_open_files = -1;
6911
+ options.level0_file_num_compaction_trigger = 2;
6912
+ options.create_if_missing = true;
6913
+ CompactionOptionsFIFO fifo_options;
6914
+ fifo_options.age_for_warm = 1000;
6915
+ fifo_options.max_table_files_size = 100000000;
6916
+ options.compaction_options_fifo = fifo_options;
6917
+ env_->SetMockSleep();
6918
+ Reopen(options);
6919
+
6920
+ int total_warm = 0;
6921
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
6922
+ "NewWritableFile::FileOptions.temperature", [&](void* arg) {
6923
+ Temperature temperature = *(static_cast<Temperature*>(arg));
6924
+ if (temperature == Temperature::kWarm) {
6925
+ total_warm++;
6926
+ }
6927
+ });
6928
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
6929
+
6930
+ // The file system does not support checksum handoff. The check
6931
+ // will be ignored.
6932
+ ASSERT_OK(Put(Key(0), "value1"));
6933
+ env_->MockSleepForSeconds(800);
6934
+ ASSERT_OK(Put(Key(2), "value2"));
6935
+ ASSERT_OK(Flush());
6936
+
6937
+ ASSERT_OK(Put(Key(0), "value1"));
6938
+ env_->MockSleepForSeconds(800);
6939
+ ASSERT_OK(Put(Key(2), "value2"));
6940
+ ASSERT_OK(Flush());
6941
+
6942
+ ASSERT_OK(Put(Key(0), "value1"));
6943
+ env_->MockSleepForSeconds(800);
6944
+ ASSERT_OK(Put(Key(2), "value2"));
6945
+ ASSERT_OK(Flush());
6946
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
6947
+
6948
+ ASSERT_OK(Put(Key(0), "value1"));
6949
+ env_->MockSleepForSeconds(800);
6950
+ ASSERT_OK(Put(Key(2), "value2"));
6951
+ ASSERT_OK(Flush());
6952
+
6953
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
6954
+
6955
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
6956
+
6957
+ ColumnFamilyMetaData metadata;
6958
+ db_->GetColumnFamilyMetaData(&metadata);
6959
+ ASSERT_EQ(4, metadata.file_count);
6960
+ ASSERT_EQ(Temperature::kUnknown, metadata.levels[0].files[0].temperature);
6961
+ ASSERT_EQ(Temperature::kUnknown, metadata.levels[0].files[1].temperature);
6962
+ ASSERT_EQ(Temperature::kWarm, metadata.levels[0].files[2].temperature);
6963
+ ASSERT_EQ(Temperature::kWarm, metadata.levels[0].files[3].temperature);
6964
+ ASSERT_EQ(2, total_warm);
6965
+
6966
+ Destroy(options);
6967
+ }
6968
+
6969
+ TEST_F(DBCompactionTest, DisableMultiManualCompaction) {
6970
+ const int kNumL0Files = 10;
6971
+
6972
+ Options options = CurrentOptions();
6973
+ options.level0_file_num_compaction_trigger = kNumL0Files;
6974
+ Reopen(options);
6975
+
6976
+ // Generate 2 levels of file to make sure the manual compaction is not skipped
6977
+ for (int i = 0; i < 10; i++) {
6978
+ ASSERT_OK(Put(Key(i), "value"));
6979
+ if (i % 2) {
6980
+ ASSERT_OK(Flush());
6981
+ }
6982
+ }
6983
+ MoveFilesToLevel(2);
6984
+
6985
+ for (int i = 0; i < 10; i++) {
6986
+ ASSERT_OK(Put(Key(i), "value"));
6987
+ if (i % 2) {
6988
+ ASSERT_OK(Flush());
6989
+ }
6990
+ }
6991
+ MoveFilesToLevel(1);
6992
+
6993
+ // Block compaction queue
6994
+ test::SleepingBackgroundTask sleeping_task_low;
6995
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
6996
+ Env::Priority::LOW);
6997
+
6998
+ port::Thread compact_thread1([&]() {
6999
+ CompactRangeOptions cro;
7000
+ cro.exclusive_manual_compaction = false;
7001
+ std::string begin_str = Key(0);
7002
+ std::string end_str = Key(3);
7003
+ Slice b = begin_str;
7004
+ Slice e = end_str;
7005
+ auto s = db_->CompactRange(cro, &b, &e);
7006
+ ASSERT_TRUE(s.IsIncomplete());
7007
+ });
7008
+
7009
+ port::Thread compact_thread2([&]() {
7010
+ CompactRangeOptions cro;
7011
+ cro.exclusive_manual_compaction = false;
7012
+ std::string begin_str = Key(4);
7013
+ std::string end_str = Key(7);
7014
+ Slice b = begin_str;
7015
+ Slice e = end_str;
7016
+ auto s = db_->CompactRange(cro, &b, &e);
7017
+ ASSERT_TRUE(s.IsIncomplete());
7018
+ });
7019
+
7020
+ // Disable manual compaction should cancel both manual compactions and both
7021
+ // compaction should return incomplete.
7022
+ db_->DisableManualCompaction();
7023
+
7024
+ compact_thread1.join();
7025
+ compact_thread2.join();
7026
+
7027
+ sleeping_task_low.WakeUp();
7028
+ sleeping_task_low.WaitUntilDone();
7029
+ ASSERT_OK(dbfull()->TEST_WaitForCompact(true));
7030
+ }
7031
+
7032
+ TEST_F(DBCompactionTest, DisableJustStartedManualCompaction) {
7033
+ const int kNumL0Files = 4;
7034
+
7035
+ Options options = CurrentOptions();
7036
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7037
+ Reopen(options);
7038
+
7039
+ // generate files, but avoid trigger auto compaction
7040
+ for (int i = 0; i < kNumL0Files / 2; i++) {
7041
+ ASSERT_OK(Put(Key(1), "value1"));
7042
+ ASSERT_OK(Put(Key(2), "value2"));
7043
+ ASSERT_OK(Flush());
7044
+ }
7045
+
7046
+ // make sure the manual compaction background is started but not yet set the
7047
+ // status to in_progress, then cancel the manual compaction, which should not
7048
+ // result in segfault
7049
+ SyncPoint::GetInstance()->LoadDependency(
7050
+ {{"DBImpl::BGWorkCompaction",
7051
+ "DBCompactionTest::DisableJustStartedManualCompaction:"
7052
+ "PreDisableManualCompaction"},
7053
+ {"DBImpl::RunManualCompaction:Unscheduled",
7054
+ "BackgroundCallCompaction:0"}});
7055
+ SyncPoint::GetInstance()->EnableProcessing();
7056
+
7057
+ port::Thread compact_thread([&]() {
7058
+ CompactRangeOptions cro;
7059
+ cro.exclusive_manual_compaction = true;
7060
+ auto s = db_->CompactRange(cro, nullptr, nullptr);
7061
+ ASSERT_TRUE(s.IsIncomplete());
7062
+ });
7063
+ TEST_SYNC_POINT(
7064
+ "DBCompactionTest::DisableJustStartedManualCompaction:"
7065
+ "PreDisableManualCompaction");
7066
+ db_->DisableManualCompaction();
7067
+
7068
+ compact_thread.join();
7069
+ }
7070
+
7071
+ TEST_F(DBCompactionTest, DisableInProgressManualCompaction) {
7072
+ const int kNumL0Files = 4;
7073
+
7074
+ Options options = CurrentOptions();
7075
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7076
+ Reopen(options);
7077
+
7078
+ SyncPoint::GetInstance()->LoadDependency(
7079
+ {{"DBImpl::BackgroundCompaction:InProgress",
7080
+ "DBCompactionTest::DisableInProgressManualCompaction:"
7081
+ "PreDisableManualCompaction"},
7082
+ {"DBImpl::RunManualCompaction:Unscheduled",
7083
+ "CompactionJob::Run():Start"}});
7084
+ SyncPoint::GetInstance()->EnableProcessing();
7085
+
7086
+ // generate files, but avoid trigger auto compaction
7087
+ for (int i = 0; i < kNumL0Files / 2; i++) {
7088
+ ASSERT_OK(Put(Key(1), "value1"));
7089
+ ASSERT_OK(Put(Key(2), "value2"));
7090
+ ASSERT_OK(Flush());
7091
+ }
7092
+
7093
+ port::Thread compact_thread([&]() {
7094
+ CompactRangeOptions cro;
7095
+ cro.exclusive_manual_compaction = true;
7096
+ auto s = db_->CompactRange(cro, nullptr, nullptr);
7097
+ ASSERT_TRUE(s.IsIncomplete());
7098
+ });
7099
+
7100
+ TEST_SYNC_POINT(
7101
+ "DBCompactionTest::DisableInProgressManualCompaction:"
7102
+ "PreDisableManualCompaction");
7103
+ db_->DisableManualCompaction();
7104
+
7105
+ compact_thread.join();
7106
+ }
7107
+
7108
+ TEST_F(DBCompactionTest, DisableManualCompactionThreadQueueFull) {
7109
+ const int kNumL0Files = 4;
7110
+
7111
+ SyncPoint::GetInstance()->LoadDependency(
7112
+ {{"DBImpl::RunManualCompaction:Scheduled",
7113
+ "DBCompactionTest::DisableManualCompactionThreadQueueFull:"
7114
+ "PreDisableManualCompaction"}});
7115
+ SyncPoint::GetInstance()->EnableProcessing();
7116
+
7117
+ Options options = CurrentOptions();
7118
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7119
+ Reopen(options);
7120
+
7121
+ // Block compaction queue
7122
+ test::SleepingBackgroundTask sleeping_task_low;
7123
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
7124
+ Env::Priority::LOW);
7125
+
7126
+ // generate files, but avoid trigger auto compaction
7127
+ for (int i = 0; i < kNumL0Files / 2; i++) {
7128
+ ASSERT_OK(Put(Key(1), "value1"));
7129
+ ASSERT_OK(Put(Key(2), "value2"));
7130
+ ASSERT_OK(Flush());
7131
+ }
7132
+
7133
+ port::Thread compact_thread([&]() {
7134
+ CompactRangeOptions cro;
7135
+ cro.exclusive_manual_compaction = true;
7136
+ auto s = db_->CompactRange(cro, nullptr, nullptr);
7137
+ ASSERT_TRUE(s.IsIncomplete());
7138
+ });
7139
+
7140
+ TEST_SYNC_POINT(
7141
+ "DBCompactionTest::DisableManualCompactionThreadQueueFull:"
7142
+ "PreDisableManualCompaction");
7143
+
7144
+ // Generate more files to trigger auto compaction which is scheduled after
7145
+ // manual compaction. Has to generate 4 more files because existing files are
7146
+ // pending compaction
7147
+ for (int i = 0; i < kNumL0Files; i++) {
7148
+ ASSERT_OK(Put(Key(1), "value1"));
7149
+ ASSERT_OK(Put(Key(2), "value2"));
7150
+ ASSERT_OK(Flush());
7151
+ }
7152
+ ASSERT_EQ(ToString(kNumL0Files + (kNumL0Files / 2)), FilesPerLevel(0));
7153
+
7154
+ db_->DisableManualCompaction();
7155
+
7156
+ // CompactRange should return before the compaction has the chance to run
7157
+ compact_thread.join();
7158
+
7159
+ sleeping_task_low.WakeUp();
7160
+ sleeping_task_low.WaitUntilDone();
7161
+ ASSERT_OK(dbfull()->TEST_WaitForCompact(true));
7162
+ ASSERT_EQ("0,1", FilesPerLevel(0));
7163
+ }
7164
+
7165
+ TEST_F(DBCompactionTest, DisableManualCompactionThreadQueueFullDBClose) {
7166
+ const int kNumL0Files = 4;
7167
+
7168
+ SyncPoint::GetInstance()->LoadDependency(
7169
+ {{"DBImpl::RunManualCompaction:Scheduled",
7170
+ "DBCompactionTest::DisableManualCompactionThreadQueueFullDBClose:"
7171
+ "PreDisableManualCompaction"}});
7172
+ SyncPoint::GetInstance()->EnableProcessing();
7173
+
7174
+ Options options = CurrentOptions();
7175
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7176
+ Reopen(options);
7177
+
7178
+ // Block compaction queue
7179
+ test::SleepingBackgroundTask sleeping_task_low;
7180
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
7181
+ Env::Priority::LOW);
7182
+
7183
+ // generate files, but avoid trigger auto compaction
7184
+ for (int i = 0; i < kNumL0Files / 2; i++) {
7185
+ ASSERT_OK(Put(Key(1), "value1"));
7186
+ ASSERT_OK(Put(Key(2), "value2"));
7187
+ ASSERT_OK(Flush());
7188
+ }
7189
+
7190
+ port::Thread compact_thread([&]() {
7191
+ CompactRangeOptions cro;
7192
+ cro.exclusive_manual_compaction = true;
7193
+ auto s = db_->CompactRange(cro, nullptr, nullptr);
7194
+ ASSERT_TRUE(s.IsIncomplete());
7195
+ });
7196
+
7197
+ TEST_SYNC_POINT(
7198
+ "DBCompactionTest::DisableManualCompactionThreadQueueFullDBClose:"
7199
+ "PreDisableManualCompaction");
7200
+
7201
+ // Generate more files to trigger auto compaction which is scheduled after
7202
+ // manual compaction. Has to generate 4 more files because existing files are
7203
+ // pending compaction
7204
+ for (int i = 0; i < kNumL0Files; i++) {
7205
+ ASSERT_OK(Put(Key(1), "value1"));
7206
+ ASSERT_OK(Put(Key(2), "value2"));
7207
+ ASSERT_OK(Flush());
7208
+ }
7209
+ ASSERT_EQ(ToString(kNumL0Files + (kNumL0Files / 2)), FilesPerLevel(0));
7210
+
7211
+ db_->DisableManualCompaction();
7212
+
7213
+ // CompactRange should return before the compaction has the chance to run
7214
+ compact_thread.join();
7215
+
7216
+ // Try close DB while manual compaction is canceled but still in the queue.
7217
+ // And an auto-triggered compaction is also in the queue.
7218
+ auto s = db_->Close();
7219
+ ASSERT_OK(s);
7220
+
7221
+ sleeping_task_low.WakeUp();
7222
+ sleeping_task_low.WaitUntilDone();
7223
+ }
7224
+
7225
+ TEST_F(DBCompactionTest, DBCloseWithManualCompaction) {
7226
+ const int kNumL0Files = 4;
7227
+
7228
+ SyncPoint::GetInstance()->LoadDependency(
7229
+ {{"DBImpl::RunManualCompaction:Scheduled",
7230
+ "DBCompactionTest::DisableManualCompactionThreadQueueFullDBClose:"
7231
+ "PreDisableManualCompaction"}});
7232
+ SyncPoint::GetInstance()->EnableProcessing();
7233
+
7234
+ Options options = CurrentOptions();
7235
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7236
+ Reopen(options);
7237
+
7238
+ // Block compaction queue
7239
+ test::SleepingBackgroundTask sleeping_task_low;
7240
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
7241
+ Env::Priority::LOW);
7242
+
7243
+ // generate files, but avoid trigger auto compaction
7244
+ for (int i = 0; i < kNumL0Files / 2; i++) {
7245
+ ASSERT_OK(Put(Key(1), "value1"));
7246
+ ASSERT_OK(Put(Key(2), "value2"));
7247
+ ASSERT_OK(Flush());
7248
+ }
7249
+
7250
+ port::Thread compact_thread([&]() {
7251
+ CompactRangeOptions cro;
7252
+ cro.exclusive_manual_compaction = true;
7253
+ auto s = db_->CompactRange(cro, nullptr, nullptr);
7254
+ ASSERT_TRUE(s.IsIncomplete());
7255
+ });
7256
+
7257
+ TEST_SYNC_POINT(
7258
+ "DBCompactionTest::DisableManualCompactionThreadQueueFullDBClose:"
7259
+ "PreDisableManualCompaction");
7260
+
7261
+ // Generate more files to trigger auto compaction which is scheduled after
7262
+ // manual compaction. Has to generate 4 more files because existing files are
7263
+ // pending compaction
7264
+ for (int i = 0; i < kNumL0Files; i++) {
7265
+ ASSERT_OK(Put(Key(1), "value1"));
7266
+ ASSERT_OK(Put(Key(2), "value2"));
7267
+ ASSERT_OK(Flush());
7268
+ }
7269
+ ASSERT_EQ(ToString(kNumL0Files + (kNumL0Files / 2)), FilesPerLevel(0));
7270
+
7271
+ // Close DB with manual compaction and auto triggered compaction in the queue.
7272
+ auto s = db_->Close();
7273
+ ASSERT_OK(s);
7274
+
7275
+ // manual compaction thread should return with Incomplete().
7276
+ compact_thread.join();
7277
+
7278
+ sleeping_task_low.WakeUp();
7279
+ sleeping_task_low.WaitUntilDone();
7280
+ }
7281
+
7282
+ TEST_F(DBCompactionTest,
7283
+ DisableManualCompactionDoesNotWaitForDrainingAutomaticCompaction) {
7284
+ // When `CompactRangeOptions::exclusive_manual_compaction == true`, we wait
7285
+ // for automatic compactions to drain before starting the manual compaction.
7286
+ // This test verifies `DisableManualCompaction()` can cancel such a compaction
7287
+ // without waiting for the drain to complete.
7288
+ const int kNumL0Files = 4;
7289
+
7290
+ // Enforces manual compaction enters wait loop due to pending automatic
7291
+ // compaction.
7292
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
7293
+ {{"DBImpl::BGWorkCompaction", "DBImpl::RunManualCompaction:NotScheduled"},
7294
+ {"DBImpl::RunManualCompaction:WaitScheduled",
7295
+ "BackgroundCallCompaction:0"}});
7296
+ // The automatic compaction will cancel the waiting manual compaction.
7297
+ // Completing this implies the cancellation did not wait on automatic
7298
+ // compactions to finish.
7299
+ bool callback_completed = false;
7300
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
7301
+ "BackgroundCallCompaction:0", [&](void* /*arg*/) {
7302
+ db_->DisableManualCompaction();
7303
+ callback_completed = true;
7304
+ });
7305
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
7306
+
7307
+ Options options = CurrentOptions();
7308
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7309
+ Reopen(options);
7310
+
7311
+ for (int i = 0; i < kNumL0Files; ++i) {
7312
+ ASSERT_OK(Put(Key(1), "value1"));
7313
+ ASSERT_OK(Put(Key(2), "value2"));
7314
+ ASSERT_OK(Flush());
7315
+ }
7316
+
7317
+ CompactRangeOptions cro;
7318
+ cro.exclusive_manual_compaction = true;
7319
+ ASSERT_TRUE(db_->CompactRange(cro, nullptr, nullptr).IsIncomplete());
7320
+
7321
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
7322
+ ASSERT_TRUE(callback_completed);
7323
+ }
7324
+
7325
+ TEST_F(DBCompactionTest, ChangeLevelConflictsWithManual) {
7326
+ Options options = CurrentOptions();
7327
+ options.num_levels = 3;
7328
+ Reopen(options);
7329
+
7330
+ // Setup an LSM with L2 populated.
7331
+ Random rnd(301);
7332
+ ASSERT_OK(Put(Key(0), rnd.RandomString(990)));
7333
+ ASSERT_OK(Put(Key(1), rnd.RandomString(990)));
7334
+ {
7335
+ CompactRangeOptions cro;
7336
+ cro.change_level = true;
7337
+ cro.target_level = 2;
7338
+ ASSERT_OK(dbfull()->CompactRange(cro, nullptr, nullptr));
7339
+ }
7340
+ ASSERT_EQ("0,0,1", FilesPerLevel(0));
7341
+
7342
+ // The background thread will refit L2->L1 while the foreground thread will
7343
+ // attempt to run a compaction on new data. The following dependencies
7344
+ // ensure the background manual compaction's refitting phase disables manual
7345
+ // compaction immediately before the foreground manual compaction can register
7346
+ // itself. Manual compaction is kept disabled until the foreground manual
7347
+ // checks for the failure once.
7348
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency({
7349
+ // Only do Put()s for foreground CompactRange() once the background
7350
+ // CompactRange() has reached the refitting phase.
7351
+ {
7352
+ "DBImpl::CompactRange:BeforeRefit:1",
7353
+ "DBCompactionTest::ChangeLevelConflictsWithManual:"
7354
+ "PreForegroundCompactRange",
7355
+ },
7356
+ // Right before we register the manual compaction, proceed with
7357
+ // the refitting phase so manual compactions are disabled. Stay in
7358
+ // the refitting phase with manual compactions disabled until it is
7359
+ // noticed.
7360
+ {
7361
+ "DBImpl::RunManualCompaction:0",
7362
+ "DBImpl::CompactRange:BeforeRefit:2",
7363
+ },
7364
+ {
7365
+ "DBImpl::CompactRange:PreRefitLevel",
7366
+ "DBImpl::RunManualCompaction:1",
7367
+ },
7368
+ {
7369
+ "DBImpl::RunManualCompaction:PausedAtStart",
7370
+ "DBImpl::CompactRange:PostRefitLevel",
7371
+ },
7372
+ // If compaction somehow were scheduled, let's let it run after reenabling
7373
+ // manual compactions. This dependency is not expected to be hit but is
7374
+ // here for speculatively coercing future bugs.
7375
+ {
7376
+ "DBImpl::CompactRange:PostRefitLevel:ManualCompactionEnabled",
7377
+ "BackgroundCallCompaction:0",
7378
+ },
7379
+ });
7380
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
7381
+
7382
+ ROCKSDB_NAMESPACE::port::Thread refit_level_thread([&] {
7383
+ CompactRangeOptions cro;
7384
+ cro.change_level = true;
7385
+ cro.target_level = 1;
7386
+ ASSERT_OK(dbfull()->CompactRange(cro, nullptr, nullptr));
7387
+ });
7388
+
7389
+ TEST_SYNC_POINT(
7390
+ "DBCompactionTest::ChangeLevelConflictsWithManual:"
7391
+ "PreForegroundCompactRange");
7392
+ ASSERT_OK(Put(Key(0), rnd.RandomString(990)));
7393
+ ASSERT_OK(Put(Key(1), rnd.RandomString(990)));
7394
+ ASSERT_TRUE(dbfull()
7395
+ ->CompactRange(CompactRangeOptions(), nullptr, nullptr)
7396
+ .IsIncomplete());
7397
+
7398
+ refit_level_thread.join();
7399
+ }
7400
+
7401
+ TEST_F(DBCompactionTest, BottomPriCompactionCountsTowardConcurrencyLimit) {
7402
+ // Flushes several files to trigger compaction while lock is released during
7403
+ // a bottom-pri compaction. Verifies it does not get scheduled to thread pool
7404
+ // because per-DB limit for compaction parallelism is one (default).
7405
+ const int kNumL0Files = 4;
7406
+ const int kNumLevels = 3;
7407
+
7408
+ env_->SetBackgroundThreads(1, Env::Priority::BOTTOM);
7409
+
7410
+ Options options = CurrentOptions();
7411
+ options.level0_file_num_compaction_trigger = kNumL0Files;
7412
+ options.num_levels = kNumLevels;
7413
+ DestroyAndReopen(options);
7414
+
7415
+ // Setup last level to be non-empty since it's a bit unclear whether
7416
+ // compaction to an empty level would be considered "bottommost".
7417
+ ASSERT_OK(Put(Key(0), "val"));
7418
+ ASSERT_OK(Flush());
7419
+ MoveFilesToLevel(kNumLevels - 1);
7420
+
7421
+ SyncPoint::GetInstance()->LoadDependency(
7422
+ {{"DBImpl::BGWorkBottomCompaction",
7423
+ "DBCompactionTest::BottomPriCompactionCountsTowardConcurrencyLimit:"
7424
+ "PreTriggerCompaction"},
7425
+ {"DBCompactionTest::BottomPriCompactionCountsTowardConcurrencyLimit:"
7426
+ "PostTriggerCompaction",
7427
+ "BackgroundCallCompaction:0"}});
7428
+ SyncPoint::GetInstance()->EnableProcessing();
7429
+
7430
+ port::Thread compact_range_thread([&] {
7431
+ CompactRangeOptions cro;
7432
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
7433
+ cro.exclusive_manual_compaction = false;
7434
+ ASSERT_OK(dbfull()->CompactRange(cro, nullptr, nullptr));
7435
+ });
7436
+
7437
+ // Sleep in the low-pri thread so any newly scheduled compaction will be
7438
+ // queued. Otherwise it might finish before we check its existence.
7439
+ test::SleepingBackgroundTask sleeping_task_low;
7440
+ env_->Schedule(&test::SleepingBackgroundTask::DoSleepTask, &sleeping_task_low,
7441
+ Env::Priority::LOW);
7442
+
7443
+ TEST_SYNC_POINT(
7444
+ "DBCompactionTest::BottomPriCompactionCountsTowardConcurrencyLimit:"
7445
+ "PreTriggerCompaction");
7446
+ for (int i = 0; i < kNumL0Files; ++i) {
7447
+ ASSERT_OK(Put(Key(0), "val"));
7448
+ ASSERT_OK(Flush());
7449
+ }
7450
+ ASSERT_EQ(0u, env_->GetThreadPoolQueueLen(Env::Priority::LOW));
7451
+ TEST_SYNC_POINT(
7452
+ "DBCompactionTest::BottomPriCompactionCountsTowardConcurrencyLimit:"
7453
+ "PostTriggerCompaction");
7454
+
7455
+ sleeping_task_low.WakeUp();
7456
+ sleeping_task_low.WaitUntilDone();
7457
+ compact_range_thread.join();
7458
+ }
7459
+
6278
7460
  #endif // !defined(ROCKSDB_LITE)
6279
7461
 
6280
7462
  } // namespace ROCKSDB_NAMESPACE