@nxtedition/rocksdb 13.5.13 → 14.0.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 (232) hide show
  1. package/binding.cc +33 -2
  2. package/binding.gyp +2 -2
  3. package/chained-batch.js +9 -16
  4. package/deps/rocksdb/rocksdb/BUCK +18 -1
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +10 -3
  6. package/deps/rocksdb/rocksdb/Makefile +20 -9
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +90 -13
  8. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +88 -75
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.h +44 -36
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +184 -148
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +5 -11
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +116 -47
  13. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +3 -6
  15. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -1
  16. package/deps/rocksdb/rocksdb/db/builder.cc +4 -2
  17. package/deps/rocksdb/rocksdb/db/c.cc +207 -0
  18. package/deps/rocksdb/rocksdb/db/c_test.c +72 -0
  19. package/deps/rocksdb/rocksdb/db/column_family.cc +3 -2
  20. package/deps/rocksdb/rocksdb/db/column_family.h +5 -0
  21. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +51 -38
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +29 -12
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +5 -10
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +566 -366
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +131 -4
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +1 -0
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +4 -4
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +13 -14
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +12 -7
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -10
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +97 -76
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +11 -14
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +1 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +16 -3
  39. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +1 -0
  40. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +448 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +22 -20
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +4 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -5
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +7 -3
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/db_iter.cc +104 -0
  47. package/deps/rocksdb/rocksdb/db/db_iter.h +4 -11
  48. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +331 -58
  49. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +129 -0
  50. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -0
  51. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +40 -0
  52. package/deps/rocksdb/rocksdb/db/db_test2.cc +25 -15
  53. package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -24
  54. package/deps/rocksdb/rocksdb/db/db_test_util.h +29 -14
  55. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +69 -36
  56. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +0 -1
  57. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  58. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -4
  59. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +8 -1
  60. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +275 -79
  61. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +23 -5
  62. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +591 -175
  63. package/deps/rocksdb/rocksdb/db/flush_job.cc +3 -4
  64. package/deps/rocksdb/rocksdb/db/log_reader.cc +5 -2
  65. package/deps/rocksdb/rocksdb/db/memtable.cc +84 -35
  66. package/deps/rocksdb/rocksdb/db/memtable.h +39 -34
  67. package/deps/rocksdb/rocksdb/db/merge_helper.cc +1 -0
  68. package/deps/rocksdb/rocksdb/db/merge_operator.cc +1 -1
  69. package/deps/rocksdb/rocksdb/db/multi_scan.cc +11 -5
  70. package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -1
  71. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -1
  72. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +34 -14
  73. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +28 -5
  74. package/deps/rocksdb/rocksdb/db/version_set.cc +159 -14
  75. package/deps/rocksdb/rocksdb/db/version_set.h +2 -0
  76. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -1
  77. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +60 -0
  78. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +16 -1
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +75 -10
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.cc +28 -0
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +2 -0
  82. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -1
  83. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +50 -2
  84. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +57 -0
  85. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +0 -4
  86. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +266 -35
  87. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +5 -0
  88. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -6
  89. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +18 -2
  90. package/deps/rocksdb/rocksdb/env/env.cc +12 -0
  91. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -0
  92. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +2 -0
  93. package/deps/rocksdb/rocksdb/env/fs_posix.cc +9 -5
  94. package/deps/rocksdb/rocksdb/env/io_posix.cc +4 -2
  95. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +19 -0
  96. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +33 -31
  97. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +42 -9
  98. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +93 -0
  99. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +43 -49
  100. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +4 -3
  101. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +8 -6
  102. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +487 -0
  103. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +11 -12
  104. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +135 -1
  105. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +5 -0
  106. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +12 -0
  107. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -1
  108. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +8 -0
  109. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +12 -8
  110. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +3 -0
  111. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +19 -9
  112. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +219 -24
  113. package/deps/rocksdb/rocksdb/include/rocksdb/point_lock_bench_tool.h +14 -0
  114. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +2 -2
  115. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +1 -1
  116. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +7 -0
  117. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +16 -0
  118. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +16 -4
  119. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +13 -0
  120. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +4 -0
  121. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +0 -2
  122. package/deps/rocksdb/rocksdb/include/rocksdb/user_defined_index.h +45 -0
  123. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +1 -1
  124. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +1 -1
  125. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +6 -1
  126. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +21 -0
  127. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  128. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +3 -3
  129. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +77 -51
  130. package/deps/rocksdb/rocksdb/memtable/skiplist.h +10 -13
  131. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +16 -7
  132. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +9 -4
  133. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +2 -0
  134. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +6 -0
  135. package/deps/rocksdb/rocksdb/options/cf_options.cc +13 -1
  136. package/deps/rocksdb/rocksdb/options/cf_options.h +6 -2
  137. package/deps/rocksdb/rocksdb/options/options.cc +2 -0
  138. package/deps/rocksdb/rocksdb/options/options_helper.cc +9 -8
  139. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +9 -5
  140. package/deps/rocksdb/rocksdb/port/mmap.cc +1 -1
  141. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +51 -0
  142. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +4 -0
  143. package/deps/rocksdb/rocksdb/src.mk +8 -2
  144. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1125 -765
  145. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +35 -24
  146. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +29 -4
  147. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +732 -256
  148. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +225 -16
  149. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +102 -26
  150. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +1 -1
  151. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +2 -75
  152. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +433 -141
  153. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +2 -0
  154. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +17 -10
  155. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy_impl.h +20 -0
  156. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +112 -85
  157. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +191 -36
  158. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +2 -2
  159. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -1
  160. package/deps/rocksdb/rocksdb/table/block_based/user_defined_index_wrapper.h +108 -31
  161. package/deps/rocksdb/rocksdb/table/external_table.cc +7 -3
  162. package/deps/rocksdb/rocksdb/table/format.cc +6 -12
  163. package/deps/rocksdb/rocksdb/table/format.h +10 -0
  164. package/deps/rocksdb/rocksdb/table/internal_iterator.h +1 -1
  165. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +1 -1
  166. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +1 -1
  167. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +5 -0
  168. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -1
  169. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +118 -46
  170. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +9 -8
  171. package/deps/rocksdb/rocksdb/table/table_builder.h +5 -0
  172. package/deps/rocksdb/rocksdb/table/table_properties.cc +16 -0
  173. package/deps/rocksdb/rocksdb/table/table_test.cc +1540 -155
  174. package/deps/rocksdb/rocksdb/test_util/testutil.h +21 -5
  175. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +26 -5
  176. package/deps/rocksdb/rocksdb/tools/ldb.cc +1 -2
  177. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +2 -0
  178. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +9 -3
  179. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +133 -165
  180. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +173 -64
  181. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +69 -0
  182. package/deps/rocksdb/rocksdb/util/atomic.h +6 -0
  183. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.cc +29 -20
  184. package/deps/rocksdb/rocksdb/util/auto_tune_compressor.h +10 -6
  185. package/deps/rocksdb/rocksdb/util/bit_fields.h +338 -0
  186. package/deps/rocksdb/rocksdb/util/coding.h +3 -3
  187. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -2
  188. package/deps/rocksdb/rocksdb/util/compression.cc +777 -82
  189. package/deps/rocksdb/rocksdb/util/compression.h +5 -0
  190. package/deps/rocksdb/rocksdb/util/compression_test.cc +5 -3
  191. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +2 -2
  192. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +15 -14
  193. package/deps/rocksdb/rocksdb/util/interval_test.cc +102 -0
  194. package/deps/rocksdb/rocksdb/util/semaphore.h +164 -0
  195. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +10 -6
  196. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +4 -2
  197. package/deps/rocksdb/rocksdb/util/slice_test.cc +136 -0
  198. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  199. package/deps/rocksdb/rocksdb/util/string_util.cc +2 -16
  200. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +1 -1
  201. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -1
  202. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +7 -4
  203. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +35 -14
  204. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +2 -0
  205. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +5 -2
  206. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/any_lock_manager_test.h +244 -0
  207. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench.cc +18 -0
  208. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_bench_tool.cc +159 -0
  209. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +1244 -161
  210. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +66 -12
  211. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_stress_test.cc +103 -0
  212. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +1275 -8
  213. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +40 -262
  214. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test_common.h +78 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_validation_test_runner.h +469 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +2 -6
  217. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +4 -0
  218. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +9 -1
  219. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +18 -9
  220. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +2 -0
  221. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +2 -1
  222. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +72 -44
  223. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +92 -15
  224. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +6 -20
  225. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +143 -112
  226. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +23 -16
  227. package/index.js +3 -3
  228. package/package.json +1 -1
  229. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  230. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  231. package/util.h +38 -12
  232. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.cc +0 -17
