@nxtedition/rocksdb 6.0.0-alpha.0 → 6.0.2

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 (311) hide show
  1. package/BUILDING.md +10 -0
  2. package/binding.cc +14 -17
  3. package/binding.gyp +2 -2
  4. package/deps/rocksdb/build_version.cc +4 -10
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +17 -3
  6. package/deps/rocksdb/rocksdb/Makefile +57 -86
  7. package/deps/rocksdb/rocksdb/TARGETS +4 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +29 -17
  9. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +511 -0
  10. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +299 -0
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +3 -0
  12. package/deps/rocksdb/rocksdb/cache/lru_cache.h +7 -0
  13. package/deps/rocksdb/rocksdb/common.mk +30 -0
  14. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  15. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  16. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  17. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  18. package/deps/rocksdb/rocksdb/db/builder.cc +11 -4
  19. package/deps/rocksdb/rocksdb/db/c.cc +45 -0
  20. package/deps/rocksdb/rocksdb/db/c_test.c +25 -2
  21. package/deps/rocksdb/rocksdb/db/column_family.cc +4 -3
  22. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  23. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +25 -10
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +6 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +69 -14
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +21 -21
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +135 -32
  37. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  38. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  39. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  40. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +2 -2
  42. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  43. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  44. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  45. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  46. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +9 -8
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +1 -1
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +5 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +9 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +6 -3
  55. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  56. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  57. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  58. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  59. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  60. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  61. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  62. package/deps/rocksdb/rocksdb/db/db_options_test.cc +12 -12
  63. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  64. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  65. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +15 -14
  66. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +6 -6
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  69. package/deps/rocksdb/rocksdb/db/db_test.cc +44 -42
  70. package/deps/rocksdb/rocksdb/db/db_test2.cc +23 -19
  71. package/deps/rocksdb/rocksdb/db/db_test_util.cc +95 -17
  72. package/deps/rocksdb/rocksdb/db/db_test_util.h +48 -0
  73. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  75. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +4 -4
  76. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  77. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  78. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  79. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  80. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +34 -12
  81. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  83. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  84. package/deps/rocksdb/rocksdb/db/flush_job.cc +18 -4
  85. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  86. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  87. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  88. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -0
  89. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  90. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  91. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  92. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  93. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  94. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  96. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  97. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  98. package/deps/rocksdb/rocksdb/db/repair.cc +1 -1
  99. package/deps/rocksdb/rocksdb/db/repair_test.cc +5 -5
  100. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  101. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -4
  102. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  103. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +3 -5
  104. package/deps/rocksdb/rocksdb/db/version_edit.cc +2 -2
  105. package/deps/rocksdb/rocksdb/db/version_set.cc +2 -2
  106. package/deps/rocksdb/rocksdb/db/version_set.h +3 -3
  107. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  108. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  109. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  112. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +7 -6
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +31 -6
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  120. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  121. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +359 -275
  122. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  123. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  124. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  125. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  126. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  127. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  128. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  129. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  130. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  131. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  132. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  133. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  134. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  135. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  136. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  137. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -1
  138. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  139. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  140. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  141. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +69 -45
  142. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +3 -1
  143. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +35 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  145. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  146. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  147. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  148. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  149. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  150. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  151. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  152. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +28 -3
  153. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  154. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  155. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  156. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  157. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +189 -103
  160. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  162. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  163. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  164. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  165. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  166. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  167. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  168. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  169. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  170. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  171. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  172. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  174. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +2 -8
  175. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  176. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  177. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  178. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  179. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  180. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  181. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  182. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  183. package/deps/rocksdb/rocksdb/options/cf_options.cc +34 -38
  184. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  185. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  186. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  187. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  188. package/deps/rocksdb/rocksdb/options/db_options.cc +38 -17
  189. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  190. package/deps/rocksdb/rocksdb/options/options_helper.cc +82 -39
  191. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  192. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -3
  193. package/deps/rocksdb/rocksdb/options/options_test.cc +115 -59
  194. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  195. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  196. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  197. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  198. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  199. package/deps/rocksdb/rocksdb/src.mk +2 -0
  200. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  201. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  202. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  203. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  204. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +14 -4
  205. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  206. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +1 -1
  207. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +85 -41
  208. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +42 -72
  209. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +7 -5
  210. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  211. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  212. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  213. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  214. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  215. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  216. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  217. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +2 -1
  218. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +6 -3
  219. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  220. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +5 -5
  221. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  222. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  223. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  224. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  225. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  226. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  227. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  228. package/deps/rocksdb/rocksdb/table/multiget_context.h +14 -11
  229. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  230. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  231. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  232. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  233. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  234. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  235. package/deps/rocksdb/rocksdb/table/unique_id.cc +57 -25
  236. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +34 -4
  237. package/deps/rocksdb/rocksdb/test_util/testutil.cc +1 -1
  238. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  239. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  240. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  241. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  242. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  243. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +254 -98
  244. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  245. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  246. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  247. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  248. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  249. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  250. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +17 -3
  251. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  252. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  253. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  254. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  255. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  256. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  257. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  258. package/deps/rocksdb/rocksdb/util/compression.h +7 -7
  259. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  260. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  261. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  262. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  263. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  264. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  265. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  266. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  267. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  268. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  269. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  270. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  271. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  272. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  273. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  274. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  275. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  276. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  277. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  278. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  279. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  280. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  281. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  282. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  283. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  284. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  285. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  286. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  287. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  288. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  289. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  290. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  291. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  292. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  293. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  294. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  295. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  296. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  297. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  298. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  299. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  300. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  301. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  302. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  303. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  304. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  305. package/deps/rocksdb/rocksdb.gyp +40 -31
  306. package/package.json +2 -2
  307. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  308. package/prebuilds/linux-x64/node.napi.node +0 -0
  309. package/deps/rocksdb/rocksdb/python.mk +0 -9
  310. package/prebuilds/darwin-x64/node.napi.node +0 -0
  311. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -22,6 +22,7 @@
