@nxtedition/rocksdb 6.0.0 → 6.0.3

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 (488) hide show
  1. package/BUILDING.md +18 -0
  2. package/binding.cc +16 -17
  3. package/binding.gyp +2 -2
  4. package/deps/rocksdb/build_version.cc +4 -10
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +26 -3
  6. package/deps/rocksdb/rocksdb/Makefile +73 -91
  7. package/deps/rocksdb/rocksdb/TARGETS +27 -2
  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/cmake/modules/CxxFlags.cmake +7 -0
  14. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  15. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  16. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  17. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  18. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  19. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  20. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  21. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  22. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  23. package/deps/rocksdb/rocksdb/common.mk +30 -0
  24. package/deps/rocksdb/rocksdb/crash_test.mk +3 -3
  25. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +1 -1
  26. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -3
  27. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -7
  28. package/deps/rocksdb/rocksdb/db/builder.cc +22 -7
  29. package/deps/rocksdb/rocksdb/db/c.cc +71 -0
  30. package/deps/rocksdb/rocksdb/db/c_test.c +28 -2
  31. package/deps/rocksdb/rocksdb/db/column_family.cc +12 -5
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +23 -22
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +11 -11
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +2 -2
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +36 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +4 -1
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +3 -2
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +54 -16
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +14 -2
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +3 -3
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +85 -18
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +7 -7
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +23 -22
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1 -1
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +151 -32
  47. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/convenience.cc +8 -6
  49. package/deps/rocksdb/rocksdb/db/corruption_test.cc +209 -38
  50. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +2 -2
  51. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +404 -32
  52. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -25
  53. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +85 -138
  54. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +68 -3
  55. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +38 -13
  56. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +1 -1
  57. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1 -1
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +11 -20
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +15 -1
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +12 -9
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -4
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  63. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +2 -2
  64. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +42 -10
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +54 -23
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +3 -0
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +14 -4
  68. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +26 -18
  69. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +8 -7
  70. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +8 -8
  71. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +6 -3
  72. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +6 -6
  74. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +2 -2
  75. package/deps/rocksdb/rocksdb/db/db_options_test.cc +28 -12
  76. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +16 -15
  77. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +6 -4
  78. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +331 -0
  79. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +11 -6
  80. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +68 -7
  81. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_test.cc +60 -42
  83. package/deps/rocksdb/rocksdb/db/db_test2.cc +244 -111
  84. package/deps/rocksdb/rocksdb/db/db_test_util.cc +101 -19
  85. package/deps/rocksdb/rocksdb/db/db_test_util.h +52 -2
  86. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +1 -1
  87. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +7 -7
  88. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +5 -175
  89. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.cc +96 -0
  90. package/deps/rocksdb/rocksdb/db/db_with_timestamp_test_util.h +126 -0
  91. package/deps/rocksdb/rocksdb/db/db_write_test.cc +6 -6
  92. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  93. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +1 -1
  94. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -8
  95. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  96. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +91 -12
  97. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +16 -2
  98. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +2 -0
  99. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +7 -7
  100. package/deps/rocksdb/rocksdb/db/file_indexer.h +1 -4
  101. package/deps/rocksdb/rocksdb/db/flush_job.cc +28 -15
  102. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -0
  103. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +98 -30
  104. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  105. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +14 -1
  106. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +6 -0
  107. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -12
  108. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -3
  109. package/deps/rocksdb/rocksdb/db/memtable.cc +2 -2
  110. package/deps/rocksdb/rocksdb/db/memtable_list.h +1 -1
  111. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +37 -25
  112. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +1 -1
  113. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +18 -18
  114. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +6 -6
  115. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -1
  116. package/deps/rocksdb/rocksdb/db/repair.cc +13 -2
  117. package/deps/rocksdb/rocksdb/db/repair_test.cc +37 -15
  118. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +1 -2
  119. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +3 -1
  120. package/deps/rocksdb/rocksdb/db/table_cache.cc +20 -130
  121. package/deps/rocksdb/rocksdb/db/table_cache.h +3 -2
  122. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +140 -0
  123. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  124. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +133 -133
  125. package/deps/rocksdb/rocksdb/db/version_edit.cc +22 -2
  126. package/deps/rocksdb/rocksdb/db/version_edit.h +13 -4
  127. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +14 -14
  128. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -214
  129. package/deps/rocksdb/rocksdb/db/version_set.h +14 -3
  130. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +154 -0
  131. package/deps/rocksdb/rocksdb/db/version_set_test.cc +10 -9
  132. package/deps/rocksdb/rocksdb/db/wal_edit.h +2 -1
  133. package/deps/rocksdb/rocksdb/db/wal_manager.cc +2 -3
  134. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -1
  135. package/deps/rocksdb/rocksdb/db/write_batch.cc +178 -30
  136. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +6 -6
  137. package/deps/rocksdb/rocksdb/db/write_controller.h +1 -1
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +0 -2
  139. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -6
  140. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +2 -1
  141. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +4 -3
  142. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +44 -6
  143. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +4 -1
  144. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +0 -10
  145. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +45 -42
  146. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +374 -275
  147. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +53 -3
  148. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +0 -12
  149. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +13 -11
  150. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +276 -109
  151. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +63 -0
  152. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +45 -54
  153. package/deps/rocksdb/rocksdb/env/composite_env.cc +87 -14
  154. package/deps/rocksdb/rocksdb/env/env.cc +0 -60
  155. package/deps/rocksdb/rocksdb/env/env_encryption.cc +9 -0
  156. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +1 -1
  157. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -5
  158. package/deps/rocksdb/rocksdb/env/env_test.cc +18 -5
  159. package/deps/rocksdb/rocksdb/env/fs_posix.cc +17 -12
  160. package/deps/rocksdb/rocksdb/env/io_posix.cc +39 -37
  161. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +9 -9
  162. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +159 -65
  163. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +44 -22
  164. package/deps/rocksdb/rocksdb/file/file_util.h +2 -0
  165. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +142 -17
  166. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -2
  167. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +7 -0
  168. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +60 -40
  169. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -0
  170. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +23 -5
  171. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +49 -1
  172. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +5 -5
  173. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +59 -2
  174. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -0
  175. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -1
  176. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +46 -44
  177. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -1
  178. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +2 -0
  179. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +2 -4
  180. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +3 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +45 -3
  182. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +2 -0
  183. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +4 -1
  184. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  185. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +91 -40
  186. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -2
  187. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +22 -13
  188. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +9 -0
  189. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +4 -0
  190. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +25 -0
  191. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +378 -103
  192. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +14 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  194. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +18 -4
  195. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  196. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +1 -5
  197. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +1 -5
  198. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +6 -8
  199. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -1
  200. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +1 -1
  201. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +5 -3
  202. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +266 -45
  203. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +2 -1
  204. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +1 -4
  205. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +4 -4
  206. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +7 -8
  207. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +2 -2
  208. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -5
  209. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +1 -5
  210. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +2 -2
  211. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -1
  212. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +2 -1
  213. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +1 -1
  214. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +3 -3
  215. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +2 -2
  216. package/deps/rocksdb/rocksdb/options/cf_options.cc +47 -38
  217. package/deps/rocksdb/rocksdb/options/configurable.cc +9 -27
  218. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -1
  219. package/deps/rocksdb/rocksdb/options/customizable.cc +3 -1
  220. package/deps/rocksdb/rocksdb/options/customizable_test.cc +379 -318
  221. package/deps/rocksdb/rocksdb/options/db_options.cc +46 -17
  222. package/deps/rocksdb/rocksdb/options/db_options.h +2 -0
  223. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  224. package/deps/rocksdb/rocksdb/options/options_helper.cc +86 -39
  225. package/deps/rocksdb/rocksdb/options/options_parser.cc +10 -10
  226. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +12 -7
  227. package/deps/rocksdb/rocksdb/options/options_test.cc +222 -68
  228. package/deps/rocksdb/rocksdb/port/port_posix.h +0 -15
  229. package/deps/rocksdb/rocksdb/port/win/env_win.cc +5 -4
  230. package/deps/rocksdb/rocksdb/port/win/env_win.h +2 -2
  231. package/deps/rocksdb/rocksdb/port/win/port_win.h +0 -31
  232. package/deps/rocksdb/rocksdb/rocksdb.pc.in +11 -0
  233. package/deps/rocksdb/rocksdb/src.mk +6 -1
  234. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  235. package/deps/rocksdb/rocksdb/table/block_based/block.cc +4 -2
  236. package/deps/rocksdb/rocksdb/table/block_based/block.h +21 -25
  237. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +3 -4
  238. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +23 -8
  239. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +52 -15
  240. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +81 -7
  241. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +8 -2
  242. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +94 -726
  243. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +21 -15
  244. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +9 -3
  245. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +754 -0
  246. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +44 -73
  247. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +15 -5
  248. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -1
  249. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +2 -11
  250. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +59 -1
  251. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +18 -0
  252. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +33 -17
  253. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +0 -61
  254. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +0 -13
  255. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +2 -1
  256. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +2 -2
  257. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -2
  258. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +2 -1
  259. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -2
  260. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  261. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +8 -4
  262. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +4 -4
  263. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -1
  264. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +65 -7
  265. package/deps/rocksdb/rocksdb/table/block_fetcher.h +2 -0
  266. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +113 -0
  267. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +1 -1
  268. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +1 -1
  269. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -1
  270. package/deps/rocksdb/rocksdb/table/format.cc +22 -20
  271. package/deps/rocksdb/rocksdb/table/iterator.cc +1 -81
  272. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +39 -0
  273. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  274. package/deps/rocksdb/rocksdb/table/multiget_context.h +60 -13
  275. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +0 -3
  276. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +12 -1
  277. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +4 -4
  278. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +2 -1
  279. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +1 -1
  280. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  281. package/deps/rocksdb/rocksdb/table/table_properties.cc +3 -5
  282. package/deps/rocksdb/rocksdb/table/table_reader.h +13 -0
  283. package/deps/rocksdb/rocksdb/table/table_test.cc +202 -78
  284. package/deps/rocksdb/rocksdb/table/unique_id.cc +84 -25
  285. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +37 -4
  286. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -1
  287. package/deps/rocksdb/rocksdb/test_util/testutil.h +11 -8
  288. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +8 -4
  289. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +17 -0
  290. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +11 -9
  291. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  292. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +277 -105
  293. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +4 -4
  294. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +186 -42
  295. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +75 -49
  296. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +9 -8
  297. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +4 -1
  298. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  299. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +26 -4
  300. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  301. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +1 -1
  302. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +72 -0
  303. package/deps/rocksdb/rocksdb/util/async_file_reader.h +144 -0
  304. package/deps/rocksdb/rocksdb/util/autovector_test.cc +4 -4
  305. package/deps/rocksdb/rocksdb/util/bloom_test.cc +14 -8
  306. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -6
  307. package/deps/rocksdb/rocksdb/util/cleanable.cc +180 -0
  308. package/deps/rocksdb/rocksdb/util/comparator.cc +5 -3
  309. package/deps/rocksdb/rocksdb/util/compression.h +56 -7
  310. package/deps/rocksdb/rocksdb/util/coro_utils.h +111 -0
  311. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +148 -0
  312. package/deps/rocksdb/rocksdb/util/filelock_test.cc +2 -2
  313. package/deps/rocksdb/rocksdb/util/filter_bench.cc +12 -4
  314. package/deps/rocksdb/rocksdb/util/heap.h +5 -3
  315. package/deps/rocksdb/rocksdb/util/random.cc +1 -5
  316. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +12 -9
  317. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -1
  318. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1 -1
  319. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +2 -4
  320. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +55 -0
  321. package/deps/rocksdb/rocksdb/util/slice.cc +8 -9
  322. package/deps/rocksdb/rocksdb/util/string_util.cc +3 -2
  323. package/deps/rocksdb/rocksdb/util/string_util.h +0 -13
  324. package/deps/rocksdb/rocksdb/util/thread_local.cc +4 -23
  325. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +99 -22
  326. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +7 -0
  327. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +102 -59
  328. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +38 -36
  329. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -2
  330. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +28 -0
  331. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +3 -0
  332. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  333. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +71 -0
  334. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +71 -0
  335. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -1
  336. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +5 -5
  337. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +3 -3
  338. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -13
  339. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +40 -0
  340. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +10 -8
  341. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +4 -2
  342. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +17 -0
  343. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +7 -7
  344. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +8 -1
  345. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +5 -1
  346. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +21 -15
  347. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +2 -2
  348. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +69 -11
  349. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +22 -9
  350. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +26 -5
  351. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +17 -4
  352. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +19 -16
  353. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +7 -3
  354. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +3 -2
  355. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +2 -2
  356. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +2 -2
  357. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  358. package/deps/rocksdb/rocksdb.gyp +47 -37
  359. package/package-lock.json +23687 -0
  360. package/package.json +2 -30
  361. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  362. package/prebuilds/darwin-x64/node.napi.node +0 -0
  363. package/prebuilds/linux-x64/node.napi.node +0 -0
  364. package/deps/liburing/liburing/README +0 -46
  365. package/deps/liburing/liburing/test/232c93d07b74-test.c +0 -305
  366. package/deps/liburing/liburing/test/35fa71a030ca-test.c +0 -329
  367. package/deps/liburing/liburing/test/500f9fbadef8-test.c +0 -89
  368. package/deps/liburing/liburing/test/7ad0e4b2f83c-test.c +0 -93
  369. package/deps/liburing/liburing/test/8a9973408177-test.c +0 -106
  370. package/deps/liburing/liburing/test/917257daa0fe-test.c +0 -53
  371. package/deps/liburing/liburing/test/Makefile +0 -312
  372. package/deps/liburing/liburing/test/a0908ae19763-test.c +0 -58
  373. package/deps/liburing/liburing/test/a4c0b3decb33-test.c +0 -180
  374. package/deps/liburing/liburing/test/accept-link.c +0 -251
  375. package/deps/liburing/liburing/test/accept-reuse.c +0 -164
  376. package/deps/liburing/liburing/test/accept-test.c +0 -79
  377. package/deps/liburing/liburing/test/accept.c +0 -476
  378. package/deps/liburing/liburing/test/across-fork.c +0 -283
  379. package/deps/liburing/liburing/test/b19062a56726-test.c +0 -53
  380. package/deps/liburing/liburing/test/b5837bd5311d-test.c +0 -77
  381. package/deps/liburing/liburing/test/ce593a6c480a-test.c +0 -135
  382. package/deps/liburing/liburing/test/close-opath.c +0 -122
  383. package/deps/liburing/liburing/test/config +0 -10
  384. package/deps/liburing/liburing/test/connect.c +0 -398
  385. package/deps/liburing/liburing/test/cq-full.c +0 -96
  386. package/deps/liburing/liburing/test/cq-overflow.c +0 -294
  387. package/deps/liburing/liburing/test/cq-peek-batch.c +0 -102
  388. package/deps/liburing/liburing/test/cq-ready.c +0 -94
  389. package/deps/liburing/liburing/test/cq-size.c +0 -58
  390. package/deps/liburing/liburing/test/d4ae271dfaae-test.c +0 -96
  391. package/deps/liburing/liburing/test/d77a67ed5f27-test.c +0 -65
  392. package/deps/liburing/liburing/test/defer.c +0 -307
  393. package/deps/liburing/liburing/test/double-poll-crash.c +0 -186
  394. package/deps/liburing/liburing/test/eeed8b54e0df-test.c +0 -114
  395. package/deps/liburing/liburing/test/empty-eownerdead.c +0 -42
  396. package/deps/liburing/liburing/test/eventfd-disable.c +0 -151
  397. package/deps/liburing/liburing/test/eventfd-ring.c +0 -97
  398. package/deps/liburing/liburing/test/eventfd.c +0 -112
  399. package/deps/liburing/liburing/test/fadvise.c +0 -202
  400. package/deps/liburing/liburing/test/fallocate.c +0 -249
  401. package/deps/liburing/liburing/test/fc2a85cb02ef-test.c +0 -138
  402. package/deps/liburing/liburing/test/file-register.c +0 -843
  403. package/deps/liburing/liburing/test/file-update.c +0 -173
  404. package/deps/liburing/liburing/test/files-exit-hang-poll.c +0 -128
  405. package/deps/liburing/liburing/test/files-exit-hang-timeout.c +0 -134
  406. package/deps/liburing/liburing/test/fixed-link.c +0 -90
  407. package/deps/liburing/liburing/test/fsync.c +0 -224
  408. package/deps/liburing/liburing/test/hardlink.c +0 -136
  409. package/deps/liburing/liburing/test/helpers.c +0 -135
  410. package/deps/liburing/liburing/test/helpers.h +0 -67
  411. package/deps/liburing/liburing/test/io-cancel.c +0 -537
  412. package/deps/liburing/liburing/test/io_uring_enter.c +0 -296
  413. package/deps/liburing/liburing/test/io_uring_register.c +0 -664
  414. package/deps/liburing/liburing/test/io_uring_setup.c +0 -192
  415. package/deps/liburing/liburing/test/iopoll.c +0 -366
  416. package/deps/liburing/liburing/test/lfs-openat-write.c +0 -117
  417. package/deps/liburing/liburing/test/lfs-openat.c +0 -273
  418. package/deps/liburing/liburing/test/link-timeout.c +0 -1107
  419. package/deps/liburing/liburing/test/link.c +0 -496
  420. package/deps/liburing/liburing/test/link_drain.c +0 -229
  421. package/deps/liburing/liburing/test/madvise.c +0 -195
  422. package/deps/liburing/liburing/test/mkdir.c +0 -108
  423. package/deps/liburing/liburing/test/multicqes_drain.c +0 -383
  424. package/deps/liburing/liburing/test/nop-all-sizes.c +0 -107
  425. package/deps/liburing/liburing/test/nop.c +0 -115
  426. package/deps/liburing/liburing/test/open-close.c +0 -146
  427. package/deps/liburing/liburing/test/openat2.c +0 -240
  428. package/deps/liburing/liburing/test/personality.c +0 -204
  429. package/deps/liburing/liburing/test/pipe-eof.c +0 -81
  430. package/deps/liburing/liburing/test/pipe-reuse.c +0 -105
  431. package/deps/liburing/liburing/test/poll-cancel-ton.c +0 -139
  432. package/deps/liburing/liburing/test/poll-cancel.c +0 -135
  433. package/deps/liburing/liburing/test/poll-link.c +0 -227
  434. package/deps/liburing/liburing/test/poll-many.c +0 -208
  435. package/deps/liburing/liburing/test/poll-mshot-update.c +0 -273
  436. package/deps/liburing/liburing/test/poll-ring.c +0 -48
  437. package/deps/liburing/liburing/test/poll-v-poll.c +0 -353
  438. package/deps/liburing/liburing/test/poll.c +0 -109
  439. package/deps/liburing/liburing/test/probe.c +0 -137
  440. package/deps/liburing/liburing/test/read-write.c +0 -876
  441. package/deps/liburing/liburing/test/register-restrictions.c +0 -633
  442. package/deps/liburing/liburing/test/rename.c +0 -134
  443. package/deps/liburing/liburing/test/ring-leak.c +0 -173
  444. package/deps/liburing/liburing/test/ring-leak2.c +0 -249
  445. package/deps/liburing/liburing/test/rsrc_tags.c +0 -449
  446. package/deps/liburing/liburing/test/runtests-loop.sh +0 -16
  447. package/deps/liburing/liburing/test/runtests.sh +0 -170
  448. package/deps/liburing/liburing/test/rw_merge_test.c +0 -97
  449. package/deps/liburing/liburing/test/self.c +0 -91
  450. package/deps/liburing/liburing/test/send_recv.c +0 -291
  451. package/deps/liburing/liburing/test/send_recvmsg.c +0 -345
  452. package/deps/liburing/liburing/test/sendmsg_fs_cve.c +0 -198
  453. package/deps/liburing/liburing/test/shared-wq.c +0 -84
  454. package/deps/liburing/liburing/test/short-read.c +0 -75
  455. package/deps/liburing/liburing/test/shutdown.c +0 -163
  456. package/deps/liburing/liburing/test/sigfd-deadlock.c +0 -74
  457. package/deps/liburing/liburing/test/socket-rw-eagain.c +0 -156
  458. package/deps/liburing/liburing/test/socket-rw.c +0 -147
  459. package/deps/liburing/liburing/test/splice.c +0 -511
  460. package/deps/liburing/liburing/test/sq-full-cpp.cc +0 -45
  461. package/deps/liburing/liburing/test/sq-full.c +0 -45
  462. package/deps/liburing/liburing/test/sq-poll-dup.c +0 -200
  463. package/deps/liburing/liburing/test/sq-poll-kthread.c +0 -168
  464. package/deps/liburing/liburing/test/sq-poll-share.c +0 -137
  465. package/deps/liburing/liburing/test/sq-space_left.c +0 -159
  466. package/deps/liburing/liburing/test/sqpoll-cancel-hang.c +0 -159
  467. package/deps/liburing/liburing/test/sqpoll-disable-exit.c +0 -195
  468. package/deps/liburing/liburing/test/sqpoll-exit-hang.c +0 -77
  469. package/deps/liburing/liburing/test/sqpoll-sleep.c +0 -68
  470. package/deps/liburing/liburing/test/statx.c +0 -172
  471. package/deps/liburing/liburing/test/stdout.c +0 -232
  472. package/deps/liburing/liburing/test/submit-link-fail.c +0 -154
  473. package/deps/liburing/liburing/test/submit-reuse.c +0 -239
  474. package/deps/liburing/liburing/test/symlink.c +0 -116
  475. package/deps/liburing/liburing/test/teardowns.c +0 -58
  476. package/deps/liburing/liburing/test/thread-exit.c +0 -131
  477. package/deps/liburing/liburing/test/timeout-new.c +0 -246
  478. package/deps/liburing/liburing/test/timeout-overflow.c +0 -204
  479. package/deps/liburing/liburing/test/timeout.c +0 -1354
  480. package/deps/liburing/liburing/test/unlink.c +0 -111
  481. package/deps/liburing/liburing/test/wakeup-hang.c +0 -162
  482. package/deps/rocksdb/rocksdb/README.md +0 -32
  483. package/deps/rocksdb/rocksdb/microbench/README.md +0 -60
  484. package/deps/rocksdb/rocksdb/plugin/README.md +0 -43
  485. package/deps/rocksdb/rocksdb/port/README +0 -10
  486. package/deps/rocksdb/rocksdb/python.mk +0 -9
  487. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  488. package/prebuilds/linux-arm64/node.napi.node +0 -0
