@nxtedition/rocksdb 5.2.17 → 5.2.27

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 (925) hide show
  1. package/binding.cc +366 -783
  2. package/binding.gyp +78 -69
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -443
  857. package/deps/snappy/snappy.gyp +4 -1
  858. package/index.js +5 -87
  859. package/package-lock.json +23687 -0
  860. package/package.json +8 -9
  861. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  862. package/prebuilds/darwin-x64/node.napi.node +0 -0
  863. package/prebuilds/linux-x64/node.napi.node +0 -0
  864. package/deps/rocksdb/rocksdb/README.md +0 -32
  865. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  866. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  867. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  870. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  871. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  872. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  873. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  874. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  875. package/deps/rocksdb/rocksdb/port/README +0 -10
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  916. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  917. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  918. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  919. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  920. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  921. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  922. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  923. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  924. package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
  925. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
package/binding.cc CHANGED
@@ -16,10 +16,12 @@
16
16
 
17
17
  namespace leveldb = rocksdb;
18
18
 
19
+ #include <array>
19
20
  #include <set>
20
21
  #include <memory>
21
22
  #include <string>
22
23
  #include <vector>
24
+ #include <optional>
23
25
 
24
26
  class NullLogger : public rocksdb::Logger {
25
27
  public:
@@ -30,7 +32,6 @@ public:
30
32
 
31
33
  struct Database;
32
34
  struct Iterator;
33
- static void iterator_do_close (napi_env env, Iterator* iterator, napi_value cb);
34
35
 
35
36
  #define NAPI_DB_CONTEXT() \
36
37
  Database* database = nullptr; \
@@ -41,7 +42,7 @@ static void iterator_do_close (napi_env env, Iterator* iterator, napi_value cb);
41
42
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&iterator));
42
43
 
43
44
  #define NAPI_BATCH_CONTEXT() \
44
- leveldb::WriteBatch* batch = nullptr; \
45
+ rocksdb::WriteBatch* batch = nullptr; \
45
46
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&batch));
46
47
 