22
22
  #include <vector>
23
23
 
24
24
  #include "cache/lru_cache.h"
25
+ #include "db/db_test_util.h"
25
26
  #include "db/dbformat.h"
26
27
  #include "db/memtable.h"
27
28
  #include "db/write_batch_internal.h"
@@ -1126,8 +1127,9 @@ class TableTest : public testing::Test {
1126
1127
  };
1127
1128
 
1128
1129
  class GeneralTableTest : public TableTest {};
1130
+ class BlockBasedTableTestBase : public TableTest {};
1129
1131
  class BlockBasedTableTest
1130
- : public TableTest,
1132
+ : public BlockBasedTableTestBase,
1131
1133
  virtual public ::testing::WithParamInterface<uint32_t> {
1132
1134
  public:
1133
1135
  BlockBasedTableTest() : format_(GetParam()) {
@@ -1377,9 +1379,9 @@ TEST_F(TablePropertyTest, PrefixScanTest) {
1377
1379
  pos->first.compare(0, prefix.size(), prefix) == 0;
1378
1380
  ++pos) {
1379
1381
  ++num;
1380
- auto key = prefix + "." + ToString(num);
1382
+ auto key = prefix + "." + std::to_string(num);
1381
1383
  ASSERT_EQ(key, pos->first);
1382
- ASSERT_EQ(ToString(num), pos->second);
1384
+ ASSERT_EQ(std::to_string(num), pos->second);
1383
1385
  }
1384
1386
  ASSERT_EQ(3, num);
1385
1387
  }
@@ -1428,12 +1430,19 @@ TestIds GetUniqueId(TableProperties* tp, std::unordered_set<uint64_t>* seen,
1428
1430
  tp->orig_file_number = file_number;
1429
1431
  TestIds t;
1430
1432
  {
1433
+ std::string euid;
1434
+ EXPECT_OK(GetExtendedUniqueIdFromTableProperties(*tp, &euid));
1435
+ EXPECT_EQ(euid.size(), 24U);
1436
+ t.external_id[0] = DecodeFixed64(&euid[0]);
1437
+ t.external_id[1] = DecodeFixed64(&euid[8]);
1438
+ t.external_id[2] = DecodeFixed64(&euid[16]);
1439
+
1431
1440
  std::string uid;
1432
1441
  EXPECT_OK(GetUniqueIdFromTableProperties(*tp, &uid));
1433
- EXPECT_EQ(uid.size(), 24U);
1434
- t.external_id[0] = DecodeFixed64(&uid[0]);
1435
- t.external_id[1] = DecodeFixed64(&uid[8]);
1436
- t.external_id[2] = DecodeFixed64(&uid[16]);
1442
+ EXPECT_EQ(uid.size(), 16U);
1443
+ EXPECT_EQ(uid, euid.substr(0, 16));
1444
+ EXPECT_EQ(t.external_id[0], DecodeFixed64(&uid[0]));
1445
+ EXPECT_EQ(t.external_id[1], DecodeFixed64(&uid[8]));
1437
1446
  }
1438
1447
  // All these should be effectively random
1439
1448
  EXPECT_TRUE(seen->insert(t.external_id[0]).second);
@@ -1443,6 +1452,7 @@ TestIds GetUniqueId(TableProperties* tp, std::unordered_set<uint64_t>* seen,
1443
1452
  // Get internal with internal API
1444
1453
  EXPECT_OK(GetSstInternalUniqueId(db_id, db_session_id, file_number,
1445
1454
  &t.internal_id));
1455
+ EXPECT_NE(t.internal_id, kNullUniqueId64x3);
1446
1456
 
1447
1457
  // Verify relationship
1448
1458
  UniqueId64x3 tmp = t.internal_id;
@@ -1450,6 +1460,21 @@ TestIds GetUniqueId(TableProperties* tp, std::unordered_set<uint64_t>* seen,
1450
1460
  EXPECT_EQ(tmp, t.external_id);
1451
1461
  ExternalUniqueIdToInternal(&tmp);
1452
1462
  EXPECT_EQ(tmp, t.internal_id);
1463
+
1464
+ // And 128-bit internal version
1465
+ UniqueId64x2 tmp2{};
1466
+ EXPECT_OK(GetSstInternalUniqueId(db_id, db_session_id, file_number, &tmp2));
1467
+ EXPECT_NE(tmp2, kNullUniqueId64x2);
1468
+
1469
+ EXPECT_EQ(tmp2[0], t.internal_id[0]);
1470
+ EXPECT_EQ(tmp2[1], t.internal_id[1]);
1471
+ InternalUniqueIdToExternal(&tmp2);
1472
+ EXPECT_EQ(tmp2[0], t.external_id[0]);
1473
+ EXPECT_EQ(tmp2[1], t.external_id[1]);
1474
+ ExternalUniqueIdToInternal(&tmp2);
1475
+ EXPECT_EQ(tmp2[0], t.internal_id[0]);
1476
+ EXPECT_EQ(tmp2[1], t.internal_id[1]);
1477
+
1453
1478
  return t;
1454
1479
  }
1455
1480
  } // namespace
@@ -1590,7 +1615,7 @@ TEST_F(TablePropertyTest, UniqueIdHumanStrings) {
1590
1615
  SetGoodTableProperties(&tp);
1591
1616
 
1592
1617
  std::string tmp;
1593
- EXPECT_OK(GetUniqueIdFromTableProperties(tp, &tmp));
1618
+ EXPECT_OK(GetExtendedUniqueIdFromTableProperties(tp, &tmp));
1594
1619
  EXPECT_EQ(tmp,
1595
1620
  (std::string{{'\x64', '\x74', '\xdf', '\x65', '\x03', '\x23',
1596
1621
  '\xbd', '\xf0', '\xb4', '\x8e', '\x64', '\xf3',
@@ -1599,6 +1624,9 @@ TEST_F(TablePropertyTest, UniqueIdHumanStrings) {
1599
1624
  EXPECT_EQ(UniqueIdToHumanString(tmp),
1600
1625
  "6474DF650323BDF0-B48E64F3039308CA-17284B32E7F7444B");
1601
1626
 
1627
+ EXPECT_OK(GetUniqueIdFromTableProperties(tp, &tmp));
1628
+ EXPECT_EQ(UniqueIdToHumanString(tmp), "6474DF650323BDF0-B48E64F3039308CA");
1629
+
1602
1630
  // including zero padding
1603
1631
  tmp = std::string(24U, '\0');
1604
1632
  tmp[15] = '\x12';
@@ -1622,6 +1650,13 @@ TEST_F(TablePropertyTest, UniqueIdHumanStrings) {
1622
1650
 
1623
1651
  tmp.resize(6);
1624
1652
  EXPECT_EQ(UniqueIdToHumanString(tmp), "000000000012");
1653
+
1654
+ // Also internal IDs to human string
1655
+ UniqueId64x3 euid = {12345, 678, 9};
1656
+ EXPECT_EQ(InternalUniqueIdToHumanString(&euid), "{12345,678,9}");
1657
+
1658
+ UniqueId64x2 uid = {1234, 567890};
1659
+ EXPECT_EQ(InternalUniqueIdToHumanString(&uid), "{1234,567890}");
1625
1660
  }
1626
1661
 
1627
1662
  TEST_F(TablePropertyTest, UniqueIdsFailure) {
@@ -1632,16 +1667,22 @@ TEST_F(TablePropertyTest, UniqueIdsFailure) {
1632
1667
  SetGoodTableProperties(&tp);
1633
1668
  tp.db_id = "";
1634
1669
  EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1670
+ EXPECT_TRUE(
1671
+ GetExtendedUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1635
1672
 
1636
1673
  // Missing session id
1637
1674
  SetGoodTableProperties(&tp);
1638
1675
  tp.db_session_id = "";
1639
1676
  EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1677
+ EXPECT_TRUE(
1678
+ GetExtendedUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1640
1679
 
1641
1680
  // Missing file number
1642
1681
  SetGoodTableProperties(&tp);
1643
1682
  tp.orig_file_number = 0;
1644
1683
  EXPECT_TRUE(GetUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1684
+ EXPECT_TRUE(
1685
+ GetExtendedUniqueIdFromTableProperties(tp, &tmp).IsNotSupported());
1645
1686
  }
1646
1687
 
1647
1688
  // This test include all the basic checks except those for index size and block
@@ -1705,7 +1746,7 @@ uint64_t BlockBasedTableTest::IndexUncompressedHelper(bool compressed) {
1705
1746
  constexpr size_t kNumKeys = 10000;
1706
1747
 
1707
1748
  for (size_t k = 0; k < kNumKeys; ++k) {
1708
- c.Add("key" + ToString(k), "val" + ToString(k));
1749
+ c.Add("key" + std::to_string(k), "val" + std::to_string(k));
1709
1750
  }
1710
1751
 
1711
1752
  std::vector<std::string> keys;
@@ -5190,84 +5231,98 @@ TEST_P(BlockBasedTableTest, OutOfBoundOnNext) {
5190
5231
  ASSERT_FALSE(iter->UpperBoundCheckResult() == IterBoundCheck::kOutOfBound);
5191
5232
  }
5192
5233
 
5193
- TEST_P(
5194
- BlockBasedTableTest,
5195
- IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnBuilderFinish) {
5234
+ class ChargeCompressionDictionaryBuildingBufferTest
5235
+ : public BlockBasedTableTestBase {};
5236
+ TEST_F(ChargeCompressionDictionaryBuildingBufferTest, Basic) {
5196
5237
  constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5197
5238
  constexpr std::size_t kMetaDataChargeOverhead = 10000;
5198
5239
  constexpr std::size_t kCacheCapacity = 8 * 1024 * 1024;
5199
5240
  constexpr std::size_t kMaxDictBytes = 1024;
5200
5241
  constexpr std::size_t kMaxDictBufferBytes = 1024;
5201
5242
 
5202
- BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5203
- LRUCacheOptions lo;
5204
- lo.capacity = kCacheCapacity;
5205
- lo.num_shard_bits = 0; // 2^0 shard
5206
- lo.strict_capacity_limit = true;
5207
- std::shared_ptr<Cache> cache(NewLRUCache(lo));
5208
- table_options.block_cache = cache;
5209
- table_options.flush_block_policy_factory =
5210
- std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5211
-
5212
- Options options;
5213
- options.compression = kSnappyCompression;
5214
- options.compression_opts.max_dict_bytes = kMaxDictBytes;
5215
- options.compression_opts.max_dict_buffer_bytes = kMaxDictBufferBytes;
5216
- options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5217
-
5218
- test::StringSink* sink = new test::StringSink();
5219
- std::unique_ptr<FSWritableFile> holder(sink);
5220
- std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
5221
- std::move(holder), "test_file_name", FileOptions()));
5222
-
5223
- ImmutableOptions ioptions(options);
5224
- MutableCFOptions moptions(options);
5225
- InternalKeyComparator ikc(options.comparator);
5226
- IntTblPropCollectorFactories int_tbl_prop_collector_factories;
5243
+ for (CacheEntryRoleOptions::Decision
5244
+ charge_compression_dictionary_building_buffer :
5245
+ {CacheEntryRoleOptions::Decision::kEnabled,
5246
+ CacheEntryRoleOptions::Decision::kDisabled}) {
5247
+ BlockBasedTableOptions table_options;
5248
+ LRUCacheOptions lo;
5249
+ lo.capacity = kCacheCapacity;
5250
+ lo.num_shard_bits = 0; // 2^0 shard
5251
+ lo.strict_capacity_limit = true;
5252
+ std::shared_ptr<Cache> cache(NewLRUCache(lo));
5253
+ table_options.block_cache = cache;
5254
+ table_options.flush_block_policy_factory =
5255
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
5256
+ table_options.cache_usage_options.options_overrides.insert(
5257
+ {CacheEntryRole::kCompressionDictionaryBuildingBuffer,
5258
+ {/*.charged = */ charge_compression_dictionary_building_buffer}});
5259
+ Options options;
5260
+ options.compression = kSnappyCompression;
5261
+ options.compression_opts.max_dict_bytes = kMaxDictBytes;
5262
+ options.compression_opts.max_dict_buffer_bytes = kMaxDictBufferBytes;
5263
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5227
5264
 
5228
- std::unique_ptr<TableBuilder> builder(options.table_factory->NewTableBuilder(
5229
- TableBuilderOptions(ioptions, moptions, ikc,
5230
- &int_tbl_prop_collector_factories, kSnappyCompression,
5231
- options.compression_opts, kUnknownColumnFamily,
5232
- "test_cf", -1 /* level */),
5233
- file_writer.get()));
5265
+ test::StringSink* sink = new test::StringSink();
5266
+ std::unique_ptr<FSWritableFile> holder(sink);
5267
+ std::unique_ptr<WritableFileWriter> file_writer(new WritableFileWriter(
5268
+ std::move(holder), "test_file_name", FileOptions()));
5234
5269
 
5235
- std::string key1 = "key1";
5236
- std::string value1 = "val1";
5237
- InternalKey ik1(key1, 0 /* sequnce number */, kTypeValue);
5238
- // Adding the first key won't trigger a flush by FlushBlockEveryKeyPolicy
5239
- // therefore won't trigger any data block's buffering
5240
- builder->Add(ik1.Encode(), value1);
5241
- ASSERT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5270
+ ImmutableOptions ioptions(options);
5271
+ MutableCFOptions moptions(options);
5272
+ InternalKeyComparator ikc(options.comparator);
5273
+ IntTblPropCollectorFactories int_tbl_prop_collector_factories;
5242
5274
 
5243
- std::string key2 = "key2";
5244
- std::string value2 = "val2";
5245
- InternalKey ik2(key2, 1 /* sequnce number */, kTypeValue);
5246
- // Adding the second key will trigger a flush of the last data block (the one
5247
- // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5248
- // buffering of that data block.
5249
- builder->Add(ik2.Encode(), value2);
5250
- // Cache reservation will increase for last buffered data block (the one
5251
- // containing key1 and value1) since the buffer limit is not exceeded after
5252
- // that buffering and the cache will not be full after this reservation
5253
- EXPECT_GE(cache->GetPinnedUsage(), 1 * kSizeDummyEntry);
5254
- EXPECT_LT(cache->GetPinnedUsage(),
5255
- 1 * kSizeDummyEntry + kMetaDataChargeOverhead);
5275
+ std::unique_ptr<TableBuilder> builder(
5276
+ options.table_factory->NewTableBuilder(
5277
+ TableBuilderOptions(
5278
+ ioptions, moptions, ikc, &int_tbl_prop_collector_factories,
5279
+ kSnappyCompression, options.compression_opts,
5280
+ kUnknownColumnFamily, "test_cf", -1 /* level */),
5281
+ file_writer.get()));
5282
+
5283
+ std::string key1 = "key1";
5284
+ std::string value1 = "val1";
5285
+ InternalKey ik1(key1, 0 /* sequnce number */, kTypeValue);
5286
+ // Adding the first key won't trigger a flush by FlushBlockEveryKeyPolicy
5287
+ // therefore won't trigger any data block's buffering
5288
+ builder->Add(ik1.Encode(), value1);
5289
+ ASSERT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5290
+
5291
+ std::string key2 = "key2";
5292
+ std::string value2 = "val2";
5293
+ InternalKey ik2(key2, 1 /* sequnce number */, kTypeValue);
5294
+ // Adding the second key will trigger a flush of the last data block (the
5295
+ // one containing key1 and value1) by FlushBlockEveryKeyPolicy and hence
5296
+ // trigger buffering of that data block.
5297
+ builder->Add(ik2.Encode(), value2);
5298
+ // Cache charging will increase for last buffered data block (the one
5299
+ // containing key1 and value1) since the buffer limit is not exceeded after
5300
+ // that buffering and the cache will not be full after this reservation
5301
+ if (charge_compression_dictionary_building_buffer ==
5302
+ CacheEntryRoleOptions::Decision::kEnabled) {
5303
+ EXPECT_GE(cache->GetPinnedUsage(), 1 * kSizeDummyEntry);
5304
+ EXPECT_LT(cache->GetPinnedUsage(),
5305
+ 1 * kSizeDummyEntry + kMetaDataChargeOverhead);
5306
+ } else {
5307
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5308
+ }
5256
5309
 
5257
- ASSERT_OK(builder->Finish());
5258
- EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5310
+ ASSERT_OK(builder->Finish());
5311
+ EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5312
+ }
5259
5313
  }
5260
5314
 
5261
- TEST_P(
5262
- BlockBasedTableTest,
5263
- IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnBufferLimitExceed) {
5315
+ TEST_F(ChargeCompressionDictionaryBuildingBufferTest,
5316
+ BasicWithBufferLimitExceed) {
5264
5317
  constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5265
5318
  constexpr std::size_t kMetaDataChargeOverhead = 10000;
5266
5319
  constexpr std::size_t kCacheCapacity = 8 * 1024 * 1024;
5267
5320
  constexpr std::size_t kMaxDictBytes = 1024;
5268
5321
  constexpr std::size_t kMaxDictBufferBytes = 2 * kSizeDummyEntry;
5269
5322
 
5270
- BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5323
+ // `CacheEntryRoleOptions::charged` is enabled by default for
5324
+ // CacheEntryRole::kCompressionDictionaryBuildingBuffer
5325
+ BlockBasedTableOptions table_options;
5271
5326
  LRUCacheOptions lo;
5272
5327
  lo.capacity = kCacheCapacity;
5273
5328
  lo.num_shard_bits = 0; // 2^0 shard
@@ -5315,7 +5370,7 @@ TEST_P(
5315
5370
  // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5316
5371
  // buffering of the last data block.
5317
5372
  builder->Add(ik2.Encode(), value2);
5318
- // Cache reservation will increase for last buffered data block (the one
5373
+ // Cache charging will increase for last buffered data block (the one
5319
5374
  // containing key1 and value1) since the buffer limit is not exceeded after
5320
5375
  // the buffering and the cache will not be full after this reservation
5321
5376
  EXPECT_GE(cache->GetPinnedUsage(), 2 * kSizeDummyEntry);
@@ -5329,7 +5384,7 @@ TEST_P(
5329
5384
  // containing key2 and value2) by FlushBlockEveryKeyPolicy and hence trigger
5330
5385
  // buffering of the last data block.
5331
5386
  builder->Add(ik3.Encode(), value3);
5332
- // Cache reservation will decrease since the buffer limit is now exceeded
5387
+ // Cache charging will decrease since the buffer limit is now exceeded
5333
5388
  // after the last buffering and EnterUnbuffered() is triggered
5334
5389
  EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5335
5390
 
@@ -5337,12 +5392,10 @@ TEST_P(
5337
5392
  EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5338
5393
  }
5339
5394
 
5340
- TEST_P(
5341
- BlockBasedTableTest,
5342
- IncreaseCacheReservationForCompressDictBuildingBufferOnBuilderAddAndDecreaseOnCacheFull) {
5395
+ TEST_F(ChargeCompressionDictionaryBuildingBufferTest, BasicWithCacheFull) {
5343
5396
  constexpr std::size_t kSizeDummyEntry = 256 * 1024;
5344
5397
  constexpr std::size_t kMetaDataChargeOverhead = 10000;
5345
- // A small kCacheCapacity is chosen so that increase cache reservation for
5398
+ // A small kCacheCapacity is chosen so that increase cache charging for
5346
5399
  // buffering two data blocks, each containing key1/value1, key2/a big
5347
5400
  // value2, will cause cache full
5348
5401
  constexpr std::size_t kCacheCapacity =
@@ -5352,7 +5405,9 @@ TEST_P(
5352
5405
  // (key2, value2) won't exceed the buffer limit
5353
5406
  constexpr std::size_t kMaxDictBufferBytes = 1024 * 1024 * 1024;
5354
5407
 
5355
- BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
5408
+ // `CacheEntryRoleOptions::charged` is enabled by default for
5409
+ // CacheEntryRole::kCompressionDictionaryBuildingBuffer
5410
+ BlockBasedTableOptions table_options;
5356
5411
  LRUCacheOptions lo;
5357
5412
  lo.capacity = kCacheCapacity;
5358
5413
  lo.num_shard_bits = 0; // 2^0 shard
@@ -5400,7 +5455,7 @@ TEST_P(
5400
5455
  // containing key1 and value1) by FlushBlockEveryKeyPolicy and hence trigger
5401
5456
  // buffering of the last data block.
5402
5457
  builder->Add(ik2.Encode(), value2);
5403
- // Cache reservation will increase for the last buffered data block (the one
5458
+ // Cache charging will increase for the last buffered data block (the one
5404
5459
  // containing key1 and value1) since the buffer limit is not exceeded after
5405
5460
  // the buffering and the cache will not be full after this reservation
5406
5461
  EXPECT_GE(cache->GetPinnedUsage(), 1 * kSizeDummyEntry);
@@ -5414,7 +5469,7 @@ TEST_P(
5414
5469
  // containing key2 and value2) by FlushBlockEveryKeyPolicy and hence trigger
5415
5470
  // buffering of the last data block.
5416
5471
  builder->Add(ik3.Encode(), value3);
5417
- // Cache reservation will decrease since the cache is now full after
5472
+ // Cache charging will decrease since the cache is now full after
5418
5473
  // increasing reservation for the last buffered block and EnterUnbuffered() is
5419
5474
  // triggered
5420
5475
  EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
@@ -5423,6 +5478,75 @@ TEST_P(
5423
5478
  EXPECT_EQ(cache->GetPinnedUsage(), 0 * kSizeDummyEntry);
5424
5479
  }
5425
5480
 
5481
+ class CacheUsageOptionsOverridesTest : public DBTestBase {
5482
+ public:
5483
+ CacheUsageOptionsOverridesTest()
5484
+ : DBTestBase("cache_usage_options_overrides_test",
5485
+ /*env_do_fsync=*/false) {}
5486
+ };
5487
+
5488
+ TEST_F(CacheUsageOptionsOverridesTest, SanitizeAndValidateOptions) {
5489
+ // To test `cache_usage_options.options_overrides` is sanitized
5490
+ // where `cache_usage_options.options` is used when there is no entry in
5491
+ // `cache_usage_options.options_overrides`
5492
+ Options options;
5493
+ options.create_if_missing = true;
5494
+ BlockBasedTableOptions table_options = BlockBasedTableOptions();
5495
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5496
+ Destroy(options);
5497
+ Status s = TryReopen(options);
5498
+ EXPECT_TRUE(s.ok());
5499
+ const auto* sanitized_table_options =
5500
+ options.table_factory->GetOptions<BlockBasedTableOptions>();
5501
+ const auto sanitized_options_overrides =
5502
+ sanitized_table_options->cache_usage_options.options_overrides;
5503
+ EXPECT_EQ(sanitized_options_overrides.size(), kNumCacheEntryRoles);
5504
+ for (auto options_overrides_iter = sanitized_options_overrides.cbegin();
5505
+ options_overrides_iter != sanitized_options_overrides.cend();
5506
+ ++options_overrides_iter) {
5507
+ CacheEntryRoleOptions role_options = options_overrides_iter->second;
5508
+ CacheEntryRoleOptions default_options =
5509
+ sanitized_table_options->cache_usage_options.options;
5510
+ EXPECT_TRUE(role_options == default_options);
5511
+ }
5512
+ Destroy(options);
5513
+
5514
+ // To test option validation on unsupported CacheEntryRole
5515
+ table_options = BlockBasedTableOptions();
5516
+ table_options.cache_usage_options.options_overrides.insert(
5517
+ {CacheEntryRole::kDataBlock,
5518
+ {/*.charged = */ CacheEntryRoleOptions::Decision::kDisabled}});
5519
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5520
+ Destroy(options);
5521
+ s = TryReopen(options);
5522
+ EXPECT_TRUE(s.IsNotSupported());
5523
+ EXPECT_TRUE(
5524
+ s.ToString().find("Enable/Disable CacheEntryRoleOptions::charged") !=
5525
+ std::string::npos);
5526
+ EXPECT_TRUE(
5527
+ s.ToString().find(kCacheEntryRoleToCamelString[static_cast<uint32_t>(
5528
+ CacheEntryRole::kDataBlock)]) != std::string::npos);
5529
+ Destroy(options);
5530
+
5531
+ // To test option validation on existence of block cache
5532
+ table_options = BlockBasedTableOptions();
5533
+ table_options.no_block_cache = true;
5534
+ table_options.cache_usage_options.options_overrides.insert(
5535
+ {CacheEntryRole::kFilterConstruction,
5536
+ {/*.charged = */ CacheEntryRoleOptions::Decision::kEnabled}});
5537
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
5538
+ Destroy(options);
5539
+ s = TryReopen(options);
5540
+ EXPECT_TRUE(s.IsInvalidArgument());
5541
+ EXPECT_TRUE(s.ToString().find("Enable CacheEntryRoleOptions::charged") !=
5542
+ std::string::npos);
5543
+ EXPECT_TRUE(
5544
+ s.ToString().find(kCacheEntryRoleToCamelString[static_cast<std::size_t>(
5545
+ CacheEntryRole::kFilterConstruction)]) != std::string::npos);
5546
+ EXPECT_TRUE(s.ToString().find("block cache is disabled") !=
5547
+ std::string::npos);
5548
+ Destroy(options);
5549
+ }
5426
5550
  } // namespace ROCKSDB_NAMESPACE
5427
5551
 
5428
5552
  int main(int argc, char** argv) {
@@ -58,7 +58,7 @@ Status DecodeSessionId(const std::string &db_session_id, uint64_t *upper,
58
58
 
59
59
  Status GetSstInternalUniqueId(const std::string &db_id,
60
60
  const std::string &db_session_id,
61
- uint64_t file_number, UniqueId64x3 *out) {
61
+ uint64_t file_number, UniqueIdPtr out) {
62
62
  if (db_id.empty()) {
63
63
  return Status::NotSupported("Missing db_id");
64
64
  }
@@ -84,7 +84,7 @@ Status GetSstInternalUniqueId(const std::string &db_id,
84
84
  // that here because of testing and old versions.)
85
85
  // We put this first in anticipation of matching a small-ish set of cache
86
86
  // key prefixes to cover entries relevant to any DB.
87
- (*out)[0] = session_lower;
87
+ out.ptr[0] = session_lower;
88
88
 
89
89
  // Hash the session upper (~39 bits entropy) and DB id (120+ bits entropy)
90
90
  // for very high global uniqueness entropy.
@@ -97,10 +97,12 @@ Status GetSstInternalUniqueId(const std::string &db_id,
97
97
  // Xor in file number for guaranteed uniqueness by file number for a given
98
98
  // session and DB id. (Xor slightly better than + here. See
99
99
  // https://github.com/pdillinger/unique_id )
100
- (*out)[1] = db_a ^ file_number;
100
+ out.ptr[1] = db_a ^ file_number;
101
101
 
102
102
  // Extra (optional) global uniqueness
103
- (*out)[2] = db_b;
103
+ if (out.extended) {
104
+ out.ptr[2] = db_b;
105
+ }
104
106
 
105
107
  return Status::OK();
106
108
  }
@@ -114,46 +116,63 @@ constexpr uint64_t kHiOffsetForZero = 17391078804906429400U;
114
116
  constexpr uint64_t kLoOffsetForZero = 6417269962128484497U;
115
117
  } // namespace
116
118
 
117
- void InternalUniqueIdToExternal(UniqueId64x3 *in_out) {
119
+ void InternalUniqueIdToExternal(UniqueIdPtr in_out) {
118
120
  uint64_t hi, lo;
119
- BijectiveHash2x64((*in_out)[1] + kHiOffsetForZero,
120
- (*in_out)[0] + kLoOffsetForZero, &hi, &lo);
121
- (*in_out)[0] = lo;
122
- (*in_out)[1] = hi;
123
- (*in_out)[2] += lo + hi;
121
+ BijectiveHash2x64(in_out.ptr[1] + kHiOffsetForZero,
122
+ in_out.ptr[0] + kLoOffsetForZero, &hi, &lo);
123
+ in_out.ptr[0] = lo;
124
+ in_out.ptr[1] = hi;
125
+ if (in_out.extended) {
126
+ in_out.ptr[2] += lo + hi;
127
+ }
124
128
  }
125
129
 
126
- void ExternalUniqueIdToInternal(UniqueId64x3 *in_out) {
127
- uint64_t lo = (*in_out)[0];
128
- uint64_t hi = (*in_out)[1];
129
- (*in_out)[2] -= lo + hi;
130
+ void ExternalUniqueIdToInternal(UniqueIdPtr in_out) {
131
+ uint64_t lo = in_out.ptr[0];
132
+ uint64_t hi = in_out.ptr[1];
133
+ if (in_out.extended) {
134
+ in_out.ptr[2] -= lo + hi;
135
+ }
130
136
  BijectiveUnhash2x64(hi, lo, &hi, &lo);
131
- (*in_out)[0] = lo - kLoOffsetForZero;
132
- (*in_out)[1] = hi - kHiOffsetForZero;
137
+ in_out.ptr[0] = lo - kLoOffsetForZero;
138
+ in_out.ptr[1] = hi - kHiOffsetForZero;
133
139
  }
134
140
 
135
- std::string EncodeUniqueIdBytes(const UniqueId64x3 &in) {
136
- std::string ret(24U, '\0');
137
- EncodeFixed64(&ret[0], in[0]);
138
- EncodeFixed64(&ret[8], in[1]);
139
- EncodeFixed64(&ret[16], in[2]);
141
+ std::string EncodeUniqueIdBytes(UniqueIdPtr in) {
142
+ std::string ret(in.extended ? 24U : 16U, '\0');
143
+ EncodeFixed64(&ret[0], in.ptr[0]);
144
+ EncodeFixed64(&ret[8], in.ptr[1]);
145
+ if (in.extended) {
146
+ EncodeFixed64(&ret[16], in.ptr[2]);
147
+ }
140
148
  return ret;
141
149
  }
142
150
 
143
- Status GetUniqueIdFromTableProperties(const TableProperties &props,
144
- std::string *out_id) {
145
- UniqueId64x3 tmp{};
151
+ template <typename ID>
152
+ Status GetUniqueIdFromTablePropertiesHelper(const TableProperties &props,
153
+ std::string *out_id) {
154
+ ID tmp{};
146
155
  Status s = GetSstInternalUniqueId(props.db_id, props.db_session_id,
147
156
  props.orig_file_number, &tmp);
148
157
  if (s.ok()) {
149
158
  InternalUniqueIdToExternal(&tmp);
150
- *out_id = EncodeUniqueIdBytes(tmp);
159
+ *out_id = EncodeUniqueIdBytes(&tmp);
151
160
  } else {
152
161
  out_id->clear();
153
162
  }
154
163
  return s;
155
164
  }
156
165
 
166
+ Status GetExtendedUniqueIdFromTableProperties(const TableProperties &props,
167
+ std::string *out_id) {
168
+ return GetUniqueIdFromTablePropertiesHelper<UniqueId64x3>(props, out_id);
169
+ }
170
+
171
+ Status GetUniqueIdFromTableProperties(const TableProperties &props,
172
+ std::string *out_id) {
173
+ return GetUniqueIdFromTablePropertiesHelper<UniqueId64x2>(props, out_id);
174
+ }
175
+
157
176
  std::string UniqueIdToHumanString(const std::string &id) {
158
177
  // Not so efficient, but that's OK
159
178
  std::string str = Slice(id).ToString(/*hex*/ true);
@@ -163,4 +182,17 @@ std::string UniqueIdToHumanString(const std::string &id) {
163
182
  return str;
164
183
  }
165
184
 
185
+ std::string InternalUniqueIdToHumanString(UniqueIdPtr in) {
186
+ std::string str = "{";
187
+ str += std::to_string(in.ptr[0]);
188
+ str += ",";
189
+ str += std::to_string(in.ptr[1]);
190
+ if (in.extended) {
191
+ str += ",";
192
+ str += std::to_string(in.ptr[2]);
193
+ }
194
+ str += "}";
195
+ return str;
196
+ }
197
+
166
198
  } // namespace ROCKSDB_NAMESPACE
@@ -11,8 +11,34 @@
11
11
 
12
12
  namespace ROCKSDB_NAMESPACE {
13
13
 
14
+ // Standard size unique ID, good enough for almost all practical purposes
15
+ using UniqueId64x2 = std::array<uint64_t, 2>;
16
+
17
+ // Value never used as an actual unique ID so can be used for "null"
18
+ constexpr UniqueId64x2 kNullUniqueId64x2 = {};
19
+
20
+ // Extended size unique ID, for extra certainty of uniqueness among SST files
21
+ // spanning many hosts over a long time (rarely if ever needed)
14
22
  using UniqueId64x3 = std::array<uint64_t, 3>;
15
23
 
24
+ // Value never used as an actual unique ID so can be used for "null"
25
+ constexpr UniqueId64x3 kNullUniqueId64x3 = {};
26
+
27
+ // Dynamic pointer wrapper for one of the two above
28
+ struct UniqueIdPtr {
29
+ uint64_t *ptr = nullptr;
30
+ bool extended = false;
31
+
32
+ /*implicit*/ UniqueIdPtr(UniqueId64x2 *id) {
33
+ ptr = (*id).data();
34
+ extended = false;
35
+ }
36
+ /*implicit*/ UniqueIdPtr(UniqueId64x3 *id) {
37
+ ptr = (*id).data();
38
+ extended = true;
39
+ }
40
+ };
41
+
16
42
  // Helper for GetUniqueIdFromTableProperties. This function can also be used
17
43
  // for temporary ids for files without sufficient information in table
18
44
  // properties. The internal unique id is more structured than the public
@@ -21,7 +47,7 @@ using UniqueId64x3 = std::array<uint64_t, 3>;
21
47
  // is long term stable.
22
48
  Status GetSstInternalUniqueId(const std::string &db_id,
23
49
  const std::string &db_session_id,
24
- uint64_t file_number, UniqueId64x3 *out);
50
+ uint64_t file_number, UniqueIdPtr out);
25
51
 
26
52
  // Helper for GetUniqueIdFromTableProperties. External unique ids go through
27
53
  // this extra hashing layer so that prefixes of the unique id have predictable
@@ -29,14 +55,18 @@ Status GetSstInternalUniqueId(const std::string &db_id,
29
55
  // the full 192 bits.
30
56
  // This transformation must be long term stable to ensure
31
57
  // GetUniqueIdFromTableProperties is long term stable.
32
- void InternalUniqueIdToExternal(UniqueId64x3 *in_out);
58
+ void InternalUniqueIdToExternal(UniqueIdPtr in_out);
33
59
 
34
60
  // Reverse of InternalUniqueIdToExternal mostly for testing purposes
35
61
  // (demonstrably 1-to-1 on the first 128 bits and on the full 192 bits).
36
- void ExternalUniqueIdToInternal(UniqueId64x3 *in_out);
62
+ void ExternalUniqueIdToInternal(UniqueIdPtr in_out);
37
63
 
38
64
  // Convert numerical format to byte format for public API
39
- std::string EncodeUniqueIdBytes(const UniqueId64x3 &in);
65
+ std::string EncodeUniqueIdBytes(UniqueIdPtr in);
66
+
67
+ // For presenting internal IDs for debugging purposes. Visually distinct from
68
+ // UniqueIdToHumanString for external IDs.
69
+ std::string InternalUniqueIdToHumanString(UniqueIdPtr in);
40
70
 
41
71
  // Reformat a random value down to our "DB session id" format,
42
72
  // which is intended to be compact and friendly for use in file names.
@@ -656,7 +656,7 @@ class SpecialSkipListFactory : public MemTableRepFactory {
656
656
  std::string GetId() const override {
657
657
  std::string id = Name();
658
658
  if (num_entries_flush_ > 0) {
659
- id.append(":").append(ROCKSDB_NAMESPACE::ToString(num_entries_flush_));
659
+ id.append(":").append(std::to_string(num_entries_flush_));
660
660
  }
661
661
  return id;
662
662
  }