@nxtedition/rocksdb 13.5.7 → 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 (509) hide show
  1. package/binding.cc +248 -70
  2. package/binding.gyp +2 -2
  3. package/deps/rocksdb/rocksdb/BUCK +12 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  5. package/deps/rocksdb/rocksdb/Makefile +28 -23
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  16. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  26. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  27. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  28. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  29. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  31. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  59. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  60. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  61. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  63. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  64. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  65. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  66. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  67. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  68. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  69. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  70. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  71. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  87. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  88. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  89. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  90. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  91. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  92. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  93. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  95. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  96. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  97. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  98. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  99. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  100. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  101. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  102. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  104. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  105. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  106. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  107. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  108. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  109. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  110. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  111. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  112. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  113. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  114. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  115. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  116. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  117. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  118. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  119. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  120. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  124. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  125. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  126. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  127. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  129. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  130. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  131. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  132. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  133. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  134. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  135. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  136. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  137. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  138. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  139. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  140. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  141. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  142. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  143. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  144. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  145. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  146. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  147. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  148. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  149. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  150. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  153. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  154. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  155. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  156. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  157. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  158. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  160. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  161. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  163. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  164. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  165. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  166. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  168. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  169. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  170. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  171. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  172. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  173. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  174. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  175. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  176. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  177. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  178. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  180. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  181. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  182. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  191. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  193. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  194. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  195. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  196. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  198. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  199. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  200. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  201. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  202. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  204. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  205. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  206. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  207. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  210. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  212. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  213. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  214. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  215. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  218. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  220. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  221. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  224. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  226. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  228. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  229. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  230. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  232. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  234. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  235. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  238. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  241. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  242. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  243. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  245. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  249. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  253. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  254. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  256. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  257. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  258. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  260. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  269. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  270. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  276. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  277. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  278. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  279. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  281. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  283. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  284. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  285. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  286. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  288. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  289. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  290. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  291. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  292. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  293. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  294. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  295. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  296. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  297. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  298. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  299. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  300. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  301. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  302. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  303. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  304. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  305. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  306. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  307. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  308. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  309. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  310. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  311. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  312. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  314. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  315. package/deps/rocksdb/rocksdb/src.mk +17 -11
  316. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  325. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  327. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  328. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  329. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  330. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  334. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  335. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  338. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  340. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  342. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  343. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  345. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  349. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  350. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  351. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  352. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  353. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  354. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  356. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  357. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  362. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  364. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  366. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  367. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  368. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  369. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  370. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  371. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  372. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  374. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  376. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  377. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  380. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  381. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  382. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  384. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  385. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  386. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  388. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  391. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  393. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  395. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  396. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  397. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  398. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  399. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  400. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  401. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  402. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  403. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  404. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  405. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  406. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  408. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  409. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  416. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  426. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  428. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  430. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  433. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  435. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  436. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  437. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  439. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  442. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  443. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  458. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  464. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  467. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  468. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  479. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  482. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  485. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  486. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  499. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  500. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  504. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  505. package/deps/rocksdb/rocksdb.gyp +9 -4
  506. package/index.js +50 -9
  507. package/package.json +8 -1
  508. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  509. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -15,7 +15,6 @@
15
15
  #include <memory>
16
16
 
17
17
  #include "db/column_family.h"
18
- #include "db/wide/wide_columns_helper.h"
19
18
  #include "memtable/wbwi_memtable.h"
20
19
  #include "port/stack_trace.h"
21
20
  #include "test_util/testharness.h"
@@ -23,7 +22,6 @@
23
22
  #include "util/random.h"
24
23
  #include "util/string_util.h"
25
24
  #include "utilities/merge_operators.h"
26
- #include "utilities/merge_operators/string_append/stringappend.h"
27
25
  #include "utilities/write_batch_with_index/write_batch_with_index_internal.h"
28
26
 