@@ -0,0 +1,511 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #include "cache/fast_lru_cache.h"
11
+
12
+ #include <cassert>
13
+ #include <cstdint>
14
+ #include <cstdio>
15
+
16
+ #include "monitoring/perf_context_imp.h"
17
+ #include "monitoring/statistics.h"
18
+ #include "port/lang.h"
19
+ #include "util/mutexlock.h"
20
+
21
+ namespace ROCKSDB_NAMESPACE {
22
+
23
+ namespace fast_lru_cache {
24
+
25
+ LRUHandleTable::LRUHandleTable(int max_upper_hash_bits)
26
+ : length_bits_(/* historical starting size*/ 4),
27
+ list_(new LRUHandle* [size_t{1} << length_bits_] {}),
28
+ elems_(0),
29
+ max_length_bits_(max_upper_hash_bits) {}
30
+
31
+ LRUHandleTable::~LRUHandleTable() {
32
+ ApplyToEntriesRange(
33
+ [](LRUHandle* h) {
34
+ if (!h->HasRefs()) {
35
+ h->Free();
36
+ }
37
+ },
38
+ 0, uint32_t{1} << length_bits_);
39
+ }
40
+
41
+ LRUHandle* LRUHandleTable::Lookup(const Slice& key, uint32_t hash) {
42
+ return *FindPointer(key, hash);
43
+ }
44
+
45
+ LRUHandle* LRUHandleTable::Insert(LRUHandle* h) {
46
+ LRUHandle** ptr = FindPointer(h->key(), h->hash);
47
+ LRUHandle* old = *ptr;
48
+ h->next_hash = (old == nullptr ? nullptr : old->next_hash);
49
+ *ptr = h;
50
+ if (old == nullptr) {
51
+ ++elems_;
52
+ if ((elems_ >> length_bits_) > 0) { // elems_ >= length
53
+ // Since each cache entry is fairly large, we aim for a small
54
+ // average linked list length (<= 1).
55
+ Resize();
56
+ }
57
+ }
58
+ return old;
59
+ }
60
+
61
+ LRUHandle* LRUHandleTable::Remove(const Slice& key, uint32_t hash) {
62
+ LRUHandle** ptr = FindPointer(key, hash);
63
+ LRUHandle* result = *ptr;
64
+ if (result != nullptr) {
65
+ *ptr = result->next_hash;
66
+ --elems_;
67
+ }
68
+ return result;
69
+ }
70
+
71
+ LRUHandle** LRUHandleTable::FindPointer(const Slice& key, uint32_t hash) {
72
+ LRUHandle** ptr = &list_[hash >> (32 - length_bits_)];
73
+ while (*ptr != nullptr && ((*ptr)->hash != hash || key != (*ptr)->key())) {
74
+ ptr = &(*ptr)->next_hash;
75
+ }
76
+ return ptr;
77
+ }
78
+
79
+ void LRUHandleTable::Resize() {
80
+ if (length_bits_ >= max_length_bits_) {
81
+ // Due to reaching limit of hash information, if we made the table bigger,
82
+ // we would allocate more addresses but only the same number would be used.
83
+ return;
84
+ }
85
+ if (length_bits_ >= 31) {
86
+ // Avoid undefined behavior shifting uint32_t by 32.
87
+ return;
88
+ }
89
+
90
+ uint32_t old_length = uint32_t{1} << length_bits_;
91
+ int new_length_bits = length_bits_ + 1;
92
+ std::unique_ptr<LRUHandle* []> new_list {
93
+ new LRUHandle* [size_t{1} << new_length_bits] {}
94
+ };
95
+ uint32_t count = 0;
96
+ for (uint32_t i = 0; i < old_length; i++) {
97
+ LRUHandle* h = list_[i];
98
+ while (h != nullptr) {
99
+ LRUHandle* next = h->next_hash;
100
+ uint32_t hash = h->hash;
101
+ LRUHandle** ptr = &new_list[hash >> (32 - new_length_bits)];
102
+ h->next_hash = *ptr;
103
+ *ptr = h;
104
+ h = next;
105
+ count++;
106
+ }
107
+ }
108
+ assert(elems_ == count);
109
+ list_ = std::move(new_list);
110
+ length_bits_ = new_length_bits;
111
+ }
112
+
113
+ LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
114
+ CacheMetadataChargePolicy metadata_charge_policy,
115
+ int max_upper_hash_bits)
116
+ : capacity_(0),
117
+ strict_capacity_limit_(strict_capacity_limit),
118
+ table_(max_upper_hash_bits),
119
+ usage_(0),
120
+ lru_usage_(0) {
121
+ set_metadata_charge_policy(metadata_charge_policy);
122
+ // Make empty circular linked list.
123
+ lru_.next = &lru_;
124
+ lru_.prev = &lru_;
125
+ lru_low_pri_ = &lru_;
126
+ SetCapacity(capacity);
127
+ }
128
+
129
+ void LRUCacheShard::EraseUnRefEntries() {
130
+ autovector<LRUHandle*> last_reference_list;
131
+ {
132
+ MutexLock l(&mutex_);
133
+ while (lru_.next != &lru_) {
134
+ LRUHandle* old = lru_.next;
135
+ // LRU list contains only elements which can be evicted.
136
+ assert(old->InCache() && !old->HasRefs());
137
+ LRU_Remove(old);
138
+ table_.Remove(old->key(), old->hash);
139
+ old->SetInCache(false);
140
+ size_t total_charge = old->CalcTotalCharge(metadata_charge_policy_);
141
+ assert(usage_ >= total_charge);
142
+ usage_ -= total_charge;
143
+ last_reference_list.push_back(old);
144
+ }
145
+ }
146
+
147
+ // Free the entries here outside of mutex for performance reasons.
148
+ for (auto entry : last_reference_list) {
149
+ entry->Free();
150
+ }
151
+ }
152
+
153
+ void LRUCacheShard::ApplyToSomeEntries(
154
+ const std::function<void(const Slice& key, void* value, size_t charge,
155
+ DeleterFn deleter)>& callback,
156
+ uint32_t average_entries_per_lock, uint32_t* state) {
157
+ // The state is essentially going to be the starting hash, which works
158
+ // nicely even if we resize between calls because we use upper-most
159
+ // hash bits for table indexes.
160
+ MutexLock l(&mutex_);
161
+ uint32_t length_bits = table_.GetLengthBits();
162
+ uint32_t length = uint32_t{1} << length_bits;
163
+
164
+ assert(average_entries_per_lock > 0);
165
+ // Assuming we are called with same average_entries_per_lock repeatedly,
166
+ // this simplifies some logic (index_end will not overflow).
167
+ assert(average_entries_per_lock < length || *state == 0);
168
+
169
+ uint32_t index_begin = *state >> (32 - length_bits);
170
+ uint32_t index_end = index_begin + average_entries_per_lock;
171
+ if (index_end >= length) {
172
+ // Going to end
173
+ index_end = length;
174
+ *state = UINT32_MAX;
175
+ } else {
176
+ *state = index_end << (32 - length_bits);
177
+ }
178
+
179
+ table_.ApplyToEntriesRange(
180
+ [callback](LRUHandle* h) {
181
+ callback(h->key(), h->value, h->charge, h->deleter);
182
+ },
183
+ index_begin, index_end);
184
+ }
185
+
186
+ void LRUCacheShard::LRU_Remove(LRUHandle* e) {
187
+ assert(e->next != nullptr);
188
+ assert(e->prev != nullptr);
189
+ e->next->prev = e->prev;
190
+ e->prev->next = e->next;
191
+ e->prev = e->next = nullptr;
192
+ size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
193
+ assert(lru_usage_ >= total_charge);
194
+ lru_usage_ -= total_charge;
195
+ }
196
+
197
+ void LRUCacheShard::LRU_Insert(LRUHandle* e) {
198
+ assert(e->next == nullptr);
199
+ assert(e->prev == nullptr);
200
+ size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
201
+ // Inset "e" to head of LRU list.
202
+ e->next = &lru_;
203
+ e->prev = lru_.prev;
204
+ e->prev->next = e;
205
+ e->next->prev = e;
206
+ lru_usage_ += total_charge;
207
+ }
208
+
209
+ void LRUCacheShard::EvictFromLRU(size_t charge,
210
+ autovector<LRUHandle*>* deleted) {
211
+ while ((usage_ + charge) > capacity_ && lru_.next != &lru_) {
212
+ LRUHandle* old = lru_.next;
213
+ // LRU list contains only elements which can be evicted.
214
+ assert(old->InCache() && !old->HasRefs());
215
+ LRU_Remove(old);
216
+ table_.Remove(old->key(), old->hash);
217
+ old->SetInCache(false);
218
+ size_t old_total_charge = old->CalcTotalCharge(metadata_charge_policy_);
219
+ assert(usage_ >= old_total_charge);
220
+ usage_ -= old_total_charge;
221
+ deleted->push_back(old);
222
+ }
223
+ }
224
+
225
+ void LRUCacheShard::SetCapacity(size_t capacity) {
226
+ autovector<LRUHandle*> last_reference_list;
227
+ {
228
+ MutexLock l(&mutex_);
229
+ capacity_ = capacity;
230
+ EvictFromLRU(0, &last_reference_list);
231
+ }
232
+
233
+ // Free the entries here outside of mutex for performance reasons.
234
+ for (auto entry : last_reference_list) {
235
+ entry->Free();
236
+ }
237
+ }
238
+
239
+ void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
240
+ MutexLock l(&mutex_);
241
+ strict_capacity_limit_ = strict_capacity_limit;
242
+ }
243
+
244
+ Status LRUCacheShard::InsertItem(LRUHandle* e, Cache::Handle** handle,
245
+ bool free_handle_on_fail) {
246
+ Status s = Status::OK();
247
+ autovector<LRUHandle*> last_reference_list;
248
+ size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
249
+
250
+ {
251
+ MutexLock l(&mutex_);
252
+
253
+ // Free the space following strict LRU policy until enough space
254
+ // is freed or the lru list is empty.
255
+ EvictFromLRU(total_charge, &last_reference_list);
256
+
257
+ if ((usage_ + total_charge) > capacity_ &&
258
+ (strict_capacity_limit_ || handle == nullptr)) {
259
+ e->SetInCache(false);
260
+ if (handle == nullptr) {
261
+ // Don't insert the entry but still return ok, as if the entry inserted
262
+ // into cache and get evicted immediately.
263
+ last_reference_list.push_back(e);
264
+ } else {
265
+ if (free_handle_on_fail) {
266
+ delete[] reinterpret_cast<char*>(e);
267
+ *handle = nullptr;
268
+ }
269
+ s = Status::Incomplete("Insert failed due to LRU cache being full.");
270
+ }
271
+ } else {
272
+ // Insert into the cache. Note that the cache might get larger than its
273
+ // capacity if not enough space was freed up.
274
+ LRUHandle* old = table_.Insert(e);
275
+ usage_ += total_charge;
276
+ if (old != nullptr) {
277
+ s = Status::OkOverwritten();
278
+ assert(old->InCache());
279
+ old->SetInCache(false);
280
+ if (!old->HasRefs()) {
281
+ // old is on LRU because it's in cache and its reference count is 0.
282
+ LRU_Remove(old);
283
+ size_t old_total_charge =
284
+ old->CalcTotalCharge(metadata_charge_policy_);
285
+ assert(usage_ >= old_total_charge);
286
+ usage_ -= old_total_charge;
287
+ last_reference_list.push_back(old);
288
+ }
289
+ }
290
+ if (handle == nullptr) {
291
+ LRU_Insert(e);
292
+ } else {
293
+ // If caller already holds a ref, no need to take one here.
294
+ if (!e->HasRefs()) {
295
+ e->Ref();
296
+ }
297
+ *handle = reinterpret_cast<Cache::Handle*>(e);
298
+ }
299
+ }
300
+ }
301
+
302
+ // Free the entries here outside of mutex for performance reasons.
303
+ for (auto entry : last_reference_list) {
304
+ entry->Free();
305
+ }
306
+
307
+ return s;
308
+ }
309
+
310
+ Cache::Handle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash) {
311
+ LRUHandle* e = nullptr;
312
+ {
313
+ MutexLock l(&mutex_);
314
+ e = table_.Lookup(key, hash);
315
+ if (e != nullptr) {
316
+ assert(e->InCache());
317
+ if (!e->HasRefs()) {
318
+ // The entry is in LRU since it's in hash and has no external references
319
+ LRU_Remove(e);
320
+ }
321
+ e->Ref();
322
+ }
323
+ }
324
+ return reinterpret_cast<Cache::Handle*>(e);
325
+ }
326
+
327
+ bool LRUCacheShard::Ref(Cache::Handle* h) {
328
+ LRUHandle* e = reinterpret_cast<LRUHandle*>(h);
329
+ MutexLock l(&mutex_);
330
+ // To create another reference - entry must be already externally referenced.
331
+ assert(e->HasRefs());
332
+ e->Ref();
333
+ return true;
334
+ }
335
+
336
+ bool LRUCacheShard::Release(Cache::Handle* handle, bool erase_if_last_ref) {
337
+ if (handle == nullptr) {
338
+ return false;
339
+ }
340
+ LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
341
+ bool last_reference = false;
342
+ {
343
+ MutexLock l(&mutex_);
344
+ last_reference = e->Unref();
345
+ if (last_reference && e->InCache()) {
346
+ // The item is still in cache, and nobody else holds a reference to it.
347
+ if (usage_ > capacity_ || erase_if_last_ref) {
348
+ // The LRU list must be empty since the cache is full.
349
+ assert(lru_.next == &lru_ || erase_if_last_ref);
350
+ // Take this opportunity and remove the item.
351
+ table_.Remove(e->key(), e->hash);
352
+ e->SetInCache(false);
353
+ } else {
354
+ // Put the item back on the LRU list, and don't free it.
355
+ LRU_Insert(e);
356
+ last_reference = false;
357
+ }
358
+ }
359
+ // If it was the last reference, then decrement the cache usage.
360
+ if (last_reference) {
361
+ size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
362
+ assert(usage_ >= total_charge);
363
+ usage_ -= total_charge;
364
+ }
365
+ }
366
+
367
+ // Free the entry here outside of mutex for performance reasons.
368
+ if (last_reference) {
369
+ e->Free();
370
+ }
371
+ return last_reference;
372
+ }
373
+
374
+ Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
375
+ size_t charge, Cache::DeleterFn deleter,
376
+ Cache::Handle** handle,
377
+ Cache::Priority /*priority*/) {
378
+ // Allocate the memory here outside of the mutex.
379
+ // If the cache is full, we'll have to release it.
380
+ // It shouldn't happen very often though.
381
+ LRUHandle* e = reinterpret_cast<LRUHandle*>(
382
+ new char[sizeof(LRUHandle) - 1 + key.size()]);
383
+
384
+ e->value = value;
385
+ e->flags = 0;
386
+ e->deleter = deleter;
387
+ e->charge = charge;
388
+ e->key_length = key.size();
389
+ e->hash = hash;
390
+ e->refs = 0;
391
+ e->next = e->prev = nullptr;
392
+ e->SetInCache(true);
393
+ memcpy(e->key_data, key.data(), key.size());
394
+
395
+ return InsertItem(e, handle, /* free_handle_on_fail */ true);
396
+ }
397
+
398
+ void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {
399
+ LRUHandle* e;
400
+ bool last_reference = false;
401
+ {
402
+ MutexLock l(&mutex_);
403
+ e = table_.Remove(key, hash);
404
+ if (e != nullptr) {
405
+ assert(e->InCache());
406
+ e->SetInCache(false);
407
+ if (!e->HasRefs()) {
408
+ // The entry is in LRU since it's in hash and has no external references
409
+ LRU_Remove(e);
410
+ size_t total_charge = e->CalcTotalCharge(metadata_charge_policy_);
411
+ assert(usage_ >= total_charge);
412
+ usage_ -= total_charge;
413
+ last_reference = true;
414
+ }
415
+ }
416
+ }
417
+
418
+ // Free the entry here outside of mutex for performance reasons.
419
+ // last_reference will only be true if e != nullptr.
420
+ if (last_reference) {
421
+ e->Free();
422
+ }
423
+ }
424
+
425
+ size_t LRUCacheShard::GetUsage() const {
426
+ MutexLock l(&mutex_);
427
+ return usage_;
428
+ }
429
+
430
+ size_t LRUCacheShard::GetPinnedUsage() const {
431
+ MutexLock l(&mutex_);
432
+ assert(usage_ >= lru_usage_);
433
+ return usage_ - lru_usage_;
434
+ }
435
+
436
+ std::string LRUCacheShard::GetPrintableOptions() const { return std::string{}; }
437
+
438
+ LRUCache::LRUCache(size_t capacity, int num_shard_bits,
439
+ bool strict_capacity_limit,
440
+ CacheMetadataChargePolicy metadata_charge_policy)
441
+ : ShardedCache(capacity, num_shard_bits, strict_capacity_limit) {
442
+ num_shards_ = 1 << num_shard_bits;
443
+ shards_ = reinterpret_cast<LRUCacheShard*>(
444
+ port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));
445
+ size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;
446
+ for (int i = 0; i < num_shards_; i++) {
447
+ new (&shards_[i])
448
+ LRUCacheShard(per_shard, strict_capacity_limit, metadata_charge_policy,
449
+ /* max_upper_hash_bits */ 32 - num_shard_bits);
450
+ }
451
+ }
452
+
453
+ LRUCache::~LRUCache() {
454
+ if (shards_ != nullptr) {
455
+ assert(num_shards_ > 0);
456
+ for (int i = 0; i < num_shards_; i++) {
457
+ shards_[i].~LRUCacheShard();
458
+ }
459
+ port::cacheline_aligned_free(shards_);
460
+ }
461
+ }
462
+
463
+ CacheShard* LRUCache::GetShard(uint32_t shard) {
464
+ return reinterpret_cast<CacheShard*>(&shards_[shard]);
465
+ }
466
+
467
+ const CacheShard* LRUCache::GetShard(uint32_t shard) const {
468
+ return reinterpret_cast<CacheShard*>(&shards_[shard]);
469
+ }
470
+
471
+ void* LRUCache::Value(Handle* handle) {
472
+ return reinterpret_cast<const LRUHandle*>(handle)->value;
473
+ }
474
+
475
+ size_t LRUCache::GetCharge(Handle* handle) const {
476
+ return reinterpret_cast<const LRUHandle*>(handle)->charge;
477
+ }
478
+
479
+ Cache::DeleterFn LRUCache::GetDeleter(Handle* handle) const {
480
+ auto h = reinterpret_cast<const LRUHandle*>(handle);
481
+ return h->deleter;
482
+ }
483
+
484
+ uint32_t LRUCache::GetHash(Handle* handle) const {
485
+ return reinterpret_cast<const LRUHandle*>(handle)->hash;
486
+ }
487
+
488
+ void LRUCache::DisownData() {
489
+ // Leak data only if that won't generate an ASAN/valgrind warning.
490
+ if (!kMustFreeHeapAllocations) {
491
+ shards_ = nullptr;
492
+ num_shards_ = 0;
493
+ }
494
+ }
495
+
496
+ } // namespace fast_lru_cache
497
+
498
+ std::shared_ptr<Cache> NewFastLRUCache(
499
+ size_t capacity, int num_shard_bits, bool strict_capacity_limit,
500
+ CacheMetadataChargePolicy metadata_charge_policy) {
501
+ if (num_shard_bits >= 20) {
502
+ return nullptr; // The cache cannot be sharded into too many fine pieces.
503
+ }
504
+ if (num_shard_bits < 0) {
505
+ num_shard_bits = GetDefaultCacheShardBits(capacity);
506
+ }
507
+ return std::make_shared<fast_lru_cache::LRUCache>(
508
+ capacity, num_shard_bits, strict_capacity_limit, metadata_charge_policy);
509
+ }
510
+
511
+ } // namespace ROCKSDB_NAMESPACE