@nxtedition/rocksdb 13.5.8 → 13.5.9

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 (508) hide show
  1. package/binding.cc +209 -2
  2. package/deps/rocksdb/rocksdb/BUCK +12 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  4. package/deps/rocksdb/rocksdb/Makefile +28 -23
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  7. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  10. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  11. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  12. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  14. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  15. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  16. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  18. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  23. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  25. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  26. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  27. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  28. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  29. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  30. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  31. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  32. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  57. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  59. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  60. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  61. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  62. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  67. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  68. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  69. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  70. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  86. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  87. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  88. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  89. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  90. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  91. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  92. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  93. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  94. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  95. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  96. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  97. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  98. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  99. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  100. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  101. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  102. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  104. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  105. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  106. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  107. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  108. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  109. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  110. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  111. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  112. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  113. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  114. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  115. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  116. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  117. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  118. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  119. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  120. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  124. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  125. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  126. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  127. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  129. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  130. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  131. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  132. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  133. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  134. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  135. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  136. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  137. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  138. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  139. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  140. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  141. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  142. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  143. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  144. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  145. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  146. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  147. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  148. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  149. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  150. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  153. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  154. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  155. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  156. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  157. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  158. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  160. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  161. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  163. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  164. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  165. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  166. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  168. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  169. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  170. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  171. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  172. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  173. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  174. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  175. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  176. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  177. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  178. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  179. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  180. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  181. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  182. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  191. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  193. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  194. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  195. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  196. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  198. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  199. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  200. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  201. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  202. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  204. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  205. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  206. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  207. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  210. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  212. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  213. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  214. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  215. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  218. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  220. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  221. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  224. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  226. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  228. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  229. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  230. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  232. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  234. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  235. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  238. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  241. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  242. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  243. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  245. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  247. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  249. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  253. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  254. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  257. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  260. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  269. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  270. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  276. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  277. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  278. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  279. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  281. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  283. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  284. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  285. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  286. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  288. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  289. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  290. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  291. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  292. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  293. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  294. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  295. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  296. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  297. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  298. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  299. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  300. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  301. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  302. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  303. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  304. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  305. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  306. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  307. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  308. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  309. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  310. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  311. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  312. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  314. package/deps/rocksdb/rocksdb/src.mk +17 -11
  315. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  316. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  325. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  327. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  328. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  329. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  330. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  334. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  335. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  338. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  340. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  342. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  343. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  345. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  349. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  350. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  351. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  352. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  353. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  354. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  356. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  357. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  362. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  364. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  366. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  367. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  368. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  369. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  370. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  371. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  372. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  374. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  376. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  377. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  380. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  381. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  382. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  384. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  385. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  386. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  388. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  391. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  393. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  395. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  396. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  397. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  398. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  399. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  400. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  401. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  402. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  403. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  404. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  405. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  406. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  408. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  409. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  410. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  411. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  412. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  413. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  414. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  416. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  428. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  430. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  433. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  435. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  436. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  437. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  439. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  442. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  443. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  458. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  464. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  467. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  468. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  479. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  482. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  485. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  486. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  499. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  500. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  504. package/deps/rocksdb/rocksdb.gyp +5 -0
  505. package/index.js +47 -2
  506. package/package.json +8 -1
  507. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  508. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -62,23 +62,37 @@ class WBWIIterator {
62
62
 
63
63
  virtual void SeekToLast() = 0;
64
64
 
65
- virtual void Seek(const Slice& key) = 0;
65
+ // Move to the first entry with key >= target.
66
+ // If there are multiple updates to the same key, the most recent update is
67
+ // ordered first. If `overwrite_key` is true for this WBWI, this should only
68
+ // affect iterator output if the write batch contains Merge.
69
+ virtual void Seek(const Slice& target) = 0;
66
70
 
67
- virtual void SeekForPrev(const Slice& key) = 0;
71
+ // Move to the last entry with key <= target.
72
+ // If there are multiple updates to the same key, this will move iterator
73
+ // to the last entry, which is the oldest update.
74
+ virtual void SeekForPrev(const Slice& target) = 0;
68
75
 
69
76
  virtual void Next() = 0;
70
77
 
71
78
  virtual void Prev() = 0;
72
79
 
73
- // the return WriteEntry is only valid until the next mutation of
74
- // WriteBatchWithIndex
80
+ virtual Status status() const = 0;
81
+
82
+ // The returned WriteEntry is only valid until the next mutation of
83
+ // WriteBatchWithIndex.
75
84
  virtual WriteEntry Entry() const = 0;
76
85
 
77
86
  // For this user key, there is a single delete in this write batch,
78
87
  // and it was overwritten by another update.
79
88
  virtual bool HasOverWrittenSingleDel() const { return false; }
80
89
 
81
- virtual Status status() const = 0;
90
+ // Returns n where the current entry is the n-th update to the current key.
91
+ // The update count starts from 1.
92
+ // Only valid if WBWI is created with overwrite_key = true.
93
+ // With overwrite_key=false, update count for each entry is not maintained,
94
+ // see UpdateExistingEntryWithCfId().
95
+ virtual uint32_t GetUpdateCount() const { return 0; }
82
96
  };