29
27
  namespace ROCKSDB_NAMESPACE {
@@ -51,6 +49,7 @@ struct Entry {
51
49
 
52
50
  struct TestHandler : public WriteBatch::Handler {
53
51
  std::map<uint32_t, std::vector<Entry>> seen;
52
+ std::map<uint32_t, std::map<std::string, uint32_t>> cf_key_count;
54
53
  Status PutCF(uint32_t column_family_id, const Slice& key,
55
54
  const Slice& value) override {
56
55
  Entry e;
@@ -58,6 +57,7 @@ struct TestHandler : public WriteBatch::Handler {
58
57
  e.value = value.ToString();
59
58
  e.type = kPutRecord;
60
59
  seen[column_family_id].push_back(e);
60
+ cf_key_count[column_family_id][e.key]++;
61
61
  return Status::OK();
62
62
  }
63
63
  Status MergeCF(uint32_t column_family_id, const Slice& key,
@@ -67,6 +67,7 @@ struct TestHandler : public WriteBatch::Handler {
67
67
  e.value = value.ToString();
68
68
  e.type = kMergeRecord;
69
69
  seen[column_family_id].push_back(e);
70
+ cf_key_count[column_family_id][e.key]++;
70
71
  return Status::OK();
71
72
  }
72
73
  void LogData(const Slice& /*blob*/) override {}
@@ -76,6 +77,16 @@ struct TestHandler : public WriteBatch::Handler {
76
77
  e.value = "";
77
78
  e.type = kDeleteRecord;
78
79
  seen[column_family_id].push_back(e);
80
+ cf_key_count[column_family_id][e.key]++;
81
+ return Status::OK();
82
+ }
83
+ Status SingleDeleteCF(uint32_t column_family_id, const Slice& key) override {
84
+ Entry e;
85
+ e.key = key.ToString();
86
+ e.value = "";
87
+ e.type = kDeleteRecord;
88
+ seen[column_family_id].push_back(e);
89
+ cf_key_count[column_family_id][e.key]++;
79
90
  return Status::OK();
80
91
  }
81
92
  };
@@ -390,6 +401,33 @@ class WBWIBaseTest : public testing::Test {
390
401
  }
391
402
  }
392
403
 
404
+ void VerifyWBWIIterUpdateCount(ColumnFamilyHandle* cfh = nullptr) {
405
+ TestHandler handler;
406
+ ASSERT_OK(batch_->GetWriteBatch()->Iterate(&handler));
407
+ auto& count_map = handler.cf_key_count[GetColumnFamilyID(cfh)];
408
+ // handler for going through write batch
409
+ std::unique_ptr<WBWIIterator> iter(batch_->NewIterator(cfh));
410
+ iter->SeekToFirst();
411
+ size_t key_seen = 0;
412
+ while (iter->Valid()) {
413
+ ASSERT_OK(iter->status());
414
+ std::string key = iter->Entry().key.ToString();
415
+ auto count = count_map[key];
416
+ ASSERT_EQ(iter->GetUpdateCount(), count);
417
+ iter->Next();
418
+ // Merge is not overwritten when WBWI is created with overrwite_key
419
+ // We can only check for decreasing update count since the update before
420
+ // Merge can be overwritten multiple times.
421
+ while (iter->Valid() && key == iter->Entry().key.ToString()) {
422
+ ASSERT_GT(count, iter->GetUpdateCount());
423
+ count = iter->GetUpdateCount();
424
+ iter->Next();
425
+ }
426
+ ++key_seen;
427
+ }
428
+ ASSERT_EQ(key_seen, count_map.size());
429
+ }
430
+
393
431
  public:
394
432
  DB* db_;
395
433
  std::string dbname_;
@@ -415,7 +453,8 @@ class WriteBatchWithIndexTest : public WBWIBaseTest,
415
453
  };
416
454
 
417
455
  void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
418
- WriteBatchWithIndex* batch) {
456
+ WriteBatchWithIndex* batch,
457
+ bool overwrite) {
419
458
  // In this test, we insert <key, value> to column family `data`, and
420
459
  // <value, key> to column family `index`. Then iterator them in order
421
460
  // and seek them by key.
@@ -425,8 +464,25 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
425
464
  // Sort entries by value
426
465
  std::map<std::string, std::vector<Entry*>> index_map;
427
466
  for (auto& e : entries) {
428
- data_map[e.key].push_back(&e);
429
- index_map[e.value].push_back(&e);
467
+ if (overwrite && e.type != kMergeRecord && data_map[e.key].size() > 0) {
468
+ data_map[e.key].back() = &e;
469
+ } else {
470
+ data_map[e.key].push_back(&e);
471
+ }
472
+
473
+ // index does not use Merge, so we overwrite the expected value
474
+ if (overwrite && index_map[e.value].size() > 0) {
475
+ index_map[e.value].back() = &e;
476
+ } else {
477
+ index_map[e.value].push_back(&e);
478
+ }
479
+ }
480
+ // Most recent update for the same key is ordered first.
481
+ for (auto& [_, v] : data_map) {
482
+ std::reverse(v.begin(), v.end());
483
+ }
484
+ for (auto& [_, v] : index_map) {
485
+ std::reverse(v.begin(), v.end());
430
486
  }
431
487
 
432
488
  ColumnFamilyHandleImplDummy data(6, BytewiseComparator());
@@ -554,6 +610,25 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
554
610
  ASSERT_OK(iter->status());
555
611
  }
556
612
  }
613
+
614
+ // SeekForPrev
615
+ for (auto pair = data_map.begin(); pair != data_map.end(); ++pair) {
616
+ iter->SeekForPrev(pair->first);
617
+ ASSERT_OK(iter->status());
618
+ // SeekForPrev positions iter at the last entry <= target.
619
+ // So we iterate updates from oldest to most recent.
620
+ for (auto v = pair->second.rbegin(); v != pair->second.rend(); ++v) {
621
+ ASSERT_TRUE(iter->Valid());
622
+ auto write_entry = iter->Entry();
623
+ ASSERT_EQ(pair->first, write_entry.key.ToString());
624
+ ASSERT_EQ((*v)->type, write_entry.type);
625
+ if (write_entry.type != kDeleteRecord) {
626
+ ASSERT_EQ((*v)->value, write_entry.value.ToString());
627
+ }
628
+ iter->Prev();
629
+ ASSERT_OK(iter->status());
630
+ }
631
+ }
557
632
  }
558
633
 
559
634
  // Seek to every index
@@ -576,6 +651,24 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
576
651
  ASSERT_OK(iter->status());
577
652
  }
578
653
  }
654
+
655
+ // SeekForPrev
656
+ for (auto pair = index_map.begin(); pair != index_map.end(); ++pair) {
657
+ iter->SeekForPrev(pair->first);
658
+ ASSERT_OK(iter->status());
659
+ // SeekForPrev positions iter at the last entry <= target.
660
+ // So we iterate updates from oldest to most recent.
661
+ for (auto v = pair->second.rbegin(); v != pair->second.rend(); ++v) {
662
+ ASSERT_TRUE(iter->Valid());
663
+ auto write_entry = iter->Entry();
664
+ ASSERT_EQ(pair->first, write_entry.key.ToString());
665
+ if ((*v)->type != kDeleteRecord) {
666
+ ASSERT_EQ((*v)->key, write_entry.value.ToString());
667
+ }
668
+ iter->Prev();
669
+ ASSERT_OK(iter->status());
670
+ }
671
+ }
579
672
  }
580
673
 
581
674
  // Verify WriteBatch can be iterated
@@ -610,7 +703,7 @@ void TestValueAsSecondaryIndexHelper(std::vector<Entry> entries,
610
703
  }
611
704
  }
612
705
 
