@nxtedition/rocksdb 5.2.21 → 5.2.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -11,44 +11,49 @@
11
11
 
12
12
  #include <assert.h>
13
13
  #include <stdio.h>
14
+
14
15
  #include <atomic>
15
16
  #include <list>
16
17
  #include <map>
17
18
  #include <memory>
19
+ #include <numeric>
18
20
  #include <string>
19
21
  #include <unordered_map>
20
22
  #include <utility>
21
23
 
24
+ #include "cache/cache_entry_roles.h"
25
+ #include "cache/cache_key.h"
26
+ #include "cache/cache_reservation_manager.h"
22
27
  #include "db/dbformat.h"
23
28
  #include "index_builder.h"
24
-
29
+ #include "logging/logging.h"
30
+ #include "memory/memory_allocator.h"
25
31
  #include "rocksdb/cache.h"
26
32
  #include "rocksdb/comparator.h"
27
33
  #include "rocksdb/env.h"
34
+ #include "rocksdb/filter_policy.h"
28
35
  #include "rocksdb/flush_block_policy.h"
29
36
  #include "rocksdb/merge_operator.h"
30
37
  #include "rocksdb/table.h"
31
-
38
+ #include "rocksdb/types.h"
32
39
  #include "table/block_based/block.h"
33
40
  #include "table/block_based/block_based_filter_block.h"
34
41
  #include "table/block_based/block_based_table_factory.h"
35
42
  #include "table/block_based/block_based_table_reader.h"
36
43
  #include "table/block_based/block_builder.h"
44
+ #include "table/block_based/block_like_traits.h"
37
45
  #include "table/block_based/filter_block.h"
38
46
  #include "table/block_based/filter_policy_internal.h"
39
47
  #include "table/block_based/full_filter_block.h"
40
48
  #include "table/block_based/partitioned_filter_block.h"
41
49
  #include "table/format.h"
50
+ #include "table/meta_blocks.h"
42
51
  #include "table/table_builder.h"
43
-
44
- #include "memory/memory_allocator.h"
45
52
  #include "util/coding.h"
46
53
  #include "util/compression.h"
47
- #include "util/crc32c.h"
48
54
  #include "util/stop_watch.h"
49
55
  #include "util/string_util.h"
50
56
  #include "util/work_queue.h"
51
- #include "util/xxhash.h"
52
57
 