83
97
 
84
98
  // A WriteBatchWithIndex with a binary searchable index built for all the keys
@@ -87,6 +101,8 @@ class WBWIIterator {
87
101
  // time, indexes will be built. By calling GetWriteBatch(), a user will get the
88
102
  // WriteBatch for the data they inserted, which can be used for DB::Write(). A
89
103
  // user can call NewIterator() to create an iterator.
104
+ // If there are multiple updates to the same key, the most recent update is
105
+ // ordered first (i.e. the iterator will return the most recent update first).
90
106
  class WriteBatchWithIndex : public WriteBatchBase {
91
107
  public:
92
108
  // backup_index_comparator: the backup comparator used to compare keys
@@ -98,6 +114,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
98
114
  // overwrite_key: if true, overwrite the key in the index when inserting
99
115
  // the same key as previously, so iterator will never
100
116
  // show two entries with the same key.
117
+ // Note that for Merge, it's added as a new update instead
118
+ // of overwriting the existing one.
101
119
  explicit WriteBatchWithIndex(
102
120
  const Comparator* backup_index_comparator = BytewiseComparator(),
103
121
  size_t reserved_bytes = 0, bool overwrite_key = false,
@@ -195,8 +213,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
195
213
  // if overwrite_key=false, then each update will be returned as a separate
196
214
  // entry, in the order of update time.
197
215
  // if overwrite_key=true, then one entry per key will be returned. Merge
198
- // updates on the same key will be returned as separate entries.
199
- //
216
+ // updates on the same key will be returned as separate entries, with most
217
+ // recent update ordered first.
200
218
  // The returned iterator should be deleted by the caller.
201
219
  WBWIIterator* NewIterator(ColumnFamilyHandle* column_family);
202
220
  // Create an iterator of the default column family.
@@ -218,7 +236,8 @@ class WriteBatchWithIndex : public WriteBatchBase {
218
236
  Iterator* base_iterator,
219
237
  const ReadOptions* opts = nullptr);
220
238
  // default column family
221
- Iterator* NewIteratorWithBase(Iterator* base_iterator);
239
+ Iterator* NewIteratorWithBase(Iterator* base_iterator,
240
+ const ReadOptions* opts = nullptr);
222
241
 
223
242
  // Similar to DB::Get() but will only read the key from this batch.
224
243
  // If the batch does not have enough data to resolve Merge operations,
@@ -229,7 +248,7 @@ class WriteBatchWithIndex : public WriteBatchBase {
229
248
 
230
249
  // Similar to previous function but does not require a column_family.
231
250
  // Note: An InvalidArgument status will be returned if there are any Merge
232
- // operators for this key. Use previous method instead.
251
+ // operators for this key. Use previous method instead.
233
252
  Status GetFromBatch(const DBOptions& options, const Slice& key,
234
253
  std::string* value) {
235
254
  return GetFromBatch(nullptr, options, key, value);
@@ -358,9 +377,6 @@ class WriteBatchWithIndex : public WriteBatchBase {
358
377
  uint32_t entry_count = 0;
359
378
  uint32_t overwritten_sd_count = 0;
360
379
  };
361
- // Will track CF ID, per CF entry count and overwritten sd count.
362
- // Should be enabled when WBWI is empty for correct tracking.
363
- void SetTrackPerCFStat(bool track);
364
380
  const std::unordered_map<uint32_t, CFStat>& GetCFStats() const;
365
381
 
366
382
  bool GetOverwriteKey() const;
@@ -11,9 +11,9 @@
11
11
 
12
12
  // NOTE: in 'main' development branch, this should be the *next*
13
13
  // minor or major version number planned for release.
14
- #define ROCKSDB_MAJOR 9
15
- #define ROCKSDB_MINOR 10
16
- #define ROCKSDB_PATCH 0
14
+ #define ROCKSDB_MAJOR 10
15
+ #define ROCKSDB_MINOR 4
16
+ #define ROCKSDB_PATCH 2
17
17
 
18
18
  // Do not use these. We made the mistake of declaring macros starting with
19
19
  // double underscore. Now we have to live with our choice. We'll deprecate these
@@ -4,7 +4,6 @@
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
  //
6
6
 
7
-
8
7
  #include "logging/auto_roll_logger.h"
9
8
 
10
9
  #include <sys/stat.h>
@@ -728,4 +727,3 @@ int main(int argc, char** argv) {
728
727
  ::testing::InitGoogleTest(&argc, argv);
729
728
  return RUN_ALL_TESTS();
730
729
  }
731
-
@@ -28,8 +28,7 @@ class StringLogger : public Logger {
28
28
  TEST_F(EventLoggerTest, SimpleTest) {
29
29
  StringLogger logger;
30
30
  EventLogger event_logger(&logger);
31
- event_logger.Log() << "id" << 5 << "event"
32
- << "just_testing";
31
+ event_logger.Log() << "id" << 5 << "event" << "just_testing";
33
32
  std::string output(logger.buffer());
34
33
  ASSERT_TRUE(output.find("\"event\": \"just_testing\"") != std::string::npos);
35
34
  ASSERT_TRUE(output.find("\"id\": 5") != std::string::npos);
@@ -31,7 +31,7 @@ using CacheAllocationPtr = std::unique_ptr<char[], CustomDeleter>;
31
31
  inline CacheAllocationPtr AllocateBlock(size_t size,
32
32
  MemoryAllocator* allocator) {
33
33
  if (allocator) {
34
- auto block = reinterpret_cast<char*>(allocator->Allocate(size));
34
+ auto block = static_cast<char*>(allocator->Allocate(size));
35
35
  return CacheAllocationPtr(block, allocator);
36
36
  }
37
37
  return CacheAllocationPtr(new char[size]);
@@ -226,7 +226,6 @@ INSTANTIATE_TEST_CASE_P(
226
226
  JemallocNodumpAllocator::IsSupported())));
227
227
  #endif // ROCKSDB_JEMALLOC
228
228
 
229
-
230
229
  } // namespace ROCKSDB_NAMESPACE
231
230
 
232
231
  int main(int argc, char** argv) {
@@ -4,7 +4,6 @@
4
4
  // (found in the LICENSE.Apache file in the root directory).
5
5
  //
6
6
 
7
-
8
7
  #include <algorithm>
9
8
  #include <atomic>
10
9
 
@@ -352,7 +352,9 @@ class SeqReadBenchmarkThread : public BenchmarkThread {
352
352
 
353
353
  void operator()() override {
354
354
  for (unsigned int i = 0; i < num_ops_; ++i) {
355
- { ReadOneSeq(); }
355
+ {
356
+ ReadOneSeq();
357
+ }
356
358
  }
357
359
  }
358
360
  };
@@ -134,8 +134,8 @@ class SkipList {
134
134
  // i up to max_height_ is the predecessor of prev_[0] and prev_height_
135
135
  // is the height of prev_[0]. prev_[0] can only be equal to head before
136
136
  // insertion, in which case max_height_ and prev_height_ are 1.
137
- Node** prev_;
138
137
  int32_t prev_height_;
138
+ Node** prev_;
139
139
 
140
140
  inline int GetMaxHeight() const {
141
141
  return max_height_.load(std::memory_order_relaxed);
@@ -438,7 +438,7 @@ SkipList<Key, Comparator>::SkipList(const Comparator cmp, Allocator* allocator,
438
438
  kScaledInverseBranching_((Random::kMaxNext + 1) / kBranching_),
439
439
  compare_(cmp),
440
440
  allocator_(allocator),
441
- head_(NewNode(0 /* any key will do */, max_height)),
441
+ head_(NewNode({} /* any key will do */, max_height)),
442
442
  max_height_(1),
443
443
  prev_height_(1) {
444
444
  assert(max_height > 0 && kMaxHeight_ == static_cast<uint32_t>(max_height));
@@ -366,13 +366,11 @@ class SkipListRep : public MemTableRep {
366
366
  if (lookahead_ > 0) {
367
367
  void* mem =
368
368
  arena ? arena->AllocateAligned(sizeof(SkipListRep::LookaheadIterator))
369
- :
370
- operator new(sizeof(SkipListRep::LookaheadIterator));
369
+ : operator new(sizeof(SkipListRep::LookaheadIterator));
371
370
  return new (mem) SkipListRep::LookaheadIterator(*this);
372
371
  } else {
373
372
  void* mem = arena ? arena->AllocateAligned(sizeof(SkipListRep::Iterator))
374
- :
375
- operator new(sizeof(SkipListRep::Iterator));
373
+ : operator new(sizeof(SkipListRep::Iterator));
376
374
  return new (mem) SkipListRep::Iterator(&skip_list_);
377
375
  }
378
376
  }
@@ -30,6 +30,8 @@ class VectorRep : public MemTableRep {
30
30
  // collection.
31
31
  void Insert(KeyHandle handle) override;
32
32
 
33
+ void InsertConcurrently(KeyHandle handle) override;
34
+
33
35
  // Returns true iff an entry that compares equal to key is in the collection.
34
36
  bool Contains(const char* key) const override;
35
37
 
@@ -40,6 +42,8 @@ class VectorRep : public MemTableRep {
40
42
  void Get(const LookupKey& k, void* callback_args,
41
43
  bool (*callback_func)(void* arg, const char* entry)) override;
42
44
 
45
+ void BatchPostProcess() override;
46
+
43
47
  ~VectorRep() override = default;
44
48
 
45
49
  class Iterator : public MemTableRep::Iterator {
@@ -79,6 +83,10 @@ class VectorRep : public MemTableRep {
79
83
  // Advance to the first entry with a key >= target
80
84
  void Seek(const Slice& user_key, const char* memtable_key) override;
81
85
 
86
+ // Seek and do some memory validation
87
+ Status SeekAndValidate(const Slice& internal_key, const char* memtable_key,
88
+ bool allow_data_in_errors) override;
89
+
82
90
  // Advance to the first entry with a key <= target
83
91
  void SeekForPrev(const Slice& user_key, const char* memtable_key) override;
84
92
 
@@ -96,19 +104,40 @@ class VectorRep : public MemTableRep {
96
104
 
97
105
  private:
98
106
  friend class Iterator;
107
+ ALIGN_AS(CACHE_LINE_SIZE) RelaxedAtomic<size_t> bucket_size_;
99
108
  using Bucket = std::vector<const char*>;
100
109
  std::shared_ptr<Bucket> bucket_;
101
110
  mutable port::RWMutex rwlock_;
102
111
  bool immutable_;
103
112
  bool sorted_;
104
113
  const KeyComparator& compare_;
114
+ // Thread-local vector to buffer concurrent writes.
115
+ using TlBucket = std::vector<const char*>;
116
+ ThreadLocalPtr tl_writes_;
117
+
118
+ static void DeleteTlBucket(void* ptr) {
119
+ auto* v = static_cast<TlBucket*>(ptr);
120
+ delete v;
121
+ }
105
122
  };
106
123
 
107
124
  void VectorRep::Insert(KeyHandle handle) {
108
125
  auto* key = static_cast<char*>(handle);
109
- WriteLock l(&rwlock_);
110
- assert(!immutable_);
111
- bucket_->push_back(key);
126
+ {
127
+ WriteLock l(&rwlock_);
128
+ assert(!immutable_);
129
+ bucket_->push_back(key);
130
+ }
131
+ bucket_size_.FetchAddRelaxed(1);
132
+ }
133
+
134
+ void VectorRep::InsertConcurrently(KeyHandle handle) {
135
+ auto* v = static_cast<TlBucket*>(tl_writes_.Get());
136
+ if (!v) {
137
+ v = new TlBucket();
138
+ tl_writes_.Reset(v);
139
+ }
140
+ v->push_back(static_cast<char*>(handle));
112
141
  }
113
142
 
114
143
  // Returns true iff an entry that compares equal to key is in the collection.
@@ -123,19 +152,35 @@ void VectorRep::MarkReadOnly() {
123
152
  }
124
153
 
125
154
  size_t VectorRep::ApproximateMemoryUsage() {
126
- return sizeof(bucket_) + sizeof(*bucket_) +
127
- bucket_->size() *
128
- sizeof(
129
- std::remove_reference<decltype(*bucket_)>::type::value_type);
155
+ return bucket_size_.LoadRelaxed() *
156
+ sizeof(std::remove_reference<decltype(*bucket_)>::type::value_type);
157
+ }
158
+
159
+ void VectorRep::BatchPostProcess() {
160
+ auto* v = static_cast<TlBucket*>(tl_writes_.Get());
161
+ if (v) {
162
+ {
163
+ WriteLock l(&rwlock_);
164
+ assert(!immutable_);
165
+ for (auto& key : *v) {
166
+ bucket_->push_back(key);
167
+ }
168
+ }
169
+ bucket_size_.FetchAddRelaxed(v->size());
170
+ delete v;
171
+ tl_writes_.Reset(nullptr);
172
+ }
130
173
  }
131
174
 
132
175
  VectorRep::VectorRep(const KeyComparator& compare, Allocator* allocator,
133
176
  size_t count)
134
177
  : MemTableRep(allocator),
178
+ bucket_size_(0),
135
179
  bucket_(new Bucket()),
136
180
  immutable_(false),
137
181
  sorted_(false),
138
- compare_(compare) {
182
+ compare_(compare),
183
+ tl_writes_(DeleteTlBucket) {
139
184
  bucket_.get()->reserve(count);
140
185
  }
141
186
 
@@ -221,6 +266,22 @@ void VectorRep::Iterator::Seek(const Slice& user_key,
221
266
  .first;
222
267
  }
223
268
 
269
+ Status VectorRep::Iterator::SeekAndValidate(const Slice& /* internal_key */,
270
+ const char* /* memtable_key */,
271
+ bool /* allow_data_in_errors */) {
272
+ if (vrep_) {
273
+ WriteLock l(&vrep_->rwlock_);
274
+ if (bucket_->begin() == bucket_->end()) {
275
+ // Memtable is empty
276
+ return Status::OK();
277
+ } else {
278
+ return Status::NotSupported("SeekAndValidate() not implemented");
279
+ }
280
+ } else {
281
+ return Status::NotSupported("SeekAndValidate() not implemented");
282
+ }
283
+ }
284
+
224
285
  // Advance to the first entry with a key <= target
225
286
  void VectorRep::Iterator::SeekForPrev(const Slice& /*user_key*/,
226
287
  const char* /*memtable_key*/) {
@@ -49,22 +49,29 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
49
49
  SequenceNumber* out_seq, const ReadOptions&,
50
50
  bool immutable_memtable, ReadCallback* callback,
51
51
  bool* is_blob_index, bool do_merge) {
52
+ assert(s->ok() || s->IsMergeInProgress());
52
53
  (void)immutable_memtable;
53
54
  (void)timestamp;
54
55
  (void)columns;
55
56
  assert(immutable_memtable);
56
57
  assert(!timestamp); // TODO: support UDT
57
- assert(!columns); // TODO: support WideColumn
58
58
  assert(assigned_seqno_.upper_bound != kMaxSequenceNumber);
59
59
  assert(assigned_seqno_.lower_bound != kMaxSequenceNumber);
60
60
  // WBWI does not support DeleteRange yet.
61
61
  assert(!wbwi_->GetWriteBatch()->HasDeleteRange());
62
+ assert(merge_context);
62
63
 
64
+ *out_seq = kMaxSequenceNumber;
63
65
  [[maybe_unused]] SequenceNumber read_seq =
64
66
  GetInternalKeySeqno(key.internal_key());
67
+ // This is memtable is a single write batch, no snapshot can be taken within
68
+ // assigned seqnos for this memtable.
69
+ assert(read_seq >= assigned_seqno_.upper_bound ||
70
+ read_seq < assigned_seqno_.lower_bound);
65
71
  std::unique_ptr<InternalIterator> iter{NewIterator()};
66
72
  iter->Seek(key.internal_key());
67
73
  const Slice lookup_user_key = key.user_key();
74
+ bool merge_in_progress = s->IsMergeInProgress();
68
75
 
69
76
  while (iter->Valid() && comparator_->EqualWithoutTimestamp(
70
77
  ExtractUserKey(iter->key()), lookup_user_key)) {
@@ -77,7 +84,6 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
77
84
  assert(type != kTypeWideColumnEntity);
78
85
  assert(type != kTypeValuePreferredSeqno);
79
86
  assert(type != kTypeDeletionWithTimestamp);
80
- assert(type != kTypeMerge);
81
87
  if (!callback || callback->IsVisible(seq)) {
82
88
  if (*out_seq == kMaxSequenceNumber) {
83
89
  *out_seq = std::max(seq, *max_covering_tombstone_seq);
@@ -88,7 +94,7 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
88
94
  switch (type) {
89
95
  case kTypeValue: {
90
96
  HandleTypeValue(lookup_user_key, iter->value(), iter->IsValuePinned(),
91
- do_merge, s->IsMergeInProgress(), merge_context,
97
+ do_merge, merge_in_progress, merge_context,
92
98
  moptions_.merge_operator, clock_,
93
99
  moptions_.statistics, moptions_.info_log, s, value,
94
100
  columns, is_blob_index);
@@ -98,16 +104,29 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
98
104
  case kTypeDeletion:
99
105
  case kTypeSingleDeletion:
100
106
  case kTypeRangeDeletion: {
101
- HandleTypeDeletion(lookup_user_key, s->IsMergeInProgress(),
102
- merge_context, moptions_.merge_operator, clock_,
107
+ HandleTypeDeletion(lookup_user_key, merge_in_progress, merge_context,
108
+ moptions_.merge_operator, clock_,
103
109
  moptions_.statistics, moptions_.info_log, s, value,
104
110
  columns);
105
111
  assert(seq <= read_seq);
106
112
  return /*found_final_value=*/true;
107
113
  }
114
+ case kTypeMerge: {
115
+ merge_in_progress = true;
116
+ if (ReadOnlyMemTable::HandleTypeMerge(
117
+ lookup_user_key, iter->value(), iter->IsValuePinned(),
118
+ do_merge, merge_context, moptions_.merge_operator, clock_,
119
+ moptions_.statistics, moptions_.info_log, s, value,
120
+ columns)) {
121
+ return true;
122
+ }
123
+ break;
124
+ }
108
125
  default: {
109
- std::string msg("Unrecognized or unsupported value type: " +
110
- std::to_string(static_cast<int>(type)) + ". ");
126
+ std::string msg(
127
+ "Unrecognized or unsupported value type for "
128
+ "WBWI-based memtable: " +
129
+ std::to_string(static_cast<int>(type)) + ". ");
111
130
  msg.append("User key: " +
112
131
  ExtractUserKey(iter->key()).ToString(/*hex=*/true) + ". ");
113
132
  msg.append("seq: " + std::to_string(seq) + ".");
@@ -116,8 +135,8 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
116
135
  }
117
136
  }
118
137
  }
119
- // Current key not visible or we read a merge key
120
- assert(s->IsMergeInProgress() || (callback && !callback->IsVisible(seq)));
138
+ // Current key is a merge key or not visible
139
+ assert(merge_in_progress || (callback && !callback->IsVisible(seq)));
121
140
  iter->Next();
122
141
  }
123
142
  if (!iter->status().ok() &&
@@ -126,6 +145,10 @@ bool WBWIMemTable::Get(const LookupKey& key, std::string* value,
126
145
  // stop further look up
127
146
  return true;
128
147
  }
148
+ if (merge_in_progress) {
149
+ assert(s->ok() || s->IsMergeInProgress());
150
+ *s = Status::MergeInProgress();
151
+ }
129
152
  return /*found_final_value=*/false;
130
153
  }
131
154
 
@@ -12,13 +12,25 @@ namespace ROCKSDB_NAMESPACE {
12
12
  // of the given write batch with index (WBWI) object. This can be used to ingest
13
13
  // a transaction (which is based on WBWI) into the DB as an immutable memtable.
14
14
  //
15
- // REQUIRE overwrite_key to be true for the WBWI
16
- // Since the keys in WBWI do not have sequence number, the memtable needs to be
15
+ // REQUIRES: overwrite_key to be true for the WBWI
16
+ // Since the keys in WBWI do not have sequence number, this class is responsible
17
+ // for assigning sequence numbers to the keys. This memtable needs to be
17
18
  // assigned a range of sequence numbers through AssignSequenceNumbers(seqno)
18
19
  // before being available for reads.
19
- // With overwrite_key = true, WBWI keeps track of the most recent update for
20
- // each key, and each such key will be assigned seqno.upper_bound during reads.
21
- // One exception is during flush, consider the following scenario:
20
+ //
21
+ // The sequence number assignment uses the update count for each key
22
+ // tracked in WBWI (see WBWIIterator::GetUpdateCount()). For each key, the
23
+ // sequence number assigned is seqno.lower_bound + update_count - 1. So more
24
+ // recent updates will have higher sequence number.
25
+ //
26
+ // Since WBWI with overwrite mode keeps track of the most recent update for
27
+ // each key, this memtable contains one update per key usually. However, there
28
+ // are two exceptions:
29
+ // 1. Merge operations: Each Merge operation do not overwrite existing entries,
30
+ // if a user uses Merge, multiple entries may be kept.
31
+ // 2. Overwriten SingleDelete: this memtable needs to emit an extra
32
+ // SingleDelete even when the SD is overwritten by another update.
33
+ // Consider the following scenario:
22
34
  // - WBWI has SD(k) then PUT(k, v1)
23
35
  // - DB has PUT(k, v2) in L1
24
36
  // - flush WBWI adds PUT(k, v1) into L0
@@ -26,8 +38,7 @@ namespace ROCKSDB_NAMESPACE {
26
38
  // - flush live memtable and compact it with L0 will drop SD(k) and PUT(k, v1)
27
39
  // - the PUT(k, v2) in L1 incorrectly becomes visible
28
40
  // So during flush, iterator from this memtable will need emit overwritten
29
- // single deletion. These single deletion entries will be
30
- // assigned seqno.upper_bound - 1.
41
+ // single deletion. This SD will be assigned seqno.lower_bound.
31
42
  class WBWIMemTable final : public ReadOnlyMemTable {
32
43
  public:
33
44
  struct SeqnoRange {
@@ -224,7 +235,7 @@ class WBWIMemTable final : public ReadOnlyMemTable {
224
235
  uint64_t num_entries_;
225
236
  // WBWI can contains updates to multiple CFs. `cf_id_` determines which CF
226
237
  // this memtable is for.
227
- uint32_t cf_id_;
238
+ const uint32_t cf_id_;
228
239
  };
229
240
 
230
241
  class WBWIMemTableIterator final : public InternalIterator {
@@ -253,59 +264,51 @@ class WBWIMemTableIterator final : public InternalIterator {
253
264
  }
254
265
 
255
266
  void SeekToLast() override {
267
+ assert(!emit_overwritten_single_del_);
256
268
  it_->SeekToLast();
257
269
  UpdateKey();
258
270
  }
259
271
 
260
272
  void Seek(const Slice& target) override {
273
+ // `emit_overwritten_single_del_` is only used for flush, which does
274
+ // sequential forward scan from the beginning.
275
+ assert(!emit_overwritten_single_del_);
261
276
  Slice target_user_key = ExtractUserKey(target);
277
+ // Moves to first update >= target_user_key
262
278
  it_->Seek(target_user_key);
263
- if (it_->Valid()) {
264
- // compare seqno
265
- SequenceNumber seqno = GetInternalKeySeqno(target);
266
- assert(!emit_overwritten_single_del_);
267
- // For now all keys are assigned seqno_ub_, this may change after merge
268
- // is supported.
269
- assert(seqno <= assigned_seqno_.lower_bound ||
270
- seqno >= assigned_seqno_.upper_bound);
271
- if (seqno < assigned_seqno_.upper_bound &&
272
- comparator_->Compare(it_->Entry().key, target_user_key) == 0) {
273
- it_->Next();
274
- // TODO: cannot assume distinct keys once Merge is supported
275
- if (it_->Valid()) {
276
- assert(comparator_->Compare(it_->Entry().key, target_user_key) > 0);
277
- }
278
- }
279
+ SequenceNumber target_seqno = GetInternalKeySeqno(target);
280
+ // Move to the first entry with seqno <= target_seqno for the same
281
+ // user key or a different user key.
282
+ while (it_->Valid() &&
283
+ comparator_->Compare(it_->Entry().key, target_user_key) == 0 &&
284
+ target_seqno < CurrentKeySeqno()) {
285
+ it_->Next();
279
286
  }
280
287
  UpdateKey();
281
288
  }
282
289
 
283
290
  void SeekForPrev(const Slice& target) override {
291
+ assert(!emit_overwritten_single_del_);
284
292
  Slice target_user_key = ExtractUserKey(target);
293
+ // Moves to last update <= target_user_key
285
294
  it_->SeekForPrev(target_user_key);
286
- if (it_->Valid()) {
287
- SequenceNumber seqno = GetInternalKeySeqno(target);
288
- assert(seqno <= assigned_seqno_.lower_bound ||
289
- seqno >= assigned_seqno_.upper_bound);
290
- if (seqno > assigned_seqno_.upper_bound &&
291
- comparator_->Compare(it_->Entry().key, target_user_key) == 0) {
292
- it_->Prev();
293
- if (it_->Valid()) {
294
- // TODO: cannot assume distinct keys once Merge is supported
295
- assert(comparator_->Compare(it_->Entry().key, target_user_key) < 0);
296
- }
297
- }
295
+ SequenceNumber target_seqno = GetInternalKeySeqno(target);
296
+ // Move to the first entry with seqno >= target_seqno for the same
297
+ // user key or a different user key.
298
+ while (it_->Valid() &&
299
+ comparator_->Compare(it_->Entry().key, target_user_key) == 0 &&
300
+ CurrentKeySeqno() < target_seqno) {
301
+ it_->Prev();
298
302
  }
299
303
  UpdateKey();
300
304
  }
301
305
 
302
306
  void Next() override {
303
- // Only need to emit single deletion during flush. Since Flush does
304
- // sequential forward scan, we only need to emit single deletion in Next(),
305
- // and do not need to consider iterator direction change.
306
307
  assert(Valid());
307
308
  if (emit_overwritten_single_del_) {
308
309
  if (it_->HasOverWrittenSingleDel() && !at_overwritten_single_del_) {
310
+ // Merge and SingleDelete on the same key is undefined behavior.
311
+ assert(it_->Entry().type != kMergeRecord);
309
312
  UpdateSingleDeleteKey();
310
313
  return;
311
314
  }
@@ -329,6 +332,7 @@ class WBWIMemTableIterator final : public InternalIterator {
329
332
  }
330
333
 
331
334
  void Prev() override {
335
+ assert(!emit_overwritten_single_del_);
332
336
  assert(Valid());
333
337
  it_->Prev();
334
338
  UpdateKey();
@@ -341,7 +345,6 @@ class WBWIMemTableIterator final : public InternalIterator {
341
345
 
342
346
  Slice value() const override {
343
347
  assert(Valid());
344
- // TODO: it_->Entry() is not trivial, cache it
345
348
  return it_->Entry().value;
346
349
  }
347
350
 
@@ -355,6 +358,16 @@ class WBWIMemTableIterator final : public InternalIterator {
355
358
  private:
356
359
  static const std::unordered_map<WriteType, ValueType> WriteTypeToValueTypeMap;
357
360
 
361
+ SequenceNumber CurrentKeySeqno() {
362
+ assert(it_->Valid());
363
+ assert(it_->GetUpdateCount() >= 1);
364
+ auto seq = assigned_seqno_.lower_bound + it_->GetUpdateCount() - 1;
365
+ assert(seq <= assigned_seqno_.upper_bound);
366
+ return seq;
367
+ }
368
+
369
+ // If it_ is valid, udate key_ to an internal key containing it_ current
370
+ // key, CurrentKeySeqno() and a type corresponding to it_ current entry type.
358
371
  void UpdateKey() {
359
372
  valid_ = it_->Valid();
360
373
  if (!Valid()) {
@@ -367,19 +380,19 @@ class WBWIMemTableIterator final : public InternalIterator {
367
380
  key_.clear();
368
381
  valid_ = false;
369
382
  s_ = Status::Corruption("Unexpected write_batch_with_index entry type " +
370
- std::to_string(t->second));
383
+ std::to_string(it_->Entry().type));
371
384
  return;
372
385
  }
373
- key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.upper_bound,
374
- t->second);
386
+ key_buf_.SetInternalKey(it_->Entry().key, CurrentKeySeqno(), t->second);
375
387
  key_ = key_buf_.GetInternalKey();
376
388
  }
377
389
 
378
390
  void UpdateSingleDeleteKey() {
379
391
  assert(it_->Valid());
380
392
  assert(Valid());
381
- assert(assigned_seqno_.lower_bound < assigned_seqno_.upper_bound);
382
- key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.upper_bound - 1,
393
+ // The key that overwrites this SingleDelete will be assigned at least
394
+ // seqno lower_bound + 1 (see CurrentKeySeqno()).
395
+ key_buf_.SetInternalKey(it_->Entry().key, assigned_seqno_.lower_bound,
383
396
  kTypeSingleDeletion);
384
397
  key_ = key_buf_.GetInternalKey();
385
398
  at_overwritten_single_del_ = true;
@@ -88,7 +88,7 @@ struct HistogramStat {
88
88
  class Histogram {
89
89
  public:
90
90
  Histogram() {}
91
- virtual ~Histogram(){}
91
+ virtual ~Histogram() {}
92
92
 
93
93
  virtual void Clear() = 0;
94
94
  virtual bool Empty() const = 0;