613
- TEST_F(WBWIKeepTest, TestValueAsSecondaryIndex) {
706
+ TEST_P(WriteBatchWithIndexTest, TestValueAsSecondaryIndex) {
614
707
  Entry entries[] = {
615
708
  {"aaa", "0005", kPutRecord}, {"b", "0002", kPutRecord},
616
709
  {"cdd", "0002", kMergeRecord}, {"aab", "00001", kPutRecord},
@@ -619,23 +712,141 @@ TEST_F(WBWIKeepTest, TestValueAsSecondaryIndex) {
619
712
  };
620
713
  std::vector<Entry> entries_list(entries, entries + 8);
621
714
 
622
- batch_.reset(new WriteBatchWithIndex(nullptr, 20, false));
715
+ batch_.reset(new WriteBatchWithIndex(nullptr, 20, GetParam()));
623
716
 
624
- TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
717
+ TestValueAsSecondaryIndexHelper(entries_list, batch_.get(), GetParam());
625
718
 
626
719
  // Clear batch and re-run test with new values
627
720
  batch_->Clear();
628
721
 
629
722
  Entry new_entries[] = {
630
- {"aaa", "0005", kPutRecord}, {"e", "0002", kPutRecord},
631
- {"add", "0002", kMergeRecord}, {"aab", "00001", kPutRecord},
632
- {"zz", "00005", kPutRecord}, {"add", "0002", kPutRecord},
633
- {"aab", "0003", kPutRecord}, {"zz", "00005", kDeleteRecord},
723
+ {"aaa", "0005", kPutRecord}, {"e", "0002", kPutRecord},
724
+ {"add", "0002", kPutRecord}, {"aab", "00001", kPutRecord},
725
+ {"zz", "00005", kPutRecord}, {"add", "0002", kMergeRecord},
726
+ {"aab", "0003", kPutRecord}, {"zz", "00005", kDeleteRecord},
634
727
  };
635
728
 
636
729
  entries_list = std::vector<Entry>(new_entries, new_entries + 8);
637
730
 
638
- TestValueAsSecondaryIndexHelper(entries_list, batch_.get());
731
+ TestValueAsSecondaryIndexHelper(entries_list, batch_.get(), GetParam());
732
+ }
733
+
734
+ TEST_P(WriteBatchWithIndexTest, WBWIIteratorImpl) {
735
+ // Tests methods of WBWIIteratorImpl, with some overwrites and merges.
736
+ ASSERT_OK(batch_->Merge("k0", "k0m0"));
737
+ ASSERT_OK(batch_->Put("k0", "k0p1"));
738
+
739
+ // a merge and a non-merge
740
+ ASSERT_OK(batch_->Merge("k1", "k1m0"));
741
+ ASSERT_OK(batch_->Merge("k1", "k1m1"));
742
+
743
+ ASSERT_OK(batch_->SingleDelete("k2"));
744
+
745
+ // put then merge
746
+ ASSERT_OK(batch_->Put("k3", "k3p0"));
747
+ ASSERT_OK(batch_->Merge("k3", "k3m1"));
748
+ if (GetParam()) {
749
+ VerifyWBWIIterUpdateCount();
750
+ }
751
+
752
+ std::unique_ptr<WBWIIteratorImpl> iter(
753
+ static_cast<WBWIIteratorImpl*>(batch_->NewIterator()));
754
+
755
+ auto verify_iter = [&iter](const std::string& k, const std::string& v,
756
+ WriteType t, int line) {
757
+ SCOPED_TRACE("Called from line " + std::to_string(line));
758
+ ASSERT_TRUE(iter->Valid());
759
+ ASSERT_OK(iter->status());
760
+ const auto entry = iter->Entry();
761
+ ASSERT_EQ(entry.key, k);
762
+ if (t != kDeleteRecord && t != kSingleDeleteRecord) {
763
+ ASSERT_EQ(entry.value, v);
764
+ }
765
+ ASSERT_EQ(entry.type, t);
766
+ };
767
+
768
+ // Should land on first key >= k0, recent update is ordered first
769
+ iter->Seek("k0");
770
+ verify_iter("k0", "k0p1", kPutRecord, __LINE__);
771
+ // Should land on the first update of the next key
772
+ iter->NextKey();
773
+ verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
774
+ iter->NextKey();
775
+ verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
776
+ iter->NextKey();
777
+ verify_iter("k3", "k3m1", kMergeRecord, __LINE__);
778
+ iter->PrevKey();
779
+ verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
780
+
781
+ // Should land on last key <= k0, recent update is ordered first
782
+ iter->SeekForPrev("k3");
783
+ verify_iter("k3", "k3p0", kPutRecord, __LINE__);
784
+ iter->PrevKey();
785
+ verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
786
+ iter->PrevKey();
787
+ verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
788
+ iter->PrevKey();
789
+ verify_iter("k0", "k0p1", kPutRecord, __LINE__);
790
+ iter->NextKey();
791
+ verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
792
+
793
+ // test FindLatestUpdate
794
+ iter->SeekToFirst();
795
+ verify_iter("k0", "k0p1", kPutRecord, __LINE__);
796
+ MergeContext merge_context;
797
+ // iterator is not at k1
798
+ ASSERT_EQ(iter->FindLatestUpdate("k1", &merge_context),
799
+ WBWIIteratorImpl::Result::kNotFound);
800
+ ASSERT_EQ(merge_context.GetNumOperands(), 0);
801
+ // iterator was not moved
802
+ verify_iter("k0", "k0p1", kPutRecord, __LINE__);
803
+
804
+ // k0's most recent update is a Put
805
+ ASSERT_EQ(iter->FindLatestUpdate("k0", &merge_context),
806
+ WBWIIteratorImpl::Result::kFound);
807
+ ASSERT_EQ(merge_context.GetNumOperands(), 0);
808
+ verify_iter("k0", "k0p1", kPutRecord, __LINE__);
809
+
810
+ iter->NextKey();
811
+ verify_iter("k1", "k1m1", kMergeRecord, __LINE__);
812
+ ASSERT_EQ(iter->FindLatestUpdate("k1", &merge_context),
813
+ WBWIIteratorImpl::Result::kMergeInProgress);
814
+ ASSERT_EQ(merge_context.GetNumOperands(), 2);
815
+ auto operands = merge_context.GetOperands();
816
+ // oldest merge is ordered first
817
+ ASSERT_EQ(operands[0], "k1m0");
818
+ ASSERT_EQ(operands[1], "k1m1");
819
+ // iterator moved to last merge
820
+ verify_iter("k1", "k1m0", kMergeRecord, __LINE__);
821
+ merge_context.Clear();
822
+
823
+ iter->Next();
824
+ verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
825
+ ASSERT_EQ(iter->FindLatestUpdate("k2", &merge_context),
826
+ WBWIIteratorImpl::Result::kDeleted);
827
+ ASSERT_EQ(merge_context.GetNumOperands(), 0);
828
+ verify_iter("k2", "", kSingleDeleteRecord, __LINE__);
829
+
830
+ iter->Next();
831
+ verify_iter("k3", "k3m1", kMergeRecord, __LINE__);
832
+ // This will find latest updated of the current key
833
+ ASSERT_EQ(iter->FindLatestUpdate(&merge_context),
834
+ WBWIIteratorImpl::Result::kFound);
835
+ ASSERT_EQ(merge_context.GetNumOperands(), 1);
836
+ operands = merge_context.GetOperands();
837
+ ASSERT_EQ(operands[0], "k3m1");
838
+ // iterator moved to last merge
839
+ verify_iter("k3", "k3p0", kPutRecord, __LINE__);
840
+
841
+ // SeekToLast
842
+ iter->SeekToLast();
843
+ verify_iter("k3", "k3p0", kPutRecord, __LINE__);
844
+ // FindLatestUpdate() while we are at the older update of k3
845
+ ASSERT_EQ(iter->FindLatestUpdate(&merge_context),
846
+ WBWIIteratorImpl::Result::kFound);
847
+ ASSERT_EQ(merge_context.GetNumOperands(), 1);
848
+ operands = merge_context.GetOperands();
849
+ ASSERT_EQ(operands[0], "k3m1");
639
850
  }
640
851
 
641
852
  TEST_P(WriteBatchWithIndexTest, TestComparatorForCF) {
@@ -851,6 +1062,9 @@ TEST_P(WriteBatchWithIndexTest, TestWBWIIterator) {
851
1062
  ASSERT_OK(batch_->Delete(&cf2, "f"));
852
1063
  AssertIterEqual(iter1.get(), {"a", "c", "e"});
853
1064
  AssertIterEqual(iter2.get(), {"a", "b", "d", "f"});
1065
+ if (GetParam()) {
1066
+ VerifyWBWIIterUpdateCount();
1067
+ }
854
1068
  }
855
1069
 
856
1070
  TEST_P(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
@@ -972,6 +1186,11 @@ TEST_P(WriteBatchWithIndexTest, TestRandomIteraratorWithBase) {
972
1186
  }
973
1187
 
974
1188
  ASSERT_OK(iter->status());
1189
+ if (GetParam()) {
1190
+ VerifyWBWIIterUpdateCount(&cf1);
1191
+ VerifyWBWIIterUpdateCount(&cf2);
1192
+ VerifyWBWIIterUpdateCount(&cf3);
1193
+ }
975
1194
  }
976
1195
  }
977
1196
 
@@ -1220,6 +1439,12 @@ TEST_P(WriteBatchWithIndexTest, TestIteraratorWithBaseReverseCmp) {
1220
1439
  iter->Seek("0");
1221
1440
  AssertIter(iter.get(), "a", "b");
1222
1441
  }
1442
+
1443
+ if (GetParam()) {
1444
+ VerifyWBWIIterUpdateCount();
1445
+ VerifyWBWIIterUpdateCount(&cf1);
1446
+ VerifyWBWIIterUpdateCount(&cf2);
1447
+ }
1223
1448
  }
1224
1449
 
1225
1450
  TEST_P(WriteBatchWithIndexTest, TestGetFromBatch) {
@@ -1726,6 +1951,7 @@ TEST_F(WBWIOverwriteTest, MutateWhileIteratingBaseStressTest) {
1726
1951
  }
1727
1952
  }
1728
1953
  ASSERT_OK(iter->status());
1954
+ VerifyWBWIIterUpdateCount();
1729
1955
  }
