@nxtedition/rocksdb 5.2.21 → 5.2.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (909) hide show
  1. package/binding.cc +216 -252
  2. package/binding.gyp +78 -72
  3. package/deps/rocksdb/build_version.cc +70 -4
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  5. package/deps/rocksdb/rocksdb/Makefile +459 -469
  6. package/deps/rocksdb/rocksdb/README.md +4 -4
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  32. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  33. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  34. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  35. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  36. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  51. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  56. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  57. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  60. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  61. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  62. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  63. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  64. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  65. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  67. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  68. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  69. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  71. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  74. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  75. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  96. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  97. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  98. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  100. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  101. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  102. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  103. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  104. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  105. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  106. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  107. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  108. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  110. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  111. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  112. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  124. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  125. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  126. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  127. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  128. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  129. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  130. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  131. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  132. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  133. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  134. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  135. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  136. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  137. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  138. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  139. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  140. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  141. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  142. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  143. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  144. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  145. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  146. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  147. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  148. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  149. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  150. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  151. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  152. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  153. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  154. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  155. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  156. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  157. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  158. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  159. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  160. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  161. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  162. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  163. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  164. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  165. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  166. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  167. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  168. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  169. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  171. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  172. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  174. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  175. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  176. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  180. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  182. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  183. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  184. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  185. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  186. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  187. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  188. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  189. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  190. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  191. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  192. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  193. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  194. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  195. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  196. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  197. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  198. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  199. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  200. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  201. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  202. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  203. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  204. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  205. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  206. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  207. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  210. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  212. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  213. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  216. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  217. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  218. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  219. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  220. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  223. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  224. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  226. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  227. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  228. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  229. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  230. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  231. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  232. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  233. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  234. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  235. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  236. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  237. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  238. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  239. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  240. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  241. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  242. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  243. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  244. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  245. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  246. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  247. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  248. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  249. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  250. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  251. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  252. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  253. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  254. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  255. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  256. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  257. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  258. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  259. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  260. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  261. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  262. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  263. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  266. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  267. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  268. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  269. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  270. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  271. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  273. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  274. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  280. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  285. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  286. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  287. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  288. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  289. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  290. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  291. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  292. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  293. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  294. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  295. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  296. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  297. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  298. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  299. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  300. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  301. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  302. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  303. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  304. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  305. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  306. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  307. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  308. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  309. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  310. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  313. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  315. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  316. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  317. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  318. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  319. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  320. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  321. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  324. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  325. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  326. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  327. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  334. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  335. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  336. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  342. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  343. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  344. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  345. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  346. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  348. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  349. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  350. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  353. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  354. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  357. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  358. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  359. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  360. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  361. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  362. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  364. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  365. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  366. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  367. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  368. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  371. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  372. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  373. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  375. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  376. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  378. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  380. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  381. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  382. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  383. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  386. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  387. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  389. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  407. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  408. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  410. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  412. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  413. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  414. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  415. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  416. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  417. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  418. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  419. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  420. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  421. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  422. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  423. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  424. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  425. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  426. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  427. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  428. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  429. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  430. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  431. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  432. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  433. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  434. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  435. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  436. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  437. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  438. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  439. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  440. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  441. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  442. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  443. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  444. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  445. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  446. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  447. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  448. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  449. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  450. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  451. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  452. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  453. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  454. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  455. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  456. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  457. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  458. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  459. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  460. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  461. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  462. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  463. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  464. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  465. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  466. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  467. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  468. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  469. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  470. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  471. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  472. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  473. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  474. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  475. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  476. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  477. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  478. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  479. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  480. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  481. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  482. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  483. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  484. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  485. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  486. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  487. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  488. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  489. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  490. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  491. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  492. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  493. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  494. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  495. package/deps/rocksdb/rocksdb/python.mk +9 -0
  496. package/deps/rocksdb/rocksdb/src.mk +82 -34
  497. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  498. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  500. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  501. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  502. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  503. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  504. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  505. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  506. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  507. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  508. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  514. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  515. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  516. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  517. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  518. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  519. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  520. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  521. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  522. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  523. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  524. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  525. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  526. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  527. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  529. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  530. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  531. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  532. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  534. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  535. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  536. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  537. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  538. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  539. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  540. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  541. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  542. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  543. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  544. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  546. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  547. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  548. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  549. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  550. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  551. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  552. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  553. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  554. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  555. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  556. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  557. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  558. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  559. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  560. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  561. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  562. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  563. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  564. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  565. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  566. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  567. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  568. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  569. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  570. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  571. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  572. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  573. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  574. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  575. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  576. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  577. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  578. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  579. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  580. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  581. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  582. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  586. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  587. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  588. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  589. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  590. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  591. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  592. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  593. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  594. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  595. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  596. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  597. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  598. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  599. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  600. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  601. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  602. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  603. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  604. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  605. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  606. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  607. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  608. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  609. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  610. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  611. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  612. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  613. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  614. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  615. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  616. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  617. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  618. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  619. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  620. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  621. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  622. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  623. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  624. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  625. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  626. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  627. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  628. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  629. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  630. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  631. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  632. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  633. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  634. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  635. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  636. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  637. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  638. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  639. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  640. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  641. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  642. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  643. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  644. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  645. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  646. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  647. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  648. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  649. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  650. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  651. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  652. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  653. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  654. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  655. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  656. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  657. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  658. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  659. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  660. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  661. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  662. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  663. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  664. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  665. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  666. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  667. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  668. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  669. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  670. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  671. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  672. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  673. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  674. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  675. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  676. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  677. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  678. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  679. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  680. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  681. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  682. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  683. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  684. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  685. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  686. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  687. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  688. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  689. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  690. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  691. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  692. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  693. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  694. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  695. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  696. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  697. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  698. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  699. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  700. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  701. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  702. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  703. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  704. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  705. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  706. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  707. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  708. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  709. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  710. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  711. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  712. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  713. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  714. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  715. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  716. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  717. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  718. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  719. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  720. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  721. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  722. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  723. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  724. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  725. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  726. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  727. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  728. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  729. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  730. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  731. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  732. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  733. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  734. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  741. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  742. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  743. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  744. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  745. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  746. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  747. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  748. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  749. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  750. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  751. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  752. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  753. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  754. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  755. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  756. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  757. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  758. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  759. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  760. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  761. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  762. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  763. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  764. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  765. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  766. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  767. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  768. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  769. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  770. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  771. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  772. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  773. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  774. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  775. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  776. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  777. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  778. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  779. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  780. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  786. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  787. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  788. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  789. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  790. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  791. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  792. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  793. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  794. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  795. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  796. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  797. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  798. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  799. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  802. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  803. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  804. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  805. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  806. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  807. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  808. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  809. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  810. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  811. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  812. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  813. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  814. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  815. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  816. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  817. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  818. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  821. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  822. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  823. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  824. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  825. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  826. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  827. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  828. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  829. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  830. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  831. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  832. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  833. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  834. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  835. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  836. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  837. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  838. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  839. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  840. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  841. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  842. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  843. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  844. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  845. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  846. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  847. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  848. package/deps/rocksdb/rocksdb.gyp +425 -446
  849. package/package.json +8 -8
  850. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  851. package/prebuilds/darwin-x86/node.napi.node +0 -0
  852. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  853. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  854. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  855. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  856. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  857. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  858. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  859. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  860. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  861. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  862. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  863. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  864. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  865. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  866. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  867. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  868. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  869. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  870. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  871. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  872. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  873. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  874. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  904. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  905. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  906. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  907. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  908. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  909. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -20,14 +20,18 @@
20
20
  #include <utility>
21
21
  #include <vector>
22
22
 
23
+ #include "db/blob/blob_counting_iterator.h"
23
24
  #include "db/blob/blob_file_addition.h"
24
25
  #include "db/blob/blob_file_builder.h"
26
+ #include "db/blob/blob_garbage_meter.h"
25
27
  #include "db/builder.h"
28
+ #include "db/compaction/clipping_iterator.h"
26
29
  #include "db/db_impl/db_impl.h"
27
30
  #include "db/db_iter.h"
28
31
  #include "db/dbformat.h"
29
32
  #include "db/error_handler.h"
30
33
  #include "db/event_helpers.h"
34
+ #include "db/history_trimming_iterator.h"
31
35
  #include "db/log_reader.h"
32
36
  #include "db/log_writer.h"
33
37
  #include "db/memtable.h"
@@ -46,6 +50,8 @@
46
50
  #include "monitoring/iostats_context_imp.h"
47
51
  #include "monitoring/perf_context_imp.h"
48
52
  #include "monitoring/thread_status_util.h"
53
+ #include "options/configurable_helper.h"
54
+ #include "options/options_helper.h"
49
55
  #include "port/port.h"
50
56
  #include "rocksdb/db.h"
51
57
  #include "rocksdb/env.h"
@@ -53,6 +59,7 @@
53
59
  #include "rocksdb/statistics.h"
54
60
  #include "rocksdb/status.h"
55
61
  #include "rocksdb/table.h"
62
+ #include "rocksdb/utilities/options_type.h"
56
63
  #include "table/block_based/block.h"
57
64
  #include "table/block_based/block_based_table_factory.h"
58
65
  #include "table/merging_iterator.h"
