@nxtedition/rocksdb 10.1.4 → 10.1.6

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 (266) hide show
  1. package/binding.cc +16 -12
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +16 -5
  3. package/deps/rocksdb/rocksdb/Makefile +38 -15
  4. package/deps/rocksdb/rocksdb/TARGETS +10 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -0
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +4 -4
  7. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +4 -2
  8. package/deps/rocksdb/rocksdb/db/builder.cc +2 -2
  9. package/deps/rocksdb/rocksdb/db/builder.h +1 -1
  10. package/deps/rocksdb/rocksdb/db/c.cc +205 -6
  11. package/deps/rocksdb/rocksdb/db/c_test.c +189 -1
  12. package/deps/rocksdb/rocksdb/db/column_family.cc +28 -0
  13. package/deps/rocksdb/rocksdb/db/column_family.h +17 -0
  14. package/deps/rocksdb/rocksdb/db/column_family_test.cc +234 -60
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +8 -1
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -9
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +4 -4
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -0
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +22 -25
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +2 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +112 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +72 -21
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +2 -0
  25. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +77 -0
  26. package/deps/rocksdb/rocksdb/db/convenience.cc +3 -0
  27. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +269 -112
  28. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +107 -43
  29. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +93 -24
  30. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +5 -5
  31. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +157 -68
  32. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +56 -15
  33. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +78 -105
  34. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +39 -9
  35. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +21 -14
  37. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +107 -63
  38. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +43 -2
  39. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +4 -0
  40. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +6 -0
  41. package/deps/rocksdb/rocksdb/db/db_test.cc +10 -2
  42. package/deps/rocksdb/rocksdb/db/db_test2.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_test_util.cc +5 -0
  44. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -6
  45. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +92 -2
  46. package/deps/rocksdb/rocksdb/db/error_handler.cc +34 -39
  47. package/deps/rocksdb/rocksdb/db/error_handler.h +3 -4
  48. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/event_helpers.cc +6 -3
  50. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +71 -15
  51. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +11 -0
  52. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +383 -4
  53. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +88 -72
  54. package/deps/rocksdb/rocksdb/db/flush_job.cc +30 -3
  55. package/deps/rocksdb/rocksdb/db/flush_job.h +14 -0
  56. package/deps/rocksdb/rocksdb/db/internal_stats.cc +60 -1
  57. package/deps/rocksdb/rocksdb/db/internal_stats.h +20 -1
  58. package/deps/rocksdb/rocksdb/db/log_writer.cc +24 -0
  59. package/deps/rocksdb/rocksdb/db/log_writer.h +5 -0
  60. package/deps/rocksdb/rocksdb/db/memtable.cc +6 -4
  61. package/deps/rocksdb/rocksdb/db/memtable.h +10 -10
  62. package/deps/rocksdb/rocksdb/db/memtable_list.cc +4 -4
  63. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +10 -3
  64. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +8 -10
  65. package/deps/rocksdb/rocksdb/db/repair.cc +4 -3
  66. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +30 -0
  67. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +9 -0
  68. package/deps/rocksdb/rocksdb/db/table_cache.cc +17 -2
  69. package/deps/rocksdb/rocksdb/db/table_cache.h +9 -1
  70. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +9 -2
  71. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +3 -1
  72. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +3 -3
  73. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +7 -7
  74. package/deps/rocksdb/rocksdb/db/version_edit.cc +0 -1
  75. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -6
  76. package/deps/rocksdb/rocksdb/db/version_set.cc +54 -31
  77. package/deps/rocksdb/rocksdb/db/version_set.h +14 -7
  78. package/deps/rocksdb/rocksdb/db/wal_manager.cc +37 -29
  79. package/deps/rocksdb/rocksdb/db/wal_manager.h +6 -5
  80. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +6 -0
  81. package/deps/rocksdb/rocksdb/db/write_batch.cc +54 -23
  82. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +46 -5
  83. package/deps/rocksdb/rocksdb/db/write_thread.cc +53 -5
  84. package/deps/rocksdb/rocksdb/db/write_thread.h +36 -4
  85. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  86. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -0
  87. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +57 -17
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +11 -3
  89. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -4
  90. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +10 -25
  91. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +25 -88
  92. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.cc +93 -0
  93. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_filters.h +16 -0
  94. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +43 -0
  95. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +109 -21
  96. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -0
  97. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +666 -205
  98. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +55 -10
  99. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -16
  100. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +19 -0
  101. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +5 -0
  102. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +782 -494
  103. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +21 -0
  104. package/deps/rocksdb/rocksdb/env/env.cc +6 -0
  105. package/deps/rocksdb/rocksdb/env/io_posix.cc +0 -1
  106. package/deps/rocksdb/rocksdb/file/file_util.cc +8 -2
  107. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +34 -19
  108. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +29 -32
  109. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +41 -15
  110. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +4 -2
  111. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +63 -0
  112. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +16 -5
  113. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +5 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +0 -16
  115. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +16 -0
  116. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +21 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +76 -3
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +17 -0
  119. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +12 -6
  120. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +31 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/user_write_callback.h +29 -0
  122. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +4 -2
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +0 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +17 -8
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +2 -2
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +46 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +7 -0
  128. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  129. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -2
  130. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  131. package/deps/rocksdb/rocksdb/options/db_options.cc +8 -0
  132. package/deps/rocksdb/rocksdb/options/db_options.h +9 -5
  133. package/deps/rocksdb/rocksdb/options/options.cc +3 -0
  134. package/deps/rocksdb/rocksdb/options/options_helper.cc +1 -0
  135. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -1
  136. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +2 -2
  137. package/deps/rocksdb/rocksdb/port/stack_trace.cc +1 -0
  138. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  139. package/deps/rocksdb/rocksdb/src.mk +4 -0
  140. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +1 -2
  141. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +4 -2
  142. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +15 -0
  143. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -41
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +15 -7
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +1 -3
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +5 -6
  147. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +31 -0
  148. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -0
  149. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +10 -5
  150. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +11 -15
  151. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +17 -11
  152. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +5 -2
  153. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -21
  154. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +9 -11
  155. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +16 -16
  156. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -2
  157. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +14 -9
  158. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +4 -1
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +82 -41
  160. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +13 -14
  161. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +18 -22
  162. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +51 -13
  163. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +2 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +3 -11
  165. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -3
  166. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +9 -10
  167. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +3 -2
  168. package/deps/rocksdb/rocksdb/table/format.cc +1 -2
  169. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +18 -13
  170. package/deps/rocksdb/rocksdb/table/merging_iterator.h +5 -3
  171. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +2 -2
  172. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +1 -1
  173. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +3 -1
  174. package/deps/rocksdb/rocksdb/table/table_builder.h +8 -7
  175. package/deps/rocksdb/rocksdb/table/table_reader.h +9 -0
  176. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -0
  177. package/deps/rocksdb/rocksdb/test_util/testutil.h +6 -0
  178. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +19 -0
  179. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +434 -110
  180. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +3 -1
  181. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +3 -0
  182. package/deps/rocksdb/rocksdb/util/aligned_storage.h +24 -0
  183. package/deps/rocksdb/rocksdb/util/filter_bench.cc +1 -1
  184. package/deps/rocksdb/rocksdb/util/random.cc +2 -1
  185. package/deps/rocksdb/rocksdb/util/stderr_logger.h +1 -1
  186. package/deps/rocksdb/rocksdb/util/udt_util.cc +33 -0
  187. package/deps/rocksdb/rocksdb/util/udt_util.h +7 -0
  188. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +33 -0
  189. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/xxhash.h +10 -3
  191. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +13 -13
  192. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +104 -48
  193. package/deps/rocksdb/rocksdb/utilities/debug.cc +16 -4
  194. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +647 -235
  195. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +274 -157
  196. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +144 -0
  197. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +45 -0
  198. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector_test.cc +139 -0
  199. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +12 -0
  200. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +3 -0
  201. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +105 -6
  202. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +64 -8
  203. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -0
  204. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +43 -5
  205. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +5 -0
  206. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +154 -6
  207. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +1 -1
  208. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +158 -2
  209. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +16 -11
  210. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +4 -4
  211. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +9 -8
  212. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +2 -1
  213. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +43 -7
  214. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -0
  215. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +1 -1
  216. package/index.js +1 -2
  217. package/package.json +1 -1
  218. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  219. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  220. package/util.h +25 -2
  221. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  222. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  223. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  224. package/.tap/test-results/test/batch-test.js.tap +0 -12
  225. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  226. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  227. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  228. package/.tap/test-results/test/column-test.js.tap +0 -55
  229. package/.tap/test-results/test/common.js.tap +0 -0
  230. package/.tap/test-results/test/compression-test.js.tap +0 -30
  231. package/.tap/test-results/test/db-identity.js.tap +0 -12
  232. package/.tap/test-results/test/electron.js.tap +0 -0
  233. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  234. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  235. package/.tap/test-results/test/gc.js.tap +0 -0
  236. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  237. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  238. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  239. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  240. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  241. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  242. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  243. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  244. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  245. package/.tap/test-results/test/lock-test.js.tap +0 -18
  246. package/.tap/test-results/test/lock.js.tap +0 -0
  247. package/.tap/test-results/test/make.js.tap +0 -0
  248. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  249. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  250. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  251. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  252. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  253. package/deps/rocksdb/rocksdb/README.md +0 -29
  254. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  255. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  256. package/deps/rocksdb/rocksdb/port/README +0 -10
  257. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  258. package/tmp/000099.sst +0 -0
  259. package/tmp/000102.sst +0 -0
  260. package/tmp/000103.log +0 -0
  261. package/tmp/CURRENT +0 -1
  262. package/tmp/IDENTITY +0 -1
  263. package/tmp/LOCK +0 -0
  264. package/tmp/MANIFEST-000104 +0 -0
  265. package/tmp/OPTIONS-000098 +0 -207
  266. package/tmp/OPTIONS-000106 +0 -207