1730
1956
 
1731
1957
  TEST_P(WriteBatchWithIndexTest, TestNewIteratorWithBaseFromWbwi) {
@@ -2476,8 +2702,8 @@ TEST_P(WriteBatchWithIndexTest, MultiGetTest2) {
2476
2702
  default:
2477
2703
  assert(false);
2478
2704
  } // end switch
2479
- } // End for each key
2480
- } // end for passes
2705
+ } // End for each key
2706
+ } // end for passes
2481
2707
  }
2482
2708
 
2483
2709
  // This test has merges, but the merge does not play into the final result
@@ -2599,7 +2825,7 @@ TEST_P(WriteBatchWithIndexTest, GetFromBatchAndDBAfterMerge) {
2599
2825
  ASSERT_EQ(value, "cc");
2600
2826
  }
2601
2827
 
2602
- TEST_F(WBWIKeepTest, GetAfterPut) {
2828
+ TEST_P(WriteBatchWithIndexTest, GetAfterPut) {
2603
2829
  std::string value;
2604
2830
  ASSERT_OK(OpenDB());
2605
2831
  ColumnFamilyHandle* cf0 = db_->DefaultColumnFamily();
@@ -2691,7 +2917,7 @@ TEST_P(WriteBatchWithIndexTest, GetAfterMergeDelete) {
2691
2917
  ASSERT_EQ(value, "cc,dd");
2692
2918
  }
2693
2919
 
2694
- TEST_F(WBWIOverwriteTest, TestBadMergeOperator) {
2920
+ TEST_P(WriteBatchWithIndexTest, TestBadMergeOperator) {
2695
2921
  class FailingMergeOperator : public MergeOperator {
2696
2922
  public:
2697
2923
  FailingMergeOperator() = default;
@@ -2837,16 +3063,17 @@ TEST_P(WriteBatchWithIndexTest, ColumnFamilyWithTimestamp) {
2837
3063
  std::string key;
2838
3064
  PutFixed32(&key, start);
2839
3065
  ASSERT_EQ(key, it->Entry().key);
2840
- if (!overwrite) {
2841
- ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
2842
- it->Next();
2843
- ASSERT_TRUE(it->Valid());
2844
- }
3066
+ // For each key, most recent update (Del) is ordered first.
2845
3067
  if (0 == (start % 2)) {
2846
3068
  ASSERT_EQ(WriteType::kDeleteRecord, it->Entry().type);
2847
3069
  } else {
2848
3070
  ASSERT_EQ(WriteType::kSingleDeleteRecord, it->Entry().type);
2849
3071
  }
3072
+ if (!overwrite) {
3073
+ it->Next();
3074
+ ASSERT_TRUE(it->Valid());
3075
+ ASSERT_EQ(WriteType::kPutRecord, it->Entry().type);
3076
+ }
2850
3077
  }
2851
3078
  }
2852
3079
  }
@@ -3419,7 +3646,6 @@ TEST_P(WriteBatchWithIndexTest, EntityReadSanityChecks) {
3419
3646
 
3420
3647
  TEST_P(WriteBatchWithIndexTest, TrackAndClearCFStats) {
3421
3648
  std::string value;
3422
- batch_->SetTrackPerCFStat(true);
3423
3649
  ASSERT_OK(batch_->Put("A", "val"));
3424
3650
  ASSERT_OK(batch_->SingleDelete("B"));
3425
3651
 
@@ -3466,15 +3692,20 @@ TEST_P(WriteBatchWithIndexTest, TrackAndClearCFStats) {
3466
3692
  INSTANTIATE_TEST_CASE_P(WBWI, WriteBatchWithIndexTest, testing::Bool());
3467
3693
 
3468
3694
  std::string Get(const std::string& k, std::unique_ptr<WBWIMemTable>& wbwi_mem,
3469
- SequenceNumber snapshot_seq, bool* found_final_value) {
3695
+ SequenceNumber snapshot_seq, bool* found_final_value,
3696
+ MergeContext* merge_context = nullptr) {
3470
3697
  LookupKey lkey(k, snapshot_seq);
3471
3698
  std::string val;
3472
3699
  SequenceNumber max_range_del_seqno = 0;
3473
3700
  SequenceNumber out_seqno = 0;
3474
3701
  bool is_blob_index = false;
3475
3702
  Status s;
3703
+ std::unique_ptr<MergeContext> merge_context_guard{new MergeContext};
3704
+ if (merge_context == nullptr) {
3705
+ merge_context = merge_context_guard.get();
3706
+ }
3476
3707
  *found_final_value = wbwi_mem->Get(
3477
- lkey, &val, nullptr, nullptr, &s, nullptr, &max_range_del_seqno,
3708
+ lkey, &val, nullptr, nullptr, &s, merge_context, &max_range_del_seqno,
3478
3709
  &out_seqno, ReadOptions(), true, nullptr, &is_blob_index, true);
3479
3710
  if (s.ok()) {
3480
3711
  if (*found_final_value) {
@@ -3482,10 +3713,11 @@ std::string Get(const std::string& k, std::unique_ptr<WBWIMemTable>& wbwi_mem,
3482
3713
  return val;
3483
3714
  }
3484
3715
  return "NOT_FOUND";
3716
+ } else if (s.IsNotFound()) {
3717
+ EXPECT_TRUE(*found_final_value);
3718
+ return "NOT_FOUND";
3485
3719
  }
3486
- EXPECT_TRUE(s.IsNotFound());
3487
- EXPECT_TRUE(*found_final_value);
3488
- return "NOT_FOUND";
3720
+ return s.ToString();
3489
3721
  }
3490
3722
 
3491
3723
  class WBWIMemTableTest : public testing::Test {};
@@ -3502,18 +3734,17 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3502
3734
  Random& rnd = *Random::GetTLSInstance();
3503
3735
  auto wbwi = std::make_shared<WriteBatchWithIndex>(
3504
3736
  cmp, 0, /*overwrite_key=*/true, 0, 0);
3505
- wbwi->SetTrackPerCFStat(true);
3506
3737
  std::vector<std::pair<std::string, std::string>> expected;
3507
- expected.resize(10000);
3508
- for (int i = 0; i < 10000; ++i) {
3738
+ const int kNumUpdate = 10000;
3739
+ expected.resize(kNumUpdate);
3740
+ for (int i = 0; i < kNumUpdate; ++i) {
3509
3741
  // Leave a non-existing key 9999 in between existing keys to test read.
3510
3742
  std::string key = i < 9999 ? DBTestBase::Key(i) : DBTestBase::Key(i + 1);
3511
3743
  bool del = rnd.OneIn(2);
3512
3744
  std::string val = del ? "NOT_FOUND" : rnd.RandomString(50);
3513
3745
  expected[i] = std::make_pair(key, val);
3514
3746
  }
3515
- // Random insertion order
3516
- RandomShuffle(expected.begin(), expected.end());
3747
+
3517
3748
  std::unique_ptr<WBWIMemTable> wbwi_mem{
3518
3749
  new WBWIMemTable(wbwi, cmp,
3519
3750
  /*cf_id=*/0, &immutable_opts, &mutable_cf_options,
@@ -3522,9 +3753,13 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3522
3753
  ASSERT_TRUE(wbwi_mem->IsEmpty());
3523
3754
  constexpr SequenceNumber visible_seq = 10002;
3524
3755
  constexpr SequenceNumber non_visible_seq = 1;
3525
- constexpr WBWIMemTable::SeqnoRange assigned_seq = {2, 10001};
3756
+ const SequenceNumber seqno_lb = 2;
3757
+ constexpr WBWIMemTable::SeqnoRange assigned_seq = {seqno_lb,
3758
+ seqno_lb + kNumUpdate - 1};
3526
3759
  wbwi_mem->AssignSequenceNumbers(assigned_seq);
3527
3760
 
3761
+ // Random insertion order
3762
+ RandomShuffle(expected.begin(), expected.end());
3528
3763
  bool found_final_value = false;
3529
3764
  for (const auto& [key, val] : expected) {
3530
3765
  if (val == "NOT_FOUND") {
@@ -3548,28 +3783,38 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3548
3783
  ColumnFamilyHandleImplDummy meta_cf(/*id=*/1, BytewiseComparator());
3549
3784
  ASSERT_OK(wbwi->Put(&meta_cf, DBTestBase::Key(0), "foo"));
3550
3785
 
3551
- RandomShuffle(expected.begin(), expected.end());
3786
+ // Sort keys to compare with iterator
3787
+ std::sort(expected.begin(), expected.end(),
3788
+ [](const std::pair<std::string, std::string>& a,
3789
+ const std::pair<std::string, std::string>& b) {
3790
+ return a.first < b.first;
3791
+ });
3792
+
3552
3793
  // overwrites
3794
+ std::vector<SequenceNumber> expected_seqno(kNumUpdate, seqno_lb);
3553
3795
  for (size_t i = 0; i < 2000; ++i) {
3554
3796
  // We don't expect to mix SD and DEL, or issue multiple SD consecutively in
3555
3797
  // a DB. Read from WBWI should still work so we do it here to keep the test
3556
3798
  // simple.
3799
+ size_t idx = rnd.Uniform(kNumUpdate);
3557
3800
  if (rnd.OneIn(2)) {
3558
3801
  std::string val = rnd.RandomString(100);
3559
- expected[i].second = val;
3560
- ASSERT_OK(wbwi->Put(expected[i].first, val));
3802
+ expected[idx].second = val;
3803
+ ASSERT_OK(wbwi->Put(expected[idx].first, val));
3561
3804
  } else {
3562
- expected[i].second = "NOT_FOUND";
3805
+ expected[idx].second = "NOT_FOUND";
3563
3806
  if (rnd.OneIn(2)) {
3564
- ASSERT_OK(wbwi->SingleDelete(expected[i].first));
3807
+ ASSERT_OK(wbwi->SingleDelete(expected[idx].first));
3565
3808
  } else {
3566
- ASSERT_OK(wbwi->Delete(expected[i].first));
3809
+ ASSERT_OK(wbwi->Delete(expected[idx].first));
3567
3810
  }
3568
3811
  }
3569
3812
  found_final_value = false;
3570
- ASSERT_TRUE(expected[i].second == Get(expected[i].first, wbwi_mem,
3571
- visible_seq, &found_final_value));
3813
+ ASSERT_TRUE(expected[idx].second == Get(expected[idx].first, wbwi_mem,
3814
+ visible_seq, &found_final_value));
3572
3815
  ASSERT_TRUE(found_final_value);
3816
+ // See comment for WBWIMemTable for sequence number assignment method.
3817
+ expected_seqno[idx]++;
3573
3818
  }
3574
3819
  // Get a non-existing key
3575
3820
  found_final_value = false;
@@ -3584,7 +3829,6 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3584
3829
  &found_final_value));
3585
3830
  ASSERT_FALSE(found_final_value);
3586
3831
  // Get existing keys
3587
- RandomShuffle(expected.begin(), expected.end());
3588
3832
  for (const auto& [key, val] : expected) {
3589
3833
  found_final_value = false;
3590
3834
  ASSERT_TRUE(val == Get(key, wbwi_mem, visible_seq, &found_final_value));
@@ -3643,12 +3887,6 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3643
3887
  }
3644
3888
  }
3645
3889
 
3646
- // Sort keys to compare with iterator
3647
- std::sort(expected.begin(), expected.end(),
3648
- [](const std::pair<std::string, std::string>& a,
3649
- const std::pair<std::string, std::string>& b) {
3650
- return a.first < b.first;
3651
- });
3652
3890
  Arena arena;
3653
3891
  InternalIterator* iter = wbwi_mem->NewIterator(
3654
3892
  ReadOptions(), /*seqno_to_time_mapping=*/nullptr, &arena,
@@ -3664,7 +3902,7 @@ TEST_F(WBWIMemTableTest, ReadFromWBWIMemtable) {
3664
3902
  ValueType val_type;
3665
3903
  UnPackSequenceAndType(ExtractInternalKeyFooter(iter->key()), &seq,
3666
3904
  &val_type);
3667
- ASSERT_EQ(seq, assigned_seq.upper_bound);
3905
+ ASSERT_EQ(seq, expected_seqno[idx]);
3668
3906
  if (expected[idx].second == "NOT_FOUND") {
3669
3907
  ASSERT_TRUE(val_type == kTypeDeletion || val_type == kTypeSingleDeletion);
3670
3908
  } else {
@@ -3759,15 +3997,19 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
3759
3997
 
3760
3998
  auto wbwi = std::make_shared<WriteBatchWithIndex>(
3761
3999
  cmp, 0, /*overwrite_key=*/true, 0, 0);
3762
- wbwi->SetTrackPerCFStat(true);
3763
4000
 
3764
4001
  ASSERT_OK(wbwi->Put(DBTestBase::Key(0), "val0"));
3765
4002
  ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(0)));
3766
4003
  ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(1)));
3767
4004
  ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(2)));
3768
- ASSERT_OK(wbwi->Put(DBTestBase::Key(3), "val3"));
3769
4005
  // SD at key1 overwritten
3770
4006
  ASSERT_OK(wbwi->Put(DBTestBase::Key(1), "val1"));
4007
+ // For key3, most recent update is SD, and a SD is overwritten,
4008
+ // here we test that these two SD get assigned different seqnos.
4009
+ // FIXME: ideally we should only emit at most one SD per key.
4010
+ ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(3)));
4011
+ ASSERT_OK(wbwi->Put(DBTestBase::Key(3), "val3"));
4012
+ ASSERT_OK(wbwi->SingleDelete(DBTestBase::Key(3)));
3771
4013
 
3772
4014
  std::unique_ptr<WBWIMemTable> wbwi_mem{
3773
4015
  new WBWIMemTable(wbwi, cmp,
@@ -3790,16 +4032,23 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
3790
4032
  ASSERT_TRUE(iter_for_flush->Valid());
3791
4033
  ASSERT_EQ(iter->key(), iter_for_flush->key());
3792
4034
 
3793
- iter->Next();
3794
- iter_for_flush->Next();
3795
- if (i == 1) {
3796
- // overwritten SD at key1
4035
+ if (i == 1 || i == 3) {
4036
+ // Most recent update should have a higher seqno than the overwritten SD
4037
+ SequenceNumber current_seq;
4038
+ ValueType _;
4039
+ UnPackSequenceAndType(ExtractInternalKeyFooter(iter->key()), &current_seq,
4040
+ &_);
4041
+ ASSERT_GT(current_seq, assigned_seqno.lower_bound);
4042
+
4043
+ iter_for_flush->Next();
4044
+ // overwritten SD at key1 and key3
3797
4045
  // See WBWIMemTableIterator::UpdateSingleDeleteKey() for seqno assignment
3798
- InternalKey ikey(DBTestBase::Key(1), assigned_seqno.upper_bound - 1,
4046
+ InternalKey ikey(DBTestBase::Key(i), assigned_seqno.lower_bound,
3799
4047
  kTypeSingleDeletion);
3800
4048
  ASSERT_EQ(ikey.Encode(), iter_for_flush->key());
3801
- iter_for_flush->Next();
3802
4049
  }
4050
+ iter->Next();
4051
+ iter_for_flush->Next();
3803
4052
  }
3804
4053
  ASSERT_FALSE(iter->Valid());
3805
4054
  ASSERT_FALSE(iter_for_flush->Valid());
@@ -3808,6 +4057,176 @@ TEST_F(WBWIMemTableTest, IterEmitSingleDelete) {
3808
4057
  iter->~InternalIterator();
3809
4058
  iter_for_flush->~InternalIteratorBase();
3810
4059
  }
4060
+
4061
+ void VerifyIterator(
4062
+ InternalIterator* iter,
4063
+ const std::vector<std::pair<std::string, std::string>>& expected) {
4064
+ // Verify SeekToFirst and Next
4065
+ iter->SeekToFirst();
4066
+ auto k = expected.begin();
4067
+ while (iter->Valid()) {
4068
+ ASSERT_TRUE(iter->Valid());
4069
+ ASSERT_OK(iter->status());
4070
+
4071
+ ASSERT_EQ(iter->key(), k->first);
4072
+ ASSERT_EQ(iter->value(), k->second);
4073
+
4074
+ iter->Next();
4075
+ ++k;
4076
+ }
4077
+ ASSERT_OK(iter->status());
4078
+ ASSERT_TRUE(k == expected.end());
4079
+
4080
+ // Verify SeekToLast and Prev
4081
+ iter->SeekToLast();
4082
+ k = expected.end();
4083
+ while (iter->Valid()) {
4084
+ --k;
4085
+ ASSERT_TRUE(iter->Valid());
4086
+ ASSERT_OK(iter->status());
4087
+
4088
+ ASSERT_EQ(iter->key(), k->first);
4089
+ ASSERT_EQ(iter->value(), k->second);
4090
+
4091
+ iter->Prev();
4092
+ }
4093
+ ASSERT_OK(iter->status());
4094
+ ASSERT_TRUE(k == expected.begin());
4095
+
4096
+ // Verify Seek and SeekForPrev
4097
+ for (auto exp = expected.begin(); exp != expected.end(); ++exp) {
4098
+ iter->Seek(exp->first);
4099
+ ASSERT_TRUE(iter->Valid());
4100
+ ASSERT_OK(iter->status());
4101
+ ASSERT_EQ(iter->key(), exp->first);
4102
+ ASSERT_EQ(iter->value(), exp->second);
4103
+
4104
+ iter->Next();
4105
+ if (iter->Valid()) {
4106
+ ASSERT_OK(iter->status());
4107
+ ++exp;
4108
+ ASSERT_EQ(iter->key(), exp->first);
4109
+ ASSERT_EQ(iter->value(), exp->second);
4110
+ iter->Prev();
4111
+ --exp;
4112
+ ASSERT_TRUE(iter->Valid());
4113
+ ASSERT_OK(iter->status());
4114
+ ASSERT_EQ(iter->key(), exp->first);
4115
+ ASSERT_EQ(iter->value(), exp->second);
4116
+ } else {
4117
+ iter->SeekToLast();
4118
+ }
4119
+
4120
+ iter->SeekForPrev(exp->first);
4121
+ ASSERT_TRUE(iter->Valid());
4122
+ ASSERT_OK(iter->status());
4123
+ ASSERT_EQ(iter->key(), exp->first);
4124
+ ASSERT_EQ(iter->value(), exp->second);
4125
+
4126
+ iter->Prev();
4127
+ if (iter->Valid()) {
4128
+ ASSERT_OK(iter->status());
4129
+ --exp;
4130
+ ASSERT_EQ(iter->key(), exp->first);
4131
+ ASSERT_EQ(iter->value(), exp->second);
4132
+ iter->Next();
4133
+ ++exp;
4134
+ ASSERT_TRUE(iter->Valid());
4135
+ ASSERT_OK(iter->status());
4136
+ ASSERT_EQ(iter->key(), exp->first);
4137
+ ASSERT_EQ(iter->value(), exp->second);
4138
+ } else {
4139
+ iter->SeekToFirst();
4140
+ }
4141
+ }
4142
+ }
4143
+
4144
+ TEST_F(WBWIMemTableTest, WBWIMemTableWithMerge) {
4145
+ const Comparator* cmp = BytewiseComparator();
4146
+ Options opts;
4147
+ opts.merge_operator = MergeOperators::CreateFromStringId("stringappend");
4148
+ ImmutableOptions immutable_opts(opts);
4149
+ MutableCFOptions mutable_cf_options(opts);
4150
+
4151
+ auto wbwi = std::make_shared<WriteBatchWithIndex>(
4152
+ cmp, 0, /*overwrite_key=*/true, 0, 0);
4153
+ std::unique_ptr<WBWIMemTable> wbwi_mem{
4154
+ new WBWIMemTable(wbwi, cmp,
4155
+ /*cf_id=*/0, &immutable_opts, &mutable_cf_options,
4156
+ // stats is inaccurate but read path should still work
4157
+ /*stat=*/{})};
4158
+ ASSERT_TRUE(wbwi_mem->IsEmpty());
4159
+ constexpr SequenceNumber seqno_lb = 10;
4160
+ constexpr SequenceNumber seqno_ub = 100;
4161
+ constexpr WBWIMemTable::SeqnoRange assigned_seq = {seqno_lb, seqno_ub};
4162
+ wbwi_mem->AssignSequenceNumbers(assigned_seq);
4163
+
4164
+ // Update then Merge
4165
+ ASSERT_OK(wbwi->Put("a", "a1"));
4166
+ ASSERT_OK(wbwi->Merge("a", "a2"));
4167
+ ASSERT_OK(wbwi->Merge("a", "a3"));
4168
+ ASSERT_OK(wbwi->Delete("b"));
4169
+ ASSERT_OK(wbwi->Merge("b", "b1"));
4170
+
4171
+ // Merge then Update
4172
+ ASSERT_OK(wbwi->Merge("c", "c1"));
4173
+ ASSERT_OK(wbwi->Put("c", "c2"));
4174
+ ASSERT_OK(wbwi->Merge("d", "d1"));
4175
+ ASSERT_OK(wbwi->Merge("d", "d2"));
4176
+ ASSERT_OK(wbwi->Delete("d"));
4177
+
4178
+ // Just Merge
4179
+ ASSERT_OK(wbwi->Merge("e", "e1"));
4180
+ ASSERT_OK(wbwi->Merge("f", "f1"));
4181
+ ASSERT_OK(wbwi->Merge("f", "f2"));
4182
+
4183
+ // Just Update
4184
+ ASSERT_OK(wbwi->SingleDelete("g"));
4185
+
4186
+ // key <-> val
4187
+ // Refer to the sequence number assignment method described in the comments
4188
+ // above the WBWIMemTable class.
4189
+ std::vector<std::pair<std::string, std::string>> expected = {
4190
+ {InternalKey("a", seqno_lb + 2, kTypeMerge).Encode().ToString(), "a3"},
4191
+ {InternalKey("a", seqno_lb + 1, kTypeMerge).Encode().ToString(), "a2"},
4192
+ {InternalKey("a", seqno_lb, kTypeValue).Encode().ToString(), "a1"},
4193
+ {InternalKey("b", seqno_lb + 1, kTypeMerge).Encode().ToString(), "b1"},
4194
+ {InternalKey("b", seqno_lb, kTypeDeletion).Encode().ToString(), ""},
4195
+ {InternalKey("c", seqno_lb + 1, kTypeValue).Encode().ToString(), "c2"},
4196
+ {InternalKey("d", seqno_lb + 2, kTypeDeletion).Encode().ToString(), ""},
4197
+ {InternalKey("d", seqno_lb, kTypeMerge).Encode().ToString(), "d1"},
4198
+ {InternalKey("e", seqno_lb, kTypeMerge).Encode().ToString(), "e1"},
4199
+ {InternalKey("f", seqno_lb + 1, kTypeMerge).Encode().ToString(), "f2"},
4200
+ {InternalKey("f", seqno_lb, kTypeMerge).Encode().ToString(), "f1"},
4201
+ {InternalKey("g", seqno_lb, kTypeSingleDeletion).Encode().ToString(), ""},
4202
+ };
4203
+
4204
+ Arena arena;
4205
+ InternalIterator* iter = wbwi_mem->NewIterator(
4206
+ ReadOptions(), /*seqno_to_time_mapping=*/nullptr, &arena,
4207
+ /*prefix_extractor=*/nullptr, /*for_flush=*/false);
4208
+ VerifyIterator(iter, expected);
4209
+ iter->~InternalIterator();
4210
+
4211
+ // Test Get
4212
+ bool found_final_value = false;
4213
+ ASSERT_EQ("a1,a2,a3", Get("a", wbwi_mem, seqno_ub, &found_final_value));
4214
+ ASSERT_EQ("b1", Get("b", wbwi_mem, seqno_ub, &found_final_value));
4215
+ ASSERT_EQ("c2", Get("c", wbwi_mem, seqno_ub, &found_final_value));
4216
+ ASSERT_EQ("NOT_FOUND", Get("d", wbwi_mem, seqno_ub, &found_final_value));
4217
+ MergeContext merge_context;
4218
+ ASSERT_EQ(Status::MergeInProgress().ToString(),
4219
+ Get("e", wbwi_mem, seqno_ub, &found_final_value, &merge_context));
4220
+ ASSERT_EQ(merge_context.GetNumOperands(), 1);
4221
+ ASSERT_EQ(merge_context.GetOperand(0), "e1");
4222
+ merge_context.Clear();
4223
+ ASSERT_EQ(Status::MergeInProgress().ToString(),
4224
+ Get("f", wbwi_mem, seqno_ub, &found_final_value, &merge_context));
4225
+ ASSERT_EQ(merge_context.GetNumOperands(), 2);
4226
+ ASSERT_EQ(merge_context.GetOperand(0), "f1");
4227
+ ASSERT_EQ(merge_context.GetOperand(1), "f2");
4228
+ ASSERT_EQ("NOT_FOUND", Get("g", wbwi_mem, seqno_ub, &found_final_value));
4229
+ }
3811
4230
  } // namespace ROCKSDB_NAMESPACE
3812
4231
 
3813
4232
  int main(int argc, char** argv) {