53
58
  namespace ROCKSDB_NAMESPACE {
54
59
 
@@ -59,6 +64,8 @@ extern const std::string kHashIndexPrefixesMetadataBlock;
59
64
  // Without anonymous namespace here, we fail the warning -Wmissing-prototypes
60
65
  namespace {
61
66
 
67
+ constexpr size_t kBlockTrailerSize = BlockBasedTable::kBlockTrailerSize;
68
+
62
69
  // Create a filter block builder based on its type.
63
70
  FilterBlockBuilder* CreateFilterBlockBuilder(
64
71
  const ImmutableCFOptions& /*opt*/, const MutableCFOptions& mopt,
@@ -66,14 +73,24 @@ FilterBlockBuilder* CreateFilterBlockBuilder(
66
73
  const bool use_delta_encoding_for_index_values,
67
74
  PartitionedIndexBuilder* const p_index_builder) {
68
75
  const BlockBasedTableOptions& table_opt = context.table_options;
69
- if (table_opt.filter_policy == nullptr) return nullptr;
76
+ assert(table_opt.filter_policy); // precondition
70
77
 
71
78
  FilterBitsBuilder* filter_bits_builder =
72
79
  BloomFilterPolicy::GetBuilderFromContext(context);
73
80
  if (filter_bits_builder == nullptr) {
74
- return new BlockBasedFilterBlockBuilder(mopt.prefix_extractor.get(),
75
- table_opt);
81
+ return nullptr;
76
82
  } else {
83
+ // Check for backdoor deprecated block-based bloom config
84
+ size_t starting_est = filter_bits_builder->EstimateEntriesAdded();
85
+ constexpr auto kSecretStart =
86
+ DeprecatedBlockBasedBloomFilterPolicy::kSecretBitsPerKeyStart;
87
+ if (starting_est >= kSecretStart && starting_est < kSecretStart + 100) {
88
+ int bits_per_key = static_cast<int>(starting_est - kSecretStart);
89
+ delete filter_bits_builder;
90
+ return new BlockBasedFilterBlockBuilder(mopt.prefix_extractor.get(),
91
+ table_opt, bits_per_key);
92
+ }
93
+ // END check for backdoor deprecated block-based bloom config
77
94
  if (table_opt.partition_filters) {
78
95
  assert(p_index_builder != nullptr);
79
96
  // Since after partition cut request from filter builder it takes time
@@ -211,9 +228,9 @@ class BlockBasedTableBuilder::BlockBasedTablePropertiesCollector
211
228
  return Status::OK();
212
229
  }
213
230
 
214
- virtual void BlockAdd(uint64_t /* blockRawBytes */,
215
- uint64_t /* blockCompressedBytesFast */,
216
- uint64_t /* blockCompressedBytesSlow */) override {
231
+ virtual void BlockAdd(uint64_t /* block_raw_bytes */,
232
+ uint64_t /* block_compressed_bytes_fast */,
233
+ uint64_t /* block_compressed_bytes_slow */) override {
217
234
  // Intentionally left blank. No interest in collecting stats for
218
235
  // blocks.
219
236
  return;
@@ -247,7 +264,7 @@ class BlockBasedTableBuilder::BlockBasedTablePropertiesCollector
247
264
  };
248
265
 
249
266
  struct BlockBasedTableBuilder::Rep {
250
- const ImmutableCFOptions ioptions;
267
+ const ImmutableOptions ioptions;
251
268
  const MutableCFOptions moptions;
252
269
  const BlockBasedTableOptions table_options;
253
270
  const InternalKeyComparator& internal_comparator;
@@ -255,13 +272,10 @@ struct BlockBasedTableBuilder::Rep {
255
272
  std::atomic<uint64_t> offset;
256
273
  size_t alignment;
257
274
  BlockBuilder data_block;
258
- // Buffers uncompressed data blocks and keys to replay later. Needed when
275
+ // Buffers uncompressed data blocks to replay later. Needed when
259
276
  // compression dictionary is enabled so we can finalize the dictionary before
260
277
  // compressing any data blocks.
261
- // TODO(ajkr): ideally we don't buffer all keys and all uncompressed data
262
- // blocks as it's redundant, but it's easier to implement for now.
263
- std::vector<std::pair<std::string, std::vector<std::string>>>
264
- data_block_and_keys_buffers;
278
+ std::vector<std::string> data_block_buffers;
265
279
  BlockBuilder range_del_block;
266
280
 
267
281
  InternalKeySliceTransform internal_prefix_transform;
@@ -272,6 +286,11 @@ struct BlockBasedTableBuilder::Rep {
272
286
  const Slice* first_key_in_next_block = nullptr;
273
287
  CompressionType compression_type;
274
288
  uint64_t sample_for_compression;
289
+ std::atomic<uint64_t> compressible_input_data_bytes;
290
+ std::atomic<uint64_t> uncompressible_input_data_bytes;
291
+ std::atomic<uint64_t> sampled_input_data_bytes;
292
+ std::atomic<uint64_t> sampled_output_slow_data_bytes;
293
+ std::atomic<uint64_t> sampled_output_fast_data_bytes;
275
294
  CompressionOptions compression_opts;
276
295
  std::unique_ptr<CompressionDict> compression_dict;
277
296
  std::vector<std::unique_ptr<CompressionContext>> compression_ctxs;
@@ -306,28 +325,20 @@ struct BlockBasedTableBuilder::Rep {
306
325
  kClosed,
307
326
  };
308
327
  State state;
309
-
328
+ // `kBuffered` state is allowed only as long as the buffering of uncompressed
329
+ // data blocks (see `data_block_buffers`) does not exceed `buffer_limit`.
330
+ uint64_t buffer_limit;
331
+ std::shared_ptr<CacheReservationManager>
332
+ compression_dict_buffer_cache_res_mgr;
310
333
  const bool use_delta_encoding_for_index_values;
311
334
  std::unique_ptr<FilterBlockBuilder> filter_builder;
312
- char compressed_cache_key_prefix[BlockBasedTable::kMaxCacheKeyPrefixSize];
313
- size_t compressed_cache_key_prefix_size;
335
+ OffsetableCacheKey base_cache_key;
336
+ const TableFileCreationReason reason;
314
337
 
315
338
  BlockHandle pending_handle; // Handle to add to index block
316
339
 
317
340
  std::string compressed_output;
318
341
  std::unique_ptr<FlushBlockPolicy> flush_block_policy;
319
- int level_at_creation;
320
- uint32_t column_family_id;
321
- const std::string& column_family_name;
322
- uint64_t creation_time = 0;
323
- uint64_t oldest_key_time = 0;
324
- const uint64_t target_file_size;
325
- uint64_t file_creation_time = 0;
326
-
327
- // DB IDs
328
- const std::string db_id;
329
- const std::string db_session_id;
330
- std::string db_host_id;
331
342
 
332
343
  std::vector<std::unique_ptr<IntTblPropCollector>> table_properties_collectors;
333
344
 
@@ -385,6 +396,7 @@ struct BlockBasedTableBuilder::Rep {
385
396
  }
386
397
 
387
398
  // Never erase an existing I/O status that is not OK.
399
+ // Calling this will also SetStatus(ios)
388
400
  void SetIOStatus(IOStatus ios) {
389
401
  if (!ios.ok() && io_status_ok.load(std::memory_order_relaxed)) {
390
402
  // Locking is an overkill for non compression_opts.parallel_threads
@@ -394,67 +406,69 @@ struct BlockBasedTableBuilder::Rep {
394
406
  io_status = ios;
395
407
  io_status_ok.store(false, std::memory_order_relaxed);
396
408
  }
409
+ SetStatus(ios);
397
410
  }
398
411
 
399
- Rep(const ImmutableCFOptions& _ioptions, const MutableCFOptions& _moptions,
400
- const BlockBasedTableOptions& table_opt,
401
- const InternalKeyComparator& icomparator,
402
- const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
403
- int_tbl_prop_collector_factories,
404
- uint32_t _column_family_id, WritableFileWriter* f,
405
- const CompressionType _compression_type,
406
- const uint64_t _sample_for_compression,
407
- const CompressionOptions& _compression_opts, const bool skip_filters,
408
- const int _level_at_creation, const std::string& _column_family_name,
409
- const uint64_t _creation_time, const uint64_t _oldest_key_time,
410
- const uint64_t _target_file_size, const uint64_t _file_creation_time,
411
- const std::string& _db_id, const std::string& _db_session_id)
412
- : ioptions(_ioptions),
413
- moptions(_moptions),
412
+ Rep(const BlockBasedTableOptions& table_opt, const TableBuilderOptions& tbo,
413
+ WritableFileWriter* f)
414
+ : ioptions(tbo.ioptions),
415
+ moptions(tbo.moptions),
414
416
  table_options(table_opt),
415
- internal_comparator(icomparator),
417
+ internal_comparator(tbo.internal_comparator),
416
418
  file(f),
417
419
  offset(0),
418
420
  alignment(table_options.block_align
419
- ? std::min(table_options.block_size, kDefaultPageSize)
421
+ ? std::min(static_cast<size_t>(table_options.block_size),
422
+ kDefaultPageSize)
420
423
  : 0),
421
424
  data_block(table_options.block_restart_interval,
422
425
  table_options.use_delta_encoding,
423
426
  false /* use_value_delta_encoding */,
424
- icomparator.user_comparator()
427
+ tbo.internal_comparator.user_comparator()
425
428
  ->CanKeysWithDifferentByteContentsBeEqual()
426
429
  ? BlockBasedTableOptions::kDataBlockBinarySearch
427
430
  : table_options.data_block_index_type,
428
431
  table_options.data_block_hash_table_util_ratio),
429
432
  range_del_block(1 /* block_restart_interval */),
430
- internal_prefix_transform(_moptions.prefix_extractor.get()),
431
- compression_type(_compression_type),
432
- sample_for_compression(_sample_for_compression),
433
- compression_opts(_compression_opts),
433
+ internal_prefix_transform(tbo.moptions.prefix_extractor.get()),
434
+ compression_type(tbo.compression_type),
435
+ sample_for_compression(tbo.moptions.sample_for_compression),
436
+ compressible_input_data_bytes(0),
437
+ uncompressible_input_data_bytes(0),
438
+ sampled_input_data_bytes(0),
439
+ sampled_output_slow_data_bytes(0),
440
+ sampled_output_fast_data_bytes(0),
441
+ compression_opts(tbo.compression_opts),
434
442
  compression_dict(),
435
- compression_ctxs(_compression_opts.parallel_threads),
436
- verify_ctxs(_compression_opts.parallel_threads),
443
+ compression_ctxs(tbo.compression_opts.parallel_threads),
444
+ verify_ctxs(tbo.compression_opts.parallel_threads),
437
445
  verify_dict(),
438
- state((_compression_opts.max_dict_bytes > 0) ? State::kBuffered
439
- : State::kUnbuffered),
446
+ state((tbo.compression_opts.max_dict_bytes > 0) ? State::kBuffered
447
+ : State::kUnbuffered),
440
448
  use_delta_encoding_for_index_values(table_opt.format_version >= 4 &&
441
449
  !table_opt.block_align),
442
- compressed_cache_key_prefix_size(0),
450
+ reason(tbo.reason),
443
451
  flush_block_policy(
444
452
  table_options.flush_block_policy_factory->NewFlushBlockPolicy(
445
453
  table_options, data_block)),
446
- level_at_creation(_level_at_creation),
447
- column_family_id(_column_family_id),
448
- column_family_name(_column_family_name),
449
- creation_time(_creation_time),
450
- oldest_key_time(_oldest_key_time),
451
- target_file_size(_target_file_size),
452
- file_creation_time(_file_creation_time),
453
- db_id(_db_id),
454
- db_session_id(_db_session_id),
455
- db_host_id(ioptions.db_host_id),
456
454
  status_ok(true),
457
455
  io_status_ok(true) {
456
+ if (tbo.target_file_size == 0) {
457
+ buffer_limit = compression_opts.max_dict_buffer_bytes;
458
+ } else if (compression_opts.max_dict_buffer_bytes == 0) {
459
+ buffer_limit = tbo.target_file_size;
460
+ } else {
461
+ buffer_limit = std::min(tbo.target_file_size,
462
+ compression_opts.max_dict_buffer_bytes);
463
+ }
464
+ if (table_options.no_block_cache || table_options.block_cache == nullptr) {
465
+ compression_dict_buffer_cache_res_mgr = nullptr;
466
+ } else {
467
+ compression_dict_buffer_cache_res_mgr =
468
+ std::make_shared<CacheReservationManagerImpl<
469
+ CacheEntryRole::kCompressionDictionaryBuildingBuffer>>(
470
+ table_options.block_cache);
471
+ }
458
472
  for (uint32_t i = 0; i < compression_opts.parallel_threads; i++) {
459
473
  compression_ctxs[i].reset(new CompressionContext(compression_type));
460
474
  }
@@ -470,35 +484,74 @@ struct BlockBasedTableBuilder::Rep {
470
484
  &this->internal_prefix_transform, use_delta_encoding_for_index_values,
471
485
  table_options));
472
486
  }
473
- if (skip_filters) {
474
- filter_builder = nullptr;
487
+ if (ioptions.optimize_filters_for_hits && tbo.is_bottommost) {
488
+ // Apply optimize_filters_for_hits setting here when applicable by
489
+ // skipping filter generation
490
+ filter_builder.reset();
491
+ } else if (tbo.skip_filters) {
492
+ // For SstFileWriter skip_filters
493
+ filter_builder.reset();
494
+ } else if (!table_options.filter_policy) {
495
+ // Null filter_policy -> no filter
496
+ filter_builder.reset();
475
497
  } else {
476
- FilterBuildingContext context(table_options);
477
- context.column_family_name = column_family_name;
478
- context.compaction_style = ioptions.compaction_style;
479
- context.level_at_creation = level_at_creation;
480
- context.info_log = ioptions.info_log;
498
+ FilterBuildingContext filter_context(table_options);
499
+
500
+ filter_context.info_log = ioptions.logger;
501
+ filter_context.column_family_name = tbo.column_family_name;
502
+ filter_context.reason = reason;
503
+
504
+ // Only populate other fields if known to be in LSM rather than
505
+ // generating external SST file
506
+ if (reason != TableFileCreationReason::kMisc) {
507
+ filter_context.compaction_style = ioptions.compaction_style;
508
+ filter_context.num_levels = ioptions.num_levels;
509
+ filter_context.level_at_creation = tbo.level_at_creation;
510
+ filter_context.is_bottommost = tbo.is_bottommost;
511
+ assert(filter_context.level_at_creation < filter_context.num_levels);
512
+ }
513
+
481
514
  filter_builder.reset(CreateFilterBlockBuilder(
482
- ioptions, moptions, context, use_delta_encoding_for_index_values,
483
- p_index_builder_));
515
+ ioptions, moptions, filter_context,
516
+ use_delta_encoding_for_index_values, p_index_builder_));
484
517
  }
485
518
 
486
- for (auto& collector_factories : *int_tbl_prop_collector_factories) {
519
+ assert(tbo.int_tbl_prop_collector_factories);
520
+ for (auto& factory : *tbo.int_tbl_prop_collector_factories) {
521
+ assert(factory);
522
+
487
523
  table_properties_collectors.emplace_back(
488
- collector_factories->CreateIntTblPropCollector(column_family_id));
524
+ factory->CreateIntTblPropCollector(tbo.column_family_id,
525
+ tbo.level_at_creation));
489
526
  }
490
527
  table_properties_collectors.emplace_back(
491
528
  new BlockBasedTablePropertiesCollector(
492
529
  table_options.index_type, table_options.whole_key_filtering,
493
- _moptions.prefix_extractor != nullptr));
530
+ moptions.prefix_extractor != nullptr));
531
+ const Comparator* ucmp = tbo.internal_comparator.user_comparator();
532
+ assert(ucmp);
533
+ if (ucmp->timestamp_size() > 0) {
534
+ table_properties_collectors.emplace_back(
535
+ new TimestampTablePropertiesCollector(ucmp));
536
+ }
494
537
  if (table_options.verify_compression) {
495
538
  for (uint32_t i = 0; i < compression_opts.parallel_threads; i++) {
496
539
  verify_ctxs[i].reset(new UncompressionContext(compression_type));
497
540
  }
498
541
  }
499
542
 
500
- if (!ReifyDbHostIdProperty(ioptions.env, &db_host_id).ok()) {
501
- ROCKS_LOG_INFO(ioptions.info_log, "db_host_id property will not be set");
543
+ // These are only needed for populating table properties
544
+ props.column_family_id = tbo.column_family_id;
545
+ props.column_family_name = tbo.column_family_name;
546
+ props.creation_time = tbo.creation_time;
547
+ props.oldest_key_time = tbo.oldest_key_time;
548
+ props.file_creation_time = tbo.file_creation_time;
549
+ props.orig_file_number = tbo.cur_file_num;
550
+ props.db_id = tbo.db_id;
551
+ props.db_session_id = tbo.db_session_id;
552
+ props.db_host_id = ioptions.db_host_id;
553
+ if (!ReifyDbHostIdProperty(ioptions.env, &props.db_host_id).ok()) {
554
+ ROCKS_LOG_INFO(ioptions.logger, "db_host_id property will not be set");
502
555
  }
503
556
  }
504
557
 
@@ -568,11 +621,11 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
568
621
  // Use a vector of BlockRep as a buffer for a determined number
569
622
  // of BlockRep structures. All data referenced by pointers in
570
623
  // BlockRep will be freed when this vector is destructed.
571
- typedef std::vector<BlockRep> BlockRepBuffer;
624
+ using BlockRepBuffer = std::vector<BlockRep>;
572
625
  BlockRepBuffer block_rep_buf;
573
626
  // Use a thread-safe queue for concurrent access from block
574
627
  // building thread and writer thread.
575
- typedef WorkQueue<BlockRep*> BlockRepPool;
628
+ using BlockRepPool = WorkQueue<BlockRep*>;
576
629
  BlockRepPool block_rep_pool;
577
630
 
578
631
  // Use BlockRepSlot to keep block order in write thread.
@@ -596,7 +649,7 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
596
649
  // Compression queue will pass references to BlockRep in block_rep_buf,
597
650
  // and those references are always valid before the destruction of
598
651
  // block_rep_buf.
599
- typedef WorkQueue<BlockRep*> CompressQueue;
652
+ using CompressQueue = WorkQueue<BlockRep*>;
600
653
  CompressQueue compress_queue;
601
654
  std::vector<port::Thread> compress_thread_pool;
602
655
 
@@ -604,7 +657,7 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
604
657
  // and those references are always valid before the corresponding
605
658
  // BlockRep::slot is destructed, which is before the destruction of
606
659
  // block_rep_buf.
607
- typedef WorkQueue<BlockRepSlot*> WriteQueue;
660
+ using WriteQueue = WorkQueue<BlockRepSlot*>;
608
661
  WriteQueue write_queue;
609
662
  std::unique_ptr<port::Thread> write_thread;
610
663
 
@@ -825,24 +878,13 @@ struct BlockBasedTableBuilder::ParallelCompressionRep {
825
878
  };
826
879
 
827
880
  BlockBasedTableBuilder::BlockBasedTableBuilder(
828
- const ImmutableCFOptions& ioptions, const MutableCFOptions& moptions,
829
- const BlockBasedTableOptions& table_options,
830
- const InternalKeyComparator& internal_comparator,
831
- const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
832
- int_tbl_prop_collector_factories,
833
- uint32_t column_family_id, WritableFileWriter* file,
834
- const CompressionType compression_type,
835
- const uint64_t sample_for_compression,
836
- const CompressionOptions& compression_opts, const bool skip_filters,
837
- const std::string& column_family_name, const int level_at_creation,
838
- const uint64_t creation_time, const uint64_t oldest_key_time,
839
- const uint64_t target_file_size, const uint64_t file_creation_time,
840
- const std::string& db_id, const std::string& db_session_id) {
881
+ const BlockBasedTableOptions& table_options, const TableBuilderOptions& tbo,
882
+ WritableFileWriter* file) {
841
883
  BlockBasedTableOptions sanitized_table_options(table_options);
842
884
  if (sanitized_table_options.format_version == 0 &&
843
885
  sanitized_table_options.checksum != kCRC32c) {
844
886
  ROCKS_LOG_WARN(
845
- ioptions.info_log,
887
+ tbo.ioptions.logger,
846
888
  "Silently converting format_version to 1 because checksum is "
847
889
  "non-default");
848
890
  // silently convert format_version to 1 to keep consistent with current
@@ -850,22 +892,22 @@ BlockBasedTableBuilder::BlockBasedTableBuilder(
850
892
  sanitized_table_options.format_version = 1;
851
893
  }
852
894
 
853
- rep_ = new Rep(
854
- ioptions, moptions, sanitized_table_options, internal_comparator,
855
- int_tbl_prop_collector_factories, column_family_id, file,
856
- compression_type, sample_for_compression, compression_opts, skip_filters,
857
- level_at_creation, column_family_name, creation_time, oldest_key_time,
858
- target_file_size, file_creation_time, db_id, db_session_id);
895
+ rep_ = new Rep(sanitized_table_options, tbo, file);
859
896
 
860
897
  if (rep_->filter_builder != nullptr) {
861
898
  rep_->filter_builder->StartBlock(0);
862
899
  }
863
- if (table_options.block_cache_compressed.get() != nullptr) {
864
- BlockBasedTable::GenerateCachePrefix<Cache, FSWritableFile>(
865
- table_options.block_cache_compressed.get(), file->writable_file(),
866
- &rep_->compressed_cache_key_prefix[0],
867
- &rep_->compressed_cache_key_prefix_size);
868
- }
900
+
901
+ TEST_SYNC_POINT_CALLBACK(
902
+ "BlockBasedTableBuilder::BlockBasedTableBuilder:PreSetupBaseCacheKey",
903
+ const_cast<TableProperties*>(&rep_->props));
904
+
905
+ // Extremely large files use atypical cache key encoding, and we don't
906
+ // know ahead of time how big the file will be. But assuming it's less
907
+ // than 4TB, we will correctly predict the cache keys.
908
+ BlockBasedTable::SetupBaseCacheKey(
909
+ &rep_->props, tbo.db_session_id, tbo.cur_file_num,
910
+ BlockBasedTable::kMaxFileSizeStandardEncoding, &rep_->base_cache_key);
869
911
 
870
912
  if (rep_->IsParallelCompressionEnabled()) {
871
913
  StartParallelCompression();
@@ -895,10 +937,25 @@ void BlockBasedTableBuilder::Add(const Slice& key, const Slice& value) {
895
937
  assert(!r->data_block.empty());
896
938
  r->first_key_in_next_block = &key;
897
939
  Flush();
940
+ if (r->state == Rep::State::kBuffered) {
941
+ bool exceeds_buffer_limit =
942
+ (r->buffer_limit != 0 && r->data_begin_offset > r->buffer_limit);
943
+ bool exceeds_global_block_cache_limit = false;
944
+
945
+ // Increase cache reservation for the last buffered data block
946
+ // only if the block is not going to be unbuffered immediately
947
+ // and there exists a cache reservation manager
948
+ if (!exceeds_buffer_limit &&
949
+ r->compression_dict_buffer_cache_res_mgr != nullptr) {
950
+ Status s =
951
+ r->compression_dict_buffer_cache_res_mgr->UpdateCacheReservation(
952
+ r->data_begin_offset);
953
+ exceeds_global_block_cache_limit = s.IsIncomplete();
954
+ }
898
955
 
899
- if (r->state == Rep::State::kBuffered && r->target_file_size != 0 &&
900
- r->data_begin_offset > r->target_file_size) {
901
- EnterUnbuffered();
956
+ if (exceeds_buffer_limit || exceeds_global_block_cache_limit) {
957
+ EnterUnbuffered();
958
+ }
902
959
  }
903
960
 
904
961
  // Add item to index block.
@@ -933,15 +990,11 @@ void BlockBasedTableBuilder::Add(const Slice& key, const Slice& value) {
933
990
  }
934
991
  }
935
992
 
993
+ r->data_block.AddWithLastKey(key, value, r->last_key);
936
994
  r->last_key.assign(key.data(), key.size());
937
- r->data_block.Add(key, value);
938
995
  if (r->state == Rep::State::kBuffered) {
939
- // Buffer keys to be replayed during `Finish()` once compression
940
- // dictionary has been finalized.
941
- if (r->data_block_and_keys_buffers.empty() || should_flush) {
942
- r->data_block_and_keys_buffers.emplace_back();
943
- }
944
- r->data_block_and_keys_buffers.back().second.emplace_back(key.ToString());
996
+ // Buffered keys will be replayed from data_block_buffers during
997
+ // `Finish()` once compression dictionary has been finalized.
945
998
  } else {
946
999
  if (!r->IsParallelCompressionEnabled()) {
947
1000
  r->index_builder->OnKeyAdded(key);
@@ -950,14 +1003,14 @@ void BlockBasedTableBuilder::Add(const Slice& key, const Slice& value) {
950
1003
  // TODO offset passed in is not accurate for parallel compression case
951
1004
  NotifyCollectTableCollectorsOnAdd(key, value, r->get_offset(),
952
1005
  r->table_properties_collectors,
953
- r->ioptions.info_log);
1006
+ r->ioptions.logger);
954
1007
 
955
1008
  } else if (value_type == kTypeRangeDeletion) {
956
1009
  r->range_del_block.Add(key, value);
957
1010
  // TODO offset passed in is not accurate for parallel compression case
958
1011
  NotifyCollectTableCollectorsOnAdd(key, value, r->get_offset(),
959
1012
  r->table_properties_collectors,
960
- r->ioptions.info_log);
1013
+ r->ioptions.logger);
961
1014
  } else {
962
1015
  assert(false);
963
1016
  }
@@ -990,31 +1043,35 @@ void BlockBasedTableBuilder::Flush() {
990
1043
  r->get_offset());
991
1044
  r->pc_rep->EmitBlock(block_rep);
992
1045
  } else {
993
- WriteBlock(&r->data_block, &r->pending_handle, true /* is_data_block */);
1046
+ WriteBlock(&r->data_block, &r->pending_handle, BlockType::kData);
994
1047
  }
995
1048
  }
996
1049
 
997
1050
  void BlockBasedTableBuilder::WriteBlock(BlockBuilder* block,
998
1051
  BlockHandle* handle,
999
- bool is_data_block) {
1000
- WriteBlock(block->Finish(), handle, is_data_block);
1001
- block->Reset();
1052
+ BlockType block_type) {
1053
+ block->Finish();
1054
+ std::string raw_block_contents;
1055
+ raw_block_contents.reserve(rep_->table_options.block_size);
1056
+ block->SwapAndReset(raw_block_contents);
1057
+ if (rep_->state == Rep::State::kBuffered) {
1058
+ assert(block_type == BlockType::kData);
1059
+ rep_->data_block_buffers.emplace_back(std::move(raw_block_contents));
1060
+ rep_->data_begin_offset += rep_->data_block_buffers.back().size();
1061
+ return;
1062
+ }
1063
+ WriteBlock(raw_block_contents, handle, block_type);
1002
1064
  }
1003
1065
 
1004
1066
  void BlockBasedTableBuilder::WriteBlock(const Slice& raw_block_contents,
1005
1067
  BlockHandle* handle,
1006
- bool is_data_block) {
1068
+ BlockType block_type) {
1007
1069
  Rep* r = rep_;
1070
+ assert(r->state == Rep::State::kUnbuffered);
1008
1071
  Slice block_contents;
1009
1072
  CompressionType type;
1010
- if (r->state == Rep::State::kBuffered) {
1011
- assert(is_data_block);
1012
- assert(!r->data_block_and_keys_buffers.empty());
1013
- r->data_block_and_keys_buffers.back().first = raw_block_contents.ToString();
1014
- r->data_begin_offset += r->data_block_and_keys_buffers.back().first.size();
1015
- return;
1016
- }
1017
1073
  Status compress_status;
1074
+ bool is_data_block = block_type == BlockType::kData;
1018
1075
  CompressAndVerifyBlock(raw_block_contents, is_data_block,
1019
1076
  *(r->compression_ctxs[0]), r->verify_ctxs[0].get(),
1020
1077
  &(r->compressed_output), &(block_contents), &type,
@@ -1023,7 +1080,8 @@ void BlockBasedTableBuilder::WriteBlock(const Slice& raw_block_contents,
1023
1080
  if (!ok()) {
1024
1081
  return;
1025
1082
  }
1026
- WriteRawBlock(block_contents, type, handle, is_data_block);
1083
+
1084
+ WriteRawBlock(block_contents, type, handle, block_type, &raw_block_contents);
1027
1085
  r->compressed_output.clear();
1028
1086
  if (is_data_block) {
1029
1087
  if (r->filter_builder != nullptr) {
@@ -1069,10 +1127,14 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
1069
1127
  bool abort_compression = false;
1070
1128
 
1071
1129
  StopWatchNano timer(
1072
- r->ioptions.env,
1073
- ShouldReportDetailedTime(r->ioptions.env, r->ioptions.statistics));
1130
+ r->ioptions.clock,
1131
+ ShouldReportDetailedTime(r->ioptions.env, r->ioptions.stats));
1074
1132
 
1075
1133
  if (is_status_ok && raw_block_contents.size() < kCompressionSizeLimit) {
1134
+ if (is_data_block) {
1135
+ r->compressible_input_data_bytes.fetch_add(raw_block_contents.size(),
1136
+ std::memory_order_relaxed);
1137
+ }
1076
1138
  const CompressionDict* compression_dict;
1077
1139
  if (!is_data_block || r->compression_dict == nullptr) {
1078
1140
  compression_dict = &CompressionDict::GetEmptyDict();
@@ -1091,6 +1153,16 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
1091
1153
  r->table_options.format_version, is_data_block /* do_sample */,
1092
1154
  compressed_output, &sampled_output_fast, &sampled_output_slow);
1093
1155
 
1156
+ if (sampled_output_slow.size() > 0 || sampled_output_fast.size() > 0) {
1157
+ // Currently compression sampling is only enabled for data block.
1158
+ assert(is_data_block);
1159
+ r->sampled_input_data_bytes.fetch_add(raw_block_contents.size(),
1160
+ std::memory_order_relaxed);
1161
+ r->sampled_output_slow_data_bytes.fetch_add(sampled_output_slow.size(),
1162
+ std::memory_order_relaxed);
1163
+ r->sampled_output_fast_data_bytes.fetch_add(sampled_output_fast.size(),
1164
+ std::memory_order_relaxed);
1165
+ }
1094
1166
  // notify collectors on block add
1095
1167
  NotifyCollectTableCollectorsOnBlockAdd(
1096
1168
  r->table_properties_collectors, raw_block_contents.size(),
@@ -1120,7 +1192,7 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
1120
1192
  if (!compressed_ok) {
1121
1193
  // The result of the compression was invalid. abort.
1122
1194
  abort_compression = true;
1123
- ROCKS_LOG_ERROR(r->ioptions.info_log,
1195
+ ROCKS_LOG_ERROR(r->ioptions.logger,
1124
1196
  "Decompressed block did not match raw block");
1125
1197
  *out_status =
1126
1198
  Status::Corruption("Decompressed block did not match raw block");
@@ -1134,124 +1206,141 @@ void BlockBasedTableBuilder::CompressAndVerifyBlock(
1134
1206
  }
1135
1207
  } else {
1136
1208
  // Block is too big to be compressed.
1209
+ if (is_data_block) {
1210
+ r->uncompressible_input_data_bytes.fetch_add(raw_block_contents.size(),
1211
+ std::memory_order_relaxed);
1212
+ }
1137
1213
  abort_compression = true;
1138
1214
  }
1215
+ if (is_data_block) {
1216
+ r->uncompressible_input_data_bytes.fetch_add(kBlockTrailerSize,
1217
+ std::memory_order_relaxed);
1218
+ }
1139
1219
 
1140
1220
  // Abort compression if the block is too big, or did not pass
1141
1221
  // verification.
1142
1222
  if (abort_compression) {
1143
- RecordTick(r->ioptions.statistics, NUMBER_BLOCK_NOT_COMPRESSED);
1223
+ RecordTick(r->ioptions.stats, NUMBER_BLOCK_NOT_COMPRESSED);
1144
1224
  *type = kNoCompression;
1145
1225
  *block_contents = raw_block_contents;
1146
1226
  } else if (*type != kNoCompression) {
1147
- if (ShouldReportDetailedTime(r->ioptions.env, r->ioptions.statistics)) {
1148
- RecordTimeToHistogram(r->ioptions.statistics, COMPRESSION_TIMES_NANOS,
1227
+ if (ShouldReportDetailedTime(r->ioptions.env, r->ioptions.stats)) {
1228
+ RecordTimeToHistogram(r->ioptions.stats, COMPRESSION_TIMES_NANOS,
1149
1229
  timer.ElapsedNanos());
1150
1230
  }
1151
- RecordInHistogram(r->ioptions.statistics, BYTES_COMPRESSED,
1231
+ RecordInHistogram(r->ioptions.stats, BYTES_COMPRESSED,
1152
1232
  raw_block_contents.size());
1153
- RecordTick(r->ioptions.statistics, NUMBER_BLOCK_COMPRESSED);
1233
+ RecordTick(r->ioptions.stats, NUMBER_BLOCK_COMPRESSED);
1154
1234
  } else if (*type != r->compression_type) {
1155
- RecordTick(r->ioptions.statistics, NUMBER_BLOCK_NOT_COMPRESSED);
1235
+ RecordTick(r->ioptions.stats, NUMBER_BLOCK_NOT_COMPRESSED);
1156
1236
  }
1157
1237
  }
1158
1238
 
1159
1239
  void BlockBasedTableBuilder::WriteRawBlock(const Slice& block_contents,
1160
1240
  CompressionType type,
1161
1241
  BlockHandle* handle,
1162
- bool is_data_block) {
1242
+ BlockType block_type,
1243
+ const Slice* raw_block_contents,
1244
+ bool is_top_level_filter_block) {
1163
1245
  Rep* r = rep_;
1164
- Status s = Status::OK();
1165
- IOStatus io_s = IOStatus::OK();
1166
- StopWatch sw(r->ioptions.env, r->ioptions.statistics, WRITE_RAW_BLOCK_MICROS);
1246
+ bool is_data_block = block_type == BlockType::kData;
1247
+ StopWatch sw(r->ioptions.clock, r->ioptions.stats, WRITE_RAW_BLOCK_MICROS);
1167
1248
  handle->set_offset(r->get_offset());
1168
1249
  handle->set_size(block_contents.size());
1169
1250
  assert(status().ok());
1170
1251
  assert(io_status().ok());
1171
- io_s = r->file->Append(block_contents);
1172
- if (io_s.ok()) {
1173
- char trailer[kBlockTrailerSize];
1174
- trailer[0] = type;
1175
- uint32_t checksum = 0;
1176
- switch (r->table_options.checksum) {
1177
- case kNoChecksum:
1178
- break;
1179
- case kCRC32c: {
1180
- uint32_t crc =
1181
- crc32c::Value(block_contents.data(), block_contents.size());
1182
- // Extend to cover compression type
1183
- crc = crc32c::Extend(crc, trailer, 1);
1184
- checksum = crc32c::Mask(crc);
1185
- break;
1186
- }
1187
- case kxxHash: {
1188
- XXH32_state_t* const state = XXH32_createState();
1189
- XXH32_reset(state, 0);
1190
- XXH32_update(state, block_contents.data(), block_contents.size());
1191
- // Extend to cover compression type
1192
- XXH32_update(state, trailer, 1);
1193
- checksum = XXH32_digest(state);
1194
- XXH32_freeState(state);
1252
+
1253
+ {
1254
+ IOStatus io_s = r->file->Append(block_contents);
1255
+ if (!io_s.ok()) {
1256
+ r->SetIOStatus(io_s);
1257
+ return;
1258
+ }
1259
+ }
1260
+
1261
+ std::array<char, kBlockTrailerSize> trailer;
1262
+ trailer[0] = type;
1263
+ uint32_t checksum = ComputeBuiltinChecksumWithLastByte(
1264
+ r->table_options.checksum, block_contents.data(), block_contents.size(),
1265
+ /*last_byte*/ type);
1266
+
1267
+ if (block_type == BlockType::kFilter) {
1268
+ Status s = r->filter_builder->MaybePostVerifyFilter(block_contents);
1269
+ if (!s.ok()) {
1270
+ r->SetStatus(s);
1271
+ return;
1272
+ }
1273
+ }
1274
+
1275
+ EncodeFixed32(trailer.data() + 1, checksum);
1276
+ TEST_SYNC_POINT_CALLBACK(
1277
+ "BlockBasedTableBuilder::WriteRawBlock:TamperWithChecksum",
1278
+ trailer.data());
1279
+ {
1280
+ IOStatus io_s = r->file->Append(Slice(trailer.data(), trailer.size()));
1281
+ if (!io_s.ok()) {
1282
+ r->SetIOStatus(io_s);
1283
+ return;
1284
+ }
1285
+ }
1286
+
1287
+ {
1288
+ Status s = Status::OK();
1289
+ bool warm_cache;
1290
+ switch (r->table_options.prepopulate_block_cache) {
1291
+ case BlockBasedTableOptions::PrepopulateBlockCache::kFlushOnly:
1292
+ warm_cache = (r->reason == TableFileCreationReason::kFlush);
1195
1293
  break;
1196
- }
1197
- case kxxHash64: {
1198
- XXH64_state_t* const state = XXH64_createState();
1199
- XXH64_reset(state, 0);
1200
- XXH64_update(state, block_contents.data(), block_contents.size());
1201
- // Extend to cover compression type
1202
- XXH64_update(state, trailer, 1);
1203
- checksum = Lower32of64(XXH64_digest(state));
1204
- XXH64_freeState(state);
1294
+ case BlockBasedTableOptions::PrepopulateBlockCache::kDisable:
1295
+ warm_cache = false;
1205
1296
  break;
1206
- }
1207
1297
  default:
1298
+ // missing case
1208
1299
  assert(false);
1209
- break;
1300
+ warm_cache = false;
1210
1301
  }
1211
- EncodeFixed32(trailer + 1, checksum);
1212
- assert(io_s.ok());
1213
- TEST_SYNC_POINT_CALLBACK(
1214
- "BlockBasedTableBuilder::WriteRawBlock:TamperWithChecksum",
1215
- static_cast<char*>(trailer));
1216
- io_s = r->file->Append(Slice(trailer, kBlockTrailerSize));
1217
- if (io_s.ok()) {
1218
- assert(s.ok());
1219
- s = InsertBlockInCache(block_contents, type, handle);
1302
+ if (warm_cache) {
1303
+ if (type == kNoCompression) {
1304
+ s = InsertBlockInCacheHelper(block_contents, handle, block_type,
1305
+ is_top_level_filter_block);
1306
+ } else if (raw_block_contents != nullptr) {
1307
+ s = InsertBlockInCacheHelper(*raw_block_contents, handle, block_type,
1308
+ is_top_level_filter_block);
1309
+ }
1220
1310
  if (!s.ok()) {
1221
1311
  r->SetStatus(s);
1312
+ return;
1222
1313
  }
1314
+ }
1315
+ s = InsertBlockInCompressedCache(block_contents, type, handle);
1316
+ if (!s.ok()) {
1317
+ r->SetStatus(s);
1318
+ return;
1319
+ }
1320
+ }
1321
+
1322
+ r->set_offset(r->get_offset() + block_contents.size() + kBlockTrailerSize);
1323
+ if (r->table_options.block_align && is_data_block) {
1324
+ size_t pad_bytes =
1325
+ (r->alignment -
1326
+ ((block_contents.size() + kBlockTrailerSize) & (r->alignment - 1))) &
1327
+ (r->alignment - 1);
1328
+ IOStatus io_s = r->file->Pad(pad_bytes);
1329
+ if (io_s.ok()) {
1330
+ r->set_offset(r->get_offset() + pad_bytes);
1223
1331
  } else {
1224
1332
  r->SetIOStatus(io_s);
1333
+ return;
1225
1334
  }
1226
- if (s.ok() && io_s.ok()) {
1227
- r->set_offset(r->get_offset() + block_contents.size() +
1228
- kBlockTrailerSize);
1229
- if (r->table_options.block_align && is_data_block) {
1230
- size_t pad_bytes =
1231
- (r->alignment - ((block_contents.size() + kBlockTrailerSize) &
1232
- (r->alignment - 1))) &
1233
- (r->alignment - 1);
1234
- io_s = r->file->Pad(pad_bytes);
1235
- if (io_s.ok()) {
1236
- r->set_offset(r->get_offset() + pad_bytes);
1237
- } else {
1238
- r->SetIOStatus(io_s);
1239
- }
1240
- }
1241
- if (r->IsParallelCompressionEnabled()) {
1242
- if (is_data_block) {
1243
- r->pc_rep->file_size_estimator.ReapBlock(block_contents.size(),
1244
- r->get_offset());
1245
- } else {
1246
- r->pc_rep->file_size_estimator.SetEstimatedFileSize(r->get_offset());
1247
- }
1248
- }
1249
- }
1250
- } else {
1251
- r->SetIOStatus(io_s);
1252
1335
  }
1253
- if (!io_s.ok() && s.ok()) {
1254
- r->SetStatus(io_s);
1336
+
1337
+ if (r->IsParallelCompressionEnabled()) {
1338
+ if (is_data_block) {
1339
+ r->pc_rep->file_size_estimator.ReapBlock(block_contents.size(),
1340
+ r->get_offset());
1341
+ } else {
1342
+ r->pc_rep->file_size_estimator.SetEstimatedFileSize(r->get_offset());
1343
+ }
1255
1344
  }
1256
1345
  }
1257
1346
 
@@ -1284,7 +1373,7 @@ void BlockBasedTableBuilder::BGWorkWriteRawBlock() {
1284
1373
 
1285
1374
  r->pc_rep->file_size_estimator.SetCurrBlockRawSize(block_rep->data->size());
1286
1375
  WriteRawBlock(block_rep->compressed_contents, block_rep->compression_type,
1287
- &r->pending_handle, true /* is_data_block*/);
1376
+ &r->pending_handle, BlockType::kData, &block_rep->contents);
1288
1377
  if (!ok()) {
1289
1378
  break;
1290
1379
  }
@@ -1340,20 +1429,24 @@ IOStatus BlockBasedTableBuilder::io_status() const {
1340
1429
  return rep_->GetIOStatus();
1341
1430
  }
1342
1431
 
1343
- static void DeleteCachedBlockContents(const Slice& /*key*/, void* value) {
1344
- BlockContents* bc = reinterpret_cast<BlockContents*>(value);
1345
- delete bc;
1432
+ namespace {
1433
+ // Delete the entry resided in the cache.
1434
+ template <class Entry>
1435
+ void DeleteEntryCached(const Slice& /*key*/, void* value) {
1436
+ auto entry = reinterpret_cast<Entry*>(value);
1437
+ delete entry;
1346
1438
  }
1439
+ } // namespace
1347
1440
 
1348
1441
  //
1349
1442
  // Make a copy of the block contents and insert into compressed block cache
1350
1443
  //
1351
- Status BlockBasedTableBuilder::InsertBlockInCache(const Slice& block_contents,
1352
- const CompressionType type,
1353
- const BlockHandle* handle) {
1444
+ Status BlockBasedTableBuilder::InsertBlockInCompressedCache(
1445
+ const Slice& block_contents, const CompressionType type,
1446
+ const BlockHandle* handle) {
1354
1447
  Rep* r = rep_;
1355
1448
  Cache* block_cache_compressed = r->table_options.block_cache_compressed.get();
1356
-
1449
+ Status s;
1357
1450
  if (type != kNoCompression && block_cache_compressed != nullptr) {
1358
1451
  size_t size = block_contents.size();
1359
1452
 
@@ -1368,42 +1461,139 @@ Status BlockBasedTableBuilder::InsertBlockInCache(const Slice& block_contents,
1368
1461
  block_contents_to_cache->is_raw_block = true;
1369
1462
  #endif // NDEBUG
1370
1463
 
1371
- // make cache key by appending the file offset to the cache prefix id
1372
- char* end = EncodeVarint64(
1373
- r->compressed_cache_key_prefix + r->compressed_cache_key_prefix_size,
1374
- handle->offset());
1375
- Slice key(r->compressed_cache_key_prefix,
1376
- static_cast<size_t>(end - r->compressed_cache_key_prefix));
1377
-
1378
- // Insert into compressed block cache.
1379
- // How should we deal with compressed cache full?
1380
- block_cache_compressed
1381
- ->Insert(key, block_contents_to_cache,
1382
- block_contents_to_cache->ApproximateMemoryUsage(),
1383
- &DeleteCachedBlockContents)
1384
- .PermitUncheckedError();
1464
+ CacheKey key = BlockBasedTable::GetCacheKey(rep_->base_cache_key, *handle);
1385
1465
 
1466
+ s = block_cache_compressed->Insert(
1467
+ key.AsSlice(), block_contents_to_cache,
1468
+ block_contents_to_cache->ApproximateMemoryUsage(),
1469
+ &DeleteEntryCached<BlockContents>);
1470
+ if (s.ok()) {
1471
+ RecordTick(rep_->ioptions.stats, BLOCK_CACHE_COMPRESSED_ADD);
1472
+ } else {
1473
+ RecordTick(rep_->ioptions.stats, BLOCK_CACHE_COMPRESSED_ADD_FAILURES);
1474
+ }
1386
1475
  // Invalidate OS cache.
1387
1476
  r->file->InvalidateCache(static_cast<size_t>(r->get_offset()), size)
1388
1477
  .PermitUncheckedError();
1389
1478
  }
1390
- return Status::OK();
1479
+ return s;
1480
+ }
1481
+
1482
+ Status BlockBasedTableBuilder::InsertBlockInCacheHelper(
1483
+ const Slice& block_contents, const BlockHandle* handle,
1484
+ BlockType block_type, bool is_top_level_filter_block) {
1485
+ Status s;
1486
+ if (block_type == BlockType::kData || block_type == BlockType::kIndex) {
1487
+ s = InsertBlockInCache<Block>(block_contents, handle, block_type);
1488
+ } else if (block_type == BlockType::kFilter) {
1489
+ if (rep_->filter_builder->IsBlockBased()) {
1490
+ // for block-based filter which is deprecated.
1491
+ s = InsertBlockInCache<BlockContents>(block_contents, handle, block_type);
1492
+ } else if (is_top_level_filter_block) {
1493
+ // for top level filter block in partitioned filter.
1494
+ s = InsertBlockInCache<Block>(block_contents, handle, block_type);
1495
+ } else {
1496
+ // for second level partitioned filters and full filters.
1497
+ s = InsertBlockInCache<ParsedFullFilterBlock>(block_contents, handle,
1498
+ block_type);
1499
+ }
1500
+ } else if (block_type == BlockType::kCompressionDictionary) {
1501
+ s = InsertBlockInCache<UncompressionDict>(block_contents, handle,
1502
+ block_type);
1503
+ }
1504
+ return s;
1505
+ }
1506
+
1507
+ template <typename TBlocklike>
1508
+ Status BlockBasedTableBuilder::InsertBlockInCache(const Slice& block_contents,
1509
+ const BlockHandle* handle,
1510
+ BlockType block_type) {
1511
+ // Uncompressed regular block cache
1512
+ Cache* block_cache = rep_->table_options.block_cache.get();
1513
+ Status s;
1514
+ if (block_cache != nullptr) {
1515
+ size_t size = block_contents.size();
1516
+ auto buf = AllocateBlock(size, block_cache->memory_allocator());
1517
+ memcpy(buf.get(), block_contents.data(), size);
1518
+ BlockContents results(std::move(buf), size);
1519
+
1520
+ CacheKey key = BlockBasedTable::GetCacheKey(rep_->base_cache_key, *handle);
1521
+
1522
+ const size_t read_amp_bytes_per_bit =
1523
+ rep_->table_options.read_amp_bytes_per_bit;
1524
+
1525
+ // TODO akanksha:: Dedup below code by calling
1526
+ // BlockBasedTable::PutDataBlockToCache.
1527
+ std::unique_ptr<TBlocklike> block_holder(
1528
+ BlocklikeTraits<TBlocklike>::Create(
1529
+ std::move(results), read_amp_bytes_per_bit,
1530
+ rep_->ioptions.statistics.get(),
1531
+ false /*rep_->blocks_definitely_zstd_compressed*/,
1532
+ rep_->table_options.filter_policy.get()));
1533
+
1534
+ assert(block_holder->own_bytes());
1535
+ size_t charge = block_holder->ApproximateMemoryUsage();
1536
+ s = block_cache->Insert(
1537
+ key.AsSlice(), block_holder.get(),
1538
+ BlocklikeTraits<TBlocklike>::GetCacheItemHelper(block_type), charge,
1539
+ nullptr, Cache::Priority::LOW);
1540
+
1541
+ if (s.ok()) {
1542
+ // Release ownership of block_holder.
1543
+ block_holder.release();
1544
+ BlockBasedTable::UpdateCacheInsertionMetrics(
1545
+ block_type, nullptr /*get_context*/, charge, s.IsOkOverwritten(),
1546
+ rep_->ioptions.stats);
1547
+ } else {
1548
+ RecordTick(rep_->ioptions.stats, BLOCK_CACHE_ADD_FAILURES);
1549
+ }
1550
+ }
1551
+ return s;
1391
1552
  }
1392
1553
 
1393
1554
  void BlockBasedTableBuilder::WriteFilterBlock(
1394
1555
  MetaIndexBuilder* meta_index_builder) {
1395
1556
  BlockHandle filter_block_handle;
1396
- bool empty_filter_block = (rep_->filter_builder == nullptr ||
1397
- rep_->filter_builder->NumAdded() == 0);
1557
+ bool empty_filter_block =
1558
+ (rep_->filter_builder == nullptr || rep_->filter_builder->IsEmpty());
1398
1559
  if (ok() && !empty_filter_block) {
1560
+ rep_->props.num_filter_entries +=
1561
+ rep_->filter_builder->EstimateEntriesAdded();
1399
1562
  Status s = Status::Incomplete();
1400
1563
  while (ok() && s.IsIncomplete()) {
1564
+ // filter_data is used to store the transferred filter data payload from
1565
+ // FilterBlockBuilder and deallocate the payload by going out of scope.
1566
+ // Otherwise, the payload will unnecessarily remain until
1567
+ // BlockBasedTableBuilder is deallocated.
1568
+ //
1569
+ // See FilterBlockBuilder::Finish() for more on the difference in
1570
+ // transferred filter data payload among different FilterBlockBuilder
1571
+ // subtypes.
1572
+ std::unique_ptr<const char[]> filter_data;
1401
1573
  Slice filter_content =
1402
- rep_->filter_builder->Finish(filter_block_handle, &s);
1403
- assert(s.ok() || s.IsIncomplete());
1574
+ rep_->filter_builder->Finish(filter_block_handle, &s, &filter_data);
1575
+
1576
+ assert(s.ok() || s.IsIncomplete() || s.IsCorruption());
1577
+ if (s.IsCorruption()) {
1578
+ rep_->SetStatus(s);
1579
+ break;
1580
+ }
1581
+
1404
1582
  rep_->props.filter_size += filter_content.size();
1405
- WriteRawBlock(filter_content, kNoCompression, &filter_block_handle);
1583
+
1584
+ // TODO: Refactor code so that BlockType can determine both the C++ type
1585
+ // of a block cache entry (TBlocklike) and the CacheEntryRole while
1586
+ // inserting blocks in cache.
1587
+ bool top_level_filter_block = false;
1588
+ if (s.ok() && rep_->table_options.partition_filters &&
1589
+ !rep_->filter_builder->IsBlockBased()) {
1590
+ top_level_filter_block = true;
1591
+ }
1592
+ WriteRawBlock(filter_content, kNoCompression, &filter_block_handle,
1593
+ BlockType::kFilter, nullptr /*raw_contents*/,
1594
+ top_level_filter_block);
1406
1595
  }
1596
+ rep_->filter_builder->ResetFilterBitsBuilder();
1407
1597
  }
1408
1598
  if (ok() && !empty_filter_block) {
1409
1599
  // Add mapping from "<filter_block_prefix>.Name" to location
@@ -1416,13 +1606,16 @@ void BlockBasedTableBuilder::WriteFilterBlock(
1416
1606
  ? BlockBasedTable::kPartitionedFilterBlockPrefix
1417
1607
  : BlockBasedTable::kFullFilterBlockPrefix;
1418
1608
  }
1419
- key.append(rep_->table_options.filter_policy->Name());
1609
+ key.append(rep_->table_options.filter_policy->CompatibilityName());
1420
1610
  meta_index_builder->Add(key, filter_block_handle);
1421
1611
  }
1422
1612
  }
1423
1613
 
1424
1614
  void BlockBasedTableBuilder::WriteIndexBlock(
1425
1615
  MetaIndexBuilder* meta_index_builder, BlockHandle* index_block_handle) {
1616
+ if (!ok()) {
1617
+ return;
1618
+ }
1426
1619
  IndexBuilder::IndexBlocks index_blocks;
1427
1620
  auto index_builder_status = rep_->index_builder->Finish(&index_blocks);
1428
1621
  if (index_builder_status.IsIncomplete()) {
@@ -1436,7 +1629,7 @@ void BlockBasedTableBuilder::WriteIndexBlock(
1436
1629
  if (ok()) {
1437
1630
  for (const auto& item : index_blocks.meta_blocks) {
1438
1631
  BlockHandle block_handle;
1439
- WriteBlock(item.second, &block_handle, false /* is_data_block */);
1632
+ WriteBlock(item.second, &block_handle, BlockType::kIndex);
1440
1633
  if (!ok()) {
1441
1634
  break;
1442
1635
  }
@@ -1445,27 +1638,36 @@ void BlockBasedTableBuilder::WriteIndexBlock(
1445
1638
  }
1446
1639
  if (ok()) {
1447
1640
  if (rep_->table_options.enable_index_compression) {
1448
- WriteBlock(index_blocks.index_block_contents, index_block_handle, false);
1641
+ WriteBlock(index_blocks.index_block_contents, index_block_handle,
1642
+ BlockType::kIndex);
1449
1643
  } else {
1450
1644
  WriteRawBlock(index_blocks.index_block_contents, kNoCompression,
1451
- index_block_handle);
1645
+ index_block_handle, BlockType::kIndex);
1452
1646
  }
1453
1647
  }
1454
1648
  // If there are more index partitions, finish them and write them out
1455
1649
  if (index_builder_status.IsIncomplete()) {
1456
- Status s = Status::Incomplete();
1457
- while (ok() && s.IsIncomplete()) {
1458
- s = rep_->index_builder->Finish(&index_blocks, *index_block_handle);
1459
- if (!s.ok() && !s.IsIncomplete()) {
1650
+ bool index_building_finished = false;
1651
+ while (ok() && !index_building_finished) {
1652
+ Status s =
1653
+ rep_->index_builder->Finish(&index_blocks, *index_block_handle);
1654
+ if (s.ok()) {
1655
+ index_building_finished = true;
1656
+ } else if (s.IsIncomplete()) {
1657
+ // More partitioned index after this one
1658
+ assert(!index_building_finished);
1659
+ } else {
1660
+ // Error
1460
1661
  rep_->SetStatus(s);
1461
1662
  return;
1462
1663
  }
1664
+
1463
1665
  if (rep_->table_options.enable_index_compression) {
1464
1666
  WriteBlock(index_blocks.index_block_contents, index_block_handle,
1465
- false);
1667
+ BlockType::kIndex);
1466
1668
  } else {
1467
1669
  WriteRawBlock(index_blocks.index_block_contents, kNoCompression,
1468
- index_block_handle);
1670
+ index_block_handle, BlockType::kIndex);
1469
1671
  }
1470
1672
  // The last index_block_handle will be for the partition index block
1471
1673
  }
@@ -1477,8 +1679,6 @@ void BlockBasedTableBuilder::WritePropertiesBlock(
1477
1679
  BlockHandle properties_block_handle;
1478
1680
  if (ok()) {
1479
1681
  PropertyBlockBuilder property_block_builder;
1480
- rep_->props.column_family_id = rep_->column_family_id;
1481
- rep_->props.column_family_name = rep_->column_family_name;
1482
1682
  rep_->props.filter_policy_name =
1483
1683
  rep_->table_options.filter_policy != nullptr
1484
1684
  ? rep_->table_options.filter_policy->Name()
@@ -1498,9 +1698,8 @@ void BlockBasedTableBuilder::WritePropertiesBlock(
1498
1698
  CompressionOptionsToString(rep_->compression_opts);
1499
1699
  rep_->props.prefix_extractor_name =
1500
1700
  rep_->moptions.prefix_extractor != nullptr
1501
- ? rep_->moptions.prefix_extractor->Name()
1701
+ ? rep_->moptions.prefix_extractor->AsString()
1502
1702
  : "nullptr";
1503
-
1504
1703
  std::string property_collectors_names = "[";
1505
1704
  for (size_t i = 0;
1506
1705
  i < rep_->ioptions.table_properties_collector_factories.size(); ++i) {
@@ -1523,23 +1722,41 @@ void BlockBasedTableBuilder::WritePropertiesBlock(
1523
1722
  !rep_->index_builder->seperator_is_key_plus_seq();
1524
1723
  rep_->props.index_value_is_delta_encoded =
1525
1724
  rep_->use_delta_encoding_for_index_values;
1526
- rep_->props.creation_time = rep_->creation_time;
1527
- rep_->props.oldest_key_time = rep_->oldest_key_time;
1528
- rep_->props.file_creation_time = rep_->file_creation_time;
1529
- rep_->props.db_id = rep_->db_id;
1530
- rep_->props.db_session_id = rep_->db_session_id;
1531
- rep_->props.db_host_id = rep_->db_host_id;
1725
+ if (rep_->sampled_input_data_bytes > 0) {
1726
+ rep_->props.slow_compression_estimated_data_size = static_cast<uint64_t>(
1727
+ static_cast<double>(rep_->sampled_output_slow_data_bytes) /
1728
+ rep_->sampled_input_data_bytes *
1729
+ rep_->compressible_input_data_bytes +
1730
+ rep_->uncompressible_input_data_bytes + 0.5);
1731
+ rep_->props.fast_compression_estimated_data_size = static_cast<uint64_t>(
1732
+ static_cast<double>(rep_->sampled_output_fast_data_bytes) /
1733
+ rep_->sampled_input_data_bytes *
1734
+ rep_->compressible_input_data_bytes +
1735
+ rep_->uncompressible_input_data_bytes + 0.5);
1736
+ } else if (rep_->sample_for_compression > 0) {
1737
+ // We tried to sample but none were found. Assume worst-case (compression
1738
+ // ratio 1.0) so data is complete and aggregatable.
1739
+ rep_->props.slow_compression_estimated_data_size =
1740
+ rep_->compressible_input_data_bytes +
1741
+ rep_->uncompressible_input_data_bytes;
1742
+ rep_->props.fast_compression_estimated_data_size =
1743
+ rep_->compressible_input_data_bytes +
1744
+ rep_->uncompressible_input_data_bytes;
1745
+ }
1532
1746
 
1533
1747
  // Add basic properties
1534
1748
  property_block_builder.AddTableProperty(rep_->props);
1535
1749
 
1536
1750
  // Add use collected properties
1537
1751
  NotifyCollectTableCollectorsOnFinish(rep_->table_properties_collectors,
1538
- rep_->ioptions.info_log,
1752
+ rep_->ioptions.logger,
1539
1753
  &property_block_builder);
1540
1754
 
1541
- WriteRawBlock(property_block_builder.Finish(), kNoCompression,
1542
- &properties_block_handle);
1755
+ Slice block_data = property_block_builder.Finish();
1756
+ TEST_SYNC_POINT_CALLBACK(
1757
+ "BlockBasedTableBuilder::WritePropertiesBlock:BlockData", &block_data);
1758
+ WriteRawBlock(block_data, kNoCompression, &properties_block_handle,
1759
+ BlockType::kProperties);
1543
1760
  }
1544
1761
  if (ok()) {
1545
1762
  #ifndef NDEBUG
@@ -1554,7 +1771,12 @@ void BlockBasedTableBuilder::WritePropertiesBlock(
1554
1771
  &props_block_size);
1555
1772
  }
1556
1773
  #endif // !NDEBUG
1557
- meta_index_builder->Add(kPropertiesBlock, properties_block_handle);
1774
+
1775
+ const std::string* properties_block_meta = &kPropertiesBlockName;
1776
+ TEST_SYNC_POINT_CALLBACK(
1777
+ "BlockBasedTableBuilder::WritePropertiesBlock:Meta",
1778
+ &properties_block_meta);
1779
+ meta_index_builder->Add(*properties_block_meta, properties_block_handle);
1558
1780
  }
1559
1781
  }
1560
1782
 
@@ -1565,7 +1787,8 @@ void BlockBasedTableBuilder::WriteCompressionDictBlock(
1565
1787
  BlockHandle compression_dict_block_handle;
1566
1788
  if (ok()) {
1567
1789
  WriteRawBlock(rep_->compression_dict->GetRawDict(), kNoCompression,
1568
- &compression_dict_block_handle);
1790
+ &compression_dict_block_handle,
1791
+ BlockType::kCompressionDictionary);
1569
1792
  #ifndef NDEBUG
1570
1793
  Slice compression_dict = rep_->compression_dict->GetRawDict();
1571
1794
  TEST_SYNC_POINT_CALLBACK(
@@ -1574,7 +1797,7 @@ void BlockBasedTableBuilder::WriteCompressionDictBlock(
1574
1797
  #endif // NDEBUG
1575
1798
  }
1576
1799
  if (ok()) {
1577
- meta_index_builder->Add(kCompressionDictBlock,
1800
+ meta_index_builder->Add(kCompressionDictBlockName,
1578
1801
  compression_dict_block_handle);
1579
1802
  }
1580
1803
  }
@@ -1585,40 +1808,28 @@ void BlockBasedTableBuilder::WriteRangeDelBlock(
1585
1808
  if (ok() && !rep_->range_del_block.empty()) {
1586
1809
  BlockHandle range_del_block_handle;
1587
1810
  WriteRawBlock(rep_->range_del_block.Finish(), kNoCompression,
1588
- &range_del_block_handle);
1589
- meta_index_builder->Add(kRangeDelBlock, range_del_block_handle);
1811
+ &range_del_block_handle, BlockType::kRangeDeletion);
1812
+ meta_index_builder->Add(kRangeDelBlockName, range_del_block_handle);
1590
1813
  }
1591
1814
  }
1592
1815
 
1593
1816
  void BlockBasedTableBuilder::WriteFooter(BlockHandle& metaindex_block_handle,
1594
1817
  BlockHandle& index_block_handle) {
1595
1818
  Rep* r = rep_;
1596
- // No need to write out new footer if we're using default checksum.
1597
- // We're writing legacy magic number because we want old versions of RocksDB
1598
- // be able to read files generated with new release (just in case if
1599
- // somebody wants to roll back after an upgrade)
1600
- // TODO(icanadi) at some point in the future, when we're absolutely sure
1601
- // nobody will roll back to RocksDB 2.x versions, retire the legacy magic
1602
- // number and always write new table files with new magic number
1603
- bool legacy = (r->table_options.format_version == 0);
1604
1819
  // this is guaranteed by BlockBasedTableBuilder's constructor
1605
1820
  assert(r->table_options.checksum == kCRC32c ||
1606
1821
  r->table_options.format_version != 0);
1607
- Footer footer(
1608
- legacy ? kLegacyBlockBasedTableMagicNumber : kBlockBasedTableMagicNumber,
1609
- r->table_options.format_version);
1610
- footer.set_metaindex_handle(metaindex_block_handle);
1611
- footer.set_index_handle(index_block_handle);
1612
- footer.set_checksum(r->table_options.checksum);
1613
- std::string footer_encoding;
1614
- footer.EncodeTo(&footer_encoding);
1615
1822
  assert(ok());
1616
- IOStatus ios = r->file->Append(footer_encoding);
1823
+
1824
+ FooterBuilder footer;
1825
+ footer.Build(kBlockBasedTableMagicNumber, r->table_options.format_version,
1826
+ r->get_offset(), r->table_options.checksum,
1827
+ metaindex_block_handle, index_block_handle);
1828
+ IOStatus ios = r->file->Append(footer.GetSlice());
1617
1829
  if (ios.ok()) {
1618
- r->set_offset(r->get_offset() + footer_encoding.size());
1830
+ r->set_offset(r->get_offset() + footer.GetSlice().size());
1619
1831
  } else {
1620
1832
  r->SetIOStatus(ios);
1621
- r->SetStatus(ios);
1622
1833
  }
1623
1834
  }
1624
1835
 
@@ -1629,20 +1840,45 @@ void BlockBasedTableBuilder::EnterUnbuffered() {
1629
1840
  const size_t kSampleBytes = r->compression_opts.zstd_max_train_bytes > 0
1630
1841
  ? r->compression_opts.zstd_max_train_bytes
1631
1842
  : r->compression_opts.max_dict_bytes;
1632
- Random64 generator{r->creation_time};
1843
+ const size_t kNumBlocksBuffered = r->data_block_buffers.size();
1844
+ if (kNumBlocksBuffered == 0) {
1845
+ // The below code is neither safe nor necessary for handling zero data
1846
+ // blocks.
1847
+ return;
1848
+ }
1849
+
1850
+ // Abstract algebra teaches us that a finite cyclic group (such as the
1851
+ // additive group of integers modulo N) can be generated by a number that is
1852
+ // coprime with N. Since N is variable (number of buffered data blocks), we
1853
+ // must then pick a prime number in order to guarantee coprimeness with any N.
1854
+ //
1855
+ // One downside of this approach is the spread will be poor when
1856
+ // `kPrimeGeneratorRemainder` is close to zero or close to
1857
+ // `kNumBlocksBuffered`.
1858
+ //
1859
+ // Picked a random number between one and one trillion and then chose the
1860
+ // next prime number greater than or equal to it.
1861
+ const uint64_t kPrimeGenerator = 545055921143ull;
1862
+ // Can avoid repeated division by just adding the remainder repeatedly.
1863
+ const size_t kPrimeGeneratorRemainder = static_cast<size_t>(
1864
+ kPrimeGenerator % static_cast<uint64_t>(kNumBlocksBuffered));
1865
+ const size_t kInitSampleIdx = kNumBlocksBuffered / 2;
1866
+
1633
1867
  std::string compression_dict_samples;
1634
1868
  std::vector<size_t> compression_dict_sample_lens;
1635
- if (!r->data_block_and_keys_buffers.empty()) {
1636
- while (compression_dict_samples.size() < kSampleBytes) {
1637
- size_t rand_idx =
1638
- static_cast<size_t>(
1639
- generator.Uniform(r->data_block_and_keys_buffers.size()));
1640
- size_t copy_len =
1641
- std::min(kSampleBytes - compression_dict_samples.size(),
1642
- r->data_block_and_keys_buffers[rand_idx].first.size());
1643
- compression_dict_samples.append(
1644
- r->data_block_and_keys_buffers[rand_idx].first, 0, copy_len);
1645
- compression_dict_sample_lens.emplace_back(copy_len);
1869
+ size_t buffer_idx = kInitSampleIdx;
1870
+ for (size_t i = 0;
1871
+ i < kNumBlocksBuffered && compression_dict_samples.size() < kSampleBytes;
1872
+ ++i) {
1873
+ size_t copy_len = std::min(kSampleBytes - compression_dict_samples.size(),
1874
+ r->data_block_buffers[buffer_idx].size());
1875
+ compression_dict_samples.append(r->data_block_buffers[buffer_idx], 0,
1876
+ copy_len);
1877
+ compression_dict_sample_lens.emplace_back(copy_len);
1878
+
1879
+ buffer_idx += kPrimeGeneratorRemainder;
1880
+ if (buffer_idx >= kNumBlocksBuffered) {
1881
+ buffer_idx -= kNumBlocksBuffered;
1646
1882
  }
1647
1883
  }
1648
1884
 
@@ -1662,30 +1898,58 @@ void BlockBasedTableBuilder::EnterUnbuffered() {
1662
1898
  dict, r->compression_type == kZSTD ||
1663
1899
  r->compression_type == kZSTDNotFinalCompression));
1664
1900
 
1665
- for (size_t i = 0; ok() && i < r->data_block_and_keys_buffers.size(); ++i) {
1666
- auto& data_block = r->data_block_and_keys_buffers[i].first;
1667
- auto& keys = r->data_block_and_keys_buffers[i].second;
1901
+ auto get_iterator_for_block = [&r](size_t i) {
1902
+ auto& data_block = r->data_block_buffers[i];
1668
1903
  assert(!data_block.empty());
1669
- assert(!keys.empty());
1904
+
1905
+ Block reader{BlockContents{data_block}};
1906
+ DataBlockIter* iter = reader.NewDataIterator(
1907
+ r->internal_comparator.user_comparator(), kDisableGlobalSequenceNumber);
1908
+
1909
+ iter->SeekToFirst();
1910
+ assert(iter->Valid());
1911
+ return std::unique_ptr<DataBlockIter>(iter);
1912
+ };
1913
+
1914
+ std::unique_ptr<DataBlockIter> iter = nullptr, next_block_iter = nullptr;
1915
+
1916
+ for (size_t i = 0; ok() && i < r->data_block_buffers.size(); ++i) {
1917
+ if (iter == nullptr) {
1918
+ iter = get_iterator_for_block(i);
1919
+ assert(iter != nullptr);
1920
+ };
1921
+
1922
+ if (i + 1 < r->data_block_buffers.size()) {
1923
+ next_block_iter = get_iterator_for_block(i + 1);
1924
+ }
1925
+
1926
+ auto& data_block = r->data_block_buffers[i];
1670
1927
 
1671
1928
  if (r->IsParallelCompressionEnabled()) {
1672
1929
  Slice first_key_in_next_block;
1673
1930
  const Slice* first_key_in_next_block_ptr = &first_key_in_next_block;
1674
- if (i + 1 < r->data_block_and_keys_buffers.size()) {
1675
- first_key_in_next_block =
1676
- r->data_block_and_keys_buffers[i + 1].second.front();
1931
+ if (i + 1 < r->data_block_buffers.size()) {
1932
+ assert(next_block_iter != nullptr);
1933
+ first_key_in_next_block = next_block_iter->key();
1677
1934
  } else {
1678
1935
  first_key_in_next_block_ptr = r->first_key_in_next_block;
1679
1936
  }
1680
1937
 
1938
+ std::vector<std::string> keys;
1939
+ for (; iter->Valid(); iter->Next()) {
1940
+ keys.emplace_back(iter->key().ToString());
1941
+ }
1942
+
1681
1943
  ParallelCompressionRep::BlockRep* block_rep = r->pc_rep->PrepareBlock(
1682
1944
  r->compression_type, first_key_in_next_block_ptr, &data_block, &keys);
1945
+
1683
1946
  assert(block_rep != nullptr);
1684
1947
  r->pc_rep->file_size_estimator.EmitBlock(block_rep->data->size(),
1685
1948
  r->get_offset());
1686
1949
  r->pc_rep->EmitBlock(block_rep);
1687
1950
  } else {
1688
- for (const auto& key : keys) {
1951
+ for (; iter->Valid(); iter->Next()) {
1952
+ Slice key = iter->key();
1689
1953
  if (r->filter_builder != nullptr) {
1690
1954
  size_t ts_sz =
1691
1955
  r->internal_comparator.user_comparator()->timestamp_size();
@@ -1693,18 +1957,29 @@ void BlockBasedTableBuilder::EnterUnbuffered() {
1693
1957
  }
1694
1958
  r->index_builder->OnKeyAdded(key);
1695
1959
  }
1696
- WriteBlock(Slice(data_block), &r->pending_handle,
1697
- true /* is_data_block */);
1698
- if (ok() && i + 1 < r->data_block_and_keys_buffers.size()) {
1699
- Slice first_key_in_next_block =
1700
- r->data_block_and_keys_buffers[i + 1].second.front();
1960
+ WriteBlock(Slice(data_block), &r->pending_handle, BlockType::kData);
1961
+ if (ok() && i + 1 < r->data_block_buffers.size()) {
1962
+ assert(next_block_iter != nullptr);
1963
+ Slice first_key_in_next_block = next_block_iter->key();
1964
+
1701
1965
  Slice* first_key_in_next_block_ptr = &first_key_in_next_block;
1702
- r->index_builder->AddIndexEntry(
1703
- &keys.back(), first_key_in_next_block_ptr, r->pending_handle);
1966
+
1967
+ iter->SeekToLast();
1968
+ std::string last_key = iter->key().ToString();
1969
+ r->index_builder->AddIndexEntry(&last_key, first_key_in_next_block_ptr,
1970
+ r->pending_handle);
1704
1971
  }
1705
1972
  }
1973
+ std::swap(iter, next_block_iter);
1974
+ }
1975
+ r->data_block_buffers.clear();
1976
+ r->data_begin_offset = 0;
1977
+ // Release all reserved cache for data block buffers
1978
+ if (r->compression_dict_buffer_cache_res_mgr != nullptr) {
1979
+ Status s = r->compression_dict_buffer_cache_res_mgr->UpdateCacheReservation(
1980
+ r->data_begin_offset);
1981
+ s.PermitUncheckedError();
1706
1982
  }
1707
- r->data_block_and_keys_buffers.clear();
1708
1983
  }
1709
1984
 
1710
1985
  Status BlockBasedTableBuilder::Finish() {
@@ -1750,7 +2025,7 @@ Status BlockBasedTableBuilder::Finish() {
1750
2025
  if (ok()) {
1751
2026
  // flush the meta index block
1752
2027
  WriteRawBlock(meta_index_builder.Finish(), kNoCompression,
1753
- &metaindex_block_handle);
2028
+ &metaindex_block_handle, BlockType::kMetaIndex);
1754
2029
  }
1755
2030
  if (ok()) {
1756
2031
  WriteFooter(metaindex_block_handle, index_block_handle);