@@ -314,6 +314,8 @@ class CompactionJob {
314
314
  // deleted because that version is not visible in any snapshot.
315
315
  std::vector<SequenceNumber> existing_snapshots_;
316
316
 
317
+ SequenceNumber earliest_snapshot_;
318
+
317
319
  // This is the earliest snapshot that could be used for write-conflict
318
320
  // checking by a transaction. For any user-key newer than this snapshot, we
319
321
  // should make sure not to remove evidence that a write occurred.
@@ -4330,6 +4330,118 @@ TEST_F(CompactionPickerTest, IntraL0WhenL0IsSmall) {
4330
4330
  }
4331
4331
  }
4332
4332
 
4333
+ TEST_F(CompactionPickerTest, UniversalMaxReadAmpLargeDB) {
4334
+ ioptions_.compaction_style = kCompactionStyleUniversal;
4335
+ ioptions_.num_levels = 50;
4336
+ mutable_cf_options_.RefreshDerivedOptions(ioptions_);
4337
+ mutable_cf_options_.compaction_options_universal.size_ratio = 10;
4338
+ mutable_cf_options_.write_buffer_size = 256 << 20;
4339
+ // Avoid space amp compaction
4340
+ mutable_cf_options_.compaction_options_universal
4341
+ .max_size_amplification_percent = 200;
4342
+ const int kMaxRuns = 8;
4343
+ for (int max_read_amp : {kMaxRuns, 0, -1}) {
4344
+ SCOPED_TRACE("max_read_amp = " + std::to_string(max_read_amp));
4345
+ if (max_read_amp == -1) {
4346
+ mutable_cf_options_.level0_file_num_compaction_trigger = kMaxRuns;
4347
+ } else {
4348
+ mutable_cf_options_.level0_file_num_compaction_trigger = 4;
4349
+ }
4350
+ mutable_cf_options_.compaction_options_universal.max_read_amp =
4351
+ max_read_amp;
4352
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
4353
+ uint64_t max_run_size = 20ull << 30;
4354
+ // When max_read_amp = 0, we estimate the number of levels needed based on
4355
+ // size_ratio and write_buffer_size. See more in
4356
+ // UniversalCompactionBuilder::PickCompaction().
4357
+ // With a 20GB last level, we estimate that 8 levels are needed:
4358
+ // L0 256MB
4359
+ // L1 256MB * 1.1 (size_ratio) = 282MB
4360
+ // L2 (256MB + 282MB) * 1.1 = 592MB
4361
+ // L3 1243MB
4362
+ // L4 2610MB
4363
+ // L5 5481MB
4364
+ // L6 11510MB
4365
+ // L7 24171MB > 20GB
4366
+ for (int i = 0; i <= kMaxRuns; ++i) {
4367
+ SCOPED_TRACE("i = " + std::to_string(i));
4368
+ NewVersionStorage(/*num_levels=*/50, kCompactionStyleUniversal);
4369
+ Add(/*level=*/49, /*file_number=*/10, /*smallest=*/"100",
4370
+ /*largest=*/"200", /*file_size=*/max_run_size, /*path_id=*/0,
4371
+ /*smallest_seq=*/0, /*largest_seq=*/0,
4372
+ /*compensated_file_size=*/max_run_size);
4373
+ // Besides the last sorted run, we add additional `i` sorted runs
4374
+ // without triggering space-amp or size-amp compactions.
4375
+ uint64_t file_size = 1 << 20;
4376
+ for (int j = 0; j < i; ++j) {
4377
+ Add(/*level=*/j, /*file_number=*/100 - j, /*smallest=*/"100",
4378
+ /*largest=*/"200", /*file_size=*/file_size, /*path_id=*/0,
4379
+ /*smallest_seq=*/100 - j, /*largest_seq=*/100 - j,
4380
+ /*compensated_file_size=*/file_size);
4381
+ // to avoid space-amp and size-amp compaction
4382
+ file_size *= 2;
4383
+ }
4384
+ UpdateVersionStorageInfo();
4385
+ // level0_file_num_compaction_trigger is still used as trigger to
4386
+ // check potential compactions
4387
+ ASSERT_EQ(
4388
+ universal_compaction_picker.NeedsCompaction(vstorage_.get()),
4389
+ i + 1 >= mutable_cf_options_.level0_file_num_compaction_trigger);
4390
+ std::unique_ptr<Compaction> compaction(
4391
+ universal_compaction_picker.PickCompaction(
4392
+ cf_name_, mutable_cf_options_, mutable_db_options_,
4393
+ vstorage_.get(), &log_buffer_));
4394
+ if (i == kMaxRuns) {
4395
+ // There are in total i + 1 > kMaxRuns sorted runs.
4396
+ // This triggers compaction ignoring size_ratio.
4397
+ ASSERT_NE(nullptr, compaction);
4398
+ ASSERT_EQ(CompactionReason::kUniversalSortedRunNum,
4399
+ compaction->compaction_reason());
4400
+ // First two runs are compacted
4401
+ ASSERT_EQ(0, compaction->start_level());
4402
+ ASSERT_EQ(1, compaction->output_level());
4403
+ ASSERT_EQ(1U, compaction->num_input_files(0));
4404
+ ASSERT_EQ(1U, compaction->num_input_files(1));
4405
+ } else {
4406
+ ASSERT_EQ(nullptr, compaction);
4407
+ }
4408
+ }
4409
+ }
4410
+ }
4411
+
4412
+ TEST_F(CompactionPickerTest, UniversalMaxReadAmpSmallDB) {
4413
+ ioptions_.compaction_style = kCompactionStyleUniversal;
4414
+ ioptions_.num_levels = 50;
4415
+ mutable_cf_options_.RefreshDerivedOptions(ioptions_);
4416
+ mutable_cf_options_.level0_file_num_compaction_trigger = 1;
4417
+ mutable_cf_options_.compaction_options_universal.size_ratio = 10;
4418
+ mutable_cf_options_.write_buffer_size = 256 << 20;
4419
+ mutable_cf_options_.compaction_options_universal
4420
+ .max_size_amplification_percent = 200;
4421
+ const int kMaxRuns = 1;
4422
+ for (int max_read_amp : {-1, kMaxRuns, 0}) {
4423
+ SCOPED_TRACE("max_read_amp = " + std::to_string(max_read_amp));
4424
+ mutable_cf_options_.compaction_options_universal.max_read_amp =
4425
+ max_read_amp;
4426
+ UniversalCompactionPicker universal_compaction_picker(ioptions_, &icmp_);
4427
+ NewVersionStorage(/*num_levels=*/50, kCompactionStyleUniversal);
4428
+ // max_run_size is much smaller than write_buffer_size,
4429
+ // only 1 level is needed.
4430
+ uint64_t max_run_size = 8 << 10;
4431
+ Add(/*level=*/49, /*file_number=*/10, /*smallest=*/"100",
4432
+ /*largest=*/"200", /*file_size=*/max_run_size, /*path_id=*/0,
4433
+ /*smallest_seq=*/0, /*largest_seq=*/0,
4434
+ /*compensated_file_size=*/max_run_size);
4435
+ UpdateVersionStorageInfo();
4436
+ ASSERT_TRUE(universal_compaction_picker.NeedsCompaction(vstorage_.get()));
4437
+ std::unique_ptr<Compaction> compaction(
4438
+ universal_compaction_picker.PickCompaction(
4439
+ cf_name_, mutable_cf_options_, mutable_db_options_, vstorage_.get(),
4440
+ &log_buffer_));
4441
+ ASSERT_EQ(nullptr, compaction);
4442
+ }
4443
+ }
4444
+
4333
4445
  } // namespace ROCKSDB_NAMESPACE