@@ -101,6 +108,10 @@ const char* GetCompactionReasonString(CompactionReason compaction_reason) {
101
108
  return "ExternalSstIngestion";
102
109
  case CompactionReason::kPeriodicCompaction:
103
110
  return "PeriodicCompaction";
111
+ case CompactionReason::kChangeTemperature:
112
+ return "ChangeTemperature";
113
+ case CompactionReason::kForcedBlobGC:
114
+ return "ForcedBlobGC";
104
115
  case CompactionReason::kNumOfReasons:
105
116
  // fall through
106
117
  default:
@@ -128,10 +139,12 @@ struct CompactionJob::SubcompactionState {
128
139
  // Files produced by this subcompaction
129
140
  struct Output {
130
141
  Output(FileMetaData&& _meta, const InternalKeyComparator& _icmp,
131
- bool _enable_order_check, bool _enable_hash)
142
+ bool _enable_order_check, bool _enable_hash, bool _finished = false,
143
+ uint64_t precalculated_hash = 0)
132
144
  : meta(std::move(_meta)),
133
- validator(_icmp, _enable_order_check, _enable_hash),
134
- finished(false) {}
145
+ validator(_icmp, _enable_order_check, _enable_hash,
146
+ precalculated_hash),
147
+ finished(_finished) {}
135
148
  FileMetaData meta;
136
149
  OutputValidator validator;
137
150
  bool finished;
@@ -141,6 +154,7 @@ struct CompactionJob::SubcompactionState {
141
154
  // State kept for output being generated
142
155
  std::vector<Output> outputs;
143
156
  std::vector<BlobFileAddition> blob_file_additions;
157
+ std::unique_ptr<BlobGarbageMeter> blob_garbage_meter;
144
158
  std::unique_ptr<WritableFileWriter> outfile;
145
159
  std::unique_ptr<TableBuilder> builder;
146
160
 
@@ -149,7 +163,7 @@ struct CompactionJob::SubcompactionState {
149
163
  // This subcompaction's output could be empty if compaction was aborted
150
164
  // before this subcompaction had a chance to generate any output files.
151
165
  // When subcompactions are executed sequentially this is more likely and
152
- // will be particulalry likely for the later subcompactions to be empty.
166
+ // will be particularly likely for the later subcompactions to be empty.
153
167
  // Once they are run in parallel however it should be much rarer.
154
168
  return nullptr;
155
169
  } else {
@@ -157,6 +171,13 @@ struct CompactionJob::SubcompactionState {
157
171
  }
158
172
  }
159
173
 
174
+ // Some identified files with old oldest ancester time and the range should be
175
+ // isolated out so that the output file(s) in that range can be merged down
176
+ // for TTL and clear the timestamps for the range.
177
+ std::vector<FileMetaData*> files_to_cut_for_ttl;
178
+ int cur_files_to_cut_for_ttl = -1;
179
+ int next_files_to_cut_for_ttl = 0;
180
+
160
181
  uint64_t current_output_file_size = 0;
161
182
 
162
183
  // State during the subcompaction
@@ -171,9 +192,21 @@ struct CompactionJob::SubcompactionState {
171
192
  uint64_t overlapped_bytes = 0;
172
193
  // A flag determine whether the key has been seen in ShouldStopBefore()
173
194
  bool seen_key = false;
174
-
175
- SubcompactionState(Compaction* c, Slice* _start, Slice* _end, uint64_t size)
176
- : compaction(c), start(_start), end(_end), approx_size(size) {
195
+ // sub compaction job id, which is used to identify different sub-compaction
196
+ // within the same compaction job.
197
+ const uint32_t sub_job_id;
198
+
199
+ // Notify on sub-compaction completion only if listener was notified on
200
+ // sub-compaction begin.
201
+ bool notify_on_subcompaction_completion = false;
202
+
203
+ SubcompactionState(Compaction* c, Slice* _start, Slice* _end, uint64_t size,
204
+ uint32_t _sub_job_id)
205
+ : compaction(c),
206
+ start(_start),
207
+ end(_end),
208
+ approx_size(size),
209
+ sub_job_id(_sub_job_id) {
177
210
  assert(compaction != nullptr);
178
211
  }
179
212
 
@@ -191,6 +224,8 @@ struct CompactionJob::SubcompactionState {
191
224
  return Status::OK();
192
225
  }
193
226
 
227
+ void FillFilesToCutForTtl();
228
+
194
229
  // Returns true iff we should stop building the current output
195
230
  // before processing "internal_key".
196
231
  bool ShouldStopBefore(const Slice& internal_key, uint64_t curr_file_size) {
@@ -198,6 +233,7 @@ struct CompactionJob::SubcompactionState {
198
233
  &compaction->column_family_data()->internal_comparator();
199
234
  const std::vector<FileMetaData*>& grandparents = compaction->grandparents();
200
235
 
236
+ bool grandparant_file_switched = false;
201
237
  // Scan to find earliest grandparent file that contains key.
202
238
  while (grandparent_index < grandparents.size() &&
203
239
  icmp->Compare(internal_key,
@@ -205,6 +241,7 @@ struct CompactionJob::SubcompactionState {
205
241
  0) {
206
242
  if (seen_key) {
207
243
  overlapped_bytes += grandparents[grandparent_index]->fd.GetFileSize();
244
+ grandparant_file_switched = true;
208
245
  }
209
246
  assert(grandparent_index + 1 >= grandparents.size() ||
210
247
  icmp->Compare(
@@ -214,17 +251,99 @@ struct CompactionJob::SubcompactionState {
214
251
  }
215
252
  seen_key = true;
216
253
 
217
- if (overlapped_bytes + curr_file_size >
218
- compaction->max_compaction_bytes()) {
254
+ if (grandparant_file_switched && overlapped_bytes + curr_file_size >
255
+ compaction->max_compaction_bytes()) {
219
256
  // Too much overlap for current output; start new output
220
257
  overlapped_bytes = 0;
221
258
  return true;
222
259
  }
223
260
 
261
+ if (!files_to_cut_for_ttl.empty()) {
262
+ if (cur_files_to_cut_for_ttl != -1) {
263
+ // Previous key is inside the range of a file
264
+ if (icmp->Compare(internal_key,
265
+ files_to_cut_for_ttl[cur_files_to_cut_for_ttl]
266
+ ->largest.Encode()) > 0) {
267
+ next_files_to_cut_for_ttl = cur_files_to_cut_for_ttl + 1;
268
+ cur_files_to_cut_for_ttl = -1;
269
+ return true;
270
+ }
271
+ } else {
272
+ // Look for the key position
273
+ while (next_files_to_cut_for_ttl <
274
+ static_cast<int>(files_to_cut_for_ttl.size())) {
275
+ if (icmp->Compare(internal_key,
276
+ files_to_cut_for_ttl[next_files_to_cut_for_ttl]
277
+ ->smallest.Encode()) >= 0) {
278
+ if (icmp->Compare(internal_key,
279
+ files_to_cut_for_ttl[next_files_to_cut_for_ttl]
280
+ ->largest.Encode()) <= 0) {
281
+ // With in the current file
282
+ cur_files_to_cut_for_ttl = next_files_to_cut_for_ttl;
283
+ return true;
284
+ }
285
+ // Beyond the current file
286
+ next_files_to_cut_for_ttl++;
287
+ } else {
288
+ // Still fall into the gap
289
+ break;
290
+ }
291
+ }
292
+ }
293
+ }
294
+
224
295
  return false;
225
296
  }
297
+
298
+ Status ProcessOutFlowIfNeeded(const Slice& key, const Slice& value) {
299
+ if (!blob_garbage_meter) {
300
+ return Status::OK();
301
+ }
302
+
303
+ return blob_garbage_meter->ProcessOutFlow(key, value);
304
+ }
226
305
  };
227
306
 
307
+ void CompactionJob::SubcompactionState::FillFilesToCutForTtl() {
308
+ if (compaction->immutable_options()->compaction_style !=
309
+ CompactionStyle::kCompactionStyleLevel ||
310
+ compaction->immutable_options()->compaction_pri !=
311
+ CompactionPri::kMinOverlappingRatio ||
312
+ compaction->mutable_cf_options()->ttl == 0 ||
313
+ compaction->num_input_levels() < 2 || compaction->bottommost_level()) {
314
+ return;
315
+ }
316
+
317
+ // We define new file with oldest ancestor time to be younger than 1/4 TTL,
318
+ // and an old one to be older than 1/2 TTL time.
319
+ int64_t temp_current_time;
320
+ auto get_time_status = compaction->immutable_options()->clock->GetCurrentTime(
321
+ &temp_current_time);
322
+ if (!get_time_status.ok()) {
323
+ return;
324
+ }
325
+ uint64_t current_time = static_cast<uint64_t>(temp_current_time);
326
+ if (current_time < compaction->mutable_cf_options()->ttl) {
327
+ return;
328
+ }
329
+ uint64_t old_age_thres =
330
+ current_time - compaction->mutable_cf_options()->ttl / 2;
331
+
332
+ const std::vector<FileMetaData*>& olevel =
333
+ *(compaction->inputs(compaction->num_input_levels() - 1));
334
+ for (FileMetaData* file : olevel) {
335
+ // Worth filtering out by start and end?
336
+ uint64_t oldest_ancester_time = file->TryGetOldestAncesterTime();
337
+ // We put old files if they are not too small to prevent a flood
338
+ // of small files.
339
+ if (oldest_ancester_time < old_age_thres &&
340
+ file->fd.GetFileSize() >
341
+ compaction->mutable_cf_options()->target_file_size_base / 2) {
342
+ files_to_cut_for_ttl.push_back(file);
343
+ }
344
+ }
345
+ }
346
+
228
347
  // Maintains state for the entire compaction
229
348
  struct CompactionJob::CompactionState {
230
349
  Compaction* const compaction;
@@ -296,28 +415,38 @@ void CompactionJob::AggregateStatistics() {
296
415
 
297
416
  CompactionJob::CompactionJob(
298
417
  int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
299
- const FileOptions& file_options, VersionSet* versions,
300
- const std::atomic<bool>* shutting_down,
301
- const SequenceNumber preserve_deletes_seqnum, LogBuffer* log_buffer,
302
- FSDirectory* db_directory, FSDirectory* output_directory,
303
- FSDirectory* blob_output_directory, Statistics* stats,
304
- InstrumentedMutex* db_mutex, ErrorHandler* db_error_handler,
418
+ const MutableDBOptions& mutable_db_options, const FileOptions& file_options,
419
+ VersionSet* versions, const std::atomic<bool>* shutting_down,
420
+ LogBuffer* log_buffer, FSDirectory* db_directory,
421
+ FSDirectory* output_directory, FSDirectory* blob_output_directory,
422
+ Statistics* stats, InstrumentedMutex* db_mutex,
423
+ ErrorHandler* db_error_handler,
305
424
  std::vector<SequenceNumber> existing_snapshots,
306
425
  SequenceNumber earliest_write_conflict_snapshot,
307
- const SnapshotChecker* snapshot_checker, std::shared_ptr<Cache> table_cache,
308
- EventLogger* event_logger, bool paranoid_file_checks, bool measure_io_stats,
309
- const std::string& dbname, CompactionJobStats* compaction_job_stats,
310
- Env::Priority thread_pri, const std::shared_ptr<IOTracer>& io_tracer,
311
- const std::atomic<int>* manual_compaction_paused, const std::string& db_id,
312
- const std::string& db_session_id, std::string full_history_ts_low)
313
- : job_id_(job_id),
314
- compact_(new CompactionState(compaction)),
315
- compaction_job_stats_(compaction_job_stats),
426
+ const SnapshotChecker* snapshot_checker, JobContext* job_context,
427
+ std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
428
+ bool paranoid_file_checks, bool measure_io_stats, const std::string& dbname,
429
+ CompactionJobStats* compaction_job_stats, Env::Priority thread_pri,
430
+ const std::shared_ptr<IOTracer>& io_tracer,
431
+ const std::atomic<int>* manual_compaction_paused,
432
+ const std::atomic<bool>* manual_compaction_canceled,
433
+ const std::string& db_id, const std::string& db_session_id,
434
+ std::string full_history_ts_low, std::string trim_ts,
435
+ BlobFileCompletionCallback* blob_callback)
436
+ : compact_(new CompactionState(compaction)),
316
437
  compaction_stats_(compaction->compaction_reason(), 1),
438
+ db_options_(db_options),
439
+ mutable_db_options_copy_(mutable_db_options),
440
+ log_buffer_(log_buffer),
441
+ output_directory_(output_directory),
442
+ stats_(stats),
443
+ bottommost_level_(false),
444
+ write_hint_(Env::WLTH_NOT_SET),
445
+ job_id_(job_id),
446
+ compaction_job_stats_(compaction_job_stats),
317
447
  dbname_(dbname),
318
448
  db_id_(db_id),
319
449
  db_session_id_(db_session_id),
320
- db_options_(db_options),
321
450
  file_options_(file_options),
322
451
  env_(db_options.env),
323
452
  io_tracer_(io_tracer),
@@ -327,25 +456,23 @@ CompactionJob::CompactionJob(
327
456
  versions_(versions),
328
457
  shutting_down_(shutting_down),
329
458
  manual_compaction_paused_(manual_compaction_paused),
330
- preserve_deletes_seqnum_(preserve_deletes_seqnum),
331
- log_buffer_(log_buffer),
459
+ manual_compaction_canceled_(manual_compaction_canceled),
332
460
  db_directory_(db_directory),
333
- output_directory_(output_directory),
334
461
  blob_output_directory_(blob_output_directory),
335
- stats_(stats),
336
462
  db_mutex_(db_mutex),
337
463
  db_error_handler_(db_error_handler),
338
464
  existing_snapshots_(std::move(existing_snapshots)),
339
465
  earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
340
466
  snapshot_checker_(snapshot_checker),
467
+ job_context_(job_context),
341
468
  table_cache_(std::move(table_cache)),
342
469
  event_logger_(event_logger),
343
- bottommost_level_(false),
344
470
  paranoid_file_checks_(paranoid_file_checks),
345
471
  measure_io_stats_(measure_io_stats),
346
- write_hint_(Env::WLTH_NOT_SET),
347
472
  thread_pri_(thread_pri),
348
- full_history_ts_low_(std::move(full_history_ts_low)) {
473
+ full_history_ts_low_(std::move(full_history_ts_low)),
474
+ trim_ts_(std::move(trim_ts)),
475
+ blob_callback_(blob_callback) {
349
476
  assert(compaction_job_stats_ != nullptr);
350
477
  assert(log_buffer_ != nullptr);
351
478
  const auto* cfd = compact_->compaction->column_family_data();
@@ -407,7 +534,7 @@ void CompactionJob::Prepare() {
407
534
  AutoThreadOperationStageUpdater stage_updater(
408
535
  ThreadStatus::STAGE_COMPACTION_PREPARE);
409
536
 
410
- // Generate file_levels_ for compaction berfore making Iterator
537
+ // Generate file_levels_ for compaction before making Iterator
411
538
  auto* c = compact_->compaction;
412
539
  assert(c->column_family_data() != nullptr);
413
540
  assert(c->column_family_data()->current()->storage_info()->NumLevelFiles(
@@ -419,7 +546,7 @@ void CompactionJob::Prepare() {
419
546
 
420
547
  if (c->ShouldFormSubcompactions()) {
421
548
  {
422
- StopWatch sw(env_, stats_, SUBCOMPACTION_SETUP_TIME);
549
+ StopWatch sw(db_options_.clock, stats_, SUBCOMPACTION_SETUP_TIME);
423
550
  GenSubcompactionBoundaries();
424
551
  }
425
552
  assert(sizes_.size() == boundaries_.size() + 1);
@@ -427,7 +554,8 @@ void CompactionJob::Prepare() {
427
554
  for (size_t i = 0; i <= boundaries_.size(); i++) {
428
555
  Slice* start = i == 0 ? nullptr : &boundaries_[i - 1];
429
556
  Slice* end = i == boundaries_.size() ? nullptr : &boundaries_[i];
430
- compact_->sub_compact_states.emplace_back(c, start, end, sizes_[i]);
557
+ compact_->sub_compact_states.emplace_back(c, start, end, sizes_[i],
558
+ static_cast<uint32_t>(i));
431
559
  }
432
560
  RecordInHistogram(stats_, NUM_SUBCOMPACTIONS_SCHEDULED,
433
561
  compact_->sub_compact_states.size());
@@ -436,7 +564,8 @@ void CompactionJob::Prepare() {
436
564
  constexpr Slice* end = nullptr;
437
565
  constexpr uint64_t size = 0;
438
566
 
439
- compact_->sub_compact_states.emplace_back(c, start, end, size);
567
+ compact_->sub_compact_states.emplace_back(c, start, end, size,
568
+ /*sub_job_id*/ 0);
440
569
  }
441
570
  }
442
571
 
@@ -542,9 +671,10 @@ void CompactionJob::GenSubcompactionBoundaries() {
542
671
  int base_level = v->storage_info()->base_level();
543
672
  uint64_t max_output_files = static_cast<uint64_t>(std::ceil(
544
673
  sum / min_file_fill_percent /
545
- MaxFileSizeForLevel(*(c->mutable_cf_options()), out_lvl,
546
- c->immutable_cf_options()->compaction_style, base_level,
547
- c->immutable_cf_options()->level_compaction_dynamic_level_bytes)));
674
+ MaxFileSizeForLevel(
675
+ *(c->mutable_cf_options()), out_lvl,
676
+ c->immutable_options()->compaction_style, base_level,
677
+ c->immutable_options()->level_compaction_dynamic_level_bytes)));
548
678
  uint64_t subcompactions =
549
679
  std::min({static_cast<uint64_t>(ranges.size()),
550
680
  static_cast<uint64_t>(c->max_subcompactions()),
@@ -585,7 +715,7 @@ Status CompactionJob::Run() {
585
715
 
586
716
  const size_t num_threads = compact_->sub_compact_states.size();
587
717
  assert(num_threads > 0);
588
- const uint64_t start_micros = env_->NowMicros();
718
+ const uint64_t start_micros = db_options_.clock->NowMicros();
589
719
 
590
720
  // Launch a thread for each of subcompactions 1...num_threads-1
591
721
  std::vector<port::Thread> thread_pool;
@@ -604,7 +734,7 @@ Status CompactionJob::Run() {
604
734
  thread.join();
605
735
  }
606
736
 
607
- compaction_stats_.micros = env_->NowMicros() - start_micros;
737
+ compaction_stats_.micros = db_options_.clock->NowMicros() - start_micros;
608
738
  compaction_stats_.cpu_micros = 0;
609
739
  for (size_t i = 0; i < compact_->sub_compact_states.size(); i++) {
610
740
  compaction_stats_.cpu_micros +=
@@ -641,12 +771,16 @@ Status CompactionJob::Run() {
641
771
  constexpr IODebugContext* dbg = nullptr;
642
772
 
643
773
  if (output_directory_) {
644
- io_s = output_directory_->Fsync(IOOptions(), dbg);
774
+ io_s = output_directory_->FsyncWithDirOptions(
775
+ IOOptions(), dbg,
776
+ DirFsyncOptions(DirFsyncOptions::FsyncReason::kNewFileSynced));
645
777
  }
646
778
 
647
779
  if (io_s.ok() && wrote_new_blob_files && blob_output_directory_ &&
648
780
  blob_output_directory_ != output_directory_) {
649
- io_s = blob_output_directory_->Fsync(IOOptions(), dbg);
781
+ io_s = blob_output_directory_->FsyncWithDirOptions(
782
+ IOOptions(), dbg,
783
+ DirFsyncOptions(DirFsyncOptions::FsyncReason::kNewFileSynced));
650
784
  }
651
785
  }
652
786
  if (io_status_.ok()) {
@@ -664,8 +798,8 @@ Status CompactionJob::Run() {
664
798
  }
665
799
  }
666
800
  ColumnFamilyData* cfd = compact_->compaction->column_family_data();
667
- auto prefix_extractor =
668
- compact_->compaction->mutable_cf_options()->prefix_extractor.get();
801
+ auto& prefix_extractor =
802
+ compact_->compaction->mutable_cf_options()->prefix_extractor;
669
803
  std::atomic<size_t> next_file_idx(0);
670
804
  auto verify_table = [&](Status& output_status) {
671
805
  while (true) {
@@ -743,7 +877,7 @@ Status CompactionJob::Run() {
743
877
  for (const auto& state : compact_->sub_compact_states) {
744
878
  for (const auto& output : state.outputs) {
745
879
  auto fn =
746
- TableFileName(state.compaction->immutable_cf_options()->cf_paths,
880
+ TableFileName(state.compaction->immutable_options()->cf_paths,
747
881
  output.meta.fd.GetNumber(), output.meta.fd.GetPathId());
748
882
  tp[fn] = output.table_properties;
749
883
  }
@@ -792,55 +926,64 @@ Status CompactionJob::Install(const MutableCFOptions& mutable_cf_options) {
792
926
  double bytes_read_per_sec = 0;
793
927
  double bytes_written_per_sec = 0;
794
928
 
795
- if (stats.bytes_read_non_output_levels > 0) {
796
- read_write_amp = (stats.bytes_written + stats.bytes_read_output_level +
797
- stats.bytes_read_non_output_levels) /
798
- static_cast<double>(stats.bytes_read_non_output_levels);
799
- write_amp = stats.bytes_written /
800
- static_cast<double>(stats.bytes_read_non_output_levels);
929
+ const uint64_t bytes_read_non_output_and_blob =
930
+ stats.bytes_read_non_output_levels + stats.bytes_read_blob;
931
+ const uint64_t bytes_read_all =
932
+ stats.bytes_read_output_level + bytes_read_non_output_and_blob;
933
+ const uint64_t bytes_written_all =
934
+ stats.bytes_written + stats.bytes_written_blob;
935
+
936
+ if (bytes_read_non_output_and_blob > 0) {
937
+ read_write_amp = (bytes_written_all + bytes_read_all) /
938
+ static_cast<double>(bytes_read_non_output_and_blob);
939
+ write_amp =
940
+ bytes_written_all / static_cast<double>(bytes_read_non_output_and_blob);
801
941
  }
802
942
  if (stats.micros > 0) {
803
- bytes_read_per_sec =
804
- (stats.bytes_read_non_output_levels + stats.bytes_read_output_level) /
805
- static_cast<double>(stats.micros);
943
+ bytes_read_per_sec = bytes_read_all / static_cast<double>(stats.micros);
806
944
  bytes_written_per_sec =
807
- stats.bytes_written / static_cast<double>(stats.micros);
945
+ bytes_written_all / static_cast<double>(stats.micros);
808
946
  }
809
947
 
810
948
  const std::string& column_family_name = cfd->GetName();
811
949
 
950
+ constexpr double kMB = 1048576.0;
951
+
812
952
  ROCKS_LOG_BUFFER(
813
953
  log_buffer_,
814
954
  "[%s] compacted to: %s, MB/sec: %.1f rd, %.1f wr, level %d, "
815
- "files in(%d, %d) out(%d) "
816
- "MB in(%.1f, %.1f) out(%.1f), read-write-amplify(%.1f) "
817
- "write-amplify(%.1f) %s, records in: %" PRIu64
955
+ "files in(%d, %d) out(%d +%d blob) "
956
+ "MB in(%.1f, %.1f +%.1f blob) out(%.1f +%.1f blob), "
957
+ "read-write-amplify(%.1f) write-amplify(%.1f) %s, records in: %" PRIu64
818
958
  ", records dropped: %" PRIu64 " output_compression: %s\n",
819
959
  column_family_name.c_str(), vstorage->LevelSummary(&tmp),
820
960
  bytes_read_per_sec, bytes_written_per_sec,
821
961
  compact_->compaction->output_level(),
822
962
  stats.num_input_files_in_non_output_levels,
823
963
  stats.num_input_files_in_output_level, stats.num_output_files,
824
- stats.bytes_read_non_output_levels / 1048576.0,
825
- stats.bytes_read_output_level / 1048576.0,
826
- stats.bytes_written / 1048576.0, read_write_amp, write_amp,
827
- status.ToString().c_str(), stats.num_input_records,
964
+ stats.num_output_files_blob, stats.bytes_read_non_output_levels / kMB,
965
+ stats.bytes_read_output_level / kMB, stats.bytes_read_blob / kMB,
966
+ stats.bytes_written / kMB, stats.bytes_written_blob / kMB, read_write_amp,
967
+ write_amp, status.ToString().c_str(), stats.num_input_records,
828
968
  stats.num_dropped_records,
829
969
  CompressionTypeToString(compact_->compaction->output_compression())
830
970
  .c_str());
831
971
 
832
972
  const auto& blob_files = vstorage->GetBlobFiles();
833
973
  if (!blob_files.empty()) {
834
- ROCKS_LOG_BUFFER(log_buffer_,
835
- "[%s] Blob file summary: head=%" PRIu64 ", tail=%" PRIu64
836
- "\n",
837
- column_family_name.c_str(), blob_files.begin()->first,
838
- blob_files.rbegin()->first);
974
+ assert(blob_files.front());
975
+ assert(blob_files.back());
976
+
977
+ ROCKS_LOG_BUFFER(
978
+ log_buffer_,
979
+ "[%s] Blob file summary: head=%" PRIu64 ", tail=%" PRIu64 "\n",
980
+ column_family_name.c_str(), blob_files.front()->GetBlobFileNumber(),
981
+ blob_files.back()->GetBlobFileNumber());
839
982
  }
840
983
 
841
984
  UpdateCompactionJobStats(stats);
842
985
 
843
- auto stream = event_logger_->LogToBuffer(log_buffer_);
986
+ auto stream = event_logger_->LogToBuffer(log_buffer_, 8192);
844
987
  stream << "job" << job_id_ << "event"
845
988
  << "compaction_finished"
846
989
  << "compaction_time_micros" << stats.micros
@@ -882,19 +1025,298 @@ Status CompactionJob::Install(const MutableCFOptions& mutable_cf_options) {
882
1025
  stream.EndArray();
883
1026
 
884
1027
  if (!blob_files.empty()) {
885
- stream << "blob_file_head" << blob_files.begin()->first;
886
- stream << "blob_file_tail" << blob_files.rbegin()->first;
1028
+ assert(blob_files.front());
1029
+ stream << "blob_file_head" << blob_files.front()->GetBlobFileNumber();
1030
+
1031
+ assert(blob_files.back());
1032
+ stream << "blob_file_tail" << blob_files.back()->GetBlobFileNumber();
887
1033
  }
888
1034
 
889
1035
  CleanupCompaction();
890
1036
  return status;
891
1037
  }
892
1038
 
1039
+ #ifndef ROCKSDB_LITE
1040
+ CompactionServiceJobStatus
1041
+ CompactionJob::ProcessKeyValueCompactionWithCompactionService(
1042
+ SubcompactionState* sub_compact) {
1043
+ assert(sub_compact);
1044
+ assert(sub_compact->compaction);
1045
+ assert(db_options_.compaction_service);
1046
+
1047
+ const Compaction* compaction = sub_compact->compaction;
1048
+ CompactionServiceInput compaction_input;
1049
+ compaction_input.output_level = compaction->output_level();
1050
+
1051
+ const std::vector<CompactionInputFiles>& inputs =
1052
+ *(compact_->compaction->inputs());
1053
+ for (const auto& files_per_level : inputs) {
1054
+ for (const auto& file : files_per_level.files) {
1055
+ compaction_input.input_files.emplace_back(
1056
+ MakeTableFileName(file->fd.GetNumber()));
1057
+ }
1058
+ }
1059
+ compaction_input.column_family.name =
1060
+ compaction->column_family_data()->GetName();
1061
+ compaction_input.column_family.options =
1062
+ compaction->column_family_data()->GetLatestCFOptions();
1063
+ compaction_input.db_options =
1064
+ BuildDBOptions(db_options_, mutable_db_options_copy_);
1065
+ compaction_input.snapshots = existing_snapshots_;
1066
+ compaction_input.has_begin = sub_compact->start;
1067
+ compaction_input.begin =
1068
+ compaction_input.has_begin ? sub_compact->start->ToString() : "";
1069
+ compaction_input.has_end = sub_compact->end;
1070
+ compaction_input.end =
1071
+ compaction_input.has_end ? sub_compact->end->ToString() : "";
1072
+ compaction_input.approx_size = sub_compact->approx_size;
1073
+
1074
+ std::string compaction_input_binary;
1075
+ Status s = compaction_input.Write(&compaction_input_binary);
1076
+ if (!s.ok()) {
1077
+ sub_compact->status = s;
1078
+ return CompactionServiceJobStatus::kFailure;
1079
+ }
1080
+
1081
+ std::ostringstream input_files_oss;
1082
+ bool is_first_one = true;
1083
+ for (const auto& file : compaction_input.input_files) {
1084
+ input_files_oss << (is_first_one ? "" : ", ") << file;
1085
+ is_first_one = false;
1086
+ }
1087
+
1088
+ ROCKS_LOG_INFO(
1089
+ db_options_.info_log,
1090
+ "[%s] [JOB %d] Starting remote compaction (output level: %d): %s",
1091
+ compaction_input.column_family.name.c_str(), job_id_,
1092
+ compaction_input.output_level, input_files_oss.str().c_str());
1093
+ CompactionServiceJobInfo info(dbname_, db_id_, db_session_id_,
1094
+ GetCompactionId(sub_compact), thread_pri_);
1095
+ CompactionServiceJobStatus compaction_status =
1096
+ db_options_.compaction_service->StartV2(info, compaction_input_binary);
1097
+ switch (compaction_status) {
1098
+ case CompactionServiceJobStatus::kSuccess:
1099
+ break;
1100
+ case CompactionServiceJobStatus::kFailure:
1101
+ sub_compact->status = Status::Incomplete(
1102
+ "CompactionService failed to start compaction job.");
1103
+ ROCKS_LOG_WARN(db_options_.info_log,
1104
+ "[%s] [JOB %d] Remote compaction failed to start.",
1105
+ compaction_input.column_family.name.c_str(), job_id_);
1106
+ return compaction_status;
1107
+ case CompactionServiceJobStatus::kUseLocal:
1108
+ ROCKS_LOG_INFO(
1109
+ db_options_.info_log,
1110
+ "[%s] [JOB %d] Remote compaction fallback to local by API Start.",
1111
+ compaction_input.column_family.name.c_str(), job_id_);
1112
+ return compaction_status;
1113
+ default:
1114
+ assert(false); // unknown status
1115
+ break;
1116
+ }
1117
+
1118
+ ROCKS_LOG_INFO(db_options_.info_log,
1119
+ "[%s] [JOB %d] Waiting for remote compaction...",
1120
+ compaction_input.column_family.name.c_str(), job_id_);
1121
+ std::string compaction_result_binary;
1122
+ compaction_status = db_options_.compaction_service->WaitForCompleteV2(
1123
+ info, &compaction_result_binary);
1124
+
1125
+ if (compaction_status == CompactionServiceJobStatus::kUseLocal) {
1126
+ ROCKS_LOG_INFO(db_options_.info_log,
1127
+ "[%s] [JOB %d] Remote compaction fallback to local by API "
1128
+ "WaitForComplete.",
1129
+ compaction_input.column_family.name.c_str(), job_id_);
1130
+ return compaction_status;
1131
+ }
1132
+
1133
+ CompactionServiceResult compaction_result;
1134
+ s = CompactionServiceResult::Read(compaction_result_binary,
1135
+ &compaction_result);
1136
+
1137
+ if (compaction_status == CompactionServiceJobStatus::kFailure) {
1138
+ if (s.ok()) {
1139
+ if (compaction_result.status.ok()) {
1140
+ sub_compact->status = Status::Incomplete(
1141
+ "CompactionService failed to run the compaction job (even though "
1142
+ "the internal status is okay).");
1143
+ } else {
1144
+ // set the current sub compaction status with the status returned from
1145
+ // remote
1146
+ sub_compact->status = compaction_result.status;
1147
+ }
1148
+ } else {
1149
+ sub_compact->status = Status::Incomplete(
1150
+ "CompactionService failed to run the compaction job (and no valid "
1151
+ "result is returned).");
1152
+ compaction_result.status.PermitUncheckedError();
1153
+ }
1154
+ ROCKS_LOG_WARN(db_options_.info_log,
1155
+ "[%s] [JOB %d] Remote compaction failed.",
1156
+ compaction_input.column_family.name.c_str(), job_id_);
1157
+ return compaction_status;
1158
+ }
1159
+
1160
+ if (!s.ok()) {
1161
+ sub_compact->status = s;
1162
+ compaction_result.status.PermitUncheckedError();
1163
+ return CompactionServiceJobStatus::kFailure;
1164
+ }
1165
+ sub_compact->status = compaction_result.status;
1166
+
1167
+ std::ostringstream output_files_oss;
1168
+ is_first_one = true;
1169
+ for (const auto& file : compaction_result.output_files) {
1170
+ output_files_oss << (is_first_one ? "" : ", ") << file.file_name;
1171
+ is_first_one = false;
1172
+ }
1173
+
1174
+ ROCKS_LOG_INFO(db_options_.info_log,
1175
+ "[%s] [JOB %d] Receive remote compaction result, output path: "
1176
+ "%s, files: %s",
1177
+ compaction_input.column_family.name.c_str(), job_id_,
1178
+ compaction_result.output_path.c_str(),
1179
+ output_files_oss.str().c_str());
1180
+
1181
+ if (!s.ok()) {
1182
+ sub_compact->status = s;
1183
+ return CompactionServiceJobStatus::kFailure;
1184
+ }
1185
+
1186
+ for (const auto& file : compaction_result.output_files) {
1187
+ uint64_t file_num = versions_->NewFileNumber();
1188
+ auto src_file = compaction_result.output_path + "/" + file.file_name;
1189
+ auto tgt_file = TableFileName(compaction->immutable_options()->cf_paths,
1190
+ file_num, compaction->output_path_id());
1191
+ s = fs_->RenameFile(src_file, tgt_file, IOOptions(), nullptr);
1192
+ if (!s.ok()) {
1193
+ sub_compact->status = s;
1194
+ return CompactionServiceJobStatus::kFailure;
1195
+ }
1196
+
1197
+ FileMetaData meta;
1198
+ uint64_t file_size;
1199
+ s = fs_->GetFileSize(tgt_file, IOOptions(), &file_size, nullptr);
1200
+ if (!s.ok()) {
1201
+ sub_compact->status = s;
1202
+ return CompactionServiceJobStatus::kFailure;
1203
+ }
1204
+ meta.fd = FileDescriptor(file_num, compaction->output_path_id(), file_size,
1205
+ file.smallest_seqno, file.largest_seqno);
1206
+ meta.smallest.DecodeFrom(file.smallest_internal_key);
1207
+ meta.largest.DecodeFrom(file.largest_internal_key);
1208
+ meta.oldest_ancester_time = file.oldest_ancester_time;
1209
+ meta.file_creation_time = file.file_creation_time;
1210
+ meta.marked_for_compaction = file.marked_for_compaction;
1211
+
1212
+ auto cfd = compaction->column_family_data();
1213
+ sub_compact->outputs.emplace_back(std::move(meta),
1214
+ cfd->internal_comparator(), false, false,
1215
+ true, file.paranoid_hash);
1216
+ }
1217
+ sub_compact->compaction_job_stats = compaction_result.stats;
1218
+ sub_compact->num_output_records = compaction_result.num_output_records;
1219
+ sub_compact->approx_size = compaction_input.approx_size; // is this used?
1220
+ sub_compact->total_bytes = compaction_result.total_bytes;
1221
+ RecordTick(stats_, REMOTE_COMPACT_READ_BYTES, compaction_result.bytes_read);
1222
+ RecordTick(stats_, REMOTE_COMPACT_WRITE_BYTES,
1223
+ compaction_result.bytes_written);
1224
+ return CompactionServiceJobStatus::kSuccess;
1225
+ }
1226
+
1227
+ void CompactionJob::BuildSubcompactionJobInfo(
1228
+ SubcompactionState* sub_compact,
1229
+ SubcompactionJobInfo* subcompaction_job_info) const {
1230
+ Compaction* c = compact_->compaction;
1231
+ ColumnFamilyData* cfd = c->column_family_data();
1232
+
1233
+ subcompaction_job_info->cf_id = cfd->GetID();
1234
+ subcompaction_job_info->cf_name = cfd->GetName();
1235
+ subcompaction_job_info->status = sub_compact->status;
1236
+ subcompaction_job_info->thread_id = env_->GetThreadID();
1237
+ subcompaction_job_info->job_id = job_id_;
1238
+ subcompaction_job_info->subcompaction_job_id = sub_compact->sub_job_id;
1239
+ subcompaction_job_info->base_input_level = c->start_level();
1240
+ subcompaction_job_info->output_level = c->output_level();
1241
+ subcompaction_job_info->stats = sub_compact->compaction_job_stats;
1242
+ }
1243
+ #endif // !ROCKSDB_LITE
1244
+
1245
+ void CompactionJob::NotifyOnSubcompactionBegin(
1246
+ SubcompactionState* sub_compact) {
1247
+ #ifndef ROCKSDB_LITE
1248
+ Compaction* c = compact_->compaction;
1249
+
1250
+ if (db_options_.listeners.empty()) {
1251
+ return;
1252
+ }
1253
+ if (shutting_down_->load(std::memory_order_acquire)) {
1254
+ return;
1255
+ }
1256
+ if (c->is_manual_compaction() && manual_compaction_paused_ &&
1257
+ manual_compaction_paused_->load(std::memory_order_acquire) > 0) {
1258
+ return;
1259
+ }
1260
+
1261
+ sub_compact->notify_on_subcompaction_completion = true;
1262
+
1263
+ SubcompactionJobInfo info{};
1264
+ BuildSubcompactionJobInfo(sub_compact, &info);
1265
+
1266
+ for (auto listener : db_options_.listeners) {
1267
+ listener->OnSubcompactionBegin(info);
1268
+ }
1269
+ info.status.PermitUncheckedError();
1270
+
1271
+ #else
1272
+ (void)sub_compact;
1273
+ #endif // ROCKSDB_LITE
1274
+ }
1275
+
1276
+ void CompactionJob::NotifyOnSubcompactionCompleted(
1277
+ SubcompactionState* sub_compact) {
1278
+ #ifndef ROCKSDB_LITE
1279
+
1280
+ if (db_options_.listeners.empty()) {
1281
+ return;
1282
+ }
1283
+ if (shutting_down_->load(std::memory_order_acquire)) {
1284
+ return;
1285
+ }
1286
+
1287
+ if (sub_compact->notify_on_subcompaction_completion == false) {
1288
+ return;
1289
+ }
1290
+
1291
+ SubcompactionJobInfo info{};
1292
+ BuildSubcompactionJobInfo(sub_compact, &info);
1293
+
1294
+ for (auto listener : db_options_.listeners) {
1295
+ listener->OnSubcompactionCompleted(info);
1296
+ }
1297
+ #else
1298
+ (void)sub_compact;
1299
+ #endif // ROCKSDB_LITE
1300
+ }
1301
+
893
1302
  void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
894
1303
  assert(sub_compact);
895
1304
  assert(sub_compact->compaction);
896
1305
 
897
- uint64_t prev_cpu_micros = env_->NowCPUNanos() / 1000;
1306
+ #ifndef ROCKSDB_LITE
1307
+ if (db_options_.compaction_service) {
1308
+ CompactionServiceJobStatus comp_status =
1309
+ ProcessKeyValueCompactionWithCompactionService(sub_compact);
1310
+ if (comp_status == CompactionServiceJobStatus::kSuccess ||
1311
+ comp_status == CompactionServiceJobStatus::kFailure) {
1312
+ return;
1313
+ }
1314
+ // fallback to local compaction
1315
+ assert(comp_status == CompactionServiceJobStatus::kUseLocal);
1316
+ }
1317
+ #endif // !ROCKSDB_LITE
1318
+
1319
+ uint64_t prev_cpu_micros = db_options_.clock->CPUMicros();
898
1320
 
899
1321
  ColumnFamilyData* cfd = sub_compact->compaction->column_family_data();
900
1322
 
@@ -915,22 +1337,82 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
915
1337
  return;
916
1338
  }
917
1339
 
1340
+ NotifyOnSubcompactionBegin(sub_compact);
1341
+
918
1342
  CompactionRangeDelAggregator range_del_agg(&cfd->internal_comparator(),
919
1343
  existing_snapshots_);
1344
+
1345
+ // TODO: since we already use C++17, should use
1346
+ // std::optional<const Slice> instead.
1347
+ const Slice* const start = sub_compact->start;
1348
+ const Slice* const end = sub_compact->end;
1349
+
920
1350
  ReadOptions read_options;
921
1351
  read_options.verify_checksums = true;
922
1352
  read_options.fill_cache = false;
1353
+ read_options.rate_limiter_priority = Env::IO_LOW;
923
1354
  // Compaction iterators shouldn't be confined to a single prefix.
924
1355
  // Compactions use Seek() for
925
1356
  // (a) concurrent compactions,
926
1357
  // (b) CompactionFilter::Decision::kRemoveAndSkipUntil.
927
1358
  read_options.total_order_seek = true;
928
1359
 
1360
+ // Note: if we're going to support subcompactions for user-defined timestamps,
1361
+ // the timestamp part will have to be stripped from the bounds here.
1362
+ assert((!start && !end) || cfd->user_comparator()->timestamp_size() == 0);
1363
+ read_options.iterate_lower_bound = start;
1364
+ read_options.iterate_upper_bound = end;
1365
+
929
1366
  // Although the v2 aggregator is what the level iterator(s) know about,
930
1367
  // the AddTombstones calls will be propagated down to the v1 aggregator.
931
- std::unique_ptr<InternalIterator> input(
932
- versions_->MakeInputIterator(read_options, sub_compact->compaction,
933
- &range_del_agg, file_options_for_read_));
1368
+ std::unique_ptr<InternalIterator> raw_input(versions_->MakeInputIterator(
1369
+ read_options, sub_compact->compaction, &range_del_agg,
1370
+ file_options_for_read_,
1371
+ (start == nullptr) ? std::optional<const Slice>{}
1372
+ : std::optional<const Slice>{*start},
1373
+ (end == nullptr) ? std::optional<const Slice>{}
1374
+ : std::optional<const Slice>{*end}));
1375
+ InternalIterator* input = raw_input.get();
1376
+
1377
+ IterKey start_ikey;
1378
+ IterKey end_ikey;
1379
+ Slice start_slice;
1380
+ Slice end_slice;
1381
+
1382
+ if (start) {
1383
+ start_ikey.SetInternalKey(*start, kMaxSequenceNumber, kValueTypeForSeek);
1384
+ start_slice = start_ikey.GetInternalKey();
1385
+ }
1386
+ if (end) {
1387
+ end_ikey.SetInternalKey(*end, kMaxSequenceNumber, kValueTypeForSeek);
1388
+ end_slice = end_ikey.GetInternalKey();
1389
+ }
1390
+
1391
+ std::unique_ptr<InternalIterator> clip;
1392
+ if (start || end) {
1393
+ clip = std::make_unique<ClippingIterator>(
1394
+ raw_input.get(), start ? &start_slice : nullptr,
1395
+ end ? &end_slice : nullptr, &cfd->internal_comparator());
1396
+ input = clip.get();
1397
+ }
1398
+
1399
+ std::unique_ptr<InternalIterator> blob_counter;
1400
+
1401
+ if (sub_compact->compaction->DoesInputReferenceBlobFiles()) {
1402
+ sub_compact->blob_garbage_meter = std::make_unique<BlobGarbageMeter>();
1403
+ blob_counter = std::make_unique<BlobCountingIterator>(
1404
+ input, sub_compact->blob_garbage_meter.get());
1405
+ input = blob_counter.get();
1406
+ }
1407
+
1408
+ std::unique_ptr<InternalIterator> trim_history_iter;
1409
+ if (cfd->user_comparator()->timestamp_size() > 0 && !trim_ts_.empty()) {
1410
+ trim_history_iter = std::make_unique<HistoryTrimmingIterator>(
1411
+ input, cfd->user_comparator(), trim_ts_);
1412
+ input = trim_history_iter.get();
1413
+ }
1414
+
1415
+ input->SeekToFirst();
934
1416
 
935
1417
  AutoThreadOperationStageUpdater stage_updater(
936
1418
  ThreadStatus::STAGE_COMPACTION_PROCESS_KV);
@@ -956,12 +1438,11 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
956
1438
  }
957
1439
 
958
1440
  MergeHelper merge(
959
- env_, cfd->user_comparator(), cfd->ioptions()->merge_operator,
1441
+ env_, cfd->user_comparator(), cfd->ioptions()->merge_operator.get(),
960
1442
  compaction_filter, db_options_.info_log.get(),
961
1443
  false /* internal key corruption is expected */,
962
1444
  existing_snapshots_.empty() ? 0 : existing_snapshots_.back(),
963
- snapshot_checker_, compact_->compaction->level(),
964
- db_options_.statistics.get());
1445
+ snapshot_checker_, compact_->compaction->level(), db_options_.stats);
965
1446
 
966
1447
  const MutableCFOptions* mutable_cf_options =
967
1448
  sub_compact->compaction->mutable_cf_options();
@@ -972,10 +1453,11 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
972
1453
  std::unique_ptr<BlobFileBuilder> blob_file_builder(
973
1454
  mutable_cf_options->enable_blob_files
974
1455
  ? new BlobFileBuilder(
975
- versions_, env_, fs_.get(),
976
- sub_compact->compaction->immutable_cf_options(),
1456
+ versions_, fs_.get(),
1457
+ sub_compact->compaction->immutable_options(),
977
1458
  mutable_cf_options, &file_options_, job_id_, cfd->GetID(),
978
1459
  cfd->GetName(), Env::IOPriority::IO_LOW, write_hint_,
1460
+ io_tracer_, blob_callback_, BlobFileCreationReason::kCompaction,
979
1461
  &blob_file_paths, &sub_compact->blob_file_additions)
980
1462
  : nullptr);
981
1463
 
@@ -985,31 +1467,25 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
985
1467
  reinterpret_cast<void*>(
986
1468
  const_cast<std::atomic<int>*>(manual_compaction_paused_)));
987
1469
 
988
- Slice* start = sub_compact->start;
989
- Slice* end = sub_compact->end;
990
- if (start != nullptr) {
991
- IterKey start_iter;
992
- start_iter.SetInternalKey(*start, kMaxSequenceNumber, kValueTypeForSeek);
993
- input->Seek(start_iter.GetInternalKey());
994
- } else {
995
- input->SeekToFirst();
996
- }
997
-
998
1470
  Status status;
999
1471
  const std::string* const full_history_ts_low =
1000
1472
  full_history_ts_low_.empty() ? nullptr : &full_history_ts_low_;
1473
+ const SequenceNumber job_snapshot_seq =
1474
+ job_context_ ? job_context_->GetJobSnapshotSequence()
1475
+ : kMaxSequenceNumber;
1001
1476
  sub_compact->c_iter.reset(new CompactionIterator(
1002
- input.get(), cfd->user_comparator(), &merge, versions_->LastSequence(),
1003
- &existing_snapshots_, earliest_write_conflict_snapshot_,
1477
+ input, cfd->user_comparator(), &merge, versions_->LastSequence(),
1478
+ &existing_snapshots_, earliest_write_conflict_snapshot_, job_snapshot_seq,
1004
1479
  snapshot_checker_, env_, ShouldReportDetailedTime(env_, stats_),
1005
1480
  /*expect_valid_internal_key=*/true, &range_del_agg,
1006
1481
  blob_file_builder.get(), db_options_.allow_data_in_errors,
1007
1482
  sub_compact->compaction, compaction_filter, shutting_down_,
1008
- preserve_deletes_seqnum_, manual_compaction_paused_, db_options_.info_log,
1009
- full_history_ts_low));
1483
+ manual_compaction_paused_, manual_compaction_canceled_,
1484
+ db_options_.info_log, full_history_ts_low));
1010
1485
  auto c_iter = sub_compact->c_iter.get();
1011
1486
  c_iter->SeekToFirst();
1012
1487
  if (c_iter->Valid() && sub_compact->compaction->output_level() != 0) {
1488
+ sub_compact->FillFilesToCutForTtl();
1013
1489
  // ShouldStopBefore() maintains state based on keys processed so far. The
1014
1490
  // compaction loop always calls it on the "next" key, thus won't tell it the
1015
1491
  // first key. So we do that here.
@@ -1030,12 +1506,9 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1030
1506
  const Slice& key = c_iter->key();
1031
1507
  const Slice& value = c_iter->value();
1032
1508
 
1033
- // If an end key (exclusive) is specified, check if the current key is
1034
- // >= than it and exit if it is because the iterator is out of its range
1035
- if (end != nullptr &&
1036
- cfd->user_comparator()->Compare(c_iter->user_key(), *end) >= 0) {
1037
- break;
1038
- }
1509
+ assert(!end ||
1510
+ cfd->user_comparator()->Compare(c_iter->user_key(), *end) < 0);
1511
+
1039
1512
  if (c_iter_stats.num_input_records % kRecordStatsEvery ==
1040
1513
  kRecordStatsEvery - 1) {
1041
1514
  RecordDroppedKeys(c_iter_stats, &sub_compact->compaction_job_stats);
@@ -1055,11 +1528,20 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1055
1528
  break;
1056
1529
  }
1057
1530
 
1058
- sub_compact->current_output_file_size =
1059
- sub_compact->builder->EstimatedFileSize();
1531
+ status = sub_compact->ProcessOutFlowIfNeeded(key, value);
1532
+ if (!status.ok()) {
1533
+ break;
1534
+ }
1535
+
1060
1536
  const ParsedInternalKey& ikey = c_iter->ikey();
1061
- sub_compact->current_output()->meta.UpdateBoundaries(
1537
+ status = sub_compact->current_output()->meta.UpdateBoundaries(
1062
1538
  key, value, ikey.sequence, ikey.type);
1539
+ if (!status.ok()) {
1540
+ break;
1541
+ }
1542
+
1543
+ sub_compact->current_output_file_size =
1544
+ sub_compact->builder->EstimatedFileSize();
1063
1545
  sub_compact->num_output_records++;
1064
1546
 
1065
1547
  // Close output file if it is big enough. Two possibilities determine it's
@@ -1119,6 +1601,10 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1119
1601
  }
1120
1602
  }
1121
1603
 
1604
+ sub_compact->compaction_job_stats.num_blobs_read =
1605
+ c_iter_stats.num_blobs_read;
1606
+ sub_compact->compaction_job_stats.total_blob_bytes_read =
1607
+ c_iter_stats.total_blob_bytes_read;
1122
1608
  sub_compact->compaction_job_stats.num_input_deletion_records =
1123
1609
  c_iter_stats.num_input_deletion_records;
1124
1610
  sub_compact->compaction_job_stats.num_corrupt_keys =
@@ -1134,6 +1620,16 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1134
1620
 
1135
1621
  RecordTick(stats_, FILTER_OPERATION_TOTAL_TIME,
1136
1622
  c_iter_stats.total_filter_time);
1623
+
1624
+ if (c_iter_stats.num_blobs_relocated > 0) {
1625
+ RecordTick(stats_, BLOB_DB_GC_NUM_KEYS_RELOCATED,
1626
+ c_iter_stats.num_blobs_relocated);
1627
+ }
1628
+ if (c_iter_stats.total_blob_bytes_relocated > 0) {
1629
+ RecordTick(stats_, BLOB_DB_GC_BYTES_RELOCATED,
1630
+ c_iter_stats.total_blob_bytes_relocated);
1631
+ }
1632
+
1137
1633
  RecordDroppedKeys(c_iter_stats, &sub_compact->compaction_job_stats);
1138
1634
  RecordCompactionIOStats();
1139
1635
 
@@ -1146,8 +1642,10 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1146
1642
  status = Status::ShutdownInProgress("Database shutdown");
1147
1643
  }
1148
1644
  if ((status.ok() || status.IsColumnFamilyDropped()) &&
1149
- (manual_compaction_paused_ &&
1150
- manual_compaction_paused_->load(std::memory_order_relaxed) > 0)) {
1645
+ ((manual_compaction_paused_ &&
1646
+ manual_compaction_paused_->load(std::memory_order_relaxed) > 0) ||
1647
+ (manual_compaction_canceled_ &&
1648
+ manual_compaction_canceled_->load(std::memory_order_relaxed)))) {
1151
1649
  status = Status::Incomplete(Status::SubCode::kManualCompactionPaused);
1152
1650
  }
1153
1651
  if (status.ok()) {
@@ -1178,13 +1676,14 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1178
1676
  if (blob_file_builder) {
1179
1677
  if (status.ok()) {
1180
1678
  status = blob_file_builder->Finish();
1679
+ } else {
1680
+ blob_file_builder->Abandon(status);
1181
1681
  }
1182
-
1183
1682
  blob_file_builder.reset();
1184
1683
  }
1185
1684
 
1186
1685
  sub_compact->compaction_job_stats.cpu_micros =
1187
- env_->NowCPUNanos() / 1000 - prev_cpu_micros;
1686
+ db_options_.clock->CPUMicros() - prev_cpu_micros;
1188
1687
 
1189
1688
  if (measure_io_stats_) {
1190
1689
  sub_compact->compaction_job_stats.file_write_nanos +=
@@ -1215,8 +1714,15 @@ void CompactionJob::ProcessKeyValueCompaction(SubcompactionState* sub_compact) {
1215
1714
  #endif // ROCKSDB_ASSERT_STATUS_CHECKED
1216
1715
 
1217
1716
  sub_compact->c_iter.reset();
1218
- input.reset();
1717
+ blob_counter.reset();
1718
+ clip.reset();
1719
+ raw_input.reset();
1219
1720
  sub_compact->status = status;
1721
+ NotifyOnSubcompactionCompleted(sub_compact);
1722
+ }
1723
+
1724
+ uint64_t CompactionJob::GetCompactionId(SubcompactionState* sub_compact) {
1725
+ return (uint64_t)job_id_ << 32 | sub_compact->sub_job_id;
1220
1726
  }
1221
1727
 
1222
1728
  void CompactionJob::RecordDroppedKeys(
@@ -1433,7 +1939,6 @@ Status CompactionJob::FinishCompactionOutputFile(
1433
1939
  meta->UpdateBoundariesForRange(smallest_candidate, largest_candidate,
1434
1940
  tombstone.seq_,
1435
1941
  cfd->internal_comparator());
1436
-
1437
1942
  // The smallest key in a file is used for range tombstone truncation, so
1438
1943
  // it cannot have a seqnum of 0 (unless the smallest data key in a file
1439
1944
  // has a seqnum of 0). Otherwise, the truncated tombstone may expose
@@ -1457,13 +1962,30 @@ Status CompactionJob::FinishCompactionOutputFile(
1457
1962
  if (s.ok()) {
1458
1963
  meta->fd.file_size = current_bytes;
1459
1964
  meta->marked_for_compaction = sub_compact->builder->NeedCompact();
1965
+ // With accurate smallest and largest key, we can get a slightly more
1966
+ // accurate oldest ancester time.
1967
+ // This makes oldest ancester time in manifest more accurate than in
1968
+ // table properties. Not sure how to resolve it.
1969
+ if (meta->smallest.size() > 0 && meta->largest.size() > 0) {
1970
+ uint64_t refined_oldest_ancester_time;
1971
+ Slice new_smallest = meta->smallest.user_key();
1972
+ Slice new_largest = meta->largest.user_key();
1973
+ if (!new_largest.empty() && !new_smallest.empty()) {
1974
+ refined_oldest_ancester_time =
1975
+ sub_compact->compaction->MinInputFileOldestAncesterTime(
1976
+ &(meta->smallest), &(meta->largest));
1977
+ if (refined_oldest_ancester_time != port::kMaxUint64) {
1978
+ meta->oldest_ancester_time = refined_oldest_ancester_time;
1979
+ }
1980
+ }
1981
+ }
1460
1982
  }
1461
1983
  sub_compact->current_output()->finished = true;
1462
1984
  sub_compact->total_bytes += current_bytes;
1463
1985
 
1464
1986
  // Finish and check for file errors
1465
1987
  if (s.ok()) {
1466
- StopWatch sw(env_, stats_, COMPACTION_OUTFILE_SYNC_MICROS);
1988
+ StopWatch sw(db_options_.clock, stats_, COMPACTION_OUTFILE_SYNC_MICROS);
1467
1989
  io_s = sub_compact->outfile->Sync(db_options_.use_fsync);
1468
1990
  }
1469
1991
  if (s.ok() && io_s.ok()) {
@@ -1498,7 +2020,7 @@ Status CompactionJob::FinishCompactionOutputFile(
1498
2020
  // This happens when the output level is bottom level, at the same time
1499
2021
  // the sub_compact output nothing.
1500
2022
  std::string fname =
1501
- TableFileName(sub_compact->compaction->immutable_cf_options()->cf_paths,
2023
+ TableFileName(sub_compact->compaction->immutable_options()->cf_paths,
1502
2024
  meta->fd.GetNumber(), meta->fd.GetPathId());
1503
2025
 
1504
2026
  // TODO(AR) it is not clear if there are any larger implications if
@@ -1534,19 +2056,21 @@ Status CompactionJob::FinishCompactionOutputFile(
1534
2056
  std::string fname;
1535
2057
  FileDescriptor output_fd;
1536
2058
  uint64_t oldest_blob_file_number = kInvalidBlobFileNumber;
2059
+ Status status_for_listener = s;
1537
2060
  if (meta != nullptr) {
1538
- fname =
1539
- TableFileName(sub_compact->compaction->immutable_cf_options()->cf_paths,
1540
- meta->fd.GetNumber(), meta->fd.GetPathId());
2061
+ fname = GetTableFileName(meta->fd.GetNumber());
1541
2062
  output_fd = meta->fd;
1542
2063
  oldest_blob_file_number = meta->oldest_blob_file_number;
1543
2064
  } else {
1544
2065
  fname = "(nil)";
2066
+ if (s.ok()) {
2067
+ status_for_listener = Status::Aborted("Empty SST file not kept");
2068
+ }
1545
2069
  }
1546
2070
  EventHelpers::LogAndNotifyTableFileCreationFinished(
1547
2071
  event_logger_, cfd->ioptions()->listeners, dbname_, cfd->GetName(), fname,
1548
2072
  job_id_, output_fd, oldest_blob_file_number, tp,
1549
- TableFileCreationReason::kCompaction, s, file_checksum,
2073
+ TableFileCreationReason::kCompaction, status_for_listener, file_checksum,
1550
2074
  file_checksum_func_name);
1551
2075
 
1552
2076
  #ifndef ROCKSDB_LITE
@@ -1585,19 +2109,6 @@ Status CompactionJob::InstallCompactionResults(
1585
2109
  auto* compaction = compact_->compaction;
1586
2110
  assert(compaction);
1587
2111
 
1588
- // paranoia: verify that the files that we started with
1589
- // still exist in the current version and in the same original level.
1590
- // This ensures that a concurrent compaction did not erroneously
1591
- // pick the same files to compact_.
1592
- if (!versions_->VerifyCompactionFileConsistency(compaction)) {
1593
- Compaction::InputLevelSummaryBuffer inputs_summary;
1594
-
1595
- ROCKS_LOG_ERROR(db_options_.info_log, "[%s] [JOB %d] Compaction %s aborted",
1596
- compaction->column_family_data()->GetName().c_str(),
1597
- job_id_, compaction->InputLevelSummary(&inputs_summary));
1598
- return Status::Corruption("Compaction input files inconsistent");
1599
- }
1600
-
1601
2112
  {
1602
2113
  Compaction::InputLevelSummaryBuffer inputs_summary;
1603
2114
  ROCKS_LOG_INFO(db_options_.info_log,
@@ -1613,6 +2124,8 @@ Status CompactionJob::InstallCompactionResults(
1613
2124
  // Add compaction inputs
1614
2125
  compaction->AddInputDeletions(edit);
1615
2126
 
2127
+ std::unordered_map<uint64_t, BlobGarbageMeter::BlobStats> blob_total_garbage;
2128
+
1616
2129
  for (const auto& sub_compact : compact_->sub_compact_states) {
1617
2130
  for (const auto& out : sub_compact.outputs) {
1618
2131
  edit->AddFile(compaction->output_level(), out.meta);
@@ -1621,6 +2134,29 @@ Status CompactionJob::InstallCompactionResults(
1621
2134
  for (const auto& blob : sub_compact.blob_file_additions) {
1622
2135
  edit->AddBlobFile(blob);
1623
2136
  }
2137
+
2138
+ if (sub_compact.blob_garbage_meter) {
2139
+ const auto& flows = sub_compact.blob_garbage_meter->flows();
2140
+
2141
+ for (const auto& pair : flows) {
2142
+ const uint64_t blob_file_number = pair.first;
2143
+ const BlobGarbageMeter::BlobInOutFlow& flow = pair.second;
2144
+
2145
+ assert(flow.IsValid());
2146
+ if (flow.HasGarbage()) {
2147
+ blob_total_garbage[blob_file_number].Add(flow.GetGarbageCount(),
2148
+ flow.GetGarbageBytes());
2149
+ }
2150
+ }
2151
+ }
2152
+ }
2153
+
2154
+ for (const auto& pair : blob_total_garbage) {
2155
+ const uint64_t blob_file_number = pair.first;
2156
+ const BlobGarbageMeter::BlobStats& stats = pair.second;
2157
+
2158
+ edit->AddBlobFileGarbage(blob_file_number, stats.GetCount(),
2159
+ stats.GetBytes());
1624
2160
  }
1625
2161
 
1626
2162
  return versions_->LogAndApply(compaction->column_family_data(),
@@ -1657,9 +2193,7 @@ Status CompactionJob::OpenCompactionOutputFile(
1657
2193
  assert(sub_compact->builder == nullptr);
1658
2194
  // no need to lock because VersionSet::next_file_number_ is atomic
1659
2195
  uint64_t file_number = versions_->NewFileNumber();
1660
- std::string fname =
1661
- TableFileName(sub_compact->compaction->immutable_cf_options()->cf_paths,
1662
- file_number, sub_compact->compaction->output_path_id());
2196
+ std::string fname = GetTableFileName(file_number);
1663
2197
  // Fire events.
1664
2198
  ColumnFamilyData* cfd = sub_compact->compaction->column_family_data();
1665
2199
  #ifndef ROCKSDB_LITE
@@ -1674,9 +2208,18 @@ Status CompactionJob::OpenCompactionOutputFile(
1674
2208
  TEST_SYNC_POINT_CALLBACK("CompactionJob::OpenCompactionOutputFile",
1675
2209
  &syncpoint_arg);
1676
2210
  #endif
2211
+
2212
+ // Pass temperature of botommost files to FileSystem.
2213
+ FileOptions fo_copy = file_options_;
2214
+ Temperature temperature = sub_compact->compaction->output_temperature();
2215
+ if (temperature == Temperature::kUnknown && bottommost_level_) {
2216
+ temperature =
2217
+ sub_compact->compaction->mutable_cf_options()->bottommost_temperature;
2218
+ }
2219
+ fo_copy.temperature = temperature;
2220
+
1677
2221
  Status s;
1678
- IOStatus io_s =
1679
- NewWritableFile(fs_.get(), fname, &writable_file, file_options_);
2222
+ IOStatus io_s = NewWritableFile(fs_.get(), fname, &writable_file, fo_copy);
1680
2223
  s = io_s;
1681
2224
  if (sub_compact->io_status.ok()) {
1682
2225
  sub_compact->io_status = io_s;
@@ -1702,7 +2245,7 @@ Status CompactionJob::OpenCompactionOutputFile(
1702
2245
 
1703
2246
  // Try to figure out the output file's oldest ancester time.
1704
2247
  int64_t temp_current_time = 0;
1705
- auto get_time_status = env_->GetCurrentTime(&temp_current_time);
2248
+ auto get_time_status = db_options_.clock->GetCurrentTime(&temp_current_time);
1706
2249
  // Safe to proceed even if GetCurrentTime fails. So, log and proceed.
1707
2250
  if (!get_time_status.ok()) {
1708
2251
  ROCKS_LOG_WARN(db_options_.info_log,
@@ -1710,8 +2253,17 @@ Status CompactionJob::OpenCompactionOutputFile(
1710
2253
  get_time_status.ToString().c_str());
1711
2254
  }
1712
2255
  uint64_t current_time = static_cast<uint64_t>(temp_current_time);
2256
+ InternalKey tmp_start, tmp_end;
2257
+ if (sub_compact->start != nullptr) {
2258
+ tmp_start.SetMinPossibleForUserKey(*(sub_compact->start));
2259
+ }
2260
+ if (sub_compact->end != nullptr) {
2261
+ tmp_end.SetMinPossibleForUserKey(*(sub_compact->end));
2262
+ }
1713
2263
  uint64_t oldest_ancester_time =
1714
- sub_compact->compaction->MinInputFileOldestAncesterTime();
2264
+ sub_compact->compaction->MinInputFileOldestAncesterTime(
2265
+ (sub_compact->start != nullptr) ? &tmp_start : nullptr,
2266
+ (sub_compact->end != nullptr) ? &tmp_end : nullptr);
1715
2267
  if (oldest_ancester_time == port::kMaxUint64) {
1716
2268
  oldest_ancester_time = current_time;
1717
2269
  }
@@ -1723,6 +2275,7 @@ Status CompactionJob::OpenCompactionOutputFile(
1723
2275
  sub_compact->compaction->output_path_id(), 0);
1724
2276
  meta.oldest_ancester_time = oldest_ancester_time;
1725
2277
  meta.file_creation_time = current_time;
2278
+ meta.temperature = temperature;
1726
2279
  sub_compact->outputs.emplace_back(
1727
2280
  std::move(meta), cfd->internal_comparator(),
1728
2281
  /*enable_order_check=*/
@@ -1733,32 +2286,28 @@ Status CompactionJob::OpenCompactionOutputFile(
1733
2286
 
1734
2287
  writable_file->SetIOPriority(Env::IOPriority::IO_LOW);
1735
2288
  writable_file->SetWriteLifeTimeHint(write_hint_);
2289
+ FileTypeSet tmp_set = db_options_.checksum_handoff_file_types;
1736
2290
  writable_file->SetPreallocationBlockSize(static_cast<size_t>(
1737
2291
  sub_compact->compaction->OutputFilePreallocationSize()));
1738
2292
  const auto& listeners =
1739
- sub_compact->compaction->immutable_cf_options()->listeners;
2293
+ sub_compact->compaction->immutable_options()->listeners;
1740
2294
  sub_compact->outfile.reset(new WritableFileWriter(
1741
- std::move(writable_file), fname, file_options_, env_, io_tracer_,
1742
- db_options_.statistics.get(), listeners,
1743
- db_options_.file_checksum_gen_factory.get()));
1744
-
1745
- // If the Column family flag is to only optimize filters for hits,
1746
- // we can skip creating filters if this is the bottommost_level where
1747
- // data is going to be found
1748
- bool skip_filters =
1749
- cfd->ioptions()->optimize_filters_for_hits && bottommost_level_;
2295
+ std::move(writable_file), fname, fo_copy, db_options_.clock, io_tracer_,
2296
+ db_options_.stats, listeners, db_options_.file_checksum_gen_factory.get(),
2297
+ tmp_set.Contains(FileType::kTableFile), false));
1750
2298
 
1751
- sub_compact->builder.reset(NewTableBuilder(
2299
+ TableBuilderOptions tboptions(
1752
2300
  *cfd->ioptions(), *(sub_compact->compaction->mutable_cf_options()),
1753
2301
  cfd->internal_comparator(), cfd->int_tbl_prop_collector_factories(),
1754
- cfd->GetID(), cfd->GetName(), sub_compact->outfile.get(),
1755
2302
  sub_compact->compaction->output_compression(),
1756
- 0 /*sample_for_compression */,
1757
- sub_compact->compaction->output_compression_opts(),
1758
- sub_compact->compaction->output_level(), skip_filters,
1759
- oldest_ancester_time, 0 /* oldest_key_time */,
1760
- sub_compact->compaction->max_output_file_size(), current_time, db_id_,
1761
- db_session_id_));
2303
+ sub_compact->compaction->output_compression_opts(), cfd->GetID(),
2304
+ cfd->GetName(), sub_compact->compaction->output_level(),
2305
+ bottommost_level_, TableFileCreationReason::kCompaction,
2306
+ oldest_ancester_time, 0 /* oldest_key_time */, current_time, db_id_,
2307
+ db_session_id_, sub_compact->compaction->max_output_file_size(),
2308
+ file_number);
2309
+ sub_compact->builder.reset(
2310
+ NewTableBuilder(tboptions, sub_compact->outfile.get()));
1762
2311
  LogFlush(db_options_.info_log);
1763
2312
  return s;
1764
2313
  }
@@ -1820,11 +2369,16 @@ void CompactionJob::UpdateCompactionStats() {
1820
2369
  }
1821
2370
  }
1822
2371
 
2372
+ assert(compaction_job_stats_);
2373
+ compaction_stats_.bytes_read_blob =
2374
+ compaction_job_stats_->total_blob_bytes_read;
2375
+
1823
2376
  compaction_stats_.num_output_files =
1824
- static_cast<int>(compact_->num_output_files) +
2377
+ static_cast<int>(compact_->num_output_files);
2378
+ compaction_stats_.num_output_files_blob =
1825
2379
  static_cast<int>(compact_->num_blob_output_files);
1826
- compaction_stats_.bytes_written =
1827
- compact_->total_bytes + compact_->total_blob_bytes;
2380
+ compaction_stats_.bytes_written = compact_->total_bytes;
2381
+ compaction_stats_.bytes_written_blob = compact_->total_blob_bytes;
1828
2382
 
1829
2383
  if (compaction_stats_.num_input_records > compact_->num_output_records) {
1830
2384
  compaction_stats_.num_dropped_records =
@@ -1864,8 +2418,10 @@ void CompactionJob::UpdateCompactionJobStats(
1864
2418
 
1865
2419
  // output information
1866
2420
  compaction_job_stats_->total_output_bytes = stats.bytes_written;
2421
+ compaction_job_stats_->total_output_bytes_blob = stats.bytes_written_blob;
1867
2422
  compaction_job_stats_->num_output_records = compact_->num_output_records;
1868
2423
  compaction_job_stats_->num_output_files = stats.num_output_files;
2424
+ compaction_job_stats_->num_output_files_blob = stats.num_output_files_blob;
1869
2425
 
1870
2426
  if (stats.num_output_files > 0) {
1871
2427
  CopyPrefix(compact_->SmallestUserKey(),
@@ -1914,4 +2470,613 @@ void CompactionJob::LogCompaction() {
1914
2470
  }
1915
2471
  }
1916
2472
 
2473
+ std::string CompactionJob::GetTableFileName(uint64_t file_number) {
2474
+ return TableFileName(compact_->compaction->immutable_options()->cf_paths,
2475
+ file_number, compact_->compaction->output_path_id());
2476
+ }
2477
+
2478
+ #ifndef ROCKSDB_LITE
2479
+ std::string CompactionServiceCompactionJob::GetTableFileName(
2480
+ uint64_t file_number) {
2481
+ return MakeTableFileName(output_path_, file_number);
2482
+ }
2483
+
2484
+ void CompactionServiceCompactionJob::RecordCompactionIOStats() {
2485
+ compaction_result_->bytes_read += IOSTATS(bytes_read);
2486
+ compaction_result_->bytes_written += IOSTATS(bytes_written);
2487
+ CompactionJob::RecordCompactionIOStats();
2488
+ }
2489
+
2490
+ CompactionServiceCompactionJob::CompactionServiceCompactionJob(
2491
+ int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
2492
+ const MutableDBOptions& mutable_db_options, const FileOptions& file_options,
2493
+ VersionSet* versions, const std::atomic<bool>* shutting_down,
2494
+ LogBuffer* log_buffer, FSDirectory* output_directory, Statistics* stats,
2495
+ InstrumentedMutex* db_mutex, ErrorHandler* db_error_handler,
2496
+ std::vector<SequenceNumber> existing_snapshots,
2497
+ std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
2498
+ const std::string& dbname, const std::shared_ptr<IOTracer>& io_tracer,
2499
+ const std::atomic<bool>* manual_compaction_canceled,
2500
+ const std::string& db_id, const std::string& db_session_id,
2501
+ const std::string& output_path,
2502
+ const CompactionServiceInput& compaction_service_input,
2503
+ CompactionServiceResult* compaction_service_result)
2504
+ : CompactionJob(
2505
+ job_id, compaction, db_options, mutable_db_options, file_options,
2506
+ versions, shutting_down, log_buffer, nullptr, output_directory,
2507
+ nullptr, stats, db_mutex, db_error_handler, existing_snapshots,
2508
+ kMaxSequenceNumber, nullptr, nullptr, table_cache, event_logger,
2509
+ compaction->mutable_cf_options()->paranoid_file_checks,
2510
+ compaction->mutable_cf_options()->report_bg_io_stats, dbname,
2511
+ &(compaction_service_result->stats), Env::Priority::USER, io_tracer,
2512
+ nullptr, manual_compaction_canceled, db_id, db_session_id,
2513
+ compaction->column_family_data()->GetFullHistoryTsLow()),
2514
+ output_path_(output_path),
2515
+ compaction_input_(compaction_service_input),
2516
+ compaction_result_(compaction_service_result) {}
2517
+
2518
+ Status CompactionServiceCompactionJob::Run() {
2519
+ AutoThreadOperationStageUpdater stage_updater(
2520
+ ThreadStatus::STAGE_COMPACTION_RUN);
2521
+
2522
+ auto* c = compact_->compaction;
2523
+ assert(c->column_family_data() != nullptr);
2524
+ assert(c->column_family_data()->current()->storage_info()->NumLevelFiles(
2525
+ compact_->compaction->level()) > 0);
2526
+
2527
+ write_hint_ =
2528
+ c->column_family_data()->CalculateSSTWriteHint(c->output_level());
2529
+ bottommost_level_ = c->bottommost_level();
2530
+
2531
+ Slice begin = compaction_input_.begin;
2532
+ Slice end = compaction_input_.end;
2533
+ compact_->sub_compact_states.emplace_back(
2534
+ c, compaction_input_.has_begin ? &begin : nullptr,
2535
+ compaction_input_.has_end ? &end : nullptr, compaction_input_.approx_size,
2536
+ /*sub_job_id*/ 0);
2537
+
2538
+ log_buffer_->FlushBufferToLog();
2539
+ LogCompaction();
2540
+ const uint64_t start_micros = db_options_.clock->NowMicros();
2541
+ // Pick the only sub-compaction we should have
2542
+ assert(compact_->sub_compact_states.size() == 1);
2543
+ SubcompactionState* sub_compact = compact_->sub_compact_states.data();
2544
+
2545
+ ProcessKeyValueCompaction(sub_compact);
2546
+
2547
+ compaction_stats_.micros = db_options_.clock->NowMicros() - start_micros;
2548
+ compaction_stats_.cpu_micros = sub_compact->compaction_job_stats.cpu_micros;
2549
+
2550
+ RecordTimeToHistogram(stats_, COMPACTION_TIME, compaction_stats_.micros);
2551
+ RecordTimeToHistogram(stats_, COMPACTION_CPU_TIME,
2552
+ compaction_stats_.cpu_micros);
2553
+
2554
+ Status status = sub_compact->status;
2555
+ IOStatus io_s = sub_compact->io_status;
2556
+
2557
+ if (io_status_.ok()) {
2558
+ io_status_ = io_s;
2559
+ }
2560
+
2561
+ if (status.ok()) {
2562
+ constexpr IODebugContext* dbg = nullptr;
2563
+
2564
+ if (output_directory_) {
2565
+ io_s = output_directory_->FsyncWithDirOptions(IOOptions(), dbg,
2566
+ DirFsyncOptions());
2567
+ }
2568
+ }
2569
+ if (io_status_.ok()) {
2570
+ io_status_ = io_s;
2571
+ }
2572
+ if (status.ok()) {
2573
+ status = io_s;
2574
+ }
2575
+ if (status.ok()) {
2576
+ // TODO: Add verify_table()
2577
+ }
2578
+
2579
+ // Finish up all book-keeping to unify the subcompaction results
2580
+ AggregateStatistics();
2581
+ UpdateCompactionStats();
2582
+ RecordCompactionIOStats();
2583
+
2584
+ LogFlush(db_options_.info_log);
2585
+ compact_->status = status;
2586
+ compact_->status.PermitUncheckedError();
2587
+
2588
+ // Build compaction result
2589
+ compaction_result_->output_level = compact_->compaction->output_level();
2590
+ compaction_result_->output_path = output_path_;
2591
+ for (const auto& output_file : sub_compact->outputs) {
2592
+ auto& meta = output_file.meta;
2593
+ compaction_result_->output_files.emplace_back(
2594
+ MakeTableFileName(meta.fd.GetNumber()), meta.fd.smallest_seqno,
2595
+ meta.fd.largest_seqno, meta.smallest.Encode().ToString(),
2596
+ meta.largest.Encode().ToString(), meta.oldest_ancester_time,
2597
+ meta.file_creation_time, output_file.validator.GetHash(),
2598
+ meta.marked_for_compaction);
2599
+ }
2600
+ compaction_result_->num_output_records = sub_compact->num_output_records;
2601
+ compaction_result_->total_bytes = sub_compact->total_bytes;
2602
+
2603
+ return status;
2604
+ }
2605
+
2606
+ void CompactionServiceCompactionJob::CleanupCompaction() {
2607
+ CompactionJob::CleanupCompaction();
2608
+ }
2609
+
2610
+ // Internal binary format for the input and result data
2611
+ enum BinaryFormatVersion : uint32_t {
2612
+ kOptionsString = 1, // Use string format similar to Option string format
2613
+ };
2614
+
2615
+ static std::unordered_map<std::string, OptionTypeInfo> cfd_type_info = {
2616
+ {"name",
2617
+ {offsetof(struct ColumnFamilyDescriptor, name), OptionType::kEncodedString,
2618
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2619
+ {"options",
2620
+ {offsetof(struct ColumnFamilyDescriptor, options),
2621
+ OptionType::kConfigurable, OptionVerificationType::kNormal,
2622
+ OptionTypeFlags::kNone,
2623
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2624
+ const std::string& value, void* addr) {
2625
+ auto cf_options = static_cast<ColumnFamilyOptions*>(addr);
2626
+ return GetColumnFamilyOptionsFromString(opts, ColumnFamilyOptions(),
2627
+ value, cf_options);
2628
+ },
2629
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2630
+ const void* addr, std::string* value) {
2631
+ const auto cf_options = static_cast<const ColumnFamilyOptions*>(addr);
2632
+ std::string result;
2633
+ auto status =
2634
+ GetStringFromColumnFamilyOptions(opts, *cf_options, &result);
2635
+ *value = "{" + result + "}";
2636
+ return status;
2637
+ },
2638
+ [](const ConfigOptions& opts, const std::string& name, const void* addr1,
2639
+ const void* addr2, std::string* mismatch) {
2640
+ const auto this_one = static_cast<const ColumnFamilyOptions*>(addr1);
2641
+ const auto that_one = static_cast<const ColumnFamilyOptions*>(addr2);
2642
+ auto this_conf = CFOptionsAsConfigurable(*this_one);
2643
+ auto that_conf = CFOptionsAsConfigurable(*that_one);
2644
+ std::string mismatch_opt;
2645
+ bool result =
2646
+ this_conf->AreEquivalent(opts, that_conf.get(), &mismatch_opt);
2647
+ if (!result) {
2648
+ *mismatch = name + "." + mismatch_opt;
2649
+ }
2650
+ return result;
2651
+ }}},
2652
+ };
2653
+
2654
+ static std::unordered_map<std::string, OptionTypeInfo> cs_input_type_info = {
2655
+ {"column_family",
2656
+ OptionTypeInfo::Struct(
2657
+ "column_family", &cfd_type_info,
2658
+ offsetof(struct CompactionServiceInput, column_family),
2659
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone)},
2660
+ {"db_options",
2661
+ {offsetof(struct CompactionServiceInput, db_options),
2662
+ OptionType::kConfigurable, OptionVerificationType::kNormal,
2663
+ OptionTypeFlags::kNone,
2664
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2665
+ const std::string& value, void* addr) {
2666
+ auto options = static_cast<DBOptions*>(addr);
2667
+ return GetDBOptionsFromString(opts, DBOptions(), value, options);
2668
+ },
2669
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2670
+ const void* addr, std::string* value) {
2671
+ const auto options = static_cast<const DBOptions*>(addr);
2672
+ std::string result;
2673
+ auto status = GetStringFromDBOptions(opts, *options, &result);
2674
+ *value = "{" + result + "}";
2675
+ return status;
2676
+ },
2677
+ [](const ConfigOptions& opts, const std::string& name, const void* addr1,
2678
+ const void* addr2, std::string* mismatch) {
2679
+ const auto this_one = static_cast<const DBOptions*>(addr1);
2680
+ const auto that_one = static_cast<const DBOptions*>(addr2);
2681
+ auto this_conf = DBOptionsAsConfigurable(*this_one);
2682
+ auto that_conf = DBOptionsAsConfigurable(*that_one);
2683
+ std::string mismatch_opt;
2684
+ bool result =
2685
+ this_conf->AreEquivalent(opts, that_conf.get(), &mismatch_opt);
2686
+ if (!result) {
2687
+ *mismatch = name + "." + mismatch_opt;
2688
+ }
2689
+ return result;
2690
+ }}},
2691
+ {"snapshots", OptionTypeInfo::Vector<uint64_t>(
2692
+ offsetof(struct CompactionServiceInput, snapshots),
2693
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone,
2694
+ {0, OptionType::kUInt64T})},
2695
+ {"input_files", OptionTypeInfo::Vector<std::string>(
2696
+ offsetof(struct CompactionServiceInput, input_files),
2697
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone,
2698
+ {0, OptionType::kEncodedString})},
2699
+ {"output_level",
2700
+ {offsetof(struct CompactionServiceInput, output_level), OptionType::kInt,
2701
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2702
+ {"has_begin",
2703
+ {offsetof(struct CompactionServiceInput, has_begin), OptionType::kBoolean,
2704
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2705
+ {"begin",
2706
+ {offsetof(struct CompactionServiceInput, begin),
2707
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2708
+ OptionTypeFlags::kNone}},
2709
+ {"has_end",
2710
+ {offsetof(struct CompactionServiceInput, has_end), OptionType::kBoolean,
2711
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2712
+ {"end",
2713
+ {offsetof(struct CompactionServiceInput, end), OptionType::kEncodedString,
2714
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2715
+ {"approx_size",
2716
+ {offsetof(struct CompactionServiceInput, approx_size),
2717
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2718
+ OptionTypeFlags::kNone}},
2719
+ };
2720
+
2721
+ static std::unordered_map<std::string, OptionTypeInfo>
2722
+ cs_output_file_type_info = {
2723
+ {"file_name",
2724
+ {offsetof(struct CompactionServiceOutputFile, file_name),
2725
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2726
+ OptionTypeFlags::kNone}},
2727
+ {"smallest_seqno",
2728
+ {offsetof(struct CompactionServiceOutputFile, smallest_seqno),
2729
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2730
+ OptionTypeFlags::kNone}},
2731
+ {"largest_seqno",
2732
+ {offsetof(struct CompactionServiceOutputFile, largest_seqno),
2733
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2734
+ OptionTypeFlags::kNone}},
2735
+ {"smallest_internal_key",
2736
+ {offsetof(struct CompactionServiceOutputFile, smallest_internal_key),
2737
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2738
+ OptionTypeFlags::kNone}},
2739
+ {"largest_internal_key",
2740
+ {offsetof(struct CompactionServiceOutputFile, largest_internal_key),
2741
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2742
+ OptionTypeFlags::kNone}},
2743
+ {"oldest_ancester_time",
2744
+ {offsetof(struct CompactionServiceOutputFile, oldest_ancester_time),
2745
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2746
+ OptionTypeFlags::kNone}},
2747
+ {"file_creation_time",
2748
+ {offsetof(struct CompactionServiceOutputFile, file_creation_time),
2749
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2750
+ OptionTypeFlags::kNone}},
2751
+ {"paranoid_hash",
2752
+ {offsetof(struct CompactionServiceOutputFile, paranoid_hash),
2753
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2754
+ OptionTypeFlags::kNone}},
2755
+ {"marked_for_compaction",
2756
+ {offsetof(struct CompactionServiceOutputFile, marked_for_compaction),
2757
+ OptionType::kBoolean, OptionVerificationType::kNormal,
2758
+ OptionTypeFlags::kNone}},
2759
+ };
2760
+
2761
+ static std::unordered_map<std::string, OptionTypeInfo>
2762
+ compaction_job_stats_type_info = {
2763
+ {"elapsed_micros",
2764
+ {offsetof(struct CompactionJobStats, elapsed_micros),
2765
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2766
+ OptionTypeFlags::kNone}},
2767
+ {"cpu_micros",
2768
+ {offsetof(struct CompactionJobStats, cpu_micros), OptionType::kUInt64T,
2769
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2770
+ {"num_input_records",
2771
+ {offsetof(struct CompactionJobStats, num_input_records),
2772
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2773
+ OptionTypeFlags::kNone}},
2774
+ {"num_blobs_read",
2775
+ {offsetof(struct CompactionJobStats, num_blobs_read),
2776
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2777
+ OptionTypeFlags::kNone}},
2778
+ {"num_input_files",
2779
+ {offsetof(struct CompactionJobStats, num_input_files),
2780
+ OptionType::kSizeT, OptionVerificationType::kNormal,
2781
+ OptionTypeFlags::kNone}},
2782
+ {"num_input_files_at_output_level",
2783
+ {offsetof(struct CompactionJobStats, num_input_files_at_output_level),
2784
+ OptionType::kSizeT, OptionVerificationType::kNormal,
2785
+ OptionTypeFlags::kNone}},
2786
+ {"num_output_records",
2787
+ {offsetof(struct CompactionJobStats, num_output_records),
2788
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2789
+ OptionTypeFlags::kNone}},
2790
+ {"num_output_files",
2791
+ {offsetof(struct CompactionJobStats, num_output_files),
2792
+ OptionType::kSizeT, OptionVerificationType::kNormal,
2793
+ OptionTypeFlags::kNone}},
2794
+ {"num_output_files_blob",
2795
+ {offsetof(struct CompactionJobStats, num_output_files_blob),
2796
+ OptionType::kSizeT, OptionVerificationType::kNormal,
2797
+ OptionTypeFlags::kNone}},
2798
+ {"is_full_compaction",
2799
+ {offsetof(struct CompactionJobStats, is_full_compaction),
2800
+ OptionType::kBoolean, OptionVerificationType::kNormal,
2801
+ OptionTypeFlags::kNone}},
2802
+ {"is_manual_compaction",
2803
+ {offsetof(struct CompactionJobStats, is_manual_compaction),
2804
+ OptionType::kBoolean, OptionVerificationType::kNormal,
2805
+ OptionTypeFlags::kNone}},
2806
+ {"total_input_bytes",
2807
+ {offsetof(struct CompactionJobStats, total_input_bytes),
2808
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2809
+ OptionTypeFlags::kNone}},
2810
+ {"total_blob_bytes_read",
2811
+ {offsetof(struct CompactionJobStats, total_blob_bytes_read),
2812
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2813
+ OptionTypeFlags::kNone}},
2814
+ {"total_output_bytes",
2815
+ {offsetof(struct CompactionJobStats, total_output_bytes),
2816
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2817
+ OptionTypeFlags::kNone}},
2818
+ {"total_output_bytes_blob",
2819
+ {offsetof(struct CompactionJobStats, total_output_bytes_blob),
2820
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2821
+ OptionTypeFlags::kNone}},
2822
+ {"num_records_replaced",
2823
+ {offsetof(struct CompactionJobStats, num_records_replaced),
2824
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2825
+ OptionTypeFlags::kNone}},
2826
+ {"total_input_raw_key_bytes",
2827
+ {offsetof(struct CompactionJobStats, total_input_raw_key_bytes),
2828
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2829
+ OptionTypeFlags::kNone}},
2830
+ {"total_input_raw_value_bytes",
2831
+ {offsetof(struct CompactionJobStats, total_input_raw_value_bytes),
2832
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2833
+ OptionTypeFlags::kNone}},
2834
+ {"num_input_deletion_records",
2835
+ {offsetof(struct CompactionJobStats, num_input_deletion_records),
2836
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2837
+ OptionTypeFlags::kNone}},
2838
+ {"num_expired_deletion_records",
2839
+ {offsetof(struct CompactionJobStats, num_expired_deletion_records),
2840
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2841
+ OptionTypeFlags::kNone}},
2842
+ {"num_corrupt_keys",
2843
+ {offsetof(struct CompactionJobStats, num_corrupt_keys),
2844
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2845
+ OptionTypeFlags::kNone}},
2846
+ {"file_write_nanos",
2847
+ {offsetof(struct CompactionJobStats, file_write_nanos),
2848
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2849
+ OptionTypeFlags::kNone}},
2850
+ {"file_range_sync_nanos",
2851
+ {offsetof(struct CompactionJobStats, file_range_sync_nanos),
2852
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2853
+ OptionTypeFlags::kNone}},
2854
+ {"file_fsync_nanos",
2855
+ {offsetof(struct CompactionJobStats, file_fsync_nanos),
2856
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2857
+ OptionTypeFlags::kNone}},
2858
+ {"file_prepare_write_nanos",
2859
+ {offsetof(struct CompactionJobStats, file_prepare_write_nanos),
2860
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2861
+ OptionTypeFlags::kNone}},
2862
+ {"smallest_output_key_prefix",
2863
+ {offsetof(struct CompactionJobStats, smallest_output_key_prefix),
2864
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2865
+ OptionTypeFlags::kNone}},
2866
+ {"largest_output_key_prefix",
2867
+ {offsetof(struct CompactionJobStats, largest_output_key_prefix),
2868
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2869
+ OptionTypeFlags::kNone}},
2870
+ {"num_single_del_fallthru",
2871
+ {offsetof(struct CompactionJobStats, num_single_del_fallthru),
2872
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2873
+ OptionTypeFlags::kNone}},
2874
+ {"num_single_del_mismatch",
2875
+ {offsetof(struct CompactionJobStats, num_single_del_mismatch),
2876
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2877
+ OptionTypeFlags::kNone}},
2878
+ };
2879
+
2880
+ namespace {
2881
+ // this is a helper struct to serialize and deserialize class Status, because
2882
+ // Status's members are not public.
2883
+ struct StatusSerializationAdapter {
2884
+ uint8_t code;
2885
+ uint8_t subcode;
2886
+ uint8_t severity;
2887
+ std::string message;
2888
+
2889
+ StatusSerializationAdapter() {}
2890
+ explicit StatusSerializationAdapter(const Status& s) {
2891
+ code = s.code();
2892
+ subcode = s.subcode();
2893
+ severity = s.severity();
2894
+ auto msg = s.getState();
2895
+ message = msg ? msg : "";
2896
+ }
2897
+
2898
+ Status GetStatus() {
2899
+ return Status(static_cast<Status::Code>(code),
2900
+ static_cast<Status::SubCode>(subcode),
2901
+ static_cast<Status::Severity>(severity), message);
2902
+ }
2903
+ };
2904
+ } // namespace
2905
+
2906
+ static std::unordered_map<std::string, OptionTypeInfo>
2907
+ status_adapter_type_info = {
2908
+ {"code",
2909
+ {offsetof(struct StatusSerializationAdapter, code),
2910
+ OptionType::kUInt8T, OptionVerificationType::kNormal,
2911
+ OptionTypeFlags::kNone}},
2912
+ {"subcode",
2913
+ {offsetof(struct StatusSerializationAdapter, subcode),
2914
+ OptionType::kUInt8T, OptionVerificationType::kNormal,
2915
+ OptionTypeFlags::kNone}},
2916
+ {"severity",
2917
+ {offsetof(struct StatusSerializationAdapter, severity),
2918
+ OptionType::kUInt8T, OptionVerificationType::kNormal,
2919
+ OptionTypeFlags::kNone}},
2920
+ {"message",
2921
+ {offsetof(struct StatusSerializationAdapter, message),
2922
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2923
+ OptionTypeFlags::kNone}},
2924
+ };
2925
+
2926
+ static std::unordered_map<std::string, OptionTypeInfo> cs_result_type_info = {
2927
+ {"status",
2928
+ {offsetof(struct CompactionServiceResult, status),
2929
+ OptionType::kCustomizable, OptionVerificationType::kNormal,
2930
+ OptionTypeFlags::kNone,
2931
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2932
+ const std::string& value, void* addr) {
2933
+ auto status_obj = static_cast<Status*>(addr);
2934
+ StatusSerializationAdapter adapter;
2935
+ Status s = OptionTypeInfo::ParseType(
2936
+ opts, value, status_adapter_type_info, &adapter);
2937
+ *status_obj = adapter.GetStatus();
2938
+ return s;
2939
+ },
2940
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2941
+ const void* addr, std::string* value) {
2942
+ const auto status_obj = static_cast<const Status*>(addr);
2943
+ StatusSerializationAdapter adapter(*status_obj);
2944
+ std::string result;
2945
+ Status s = OptionTypeInfo::SerializeType(opts, status_adapter_type_info,
2946
+ &adapter, &result);
2947
+ *value = "{" + result + "}";
2948
+ return s;
2949
+ },
2950
+ [](const ConfigOptions& opts, const std::string& /*name*/,
2951
+ const void* addr1, const void* addr2, std::string* mismatch) {
2952
+ const auto status1 = static_cast<const Status*>(addr1);
2953
+ const auto status2 = static_cast<const Status*>(addr2);
2954
+ StatusSerializationAdapter adatper1(*status1);
2955
+ StatusSerializationAdapter adapter2(*status2);
2956
+ return OptionTypeInfo::TypesAreEqual(opts, status_adapter_type_info,
2957
+ &adatper1, &adapter2, mismatch);
2958
+ }}},
2959
+ {"output_files",
2960
+ OptionTypeInfo::Vector<CompactionServiceOutputFile>(
2961
+ offsetof(struct CompactionServiceResult, output_files),
2962
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone,
2963
+ OptionTypeInfo::Struct("output_files", &cs_output_file_type_info, 0,
2964
+ OptionVerificationType::kNormal,
2965
+ OptionTypeFlags::kNone))},
2966
+ {"output_level",
2967
+ {offsetof(struct CompactionServiceResult, output_level), OptionType::kInt,
2968
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone}},
2969
+ {"output_path",
2970
+ {offsetof(struct CompactionServiceResult, output_path),
2971
+ OptionType::kEncodedString, OptionVerificationType::kNormal,
2972
+ OptionTypeFlags::kNone}},
2973
+ {"num_output_records",
2974
+ {offsetof(struct CompactionServiceResult, num_output_records),
2975
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2976
+ OptionTypeFlags::kNone}},
2977
+ {"total_bytes",
2978
+ {offsetof(struct CompactionServiceResult, total_bytes),
2979
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2980
+ OptionTypeFlags::kNone}},
2981
+ {"bytes_read",
2982
+ {offsetof(struct CompactionServiceResult, bytes_read),
2983
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2984
+ OptionTypeFlags::kNone}},
2985
+ {"bytes_written",
2986
+ {offsetof(struct CompactionServiceResult, bytes_written),
2987
+ OptionType::kUInt64T, OptionVerificationType::kNormal,
2988
+ OptionTypeFlags::kNone}},
2989
+ {"stats", OptionTypeInfo::Struct(
2990
+ "stats", &compaction_job_stats_type_info,
2991
+ offsetof(struct CompactionServiceResult, stats),
2992
+ OptionVerificationType::kNormal, OptionTypeFlags::kNone)},
2993
+ };
2994
+
2995
+ Status CompactionServiceInput::Read(const std::string& data_str,
2996
+ CompactionServiceInput* obj) {
2997
+ if (data_str.size() <= sizeof(BinaryFormatVersion)) {
2998
+ return Status::InvalidArgument("Invalid CompactionServiceInput string");
2999
+ }
3000
+ auto format_version = DecodeFixed32(data_str.data());
3001
+ if (format_version == kOptionsString) {
3002
+ ConfigOptions cf;
3003
+ cf.invoke_prepare_options = false;
3004
+ cf.ignore_unknown_options = true;
3005
+ return OptionTypeInfo::ParseType(
3006
+ cf, data_str.substr(sizeof(BinaryFormatVersion)), cs_input_type_info,
3007
+ obj);
3008
+ } else {
3009
+ return Status::NotSupported(
3010
+ "Compaction Service Input data version not supported: " +
3011
+ ToString(format_version));
3012
+ }
3013
+ }
3014
+
3015
+ Status CompactionServiceInput::Write(std::string* output) {
3016
+ char buf[sizeof(BinaryFormatVersion)];
3017
+ EncodeFixed32(buf, kOptionsString);
3018
+ output->append(buf, sizeof(BinaryFormatVersion));
3019
+ ConfigOptions cf;
3020
+ cf.invoke_prepare_options = false;
3021
+ return OptionTypeInfo::SerializeType(cf, cs_input_type_info, this, output);
3022
+ }
3023
+
3024
+ Status CompactionServiceResult::Read(const std::string& data_str,
3025
+ CompactionServiceResult* obj) {
3026
+ if (data_str.size() <= sizeof(BinaryFormatVersion)) {
3027
+ return Status::InvalidArgument("Invalid CompactionServiceResult string");
3028
+ }
3029
+ auto format_version = DecodeFixed32(data_str.data());
3030
+ if (format_version == kOptionsString) {
3031
+ ConfigOptions cf;
3032
+ cf.invoke_prepare_options = false;
3033
+ cf.ignore_unknown_options = true;
3034
+ return OptionTypeInfo::ParseType(
3035
+ cf, data_str.substr(sizeof(BinaryFormatVersion)), cs_result_type_info,
3036
+ obj);
3037
+ } else {
3038
+ return Status::NotSupported(
3039
+ "Compaction Service Result data version not supported: " +
3040
+ ToString(format_version));
3041
+ }
3042
+ }
3043
+
3044
+ Status CompactionServiceResult::Write(std::string* output) {
3045
+ char buf[sizeof(BinaryFormatVersion)];
3046
+ EncodeFixed32(buf, kOptionsString);
3047
+ output->append(buf, sizeof(BinaryFormatVersion));
3048
+ ConfigOptions cf;
3049
+ cf.invoke_prepare_options = false;
3050
+ return OptionTypeInfo::SerializeType(cf, cs_result_type_info, this, output);
3051
+ }
3052
+
3053
+ #ifndef NDEBUG
3054
+ bool CompactionServiceResult::TEST_Equals(CompactionServiceResult* other) {
3055
+ std::string mismatch;
3056
+ return TEST_Equals(other, &mismatch);
3057
+ }
3058
+
3059
+ bool CompactionServiceResult::TEST_Equals(CompactionServiceResult* other,
3060
+ std::string* mismatch) {
3061
+ ConfigOptions cf;
3062
+ cf.invoke_prepare_options = false;
3063
+ return OptionTypeInfo::TypesAreEqual(cf, cs_result_type_info, this, other,
3064
+ mismatch);
3065
+ }
3066
+
3067
+ bool CompactionServiceInput::TEST_Equals(CompactionServiceInput* other) {
3068
+ std::string mismatch;
3069
+ return TEST_Equals(other, &mismatch);
3070
+ }
3071
+
3072
+ bool CompactionServiceInput::TEST_Equals(CompactionServiceInput* other,
3073
+ std::string* mismatch) {
3074
+ ConfigOptions cf;
3075
+ cf.invoke_prepare_options = false;
3076
+ return OptionTypeInfo::TypesAreEqual(cf, cs_input_type_info, this, other,
3077
+ mismatch);
3078
+ }
3079
+ #endif // NDEBUG
3080
+ #endif // !ROCKSDB_LITE
3081
+
1917
3082
  } // namespace ROCKSDB_NAMESPACE