@nxtedition/rocksdb 10.1.5 → 10.2.0

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 (255) hide show
  1. package/binding.cc +19 -11
  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/package.json +1 -1
  217. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  218. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  219. package/.tap/test-results/node_modules/abstract-level/test/chained-batch-test.js.tap +0 -0
  220. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  221. package/.tap/test-results/test/abstract-level-test.js.tap +0 -1077
  222. package/.tap/test-results/test/batch-test.js.tap +0 -12
  223. package/.tap/test-results/test/chained-batch-gc-test.js.tap +0 -11
  224. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +0 -135
  225. package/.tap/test-results/test/clear-gc-test.js.tap +0 -13
  226. package/.tap/test-results/test/column-test.js.tap +0 -55
  227. package/.tap/test-results/test/common.js.tap +0 -0
  228. package/.tap/test-results/test/compression-test.js.tap +0 -30
  229. package/.tap/test-results/test/db-identity.js.tap +0 -12
  230. package/.tap/test-results/test/electron.js.tap +0 -0
  231. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +0 -40
  232. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  233. package/.tap/test-results/test/gc.js.tap +0 -0
  234. package/.tap/test-results/test/getproperty-test.js.tap +0 -29
  235. package/.tap/test-results/test/iterator-gc-test.js.tap +0 -15
  236. package/.tap/test-results/test/iterator-hwm-test.js.tap +0 -131
  237. package/.tap/test-results/test/iterator-recursion-test.js.tap +0 -12
  238. package/.tap/test-results/test/iterator-starvation-test.js.tap +0 -73
  239. package/.tap/test-results/test/iterator-test.js.tap +0 -6
  240. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  241. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  242. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  243. package/.tap/test-results/test/lock-test.js.tap +0 -18
  244. package/.tap/test-results/test/lock.js.tap +0 -0
  245. package/.tap/test-results/test/make.js.tap +0 -0
  246. package/.tap/test-results/test/max-rev-merge.js.tap +0 -0
  247. package/.tap/test-results/test/merge-operator-test.js.tap +0 -12
  248. package/.tap/test-results/test/mkdir-test.js.tap +0 -15
  249. package/.tap/test-results/test/segfault-test.js.tap +0 -76
  250. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  251. package/deps/rocksdb/rocksdb/README.md +0 -29
  252. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  253. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  254. package/deps/rocksdb/rocksdb/port/README +0 -10
  255. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
@@ -301,7 +301,10 @@ Status DBImpl::NewDB(std::vector<std::string>* new_filenames) {
301
301
  }
302
302
  if (immutable_db_options_.write_dbid_to_manifest) {
303
303
  std::string temp_db_id;
304
- GetDbIdentityFromIdentityFile(&temp_db_id);
304
+ s = GetDbIdentityFromIdentityFile(&temp_db_id);
305
+ if (!s.ok()) {
306
+ return s;
307
+ }
305
308
  new_db.SetDBId(temp_db_id);
306
309
  }
307
310
  new_db.SetLogNumber(0);