4334
4446
 
4335
4447
  int main(int argc, char** argv) {
@@ -227,6 +227,7 @@ class UniversalCompactionBuilder {
227
227
  const InternalKeyComparator* icmp_;
228
228
  double score_;
229
229
  std::vector<SortedRun> sorted_runs_;
230
+ uint64_t max_run_size_;
230
231
  const std::string& cf_name_;
231
232
  const MutableCFOptions& mutable_cf_options_;
232
233
  const MutableDBOptions& mutable_db_options_;
@@ -235,7 +236,8 @@ class UniversalCompactionBuilder {
235
236
  LogBuffer* log_buffer_;
236
237
 
237
238
  static std::vector<UniversalCompactionBuilder::SortedRun> CalculateSortedRuns(
238
- const VersionStorageInfo& vstorage, int last_level);
239
+ const VersionStorageInfo& vstorage, int last_level,
240
+ uint64_t* max_run_size);
239
241
 
240
242
  // Pick a path ID to place a newly generated file, with its estimated file
241
243
  // size.
@@ -440,11 +442,15 @@ void UniversalCompactionBuilder::SortedRun::DumpSizeInfo(
440
442
 
441
443
  std::vector<UniversalCompactionBuilder::SortedRun>
442
444
  UniversalCompactionBuilder::CalculateSortedRuns(
443
- const VersionStorageInfo& vstorage, int last_level) {
445
+ const VersionStorageInfo& vstorage, int last_level,
446
+ uint64_t* max_run_size) {
447
+ assert(max_run_size);
448
+ *max_run_size = 0;
444
449
  std::vector<UniversalCompactionBuilder::SortedRun> ret;
445
450
  for (FileMetaData* f : vstorage.LevelFiles(0)) {
446
451
  ret.emplace_back(0, f, f->fd.GetFileSize(), f->compensated_file_size,
447
452
  f->being_compacted);
453
+ *max_run_size = std::max(*max_run_size, f->fd.GetFileSize());
448
454
  }
449
455
  for (int level = 1; level <= last_level; level++) {
450
456
  uint64_t total_compensated_size = 0U;
@@ -466,6 +472,7 @@ UniversalCompactionBuilder::CalculateSortedRuns(
466
472
  ret.emplace_back(level, nullptr, total_size, total_compensated_size,
467
473
  being_compacted);
468
474
  }
475
+ *max_run_size = std::max(*max_run_size, total_size);
469
476
  }
470
477
  return ret;
471
478
  }
@@ -477,13 +484,16 @@ Compaction* UniversalCompactionBuilder::PickCompaction() {
477
484
  score_ = vstorage_->CompactionScore(kLevel0);
478
485
  int max_output_level =
479
486
  vstorage_->MaxOutputLevel(ioptions_.allow_ingest_behind);
480
- sorted_runs_ = CalculateSortedRuns(*vstorage_, max_output_level);
487
+ max_run_size_ = 0;
488
+ sorted_runs_ =
489
+ CalculateSortedRuns(*vstorage_, max_output_level, &max_run_size_);
490
+ int file_num_compaction_trigger =
491
+ mutable_cf_options_.level0_file_num_compaction_trigger;
481
492
 
482
493
  if (sorted_runs_.size() == 0 ||
483
494
  (vstorage_->FilesMarkedForPeriodicCompaction().empty() &&
484
495
  vstorage_->FilesMarkedForCompaction().empty() &&
485
- sorted_runs_.size() < (unsigned int)mutable_cf_options_
486
- .level0_file_num_compaction_trigger)) {
496
+ sorted_runs_.size() < (unsigned int)file_num_compaction_trigger)) {
487
497
  ROCKS_LOG_BUFFER(log_buffer_, "[%s] Universal: nothing to do\n",
488
498
  cf_name_.c_str());
489
499
  TEST_SYNC_POINT_CALLBACK(
@@ -505,11 +515,9 @@ Compaction* UniversalCompactionBuilder::PickCompaction() {
505
515
  TEST_SYNC_POINT_CALLBACK("PostPickPeriodicCompaction", c);
506
516
  }
507
517
 
508
- // Check for size amplification.
509
518
  if (c == nullptr &&
510
- sorted_runs_.size() >=
511
- static_cast<size_t>(
512
- mutable_cf_options_.level0_file_num_compaction_trigger)) {
519
+ sorted_runs_.size() >= static_cast<size_t>(file_num_compaction_trigger)) {
520
+ // Check for size amplification.
513
521
  if ((c = PickCompactionToReduceSizeAmp()) != nullptr) {
514
522
  TEST_SYNC_POINT("PickCompactionToReduceSizeAmpReturnNonnullptr");
515
523
  ROCKS_LOG_BUFFER(log_buffer_, "[%s] Universal: compacting for size amp\n",
@@ -527,13 +535,48 @@ Compaction* UniversalCompactionBuilder::PickCompaction() {
527
535
  cf_name_.c_str());
528
536
  } else {
529
537
  // Size amplification and file size ratios are within configured limits.
530
- // If max read amplification is exceeding configured limits, then force
531
- // compaction without looking at filesize ratios and try to reduce
532
- // the number of files to fewer than level0_file_num_compaction_trigger.
538
+ // If max read amplification exceeds configured limits, then force
539
+ // compaction to reduce the number sorted runs without looking at file
540
+ // size ratios.
541
+
533
542
  // This is guaranteed by NeedsCompaction()
534
543
  assert(sorted_runs_.size() >=
535
- static_cast<size_t>(
536
- mutable_cf_options_.level0_file_num_compaction_trigger));
544
+ static_cast<size_t>(file_num_compaction_trigger));
545
+ int max_num_runs =
546
+ mutable_cf_options_.compaction_options_universal.max_read_amp;
547
+ if (max_num_runs < 0) {
548
+ // any value < -1 is not valid
549
+ assert(max_num_runs == -1);
550
+ // By default, fall back to `level0_file_num_compaction_trigger`
551
+ max_num_runs = file_num_compaction_trigger;
552
+ } else if (max_num_runs == 0) {
553
+ if (mutable_cf_options_.compaction_options_universal.stop_style ==
554
+ kCompactionStopStyleTotalSize) {
555
+ // 0 means auto-tuning by RocksDB. We estimate max num run based on
556
+ // max_run_size, size_ratio and write buffer size:
557
+ // Assume the size of the lowest level size is equal to
558
+ // write_buffer_size. Each subsequent level is the max size without
559
+ // triggering size_ratio compaction. `max_num_runs` is the minimum
560
+ // number of levels required such that the target size of the
561
+ // largest level is at least `max_run_size_`.
562
+ max_num_runs = 1;
563
+ double cur_level_max_size =
564
+ static_cast<double>(mutable_cf_options_.write_buffer_size);
565
+ double total_run_size = 0;
566
+ while (cur_level_max_size < static_cast<double>(max_run_size_)) {
567
+ // This loop should not take too many iterations since
568
+ // cur_level_max_size at least doubles each iteration.
569
+ total_run_size += cur_level_max_size;
570
+ cur_level_max_size = (100.0 + ratio) / 100.0 * total_run_size;
571
+ ++max_num_runs;
572
+ }
573
+ } else {
574
+ // TODO: implement the auto-tune logic for this stop style
575
+ max_num_runs = file_num_compaction_trigger;
576
+ }
577
+ } else {
578
+ // max_num_runs > 0, it's the limit on the number of sorted run
579
+ }
537
580
  // Get the total number of sorted runs that are not being compacted
538
581
  int num_sr_not_compacted = 0;
539
582
  for (size_t i = 0; i < sorted_runs_.size(); i++) {
@@ -544,17 +587,25 @@ Compaction* UniversalCompactionBuilder::PickCompaction() {
544
587
 
545
588
  // The number of sorted runs that are not being compacted is greater
546
589
  // than the maximum allowed number of sorted runs
547
- if (num_sr_not_compacted >
548
- mutable_cf_options_.level0_file_num_compaction_trigger) {
549
- unsigned int num_files =
550
- num_sr_not_compacted -
551
- mutable_cf_options_.level0_file_num_compaction_trigger + 1;
590
+ if (num_sr_not_compacted > max_num_runs) {
591
+ unsigned int num_files = num_sr_not_compacted - max_num_runs + 1;
552
592
  if ((c = PickCompactionToReduceSortedRuns(UINT_MAX, num_files)) !=
553
593
  nullptr) {
554
594
  ROCKS_LOG_BUFFER(log_buffer_,
555
- "[%s] Universal: compacting for file num -- %u\n",
556
- cf_name_.c_str(), num_files);
595
+ "[%s] Universal: compacting for file num, to "
596
+ "compact file num -- %u, max num runs allowed"
597
+ "-- %d, max_run_size -- %" PRIu64 "\n",
598
+ cf_name_.c_str(), num_files, max_num_runs,
599
+ max_run_size_);
557
600
  }
601
+ } else {
602
+ ROCKS_LOG_BUFFER(
603
+ log_buffer_,
604
+ "[%s] Universal: skipping compaction for file num, num runs not "
605
+ "being compacted -- %u, max num runs allowed -- %d, max_run_size "
606
+ "-- %" PRIu64 "\n",
607
+ cf_name_.c_str(), num_sr_not_compacted, max_num_runs,
608
+ max_run_size_);
558
609
  }
559
610
  }
560
611
  }
@@ -275,6 +275,8 @@ Status CompactionServiceCompactionJob::Run() {
275
275
  log_buffer_->FlushBufferToLog();
276
276
  LogCompaction();
277
277
  const uint64_t start_micros = db_options_.clock->NowMicros();
278
+ c->GetOrInitInputTableProperties();
279
+
278
280
  // Pick the only sub-compaction we should have
279
281
  assert(compact_->sub_compact_states.size() == 1);
280
282
  SubcompactionState* sub_compact = compact_->sub_compact_states.data();
@@ -13,6 +13,7 @@
13
13
  #include "rocksdb/iostats_context.h"
14
14
  #include "rocksdb/listener.h"
15
15
  #include "rocksdb/utilities/debug.h"
16
+ #include "rocksdb/utilities/table_properties_collectors.h"
16
17
  #include "test_util/mock_time_env.h"
17
18
  #include "utilities/merge_operators.h"
18
19
 
@@ -1734,6 +1735,82 @@ TEST_P(TimedPutPrecludeLastLevelTest, PreserveTimedPutOnPenultimateLevel) {
1734
1735
  Close();
1735
1736
  }
1736
1737
 
1738
+ TEST_P(TimedPutPrecludeLastLevelTest, AutoTriggerCompaction) {
1739
+ const int kNumTrigger = 10;
1740
+ const int kNumLevels = 7;
1741
+ const int kNumKeys = 200;
1742
+
1743
+ Options options = CurrentOptions();
1744
+ options.compaction_style = kCompactionStyleUniversal;
1745
+ options.preclude_last_level_data_seconds = 60;
1746
+ options.preserve_internal_time_seconds = 0;
1747
+ options.env = mock_env_.get();
1748
+ options.level0_file_num_compaction_trigger = kNumTrigger;
1749
+ options.num_levels = kNumLevels;
1750
+ options.last_level_temperature = Temperature::kCold;
1751
+ ConfigOptions config_options;
1752
+ config_options.ignore_unsupported_options = false;
1753
+ std::shared_ptr<TablePropertiesCollectorFactory> factory;
1754
+ std::string id = CompactForTieringCollectorFactory::kClassName();
1755
+ ASSERT_OK(TablePropertiesCollectorFactory::CreateFromString(
1756
+ config_options, "compaction_trigger_ratio=0.4; id=" + id, &factory));
1757
+ auto collector_factory =
1758
+ factory->CheckedCast<CompactForTieringCollectorFactory>();
1759
+ options.table_properties_collector_factories.push_back(factory);
1760
+ DestroyAndReopen(options);
1761
+ WriteOptions wo;
1762
+ wo.protection_bytes_per_key = GetParam();
1763
+
1764
+ Random rnd(301);
1765
+
1766
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
1767
+ mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(10) + 1));
1768
+ });
1769
+
1770
+ for (int i = 0; i < kNumKeys / 4; i++) {
1771
+ ASSERT_OK(Put(Key(i), rnd.RandomString(100), wo));
1772
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
1773
+ mock_clock_->MockSleepForSeconds(static_cast<int>(rnd.Uniform(2)));
1774
+ });
1775
+ }
1776
+ // Create one file with regular Put.
1777
+ ASSERT_OK(Flush());
1778
+
1779
+ // Create one file with TimedPut.
1780
+ // These data are eligible to be put on the last level once written to db
1781
+ // and compaction will fast track them to the last level.
1782
+ for (int i = kNumKeys / 4; i < kNumKeys / 2; i++) {
1783
+ ASSERT_OK(TimedPut(0, Key(i), rnd.RandomString(100), 50, wo));
1784
+ }
1785
+ ASSERT_OK(Flush());
1786
+
1787
+ // TimedPut file moved to the last level via auto triggered compaction.
1788
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1789
+ ASSERT_EQ("1,0,0,0,0,0,1", FilesPerLevel());
1790
+ ASSERT_GT(GetSstSizeHelper(Temperature::kUnknown), 0);
1791
+ ASSERT_GT(GetSstSizeHelper(Temperature::kCold), 0);
1792
+
1793
+ collector_factory->SetCompactionTriggerRatio(1.1);
1794
+ for (int i = kNumKeys / 2; i < kNumKeys * 3 / 4; i++) {
1795
+ ASSERT_OK(TimedPut(0, Key(i), rnd.RandomString(100), 50, wo));
1796
+ }
1797
+ ASSERT_OK(Flush());
1798
+
1799
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1800
+ ASSERT_EQ("2,0,0,0,0,0,1", FilesPerLevel());
1801
+
1802
+ collector_factory->SetCompactionTriggerRatio(0);
1803
+ for (int i = kNumKeys * 3 / 4; i < kNumKeys; i++) {
1804
+ ASSERT_OK(TimedPut(0, Key(i), rnd.RandomString(100), 50, wo));
1805
+ }
1806
+ ASSERT_OK(Flush());
1807
+
1808
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1809
+ ASSERT_EQ("3,0,0,0,0,0,1", FilesPerLevel());
1810
+
1811
+ Close();
1812
+ }
1813
+
1737
1814
  INSTANTIATE_TEST_CASE_P(TimedPutPrecludeLastLevelTest,
1738
1815
  TimedPutPrecludeLastLevelTest, ::testing::Values(0, 8));
1739
1816
 
@@ -71,6 +71,9 @@ Status VerifySstFileChecksumInternal(const Options& options,
71
71
  } else {
72
72
  return s;
73
73
  }
74
+ if (!s.ok()) {
75
+ return s;
76
+ }
74
77
  std::unique_ptr<TableReader> table_reader;
75
78
  std::unique_ptr<RandomAccessFileReader> file_reader(
76
79
  new RandomAccessFileReader(