47
48
  static bool IsString (napi_env env, napi_value value) {
@@ -62,7 +63,7 @@ static bool IsObject (napi_env env, napi_value value) {
62
63
  return type == napi_object;
63
64
  }
64
65
 
65
- static napi_value CreateError (napi_env env, const std::string& str) {
66
+ static napi_value CreateError (napi_env env, const std::string_view& str) {
66
67
  napi_value msg;
67
68
  napi_create_string_utf8(env, str.data(), str.size(), &msg);
68
69
  napi_value error;
@@ -70,7 +71,7 @@ static napi_value CreateError (napi_env env, const std::string& str) {
70
71
  return error;
71
72
  }
72
73
 
73
- static napi_value CreateCodeError (napi_env env, const std::string& code, const std::string& msg) {
74
+ static napi_value CreateCodeError (napi_env env, const std::string_view& code, const std::string_view& msg) {
74
75
  napi_value codeValue;
75
76
  napi_create_string_utf8(env, code.data(), code.size(), &codeValue);
76
77
  napi_value msgValue;
@@ -80,20 +81,19 @@ static napi_value CreateCodeError (napi_env env, const std::string& code, const
80
81
  return error;
81
82
  }
82
83
 
83
- static bool HasProperty (napi_env env, napi_value obj, const std::string& key) {
84
+ static bool HasProperty (napi_env env, napi_value obj, const std::string_view& key) {
84
85
  bool has = false;
85
86
  napi_has_named_property(env, obj, key.data(), &has);
86
87
  return has;
87
88
  }
88
89
 
89
- static napi_value GetProperty (napi_env env, napi_value obj, const std::string& key) {
90
+ static napi_value GetProperty (napi_env env, napi_value obj, const std::string_view& key) {
90
91
  napi_value value;
91
92
  napi_get_named_property(env, obj, key.data(), &value);
92
93
  return value;
93
94
  }
94
95
 
95
- static bool BooleanProperty (napi_env env, napi_value obj, const std::string& key,
96
- bool defaultValue) {
96
+ static bool BooleanProperty (napi_env env, napi_value obj, const std::string_view& key, bool defaultValue) {
97
97
  if (HasProperty(env, obj, key.data())) {
98
98
  const auto value = GetProperty(env, obj, key.data());
99
99
  bool result;
@@ -104,7 +104,7 @@ static bool BooleanProperty (napi_env env, napi_value obj, const std::string& ke
104
104
  return defaultValue;
105
105
  }
106
106
 
107
- static bool EncodingIsBuffer (napi_env env, napi_value obj, const std::string& option) {
107
+ static bool EncodingIsBuffer (napi_env env, napi_value obj, const std::string_view& option) {
108
108
  napi_value value;
109
109
  size_t size;
110
110
 
@@ -117,8 +117,7 @@ static bool EncodingIsBuffer (napi_env env, napi_value obj, const std::string& o
117
117
  return false;
118
118
  }
119
119
 
120
- static uint32_t Uint32Property (napi_env env, napi_value obj, const std::string& key,
121
- uint32_t defaultValue) {
120
+ static uint32_t Uint32Property (napi_env env, napi_value obj, const std::string_view& key, uint32_t defaultValue) {
122
121
  if (HasProperty(env, obj, key.data())) {
123
122
  const auto value = GetProperty(env, obj, key.data());
124
123
  uint32_t result;
@@ -129,8 +128,7 @@ static uint32_t Uint32Property (napi_env env, napi_value obj, const std::string&
129
128
  return defaultValue;
130
129
  }
131
130
 
132
- static int Int32Property (napi_env env, napi_value obj, const std::string& key,
133
- int defaultValue) {
131
+ static int Int32Property (napi_env env, napi_value obj, const std::string_view& key, int defaultValue) {
134
132
  if (HasProperty(env, obj, key.data())) {
135
133
  const auto value = GetProperty(env, obj, key.data());
136
134
  int result;
@@ -146,7 +144,7 @@ static std::string ToString (napi_env env, napi_value from, const std::string& d
146
144
  size_t length = 0;
147
145
  napi_get_value_string_utf8(env, from, nullptr, 0, &length);
148
146
  std::string value(length, '\0');
149
- napi_get_value_string_utf8( env, from, &value[0], value.length() + 1, &length);
147
+ napi_get_value_string_utf8(env, from, &value[0], value.length() + 1, &length);
150
148
  return value;
151
149
  } else if (IsBuffer(env, from)) {
152
150
  char* buf = nullptr;
@@ -158,7 +156,7 @@ static std::string ToString (napi_env env, napi_value from, const std::string& d
158
156
  return defaultValue;
159
157
  }
160
158
 
161
- static std::string StringProperty (napi_env env, napi_value obj, const std::string& key) {
159
+ static std::string StringProperty (napi_env env, napi_value obj, const std::string_view& key, const std::string& defaultValue = "") {
162
160
  if (HasProperty(env, obj, key)) {
163
161
  napi_value value = GetProperty(env, obj, key);
164
162
  if (IsString(env, value)) {
@@ -166,7 +164,7 @@ static std::string StringProperty (napi_env env, napi_value obj, const std::stri
166
164
  }
167
165
  }
168
166
 
169
- return "";
167
+ return defaultValue;
170
168
  }
171
169
 
172
170
  static size_t StringOrBufferLength (napi_env env, napi_value value) {
@@ -182,13 +180,13 @@ static size_t StringOrBufferLength (napi_env env, napi_value value) {
182
180
  return size;
183
181
  }
184
182
 
185
- static std::string* RangeOption (napi_env env, napi_value opts, const std::string& name) {
183
+ static std::optional<std::string> RangeOption (napi_env env, napi_value opts, const std::string_view& name) {
186
184
  if (HasProperty(env, opts, name)) {
187
185
  const auto value = GetProperty(env, opts, name);
188
- return new std::string(ToString(env, value));
186
+ return std::string(ToString(env, value));
189
187
  }
190
188
 
191
- return nullptr;
189
+ return {};
192
190
  }
193
191
 
194
192
  static std::vector<std::string> KeyArray (napi_env env, napi_value arr) {
@@ -211,15 +209,38 @@ static std::vector<std::string> KeyArray (napi_env env, napi_value arr) {
211
209
  return result;
212
210
  }
213
211
 
214
- static napi_status CallFunction (napi_env env,
215
- napi_value callback,
216
- const int argc,
217
- napi_value* argv) {
212
+ static napi_status CallFunction (napi_env env, napi_value callback, const int argc, napi_value* argv) {
218
213
  napi_value global;
219
214
  napi_get_global(env, &global);
220
215
  return napi_call_function(env, global, callback, argc, argv, nullptr);
221
216
  }
222
217
 
218
+ static napi_value ToError(napi_env env, const rocksdb::Status& status) {
219
+ if (status.ok()) {
220
+ return 0;
221
+ }
222
+
223
+ const auto msg = status.ToString();
224
+
225
+ if (status.IsNotFound()) {
226
+ return CreateCodeError(env, "LEVEL_NOT_FOUND", msg);
227
+ } else if (status.IsCorruption()) {
228
+ return CreateCodeError(env, "LEVEL_CORRUPTION", msg);
229
+ } else if (status.IsIOError()) {
230
+ if (msg.find("IO error: lock ") != std::string::npos) { // env_posix.cc
231
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
232
+ } else if (msg.find("IO error: LockFile ") != std::string::npos) { // env_win.cc
233
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
234
+ } else if (msg.find("IO error: While lock file") != std::string::npos) { // env_mac.cc
235
+ return CreateCodeError(env, "LEVEL_LOCKED", msg);
236
+ } else {
237
+ return CreateCodeError(env, "LEVEL_IO_ERROR", msg);
238
+ }
239
+ }
240
+
241
+ return CreateError(env, msg);
242
+ }
243
+
223
244
  template <typename T>
224
245
  void Convert (napi_env env, const T& s, bool asBuffer, napi_value& result) {
225
246
  if (asBuffer) {
@@ -229,106 +250,98 @@ void Convert (napi_env env, const T& s, bool asBuffer, napi_value& result) {
229
250
  }
230
251
  }
231
252
 
253
+ struct NapiSlice : public rocksdb::Slice {
254
+ NapiSlice (napi_env env, napi_value from) {
255
+ if (IsString(env, from)) {
256
+ napi_get_value_string_utf8(env, from, nullptr, 0, &size_);
257
+ char* data;
258
+ if (size_ + 1 < stack_.size()) {
259
+ data = stack_.data();
260
+ } else {
261
+ heap_.reset(new char[size_ + 1]);
262
+ data = heap_.get();
263
+ }
264
+ data[size_] = 0;
265
+ napi_get_value_string_utf8(env, from, data, size_ + 1, &size_);
266
+ data_ = data;
267
+ } else if (IsBuffer(env, from)) {
268
+ void* data;
269
+ napi_get_buffer_info(env, from, &data, &size_);
270
+ data_ = static_cast<char*>(data);
271
+ }
272
+ }
273
+
274
+ std::unique_ptr<char[]> heap_;
275
+ std::array<char, 8192> stack_;
276
+ };
277
+
232
278
  /**
233
279
  * Base worker class. Handles the async work. Derived classes can override the
234
280
  * following virtual methods (listed in the order in which they're called):
235
281
  *
236
- * - DoExecute (abstract, worker pool thread): main work
237
- * - HandleOKCallback (main thread): call JS callback on success
238
- * - HandleErrorCallback (main thread): call JS callback on error
239
- * - DoFinally (main thread): do cleanup regardless of success
282
+ * - Execute (abstract, worker pool thread): main work
283
+ * - OnOk (main thread): call JS callback on success
284
+ * - OnError (main thread): call JS callback on error
285
+ * - Destroy (main thread): do cleanup regardless of success
240
286
  */
241
287
  struct BaseWorker {
242
- // Note: storing env is discouraged as we'd end up using it in unsafe places.
243
288
  BaseWorker (napi_env env,
244
289
  Database* database,
245
290
  napi_value callback,
246
- const char* resourceName)
291
+ const std::string& resourceName)
247
292
  : database_(database) {
248
293
  NAPI_STATUS_THROWS_VOID(napi_create_reference(env, callback, 1, &callbackRef_));
249
294
  napi_value asyncResourceName;
250
- NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env, resourceName,
251
- NAPI_AUTO_LENGTH,
252
- &asyncResourceName));
295
+ NAPI_STATUS_THROWS_VOID(napi_create_string_utf8(env, resourceName.data(),
296
+ NAPI_AUTO_LENGTH,
297
+ &asyncResourceName));
253
298
  NAPI_STATUS_THROWS_VOID(napi_create_async_work(env, callback,
254
- asyncResourceName,
255
- BaseWorker::Execute,
256
- BaseWorker::Complete,
257
- this, &asyncWork_));
299
+ asyncResourceName,
300
+ BaseWorker::Execute,
301
+ BaseWorker::Complete,
302
+ this, &asyncWork_));
258
303
  }
259
304
 
260
305
  virtual ~BaseWorker () {}
261
306
 
262
307
  static void Execute (napi_env env, void* data) {
263
308
  auto self = reinterpret_cast<BaseWorker*>(data);
264
-
265
- // Don't pass env to DoExecute() because use of Node-API
266
- // methods should generally be avoided in async work.
267
- self->DoExecute();
309
+ self->status_ = self->Execute(*self->database_);
268
310
  }
269
311
 
270
- bool SetStatus (const leveldb::Status& status) {
271
- status_ = status;
272
- return status.ok();
273
- }
274
-
275
- virtual void DoExecute () = 0;
276
-
277
312
  static void Complete (napi_env env, napi_status status, void* data) {
278
313
  auto self = reinterpret_cast<BaseWorker*>(data);
279
314
 
280
- self->DoComplete(env);
281
- self->DoFinally(env);
282
- }
283
-
284
- void DoComplete (napi_env env) {
285
315
  napi_value callback;
286
- napi_get_reference_value(env, callbackRef_, &callback);
316
+ napi_get_reference_value(env, self->callbackRef_, &callback);
287
317
 
288
- if (status_.ok()) {
289
- HandleOKCallback(env, callback);
318
+ if (self->status_.ok()) {
319
+ self->OnOk(env, callback);
290
320
  } else {
291
- HandleErrorCallback(env, callback);
321
+ self->OnError(env, callback, ToError(env, self->status_));
292
322
  }
323
+
324
+ self->Destroy(env);
325
+
326
+ napi_delete_reference(env, self->callbackRef_);
327
+ napi_delete_async_work(env, self->asyncWork_);
328
+
329
+ delete self;
293
330
  }
294
331
 
295
- virtual void HandleOKCallback (napi_env env, napi_value callback) {
332
+ virtual rocksdb::Status Execute (Database& database) = 0;
333
+
334
+ virtual void OnOk (napi_env env, napi_value callback) {
296
335
  napi_value argv;
297
336
  napi_get_null(env, &argv);
298
337
  CallFunction(env, callback, 1, &argv);
299
338
  }
300
339
 
301
- virtual void HandleErrorCallback (napi_env env, napi_value callback) {
302
- napi_value argv;
303
-
304
- const auto msg = status_.ToString();
305
-
306
- if (status_.IsNotFound()) {
307
- argv = CreateCodeError(env, "LEVEL_NOT_FOUND", msg);
308
- } else if (status_.IsCorruption()) {
309
- argv = CreateCodeError(env, "LEVEL_CORRUPTION", msg);
310
- } else if (status_.IsIOError()) {
311
- if (msg.find("IO error: lock ") != std::string::npos) { // env_posix.cc
312
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
313
- } else if (msg.find("IO error: LockFile ") != std::string::npos) { // env_win.cc
314
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
315
- } else if (msg.find("IO error: While lock file") != std::string::npos) { // env_mac.cc
316
- argv = CreateCodeError(env, "LEVEL_LOCKED", msg);
317
- } else {
318
- argv = CreateCodeError(env, "LEVEL_IO_ERROR", msg);
319
- }
320
- } else {
321
- argv = CreateError(env, msg);
322
- }
323
-
324
- CallFunction(env, callback, 1, &argv);
340
+ virtual void OnError (napi_env env, napi_value callback, napi_value err) {
341
+ CallFunction(env, callback, 1, &err);
325
342
  }
326
343
 
327
- virtual void DoFinally (napi_env env) {
328
- napi_delete_reference(env, callbackRef_);
329
- napi_delete_async_work(env, asyncWork_);
330
-
331
- delete this;
344
+ virtual void Destroy (napi_env env) {
332
345
  }
333
346
 
334
347
  void Queue (napi_env env) {
@@ -336,33 +349,24 @@ struct BaseWorker {
336
349
  }
337
350
 
338
351
  Database* database_;
339
-
340
352
  private:
341
353
  napi_ref callbackRef_;
342
354
  napi_async_work asyncWork_;
343
- leveldb::Status status_;
355
+ rocksdb::Status status_;
344
356
  };
345
357
 
346
- /**
347
- * Owns the LevelDB storage, cache, filter policy and iterators.
348
- */
349
358
  struct Database {
350
- Database ()
351
- : pendingCloseWorker_(nullptr),
352
- ref_(nullptr),
353
- priorityWork_(0) {}
354
-
355
- leveldb::Status Open (const leveldb::Options& options,
359
+ rocksdb::Status Open (const rocksdb::Options& options,
356
360
  const bool readOnly,
357
361
  const char* location) {
358
362
  if (readOnly) {
359
- leveldb::DB* db = nullptr;
363
+ rocksdb::DB* db = nullptr;
360
364
  const auto status = rocksdb::DB::OpenForReadOnly(options, location, &db);
361
365
  db_.reset(db);
362
366
  return status;
363
367
  } else {
364
- leveldb::DB* db = nullptr;
365
- const auto status = leveldb::DB::Open(options, location, &db);
368
+ rocksdb::DB* db = nullptr;
369
+ const auto status = rocksdb::DB::Open(options, location, &db);
366
370
  db_.reset(db);
367
371
  return status;
368
372
  }
@@ -372,56 +376,6 @@ struct Database {
372
376
  db_.reset();
373
377
  }
374
378
 
375
- leveldb::Status Put (const leveldb::WriteOptions& options,
376
- const std::string& key,
377
- const std::string& value) {
378
- return db_->Put(options, db_->DefaultColumnFamily(), key, value);
379
- }
380
-
381
- leveldb::Status Get (const leveldb::ReadOptions& options,
382
- const std::string& key,
383
- rocksdb::PinnableSlice& value) {
384
- return db_->Get(options, db_->DefaultColumnFamily(), key, &value);
385
- }
386
-
387
- leveldb::Status Del (const leveldb::WriteOptions& options,
388
- const std::string& key) {
389
- return db_->Delete(options, db_->DefaultColumnFamily(), key);
390
- }
391
-
392
- leveldb::Status WriteBatch (const leveldb::WriteOptions& options,
393
- leveldb::WriteBatch* batch) {
394
- return db_->Write(options, batch);
395
- }
396
-
397
- uint64_t ApproximateSize (const leveldb::Range* range) {
398
- uint64_t size = 0;
399
- db_->GetApproximateSizes(range, 1, &size);
400
- return size;
401
- }
402
-
403
- void CompactRange (const leveldb::Slice* start,
404
- const leveldb::Slice* end) {
405
- rocksdb::CompactRangeOptions options;
406
- db_->CompactRange(options, start, end);
407
- }
408
-
409
- void GetProperty (const std::string& property, std::string& value) {
410
- db_->GetProperty(property, &value);
411
- }
412
-
413
- const leveldb::Snapshot* NewSnapshot () {
414
- return db_->GetSnapshot();
415
- }
416
-
417
- leveldb::Iterator* NewIterator (const leveldb::ReadOptions& options) {
418
- return db_->NewIterator(options);
419
- }
420
-
421
- void ReleaseSnapshot (const leveldb::Snapshot* snapshot) {
422
- return db_->ReleaseSnapshot(snapshot);
423
- }
424
-
425
379
  void AttachIterator (napi_env env, Iterator* iterator) {
426
380
  iterators_.insert(iterator);
427
381
  IncrementPriorityWork(env);
@@ -433,11 +387,11 @@ struct Database {
433
387
  }
434
388
 
435
389
  void IncrementPriorityWork (napi_env env) {
436
- napi_reference_ref(env, ref_, &priorityWork_);
390
+ napi_reference_ref(env, prioritRef_, &priorityWork_);
437
391
  }
438
392
 
439
393
  void DecrementPriorityWork (napi_env env) {
440
- napi_reference_unref(env, ref_, &priorityWork_);
394
+ napi_reference_unref(env, prioritRef_, &priorityWork_);
441
395
 
442
396
  if (priorityWork_ == 0 && pendingCloseWorker_) {
443
397
  pendingCloseWorker_->Queue(env);
@@ -449,13 +403,13 @@ struct Database {
449
403
  return priorityWork_ > 0;
450
404
  }
451
405
 
452
- std::unique_ptr<leveldb::DB> db_;
406
+ std::unique_ptr<rocksdb::DB> db_;
453
407
  BaseWorker* pendingCloseWorker_;
454
408
  std::set<Iterator*> iterators_;
455
- napi_ref ref_;
409
+ napi_ref prioritRef_;
456
410
 
457
411
  private:
458
- uint32_t priorityWork_;
412
+ uint32_t priorityWork_ = 0;
459
413
  };
460
414
 
461
415
  /**
@@ -464,133 +418,113 @@ private:
464
418
  struct PriorityWorker : public BaseWorker {
465
419
  PriorityWorker (napi_env env, Database* database, napi_value callback, const char* resourceName)
466
420
  : BaseWorker(env, database, callback, resourceName) {
467
- database_->IncrementPriorityWork(env);
421
+ database_->IncrementPriorityWork(env);
468
422
  }
469
423
 
470
424
  virtual ~PriorityWorker () {}
471
425
 
472
- void DoFinally (napi_env env) override {
426
+ void Destroy (napi_env env) override {
473
427
  database_->DecrementPriorityWork(env);
474
- BaseWorker::DoFinally(env);
428
+ BaseWorker::Destroy(env);
475
429
  }
476
430
  };
477
431
 
478
432
  struct BaseIterator {
479
433
  BaseIterator(Database* database,
480
434
  const bool reverse,
481
- const std::string* lt,
482
- const std::string* lte,
483
- const std::string* gt,
484
- const std::string* gte,
435
+ const std::optional<std::string>& lt,
436
+ const std::optional<std::string>& lte,
437
+ const std::optional<std::string>& gt,
438
+ const std::optional<std::string>& gte,
485
439
  const int limit,
486
440
  const bool fillCache)
487
441
  : database_(database),
488
- snapshot_(database->NewSnapshot()),
489
- dbIterator_(database->NewIterator([&]{
490
- leveldb::ReadOptions options;
491
- options.fill_cache = fillCache;
492
- options.verify_checksums = false;
493
- options.snapshot = snapshot_;
494
- return options;
495
- }())),
496
- didSeek_(false),
497
- reverse_(reverse),
498
442
  lt_(lt),
499
443
  lte_(lte),
500
444
  gt_(gt),
501
445
  gte_(gte),
502
- limit_(limit),
503
- count_(0) {
446
+ snapshot_(database_->db_->GetSnapshot(), [this](const rocksdb::Snapshot* ptr) {
447
+ database_->db_->ReleaseSnapshot(ptr);
448
+ }),
449
+ iterator_(database->db_->NewIterator([&]{
450
+ rocksdb::ReadOptions options;
451
+ if (lt_ && !lte_) {
452
+ upper_bound_ = rocksdb::Slice(lt_->data(), lt_->size());
453
+ options.iterate_upper_bound = &upper_bound_;
454
+ }
455
+ if (gte_) {
456
+ lower_bound_ = rocksdb::Slice(gte_->data(), gte_->size());
457
+ options.iterate_lower_bound = &lower_bound_;
458
+ }
459
+ options.fill_cache = fillCache;
460
+ options.snapshot = snapshot_.get();
461
+ return options;
462
+ }())),
463
+ reverse_(reverse),
464
+ limit_(limit) {
504
465
  }
505
466
 
506
467
  virtual ~BaseIterator () {
507
- assert(!dbIterator_);
508
-
509
- delete lt_;
510
- delete lte_;
511
- delete gt_;
512
- delete gte_;
468
+ assert(!iterator_);
513
469
  }
514
470
 
515
471
  bool DidSeek () const {
516
472
  return didSeek_;
517
473
  }
518
474
 
519
- /**
520
- * Seek to the first relevant key based on range options.
521
- */
522
475
  void SeekToRange () {
523
476
  didSeek_ = true;
524
477
 
525
- if (!reverse_ && gte_) {
526
- dbIterator_->Seek(*gte_);
527
- } else if (!reverse_ && gt_) {
528
- dbIterator_->Seek(*gt_);
478
+ if (!reverse_ && gt_ && !gte_) {
479
+ iterator_->Seek(*gt_);
529
480
 
530
- if (dbIterator_->Valid() && dbIterator_->key().compare(*gt_) == 0) {
531
- dbIterator_->Next();
481
+ if (iterator_->Valid() && iterator_->key().compare(*gt_) == 0) {
482
+ iterator_->Next();
532
483
  }
533
484
  } else if (reverse_ && lte_) {
534
- dbIterator_->Seek(*lte_);
535
-
536
- if (!dbIterator_->Valid()) {
537
- dbIterator_->SeekToLast();
538
- } else if (dbIterator_->key().compare(*lte_) > 0) {
539
- dbIterator_->Prev();
540
- }
541
- } else if (reverse_ && lt_) {
542
- dbIterator_->Seek(*lt_);
543
-
544
- if (!dbIterator_->Valid()) {
545
- dbIterator_->SeekToLast();
546
- } else if (dbIterator_->key().compare(*lt_) >= 0) {
547
- dbIterator_->Prev();
548
- }
485
+ iterator_->SeekForPrev(*lte_);
549
486
  } else if (reverse_) {
550
- dbIterator_->SeekToLast();
487
+ iterator_->SeekToLast();
551
488
  } else {
552
- dbIterator_->SeekToFirst();
489
+ iterator_->SeekToFirst();
553
490
  }
554
491
  }
555
492
 
556
- /**
557
- * Seek manually (during iteration).
558
- */
559
493
  void Seek (const std::string& target) {
560
494
  didSeek_ = true;
561
495
 
562
- if (OutOfRange(target)) {
563
- return SeekToEnd();
564
- }
565
-
566
- dbIterator_->Seek(target);
496
+ // TODO (fix): Only check for (gt && !gte) and lte.
497
+ // See, https://github.com/facebook/rocksdb/issues/9904.
567
498
 
568
- if (dbIterator_->Valid()) {
569
- const auto cmp = dbIterator_->key().compare(target);
570
- if (reverse_ ? cmp > 0 : cmp < 0) {
571
- Next();
572
- }
499
+ if (OutOfRange(target)) {
500
+ SeekToLast();
501
+ Next();
502
+ } else if (reverse_) {
503
+ iterator_->SeekForPrev(target);
573
504
  } else {
574
- SeekToFirst();
575
- if (dbIterator_->Valid()) {
576
- const auto cmp = dbIterator_->key().compare(target);
577
- if (reverse_ ? cmp > 0 : cmp < 0) {
578
- SeekToEnd();
579
- }
580
- }
505
+ iterator_->Seek(target);
581
506
  }
582
507
  }
583
508
 
584
509
  void Close () {
585
- if (dbIterator_) {
586
- delete dbIterator_;
587
- dbIterator_ = nullptr;
588
- database_->ReleaseSnapshot(snapshot_);
589
- }
510
+ snapshot_.reset();
511
+ iterator_.reset();
590
512
  }
591
513
 
592
514
  bool Valid () const {
593
- return dbIterator_->Valid() && !OutOfRange(dbIterator_->key());
515
+ if (!iterator_->Valid()) {
516
+ return false;
517
+ }
518
+
519
+ if (lte_ && iterator_->key().compare(*lte_) > 0) {
520
+ return false;
521
+ }
522
+
523
+ if (!gte_ && gt_ && iterator_->key().compare(*gt_) <= 0) {
524
+ return false;
525
+ }
526
+
527
+ return true;
594
528
  }
595
529
 
596
530
  bool Increment () {
@@ -598,38 +532,33 @@ struct BaseIterator {
598
532
  }
599
533
 
600
534
  void Next () {
601
- if (reverse_) dbIterator_->Prev();
602
- else dbIterator_->Next();
535
+ if (reverse_) iterator_->Prev();
536
+ else iterator_->Next();
603
537
  }
604
538
 
605
539
  void SeekToFirst () {
606
- if (reverse_) dbIterator_->SeekToLast();
607
- else dbIterator_->SeekToFirst();
540
+ if (reverse_) iterator_->SeekToLast();
541
+ else iterator_->SeekToFirst();
608
542
  }
609
543
 
610
544
  void SeekToLast () {
611
- if (reverse_) dbIterator_->SeekToFirst();
612
- else dbIterator_->SeekToLast();
613
- }
614
-
615
- void SeekToEnd () {
616
- SeekToLast();
617
- Next();
545
+ if (reverse_) iterator_->SeekToFirst();
546
+ else iterator_->SeekToLast();
618
547
  }
619
548
 
620
- leveldb::Slice CurrentKey () const {
621
- return dbIterator_->key();
549
+ rocksdb::Slice CurrentKey () const {
550
+ return iterator_->key();
622
551
  }
623
552
 
624
- leveldb::Slice CurrentValue () const {
625
- return dbIterator_->value();
553
+ rocksdb::Slice CurrentValue () const {
554
+ return iterator_->value();
626
555
  }
627
556
 
628
- leveldb::Status Status () const {
629
- return dbIterator_->status();
557
+ rocksdb::Status Status () const {
558
+ return iterator_->status();
630
559
  }
631
560
 
632
- bool OutOfRange (const leveldb::Slice& target) const {
561
+ bool OutOfRange (const rocksdb::Slice& target) const {
633
562
  if (lte_) {
634
563
  if (target.compare(*lte_) > 0) return true;
635
564
  } else if (lt_) {
@@ -648,16 +577,18 @@ struct BaseIterator {
648
577
  Database* database_;
649
578
 
650
579
  private:
651
- const leveldb::Snapshot* snapshot_;
652
- leveldb::Iterator* dbIterator_;
653
- bool didSeek_;
580
+ const std::optional<std::string> lt_;
581
+ const std::optional<std::string> lte_;
582
+ const std::optional<std::string> gt_;
583
+ const std::optional<std::string> gte_;
584
+ rocksdb::Slice lower_bound_;
585
+ rocksdb::Slice upper_bound_;
586
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
587
+ std::unique_ptr<rocksdb::Iterator> iterator_;
588
+ bool didSeek_ = false;
654
589
  const bool reverse_;
655
- const std::string* lt_;
656
- const std::string* lte_;
657
- const std::string* gt_;
658
- const std::string* gte_;
659
590
  const int limit_;
660
- int count_;
591
+ int count_ = 0;
661
592
  };
662
593
 
663
594
  struct Iterator final : public BaseIterator {
@@ -666,10 +597,10 @@ struct Iterator final : public BaseIterator {
666
597
  const bool keys,
667
598
  const bool values,
668
599
  const int limit,
669
- const std::string* lt,
670
- const std::string* lte,
671
- const std::string* gt,
672
- const std::string* gte,
600
+ const std::optional<std::string>& lt,
601
+ const std::optional<std::string>& lte,
602
+ const std::optional<std::string>& gt,
603
+ const std::optional<std::string>& gte,
673
604
  const bool fillCache,
674
605
  const bool keyAsBuffer,
675
606
  const bool valueAsBuffer,
@@ -681,9 +612,6 @@ struct Iterator final : public BaseIterator {
681
612
  valueAsBuffer_(valueAsBuffer),
682
613
  highWaterMarkBytes_(highWaterMarkBytes),
683
614
  first_(true),
684
- nexting_(false),
685
- isClosing_(false),
686
- closeWorker_(nullptr),
687
615
  ref_(nullptr) {
688
616
  }
689
617
 
@@ -697,53 +625,12 @@ struct Iterator final : public BaseIterator {
697
625
  if (ref_) napi_delete_reference(env, ref_);
698
626
  }
699
627
 
700
- bool ReadMany (uint32_t size) {
701
- cache_.clear();
702
- cache_.reserve(size * 2);
703
- size_t bytesRead = 0;
704
-
705
- while (true) {
706
- if (!first_) Next();
707
- else first_ = false;
708
-
709
- if (!Valid() || !Increment()) break;
710
-
711
- if (keys_ && values_) {
712
- auto k = CurrentKey();
713
- auto v = CurrentValue();
714
- cache_.emplace_back(k.data(), k.size());
715
- cache_.emplace_back(v.data(), v.size());
716
- bytesRead += k.size() + v.size();
717
- } else if (keys_) {
718
- auto k = CurrentKey();
719
- cache_.emplace_back(k.data(), k.size());
720
- cache_.push_back({});
721
- bytesRead += k.size();
722
- } else if (values_) {
723
- auto v = CurrentValue();
724
- cache_.push_back({});
725
- cache_.emplace_back(v.data(), v.size());
726
- bytesRead += v.size();
727
- }
728
-
729
- if (bytesRead > highWaterMarkBytes_ || cache_.size() / 2 >= size) {
730
- return true;
731
- }
732
- }
733
-
734
- return false;
735
- }
736
-
737
628
  const bool keys_;
738
629
  const bool values_;
739
630
  const bool keyAsBuffer_;
740
631
  const bool valueAsBuffer_;
741
632
  const uint32_t highWaterMarkBytes_;
742
633
  bool first_;
743
- bool nexting_;
744
- bool isClosing_;
745
- BaseWorker* closeWorker_;
746
- std::vector<std::string> cache_;
747
634
 
748
635
  private:
749
636
  napi_ref ref_;
@@ -755,7 +642,7 @@ private:
755
642
  * the guarantee that no db operations will be in-flight at this time.
756
643
  */
757
644
  static void env_cleanup_hook (void* arg) {
758
- Database* database = reinterpret_cast<Database*>(arg);
645
+ auto database = reinterpret_cast<Database*>(arg);
759
646
 
760
647
  // Do everything that db_close() does but synchronously. We're expecting that GC
761
648
  // did not (yet) collect the database because that would be a user mistake (not
@@ -776,15 +663,15 @@ static void env_cleanup_hook (void* arg) {
776
663
 
777
664
  static void FinalizeDatabase (napi_env env, void* data, void* hint) {
778
665
  if (data) {
779
- Database* database = (Database*)data;
666
+ auto database = reinterpret_cast<Database*>(data);
780
667
  napi_remove_env_cleanup_hook(env, env_cleanup_hook, database);
781
- if (database->ref_) napi_delete_reference(env, database->ref_);
668
+ if (database->prioritRef_) napi_delete_reference(env, database->prioritRef_);
782
669
  delete database;
783
670
  }
784
671
  }
785
672
 
786
673
  NAPI_METHOD(db_init) {
787
- Database* database = new Database();
674
+ auto database = new Database();
788
675
  napi_add_env_cleanup_hook(env, env_cleanup_hook, database);
789
676
 
790
677
  napi_value result;
@@ -792,17 +679,12 @@ NAPI_METHOD(db_init) {
792
679
  FinalizeDatabase,
793
680
  nullptr, &result));
794
681
 
795
- // Reference counter to prevent GC of database while priority workers are active
796
- NAPI_STATUS_THROWS(napi_create_reference(env, result, 0, &database->ref_));
682
+ NAPI_STATUS_THROWS(napi_create_reference(env, result, 0, &database->prioritRef_));
797
683
 
798
684
  return result;
799
685
  }
800
686
 
801
- /**
802
- * Worker class for opening a database.
803
- * TODO: shouldn't this be a PriorityWorker?
804
- */
805
- struct OpenWorker final : public BaseWorker {
687
+ struct OpenWorker final : public PriorityWorker {
806
688
  OpenWorker (napi_env env,
807
689
  Database* database,
808
690
  napi_value callback,
@@ -818,18 +700,18 @@ struct OpenWorker final : public BaseWorker {
818
700
  const uint32_t cacheSize,
819
701
  const std::string& infoLogLevel,
820
702
  const bool readOnly)
821
- : BaseWorker(env, database, callback, "leveldown.db.open"),
703
+ : PriorityWorker(env, database, callback, "leveldown.db.open"),
822
704
  readOnly_(readOnly),
823
705
  location_(location) {
824
706
  options_.create_if_missing = createIfMissing;
825
707
  options_.error_if_exists = errorIfExists;
826
708
  options_.compression = compression
827
- ? leveldb::kSnappyCompression
828
- : leveldb::kNoCompression;
709
+ ? rocksdb::kSnappyCompression
710
+ : rocksdb::kNoCompression;
829
711
  options_.write_buffer_size = writeBufferSize;
830
712
  options_.max_open_files = maxOpenFiles;
831
713
  options_.max_log_file_size = maxFileSize;
832
- options_.paranoid_checks = false;
714
+ options_.use_adaptive_mutex = true;
833
715
 
834
716
  if (infoLogLevel.size() > 0) {
835
717
  rocksdb::InfoLogLevel lvl = {};
@@ -869,11 +751,11 @@ struct OpenWorker final : public BaseWorker {
869
751
  );
870
752
  }
871
753
 
872
- void DoExecute () override {
873
- SetStatus(database_->Open(options_, readOnly_, location_.c_str()));
754
+ rocksdb::Status Execute (Database& database) override {
755
+ return database.Open(options_, readOnly_, location_.c_str());
874
756
  }
875
757
 
876
- leveldb::Options options_;
758
+ rocksdb::Options options_;
877
759
  const bool readOnly_;
878
760
  const std::string location_;
879
761
  };
@@ -918,8 +800,8 @@ struct CloseWorker final : public BaseWorker {
918
800
  napi_value callback)
919
801
  : BaseWorker(env, database, callback, "leveldown.db.close") {}
920
802
 
921
- void DoExecute () override {
922
- database_->CloseDatabase();
803
+ rocksdb::Status Execute (Database& database) override {
804
+ return database.db_->Close();
923
805
  }
924
806
  };
925
807
 
@@ -933,13 +815,6 @@ NAPI_METHOD(db_close) {
933
815
 
934
816
  const auto callback = argv[1];
935
817
 
936
- napi_value noop;
937
- napi_create_function(env, nullptr, 0, noop_callback, nullptr, &noop);
938
-
939
- for (auto it : database->iterators_) {
940
- iterator_do_close(env, it, noop);
941
- }
942
-
943
818
  auto worker = new CloseWorker(env, database, callback);
944
819
 
945
820
  if (!database->HasPriorityWork()) {
@@ -951,41 +826,15 @@ NAPI_METHOD(db_close) {
951
826
  return 0;
952
827
  }
953
828
 
954
- struct PutWorker final : public PriorityWorker {
955
- PutWorker (napi_env env,
956
- Database* database,
957
- napi_value callback,
958
- const std::string& key,
959
- const std::string& value,
960
- bool sync)
961
- : PriorityWorker(env, database, callback, "rocks_level.db.put"),
962
- key_(key), value_(value), sync_(sync) {
963
- }
964
-
965
- void DoExecute () override {
966
- leveldb::WriteOptions options;
967
- options.sync = sync_;
968
- SetStatus(database_->Put(options, key_, value_));
969
- }
970
-
971
- const std::string key_;
972
- const std::string value_;
973
- const bool sync_;
974
- };
975
-
976
829
  NAPI_METHOD(db_put) {
977
- NAPI_ARGV(5);
830
+ NAPI_ARGV(4);
978
831
  NAPI_DB_CONTEXT();
979
832
 
980
833
  const auto key = ToString(env, argv[1]);
981
834
  const auto value = ToString(env, argv[2]);
982
- const auto sync = BooleanProperty(env, argv[3], "sync", false);
983
- const auto callback = argv[4];
984
-
985
- auto worker = new PutWorker(env, database, callback, key, value, sync);
986
- worker->Queue(env);
987
835
 
988
- return 0;
836
+ rocksdb::WriteOptions options;
837
+ return ToError(env, database->db_->Put(options, key, value));
989
838
  }
990
839
 
991
840
  struct GetWorker final : public PriorityWorker {
@@ -996,16 +845,22 @@ struct GetWorker final : public PriorityWorker {
996
845
  const bool asBuffer,
997
846
  const bool fillCache)
998
847
  : PriorityWorker(env, database, callback, "rocks_level.db.get"),
999
- key_(key), asBuffer_(asBuffer), fillCache_(fillCache) {
848
+ key_(key), asBuffer_(asBuffer), fillCache_(fillCache),
849
+ snapshot_(database_->db_->GetSnapshot(), [this](const rocksdb::Snapshot* ptr) {
850
+ database_->db_->ReleaseSnapshot(ptr);
851
+ }) {
1000
852
  }
1001
853
 
1002
- void DoExecute () override {
1003
- leveldb::ReadOptions options;
854
+ rocksdb::Status Execute (Database& database) override {
855
+ rocksdb::ReadOptions options;
1004
856
  options.fill_cache = fillCache_;
1005
- SetStatus(database_->Get(options, key_, value_));
857
+ options.snapshot = snapshot_.get();
858
+ auto status = database.db_->Get(options, database.db_->DefaultColumnFamily(), key_, &value_);
859
+ snapshot_.reset();
860
+ return status;
1006
861
  }
1007
862
 
1008
- void HandleOKCallback (napi_env env, napi_value callback) override {
863
+ void OnOk (napi_env env, napi_value callback) override {
1009
864
  napi_value argv[2];
1010
865
  napi_get_null(env, &argv[0]);
1011
866
  Convert(env, std::move(value_), asBuffer_, argv[1]);
@@ -1017,6 +872,7 @@ private:
1017
872
  rocksdb::PinnableSlice value_;
1018
873
  const bool asBuffer_;
1019
874
  const bool fillCache_;
875
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
1020
876
  };
1021
877
 
1022
878
  NAPI_METHOD(db_get) {
@@ -1044,54 +900,42 @@ struct GetManyWorker final : public PriorityWorker {
1044
900
  const bool fillCache)
1045
901
  : PriorityWorker(env, database, callback, "leveldown.get.many"),
1046
902
  keys_(keys), valueAsBuffer_(valueAsBuffer), fillCache_(fillCache),
1047
- snapshot_(database->NewSnapshot()) {
903
+ snapshot_(database_->db_->GetSnapshot(), [this](const rocksdb::Snapshot* ptr) {
904
+ database_->db_->ReleaseSnapshot(ptr);
905
+ }) {
1048
906
  }
1049
907
 
1050
- ~GetManyWorker () {
1051
- if (snapshot_) {
1052
- database_->ReleaseSnapshot(snapshot_);
1053
- snapshot_ = nullptr;
1054
- }
1055
- }
1056
-
1057
- void DoExecute () override {
1058
- cache_.reserve(keys_.size());
1059
-
1060
- leveldb::ReadOptions options;
1061
- options.snapshot = snapshot_;
908
+ rocksdb::Status Execute (Database& database) override {
909
+ rocksdb::ReadOptions options;
1062
910
  options.fill_cache = fillCache_;
1063
-
1064
- rocksdb::PinnableSlice value;
1065
-
1066
- for (const auto& key: keys_) {
1067
- const auto status = database_->Get(options, key, value);
911
+ options.snapshot = snapshot_.get();
912
+
913
+ status_ = database.db_->MultiGet(
914
+ options,
915
+ std::vector<rocksdb::Slice>(keys_.begin(), keys_.end()),
916
+ &values_
917
+ );
918
+ snapshot_ = nullptr;
1068
919
 
1069
- if (status.ok()) {
1070
- cache_.emplace_back(std::move(value));
1071
- } else if (status.IsNotFound()) {
1072
- cache_.emplace_back(nullptr);
1073
- } else {
1074
- SetStatus(status);
1075
- break;
920
+ for (auto status : status_) {
921
+ if (!status.ok() && !status.IsNotFound()) {
922
+ return status;
1076
923
  }
1077
-
1078
- value.Reset();
1079
924
  }
1080
925
 
1081
- database_->ReleaseSnapshot(snapshot_);
1082
- snapshot_ = nullptr;
926
+ return rocksdb::Status::OK();
1083
927
  }
1084
928
 
1085
- void HandleOKCallback (napi_env env, napi_value callback) override {
1086
- const auto size = cache_.size();
929
+ void OnOk (napi_env env, napi_value callback) override {
930
+ const auto size = values_.size();
1087
931
 
1088
932
  napi_value array;
1089
933
  napi_create_array_with_length(env, size, &array);
1090
934
 
1091
935
  for (size_t idx = 0; idx < size; idx++) {
1092
936
  napi_value element;
1093
- if (cache_[idx].GetSelf() != nullptr) {
1094
- Convert(env, cache_[idx], valueAsBuffer_, element);
937
+ if (status_[idx].ok()) {
938
+ Convert(env, values_[idx], valueAsBuffer_, element);
1095
939
  } else {
1096
940
  napi_get_undefined(env, &element);
1097
941
  }
@@ -1106,10 +950,11 @@ struct GetManyWorker final : public PriorityWorker {
1106
950
 
1107
951
  private:
1108
952
  const std::vector<std::string> keys_;
953
+ std::vector<std::string> values_;
954
+ std::vector<rocksdb::Status> status_;
1109
955
  const bool valueAsBuffer_;
1110
- std::vector<rocksdb::PinnableSlice> cache_;
1111
956
  const bool fillCache_;
1112
- const leveldb::Snapshot* snapshot_;
957
+ std::shared_ptr<const rocksdb::Snapshot> snapshot_;
1113
958
  };
1114
959
 
1115
960
  NAPI_METHOD(db_get_many) {
@@ -1128,184 +973,65 @@ NAPI_METHOD(db_get_many) {
1128
973
  return 0;
1129
974
  }
1130
975
 
1131
- struct DelWorker final : public PriorityWorker {
1132
- DelWorker (napi_env env,
1133
- Database* database,
1134
- napi_value callback,
1135
- const std::string& key,
1136
- bool sync)
1137
- : PriorityWorker(env, database, callback, "rocks_level.db.del"),
1138
- key_(key), sync_(sync) {
1139
- }
1140
-
1141
- void DoExecute () override {
1142
- leveldb::WriteOptions options;
1143
- options.sync = sync_;
1144
- SetStatus(database_->Del(options, key_));
1145
- }
1146
-
1147
- const std::string key_;
1148
- const bool sync_;
1149
- };
1150
-
1151
976
  NAPI_METHOD(db_del) {
1152
- NAPI_ARGV(4);
977
+ NAPI_ARGV(3);
1153
978
  NAPI_DB_CONTEXT();
1154
979
 
1155
980
  const auto key = ToString(env, argv[1]);
1156
- const auto sync = BooleanProperty(env, argv[2], "sync", false);
1157
- const auto callback = argv[3];
1158
-
1159
- auto worker = new DelWorker(env, database, callback, key, sync);
1160
- worker->Queue(env);
1161
981
 
1162
- return 0;
982
+ rocksdb::WriteOptions options;
983
+ return ToError(env, database->db_->Delete(options, key));
1163
984
  }
1164
985
 
1165
- struct ClearWorker final : public PriorityWorker {
1166
- ClearWorker (napi_env env,
1167
- Database* database,
1168
- napi_value callback,
1169
- const bool reverse,
1170
- const int limit,
1171
- const std::string* lt,
1172
- const std::string* lte,
1173
- const std::string* gt,
1174
- const std::string* gte)
1175
- : PriorityWorker(env, database, callback, "rocks_level.db.clear"),
1176
- iterator_(database, reverse, lt, lte, gt, gte, limit, false) {
1177
- }
1178
-
1179
- void DoExecute () override {
1180
- iterator_.SeekToRange();
1181
-
1182
- // TODO: add option
1183
- const uint32_t hwm = 16 * 1024;
1184
- leveldb::WriteBatch batch;
1185
-
1186
- leveldb::WriteOptions options;
1187
- options.sync = false;
1188
-
1189
- while (true) {
1190
- size_t bytesRead = 0;
1191
-
1192
- while (bytesRead <= hwm && iterator_.Valid() && iterator_.Increment()) {
1193
- const auto key = iterator_.CurrentKey();
1194
- batch.Delete(key);
1195
- bytesRead += key.size();
1196
- iterator_.Next();
1197
- }
1198
-
1199
- if (!SetStatus(iterator_.Status()) || bytesRead == 0) {
1200
- break;
1201
- }
1202
-
1203
- if (!SetStatus(database_->WriteBatch(options, &batch))) {
1204
- break;
1205
- }
1206
-
1207
- batch.Clear();
1208
- }
1209
-
1210
- iterator_.Close();
1211
- }
1212
-
1213
- private:
1214
- BaseIterator iterator_;
1215
- };
1216
-
1217
986
  NAPI_METHOD(db_clear) {
1218
- NAPI_ARGV(3);
987
+ NAPI_ARGV(2);
1219
988
  NAPI_DB_CONTEXT();
1220
989
 
1221
- napi_value options = argv[1];
1222
- napi_value callback = argv[2];
1223
-
1224
- const auto reverse = BooleanProperty(env, options, "reverse", false);
1225
- const auto limit = Int32Property(env, options, "limit", -1);
1226
-
1227
- const auto lt = RangeOption(env, options, "lt");
1228
- const auto lte = RangeOption(env, options, "lte");
1229
- const auto gt = RangeOption(env, options, "gt");
1230
- const auto gte = RangeOption(env, options, "gte");
1231
-
1232
- auto worker = new ClearWorker(env, database, callback, reverse, limit, lt, lte, gt, gte);
1233
- worker->Queue(env);
1234
-
1235
- return 0;
1236
- }
990
+ const auto reverse = BooleanProperty(env, argv[1], "reverse", false);
991
+ const auto limit = Int32Property(env, argv[1], "limit", -1);
1237
992
 
1238
- struct ApproximateSizeWorker final : public PriorityWorker {
1239
- ApproximateSizeWorker (napi_env env,
1240
- Database* database,
1241
- napi_value callback,
1242
- const std::string& start,
1243
- const std::string& end)
1244
- : PriorityWorker(env, database, callback, "rocks_level.db.approximate_size"),
1245
- start_(start), end_(end) {}
993
+ const auto lt = RangeOption(env, argv[1], "lt");
994
+ const auto lte = RangeOption(env, argv[1], "lte");
995
+ const auto gt = RangeOption(env, argv[1], "gt");
996
+ const auto gte = RangeOption(env, argv[1], "gte");
1246
997
 
1247
- void DoExecute () override {
1248
- leveldb::Range range(start_, end_);
1249
- size_ = database_->ApproximateSize(&range);
1250
- }
1251
-
1252
- void HandleOKCallback (napi_env env, napi_value callback) override {
1253
- napi_value argv[2];
1254
- napi_get_null(env, &argv[0]);
1255
- napi_create_int64(env, size_, &argv[1]);
1256
- CallFunction(env, callback, 2, argv);
1257
- }
998
+ BaseIterator it(database, reverse, lt, lte, gt, gte, limit, false);
1258
999
 
1259
- std::string start_;
1260
- std::string end_;
1261
- uint64_t size_;
1262
- };
1000
+ it.SeekToRange();
1263
1001
 
1264
- NAPI_METHOD(db_approximate_size) {
1265
- NAPI_ARGV(4);
1266
- NAPI_DB_CONTEXT();
1002
+ // TODO: add option
1003
+ const uint32_t hwm = 16 * 1024;
1267
1004
 
1268
- const auto start = ToString(env, argv[1]);
1269
- const auto end = ToString(env, argv[2]);
1270
- const auto callback = argv[3];
1005
+ rocksdb::WriteBatch batch;
1006
+ rocksdb::WriteOptions options;
1007
+ rocksdb::Status status;
1008
+
1009
+ while (true) {
1010
+ size_t bytesRead = 0;
1271
1011
 
1272
- auto worker = new ApproximateSizeWorker(env, database, callback, start, end);
1273
- worker->Queue(env);
1012
+ while (bytesRead <= hwm && it.Valid() && it.Increment()) {
1013
+ const auto key = it.CurrentKey();
1014
+ batch.Delete(key);
1015
+ bytesRead += key.size();
1016
+ it.Next();
1017
+ }
1274
1018
 
1275
- return 0;
1276
- }
1019
+ status = it.Status();
1020
+ if (!status.ok() || bytesRead == 0) {
1021
+ break;
1022
+ }
1277
1023
 
1278
- struct CompactRangeWorker final : public PriorityWorker {
1279
- CompactRangeWorker (napi_env env,
1280
- Database* database,
1281
- napi_value callback,
1282
- const std::string& start,
1283
- const std::string& end)
1284
- : PriorityWorker(env, database, callback, "rocks_level.db.compact_range"),
1285
- start_(start), end_(end) {}
1024
+ status = database->db_->Write(options, &batch);
1025
+ if (!status.ok()) {
1026
+ break;
1027
+ }
1286
1028
 
1287
- void DoExecute () override {
1288
- leveldb::Slice start = start_;
1289
- leveldb::Slice end = end_;
1290
- database_->CompactRange(&start, &end);
1029
+ batch.Clear();
1291
1030
  }
1292
1031
 
1293
- const std::string start_;
1294
- const std::string end_;
1295
- };
1296
-
1297
- NAPI_METHOD(db_compact_range) {
1298
- NAPI_ARGV(4);
1299
- NAPI_DB_CONTEXT();
1300
-
1301
- const auto start = ToString(env, argv[1]);
1302
- const auto end = ToString(env, argv[2]);
1303
- const auto callback = argv[3];
1304
-
1305
- auto worker = new CompactRangeWorker(env, database, callback, start, end);
1306
- worker->Queue(env);
1307
-
1308
- return 0;
1032
+ it.Close();
1033
+
1034
+ return ToError(env, status);
1309
1035
  }
1310
1036
 
1311
1037
  NAPI_METHOD(db_get_property) {
@@ -1315,7 +1041,7 @@ NAPI_METHOD(db_get_property) {
1315
1041
  const auto property = ToString(env, argv[1]);
1316
1042
 
1317
1043
  std::string value;
1318
- database->GetProperty(property, value);
1044
+ database->db_->GetProperty(property, &value);
1319
1045
 
1320
1046
  napi_value result;
1321
1047
  napi_create_string_utf8(env, value.data(), value.size(), &result);
@@ -1323,62 +1049,6 @@ NAPI_METHOD(db_get_property) {
1323
1049
  return result;
1324
1050
  }
1325
1051
 
1326
- struct DestroyWorker final : public BaseWorker {
1327
- DestroyWorker (napi_env env,
1328
- const std::string& location,
1329
- napi_value callback)
1330
- : BaseWorker(env, nullptr, callback, "rocks_level.destroy_db"),
1331
- location_(location) {}
1332
-
1333
- ~DestroyWorker () {}
1334
-
1335
- void DoExecute () override {
1336
- leveldb::Options options;
1337
- SetStatus(leveldb::DestroyDB(location_, options));
1338
- }
1339
-
1340
- const std::string location_;
1341
- };
1342
-
1343
- NAPI_METHOD(destroy_db) {
1344
- NAPI_ARGV(2);
1345
-
1346
- const auto location = ToString(env, argv[0]);
1347
- const auto callback = argv[1];
1348
-
1349
- auto worker = new DestroyWorker(env, location, callback);
1350
- worker->Queue(env);
1351
-
1352
- return 0;
1353
- }
1354
-
1355
- struct RepairWorker final : public BaseWorker {
1356
- RepairWorker (napi_env env,
1357
- const std::string& location,
1358
- napi_value callback)
1359
- : BaseWorker(env, nullptr, callback, "rocks_level.repair_db"),
1360
- location_(location) {}
1361
-
1362
- void DoExecute () override {
1363
- leveldb::Options options;
1364
- SetStatus(leveldb::RepairDB(location_, options));
1365
- }
1366
-
1367
- const std::string location_;
1368
- };
1369
-
1370
- NAPI_METHOD(repair_db) {
1371
- NAPI_ARGV(2);
1372
-
1373
- const auto location = ToString(env, argv[1]);
1374
- const auto callback = argv[1];
1375
-
1376
- auto worker = new RepairWorker(env, location, callback);
1377
- worker->Queue(env);
1378
-
1379
- return 0;
1380
- }
1381
-
1382
1052
  static void FinalizeIterator (napi_env env, void* data, void* hint) {
1383
1053
  if (data) {
1384
1054
  delete reinterpret_cast<Iterator*>(data);
@@ -1409,9 +1079,7 @@ NAPI_METHOD(iterator_init) {
1409
1079
  keyAsBuffer, valueAsBuffer, highWaterMarkBytes);
1410
1080
  napi_value result;
1411
1081
 
1412
- NAPI_STATUS_THROWS(napi_create_external(env, iterator,
1413
- FinalizeIterator,
1414
- nullptr, &result));
1082
+ NAPI_STATUS_THROWS(napi_create_external(env, iterator, FinalizeIterator, nullptr, &result));
1415
1083
 
1416
1084
  // Prevent GC of JS object before the iterator is closed (explicitly or on
1417
1085
  // db close) and keep track of non-closed iterators to end them on db close.
@@ -1424,10 +1092,6 @@ NAPI_METHOD(iterator_seek) {
1424
1092
  NAPI_ARGV(2);
1425
1093
  NAPI_ITERATOR_CONTEXT();
1426
1094
 
1427
- if (iterator->isClosing_) {
1428
- napi_throw_error(env, nullptr, "iterator has closed");
1429
- }
1430
-
1431
1095
  const auto target = ToString(env, argv[1]);
1432
1096
  iterator->first_ = true;
1433
1097
  iterator->Seek(target);
@@ -1442,41 +1106,28 @@ struct CloseIteratorWorker final : public BaseWorker {
1442
1106
  : BaseWorker(env, iterator->database_, callback, "leveldown.iterator.end"),
1443
1107
  iterator_(iterator) {}
1444
1108
 
1445
- void DoExecute () override {
1109
+ rocksdb::Status Execute (Database& database) override {
1446
1110
  iterator_->Close();
1111
+ return rocksdb::Status::OK();
1447
1112
  }
1448
1113
 
1449
- void DoFinally (napi_env env) override {
1114
+ void Destroy (napi_env env) override {
1450
1115
  iterator_->Detach(env);
1451
- BaseWorker::DoFinally(env);
1116
+ BaseWorker::Destroy(env);
1452
1117
  }
1453
1118
 
1454
1119
  private:
1455
1120
  Iterator* iterator_;
1456
1121
  };
1457
1122
 
1458
- /**
1459
- * Called by NAPI_METHOD(iterator_) and also when closing
1460
- * open iterators during NAPI_METHOD(db_close).
1461
- */
1462
- static void iterator_do_close (napi_env env, Iterator* iterator, napi_value cb) {
1463
- if (!iterator->isClosing_) {
1464
- auto worker = new CloseIteratorWorker(env, iterator, cb);
1465
- iterator->isClosing_ = true;
1466
-
1467
- if (iterator->nexting_) {
1468
- iterator->closeWorker_ = worker;
1469
- } else {
1470
- worker->Queue(env);
1471
- }
1472
- }
1473
- }
1474
-
1475
1123
  NAPI_METHOD(iterator_close) {
1476
1124
  NAPI_ARGV(2);
1477
1125
  NAPI_ITERATOR_CONTEXT();
1478
1126
 
1479
- iterator_do_close(env, iterator, argv[1]);
1127
+ const auto callback = argv[1];
1128
+
1129
+ auto worker = new CloseIteratorWorker(env, iterator, callback);
1130
+ worker->Queue(env);
1480
1131
 
1481
1132
  return 0;
1482
1133
  }
@@ -1488,63 +1139,82 @@ struct NextWorker final : public BaseWorker {
1488
1139
  napi_value callback)
1489
1140
  : BaseWorker(env, iterator->database_, callback,
1490
1141
  "leveldown.iterator.next"),
1491
- iterator_(iterator), size_(size), ok_() {}
1142
+ iterator_(iterator), size_(size) {}
1492
1143
 
1493
- void DoExecute () override {
1144
+ rocksdb::Status Execute (Database& database) override {
1494
1145
  if (!iterator_->DidSeek()) {
1495
1146
  iterator_->SeekToRange();
1496
1147
  }
1497
1148
 
1498
1149
  // Limit the size of the cache to prevent starving the event loop
1499
1150
  // in JS-land while we're recursively calling process.nextTick().
1500
- ok_ = iterator_->ReadMany(size_);
1501
1151
 
1502
- if (!ok_) {
1503
- SetStatus(iterator_->Status());
1152
+ cache_.reserve(size_ * 2);
1153
+ size_t bytesRead = 0;
1154
+
1155
+ while (true) {
1156
+ if (!iterator_->first_) iterator_->Next();
1157
+ else iterator_->first_ = false;
1158
+
1159
+ if (!iterator_->Valid() || !iterator_->Increment()) break;
1160
+
1161
+ if (iterator_->keys_ && iterator_->values_) {
1162
+ auto k = iterator_->CurrentKey();
1163
+ auto v = iterator_->CurrentValue();
1164
+ cache_.emplace_back(k.data(), k.size());
1165
+ cache_.emplace_back(v.data(), v.size());
1166
+ bytesRead += k.size() + v.size();
1167
+ } else if (iterator_->keys_) {
1168
+ auto k = iterator_->CurrentKey();
1169
+ cache_.emplace_back(k.data(), k.size());
1170
+ cache_.push_back({});
1171
+ bytesRead += k.size();
1172
+ } else if (iterator_->values_) {
1173
+ auto v = iterator_->CurrentValue();
1174
+ cache_.push_back({});
1175
+ cache_.emplace_back(v.data(), v.size());
1176
+ bytesRead += v.size();
1177
+ }
1178
+
1179
+ if (bytesRead > iterator_->highWaterMarkBytes_ || cache_.size() / 2 >= size_) {
1180
+ finished_ = true;
1181
+ return rocksdb::Status::OK();
1182
+ }
1504
1183
  }
1184
+
1185
+ return iterator_->Status();
1505
1186
  }
1506
1187
 
1507
- void HandleOKCallback (napi_env env, napi_value callback) override {
1508
- const auto size = iterator_->cache_.size();
1188
+ void OnOk (napi_env env, napi_value callback) override {
1189
+ const auto size = cache_.size();
1509
1190
  napi_value result;
1510
1191
  napi_create_array_with_length(env, size, &result);
1511
1192
 
1512
- for (size_t idx = 0; idx < iterator_->cache_.size(); idx += 2) {
1193
+ for (size_t idx = 0; idx < cache_.size(); idx += 2) {
1513
1194
  napi_value key;
1514
1195
  napi_value val;
1515
1196
 
1516
- Convert(env, iterator_->cache_[idx + 0], iterator_->keyAsBuffer_, key);
1517
- Convert(env, iterator_->cache_[idx + 1], iterator_->valueAsBuffer_, val);
1197
+ Convert(env, cache_[idx + 0], iterator_->keyAsBuffer_, key);
1198
+ Convert(env, cache_[idx + 1], iterator_->valueAsBuffer_, val);
1518
1199
 
1519
1200
  napi_set_element(env, result, static_cast<int>(idx + 0), key);
1520
1201
  napi_set_element(env, result, static_cast<int>(idx + 1), val);
1521
1202
  }
1522
1203
 
1523
- iterator_->cache_.clear();
1204
+ cache_.clear();
1524
1205
 
1525
1206
  napi_value argv[3];
1526
1207
  napi_get_null(env, &argv[0]);
1527
1208
  argv[1] = result;
1528
- napi_get_boolean(env, !ok_, &argv[2]);
1209
+ napi_get_boolean(env, !finished_, &argv[2]);
1529
1210
  CallFunction(env, callback, 3, argv);
1530
1211
  }
1531
1212
 
1532
- void DoFinally (napi_env env) override {
1533
- // clean up & handle the next/end state
1534
- iterator_->nexting_ = false;
1535
-
1536
- if (iterator_->closeWorker_) {
1537
- iterator_->closeWorker_->Queue(env);
1538
- iterator_->closeWorker_ = nullptr;
1539
- }
1540
-
1541
- BaseWorker::DoFinally(env);
1542
- }
1543
-
1544
1213
  private:
1545
- Iterator* iterator_;
1546
- uint32_t size_;
1547
- bool ok_;
1214
+ std::vector<std::string> cache_;
1215
+ Iterator* iterator_ = nullptr;
1216
+ uint32_t size_ = 0;
1217
+ bool finished_ = false;
1548
1218
  };
1549
1219
 
1550
1220
  NAPI_METHOD(iterator_nextv) {
@@ -1557,99 +1227,55 @@ NAPI_METHOD(iterator_nextv) {
1557
1227
 
1558
1228
  const auto callback = argv[2];
1559
1229
 
1560
- if (iterator->isClosing_) {
1561
- napi_value argv = CreateCodeError(env, "LEVEL_ITERATOR_NOT_OPEN", "Iterator is not open");
1562
- NAPI_STATUS_THROWS(CallFunction(env, callback, 1, &argv));
1563
- return 0;
1564
- }
1565
-
1566
1230
  auto worker = new NextWorker(env, iterator, size, callback);
1567
- iterator->nexting_ = true;
1568
1231
  worker->Queue(env);
1569
1232
 
1570
1233
  return 0;
1571
1234
  }
1572
1235
 
1573
- /**
1574
- * Worker class for batch write operation.
1575
- */
1576
- struct BatchWorker final : public PriorityWorker {
1577
- BatchWorker (napi_env env,
1578
- Database* database,
1579
- napi_value callback,
1580
- leveldb::WriteBatch* batch,
1581
- const bool sync,
1582
- const bool hasData)
1583
- : PriorityWorker(env, database, callback, "rocks_level.batch.do"),
1584
- batch_(batch), hasData_(hasData) {
1585
- options_.sync = sync;
1586
- }
1587
-
1588
- ~BatchWorker () {
1589
- delete batch_;
1590
- }
1591
-
1592
- void DoExecute () override {
1593
- if (hasData_) {
1594
- SetStatus(database_->WriteBatch(options_, batch_));
1595
- }
1596
- }
1597
-
1598
- private:
1599
- leveldb::WriteOptions options_;
1600
- leveldb::WriteBatch* batch_;
1601
- const bool hasData_;
1602
- };
1603
-
1604
1236
  NAPI_METHOD(batch_do) {
1605
- NAPI_ARGV(4);
1237
+ NAPI_ARGV(3);
1606
1238
  NAPI_DB_CONTEXT();
1607
1239
 
1608
- const auto array = argv[1];
1609
- const auto sync = BooleanProperty(env, argv[2], "sync", false);
1610
- const auto callback = argv[3];
1240
+ const auto operations = argv[1];
1611
1241
 
1612
- uint32_t length;
1613
- napi_get_array_length(env, array, &length);
1242
+ rocksdb::WriteBatch batch;
1614
1243
 
1615
- leveldb::WriteBatch* batch = new leveldb::WriteBatch();
1616
- bool hasData = false;
1244
+ uint32_t length;
1245
+ NAPI_STATUS_THROWS(napi_get_array_length(env, operations, &length));
1617
1246
 
1618
1247
  for (uint32_t i = 0; i < length; i++) {
1619
1248
  napi_value element;
1620
- napi_get_element(env, array, i, &element);
1249
+ NAPI_STATUS_THROWS(napi_get_element(env, operations, i, &element));
1621
1250
 
1622
1251
  if (!IsObject(env, element)) continue;
1623
1252
 
1624
- std::string type = StringProperty(env, element, "type");
1253
+ const auto type = StringProperty(env, element, "type");
1625
1254
 
1626
1255
  if (type == "del") {
1627
1256
  if (!HasProperty(env, element, "key")) continue;
1628
- const auto key = ToString(env, GetProperty(env, element, "key"));
1629
1257
 
1630
- batch->Delete(key);
1631
- if (!hasData) hasData = true;
1258
+ const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1259
+
1260
+ batch.Delete(key);
1632
1261
  } else if (type == "put") {
1633
1262
  if (!HasProperty(env, element, "key")) continue;
1634
1263
  if (!HasProperty(env, element, "value")) continue;
1635
1264
 
1636
- const auto key = ToString(env, GetProperty(env, element, "key"));
1637
- const auto value = ToString(env, GetProperty(env, element, "value"));
1265
+ const auto key = NapiSlice(env, GetProperty(env, element, "key"));
1266
+ const auto value = NapiSlice(env, GetProperty(env, element, "value"));
1638
1267
 
1639
- batch->Put(key, value);
1640
- if (!hasData) hasData = true;
1268
+ batch.Put(key, value);
1641
1269
  }
1642
1270
  }
1643
1271
 
1644
- auto worker = new BatchWorker(env, database, callback, batch, sync, hasData);
1645
- worker->Queue(env);
1646
-
1647
- return 0;
1272
+ rocksdb::WriteOptions options;
1273
+ return ToError(env, database->db_->Write(options, &batch));
1648
1274
  }
1649
1275
 
1650
1276
  static void FinalizeBatch (napi_env env, void* data, void* hint) {
1651
1277
  if (data) {
1652
- delete reinterpret_cast<leveldb::WriteBatch*>(data);
1278
+ delete reinterpret_cast<rocksdb::WriteBatch*>(data);
1653
1279
  }
1654
1280
  }
1655
1281
 
@@ -1657,12 +1283,10 @@ NAPI_METHOD(batch_init) {
1657
1283
  NAPI_ARGV(1);
1658
1284
  NAPI_DB_CONTEXT();
1659
1285
 
1660
- auto batch = new leveldb::WriteBatch();
1286
+ auto batch = new rocksdb::WriteBatch();
1661
1287
 
1662
1288
  napi_value result;
1663
- NAPI_STATUS_THROWS(napi_create_external(env, batch,
1664
- FinalizeBatch,
1665
- nullptr, &result));
1289
+ NAPI_STATUS_THROWS(napi_create_external(env, batch, FinalizeBatch, nullptr, &result));
1666
1290
  return result;
1667
1291
  }
1668
1292
 
@@ -1670,8 +1294,8 @@ NAPI_METHOD(batch_put) {
1670
1294
  NAPI_ARGV(3);
1671
1295
  NAPI_BATCH_CONTEXT();
1672
1296
 
1673
- const auto key = ToString(env, argv[1]);
1674
- const auto value = ToString(env, argv[2]);
1297
+ const auto key = NapiSlice(env, argv[1]);
1298
+ const auto value = NapiSlice(env, argv[2]);
1675
1299
 
1676
1300
  batch->Put(key, value);
1677
1301
 
@@ -1682,7 +1306,7 @@ NAPI_METHOD(batch_del) {
1682
1306
  NAPI_ARGV(2);
1683
1307
  NAPI_BATCH_CONTEXT();
1684
1308
 
1685
- const auto key = ToString(env, argv[1]);
1309
+ const auto key = NapiSlice(env, argv[1]);
1686
1310
 
1687
1311
  batch->Delete(key);
1688
1312
 
@@ -1698,51 +1322,15 @@ NAPI_METHOD(batch_clear) {
1698
1322
  return 0;
1699
1323
  }
1700
1324
 
1701
- struct BatchWriteWorker final : public PriorityWorker {
1702
- BatchWriteWorker (napi_env env,
1703
- Database* database,
1704
- napi_value batch,
1705
- napi_value callback,
1706
- const bool sync)
1707
- : PriorityWorker(env, database, callback, "leveldown.batch.write"),
1708
- sync_(sync) {
1709
-
1710
- NAPI_STATUS_THROWS_VOID(napi_get_value_external(env, batch, reinterpret_cast<void**>(&batch_)));
1711
-
1712
- // Prevent GC of batch object before we execute
1713
- NAPI_STATUS_THROWS_VOID(napi_create_reference(env, batch, 1, &batchRef_));
1714
- }
1715
-
1716
- void DoExecute () override {
1717
- leveldb::WriteOptions options;
1718
- options.sync = sync_;
1719
- SetStatus(database_->WriteBatch(options, batch_));
1720
- }
1721
-
1722
- void DoFinally (napi_env env) override {
1723
- napi_delete_reference(env, batchRef_);
1724
- PriorityWorker::DoFinally(env);
1725
- }
1726
-
1727
- private:
1728
- leveldb::WriteBatch* batch_;
1729
- const bool sync_;
1730
- napi_ref batchRef_;
1731
- };
1732
-
1733
1325
  NAPI_METHOD(batch_write) {
1734
1326
  NAPI_ARGV(4);
1735
1327
  NAPI_DB_CONTEXT();
1736
1328
 
1737
- const auto batch = argv[1];
1738
- const auto options = argv[2];
1739
- const auto sync = BooleanProperty(env, options, "sync", false);
1740
- const auto callback = argv[3];
1741
-
1742
- auto worker = new BatchWriteWorker(env, database, batch, callback, sync);
1743
- worker->Queue(env);
1329
+ rocksdb::WriteBatch* batch;
1330
+ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[1], reinterpret_cast<void**>(&batch)));
1744
1331
 
1745
- return 0;
1332
+ rocksdb::WriteOptions options;
1333
+ return ToError(env, database->db_->Write(options, batch));
1746
1334
  }
1747
1335
 
1748
1336
  NAPI_INIT() {
@@ -1754,13 +1342,8 @@ NAPI_INIT() {
1754
1342
  NAPI_EXPORT_FUNCTION(db_get_many);
1755
1343
  NAPI_EXPORT_FUNCTION(db_del);
1756
1344
  NAPI_EXPORT_FUNCTION(db_clear);
1757
- NAPI_EXPORT_FUNCTION(db_approximate_size);
1758
- NAPI_EXPORT_FUNCTION(db_compact_range);
1759
1345
  NAPI_EXPORT_FUNCTION(db_get_property);
1760
1346
 
1761
- NAPI_EXPORT_FUNCTION(destroy_db);
1762
- NAPI_EXPORT_FUNCTION(repair_db);
1763
-
1764
1347
  NAPI_EXPORT_FUNCTION(iterator_init);
1765
1348
  NAPI_EXPORT_FUNCTION(iterator_seek);
1766
1349
  NAPI_EXPORT_FUNCTION(iterator_close);