@@ -637,7 +640,7 @@ Status DBImpl::Recover(
637
640
  f->fd.smallest_seqno, f->fd.largest_seqno,
638
641
  f->marked_for_compaction,
639
642
  f->temperature, // this can be different from
640
- // `last_level_temperature`
643
+ // `last_level_temperature`
641
644
  f->oldest_blob_file_number, f->oldest_ancester_time,
642
645
  f->file_creation_time, f->epoch_number,
643
646
  f->file_checksum, f->file_checksum_func_name,
@@ -1670,6 +1673,8 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
1670
1673
  SequenceNumber earliest_write_conflict_snapshot;
1671
1674
  std::vector<SequenceNumber> snapshot_seqs =
1672
1675
  snapshots_.GetAll(&earliest_write_conflict_snapshot);
1676
+ SequenceNumber earliest_snapshot =
1677
+ (snapshot_seqs.empty() ? kMaxSequenceNumber : snapshot_seqs.at(0));
1673
1678
  auto snapshot_checker = snapshot_checker_.get();
1674
1679
  if (use_custom_gc_ && snapshot_checker == nullptr) {
1675
1680
  snapshot_checker = DisableGCSnapshotChecker::Instance();
@@ -1689,6 +1694,7 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
1689
1694
  IOStatus io_s;
1690
1695
  const ReadOptions read_option(Env::IOActivity::kDBOpen);
1691
1696
  const WriteOptions write_option(Env::IO_HIGH, Env::IOActivity::kDBOpen);
1697
+
1692
1698
  TableBuilderOptions tboptions(
1693
1699
  *cfd->ioptions(), mutable_cf_options, read_option, write_option,
1694
1700
  cfd->internal_comparator(), cfd->internal_tbl_prop_coll_factories(),
@@ -1697,21 +1703,22 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
1697
1703
  0 /* level */, false /* is_bottommost */,
1698
1704
  TableFileCreationReason::kRecovery, 0 /* oldest_key_time */,
1699
1705
  0 /* file_creation_time */, db_id_, db_session_id_,
1700
- 0 /* target_file_size */, meta.fd.GetNumber());
1706
+ 0 /* target_file_size */, meta.fd.GetNumber(), kMaxSequenceNumber);
1701
1707
  Version* version = cfd->current();
1702
1708
  version->Ref();
1703
1709
  uint64_t num_input_entries = 0;
1704
- s = BuildTable(
1705
- dbname_, versions_.get(), immutable_db_options_, tboptions,
1706
- file_options_for_compaction_, cfd->table_cache(), iter.get(),
1707
- std::move(range_del_iters), &meta, &blob_file_additions,
1708
- snapshot_seqs, earliest_write_conflict_snapshot, kMaxSequenceNumber,
1709
- snapshot_checker, paranoid_file_checks, cfd->internal_stats(), &io_s,
1710
- io_tracer_, BlobFileCreationReason::kRecovery,
1711
- nullptr /* seqno_to_time_mapping */, &event_logger_, job_id,
1712
- nullptr /* table_properties */, write_hint,
1713
- nullptr /*full_history_ts_low*/, &blob_callback_, version,
1714
- &num_input_entries);
1710
+ s = BuildTable(dbname_, versions_.get(), immutable_db_options_, tboptions,
1711
+ file_options_for_compaction_, cfd->table_cache(),
1712
+ iter.get(), std::move(range_del_iters), &meta,
1713
+ &blob_file_additions, snapshot_seqs, earliest_snapshot,
1714
+ earliest_write_conflict_snapshot, kMaxSequenceNumber,
1715
+ snapshot_checker, paranoid_file_checks,
1716
+ cfd->internal_stats(), &io_s, io_tracer_,
1717
+ BlobFileCreationReason::kRecovery,
1718
+ nullptr /* seqno_to_time_mapping */, &event_logger_,
1719
+ job_id, nullptr /* table_properties */, write_hint,
1720
+ nullptr /*full_history_ts_low*/, &blob_callback_, version,
1721
+ &num_input_entries);
1715
1722
  version->Unref();
1716
1723
  LogFlush(immutable_db_options_.info_log);
1717
1724
  ROCKS_LOG_DEBUG(immutable_db_options_.info_log,
@@ -155,21 +155,36 @@ Status DBImpl::Write(const WriteOptions& write_options, WriteBatch* my_batch) {
155
155
  }
156
156
  if (s.ok()) {
157
157
  s = WriteImpl(write_options, my_batch, /*callback=*/nullptr,
158
+ /*user_write_cb=*/nullptr,
158
159
  /*log_used=*/nullptr);
159
160
  }
160
161
  return s;
161
162
  }
162
163
 
164
+ Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
165
+ WriteBatch* my_batch, WriteCallback* callback,
166
+ UserWriteCallback* user_write_cb) {
167
+ Status s;
168
+ if (write_options.protection_bytes_per_key > 0) {
169
+ s = WriteBatchInternal::UpdateProtectionInfo(
170
+ my_batch, write_options.protection_bytes_per_key);
171
+ }
172
+ if (s.ok()) {
173
+ s = WriteImpl(write_options, my_batch, callback, user_write_cb);
174
+ }
175
+ return s;
176
+ }
177
+
163
178
  Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
164
179
  WriteBatch* my_batch,
165
- WriteCallback* callback) {
180
+ UserWriteCallback* user_write_cb) {
166
181
  Status s;
167
182
  if (write_options.protection_bytes_per_key > 0) {
168
183
  s = WriteBatchInternal::UpdateProtectionInfo(
169
184
  my_batch, write_options.protection_bytes_per_key);
170
185
  }
171
186
  if (s.ok()) {
172
- s = WriteImpl(write_options, my_batch, callback, nullptr);
187
+ s = WriteImpl(write_options, my_batch, /*callback=*/nullptr, user_write_cb);
173
188
  }
174
189
  return s;
175
190
  }