package/binding.cc CHANGED
@@ -1797,6 +1797,36 @@ NAPI_METHOD(batch_clear) {
1797
1797
  }
1798
1798
 
1799
1799
  NAPI_METHOD(batch_write) {
1800
+ NAPI_ARGV(4);
1801
+
1802
+ Database* database;
1803
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1804
+
1805
+ rocksdb::WriteBatch* batch;
1806
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[1], reinterpret_cast<void**>(&batch)));
1807
+
1808
+ bool sync = false;
1809
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "sync", sync));
1810
+
1811
+ bool lowPriority = false;
1812
+ NAPI_STATUS_THROWS(GetProperty(env, argv[2], "lowPriority", lowPriority));
1813
+
1814
+ auto callback = argv[3];
1815
+
1816
+ runAsync<std::nullptr_t>(
1817
+ "leveldown.batch_write", env, callback,
1818
+ [=](auto& state) {
1819
+ rocksdb::WriteOptions writeOptions;
1820
+ writeOptions.sync = sync;
1821
+ writeOptions.low_pri = lowPriority;
1822
+ return database->db->Write(writeOptions, batch);
1823
+ },
1824
+ [](auto& state, auto env, auto& argv) { return napi_ok; });
1825
+
1826
+ return 0;
1827
+ }
1828
+
1829
+ NAPI_METHOD(batch_write_sync) {
1800
1830
  NAPI_ARGV(3);
1801
1831
 
1802
1832
  Database* database;
@@ -2224,6 +2254,8 @@ NAPI_INIT() {
2224
2254
  NAPI_EXPORT_FUNCTION(db_get_property);
2225
2255
  NAPI_EXPORT_FUNCTION(db_get_latest_sequence);
2226
2256
  NAPI_EXPORT_FUNCTION(db_query);
2257
+ NAPI_EXPORT_FUNCTION(db_open_for_read_only);
2258
+ NAPI_EXPORT_FUNCTION(db_compact_range);
2227
2259
 
2228
2260
  NAPI_EXPORT_FUNCTION(iterator_init);
2229
2261
  NAPI_EXPORT_FUNCTION(iterator_seek);
@@ -2241,9 +2273,8 @@ NAPI_INIT() {
2241
2273
  NAPI_EXPORT_FUNCTION(batch_del);
2242
2274
  NAPI_EXPORT_FUNCTION(batch_clear);
2243
2275
  NAPI_EXPORT_FUNCTION(batch_write);
2276
+ NAPI_EXPORT_FUNCTION(batch_write_sync);
2244
2277
  NAPI_EXPORT_FUNCTION(batch_merge);
2245
2278
  NAPI_EXPORT_FUNCTION(batch_count);
2246
2279
  NAPI_EXPORT_FUNCTION(batch_iterate);
2247
- NAPI_EXPORT_FUNCTION(db_open_for_read_only);
2248
- NAPI_EXPORT_FUNCTION(db_compact_range);
2249
2280
  }
package/binding.gyp CHANGED
@@ -16,8 +16,8 @@
16
16
  "/usr/lib/x86_64-linux-gnu/include",
17
17
  "/usr/lib/include",
18
18
  ],
19
- "cflags": ["-march=znver1"],
20
- "ccflags": ["-flto", '-march=znver1'],
19
+ "cflags": ["-march=znver3", "-mtune=znver3"],
20
+ "ccflags": ["-flto", '-std=c++20', "-march=znver3", "-mtune=znver3"],
21
21
  "cflags!": ["-fno-exceptions"],
22
22
  "cflags_cc!": ["-fno-exceptions"],
23
23
  "ldflags": ["-flto", "-fuse-linker-plugin"],
package/chained-batch.js CHANGED
@@ -3,13 +3,10 @@
3
3
  const { AbstractChainedBatch } = require('abstract-level')
4
4
  const binding = require('./binding')
5
5
  const ModuleError = require('module-error')
6
- const { fromCallback } = require('catering')
7
6
  const assert = require('node:assert')
8
7
 
9
8
  const kBatchContext = Symbol('batchContext')
10
9
  const kDbContext = Symbol('dbContext')
11
- const kPromise = Symbol('promise')
12
-
13
10
  const EMPTY = {}
14
11
 
15
12
  class ChainedBatch extends AbstractChainedBatch {
@@ -78,28 +75,24 @@ class ChainedBatch extends AbstractChainedBatch {
78
75
  _write (options, callback) {
79
76
  assert(this[kBatchContext])
80
77
 
81
- callback = fromCallback(callback, kPromise)
82
-
83
- try {
84
- this._writeSync(options)
85
- process.nextTick(callback, null)
86
- } catch (err) {
87
- process.nextTick(callback, err)
88
- }
89
-
90
- return callback[kPromise]
78
+ binding.batch_write(this[kDbContext], this[kBatchContext], options ?? EMPTY, callback)
91
79
  }
92
80
 
93
81
  _writeSync (options) {
94
82
  assert(this[kBatchContext])
95
83
 
96
- binding.batch_write(this[kDbContext], this[kBatchContext], options ?? EMPTY)
84
+ binding.batch_write_sync(this[kDbContext], this[kBatchContext], options ?? EMPTY)
97
85
  }
98
86
 
99
87
  _close (callback) {
100
- this._closeSync()
88
+ assert(this[kBatchContext])
101
89
 
102
- process.nextTick(callback)
90
+ try {
91
+ this._closeSync()
92
+ process.nextTick(callback, null)
93
+ } catch (err) {
94
+ process.nextTick(callback, err)
95
+ }
103
96
  }
104
97
 
105
98
  _closeSync () {
@@ -114,6 +114,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
114
114
  "db/write_controller.cc",
115
115
  "db/write_stall_stats.cc",
116
116
  "db/write_thread.cc",
117
+ "db_stress_tool/db_stress_compression_manager.cc",
117
118
  "env/composite_env.cc",
118
119
  "env/env.cc",
119
120
  "env/env_chroot.cc",
@@ -418,16 +419,18 @@ cpp_library_wrapper(name="rocksdb_tools_lib", srcs=[
418
419
 
419
420
  cpp_library_wrapper(name="rocksdb_cache_bench_tools_lib", srcs=["cache/cache_bench_tool.cc"], deps=[":rocksdb_lib"], headers=[], link_whole=False, extra_test_libs=False)
420
421
 
422
+ cpp_library_wrapper(name="rocksdb_point_lock_bench_tools_lib", srcs=["utilities/transactions/lock/point/point_lock_bench_tool.cc"], deps=[":rocksdb_lib"], headers=[], link_whole=False, extra_test_libs=False)
423
+
421
424
  rocks_cpp_library_wrapper(name="rocksdb_stress_lib", srcs=[
422
425
  "db_stress_tool/batched_ops_stress.cc",
423
426
  "db_stress_tool/cf_consistency_stress.cc",
424
427
  "db_stress_tool/db_stress_common.cc",
428
+ "db_stress_tool/db_stress_compression_manager.cc",
425
429
  "db_stress_tool/db_stress_driver.cc",
426
430
  "db_stress_tool/db_stress_filters.cc",
427
431
  "db_stress_tool/db_stress_gflags.cc",
428
432
  "db_stress_tool/db_stress_listener.cc",
429
433
  "db_stress_tool/db_stress_shared_state.cc",
430
- "db_stress_tool/db_stress_stat.cc",
431
434
  "db_stress_tool/db_stress_test_base.cc",
432
435
  "db_stress_tool/db_stress_tool.cc",
433
436
  "db_stress_tool/db_stress_wide_merge_operator.cc",
@@ -449,6 +452,8 @@ cpp_binary_wrapper(name="db_bench", srcs=["tools/db_bench.cc"], deps=[":rocksdb_
449
452
 
450
453
  cpp_binary_wrapper(name="cache_bench", srcs=["cache/cache_bench.cc"], deps=[":rocksdb_cache_bench_tools_lib"], extra_preprocessor_flags=[], extra_bench_libs=False)
451
454
 
455
+ cpp_binary_wrapper(name="point_lock_bench", srcs=["utilities/transactions/lock/point/point_lock_bench.cc"], deps=[":rocksdb_point_lock_bench_tools_lib"], extra_preprocessor_flags=[], extra_bench_libs=False)
456
+
452
457
  cpp_binary_wrapper(name="ribbon_bench", srcs=["microbench/ribbon_bench.cc"], deps=[], extra_preprocessor_flags=[], extra_bench_libs=True)
453
458
 
454
459
  cpp_binary_wrapper(name="db_basic_bench", srcs=["microbench/db_basic_bench.cc"], deps=[], extra_preprocessor_flags=[], extra_bench_libs=True)
@@ -5194,6 +5199,12 @@ cpp_unittest_wrapper(name="inlineskiplist_test",
5194
5199
  extra_compiler_flags=[])
5195
5200
 
5196
5201
 
5202
+ cpp_unittest_wrapper(name="interval_test",
5203
+ srcs=["util/interval_test.cc"],
5204
+ deps=[":rocksdb_test_lib"],
5205
+ extra_compiler_flags=[])
5206
+
5207
+
5197
5208
  cpp_unittest_wrapper(name="io_posix_test",
5198
5209
  srcs=["env/io_posix_test.cc"],
5199
5210
  deps=[":rocksdb_test_lib"],
@@ -5374,6 +5385,12 @@ cpp_unittest_wrapper(name="plain_table_db_test",
5374
5385
  extra_compiler_flags=[])
5375
5386
 
5376
5387
 
5388
+ cpp_unittest_wrapper(name="point_lock_manager_stress_test",
5389
+ srcs=["utilities/transactions/lock/point/point_lock_manager_stress_test.cc"],
5390
+ deps=[":rocksdb_test_lib"],
5391
+ extra_compiler_flags=[])
5392
+
5393
+
5377
5394
  cpp_unittest_wrapper(name="point_lock_manager_test",
5378
5395
  srcs=["utilities/transactions/lock/point/point_lock_manager_test.cc"],
5379
5396
  deps=[":rocksdb_test_lib"],
@@ -27,7 +27,7 @@
27
27
  #
28
28
  # Linux:
29
29
  #
30
- # 1. Install a recent toolchain if you're on a older distro. C++17 required (GCC >= 7, Clang >= 5)
30
+ # 1. Install a recent toolchain if you're on a older distro. C++20 required (GCC >= 11, Clang >= 10)
31
31
  # 2. mkdir build; cd build
32
32
  # 3. cmake ..
33
33
  # 4. make -j
@@ -100,7 +100,7 @@ endif()
100
100
  option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
101
101
 
102
102
  if( NOT DEFINED CMAKE_CXX_STANDARD )
103
- set(CMAKE_CXX_STANDARD 17)
103
+ set(CMAKE_CXX_STANDARD 20)
104
104
  endif()
105
105
 
106
106
  include(CMakeDependentOption)
@@ -314,7 +314,6 @@ endif()
314
314
 
315
315
  # Check if -latomic is required or not
316
316
  if (NOT MSVC)
317
- set(CMAKE_REQUIRED_FLAGS "--std=c++17")
318
317
  CHECK_CXX_SOURCE_COMPILES("
319
318
  #include <atomic>
320
319
  std::atomic<uint64_t> x(0);
@@ -747,6 +746,7 @@ set(SOURCES
747
746
  db/write_controller.cc
748
747
  db/write_stall_stats.cc
749
748
  db/write_thread.cc
749
+ db_stress_tool/db_stress_compression_manager.cc
750
750
  env/composite_env.cc
751
751
  env/env.cc
752
752
  env/env_chroot.cc
@@ -1503,6 +1503,7 @@ if(WITH_TESTS)
1503
1503
  utilities/transactions/optimistic_transaction_test.cc
1504
1504
  utilities/transactions/transaction_test.cc
1505
1505
  utilities/transactions/lock/point/point_lock_manager_test.cc
1506
+ utilities/transactions/lock/point/point_lock_manager_stress_test.cc
1506
1507
  utilities/transactions/write_committed_transaction_ts_test.cc
1507
1508
  utilities/transactions/write_prepared_transaction_test.cc
1508
1509
  utilities/transactions/write_unprepared_transaction_test.cc
@@ -1613,6 +1614,12 @@ if(WITH_BENCHMARK_TOOLS)
1613
1614
  utilities/persistent_cache/hash_table_bench.cc)
1614
1615
  target_link_libraries(hash_table_bench${ARTIFACT_SUFFIX}
1615
1616
  ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
1617
+
1618
+ add_executable(point_lock_bench${ARTIFACT_SUFFIX}
1619
+ utilities/transactions/lock/point/point_lock_bench.cc
1620
+ utilities/transactions/lock/point/point_lock_bench_tool.cc)
1621
+ target_link_libraries(point_lock_bench${ARTIFACT_SUFFIX}
1622
+ ${ROCKSDB_LIB} ${GFLAGS_LIB} ${FOLLY_LIBS})
1616
1623
  endif()
1617
1624
 
1618
1625
  option(WITH_TRACE_TOOLS "build with trace tools" ON)
@@ -148,10 +148,8 @@ ifeq ($(USE_COROUTINES), 1)
148
148
  USE_FOLLY = 1
149
149
  # glog/logging.h requires HAVE_CXX11_ATOMIC
150
150
  OPT += -DUSE_COROUTINES -DHAVE_CXX11_ATOMIC
151
- ROCKSDB_CXX_STANDARD = c++2a
152
151
  USE_RTTI = 1
153
152
  ifneq ($(USE_CLANG), 1)
154
- ROCKSDB_CXX_STANDARD = c++20
155
153
  PLATFORM_CXXFLAGS += -fcoroutines
156
154
  endif
157
155
  endif
@@ -638,13 +636,14 @@ endif
638
636
  TEST_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(TEST_LIB_SOURCES) $(MOCK_LIB_SOURCES)) $(GTEST)
639
637
  BENCH_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(BENCH_LIB_SOURCES))
640
638
  CACHE_BENCH_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(CACHE_BENCH_LIB_SOURCES))
639
+ POINT_LOCK_BENCH_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(POINT_LOCK_BENCH_LIB_SOURCES))
641
640
  TOOL_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(TOOL_LIB_SOURCES))
642
641
  ANALYZE_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(ANALYZER_LIB_SOURCES))
643
642
  STRESS_OBJECTS = $(patsubst %.cc, $(OBJ_DIR)/%.o, $(STRESS_LIB_SOURCES))
644
643
 
645
644
  # Exclude build_version.cc -- a generated source file -- from all sources. Not needed for dependencies
646
645
  ALL_SOURCES = $(filter-out util/build_version.cc, $(LIB_SOURCES)) $(TEST_LIB_SOURCES) $(MOCK_LIB_SOURCES) $(GTEST_DIR)/gtest/gtest-all.cc
647
- ALL_SOURCES += $(TOOL_LIB_SOURCES) $(BENCH_LIB_SOURCES) $(CACHE_BENCH_LIB_SOURCES) $(ANALYZER_LIB_SOURCES) $(STRESS_LIB_SOURCES)
646
+ ALL_SOURCES += $(TOOL_LIB_SOURCES) $(BENCH_LIB_SOURCES) $(CACHE_BENCH_LIB_SOURCES) $(POINT_LOCK_BENCH_LIB_SOURCES) $(ANALYZER_LIB_SOURCES) $(STRESS_LIB_SOURCES)
648
647
  ALL_SOURCES += $(TEST_MAIN_SOURCES) $(TOOL_MAIN_SOURCES) $(BENCH_MAIN_SOURCES)
649
648
  ALL_SOURCES += $(ROCKSDB_PLUGIN_SOURCES) $(ROCKSDB_PLUGIN_TESTS)
650
649
 
@@ -683,7 +682,7 @@ am__v_CCH_1 =
683
682
  # user build settings
684
683
  %.h.pub: %.h # .h.pub not actually created, so re-checked on each invocation
685
684
  $(AM_V_CCH) cd include/ && echo '#include "$(patsubst include/%,%,$<)"' | \
686
- $(CXX) -I. -DROCKSDB_NAMESPACE=42 -x c++ -c - -o /dev/null
685
+ $(CXX) -std=$(or $(ROCKSDB_CXX_STANDARD),c++20) -I. -DROCKSDB_NAMESPACE=42 -x c++ -c - -o /dev/null
687
686
 
688
687
  check-headers: $(HEADER_OK_FILES)
689
688
 
@@ -1345,6 +1344,9 @@ block_cache_trace_analyzer: $(OBJ_DIR)/tools/block_cache_analyzer/block_cache_tr
1345
1344
  cache_bench: $(OBJ_DIR)/cache/cache_bench.o $(CACHE_BENCH_OBJECTS) $(LIBRARY)
1346
1345
  $(AM_LINK)
1347
1346
 
1347
+ point_lock_bench: $(OBJ_DIR)/utilities/transactions/lock/point/point_lock_bench.o $(POINT_LOCK_BENCH_OBJECTS) $(LIBRARY)
1348
+ $(AM_LINK)
1349
+
1348
1350
  persistent_cache_bench: $(OBJ_DIR)/utilities/persistent_cache/persistent_cache_bench.o $(LIBRARY)
1349
1351
  $(AM_LINK)
1350
1352
 
@@ -1357,6 +1359,9 @@ filter_bench: $(OBJ_DIR)/util/filter_bench.o $(LIBRARY)
1357
1359
  db_stress: $(OBJ_DIR)/db_stress_tool/db_stress.o $(STRESS_LIBRARY) $(TOOLS_LIBRARY) $(LIBRARY)
1358
1360
  $(AM_LINK)
1359
1361
 
1362
+ db_stress_compression_manager: $(OBJ_DIR)/db_stress_tool/db_stress_compression_manager.o $(LIBRARY)
1363
+ $(AM_LINK)
1364
+
1360
1365
  write_stress: $(OBJ_DIR)/tools/write_stress.o $(LIBRARY)
1361
1366
  $(AM_LINK)
1362
1367
 
@@ -1422,13 +1427,13 @@ agg_merge_test: $(OBJ_DIR)/utilities/agg_merge/agg_merge_test.o $(TEST_LIBRARY)
1422
1427
  stringappend_test: $(OBJ_DIR)/utilities/merge_operators/string_append/stringappend_test.o $(TEST_LIBRARY) $(LIBRARY)
1423
1428
  $(AM_LINK)
1424
1429
 
1425
- cassandra_format_test: $(OBJ_DIR)/utilities/cassandra/cassandra_format_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1430
+ cassandra_format_test: $(OBJ_DIR)/utilities/cassandra/cassandra_format_test.o $(TEST_LIBRARY) $(LIBRARY)
1426
1431
  $(AM_LINK)
1427
1432
 
1428
- cassandra_functional_test: $(OBJ_DIR)/utilities/cassandra/cassandra_functional_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1433
+ cassandra_functional_test: $(OBJ_DIR)/utilities/cassandra/cassandra_functional_test.o $(TEST_LIBRARY) $(LIBRARY)
1429
1434
  $(AM_LINK)
1430
1435
 
1431
- cassandra_row_merge_test: $(OBJ_DIR)/utilities/cassandra/cassandra_row_merge_test.o $(OBJ_DIR)/utilities/cassandra/test_utils.o $(TEST_LIBRARY) $(LIBRARY)
1436
+ cassandra_row_merge_test: $(OBJ_DIR)/utilities/cassandra/cassandra_row_merge_test.o $(TEST_LIBRARY) $(LIBRARY)
1432
1437
  $(AM_LINK)
1433
1438
 
1434
1439
  cassandra_serialize_test: $(OBJ_DIR)/utilities/cassandra/cassandra_serialize_test.o $(TEST_LIBRARY) $(LIBRARY)
@@ -1878,6 +1883,9 @@ heap_test: $(OBJ_DIR)/util/heap_test.o $(TEST_LIBRARY) $(LIBRARY)
1878
1883
  point_lock_manager_test: utilities/transactions/lock/point/point_lock_manager_test.o $(TEST_LIBRARY) $(LIBRARY)
1879
1884
  $(AM_LINK)
1880
1885
 
1886
+ point_lock_manager_stress_test: utilities/transactions/lock/point/point_lock_manager_stress_test.o $(TEST_LIBRARY) $(LIBRARY)
1887
+ $(AM_LINK)
1888
+
1881
1889
  transaction_test: $(OBJ_DIR)/utilities/transactions/transaction_test.o $(TEST_LIBRARY) $(LIBRARY)
1882
1890
  $(AM_LINK)
1883
1891
 
@@ -2037,6 +2045,9 @@ wide_column_serialization_test: $(OBJ_DIR)/db/wide/wide_column_serialization_tes
2037
2045
  wide_columns_helper_test: $(OBJ_DIR)/db/wide/wide_columns_helper_test.o $(TEST_LIBRARY) $(LIBRARY)
2038
2046
  $(AM_LINK)
2039
2047
 
2048
+ interval_test: $(OBJ_DIR)/util/interval_test.o $(TEST_LIBRARY) $(LIBRARY)
2049
+ $(AM_LINK)
2050
+
2040
2051
  #-------------------------------------------------
2041
2052
  # make install related stuff
2042
2053
  PREFIX ?= /usr/local
@@ -2245,7 +2256,7 @@ libsnappy.a: snappy-$(SNAPPY_VER).tar.gz
2245
2256
  -rm -rf snappy-$(SNAPPY_VER)
2246
2257
  tar xvzf snappy-$(SNAPPY_VER).tar.gz
2247
2258
  mkdir snappy-$(SNAPPY_VER)/build
2248
- cd snappy-$(SNAPPY_VER)/build && CFLAGS='$(ARCHFLAG) ${JAVA_STATIC_DEPS_CCFLAGS} ${EXTRA_CFLAGS}' CXXFLAGS='$(ARCHFLAG) ${JAVA_STATIC_DEPS_CXXFLAGS} ${EXTRA_CXXFLAGS}' LDFLAGS='${JAVA_STATIC_DEPS_LDFLAGS} ${EXTRA_LDFLAGS}' cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DSNAPPY_BUILD_BENCHMARKS=OFF -DSNAPPY_BUILD_TESTS=OFF --compile-no-warning-as-error ${PLATFORM_CMAKE_FLAGS} .. && $(MAKE) ${SNAPPY_MAKE_TARGET}
2259
+ cd snappy-$(SNAPPY_VER)/build && CFLAGS='$(ARCHFLAG) ${JAVA_STATIC_DEPS_CCFLAGS} ${EXTRA_CFLAGS}' CXXFLAGS='$(ARCHFLAG) ${JAVA_STATIC_DEPS_CXXFLAGS} ${EXTRA_CXXFLAGS}' LDFLAGS='${JAVA_STATIC_DEPS_LDFLAGS} ${EXTRA_LDFLAGS}' cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DSNAPPY_BUILD_BENCHMARKS=OFF -DSNAPPY_BUILD_TESTS=OFF ${PLATFORM_CMAKE_FLAGS} .. && $(MAKE) ${SNAPPY_MAKE_TARGET}
2249
2260
  cp snappy-$(SNAPPY_VER)/build/libsnappy.a .
2250
2261
 
2251
2262
  lz4-$(LZ4_VER).tar.gz:
@@ -2492,7 +2503,7 @@ checkout_folly:
2492
2503
  fi
2493
2504
  @# Pin to a particular version for public CI, so that PR authors don't
2494
2505
  @# need to worry about folly breaking our integration. Update periodically
2495
- cd third-party/folly && git reset --hard 5c626dd6a028a02e461edb5396694d48305e9284
2506
+ cd third-party/folly && git reset --hard e95383b7c8b5b1e46cf47acf2f317d54f93c8268
2496
2507
  @# Apparently missing include
2497
2508
  perl -pi -e 's/(#include <atomic>)/$$1\n#include <cstring>/' third-party/folly/folly/lang/Exception.h
2498
2509
  @# Warning-as-error on memcpy
@@ -60,6 +60,8 @@ DEFINE_uint32(value_bytes, 8 * KiB, "Size of each value added.");
60
60
  DEFINE_uint32(value_bytes_estimate, 0,
61
61
  "If > 0, overrides estimated_entry_charge or "
62
62
  "min_avg_entry_charge depending on cache_type.");
63
+ DEFINE_double(compressible_to_ratio, 0.5,
64
+ "Approximate size ratio that values can be compressed to.");
63
65
 
64
66
  DEFINE_int32(
65
67
  degenerate_hash_bits, 0,
@@ -182,6 +184,11 @@ DEFINE_bool(sck_randomize, false,
182
184
  DEFINE_bool(sck_footer_unique_id, false,
183
185
  "(-stress_cache_key) Simulate using proposed footer unique id");
184
186
  // ## END stress_cache_key sub-tool options ##
187
+ // ## BEGIN stress_cache_instances sub-tool options ##
188
+ DEFINE_uint32(stress_cache_instances, 0,
189
+ "If > 0, run cache instance stress test instead");
190
+ // Uses cache_size and cache_type, maybe more
191
+ // ## END stress_cache_instance sub-tool options ##
185
192
 
186
193
  namespace ROCKSDB_NAMESPACE {
187
194
 
@@ -291,10 +298,19 @@ struct KeyGen {
291
298
 
292
299
  Cache::ObjectPtr createValue(Random64& rnd, MemoryAllocator* alloc) {
293
300
  char* rv = AllocateBlock(FLAGS_value_bytes, alloc).release();
294
- // Fill with some filler data, and take some CPU time
295
- for (uint32_t i = 0; i < FLAGS_value_bytes; i += 8) {
301
+ // Fill with some filler data, and take some CPU time, but add redundancy
302
+ // as requested for compressibility.
303
+ uint32_t random_fill_size = std::max(
304
+ uint32_t{1}, std::min(FLAGS_value_bytes,
305
+ static_cast<uint32_t>(FLAGS_compressible_to_ratio *
306
+ FLAGS_value_bytes)));
307
+ uint32_t i = 0;
308
+ for (; i < random_fill_size; i += 8) {
296
309
  EncodeFixed64(rv + i, rnd.Next());
297
310
  }
311
+ for (; i < FLAGS_value_bytes; i++) {
312
+ rv[i] = rv[i % random_fill_size];
313
+ }
298
314
  return rv;
299
315
  }
300
316
 
@@ -309,16 +325,16 @@ Status SaveToFn(Cache::ObjectPtr from_obj, size_t /*from_offset*/,
309
325
 
310
326
  Status CreateFn(const Slice& data, CompressionType /*type*/,
311
327
  CacheTier /*source*/, Cache::CreateContext* /*context*/,
312
- MemoryAllocator* /*allocator*/, Cache::ObjectPtr* out_obj,
328
+ MemoryAllocator* alloc, Cache::ObjectPtr* out_obj,
313
329
  size_t* out_charge) {
314
- *out_obj = new char[data.size()];
330
+ *out_obj = AllocateBlock(data.size(), alloc).release();
315
331
  memcpy(*out_obj, data.data(), data.size());
316
332
  *out_charge = data.size();
317
333
  return Status::OK();
318
334
  };
319
335
 
320
336
  void DeleteFn(Cache::ObjectPtr value, MemoryAllocator* alloc) {
321
- CustomDeleter{alloc}(static_cast<char*>(value));
337
+ CacheAllocationDeleter{alloc}(static_cast<char*>(value));
322
338
  }
323
339
 
324
340
  Cache::CacheItemHelper helper1_wos(CacheEntryRole::kDataBlock, DeleteFn);
@@ -376,7 +392,12 @@ class CacheBench {
376
392
  fprintf(stderr, "Percentages must add to 100.\n");
377
393
  exit(1);
378
394
  }
395
+ cache_ = MakeCache();
396
+ }
397
+
398
+ ~CacheBench() = default;
379
399
 
400
+ static std::shared_ptr<Cache> MakeCache() {
380
401
  std::shared_ptr<MemoryAllocator> allocator;
381
402
  if (FLAGS_use_jemalloc_no_dump_allocator) {
382
403
  JemallocAllocatorOptions opts;
@@ -395,12 +416,12 @@ class CacheBench {
395
416
  opts.hash_seed = BitwiseAnd(FLAGS_seed, INT32_MAX);
396
417
  opts.memory_allocator = allocator;
397
418
  opts.eviction_effort_cap = FLAGS_eviction_effort_cap;
398
- if (FLAGS_cache_type == "fixed_hyper_clock_cache" ||
399
- FLAGS_cache_type == "hyper_clock_cache") {
419
+ if (FLAGS_cache_type == "fixed_hyper_clock_cache") {
400
420
  opts.estimated_entry_charge = FLAGS_value_bytes_estimate > 0
401
421
  ? FLAGS_value_bytes_estimate
402
422
  : FLAGS_value_bytes;
403
- } else if (FLAGS_cache_type == "auto_hyper_clock_cache") {
423
+ } else if (FLAGS_cache_type == "auto_hyper_clock_cache" ||
424
+ FLAGS_cache_type == "hyper_clock_cache") {
404
425
  if (FLAGS_value_bytes_estimate > 0) {
405
426
  opts.min_avg_entry_charge = FLAGS_value_bytes_estimate;
406
427
  }
@@ -409,7 +430,7 @@ class CacheBench {
409
430
  exit(1);
410
431
  }
411
432
  ConfigureSecondaryCache(opts);
412
- cache_ = opts.MakeSharedCache();
433
+ return opts.MakeSharedCache();
413
434
  } else if (FLAGS_cache_type == "lru_cache") {
414
435
  LRUCacheOptions opts(FLAGS_cache_size, FLAGS_num_shard_bits,
415
436
  false /* strict_capacity_limit */,
@@ -417,15 +438,13 @@ class CacheBench {
417
438
  opts.hash_seed = BitwiseAnd(FLAGS_seed, INT32_MAX);
418
439
  opts.memory_allocator = allocator;
419
440
  ConfigureSecondaryCache(opts);
420
- cache_ = NewLRUCache(opts);
441
+ return NewLRUCache(opts);
421
442
  } else {
422
443
  fprintf(stderr, "Cache type not supported.\n");
423
444
  exit(1);
424
445
  }
425
446
  }
426
447
 
427
- ~CacheBench() = default;
428
-
429
448
  void PopulateCache() {
430
449
  Random64 rnd(FLAGS_seed);
431
450
  KeyGen keygen;
@@ -479,7 +498,7 @@ class CacheBench {
479
498
 
480
499
  PrintEnv();
481
500
  SharedState shared(this);
482
- std::vector<std::unique_ptr<ThreadState> > threads(FLAGS_threads);
501
+ std::vector<std::unique_ptr<ThreadState>> threads(FLAGS_threads);
483
502
  for (uint32_t i = 0; i < FLAGS_threads; i++) {
484
503
  threads[i].reset(new ThreadState(i, &shared));
485
504
  std::thread(ThreadBody, threads[i].get()).detach();
@@ -1141,6 +1160,59 @@ class StressCacheKey {
1141
1160
  double multiplier_ = 0.0;
1142
1161
  };
1143
1162
 
1163
+ // cache_bench -stress_cache_instances is a partially independent embedded tool
1164
+ // for evaluating the time and space required to create and destroy many cache
1165
+ // instances, as this is considered important for a default cache implementation
1166
+ // which could see many throw-away instances in handling of Options, or created
1167
+ // in large numbers for many very small DBs with many CFs. Prefix command line
1168
+ // with /usr/bin/time to see max RSS memory.
1169
+ class StressCacheInstances {
1170
+ public:
1171
+ void Run() {
1172
+ const int kNumIterations = 10;
1173
+ const auto clock = SystemClock::Default().get();
1174
+ caches_.reserve(FLAGS_stress_cache_instances);
1175
+
1176
+ uint64_t total_create_time_us = 0;
1177
+ uint64_t total_destroy_time_us = 0;
1178
+
1179
+ for (int iter = 0; iter < kNumIterations; ++iter) {
1180
+ // Create many cache instances
1181
+ uint64_t start_create = clock->NowMicros();
1182
+ for (uint32_t i = 0; i < FLAGS_stress_cache_instances; ++i) {
1183
+ caches_.emplace_back(CacheBench::MakeCache());
1184
+ }
1185
+ uint64_t end_create = clock->NowMicros();
1186
+ uint64_t create_time = end_create - start_create;
1187
+ total_create_time_us += create_time;
1188
+
1189
+ // Destroy them
1190
+ uint64_t start_destroy = clock->NowMicros();
1191
+ caches_.clear();
1192
+ uint64_t end_destroy = clock->NowMicros();
1193
+ uint64_t destroy_time = end_destroy - start_destroy;
1194
+ total_destroy_time_us += destroy_time;
1195
+
1196
+ printf(
1197
+ "Iteration %d: Created %u caches in %.3f ms, destroyed in %.3f ms\n",
1198
+ iter + 1, FLAGS_stress_cache_instances, create_time / 1000.0,
1199
+ destroy_time / 1000.0);
1200
+ }
1201
+
1202
+ printf("Average creation time: %.3f ms (%.1f us per cache)\n",
1203
+ static_cast<double>(total_create_time_us) / kNumIterations / 1000.0,
1204
+ static_cast<double>(total_create_time_us) / kNumIterations /
1205
+ FLAGS_stress_cache_instances);
1206
+ printf("Average destruction time: %.3f ms (%.1f us per cache)\n",
1207
+ static_cast<double>(total_destroy_time_us) / kNumIterations / 1000.0,
1208
+ static_cast<double>(total_destroy_time_us) / kNumIterations /
1209
+ FLAGS_stress_cache_instances);
1210
+ }
1211
+
1212
+ private:
1213
+ std::vector<std::shared_ptr<Cache>> caches_;
1214
+ };
1215
+
1144
1216
  int cache_bench_tool(int argc, char** argv) {
1145
1217
  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
1146
1218
  ParseCommandLineFlags(&argc, &argv, true);
@@ -1151,6 +1223,11 @@ int cache_bench_tool(int argc, char** argv) {
1151
1223
  return 0;
1152
1224
  }
1153
1225
 
1226
+ if (FLAGS_stress_cache_instances > 0) {
1227
+ StressCacheInstances().Run();
1228
+ return 0;
1229
+ }
1230
+
1154
1231
  if (FLAGS_threads <= 0) {
1155
1232
  fprintf(stderr, "threads number <= 0\n");
1156
1233
  exit(1);