@@ -179,9 +194,9 @@ Status DBImpl::WriteWithCallback(const WriteOptions& write_options,
179
194
  // published sequence.
180
195
  Status DBImpl::WriteImpl(const WriteOptions& write_options,
181
196
  WriteBatch* my_batch, WriteCallback* callback,
182
- uint64_t* log_used, uint64_t log_ref,
183
- bool disable_memtable, uint64_t* seq_used,
184
- size_t batch_cnt,
197
+ UserWriteCallback* user_write_cb, uint64_t* log_used,
198
+ uint64_t log_ref, bool disable_memtable,
199
+ uint64_t* seq_used, size_t batch_cnt,
185
200
  PreReleaseCallback* pre_release_callback,
186
201
  PostMemTableCallback* post_memtable_callback) {
187
202
  assert(!seq_per_batch_ || batch_cnt != 0);
@@ -268,6 +283,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
268
283
  return Status::NotSupported(
269
284
  "seq_per_batch currently does not honor post_memtable_callback");
270
285
  }
286
+ if (my_batch->HasDeleteRange() && immutable_db_options_.row_cache) {
287
+ return Status::NotSupported(
288
+ "DeleteRange is not compatible with row cache.");
289
+ }
271
290
  // Otherwise IsLatestPersistentState optimization does not make sense
272
291
  assert(!WriteBatchInternal::IsLatestPersistentState(my_batch) ||
273
292
  disable_memtable);
@@ -284,10 +303,10 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
284
303
  seq_per_batch_ ? kDoAssignOrder : kDontAssignOrder;
285
304
  // Otherwise it is WAL-only Prepare batches in WriteCommitted policy and
286
305
  // they don't consume sequence.
287
- return WriteImplWALOnly(&nonmem_write_thread_, write_options, my_batch,
288
- callback, log_used, log_ref, seq_used, batch_cnt,
289
- pre_release_callback, assign_order,
290
- kDontPublishLastSeq, disable_memtable);
306
+ return WriteImplWALOnly(
307
+ &nonmem_write_thread_, write_options, my_batch, callback, user_write_cb,
308
+ log_used, log_ref, seq_used, batch_cnt, pre_release_callback,
309
+ assign_order, kDontPublishLastSeq, disable_memtable);
291
310
  }
292
311
 
293
312
  if (immutable_db_options_.unordered_write) {
@@ -299,9 +318,9 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
299
318
  // Use a write thread to i) optimize for WAL write, ii) publish last
300
319
  // sequence in in increasing order, iii) call pre_release_callback serially
301
320
  Status status = WriteImplWALOnly(
302
- &write_thread_, write_options, my_batch, callback, log_used, log_ref,
303
- &seq, sub_batch_cnt, pre_release_callback, kDoAssignOrder,
304
- kDoPublishLastSeq, disable_memtable);
321
+ &write_thread_, write_options, my_batch, callback, user_write_cb,
322
+ log_used, log_ref, &seq, sub_batch_cnt, pre_release_callback,
323
+ kDoAssignOrder, kDoPublishLastSeq, disable_memtable);
305
324
  TEST_SYNC_POINT("DBImpl::WriteImpl:UnorderedWriteAfterWriteWAL");
306
325
  if (!status.ok()) {
307
326
  return status;
@@ -318,17 +337,20 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
318
337
  }
319
338
 
320
339
  if (immutable_db_options_.enable_pipelined_write) {
321
- return PipelinedWriteImpl(write_options, my_batch, callback, log_used,
322
- log_ref, disable_memtable, seq_used);
340
+ return PipelinedWriteImpl(write_options, my_batch, callback, user_write_cb,
341
+ log_used, log_ref, disable_memtable, seq_used);
323
342
  }
324
343
 
325
344
  PERF_TIMER_GUARD(write_pre_and_post_process_time);
326
- WriteThread::Writer w(write_options, my_batch, callback, log_ref,
327
- disable_memtable, batch_cnt, pre_release_callback,
328
- post_memtable_callback);
345
+ WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
346
+ log_ref, disable_memtable, batch_cnt,
347
+ pre_release_callback, post_memtable_callback);
329
348
  StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
330
349
 
331
350
  write_thread_.JoinBatchGroup(&w);
351
+ if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_CALLER) {
352
+ write_thread_.SetMemWritersEachStride(&w);
353
+ }
332
354
  if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_WRITER) {
333
355
  // we are a non-leader in a parallel group
334
356
 
@@ -534,6 +556,35 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
534
556
  const SequenceNumber current_sequence = last_sequence + 1;
535
557
  last_sequence += seq_inc;
536
558
 
559
+ if (log_context.need_log_sync) {
560
+ VersionEdit synced_wals;
561
+ log_write_mutex_.Lock();
562
+ if (status.ok()) {
563
+ MarkLogsSynced(logfile_number_, log_context.need_log_dir_sync,
564
+ &synced_wals);
565
+ } else {
566
+ MarkLogsNotSynced(logfile_number_);
567
+ }
568
+ log_write_mutex_.Unlock();
569
+ if (status.ok() && synced_wals.IsWalAddition()) {
570
+ InstrumentedMutexLock l(&mutex_);
571
+ // TODO: plumb Env::IOActivity, Env::IOPriority
572
+ const ReadOptions read_options;
573
+ status = ApplyWALToManifest(read_options, write_options, &synced_wals);
574
+ }
575
+
576
+ // Requesting sync with two_write_queues_ is expected to be very rare. We
577
+ // hence provide a simple implementation that is not necessarily
578
+ // efficient.
579
+ if (status.ok() && two_write_queues_) {
580
+ if (manual_wal_flush_) {
581
+ status = FlushWAL(true);
582
+ } else {
583
+ status = SyncWAL();
584
+ }
585
+ }
586
+ }
587
+
537
588
  // PreReleaseCallback is called after WAL write and before memtable write
538
589
  if (status.ok()) {
539
590
  SequenceNumber next_sequence = current_sequence;
@@ -617,34 +668,6 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
617
668
  assert(pre_release_cb_status.ok());
618
669
  }
619
670
 
620
- if (log_context.need_log_sync) {
621
- VersionEdit synced_wals;
622
- log_write_mutex_.Lock();
623
- if (status.ok()) {
624
- MarkLogsSynced(logfile_number_, log_context.need_log_dir_sync,
625
- &synced_wals);
626
- } else {
627
- MarkLogsNotSynced(logfile_number_);
628
- }
629
- log_write_mutex_.Unlock();
630
- if (status.ok() && synced_wals.IsWalAddition()) {
631
- InstrumentedMutexLock l(&mutex_);
632
- // TODO: plumb Env::IOActivity, Env::IOPriority
633
- const ReadOptions read_options;
634
- status = ApplyWALToManifest(read_options, write_options, &synced_wals);
635
- }
636
-
637
- // Requesting sync with two_write_queues_ is expected to be very rare. We
638
- // hence provide a simple implementation that is not necessarily efficient.
639
- if (two_write_queues_) {
640
- if (manual_wal_flush_) {
641
- status = FlushWAL(true);
642
- } else {
643
- status = SyncWAL();
644
- }
645
- }
646
- }
647
-
648
671
  bool should_exit_batch_group = true;
649
672
  if (in_parallel_group) {
650
673
  // CompleteParallelWorker returns true if this thread should
@@ -679,6 +702,7 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
679
702
 
680
703
  Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
681
704
  WriteBatch* my_batch, WriteCallback* callback,
705
+ UserWriteCallback* user_write_cb,
682
706
  uint64_t* log_used, uint64_t log_ref,
683
707
  bool disable_memtable, uint64_t* seq_used) {
684
708
  PERF_TIMER_GUARD(write_pre_and_post_process_time);
@@ -686,8 +710,8 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
686
710
 
687
711
  WriteContext write_context;
688
712
 
689
- WriteThread::Writer w(write_options, my_batch, callback, log_ref,
690
- disable_memtable, /*_batch_cnt=*/0,
713
+ WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
714
+ log_ref, disable_memtable, /*_batch_cnt=*/0,
691
715
  /*_pre_release_callback=*/nullptr);
692
716
  write_thread_.JoinBatchGroup(&w);
693
717
  TEST_SYNC_POINT("DBImplWrite::PipelinedWriteImpl:AfterJoinBatchGroup");
@@ -826,7 +850,9 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
826
850
  // so we need to set its status to pass ASSERT_STATUS_CHECKED
827
851
  memtable_write_group.status.PermitUncheckedError();
828
852
  }
829
-
853
+ if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_CALLER) {
854
+ write_thread_.SetMemWritersEachStride(&w);
855
+ }
830
856
  if (w.state == WriteThread::STATE_PARALLEL_MEMTABLE_WRITER) {
831
857
  PERF_TIMER_STOP(write_pre_and_post_process_time);
832
858
  PERF_TIMER_FOR_WAIT_GUARD(write_memtable_time);
@@ -866,7 +892,8 @@ Status DBImpl::UnorderedWriteMemtable(const WriteOptions& write_options,
866
892
  PERF_TIMER_GUARD(write_pre_and_post_process_time);
867
893
  StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
868
894
 
869
- WriteThread::Writer w(write_options, my_batch, callback, log_ref,
895
+ WriteThread::Writer w(write_options, my_batch, callback,
896
+ /*user_write_cb=*/nullptr, log_ref,
870
897
  false /*disable_memtable*/);
871
898
 
872
899
  if (w.CheckCallback(this) && w.ShouldWriteToMemtable()) {
@@ -916,13 +943,15 @@ Status DBImpl::UnorderedWriteMemtable(const WriteOptions& write_options,
916
943
  // applicable in a two-queue setting.
917
944
  Status DBImpl::WriteImplWALOnly(
918
945
  WriteThread* write_thread, const WriteOptions& write_options,
919
- WriteBatch* my_batch, WriteCallback* callback, uint64_t* log_used,
946
+ WriteBatch* my_batch, WriteCallback* callback,
947
+ UserWriteCallback* user_write_cb, uint64_t* log_used,
920
948
  const uint64_t log_ref, uint64_t* seq_used, const size_t sub_batch_cnt,
921
949
  PreReleaseCallback* pre_release_callback, const AssignOrder assign_order,
922
950
  const PublishLastSeq publish_last_seq, const bool disable_memtable) {
923
951
  PERF_TIMER_GUARD(write_pre_and_post_process_time);
924
- WriteThread::Writer w(write_options, my_batch, callback, log_ref,
925
- disable_memtable, sub_batch_cnt, pre_release_callback);
952
+ WriteThread::Writer w(write_options, my_batch, callback, user_write_cb,
953
+ log_ref, disable_memtable, sub_batch_cnt,
954
+ pre_release_callback);
926
955
  StopWatch write_sw(immutable_db_options_.clock, stats_, DB_WRITE);
927
956
 
928
957
  write_thread->JoinBatchGroup(&w);
@@ -1176,8 +1205,7 @@ void DBImpl::MemTableInsertStatusCheck(const Status& status) {
1176
1205
  mutex_.Lock();
1177
1206
  assert(!error_handler_.IsBGWorkStopped());
1178
1207
  // Maybe change the return status to void?
1179
- error_handler_.SetBGError(status, BackgroundErrorReason::kMemTable)
1180
- .PermitUncheckedError();
1208
+ error_handler_.SetBGError(status, BackgroundErrorReason::kMemTable);
1181
1209
  mutex_.Unlock();
1182
1210
  }
1183
1211
  }
@@ -1489,6 +1517,11 @@ IOStatus DBImpl::WriteToWAL(const WriteThread::WriteGroup& write_group,
1489
1517
  RecordTick(stats_, WAL_FILE_BYTES, log_size);
1490
1518
  stats->AddDBStats(InternalStats::kIntStatsWriteWithWal, write_with_wal);
1491
1519
  RecordTick(stats_, WRITE_WITH_WAL, write_with_wal);
1520
+ for (auto* writer : write_group) {
1521
+ if (!writer->CallbackFailed()) {
1522
+ writer->CheckPostWalWriteCallback();
1523
+ }
1524
+ }
1492
1525
  }
1493
1526
  return io_s;
1494
1527
  }
@@ -1553,6 +1586,11 @@ IOStatus DBImpl::ConcurrentWriteToWAL(
1553
1586
  stats->AddDBStats(InternalStats::kIntStatsWriteWithWal, write_with_wal,
1554
1587
  concurrent);
1555
1588
  RecordTick(stats_, WRITE_WITH_WAL, write_with_wal);
1589
+ for (auto* writer : write_group) {
1590
+ if (!writer->CallbackFailed()) {
1591
+ writer->CheckPostWalWriteCallback();
1592
+ }
1593
+ }
1556
1594
  }
1557
1595
  return io_s;
1558
1596
  }
@@ -2201,6 +2239,11 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
2201
2239
  memtable_info.earliest_seqno = cfd->mem()->GetEarliestSequenceNumber();
2202
2240
  memtable_info.num_entries = cfd->mem()->num_entries();
2203
2241
  memtable_info.num_deletes = cfd->mem()->num_deletes();
2242
+ if (!cfd->ioptions()->persist_user_defined_timestamps &&
2243
+ cfd->user_comparator()->timestamp_size() > 0) {
2244
+ const Slice& newest_udt = cfd->mem()->GetNewestUDT();
2245
+ memtable_info.newest_udt.assign(newest_udt.data(), newest_udt.size());
2246
+ }
2204
2247
  // Log this later after lock release. It may be outdated, e.g., if background
2205
2248
  // flush happens before logging, but that should be ok.
2206
2249
  int num_imm_unflushed = cfd->imm()->NumNotFlushed();
@@ -2220,14 +2263,15 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
2220
2263
  SequenceNumber seq = versions_->LastSequence();
2221
2264
  new_mem = cfd->ConstructNewMemtable(mutable_cf_options, seq);
2222
2265
  context->superversion_context.NewSuperVersion();
2266
+
2267
+ ROCKS_LOG_INFO(immutable_db_options_.info_log,
2268
+ "[%s] New memtable created with log file: #%" PRIu64
2269
+ ". Immutable memtables: %d.\n",
2270
+ cfd->GetName().c_str(), new_log_number, num_imm_unflushed);
2271
+ // There should be no concurrent write as the thread is at the front of
2272
+ // writer queue
2273
+ cfd->mem()->ConstructFragmentedRangeTombstones();
2223
2274
  }
2224
- ROCKS_LOG_INFO(immutable_db_options_.info_log,
2225
- "[%s] New memtable created with log file: #%" PRIu64
2226
- ". Immutable memtables: %d.\n",
2227
- cfd->GetName().c_str(), new_log_number, num_imm_unflushed);
2228
- // There should be no concurrent write as the thread is at the front of
2229
- // writer queue
2230
- cfd->mem()->ConstructFragmentedRangeTombstones();
2231
2275
 
2232
2276
  mutex_.Lock();
2233
2277
  if (recycle_log_number != 0) {
@@ -2319,8 +2363,8 @@ Status DBImpl::SwitchMemtable(ColumnFamilyData* cfd, WriteContext* context) {
2319
2363
  read_options, write_options, &wal_deletion, &mutex_,
2320
2364
  directories_.GetDbDir());
2321
2365
  if (!s.ok() && versions_->io_status().IsIOError()) {
2322
- s = error_handler_.SetBGError(versions_->io_status(),
2323
- BackgroundErrorReason::kManifestWrite);
2366
+ error_handler_.SetBGError(versions_->io_status(),
2367
+ BackgroundErrorReason::kManifestWrite);
2324
2368
  }
2325
2369
  if (!s.ok()) {
2326
2370
  return s;
@@ -192,6 +192,49 @@ TEST_F(DBPropertiesTest, GetAggregatedIntPropertyTest) {
192
192
  }
193
193
  }
194
194
 
195
+ TEST_F(DBPropertiesTest, AggregateBlockCacheProperty) {
196
+ constexpr size_t kCapacity = 1000;
197
+ LRUCacheOptions co;
198
+ co.capacity = kCapacity;
199
+ co.num_shard_bits = 0;
200
+ co.metadata_charge_policy = kDontChargeCacheMetadata;
201
+ auto block_cache = NewLRUCache(co);
202
+
203
+ // All columns families share the same block cache.
204
+ Options options = CurrentOptions();
205
+ BlockBasedTableOptions table_opt;
206
+ table_opt.no_block_cache = false;
207
+ table_opt.block_cache = block_cache;
208
+ options.table_factory.reset(NewBlockBasedTableFactory(table_opt));
209
+
210
+ CreateAndReopenWithCF({"one", "two", "three", "four"}, options);
211
+
212
+ // Insert unpinned block to the cache
213
+ constexpr size_t kSize1 = 100;
214
+ ASSERT_OK(block_cache->Insert("block1", nullptr /*value*/,
215
+ &kNoopCacheItemHelper, kSize1));
216
+ // Insert pinned block to the cache
217
+ constexpr size_t kSize2 = 200;
218
+ Cache::Handle* block2 = nullptr;
219
+ ASSERT_OK(block_cache->Insert("block2", nullptr /*value*/,
220
+ &kNoopCacheItemHelper, kSize2, &block2));
221
+
222
+ uint64_t value;
223
+ ASSERT_TRUE(db_->GetAggregatedIntProperty(DB::Properties::kBlockCacheCapacity,
224
+ &value));
225
+ ASSERT_EQ(value, kCapacity);
226
+
227
+ ASSERT_TRUE(
228
+ db_->GetAggregatedIntProperty(DB::Properties::kBlockCacheUsage, &value));
229
+ ASSERT_EQ(value, kSize1 + kSize2);
230
+
231
+ ASSERT_TRUE(db_->GetAggregatedIntProperty(
232
+ DB::Properties::kBlockCachePinnedUsage, &value));
233
+ ASSERT_EQ(value, kSize2);
234
+
235
+ block_cache->Release(block2);
236
+ }
237
+
195
238
  namespace {
196
239
  void VerifySimilar(uint64_t a, uint64_t b, double bias) {
197
240
  ASSERT_EQ(a == 0U, b == 0U);
@@ -1083,7 +1126,6 @@ TEST_F(DBPropertiesTest, EstimateCompressionRatio) {
1083
1126
  ASSERT_GT(CompressionRatioAtLevel(1), 10.0);
1084
1127
  }
1085
1128
 
1086
-
1087
1129
  class CountingUserTblPropCollector : public TablePropertiesCollector {
1088
1130
  public:
1089
1131
  const char* Name() const override { return "CountingUserTblPropCollector"; }
@@ -2366,7 +2408,6 @@ TEST_F(DBPropertiesTest, TableMetaIndexKeys) {
2366
2408
  } while (ChangeOptions());
2367
2409
  }
2368
2410
 
2369
-
2370
2411
  } // namespace ROCKSDB_NAMESPACE
2371
2412
 
2372
2413
  int main(int argc, char** argv) {
@@ -3820,6 +3820,10 @@ TEST_F(DBRangeDelTest, RowCache) {
3820
3820
  ASSERT_OK(wb.DeleteRange(Key(1), Key(5)));
3821
3821
  ASSERT_TRUE(db_->Write(WriteOptions(), &wb).IsNotSupported());
3822
3822
  ASSERT_EQ(Get(Key(3)), "val");
3823
+ // By default, memtable insertion failure will turn the DB to read-only mode.
3824
+ // The check for delete range should happen before that to fail early
3825
+ // and should not turn db into read-only mdoe.
3826
+ ASSERT_OK(Put(Key(5), "foo"));
3823
3827
  }
3824
3828
  } // namespace ROCKSDB_NAMESPACE
3825
3829
 
@@ -245,7 +245,13 @@ TEST_P(DBRateLimiterOnReadTest, VerifyChecksum) {
245
245
  // In DirectIO, where we support tail prefetching, during table open, we only
246
246
  // do 1 read instead of 4 as described above. Actual checksum verification
247
247
  // reads stay the same.
248
+ #ifdef OS_WIN
249
+ // No file system prefetch implemented for OS Win. During table open,
250
+ // we only do 1 read for BufferedIO.
251
+ int num_read_per_file = 4;
252
+ #else
248
253
  int num_read_per_file = (!use_direct_io_) ? 7 : 4;
254
+ #endif
249
255
  int expected = kNumFiles * num_read_per_file;
250
256
 
251
257
  ASSERT_EQ(expected, options_.rate_limiter->GetTotalRequests(Env::IO_USER));
@@ -5645,6 +5645,8 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
5645
5645
  ASSERT_EQ(
5646
5646
  dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
5647
5647
  false);
5648
+ ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
5649
+ -1);
5648
5650
 
5649
5651
  ASSERT_OK(dbfull()->SetOptions(
5650
5652
  {{"compaction_options_universal", "{size_ratio=7;}"}}));
@@ -5666,9 +5668,11 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
5666
5668
  ASSERT_EQ(
5667
5669
  dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
5668
5670
  false);
5671
+ ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
5672
+ -1);
5669
5673
 
5670
- ASSERT_OK(dbfull()->SetOptions(
5671
- {{"compaction_options_universal", "{min_merge_width=11;}"}}));
5674
+ ASSERT_OK(dbfull()->SetOptions({{"compaction_options_universal",
5675
+ "{min_merge_width=11;max_read_amp=0;}"}}));
5672
5676
  ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.size_ratio, 7u);
5673
5677
  ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.min_merge_width,
5674
5678
  11u);
@@ -5687,6 +5691,8 @@ TEST_F(DBTest, DynamicUniversalCompactionOptions) {
5687
5691
  ASSERT_EQ(
5688
5692
  dbfull()->GetOptions().compaction_options_universal.allow_trivial_move,
5689
5693
  false);
5694
+ ASSERT_EQ(dbfull()->GetOptions().compaction_options_universal.max_read_amp,
5695
+ 0);
5690
5696
  }
5691
5697
 
5692
5698
  TEST_F(DBTest, FileCreationRandomFailure) {
@@ -6347,6 +6353,8 @@ TEST_F(DBTest, PromoteL0) {
6347
6353
  Options options = CurrentOptions();
6348
6354
  options.disable_auto_compactions = true;
6349
6355
  options.write_buffer_size = 10 * 1024 * 1024;
6356
+ // Exercise what was a use-after-free (ASAN failure) under ~VersionSet()
6357
+ options.uncache_aggressiveness = 300;
6350
6358
  DestroyAndReopen(options);
6351
6359
 
6352
6360
  // non overlapping ranges
@@ -4154,7 +4154,7 @@ TEST_F(DBTest2, LiveFilesOmitObsoleteFiles) {
4154
4154
  TEST_SYNC_POINT("DBTest2::LiveFilesOmitObsoleteFiles:FlushTriggered");
4155
4155
 
4156
4156
  ASSERT_OK(db_->DisableFileDeletions());
4157
- VectorLogPtr log_files;
4157
+ VectorWalPtr log_files;
4158
4158
  ASSERT_OK(db_->GetSortedWalFiles(log_files));
4159
4159
  TEST_SYNC_POINT("DBTest2::LiveFilesOmitObsoleteFiles:LiveFilesCaptured");
4160
4160
  for (const auto& log_file : log_files) {
@@ -565,6 +565,11 @@ Options DBTestBase::GetOptions(
565
565
  options.unordered_write = false;
566
566
  break;
567
567
  }
568
+ case kBlockBasedTableWithBinarySearchWithFirstKeyIndex: {
569
+ table_options.index_type =
570
+ BlockBasedTableOptions::kBinarySearchWithFirstKey;
571
+ break;
572
+ }
568
573
 
569
574
  default:
570
575
  break;
@@ -276,16 +276,16 @@ class SpecialEnv : public EnvWrapper {
276
276
  SpecialEnv* env_;
277
277
  std::unique_ptr<WritableFile> base_;
278
278
  };
279
- class WalFile : public WritableFile {
279
+ class SpecialWalFile : public WritableFile {
280
280
  public:
281
- WalFile(SpecialEnv* env, std::unique_ptr<WritableFile>&& b)
281
+ SpecialWalFile(SpecialEnv* env, std::unique_ptr<WritableFile>&& b)
282
282
  : env_(env), base_(std::move(b)) {
283
283
  env_->num_open_wal_file_.fetch_add(1);
284
284
  }
285
- virtual ~WalFile() { env_->num_open_wal_file_.fetch_add(-1); }
285
+ virtual ~SpecialWalFile() { env_->num_open_wal_file_.fetch_add(-1); }
286
286
  Status Append(const Slice& data) override {
287
287
  #if !(defined NDEBUG) || !defined(OS_WIN)
288
- TEST_SYNC_POINT("SpecialEnv::WalFile::Append:1");
288
+ TEST_SYNC_POINT("SpecialEnv::SpecialWalFile::Append:1");
289
289
  #endif
290
290
  Status s;
291
291
  if (env_->log_write_error_.load(std::memory_order_acquire)) {
@@ -299,7 +299,7 @@ class SpecialEnv : public EnvWrapper {
299
299
  s = base_->Append(data);
300
300
  }
301
301
  #if !(defined NDEBUG) || !defined(OS_WIN)
302
- TEST_SYNC_POINT("SpecialEnv::WalFile::Append:2");
302
+ TEST_SYNC_POINT("SpecialEnv::SpecialWalFile::Append:2");
303
303
  #endif
304
304
  return s;
305
305
  }
@@ -419,7 +419,7 @@ class SpecialEnv : public EnvWrapper {
419
419
  } else if (strstr(f.c_str(), "MANIFEST") != nullptr) {
420
420
  r->reset(new ManifestFile(this, std::move(*r)));
421
421
  } else if (strstr(f.c_str(), "log") != nullptr) {
422
- r->reset(new WalFile(this, std::move(*r)));
422
+ r->reset(new SpecialWalFile(this, std::move(*r)));
423
423
  } else {
424
424
  r->reset(new OtherFile(this, std::move(*r)));
425
425
  }
@@ -1041,6 +1041,7 @@ class DBTestBase : public testing::Test {
1041
1041
  kPartitionedFilterWithNewTableReaderForCompactions,
1042
1042
  kUniversalSubcompactions,
1043
1043
  kUnorderedWrite,
1044
+ kBlockBasedTableWithBinarySearchWithFirstKeyIndex,
1044
1045
  // This must be the last line
1045
1046
  kEnd,
1046
1047
  };