@nxtedition/rocksdb 5.2.21 → 5.2.28

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 (923) hide show
  1. package/binding.cc +510 -967
  2. package/binding.gyp +78 -72
  3. package/chained-batch.js +1 -2
  4. package/deps/rocksdb/build_version.cc +70 -4
  5. package/deps/rocksdb/rocksdb/CMakeLists.txt +281 -149
  6. package/deps/rocksdb/rocksdb/Makefile +459 -469
  7. package/deps/rocksdb/rocksdb/TARGETS +5244 -1500
  8. package/deps/rocksdb/rocksdb/cache/cache.cc +12 -3
  9. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +7 -368
  10. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +924 -0
  11. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +128 -0
  12. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +103 -0
  13. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +183 -0
  14. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +11 -0
  15. package/deps/rocksdb/rocksdb/cache/cache_key.cc +344 -0
  16. package/deps/rocksdb/rocksdb/cache/cache_key.h +132 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +183 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +288 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +468 -0
  20. package/deps/rocksdb/rocksdb/cache/cache_test.cc +85 -8
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +121 -51
  22. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +171 -0
  23. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +86 -0
  24. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +607 -0
  25. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +381 -154
  26. package/deps/rocksdb/rocksdb/cache/lru_cache.h +176 -33
  27. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +1659 -3
  28. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +94 -23
  29. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +49 -28
  30. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  37. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +26 -0
  38. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  39. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  40. package/deps/rocksdb/rocksdb/crash_test.mk +93 -0
  41. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +54 -31
  42. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +10 -6
  43. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +146 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +326 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.cc +34 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_fetcher.h +37 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +4 -2
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +8 -4
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +99 -40
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +20 -8
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +95 -83
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +13 -10
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +7 -4
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +37 -37
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_completion_callback.h +101 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +8 -1
  57. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +6 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +209 -44
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +37 -11
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +382 -179
  61. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.cc +100 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter.h +102 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +196 -0
  64. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +3 -0
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +2 -1
  66. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +7 -5
  67. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +10 -3
  68. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +12 -8
  69. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +5 -5
  70. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +772 -9
  71. package/deps/rocksdb/rocksdb/db/blob/db_blob_compaction_test.cc +730 -0
  72. package/deps/rocksdb/rocksdb/db/blob/db_blob_corruption_test.cc +82 -0
  73. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +155 -17
  74. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +21 -0
  75. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.h +38 -0
  76. package/deps/rocksdb/rocksdb/db/builder.cc +137 -89
  77. package/deps/rocksdb/rocksdb/db/builder.h +16 -37
  78. package/deps/rocksdb/rocksdb/db/c.cc +413 -208
  79. package/deps/rocksdb/rocksdb/db/c_test.c +227 -138
  80. package/deps/rocksdb/rocksdb/db/column_family.cc +118 -103
  81. package/deps/rocksdb/rocksdb/db/column_family.h +86 -44
  82. package/deps/rocksdb/rocksdb/db/column_family_test.cc +38 -24
  83. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +81 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +275 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +258 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +81 -28
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +43 -12
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +12 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +406 -215
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +147 -50
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +167 -61
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1321 -156
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +197 -28
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +246 -43
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +65 -26
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +7 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +122 -9
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -2
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +18 -6
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +1 -1
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +536 -44
  103. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +311 -30
  104. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +1 -1
  105. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +849 -0
  106. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +92 -0
  107. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +46 -0
  108. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/convenience.cc +6 -3
  110. package/deps/rocksdb/rocksdb/db/corruption_test.cc +383 -28
  111. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +7 -2
  112. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +154 -45
  113. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1095 -33
  114. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +1249 -203
  115. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +135 -9
  116. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1348 -166
  117. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +3 -5
  118. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +1 -1
  119. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +312 -45
  120. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1734 -48
  121. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.cc → db_impl/compacted_db_impl.cc} +24 -7
  122. package/deps/rocksdb/rocksdb/db/{compacted_db_impl.h → db_impl/compacted_db_impl.h} +1 -1
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +644 -333
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +365 -92
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +578 -210
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +38 -16
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +17 -10
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +75 -74
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +450 -183
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +42 -9
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +232 -15
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +42 -4
  133. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +297 -100
  134. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +16 -15
  135. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +31 -1
  136. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +6 -5
  137. package/deps/rocksdb/rocksdb/db/db_iter.cc +218 -153
  138. package/deps/rocksdb/rocksdb/db/db_iter.h +14 -12
  139. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -1
  140. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +84 -160
  141. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +47 -6
  142. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +204 -0
  143. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +21 -13
  144. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +17 -10
  145. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +38 -24
  146. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +184 -19
  147. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/db_options_test.cc +183 -3
  149. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +409 -9
  150. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +92 -23
  151. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +446 -0
  152. package/deps/rocksdb/rocksdb/db/{db_impl/db_secondary_test.cc → db_secondary_test.cc} +363 -35
  153. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +520 -15
  154. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +50 -1
  155. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +139 -4
  156. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +1 -1
  157. package/deps/rocksdb/rocksdb/db/db_test.cc +669 -359
  158. package/deps/rocksdb/rocksdb/db/db_test2.cc +2110 -304
  159. package/deps/rocksdb/rocksdb/db/db_test_util.cc +76 -43
  160. package/deps/rocksdb/rocksdb/db/db_test_util.h +231 -103
  161. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +19 -11
  162. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +490 -71
  163. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +980 -349
  164. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +11 -12
  165. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +793 -0
  166. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -1
  167. package/deps/rocksdb/rocksdb/db/dbformat.cc +4 -12
  168. package/deps/rocksdb/rocksdb/db/dbformat.h +28 -18
  169. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +3 -0
  170. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +50 -15
  171. package/deps/rocksdb/rocksdb/db/error_handler.cc +127 -41
  172. package/deps/rocksdb/rocksdb/db/error_handler.h +12 -5
  173. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +524 -255
  174. package/deps/rocksdb/rocksdb/db/event_helpers.cc +136 -11
  175. package/deps/rocksdb/rocksdb/db/event_helpers.h +27 -2
  176. package/deps/rocksdb/rocksdb/db/experimental.cc +100 -0
  177. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +307 -4
  178. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +137 -60
  179. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +12 -8
  180. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -55
  181. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +86 -5
  182. package/deps/rocksdb/rocksdb/db/filename_test.cc +63 -0
  183. package/deps/rocksdb/rocksdb/db/flush_job.cc +619 -64
  184. package/deps/rocksdb/rocksdb/db/flush_job.h +30 -7
  185. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +33 -16
  186. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +2 -1
  187. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +18 -17
  188. package/deps/rocksdb/rocksdb/db/forward_iterator.h +5 -4
  189. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +0 -1
  190. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +91 -0
  191. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +25 -14
  192. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +6 -5
  193. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +1 -1
  194. package/deps/rocksdb/rocksdb/db/internal_stats.cc +471 -50
  195. package/deps/rocksdb/rocksdb/db/internal_stats.h +129 -25
  196. package/deps/rocksdb/rocksdb/db/job_context.h +22 -9
  197. package/deps/rocksdb/rocksdb/db/kv_checksum.h +394 -0
  198. package/deps/rocksdb/rocksdb/db/listener_test.cc +518 -41
  199. package/deps/rocksdb/rocksdb/db/log_format.h +4 -1
  200. package/deps/rocksdb/rocksdb/db/log_reader.cc +129 -6
  201. package/deps/rocksdb/rocksdb/db/log_reader.h +17 -1
  202. package/deps/rocksdb/rocksdb/db/log_test.cc +161 -11
  203. package/deps/rocksdb/rocksdb/db/log_writer.cc +92 -13
  204. package/deps/rocksdb/rocksdb/db/log_writer.h +18 -5
  205. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +1 -1
  206. package/deps/rocksdb/rocksdb/db/lookup_key.h +0 -1
  207. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -2
  208. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +21 -8
  209. package/deps/rocksdb/rocksdb/db/memtable.cc +144 -54
  210. package/deps/rocksdb/rocksdb/db/memtable.h +72 -15
  211. package/deps/rocksdb/rocksdb/db/memtable_list.cc +95 -47
  212. package/deps/rocksdb/rocksdb/db/memtable_list.h +33 -13
  213. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +61 -31
  214. package/deps/rocksdb/rocksdb/db/merge_context.h +20 -8
  215. package/deps/rocksdb/rocksdb/db/merge_helper.cc +54 -11
  216. package/deps/rocksdb/rocksdb/db/merge_helper.h +17 -6
  217. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +13 -7
  218. package/deps/rocksdb/rocksdb/db/merge_test.cc +40 -19
  219. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +14 -25
  220. package/deps/rocksdb/rocksdb/db/output_validator.cc +3 -0
  221. package/deps/rocksdb/rocksdb/db/output_validator.h +5 -4
  222. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +32 -28
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +43 -29
  224. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +9 -7
  225. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +21 -16
  226. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +1 -1
  227. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +29 -36
  228. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +1 -2
  229. package/deps/rocksdb/rocksdb/db/prefix_test.cc +4 -4
  230. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +2 -2
  231. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +11 -11
  232. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +3 -2
  233. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +14 -8
  234. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +17 -0
  235. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +4 -2
  236. package/deps/rocksdb/rocksdb/db/read_callback.h +1 -0
  237. package/deps/rocksdb/rocksdb/db/repair.cc +87 -58
  238. package/deps/rocksdb/rocksdb/db/repair_test.cc +35 -5
  239. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +2 -1
  240. package/deps/rocksdb/rocksdb/db/table_cache.cc +95 -69
  241. package/deps/rocksdb/rocksdb/db/table_cache.h +63 -53
  242. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +4 -4
  243. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +78 -10
  244. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +28 -33
  245. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +30 -51
  246. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +12 -8
  247. package/deps/rocksdb/rocksdb/db/version_builder.cc +564 -341
  248. package/deps/rocksdb/rocksdb/db/version_builder.h +8 -8
  249. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +327 -155
  250. package/deps/rocksdb/rocksdb/db/version_edit.cc +89 -27
  251. package/deps/rocksdb/rocksdb/db/version_edit.h +42 -17
  252. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +324 -43
  253. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +79 -22
  254. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +165 -20
  255. package/deps/rocksdb/rocksdb/db/version_set.cc +935 -1034
  256. package/deps/rocksdb/rocksdb/db/version_set.h +183 -122
  257. package/deps/rocksdb/rocksdb/db/version_set_test.cc +556 -138
  258. package/deps/rocksdb/rocksdb/db/version_util.h +68 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager.cc +23 -21
  260. package/deps/rocksdb/rocksdb/db/wal_manager.h +5 -2
  261. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +30 -27
  262. package/deps/rocksdb/rocksdb/db/write_batch.cc +704 -209
  263. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +135 -2
  264. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +209 -5
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +2 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +47 -54
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +12 -9
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +215 -103
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +11 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +14 -8
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +7 -4
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +10 -3
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +6 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +1 -1
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +19 -2
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +78 -25
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +13 -2
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +29 -12
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +5 -1
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +199 -32
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +188 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +59 -10
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +77 -109
  284. package/deps/rocksdb/rocksdb/{third-party/folly/folly/synchronization/WaitOptions.cpp → db_stress_tool/db_stress_stat.cc} +9 -4
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +7 -6
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +1 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +699 -143
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +20 -2
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +49 -39
  290. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +631 -0
  291. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +287 -0
  292. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +1565 -0
  293. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +374 -0
  294. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +149 -18
  295. package/deps/rocksdb/rocksdb/env/composite_env.cc +464 -0
  296. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +98 -646
  297. package/deps/rocksdb/rocksdb/env/emulated_clock.h +114 -0
  298. package/deps/rocksdb/rocksdb/env/env.cc +632 -42
  299. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +84 -36
  300. package/deps/rocksdb/rocksdb/env/env_chroot.cc +88 -286
  301. package/deps/rocksdb/rocksdb/env/env_chroot.h +34 -1
  302. package/deps/rocksdb/rocksdb/env/env_encryption.cc +469 -277
  303. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +9 -30
  304. package/deps/rocksdb/rocksdb/env/env_posix.cc +110 -119
  305. package/deps/rocksdb/rocksdb/env/env_test.cc +1128 -39
  306. package/deps/rocksdb/rocksdb/env/file_system.cc +147 -8
  307. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +207 -136
  308. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +86 -54
  309. package/deps/rocksdb/rocksdb/env/fs_posix.cc +192 -64
  310. package/deps/rocksdb/rocksdb/env/fs_readonly.h +107 -0
  311. package/deps/rocksdb/rocksdb/env/fs_remap.cc +339 -0
  312. package/deps/rocksdb/rocksdb/env/fs_remap.h +139 -0
  313. package/deps/rocksdb/rocksdb/env/io_posix.cc +245 -41
  314. package/deps/rocksdb/rocksdb/env/io_posix.h +66 -1
  315. package/deps/rocksdb/rocksdb/env/mock_env.cc +147 -149
  316. package/deps/rocksdb/rocksdb/env/mock_env.h +113 -11
  317. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +2 -4
  318. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +164 -0
  319. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +71 -0
  320. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +9 -5
  321. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +6 -4
  322. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +19 -12
  323. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +459 -70
  324. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +205 -28
  325. package/deps/rocksdb/rocksdb/file/file_util.cc +39 -28
  326. package/deps/rocksdb/rocksdb/file/file_util.h +18 -27
  327. package/deps/rocksdb/rocksdb/file/filename.cc +59 -22
  328. package/deps/rocksdb/rocksdb/file/filename.h +13 -8
  329. package/deps/rocksdb/rocksdb/file/line_file_reader.cc +68 -0
  330. package/deps/rocksdb/rocksdb/file/line_file_reader.h +59 -0
  331. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1130 -6
  332. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +220 -36
  333. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +69 -17
  334. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +13 -12
  335. package/deps/rocksdb/rocksdb/file/read_write_util.cc +3 -38
  336. package/deps/rocksdb/rocksdb/file/read_write_util.h +0 -4
  337. package/deps/rocksdb/rocksdb/file/readahead_file_info.h +33 -0
  338. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +57 -9
  339. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +58 -6
  340. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +29 -54
  341. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +22 -29
  342. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +424 -50
  343. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +66 -19
  344. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +157 -66
  345. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +224 -121
  346. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +333 -30
  347. package/deps/rocksdb/rocksdb/include/rocksdb/cache_bench_tool.h +14 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +1 -1
  349. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +90 -50
  350. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +13 -5
  351. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +20 -4
  352. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +8 -3
  353. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +53 -12
  354. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +31 -6
  355. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +102 -7
  356. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +51 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +370 -262
  358. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +286 -87
  359. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +124 -64
  360. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +27 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +21 -4
  362. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +384 -41
  363. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +111 -143
  364. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +20 -6
  365. package/deps/rocksdb/rocksdb/include/rocksdb/functor_wrapper.h +56 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +15 -33
  367. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +37 -1
  368. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +1 -3
  369. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +314 -26
  370. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +11 -7
  371. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +50 -15
  372. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +10 -3
  373. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +186 -96
  374. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +373 -103
  375. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +13 -3
  376. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +2 -2
  377. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +37 -7
  378. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +6 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +87 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +5 -12
  381. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +59 -30
  382. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +11 -11
  383. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +22 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +17 -10
  385. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +121 -41
  386. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +1 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +114 -136
  388. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +116 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +160 -18
  390. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +57 -15
  391. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +3 -1
  392. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +10 -6
  393. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +247 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +187 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +1 -1
  396. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +14 -24
  397. package/deps/rocksdb/rocksdb/include/rocksdb/unique_id.h +46 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +14 -4
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/agg_merge.h +138 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +631 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +142 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +12 -9
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/customizable_util.h +368 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +24 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +4 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +418 -63
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +143 -73
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +2 -2
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/replayer.h +87 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +2 -2
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +43 -5
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +18 -23
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +26 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +32 -6
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +1 -2
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +20 -1
  417. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +30 -3
  418. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +11 -2
  419. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +89 -11
  420. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +11 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +108 -38
  422. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +40 -23
  423. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +12 -5
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +100 -49
  425. package/deps/rocksdb/rocksdb/logging/env_logger.h +7 -5
  426. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +0 -1
  427. package/deps/rocksdb/rocksdb/logging/posix_logger.h +3 -9
  428. package/deps/rocksdb/rocksdb/memory/arena.cc +3 -1
  429. package/deps/rocksdb/rocksdb/memory/arena.h +1 -1
  430. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +171 -106
  431. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +31 -15
  432. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +15 -4
  433. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +24 -8
  434. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +91 -0
  435. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +239 -0
  436. package/deps/rocksdb/rocksdb/memory/memory_usage.h +14 -1
  437. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +72 -9
  438. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +52 -6
  439. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +53 -0
  440. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +5 -5
  441. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +17 -5
  442. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  443. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +87 -0
  444. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +20 -10
  445. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -94
  446. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +160 -62
  447. package/deps/rocksdb/rocksdb/microbench/CMakeLists.txt +17 -0
  448. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +1360 -0
  449. package/deps/rocksdb/rocksdb/microbench/ribbon_bench.cc +153 -0
  450. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +8 -15
  451. package/deps/rocksdb/rocksdb/monitoring/histogram.h +0 -1
  452. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +18 -16
  453. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +9 -7
  454. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +5 -3
  455. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +7 -5
  456. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +37 -12
  457. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +26 -6
  458. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +6 -10
  459. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +14 -13
  460. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +19 -20
  461. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +18 -18
  462. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +84 -2
  463. package/deps/rocksdb/rocksdb/monitoring/statistics.h +6 -0
  464. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -2
  465. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +67 -54
  466. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +4 -1
  467. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +2 -1
  468. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -2
  469. package/deps/rocksdb/rocksdb/options/cf_options.cc +280 -212
  470. package/deps/rocksdb/rocksdb/options/cf_options.h +51 -57
  471. package/deps/rocksdb/rocksdb/options/configurable.cc +242 -138
  472. package/deps/rocksdb/rocksdb/options/configurable_helper.h +4 -68
  473. package/deps/rocksdb/rocksdb/options/configurable_test.cc +144 -21
  474. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -3
  475. package/deps/rocksdb/rocksdb/options/customizable.cc +67 -7
  476. package/deps/rocksdb/rocksdb/options/customizable_test.cc +1773 -151
  477. package/deps/rocksdb/rocksdb/options/db_options.cc +275 -47
  478. package/deps/rocksdb/rocksdb/options/db_options.h +36 -7
  479. package/deps/rocksdb/rocksdb/options/options.cc +49 -17
  480. package/deps/rocksdb/rocksdb/options/options_helper.cc +369 -352
  481. package/deps/rocksdb/rocksdb/options/options_helper.h +23 -23
  482. package/deps/rocksdb/rocksdb/options/options_parser.cc +18 -13
  483. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +67 -54
  484. package/deps/rocksdb/rocksdb/options/options_test.cc +1162 -187
  485. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -1
  486. package/deps/rocksdb/rocksdb/port/lang.h +52 -0
  487. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  488. package/deps/rocksdb/rocksdb/port/port_posix.cc +31 -2
  489. package/deps/rocksdb/rocksdb/port/port_posix.h +20 -2
  490. package/deps/rocksdb/rocksdb/port/stack_trace.cc +20 -4
  491. package/deps/rocksdb/rocksdb/port/sys_time.h +2 -2
  492. package/deps/rocksdb/rocksdb/port/win/env_default.cc +7 -7
  493. package/deps/rocksdb/rocksdb/port/win/env_win.cc +44 -74
  494. package/deps/rocksdb/rocksdb/port/win/env_win.h +25 -23
  495. package/deps/rocksdb/rocksdb/port/win/io_win.cc +32 -34
  496. package/deps/rocksdb/rocksdb/port/win/io_win.h +12 -6
  497. package/deps/rocksdb/rocksdb/port/win/port_win.cc +55 -35
  498. package/deps/rocksdb/rocksdb/port/win/port_win.h +22 -5
  499. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +3 -3
  500. package/deps/rocksdb/rocksdb/port/win/win_logger.h +3 -5
  501. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +7 -1
  502. package/deps/rocksdb/rocksdb/port/win/win_thread.h +12 -17
  503. package/deps/rocksdb/rocksdb/python.mk +9 -0
  504. package/deps/rocksdb/rocksdb/src.mk +82 -34
  505. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -4
  506. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +1 -1
  507. package/deps/rocksdb/rocksdb/table/block_based/block.cc +158 -80
  508. package/deps/rocksdb/rocksdb/table/block_based/block.h +64 -36
  509. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +23 -14
  510. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +13 -5
  511. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +3 -218
  512. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +603 -328
  513. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +28 -22
  514. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +220 -82
  515. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +8 -2
  516. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +3 -4
  517. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +28 -4
  518. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +598 -492
  519. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +151 -96
  520. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +31 -58
  521. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +330 -92
  522. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +50 -19
  523. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +23 -0
  524. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +226 -0
  525. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +56 -22
  526. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +42 -4
  527. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +5 -2
  528. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +2 -0
  529. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +34 -20
  530. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +9 -10
  531. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +26 -3
  532. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +2 -1
  533. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +844 -202
  534. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +281 -81
  535. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +62 -2
  536. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +2 -3
  537. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +28 -7
  538. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +22 -6
  539. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +28 -26
  540. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  541. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  542. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -1
  543. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +11 -4
  544. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +2 -1
  545. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +2 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +68 -26
  547. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +44 -9
  548. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +12 -10
  549. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +3 -4
  550. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +23 -4
  551. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +44 -19
  552. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +5 -1
  553. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +16 -28
  554. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +7 -4
  555. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +2 -2
  556. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +77 -57
  557. package/deps/rocksdb/rocksdb/table/block_fetcher.h +23 -12
  558. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +43 -56
  559. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +8 -8
  560. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +2 -1
  561. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +52 -70
  562. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +5 -8
  563. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +1 -1
  564. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +17 -11
  565. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +2 -3
  566. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +42 -51
  567. package/deps/rocksdb/rocksdb/table/format.cc +258 -104
  568. package/deps/rocksdb/rocksdb/table/format.h +120 -109
  569. package/deps/rocksdb/rocksdb/table/get_context.cc +97 -65
  570. package/deps/rocksdb/rocksdb/table/get_context.h +19 -12
  571. package/deps/rocksdb/rocksdb/table/internal_iterator.h +14 -0
  572. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  573. package/deps/rocksdb/rocksdb/table/merger_test.cc +3 -2
  574. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +11 -21
  575. package/deps/rocksdb/rocksdb/table/merging_iterator.h +3 -3
  576. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +176 -171
  577. package/deps/rocksdb/rocksdb/table/meta_blocks.h +47 -33
  578. package/deps/rocksdb/rocksdb/table/mock_table.cc +7 -9
  579. package/deps/rocksdb/rocksdb/table/mock_table.h +3 -2
  580. package/deps/rocksdb/rocksdb/table/multiget_context.h +15 -8
  581. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +22 -29
  582. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +6 -3
  583. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +5 -8
  584. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -26
  585. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +12 -16
  586. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +145 -69
  587. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +1 -1
  588. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +7 -6
  589. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +3 -4
  590. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +3 -1
  591. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +1 -1
  592. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +13 -18
  593. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +4 -9
  594. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +55 -37
  595. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +10 -5
  596. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +11 -8
  597. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +222 -16
  598. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +106 -58
  599. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +6 -5
  600. package/deps/rocksdb/rocksdb/table/table_builder.h +68 -44
  601. package/deps/rocksdb/rocksdb/table/table_factory.cc +37 -10
  602. package/deps/rocksdb/rocksdb/table/table_properties.cc +109 -54
  603. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +4 -20
  604. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +33 -32
  605. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +2 -0
  606. package/deps/rocksdb/rocksdb/table/table_test.cc +989 -326
  607. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +4 -0
  608. package/deps/rocksdb/rocksdb/table/unique_id.cc +166 -0
  609. package/deps/rocksdb/rocksdb/table/unique_id_impl.h +59 -0
  610. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +1 -1
  611. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +13 -10
  612. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +1 -2
  613. package/deps/rocksdb/rocksdb/test_util/sync_point.h +35 -16
  614. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +32 -10
  615. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +31 -4
  616. package/deps/rocksdb/rocksdb/test_util/testharness.cc +53 -1
  617. package/deps/rocksdb/rocksdb/test_util/testharness.h +67 -3
  618. package/deps/rocksdb/rocksdb/test_util/testutil.cc +236 -66
  619. package/deps/rocksdb/rocksdb/test_util/testutil.h +63 -100
  620. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +12 -1
  621. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +2 -2
  622. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +6 -3
  623. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  624. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +9 -3
  625. package/deps/rocksdb/rocksdb/tools/db_bench.cc +1 -1
  626. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +1420 -611
  627. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +11 -8
  628. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +11 -1
  629. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +4 -2
  630. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +46 -22
  631. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +655 -179
  632. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +58 -6
  633. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +472 -29
  634. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +23 -2
  635. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +2 -2
  636. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +246 -0
  637. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +126 -0
  638. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +83 -29
  639. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +38 -17
  640. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +191 -55
  641. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +219 -296
  642. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +87 -53
  643. package/deps/rocksdb/rocksdb/tools/write_stress.cc +8 -7
  644. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +6 -5
  645. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +5 -4
  646. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +14 -9
  647. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +134 -60
  648. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +49 -38
  649. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +152 -15
  650. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +206 -0
  651. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.cc +190 -0
  652. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +46 -0
  653. package/deps/rocksdb/rocksdb/trace_replay/trace_record_result.cc +146 -0
  654. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +475 -344
  655. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +83 -95
  656. package/deps/rocksdb/rocksdb/util/autovector.h +38 -18
  657. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -1
  658. package/deps/rocksdb/rocksdb/util/bloom_impl.h +4 -0
  659. package/deps/rocksdb/rocksdb/util/bloom_test.cc +276 -94
  660. package/deps/rocksdb/rocksdb/util/build_version.cc.in +81 -4
  661. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  662. package/deps/rocksdb/rocksdb/util/channel.h +2 -0
  663. package/deps/rocksdb/rocksdb/util/coding.h +1 -33
  664. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +8 -0
  665. package/deps/rocksdb/rocksdb/util/comparator.cc +163 -3
  666. package/deps/rocksdb/rocksdb/util/compression.cc +122 -0
  667. package/deps/rocksdb/rocksdb/util/compression.h +212 -7
  668. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -3
  669. package/deps/rocksdb/rocksdb/util/crc32c.cc +165 -2
  670. package/deps/rocksdb/rocksdb/util/crc32c.h +6 -0
  671. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +14 -0
  672. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +3 -0
  673. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +47 -0
  674. package/deps/rocksdb/rocksdb/util/defer.h +30 -1
  675. package/deps/rocksdb/rocksdb/util/defer_test.cc +11 -0
  676. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +3 -1
  677. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +3 -3
  678. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +5 -4
  679. package/deps/rocksdb/rocksdb/util/fastrange.h +2 -0
  680. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +36 -0
  681. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +3 -1
  682. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +512 -52
  683. package/deps/rocksdb/rocksdb/util/filter_bench.cc +65 -10
  684. package/deps/rocksdb/rocksdb/util/gflags_compat.h +6 -1
  685. package/deps/rocksdb/rocksdb/util/hash.cc +121 -3
  686. package/deps/rocksdb/rocksdb/util/hash.h +31 -1
  687. package/deps/rocksdb/rocksdb/util/hash128.h +26 -0
  688. package/deps/rocksdb/rocksdb/util/hash_containers.h +51 -0
  689. package/deps/rocksdb/rocksdb/util/hash_test.cc +194 -2
  690. package/deps/rocksdb/rocksdb/util/heap.h +6 -1
  691. package/deps/rocksdb/rocksdb/util/kv_map.h +1 -1
  692. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +8 -6
  693. package/deps/rocksdb/rocksdb/util/math.h +74 -7
  694. package/deps/rocksdb/rocksdb/util/math128.h +13 -1
  695. package/deps/rocksdb/rocksdb/util/murmurhash.h +3 -3
  696. package/deps/rocksdb/rocksdb/util/random.cc +9 -0
  697. package/deps/rocksdb/rocksdb/util/random.h +6 -0
  698. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +298 -144
  699. package/deps/rocksdb/rocksdb/util/rate_limiter.h +68 -19
  700. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +335 -23
  701. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +10 -12
  702. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +18 -15
  703. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +98 -74
  704. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +506 -0
  705. package/deps/rocksdb/rocksdb/util/ribbon_config.h +182 -0
  706. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +154 -79
  707. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +742 -365
  708. package/deps/rocksdb/rocksdb/util/set_comparator.h +2 -0
  709. package/deps/rocksdb/rocksdb/util/slice.cc +198 -35
  710. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -1
  711. package/deps/rocksdb/rocksdb/util/status.cc +32 -29
  712. package/deps/rocksdb/rocksdb/util/stop_watch.h +18 -18
  713. package/deps/rocksdb/rocksdb/util/string_util.cc +85 -6
  714. package/deps/rocksdb/rocksdb/util/string_util.h +47 -2
  715. package/deps/rocksdb/rocksdb/util/thread_guard.h +41 -0
  716. package/deps/rocksdb/rocksdb/util/thread_local.h +2 -2
  717. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +22 -24
  718. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +7 -6
  719. package/deps/rocksdb/rocksdb/util/timer.h +55 -46
  720. package/deps/rocksdb/rocksdb/util/timer_test.cc +50 -48
  721. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +4 -0
  722. package/deps/rocksdb/rocksdb/util/vector_iterator.h +31 -15
  723. package/deps/rocksdb/rocksdb/util/work_queue.h +2 -0
  724. package/deps/rocksdb/rocksdb/util/xxhash.cc +35 -1144
  725. package/deps/rocksdb/rocksdb/util/xxhash.h +5117 -373
  726. package/deps/rocksdb/rocksdb/util/xxph3.h +1762 -0
  727. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +238 -0
  728. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.h +49 -0
  729. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +134 -0
  730. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +104 -0
  731. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.h +47 -0
  732. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +3164 -0
  733. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_impl.h +29 -0
  734. package/deps/rocksdb/rocksdb/utilities/{backupable/backupable_db_test.cc → backup/backup_engine_test.cc} +1679 -485
  735. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +6 -4
  736. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +14 -9
  737. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +2 -0
  738. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +1 -0
  739. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +4 -0
  740. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +37 -27
  741. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +8 -4
  742. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +1 -1
  743. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +13 -10
  744. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -0
  745. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +44 -25
  746. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -4
  747. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +27 -19
  748. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +4 -2
  749. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +69 -0
  750. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +489 -0
  751. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +366 -0
  752. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +67 -4
  753. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +21 -6
  754. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +107 -7
  755. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_options.h +43 -0
  756. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +1 -1
  757. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +24 -8
  758. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -7
  759. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +5 -0
  760. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +99 -218
  761. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +8 -24
  762. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +114 -1
  763. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +6 -2
  764. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -4
  765. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +7 -6
  766. package/deps/rocksdb/rocksdb/utilities/compaction_filters.cc +56 -0
  767. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +2 -2
  768. package/deps/rocksdb/rocksdb/utilities/counted_fs.cc +355 -0
  769. package/deps/rocksdb/rocksdb/utilities/counted_fs.h +152 -0
  770. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +13 -0
  771. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +164 -122
  772. package/deps/rocksdb/rocksdb/utilities/env_timed.h +97 -0
  773. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +75 -17
  774. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +19 -3
  775. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +539 -126
  776. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +162 -17
  777. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +110 -0
  778. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +94 -0
  779. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +5 -2
  780. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +104 -0
  781. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +5 -3
  782. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +4 -1
  783. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +11 -3
  784. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +0 -2
  785. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +5 -1
  786. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +29 -10
  787. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +6 -3
  788. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +29 -14
  789. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +6 -3
  790. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +71 -18
  791. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +15 -9
  792. package/deps/rocksdb/rocksdb/utilities/merge_operators.cc +120 -0
  793. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +3 -23
  794. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +267 -42
  795. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +702 -76
  796. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -1
  797. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +26 -5
  798. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +1 -1
  799. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +124 -1
  800. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -3
  801. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +8 -9
  802. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +15 -13
  803. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +1 -1
  804. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +4 -4
  805. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +2 -2
  806. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +8 -9
  807. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  808. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +6 -3
  809. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +2 -2
  810. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +3 -0
  811. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +2 -0
  812. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +43 -35
  813. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +20 -18
  814. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +107 -2
  815. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +23 -15
  816. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +2 -2
  817. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +316 -0
  818. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.h +86 -0
  819. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +4 -5
  820. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +4 -3
  821. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  822. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +119 -3
  823. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +20 -3
  824. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +20 -0
  825. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +3 -2
  826. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  827. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +38 -14
  828. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +17 -10
  829. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +1 -0
  830. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -2
  831. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +423 -34
  832. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +82 -2
  833. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +72 -40
  834. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +32 -1
  835. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +13 -5
  836. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +7 -3
  837. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +207 -43
  838. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +50 -7
  839. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +28 -10
  840. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +11 -6
  841. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +516 -0
  842. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +506 -15
  843. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +27 -13
  844. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +14 -14
  845. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +3 -0
  846. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +2 -2
  847. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +14 -5
  848. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +305 -27
  849. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +55 -159
  850. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +209 -2
  851. package/deps/rocksdb/rocksdb/utilities/wal_filter.cc +23 -0
  852. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +157 -88
  853. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +501 -114
  854. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +91 -316
  855. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1212 -672
  856. package/deps/rocksdb/rocksdb.gyp +425 -446
  857. package/index.js +5 -87
  858. package/package-lock.json +23687 -0
  859. package/package.json +8 -9
  860. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  861. package/prebuilds/darwin-x64/node.napi.node +0 -0
  862. package/prebuilds/{darwin-x64+arm64 → linux-x64}/node.napi.node +0 -0
  863. package/deps/rocksdb/rocksdb/README.md +0 -32
  864. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +0 -648
  865. package/deps/rocksdb/rocksdb/hdfs/README +0 -23
  866. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +0 -386
  867. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +0 -535
  868. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +0 -175
  869. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +0 -34
  870. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +0 -102
  871. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +0 -49
  872. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +0 -44
  873. package/deps/rocksdb/rocksdb/options/customizable_helper.h +0 -216
  874. package/deps/rocksdb/rocksdb/port/README +0 -10
  875. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +0 -27
  876. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +0 -45
  877. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +0 -166
  878. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +0 -570
  879. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +0 -92
  880. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +0 -54
  881. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +0 -152
  882. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +0 -59
  883. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +0 -141
  884. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +0 -33
  885. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +0 -74
  886. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +0 -117
  887. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +0 -263
  888. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +0 -96
  889. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +0 -40
  890. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +0 -29
  891. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +0 -144
  892. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +0 -30
  893. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +0 -51
  894. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +0 -28
  895. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +0 -10
  896. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +0 -26
  897. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +0 -138
  898. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +0 -23
  899. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +0 -57
  900. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +0 -260
  901. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +0 -52
  902. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +0 -328
  903. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +0 -1703
  904. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +0 -16
  905. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +0 -304
  906. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +0 -39
  907. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +0 -26
  908. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +0 -318
  909. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +0 -57
  910. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +0 -219
  911. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +0 -207
  912. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +0 -164
  913. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +0 -57
  914. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +0 -77
  915. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/test/DistributedMutexTest.cpp +0 -1145
  916. package/deps/rocksdb/rocksdb/util/build_version.h +0 -15
  917. package/deps/rocksdb/rocksdb/util/xxh3p.h +0 -1392
  918. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +0 -2354
  919. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +0 -1497
  920. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +0 -1146
  921. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +0 -13
  922. package/deps/snappy/snappy-1.1.7/README.md +0 -149
  923. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
@@ -16,6 +16,7 @@
16
16
  #if !defined(ROCKSDB_LITE)
17
17
  #include "test_util/sync_point.h"
18
18
  #endif
19
+ #include "test_util/testutil.h"
19
20
  #include "utilities/fault_injection_env.h"
20
21
 
21
22
  namespace ROCKSDB_NAMESPACE {
@@ -195,6 +196,148 @@ class DBBasicTestWithTimestamp : public DBBasicTestWithTimestampBase {
195
196
  : DBBasicTestWithTimestampBase("db_basic_test_with_timestamp") {}
196
197
  };
197
198
 
199
+ TEST_F(DBBasicTestWithTimestamp, SanityChecks) {
200
+ Options options = CurrentOptions();
201
+ options.env = env_;
202
+ options.create_if_missing = true;
203
+ options.avoid_flush_during_shutdown = true;
204
+ options.merge_operator = MergeOperators::CreateStringAppendTESTOperator();
205
+ DestroyAndReopen(options);
206
+
207
+ Options options1 = CurrentOptions();
208
+ options1.env = env_;
209
+ options1.comparator = test::BytewiseComparatorWithU64TsWrapper();
210
+ options1.merge_operator = MergeOperators::CreateStringAppendTESTOperator();
211
+ assert(options1.comparator &&
212
+ options1.comparator->timestamp_size() == sizeof(uint64_t));
213
+ ColumnFamilyHandle* handle = nullptr;
214
+ Status s = db_->CreateColumnFamily(options1, "data", &handle);
215
+ ASSERT_OK(s);
216
+
217
+ std::string dummy_ts(sizeof(uint64_t), '\0');
218
+ // Perform timestamp operations on default cf.
219
+ ASSERT_TRUE(
220
+ db_->Put(WriteOptions(), "key", dummy_ts, "value").IsInvalidArgument());
221
+ ASSERT_TRUE(db_->Merge(WriteOptions(), db_->DefaultColumnFamily(), "key",
222
+ dummy_ts, "value")
223
+ .IsNotSupported());
224
+ ASSERT_TRUE(db_->Delete(WriteOptions(), "key", dummy_ts).IsInvalidArgument());
225
+ ASSERT_TRUE(
226
+ db_->SingleDelete(WriteOptions(), "key", dummy_ts).IsInvalidArgument());
227
+ ASSERT_TRUE(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
228
+ "begin_key", "end_key", dummy_ts)
229
+ .IsNotSupported());
230
+
231
+ // Perform non-timestamp operations on "data" cf.
232
+ ASSERT_TRUE(
233
+ db_->Put(WriteOptions(), handle, "key", "value").IsInvalidArgument());
234
+ ASSERT_TRUE(db_->Delete(WriteOptions(), handle, "key").IsInvalidArgument());
235
+ ASSERT_TRUE(
236
+ db_->SingleDelete(WriteOptions(), handle, "key").IsInvalidArgument());
237
+
238
+ ASSERT_TRUE(
239
+ db_->Merge(WriteOptions(), handle, "key", "value").IsInvalidArgument());
240
+ ASSERT_TRUE(db_->DeleteRange(WriteOptions(), handle, "begin_key", "end_key")
241
+ .IsInvalidArgument());
242
+
243
+ {
244
+ WriteBatch wb;
245
+ ASSERT_OK(wb.Put(handle, "key", "value"));
246
+ ASSERT_TRUE(db_->Write(WriteOptions(), &wb).IsInvalidArgument());
247
+ }
248
+ {
249
+ WriteBatch wb;
250
+ ASSERT_OK(wb.Delete(handle, "key"));
251
+ ASSERT_TRUE(db_->Write(WriteOptions(), &wb).IsInvalidArgument());
252
+ }
253
+ {
254
+ WriteBatch wb;
255
+ ASSERT_OK(wb.SingleDelete(handle, "key"));
256
+ ASSERT_TRUE(db_->Write(WriteOptions(), &wb).IsInvalidArgument());
257
+ }
258
+
259
+ // Perform timestamp operations with timestamps of incorrect size.
260
+ const std::string wrong_ts(sizeof(uint32_t), '\0');
261
+ ASSERT_TRUE(db_->Put(WriteOptions(), handle, "key", wrong_ts, "value")
262
+ .IsInvalidArgument());
263
+ ASSERT_TRUE(db_->Merge(WriteOptions(), handle, "key", wrong_ts, "value")
264
+ .IsNotSupported());
265
+ ASSERT_TRUE(
266
+ db_->Delete(WriteOptions(), handle, "key", wrong_ts).IsInvalidArgument());
267
+ ASSERT_TRUE(db_->SingleDelete(WriteOptions(), handle, "key", wrong_ts)
268
+ .IsInvalidArgument());
269
+ ASSERT_TRUE(
270
+ db_->DeleteRange(WriteOptions(), handle, "begin_key", "end_key", wrong_ts)
271
+ .IsNotSupported());
272
+
273
+ delete handle;
274
+ }
275
+
276
+ TEST_F(DBBasicTestWithTimestamp, MixedCfs) {
277
+ Options options = CurrentOptions();
278
+ options.env = env_;
279
+ options.create_if_missing = true;
280
+ options.avoid_flush_during_shutdown = true;
281
+ DestroyAndReopen(options);
282
+
283
+ Options options1 = CurrentOptions();
284
+ options1.env = env_;
285
+ const size_t kTimestampSize = Timestamp(0, 0).size();
286
+ TestComparator test_cmp(kTimestampSize);
287
+ options1.comparator = &test_cmp;
288
+ ColumnFamilyHandle* handle = nullptr;
289
+ Status s = db_->CreateColumnFamily(options1, "data", &handle);
290
+ ASSERT_OK(s);
291
+
292
+ WriteBatch wb;
293
+ ASSERT_OK(wb.Put("a", "value"));
294
+ ASSERT_OK(wb.Put(handle, "a", "value"));
295
+ {
296
+ std::string ts = Timestamp(1, 0);
297
+ const auto ts_sz_func = [kTimestampSize, handle](uint32_t cf_id) {
298
+ assert(handle);
299
+ if (cf_id == 0) {
300
+ return static_cast<size_t>(0);
301
+ } else if (cf_id == handle->GetID()) {
302
+ return kTimestampSize;
303
+ } else {
304
+ assert(false);
305
+ return std::numeric_limits<size_t>::max();
306
+ }
307
+ };
308
+ ASSERT_OK(wb.UpdateTimestamps(ts, ts_sz_func));
309
+ ASSERT_OK(db_->Write(WriteOptions(), &wb));
310
+ }
311
+
312
+ const auto verify_db = [this](ColumnFamilyHandle* h, const std::string& key,
313
+ const std::string& ts,
314
+ const std::string& expected_value) {
315
+ ASSERT_EQ(expected_value, Get(key));
316
+ Slice read_ts_slice(ts);
317
+ ReadOptions read_opts;
318
+ read_opts.timestamp = &read_ts_slice;
319
+ std::string value;
320
+ ASSERT_OK(db_->Get(read_opts, h, key, &value));
321
+ ASSERT_EQ(expected_value, value);
322
+ };
323
+
324
+ verify_db(handle, "a", Timestamp(1, 0), "value");
325
+
326
+ delete handle;
327
+ Close();
328
+
329
+ std::vector<ColumnFamilyDescriptor> cf_descs;
330
+ cf_descs.emplace_back(kDefaultColumnFamilyName, options);
331
+ cf_descs.emplace_back("data", options1);
332
+ options.create_if_missing = false;
333
+ s = DB::Open(options, dbname_, cf_descs, &handles_, &db_);
334
+ ASSERT_OK(s);
335
+
336
+ verify_db(handles_[1], "a", Timestamp(1, 0), "value");
337
+
338
+ Close();
339
+ }
340
+
198
341
  TEST_F(DBBasicTestWithTimestamp, CompactRangeWithSpecifiedRange) {
199
342
  Options options = CurrentOptions();
200
343
  options.env = env_;
@@ -205,14 +348,12 @@ TEST_F(DBBasicTestWithTimestamp, CompactRangeWithSpecifiedRange) {
205
348
  DestroyAndReopen(options);
206
349
 
207
350
  WriteOptions write_opts;
208
- std::string ts_str = Timestamp(1, 0);
209
- Slice ts = ts_str;
210
- write_opts.timestamp = &ts;
351
+ std::string ts = Timestamp(1, 0);
211
352
 
212
- ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
353
+ ASSERT_OK(db_->Put(write_opts, "foo1", ts, "bar"));
213
354
  ASSERT_OK(Flush());
214
355
 
215
- ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
356
+ ASSERT_OK(db_->Put(write_opts, "foo2", ts, "bar"));
216
357
  ASSERT_OK(Flush());
217
358
 
218
359
  std::string start_str = "foo";
@@ -223,6 +364,189 @@ TEST_F(DBBasicTestWithTimestamp, CompactRangeWithSpecifiedRange) {
223
364
  Close();
224
365
  }
225
366
 
367
+ TEST_F(DBBasicTestWithTimestamp, GcPreserveLatestVersionBelowFullHistoryLow) {
368
+ Options options = CurrentOptions();
369
+ options.env = env_;
370
+ options.create_if_missing = true;
371
+ const size_t kTimestampSize = Timestamp(0, 0).size();
372
+ TestComparator test_cmp(kTimestampSize);
373
+ options.comparator = &test_cmp;
374
+ DestroyAndReopen(options);
375
+
376
+ std::string ts_str = Timestamp(1, 0);
377
+ WriteOptions wopts;
378
+ ASSERT_OK(db_->Put(wopts, "k1", ts_str, "v1"));
379
+ ASSERT_OK(db_->Put(wopts, "k2", ts_str, "v2"));
380
+ ASSERT_OK(db_->Put(wopts, "k3", ts_str, "v3"));
381
+
382
+ ts_str = Timestamp(2, 0);
383
+ ASSERT_OK(db_->Delete(wopts, "k3", ts_str));
384
+
385
+ ts_str = Timestamp(4, 0);
386
+ ASSERT_OK(db_->Put(wopts, "k1", ts_str, "v5"));
387
+
388
+ ts_str = Timestamp(3, 0);
389
+ Slice ts = ts_str;
390
+ CompactRangeOptions cro;
391
+ cro.full_history_ts_low = &ts;
392
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
393
+
394
+ ASSERT_OK(Flush());
395
+
396
+ ReadOptions ropts;
397
+ ropts.timestamp = &ts;
398
+ std::string value;
399
+ Status s = db_->Get(ropts, "k1", &value);
400
+ ASSERT_OK(s);
401
+ ASSERT_EQ("v1", value);
402
+
403
+ Close();
404
+ }
405
+
406
+ TEST_F(DBBasicTestWithTimestamp, UpdateFullHistoryTsLow) {
407
+ Options options = CurrentOptions();
408
+ options.env = env_;
409
+ options.create_if_missing = true;
410
+ const size_t kTimestampSize = Timestamp(0, 0).size();
411
+ TestComparator test_cmp(kTimestampSize);
412
+ options.comparator = &test_cmp;
413
+ DestroyAndReopen(options);
414
+
415
+ const std::string kKey = "test kKey";
416
+
417
+ // Test set ts_low first and flush()
418
+ int current_ts_low = 5;
419
+ std::string ts_low_str = Timestamp(current_ts_low, 0);
420
+ Slice ts_low = ts_low_str;
421
+ CompactRangeOptions comp_opts;
422
+ comp_opts.full_history_ts_low = &ts_low;
423
+ comp_opts.bottommost_level_compaction = BottommostLevelCompaction::kForce;
424
+
425
+ ASSERT_OK(db_->CompactRange(comp_opts, nullptr, nullptr));
426
+
427
+ auto* cfd =
428
+ static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
429
+ ->cfd();
430
+ auto result_ts_low = cfd->GetFullHistoryTsLow();
431
+
432
+ ASSERT_TRUE(test_cmp.CompareTimestamp(ts_low, result_ts_low) == 0);
433
+
434
+ for (int i = 0; i < 10; i++) {
435
+ WriteOptions write_opts;
436
+ std::string ts = Timestamp(i, 0);
437
+ ASSERT_OK(db_->Put(write_opts, kKey, ts, Key(i)));
438
+ }
439
+ ASSERT_OK(Flush());
440
+
441
+ // TODO return a non-ok for read ts < current_ts_low and test it.
442
+ for (int i = 0; i < 10; i++) {
443
+ ReadOptions read_opts;
444
+ std::string ts_str = Timestamp(i, 0);
445
+ Slice ts = ts_str;
446
+ read_opts.timestamp = &ts;
447
+ std::string value;
448
+ Status status = db_->Get(read_opts, kKey, &value);
449
+ if (i < current_ts_low - 1) {
450
+ ASSERT_TRUE(status.IsNotFound());
451
+ } else {
452
+ ASSERT_OK(status);
453
+ ASSERT_TRUE(value.compare(Key(i)) == 0);
454
+ }
455
+ }
456
+
457
+ // Test set ts_low and then trigger compaction
458
+ for (int i = 10; i < 20; i++) {
459
+ WriteOptions write_opts;
460
+ std::string ts = Timestamp(i, 0);
461
+ ASSERT_OK(db_->Put(write_opts, kKey, ts, Key(i)));
462
+ }
463
+
464
+ ASSERT_OK(Flush());
465
+
466
+ current_ts_low = 15;
467
+ ts_low_str = Timestamp(current_ts_low, 0);
468
+ ts_low = ts_low_str;
469
+ comp_opts.full_history_ts_low = &ts_low;
470
+ ASSERT_OK(db_->CompactRange(comp_opts, nullptr, nullptr));
471
+ result_ts_low = cfd->GetFullHistoryTsLow();
472
+ ASSERT_TRUE(test_cmp.CompareTimestamp(ts_low, result_ts_low) == 0);
473
+
474
+ // TODO return a non-ok for read ts < current_ts_low and test it.
475
+ for (int i = current_ts_low; i < 20; i++) {
476
+ ReadOptions read_opts;
477
+ std::string ts_str = Timestamp(i, 0);
478
+ Slice ts = ts_str;
479
+ read_opts.timestamp = &ts;
480
+ std::string value;
481
+ Status status = db_->Get(read_opts, kKey, &value);
482
+ ASSERT_OK(status);
483
+ ASSERT_TRUE(value.compare(Key(i)) == 0);
484
+ }
485
+
486
+ // Test invalid compaction with range
487
+ Slice start(kKey), end(kKey);
488
+ Status s = db_->CompactRange(comp_opts, &start, &end);
489
+ ASSERT_TRUE(s.IsInvalidArgument());
490
+ s = db_->CompactRange(comp_opts, &start, nullptr);
491
+ ASSERT_TRUE(s.IsInvalidArgument());
492
+ s = db_->CompactRange(comp_opts, nullptr, &end);
493
+ ASSERT_TRUE(s.IsInvalidArgument());
494
+
495
+ // Test invalid compaction with the decreasing ts_low
496
+ ts_low_str = Timestamp(current_ts_low - 1, 0);
497
+ ts_low = ts_low_str;
498
+ comp_opts.full_history_ts_low = &ts_low;
499
+ s = db_->CompactRange(comp_opts, nullptr, nullptr);
500
+ ASSERT_TRUE(s.IsInvalidArgument());
501
+
502
+ Close();
503
+ }
504
+
505
+ TEST_F(DBBasicTestWithTimestamp, UpdateFullHistoryTsLowWithPublicAPI) {
506
+ Options options = CurrentOptions();
507
+ options.env = env_;
508
+ options.create_if_missing = true;
509
+ const size_t kTimestampSize = Timestamp(0, 0).size();
510
+ TestComparator test_cmp(kTimestampSize);
511
+ options.comparator = &test_cmp;
512
+ DestroyAndReopen(options);
513
+ std::string ts_low_str = Timestamp(9, 0);
514
+ ASSERT_OK(
515
+ db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_low_str));
516
+ std::string result_ts_low;
517
+ ASSERT_OK(db_->GetFullHistoryTsLow(nullptr, &result_ts_low));
518
+ ASSERT_TRUE(test_cmp.CompareTimestamp(ts_low_str, result_ts_low) == 0);
519
+ // test increase full_history_low backward
520
+ std::string ts_low_str_back = Timestamp(8, 0);
521
+ auto s = db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(),
522
+ ts_low_str_back);
523
+ ASSERT_EQ(s, Status::InvalidArgument());
524
+ // test IncreaseFullHistoryTsLow with a timestamp whose length is longger
525
+ // than the cf's timestamp size
526
+ std::string ts_low_str_long(Timestamp(0, 0).size() + 1, 'a');
527
+ s = db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(),
528
+ ts_low_str_long);
529
+ ASSERT_EQ(s, Status::InvalidArgument());
530
+ // test IncreaseFullHistoryTsLow with a timestamp which is null
531
+ std::string ts_low_str_null = "";
532
+ s = db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(),
533
+ ts_low_str_null);
534
+ ASSERT_EQ(s, Status::InvalidArgument());
535
+ // test IncreaseFullHistoryTsLow for a column family that does not enable
536
+ // timestamp
537
+ options.comparator = BytewiseComparator();
538
+ DestroyAndReopen(options);
539
+ ts_low_str = Timestamp(10, 0);
540
+ s = db_->IncreaseFullHistoryTsLow(db_->DefaultColumnFamily(), ts_low_str);
541
+ ASSERT_EQ(s, Status::InvalidArgument());
542
+ // test GetFullHistoryTsLow for a column family that does not enable
543
+ // timestamp
544
+ std::string current_ts_low;
545
+ s = db_->GetFullHistoryTsLow(db_->DefaultColumnFamily(), &current_ts_low);
546
+ ASSERT_EQ(s, Status::InvalidArgument());
547
+ Close();
548
+ }
549
+
226
550
  TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
227
551
  Options options = CurrentOptions();
228
552
  options.write_buffer_size = 100000000; // Large write buffer
@@ -235,14 +559,12 @@ TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
235
559
  auto default_cf = db_->DefaultColumnFamily();
236
560
 
237
561
  WriteOptions write_opts;
238
- std::string ts_str = Timestamp(1, 0);
239
- Slice ts = ts_str;
240
- write_opts.timestamp = &ts;
562
+ std::string ts = Timestamp(1, 0);
241
563
 
242
564
  const int N = 128;
243
565
  Random rnd(301);
244
566
  for (int i = 0; i < N; i++) {
245
- ASSERT_OK(db_->Put(write_opts, Key(i), rnd.RandomString(1024)));
567
+ ASSERT_OK(db_->Put(write_opts, Key(i), ts, rnd.RandomString(1024)));
246
568
  }
247
569
 
248
570
  uint64_t size;
@@ -250,7 +572,7 @@ TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
250
572
  std::string end = Key(60);
251
573
  Range r(start, end);
252
574
  SizeApproximationOptions size_approx_options;
253
- size_approx_options.include_memtabtles = true;
575
+ size_approx_options.include_memtables = true;
254
576
  size_approx_options.include_files = true;
255
577
  ASSERT_OK(
256
578
  db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
@@ -281,7 +603,7 @@ TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
281
603
  ASSERT_EQ(size, 0);
282
604
 
283
605
  // Test range boundaries
284
- ASSERT_OK(db_->Put(write_opts, Key(1000), rnd.RandomString(1024)));
606
+ ASSERT_OK(db_->Put(write_opts, Key(1000), ts, rnd.RandomString(1024)));
285
607
  // Should include start key
286
608
  start = Key(1000);
287
609
  end = Key(1100);
@@ -297,12 +619,11 @@ TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
297
619
  ASSERT_OK(
298
620
  db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
299
621
  ASSERT_EQ(size, 0);
300
- std::cout << size << std::endl;
301
622
 
302
623
  Close();
303
624
  }
304
625
 
305
- TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
626
+ TEST_F(DBBasicTestWithTimestamp, SimpleIterate) {
306
627
  const int kNumKeysPerFile = 128;
307
628
  const uint64_t kMaxKey = 1024;
308
629
  Options options = CurrentOptions();
@@ -311,7 +632,8 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
311
632
  const size_t kTimestampSize = Timestamp(0, 0).size();
312
633
  TestComparator test_cmp(kTimestampSize);
313
634
  options.comparator = &test_cmp;
314
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
635
+ options.memtable_factory.reset(
636
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
315
637
  DestroyAndReopen(options);
316
638
  const std::vector<uint64_t> start_keys = {1, 0};
317
639
  const std::vector<std::string> write_timestamps = {Timestamp(1, 0),
@@ -320,10 +642,9 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
320
642
  Timestamp(4, 0)};
321
643
  for (size_t i = 0; i < write_timestamps.size(); ++i) {
322
644
  WriteOptions write_opts;
323
- Slice write_ts = write_timestamps[i];
324
- write_opts.timestamp = &write_ts;
325
645
  for (uint64_t key = start_keys[i]; key <= kMaxKey; ++key) {
326
- Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
646
+ Status s = db_->Put(write_opts, Key1(key), write_timestamps[i],
647
+ "value" + std::to_string(i));
327
648
  ASSERT_OK(s);
328
649
  }
329
650
  }
@@ -334,6 +655,7 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
334
655
  std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
335
656
  int count = 0;
336
657
  uint64_t key = 0;
658
+ // Forward iterate.
337
659
  for (it->Seek(Key1(0)), key = start_keys[i]; it->Valid();
338
660
  it->Next(), ++count, ++key) {
339
661
  CheckIterUserEntry(it.get(), Key1(key), kTypeValue,
@@ -342,7 +664,16 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
342
664
  size_t expected_count = kMaxKey - start_keys[i] + 1;
343
665
  ASSERT_EQ(expected_count, count);
344
666
 
345
- // SeekToFirst() with lower bound.
667
+ // Backward iterate.
668
+ count = 0;
669
+ for (it->SeekForPrev(Key1(kMaxKey)), key = kMaxKey; it->Valid();
670
+ it->Prev(), ++count, --key) {
671
+ CheckIterUserEntry(it.get(), Key1(key), kTypeValue,
672
+ "value" + std::to_string(i), write_timestamps[i]);
673
+ }
674
+ ASSERT_EQ(static_cast<size_t>(kMaxKey) - start_keys[i] + 1, count);
675
+
676
+ // SeekToFirst()/SeekToLast() with lower/upper bounds.
346
677
  // Then iter with lower and upper bounds.
347
678
  uint64_t l = 0;
348
679
  uint64_t r = kMaxKey + 1;
@@ -360,6 +691,12 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
360
691
  "value" + std::to_string(i), write_timestamps[i]);
361
692
  }
362
693
  ASSERT_EQ(r - std::max(l, start_keys[i]), count);
694
+
695
+ for (it->SeekToLast(), key = std::min(r, kMaxKey + 1), count = 0;
696
+ it->Valid(); it->Prev(), --key, ++count) {
697
+ CheckIterUserEntry(it.get(), Key1(key - 1), kTypeValue,
698
+ "value" + std::to_string(i), write_timestamps[i]);
699
+ }
363
700
  l += (kMaxKey / 100);
364
701
  r -= (kMaxKey / 100);
365
702
  }
@@ -367,7 +704,194 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
367
704
  Close();
368
705
  }
369
706
 
370
- TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLessThanKey) {
707
+ TEST_F(DBBasicTestWithTimestamp, TrimHistoryTest) {
708
+ Options options = CurrentOptions();
709
+ options.env = env_;
710
+ options.create_if_missing = true;
711
+ const size_t kTimestampSize = Timestamp(0, 0).size();
712
+ TestComparator test_cmp(kTimestampSize);
713
+ options.comparator = &test_cmp;
714
+ DestroyAndReopen(options);
715
+ auto check_value_by_ts = [](DB* db, Slice key, std::string readTs,
716
+ Status status, std::string checkValue) {
717
+ ReadOptions ropts;
718
+ Slice ts = readTs;
719
+ ropts.timestamp = &ts;
720
+ std::string value;
721
+ Status s = db->Get(ropts, key, &value);
722
+ ASSERT_TRUE(s == status);
723
+ if (s.ok()) {
724
+ ASSERT_EQ(checkValue, value);
725
+ }
726
+ };
727
+ // Construct data of different versions with different ts
728
+ ASSERT_OK(db_->Put(WriteOptions(), "k1", Timestamp(2, 0), "v1"));
729
+ ASSERT_OK(db_->Put(WriteOptions(), "k1", Timestamp(4, 0), "v2"));
730
+ ASSERT_OK(db_->Delete(WriteOptions(), "k1", Timestamp(5, 0)));
731
+ ASSERT_OK(db_->Put(WriteOptions(), "k1", Timestamp(6, 0), "v3"));
732
+ check_value_by_ts(db_, "k1", Timestamp(7, 0), Status::OK(), "v3");
733
+ ASSERT_OK(Flush());
734
+ Close();
735
+
736
+ ColumnFamilyOptions cf_options(options);
737
+ std::vector<ColumnFamilyDescriptor> column_families;
738
+ column_families.push_back(
739
+ ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
740
+ DBOptions db_options(options);
741
+
742
+ // Trim data whose version > Timestamp(5, 0), read(k1, ts(7)) <- NOT_FOUND.
743
+ ASSERT_OK(DB::OpenAndTrimHistory(db_options, dbname_, column_families,
744
+ &handles_, &db_, Timestamp(5, 0)));
745
+ check_value_by_ts(db_, "k1", Timestamp(7, 0), Status::NotFound(), "");
746
+ Close();
747
+
748
+ // Trim data whose timestamp > Timestamp(4, 0), read(k1, ts(7)) <- v2
749
+ ASSERT_OK(DB::OpenAndTrimHistory(db_options, dbname_, column_families,
750
+ &handles_, &db_, Timestamp(4, 0)));
751
+ check_value_by_ts(db_, "k1", Timestamp(7, 0), Status::OK(), "v2");
752
+ Close();
753
+ }
754
+
755
+ TEST_F(DBBasicTestWithTimestamp, OpenAndTrimHistoryInvalidOptionTest) {
756
+ Destroy(last_options_);
757
+
758
+ Options options = CurrentOptions();
759
+ options.env = env_;
760
+ options.create_if_missing = true;
761
+ const size_t kTimestampSize = Timestamp(0, 0).size();
762
+ TestComparator test_cmp(kTimestampSize);
763
+ options.comparator = &test_cmp;
764
+
765
+ ColumnFamilyOptions cf_options(options);
766
+ std::vector<ColumnFamilyDescriptor> column_families;
767
+ column_families.push_back(
768
+ ColumnFamilyDescriptor(kDefaultColumnFamilyName, cf_options));
769
+ DBOptions db_options(options);
770
+
771
+ // OpenAndTrimHistory should not work with avoid_flush_during_recovery
772
+ db_options.avoid_flush_during_recovery = true;
773
+ ASSERT_TRUE(DB::OpenAndTrimHistory(db_options, dbname_, column_families,
774
+ &handles_, &db_, Timestamp(0, 0))
775
+ .IsInvalidArgument());
776
+ }
777
+
778
+ #ifndef ROCKSDB_LITE
779
+ TEST_F(DBBasicTestWithTimestamp, GetTimestampTableProperties) {
780
+ Options options = CurrentOptions();
781
+ const size_t kTimestampSize = Timestamp(0, 0).size();
782
+ TestComparator test_cmp(kTimestampSize);
783
+ options.comparator = &test_cmp;
784
+ DestroyAndReopen(options);
785
+ // Create 2 tables
786
+ for (int table = 0; table < 2; ++table) {
787
+ for (int i = 0; i < 10; i++) {
788
+ std::string ts = Timestamp(i, 0);
789
+ ASSERT_OK(db_->Put(WriteOptions(), "key", ts, Key(i)));
790
+ }
791
+ ASSERT_OK(Flush());
792
+ }
793
+
794
+ TablePropertiesCollection props;
795
+ ASSERT_OK(db_->GetPropertiesOfAllTables(&props));
796
+ ASSERT_EQ(2U, props.size());
797
+ for (const auto& item : props) {
798
+ auto& user_collected = item.second->user_collected_properties;
799
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_min") !=
800
+ user_collected.end());
801
+ ASSERT_TRUE(user_collected.find("rocksdb.timestamp_max") !=
802
+ user_collected.end());
803
+ ASSERT_EQ(user_collected.at("rocksdb.timestamp_min"), Timestamp(0, 0));
804
+ ASSERT_EQ(user_collected.at("rocksdb.timestamp_max"), Timestamp(9, 0));
805
+ }
806
+ Close();
807
+ }
808
+ #endif // !ROCKSDB_LITE
809
+
810
+ class DBBasicTestWithTimestampTableOptions
811
+ : public DBBasicTestWithTimestampBase,
812
+ public testing::WithParamInterface<BlockBasedTableOptions::IndexType> {
813
+ public:
814
+ explicit DBBasicTestWithTimestampTableOptions()
815
+ : DBBasicTestWithTimestampBase(
816
+ "db_basic_test_with_timestamp_table_options") {}
817
+ };
818
+
819
+ INSTANTIATE_TEST_CASE_P(
820
+ Timestamp, DBBasicTestWithTimestampTableOptions,
821
+ testing::Values(
822
+ BlockBasedTableOptions::IndexType::kBinarySearch,
823
+ BlockBasedTableOptions::IndexType::kHashSearch,
824
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch,
825
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey));
826
+
827
+ TEST_P(DBBasicTestWithTimestampTableOptions, GetAndMultiGet) {
828
+ Options options = GetDefaultOptions();
829
+ options.create_if_missing = true;
830
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
831
+ options.compression = kNoCompression;
832
+ BlockBasedTableOptions bbto;
833
+ bbto.index_type = GetParam();
834
+ bbto.block_size = 100;
835
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
836
+ const size_t kTimestampSize = Timestamp(0, 0).size();
837
+ TestComparator cmp(kTimestampSize);
838
+ options.comparator = &cmp;
839
+ DestroyAndReopen(options);
840
+ constexpr uint64_t kNumKeys = 1024;
841
+ for (uint64_t k = 0; k < kNumKeys; ++k) {
842
+ WriteOptions write_opts;
843
+ ASSERT_OK(db_->Put(write_opts, Key1(k), Timestamp(1, 0),
844
+ "value" + std::to_string(k)));
845
+ }
846
+ ASSERT_OK(Flush());
847
+ {
848
+ ReadOptions read_opts;
849
+ read_opts.total_order_seek = true;
850
+ std::string ts_str = Timestamp(2, 0);
851
+ Slice ts = ts_str;
852
+ read_opts.timestamp = &ts;
853
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
854
+ // verify Get()
855
+ for (it->SeekToFirst(); it->Valid(); it->Next()) {
856
+ std::string value_from_get;
857
+ std::string key_str(it->key().data(), it->key().size());
858
+ std::string timestamp;
859
+ ASSERT_OK(db_->Get(read_opts, key_str, &value_from_get, &timestamp));
860
+ ASSERT_EQ(it->value(), value_from_get);
861
+ ASSERT_EQ(Timestamp(1, 0), timestamp);
862
+ }
863
+
864
+ // verify MultiGet()
865
+ constexpr uint64_t step = 2;
866
+ static_assert(0 == (kNumKeys % step),
867
+ "kNumKeys must be a multiple of step");
868
+ for (uint64_t k = 0; k < kNumKeys; k += 2) {
869
+ std::vector<std::string> key_strs;
870
+ std::vector<Slice> keys;
871
+ for (size_t i = 0; i < step; ++i) {
872
+ key_strs.push_back(Key1(k + i));
873
+ }
874
+ for (size_t i = 0; i < step; ++i) {
875
+ keys.emplace_back(key_strs[i]);
876
+ }
877
+ std::vector<std::string> values;
878
+ std::vector<std::string> timestamps;
879
+ std::vector<Status> statuses =
880
+ db_->MultiGet(read_opts, keys, &values, &timestamps);
881
+ ASSERT_EQ(step, statuses.size());
882
+ ASSERT_EQ(step, values.size());
883
+ ASSERT_EQ(step, timestamps.size());
884
+ for (uint64_t i = 0; i < step; ++i) {
885
+ ASSERT_OK(statuses[i]);
886
+ ASSERT_EQ("value" + std::to_string(k + i), values[i]);
887
+ ASSERT_EQ(Timestamp(1, 0), timestamps[i]);
888
+ }
889
+ }
890
+ }
891
+ Close();
892
+ }
893
+
894
+ TEST_P(DBBasicTestWithTimestampTableOptions, SeekWithPrefixLessThanKey) {
371
895
  Options options = CurrentOptions();
372
896
  options.env = env_;
373
897
  options.create_if_missing = true;
@@ -378,6 +902,7 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLessThanKey) {
378
902
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
379
903
  bbto.cache_index_and_filter_blocks = true;
380
904
  bbto.whole_key_filtering = true;
905
+ bbto.index_type = GetParam();
381
906
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
382
907
  const size_t kTimestampSize = Timestamp(0, 0).size();
383
908
  TestComparator test_cmp(kTimestampSize);
@@ -385,26 +910,23 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLessThanKey) {
385
910
  DestroyAndReopen(options);
386
911
 
387
912
  WriteOptions write_opts;
388
- std::string ts_str = Timestamp(1, 0);
389
- Slice ts = ts_str;
390
- write_opts.timestamp = &ts;
913
+ std::string ts = Timestamp(1, 0);
391
914
 
392
- ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
915
+ ASSERT_OK(db_->Put(write_opts, "foo1", ts, "bar"));
393
916
  ASSERT_OK(Flush());
394
917
 
395
- ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
918
+ ASSERT_OK(db_->Put(write_opts, "foo2", ts, "bar"));
396
919
  ASSERT_OK(Flush());
397
920
 
398
921
  // Move sst file to next level
399
922
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
400
923
 
401
- ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
924
+ ASSERT_OK(db_->Put(write_opts, "foo3", ts, "bar"));
402
925
  ASSERT_OK(Flush());
403
926
 
404
927
  ReadOptions read_opts;
405
- std::string read_ts = Timestamp(1, 0);
406
- ts = read_ts;
407
- read_opts.timestamp = &ts;
928
+ Slice read_ts = ts;
929
+ read_opts.timestamp = &read_ts;
408
930
  {
409
931
  std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
410
932
  iter->Seek("foo");
@@ -422,17 +944,20 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLessThanKey) {
422
944
  Close();
423
945
  }
424
946
 
425
- TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLargerThanKey) {
947
+ TEST_P(DBBasicTestWithTimestampTableOptions, SeekWithCappedPrefix) {
426
948
  Options options = CurrentOptions();
427
949
  options.env = env_;
428
950
  options.create_if_missing = true;
429
- options.prefix_extractor.reset(NewFixedPrefixTransform(20));
951
+ // All of the keys or this test must be longer than 3 characters
952
+ constexpr int kMinKeyLen = 3;
953
+ options.prefix_extractor.reset(NewCappedPrefixTransform(kMinKeyLen));
430
954
  options.memtable_whole_key_filtering = true;
431
955
  options.memtable_prefix_bloom_size_ratio = 0.1;
432
956
  BlockBasedTableOptions bbto;
433
957
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
434
958
  bbto.cache_index_and_filter_blocks = true;
435
959
  bbto.whole_key_filtering = true;
960
+ bbto.index_type = GetParam();
436
961
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
437
962
  const size_t kTimestampSize = Timestamp(0, 0).size();
438
963
  TestComparator test_cmp(kTimestampSize);
@@ -440,26 +965,24 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLargerThanKey) {
440
965
  DestroyAndReopen(options);
441
966
 
442
967
  WriteOptions write_opts;
443
- std::string ts_str = Timestamp(1, 0);
444
- Slice ts = ts_str;
445
- write_opts.timestamp = &ts;
968
+ std::string ts = Timestamp(1, 0);
446
969
 
447
- ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
970
+ ASSERT_OK(db_->Put(write_opts, "foo1", ts, "bar"));
448
971
  ASSERT_OK(Flush());
449
972
 
450
- ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
973
+ ASSERT_OK(db_->Put(write_opts, "foo2", ts, "bar"));
451
974
  ASSERT_OK(Flush());
452
975
 
453
976
  // Move sst file to next level
454
977
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
455
978
 
456
- ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
979
+ ASSERT_OK(db_->Put(write_opts, "foo3", ts, "bar"));
457
980
  ASSERT_OK(Flush());
458
981
 
459
982
  ReadOptions read_opts;
460
- std::string read_ts = Timestamp(2, 0);
461
- ts = read_ts;
462
- read_opts.timestamp = &ts;
983
+ ts = Timestamp(2, 0);
984
+ Slice read_ts = ts;
985
+ read_opts.timestamp = &read_ts;
463
986
  {
464
987
  std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
465
988
  // Make sure the prefix extractor doesn't include timestamp, otherwise it
@@ -475,7 +998,7 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLargerThanKey) {
475
998
  Close();
476
999
  }
477
1000
 
478
- TEST_F(DBBasicTestWithTimestamp, SeekWithBound) {
1001
+ TEST_P(DBBasicTestWithTimestampTableOptions, SeekWithBound) {
479
1002
  Options options = CurrentOptions();
480
1003
  options.env = env_;
481
1004
  options.create_if_missing = true;
@@ -484,6 +1007,7 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithBound) {
484
1007
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
485
1008
  bbto.cache_index_and_filter_blocks = true;
486
1009
  bbto.whole_key_filtering = true;
1010
+ bbto.index_type = GetParam();
487
1011
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
488
1012
  const size_t kTimestampSize = Timestamp(0, 0).size();
489
1013
  TestComparator test_cmp(kTimestampSize);
@@ -491,39 +1015,135 @@ TEST_F(DBBasicTestWithTimestamp, SeekWithBound) {
491
1015
  DestroyAndReopen(options);
492
1016
 
493
1017
  WriteOptions write_opts;
494
- std::string ts_str = Timestamp(1, 0);
495
- Slice ts = ts_str;
496
- write_opts.timestamp = &ts;
1018
+ std::string ts = Timestamp(1, 0);
497
1019
 
498
- ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
1020
+ ASSERT_OK(db_->Put(write_opts, "foo1", ts, "bar1"));
499
1021
  ASSERT_OK(Flush());
500
1022
 
501
- ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
1023
+ ASSERT_OK(db_->Put(write_opts, "foo2", ts, "bar2"));
502
1024
  ASSERT_OK(Flush());
503
1025
 
504
1026
  // Move sst file to next level
505
1027
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
506
1028
 
507
- ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
1029
+ for (int i = 3; i < 9; ++i) {
1030
+ ASSERT_OK(db_->Put(write_opts, "foo" + std::to_string(i), ts,
1031
+ "bar" + std::to_string(i)));
1032
+ }
508
1033
  ASSERT_OK(Flush());
509
1034
 
510
1035
  ReadOptions read_opts;
511
- std::string read_ts = Timestamp(2, 0);
512
- ts = read_ts;
513
- read_opts.timestamp = &ts;
514
- std::string up_bound = "foo5";
1036
+ ts = Timestamp(2, 0);
1037
+ Slice read_ts = ts;
1038
+ read_opts.timestamp = &read_ts;
1039
+ std::string up_bound = "foo5"; // exclusive
515
1040
  Slice up_bound_slice = up_bound;
1041
+ std::string lo_bound = "foo2"; // inclusive
1042
+ Slice lo_bound_slice = lo_bound;
516
1043
  read_opts.iterate_upper_bound = &up_bound_slice;
1044
+ read_opts.iterate_lower_bound = &lo_bound_slice;
517
1045
  read_opts.auto_prefix_mode = true;
518
1046
  {
519
1047
  std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
520
1048
  // Make sure the prefix extractor doesn't include timestamp, otherwise it
521
1049
  // may return invalid result.
522
1050
  iter->Seek("foo");
523
- ASSERT_TRUE(iter->Valid());
524
- ASSERT_OK(iter->status());
1051
+ CheckIterUserEntry(iter.get(), lo_bound, kTypeValue, "bar2",
1052
+ Timestamp(1, 0));
1053
+ iter->SeekToFirst();
1054
+ CheckIterUserEntry(iter.get(), lo_bound, kTypeValue, "bar2",
1055
+ Timestamp(1, 0));
1056
+ iter->SeekForPrev("g");
1057
+ CheckIterUserEntry(iter.get(), "foo4", kTypeValue, "bar4", Timestamp(1, 0));
1058
+ iter->SeekToLast();
1059
+ CheckIterUserEntry(iter.get(), "foo4", kTypeValue, "bar4", Timestamp(1, 0));
1060
+ }
1061
+
1062
+ Close();
1063
+ }
1064
+
1065
+ TEST_F(DBBasicTestWithTimestamp, ChangeIterationDirection) {
1066
+ Options options = GetDefaultOptions();
1067
+ options.create_if_missing = true;
1068
+ options.env = env_;
1069
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1070
+ TestComparator test_cmp(kTimestampSize);
1071
+ options.comparator = &test_cmp;
1072
+ options.prefix_extractor.reset(NewFixedPrefixTransform(1));
1073
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1074
+ DestroyAndReopen(options);
1075
+ const std::vector<std::string> timestamps = {Timestamp(1, 1), Timestamp(0, 2),
1076
+ Timestamp(4, 3)};
1077
+ const std::vector<std::tuple<std::string, std::string>> kvs = {
1078
+ std::make_tuple("aa", "value1"), std::make_tuple("ab", "value2")};
1079
+ for (const auto& ts : timestamps) {
1080
+ WriteBatch wb(0, 0, 0, kTimestampSize);
1081
+ for (const auto& kv : kvs) {
1082
+ const std::string& key = std::get<0>(kv);
1083
+ const std::string& value = std::get<1>(kv);
1084
+ ASSERT_OK(wb.Put(key, value));
1085
+ }
1086
+
1087
+ ASSERT_OK(wb.UpdateTimestamps(
1088
+ ts, [kTimestampSize](uint32_t) { return kTimestampSize; }));
1089
+ ASSERT_OK(db_->Write(WriteOptions(), &wb));
525
1090
  }
1091
+ std::string read_ts_str = Timestamp(5, 3);
1092
+ Slice read_ts = read_ts_str;
1093
+ ReadOptions read_opts;
1094
+ read_opts.timestamp = &read_ts;
1095
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
526
1096
 
1097
+ it->SeekToFirst();
1098
+ ASSERT_TRUE(it->Valid());
1099
+ it->Prev();
1100
+ ASSERT_FALSE(it->Valid());
1101
+
1102
+ it->SeekToLast();
1103
+ ASSERT_TRUE(it->Valid());
1104
+ uint64_t prev_reseek_count =
1105
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION);
1106
+ ASSERT_EQ(0, prev_reseek_count);
1107
+ it->Next();
1108
+ ASSERT_FALSE(it->Valid());
1109
+ ASSERT_EQ(1 + prev_reseek_count,
1110
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
1111
+
1112
+ it->Seek(std::get<0>(kvs[0]));
1113
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[0]), kTypeValue,
1114
+ std::get<1>(kvs[0]), Timestamp(4, 3));
1115
+ it->Next();
1116
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[1]), kTypeValue,
1117
+ std::get<1>(kvs[1]), Timestamp(4, 3));
1118
+ it->Prev();
1119
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[0]), kTypeValue,
1120
+ std::get<1>(kvs[0]), Timestamp(4, 3));
1121
+
1122
+ prev_reseek_count =
1123
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION);
1124
+ ASSERT_EQ(1, prev_reseek_count);
1125
+ it->Next();
1126
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[1]), kTypeValue,
1127
+ std::get<1>(kvs[1]), Timestamp(4, 3));
1128
+ ASSERT_EQ(1 + prev_reseek_count,
1129
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
1130
+
1131
+ it->SeekForPrev(std::get<0>(kvs[1]));
1132
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[1]), kTypeValue,
1133
+ std::get<1>(kvs[1]), Timestamp(4, 3));
1134
+ it->Prev();
1135
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[0]), kTypeValue,
1136
+ std::get<1>(kvs[0]), Timestamp(4, 3));
1137
+
1138
+ prev_reseek_count =
1139
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION);
1140
+ it->Next();
1141
+ CheckIterUserEntry(it.get(), std::get<0>(kvs[1]), kTypeValue,
1142
+ std::get<1>(kvs[1]), Timestamp(4, 3));
1143
+ ASSERT_EQ(1 + prev_reseek_count,
1144
+ options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
1145
+
1146
+ it.reset();
527
1147
  Close();
528
1148
  }
529
1149
 
@@ -536,7 +1156,8 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
536
1156
  const size_t kTimestampSize = Timestamp(0, 0).size();
537
1157
  TestComparator test_cmp(kTimestampSize);
538
1158
  options.comparator = &test_cmp;
539
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
1159
+ options.memtable_factory.reset(
1160
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
540
1161
  DestroyAndReopen(options);
541
1162
  const std::vector<std::string> write_timestamps = {Timestamp(1, 0),
542
1163
  Timestamp(3, 0)};
@@ -546,10 +1167,9 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
546
1167
  Timestamp(1, 0)};
547
1168
  for (size_t i = 0; i < write_timestamps.size(); ++i) {
548
1169
  WriteOptions write_opts;
549
- Slice write_ts = write_timestamps[i];
550
- write_opts.timestamp = &write_ts;
551
1170
  for (uint64_t key = 0; key <= kMaxKey; ++key) {
552
- Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
1171
+ Status s = db_->Put(write_opts, Key1(key), write_timestamps[i],
1172
+ "value" + std::to_string(i));
553
1173
  ASSERT_OK(s);
554
1174
  }
555
1175
  }
@@ -579,10 +1199,8 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
579
1199
  {
580
1200
  std::string write_timestamp = Timestamp(5, 0);
581
1201
  WriteOptions write_opts;
582
- Slice write_ts = write_timestamp;
583
- write_opts.timestamp = &write_ts;
584
1202
  for (uint64_t key = 0; key < kMaxKey + 1; ++key) {
585
- Status s = db_->Delete(write_opts, Key1(key));
1203
+ Status s = db_->Delete(write_opts, Key1(key), write_timestamp);
586
1204
  ASSERT_OK(s);
587
1205
  }
588
1206
 
@@ -598,7 +1216,7 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
598
1216
  uint64_t key = 0;
599
1217
  for (it->Seek(Key1(0)), key = 0; it->Valid(); it->Next(), ++count, ++key) {
600
1218
  CheckIterEntry(it.get(), Key1(key), kTypeDeletionWithTimestamp, Slice(),
601
- write_ts);
1219
+ write_timestamp);
602
1220
  // Skip key@ts=3 and land on tombstone key@ts=5
603
1221
  it->Next();
604
1222
  }
@@ -607,93 +1225,6 @@ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
607
1225
  Close();
608
1226
  }
609
1227
 
610
- TEST_F(DBBasicTestWithTimestamp, ForwardIterateStartSeqnum) {
611
- const int kNumKeysPerFile = 128;
612
- const uint64_t kMaxKey = 0xffffffffffffffff;
613
- const uint64_t kMinKey = kMaxKey - 1023;
614
- Options options = CurrentOptions();
615
- options.env = env_;
616
- options.create_if_missing = true;
617
- // Need to disable compaction to bottommost level when sequence number will be
618
- // zeroed out, causing the verification of sequence number to fail in this
619
- // test.
620
- options.disable_auto_compactions = true;
621
- const size_t kTimestampSize = Timestamp(0, 0).size();
622
- TestComparator test_cmp(kTimestampSize);
623
- options.comparator = &test_cmp;
624
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
625
- DestroyAndReopen(options);
626
- std::vector<SequenceNumber> start_seqs;
627
-
628
- const int kNumTimestamps = 4;
629
- std::vector<std::string> write_ts_list;
630
- for (int t = 0; t != kNumTimestamps; ++t) {
631
- write_ts_list.push_back(Timestamp(2 * t, /*do not care*/ 17));
632
- }
633
- WriteOptions write_opts;
634
- for (size_t i = 0; i != write_ts_list.size(); ++i) {
635
- Slice write_ts = write_ts_list[i];
636
- write_opts.timestamp = &write_ts;
637
- for (uint64_t k = kMaxKey; k >= kMinKey; --k) {
638
- Status s;
639
- if (k % 2) {
640
- s = db_->Put(write_opts, Key1(k), "value" + std::to_string(i));
641
- } else {
642
- s = db_->Delete(write_opts, Key1(k));
643
- }
644
- ASSERT_OK(s);
645
- }
646
- start_seqs.push_back(db_->GetLatestSequenceNumber());
647
- }
648
- std::vector<std::string> read_ts_list;
649
- for (int t = 0; t != kNumTimestamps - 1; ++t) {
650
- read_ts_list.push_back(Timestamp(2 * t + 3, /*do not care*/ 17));
651
- }
652
-
653
- ReadOptions read_opts;
654
- // Scan with only read_opts.iter_start_seqnum set.
655
- for (size_t i = 0; i != read_ts_list.size(); ++i) {
656
- Slice read_ts = read_ts_list[i];
657
- read_opts.timestamp = &read_ts;
658
- read_opts.iter_start_seqnum = start_seqs[i] + 1;
659
- std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
660
- SequenceNumber expected_seq = start_seqs[i] + (kMaxKey - kMinKey) + 1;
661
- uint64_t key = kMinKey;
662
- for (iter->Seek(Key1(kMinKey)); iter->Valid(); iter->Next()) {
663
- CheckIterEntry(
664
- iter.get(), Key1(key), expected_seq,
665
- (key % 2) ? kTypeValue : kTypeDeletionWithTimestamp,
666
- (key % 2) ? "value" + std::to_string(i + 1) : std::string(),
667
- write_ts_list[i + 1]);
668
- ++key;
669
- --expected_seq;
670
- }
671
- }
672
- // Scan with both read_opts.iter_start_seqnum and read_opts.iter_start_ts set.
673
- std::vector<std::string> read_ts_lb_list;
674
- for (int t = 0; t < kNumTimestamps - 1; ++t) {
675
- read_ts_lb_list.push_back(Timestamp(2 * t, /*do not care*/ 17));
676
- }
677
- for (size_t i = 0; i < read_ts_list.size(); ++i) {
678
- Slice read_ts = read_ts_list[i];
679
- Slice read_ts_lb = read_ts_lb_list[i];
680
- read_opts.timestamp = &read_ts;
681
- read_opts.iter_start_ts = &read_ts_lb;
682
- read_opts.iter_start_seqnum = start_seqs[i] + 1;
683
- std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
684
- uint64_t key = kMinKey;
685
- SequenceNumber expected_seq = start_seqs[i] + (kMaxKey - kMinKey) + 1;
686
- for (it->Seek(Key1(kMinKey)); it->Valid(); it->Next()) {
687
- CheckIterEntry(it.get(), Key1(key), expected_seq,
688
- (key % 2) ? kTypeValue : kTypeDeletionWithTimestamp,
689
- "value" + std::to_string(i + 1), write_ts_list[i + 1]);
690
- ++key;
691
- --expected_seq;
692
- }
693
- }
694
- Close();
695
- }
696
-
697
1228
  TEST_F(DBBasicTestWithTimestamp, ReseekToTargetTimestamp) {
698
1229
  Options options = CurrentOptions();
699
1230
  options.env = env_;
@@ -709,10 +1240,8 @@ TEST_F(DBBasicTestWithTimestamp, ReseekToTargetTimestamp) {
709
1240
  WriteOptions write_opts;
710
1241
  Status s;
711
1242
  for (size_t i = 0; i != kNumKeys; ++i) {
712
- std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
713
- Slice ts = ts_str;
714
- write_opts.timestamp = &ts;
715
- s = db_->Put(write_opts, "foo", "value" + std::to_string(i));
1243
+ std::string ts = Timestamp(static_cast<uint64_t>(i + 1), 0);
1244
+ s = db_->Put(write_opts, "foo", ts, "value" + std::to_string(i));
716
1245
  ASSERT_OK(s);
717
1246
  }
718
1247
  {
@@ -725,6 +1254,16 @@ TEST_F(DBBasicTestWithTimestamp, ReseekToTargetTimestamp) {
725
1254
  CheckIterUserEntry(iter.get(), "foo", kTypeValue, "value0", ts_str);
726
1255
  ASSERT_EQ(
727
1256
  1, options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
1257
+
1258
+ ts_str = Timestamp(kNumKeys, 0);
1259
+ ts = ts_str;
1260
+ read_opts.timestamp = &ts;
1261
+ iter.reset(db_->NewIterator(read_opts));
1262
+ iter->SeekToLast();
1263
+ CheckIterUserEntry(iter.get(), "foo", kTypeValue,
1264
+ "value" + std::to_string(kNumKeys - 1), ts_str);
1265
+ ASSERT_EQ(
1266
+ 2, options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
728
1267
  }
729
1268
  Close();
730
1269
  }
@@ -744,18 +1283,17 @@ TEST_F(DBBasicTestWithTimestamp, ReseekToNextUserKey) {
744
1283
  WriteOptions write_opts;
745
1284
  Status s;
746
1285
  for (size_t i = 0; i != kNumKeys; ++i) {
747
- std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
748
- Slice ts = ts_str;
749
- write_opts.timestamp = &ts;
750
- s = db_->Put(write_opts, "a", "value" + std::to_string(i));
1286
+ std::string ts = Timestamp(static_cast<uint64_t>(i + 1), 0);
1287
+ s = db_->Put(write_opts, "a", ts, "value" + std::to_string(i));
751
1288
  ASSERT_OK(s);
752
1289
  }
753
1290
  {
754
1291
  std::string ts_str = Timestamp(static_cast<uint64_t>(kNumKeys + 1), 0);
755
- WriteBatch batch(0, 0, kTimestampSize);
756
- ASSERT_OK(batch.Put("a", "new_value"));
757
- ASSERT_OK(batch.Put("b", "new_value"));
758
- s = batch.AssignTimestamp(ts_str);
1292
+ WriteBatch batch(0, 0, 0, kTimestampSize);
1293
+ { ASSERT_OK(batch.Put("a", "new_value")); }
1294
+ { ASSERT_OK(batch.Put("b", "new_value")); }
1295
+ s = batch.UpdateTimestamps(
1296
+ ts_str, [kTimestampSize](uint32_t) { return kTimestampSize; });
759
1297
  ASSERT_OK(s);
760
1298
  s = db_->Write(write_opts, &batch);
761
1299
  ASSERT_OK(s);
@@ -775,6 +1313,43 @@ TEST_F(DBBasicTestWithTimestamp, ReseekToNextUserKey) {
775
1313
  Close();
776
1314
  }
777
1315
 
1316
+ TEST_F(DBBasicTestWithTimestamp, ReseekToUserKeyBeforeSavedKey) {
1317
+ Options options = GetDefaultOptions();
1318
+ options.env = env_;
1319
+ options.create_if_missing = true;
1320
+ constexpr size_t kNumKeys = 16;
1321
+ options.max_sequential_skip_in_iterations = kNumKeys / 2;
1322
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1323
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1324
+ TestComparator test_cmp(kTimestampSize);
1325
+ options.comparator = &test_cmp;
1326
+ DestroyAndReopen(options);
1327
+ for (size_t i = 0; i < kNumKeys; ++i) {
1328
+ std::string ts = Timestamp(static_cast<uint64_t>(i + 1), 0);
1329
+ WriteOptions write_opts;
1330
+ Status s = db_->Put(write_opts, "b", ts, "value" + std::to_string(i));
1331
+ ASSERT_OK(s);
1332
+ }
1333
+ {
1334
+ std::string ts = Timestamp(1, 0);
1335
+ WriteOptions write_opts;
1336
+ ASSERT_OK(db_->Put(write_opts, "a", ts, "value"));
1337
+ }
1338
+ {
1339
+ ReadOptions read_opts;
1340
+ std::string ts_str = Timestamp(1, 0);
1341
+ Slice ts = ts_str;
1342
+ read_opts.timestamp = &ts;
1343
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
1344
+ iter->SeekToLast();
1345
+ iter->Prev();
1346
+ CheckIterUserEntry(iter.get(), "a", kTypeValue, "value", ts_str);
1347
+ ASSERT_EQ(
1348
+ 1, options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
1349
+ }
1350
+ Close();
1351
+ }
1352
+
778
1353
  TEST_F(DBBasicTestWithTimestamp, MultiGetWithFastLocalBloom) {
779
1354
  Options options = CurrentOptions();
780
1355
  options.env = env_;
@@ -791,17 +1366,16 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithFastLocalBloom) {
791
1366
 
792
1367
  // Write any value
793
1368
  WriteOptions write_opts;
794
- std::string ts_str = Timestamp(1, 0);
795
- Slice ts = ts_str;
796
- write_opts.timestamp = &ts;
1369
+ std::string ts = Timestamp(1, 0);
797
1370
 
798
- ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
1371
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "bar"));
799
1372
 
800
1373
  ASSERT_OK(Flush());
801
1374
 
802
1375
  // Read with MultiGet
803
1376
  ReadOptions read_opts;
804
- read_opts.timestamp = &ts;
1377
+ Slice read_ts = ts;
1378
+ read_opts.timestamp = &read_ts;
805
1379
  size_t batch_size = 1;
806
1380
  std::vector<Slice> keys(batch_size);
807
1381
  std::vector<PinnableSlice> values(batch_size);
@@ -815,7 +1389,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithFastLocalBloom) {
815
1389
  Close();
816
1390
  }
817
1391
 
818
- TEST_F(DBBasicTestWithTimestamp, MultiGetWithPrefix) {
1392
+ TEST_P(DBBasicTestWithTimestampTableOptions, MultiGetWithPrefix) {
819
1393
  Options options = CurrentOptions();
820
1394
  options.env = env_;
821
1395
  options.create_if_missing = true;
@@ -824,6 +1398,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithPrefix) {
824
1398
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
825
1399
  bbto.cache_index_and_filter_blocks = true;
826
1400
  bbto.whole_key_filtering = false;
1401
+ bbto.index_type = GetParam();
827
1402
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
828
1403
  const size_t kTimestampSize = Timestamp(0, 0).size();
829
1404
  TestComparator test_cmp(kTimestampSize);
@@ -832,17 +1407,16 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithPrefix) {
832
1407
 
833
1408
  // Write any value
834
1409
  WriteOptions write_opts;
835
- std::string ts_str = Timestamp(1, 0);
836
- Slice ts = ts_str;
837
- write_opts.timestamp = &ts;
1410
+ std::string ts = Timestamp(1, 0);
838
1411
 
839
- ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
1412
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "bar"));
840
1413
 
841
1414
  ASSERT_OK(Flush());
842
1415
 
843
1416
  // Read with MultiGet
844
1417
  ReadOptions read_opts;
845
- read_opts.timestamp = &ts;
1418
+ Slice read_ts = ts;
1419
+ read_opts.timestamp = &read_ts;
846
1420
  size_t batch_size = 1;
847
1421
  std::vector<Slice> keys(batch_size);
848
1422
  std::vector<PinnableSlice> values(batch_size);
@@ -856,7 +1430,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithPrefix) {
856
1430
  Close();
857
1431
  }
858
1432
 
859
- TEST_F(DBBasicTestWithTimestamp, MultiGetWithMemBloomFilter) {
1433
+ TEST_P(DBBasicTestWithTimestampTableOptions, MultiGetWithMemBloomFilter) {
860
1434
  Options options = CurrentOptions();
861
1435
  options.env = env_;
862
1436
  options.create_if_missing = true;
@@ -865,6 +1439,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithMemBloomFilter) {
865
1439
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
866
1440
  bbto.cache_index_and_filter_blocks = true;
867
1441
  bbto.whole_key_filtering = false;
1442
+ bbto.index_type = GetParam();
868
1443
  options.memtable_prefix_bloom_size_ratio = 0.1;
869
1444
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
870
1445
  const size_t kTimestampSize = Timestamp(0, 0).size();
@@ -874,17 +1449,15 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetWithMemBloomFilter) {
874
1449
 
875
1450
  // Write any value
876
1451
  WriteOptions write_opts;
877
- std::string ts_str = Timestamp(1, 0);
878
- Slice ts = ts_str;
879
- write_opts.timestamp = &ts;
1452
+ std::string ts = Timestamp(1, 0);
880
1453
 
881
- ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
1454
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "bar"));
882
1455
 
883
1456
  // Read with MultiGet
884
- ts_str = Timestamp(2, 0);
885
- ts = ts_str;
1457
+ ts = Timestamp(2, 0);
1458
+ Slice read_ts = ts;
886
1459
  ReadOptions read_opts;
887
- read_opts.timestamp = &ts;
1460
+ read_opts.timestamp = &read_ts;
888
1461
  size_t batch_size = 1;
889
1462
  std::vector<Slice> keys(batch_size);
890
1463
  std::vector<PinnableSlice> values(batch_size);
@@ -915,9 +1488,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetRangeFiltering) {
915
1488
 
916
1489
  // Write any value
917
1490
  WriteOptions write_opts;
918
- std::string ts_str = Timestamp(1, 0);
919
- Slice ts = ts_str;
920
- write_opts.timestamp = &ts;
1491
+ std::string ts = Timestamp(1, 0);
921
1492
 
922
1493
  // random data
923
1494
  for (int i = 0; i < 3; i++) {
@@ -925,22 +1496,22 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetRangeFiltering) {
925
1496
  auto value = ToString(i * 10);
926
1497
  Slice key_slice = key;
927
1498
  Slice value_slice = value;
928
- ASSERT_OK(db_->Put(write_opts, key_slice, value_slice));
1499
+ ASSERT_OK(db_->Put(write_opts, key_slice, ts, value_slice));
929
1500
  ASSERT_OK(Flush());
930
1501
  }
931
1502
 
932
1503
  // Make num_levels to 2 to do key range filtering of sst files
933
1504
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
934
1505
 
935
- ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
1506
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "bar"));
936
1507
 
937
1508
  ASSERT_OK(Flush());
938
1509
 
939
1510
  // Read with MultiGet
940
- ts_str = Timestamp(2, 0);
941
- ts = ts_str;
1511
+ ts = Timestamp(2, 0);
1512
+ Slice read_ts = ts;
942
1513
  ReadOptions read_opts;
943
- read_opts.timestamp = &ts;
1514
+ read_opts.timestamp = &read_ts;
944
1515
  size_t batch_size = 1;
945
1516
  std::vector<Slice> keys(batch_size);
946
1517
  std::vector<PinnableSlice> values(batch_size);
@@ -954,15 +1525,16 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetRangeFiltering) {
954
1525
  Close();
955
1526
  }
956
1527
 
957
- TEST_F(DBBasicTestWithTimestamp, MultiGetPrefixFilter) {
1528
+ TEST_P(DBBasicTestWithTimestampTableOptions, MultiGetPrefixFilter) {
958
1529
  Options options = CurrentOptions();
959
1530
  options.env = env_;
960
1531
  options.create_if_missing = true;
961
- options.prefix_extractor.reset(NewCappedPrefixTransform(5));
1532
+ options.prefix_extractor.reset(NewCappedPrefixTransform(3));
962
1533
  BlockBasedTableOptions bbto;
963
1534
  bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
964
1535
  bbto.cache_index_and_filter_blocks = true;
965
1536
  bbto.whole_key_filtering = false;
1537
+ bbto.index_type = GetParam();
966
1538
  options.memtable_prefix_bloom_size_ratio = 0.1;
967
1539
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
968
1540
  const size_t kTimestampSize = Timestamp(0, 0).size();
@@ -971,18 +1543,16 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetPrefixFilter) {
971
1543
  DestroyAndReopen(options);
972
1544
 
973
1545
  WriteOptions write_opts;
974
- std::string ts_str = Timestamp(1, 0);
975
- Slice ts = ts_str;
976
- write_opts.timestamp = &ts;
1546
+ std::string ts = Timestamp(1, 0);
977
1547
 
978
- ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
1548
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "bar"));
979
1549
 
980
1550
  ASSERT_OK(Flush());
981
1551
  // Read with MultiGet
982
- ts_str = Timestamp(2, 0);
983
- ts = ts_str;
1552
+ ts = Timestamp(2, 0);
1553
+ Slice read_ts = ts;
984
1554
  ReadOptions read_opts;
985
- read_opts.timestamp = &ts;
1555
+ read_opts.timestamp = &read_ts;
986
1556
  size_t batch_size = 1;
987
1557
  std::vector<Slice> keys(batch_size);
988
1558
  std::vector<std::string> values(batch_size);
@@ -997,7 +1567,7 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetPrefixFilter) {
997
1567
  Close();
998
1568
  }
999
1569
 
1000
- TEST_F(DBBasicTestWithTimestamp, MaxKeysSkipped) {
1570
+ TEST_F(DBBasicTestWithTimestamp, MaxKeysSkippedDuringNext) {
1001
1571
  Options options = CurrentOptions();
1002
1572
  options.env = env_;
1003
1573
  options.create_if_missing = true;
@@ -1010,16 +1580,12 @@ TEST_F(DBBasicTestWithTimestamp, MaxKeysSkipped) {
1010
1580
  WriteOptions write_opts;
1011
1581
  Status s;
1012
1582
  {
1013
- std::string ts_str = Timestamp(1, 0);
1014
- Slice ts = ts_str;
1015
- write_opts.timestamp = &ts;
1016
- ASSERT_OK(db_->Put(write_opts, "a", "value"));
1583
+ std::string ts = Timestamp(1, 0);
1584
+ ASSERT_OK(db_->Put(write_opts, "a", ts, "value"));
1017
1585
  }
1018
1586
  for (size_t i = 0; i < kNumKeys; ++i) {
1019
- std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
1020
- Slice ts = ts_str;
1021
- write_opts.timestamp = &ts;
1022
- s = db_->Put(write_opts, "b", "value" + std::to_string(i));
1587
+ std::string ts = Timestamp(static_cast<uint64_t>(i + 1), 0);
1588
+ s = db_->Put(write_opts, "b", ts, "value" + std::to_string(i));
1023
1589
  ASSERT_OK(s);
1024
1590
  }
1025
1591
  {
@@ -1036,6 +1602,41 @@ TEST_F(DBBasicTestWithTimestamp, MaxKeysSkipped) {
1036
1602
  Close();
1037
1603
  }
1038
1604
 
1605
+ TEST_F(DBBasicTestWithTimestamp, MaxKeysSkippedDuringPrev) {
1606
+ Options options = GetDefaultOptions();
1607
+ options.env = env_;
1608
+ options.create_if_missing = true;
1609
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1610
+ TestComparator test_cmp(kTimestampSize);
1611
+ options.comparator = &test_cmp;
1612
+ DestroyAndReopen(options);
1613
+ constexpr size_t max_skippable_internal_keys = 2;
1614
+ const size_t kNumKeys = max_skippable_internal_keys + 2;
1615
+ WriteOptions write_opts;
1616
+ Status s;
1617
+ {
1618
+ std::string ts = Timestamp(1, 0);
1619
+ ASSERT_OK(db_->Put(write_opts, "b", ts, "value"));
1620
+ }
1621
+ for (size_t i = 0; i < kNumKeys; ++i) {
1622
+ std::string ts = Timestamp(static_cast<uint64_t>(i + 1), 0);
1623
+ s = db_->Put(write_opts, "a", ts, "value" + std::to_string(i));
1624
+ ASSERT_OK(s);
1625
+ }
1626
+ {
1627
+ ReadOptions read_opts;
1628
+ read_opts.max_skippable_internal_keys = max_skippable_internal_keys;
1629
+ std::string ts_str = Timestamp(1, 0);
1630
+ Slice ts = ts_str;
1631
+ read_opts.timestamp = &ts;
1632
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
1633
+ iter->SeekToLast();
1634
+ iter->Prev();
1635
+ ASSERT_TRUE(iter->status().IsIncomplete());
1636
+ }
1637
+ Close();
1638
+ }
1639
+
1039
1640
  // Create two L0, and compact them to a new L1. In this test, L1 is L_bottom.
1040
1641
  // Two L0s:
1041
1642
  // f1 f2
@@ -1053,53 +1654,49 @@ TEST_F(DBBasicTestWithTimestamp, CompactDeletionWithTimestampMarkerToBottom) {
1053
1654
  options.level0_file_num_compaction_trigger = 2;
1054
1655
  DestroyAndReopen(options);
1055
1656
  WriteOptions write_opts;
1056
- std::string ts_str = Timestamp(1, 0);
1057
- Slice ts = ts_str;
1058
- write_opts.timestamp = &ts;
1059
- ASSERT_OK(db_->Put(write_opts, "a", "value0"));
1657
+ std::string ts = Timestamp(1, 0);
1658
+ ASSERT_OK(db_->Put(write_opts, "a", ts, "value0"));
1060
1659
  ASSERT_OK(Flush());
1061
1660
 
1062
- ts_str = Timestamp(2, 0);
1063
- ts = ts_str;
1064
- write_opts.timestamp = &ts;
1065
- ASSERT_OK(db_->Put(write_opts, "b", "value0"));
1066
- ts_str = Timestamp(3, 0);
1067
- ts = ts_str;
1068
- write_opts.timestamp = &ts;
1069
- ASSERT_OK(db_->Delete(write_opts, "a"));
1661
+ ts = Timestamp(2, 0);
1662
+ ASSERT_OK(db_->Put(write_opts, "b", ts, "value0"));
1663
+ ts = Timestamp(3, 0);
1664
+ ASSERT_OK(db_->Delete(write_opts, "a", ts));
1070
1665
  ASSERT_OK(Flush());
1071
1666
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
1072
1667
 
1073
1668
  ReadOptions read_opts;
1074
- ts_str = Timestamp(1, 0);
1075
- ts = ts_str;
1076
- read_opts.timestamp = &ts;
1669
+ ts = Timestamp(1, 0);
1670
+ Slice read_ts = ts;
1671
+ read_opts.timestamp = &read_ts;
1077
1672
  std::string value;
1078
1673
  Status s = db_->Get(read_opts, "a", &value);
1079
1674
  ASSERT_OK(s);
1080
1675
  ASSERT_EQ("value0", value);
1081
1676
 
1082
- ts_str = Timestamp(3, 0);
1083
- ts = ts_str;
1084
- read_opts.timestamp = &ts;
1677
+ ts = Timestamp(3, 0);
1678
+ read_ts = ts;
1679
+ read_opts.timestamp = &read_ts;
1085
1680
  s = db_->Get(read_opts, "a", &value);
1086
1681
  ASSERT_TRUE(s.IsNotFound());
1087
1682
 
1088
1683
  // Time-travel to the past before deletion
1089
- ts_str = Timestamp(2, 0);
1090
- ts = ts_str;
1091
- read_opts.timestamp = &ts;
1684
+ ts = Timestamp(2, 0);
1685
+ read_ts = ts;
1686
+ read_opts.timestamp = &read_ts;
1092
1687
  s = db_->Get(read_opts, "a", &value);
1093
1688
  ASSERT_OK(s);
1094
1689
  ASSERT_EQ("value0", value);
1095
1690
  Close();
1096
1691
  }
1097
1692
 
1693
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1098
1694
  class DBBasicTestWithTimestampFilterPrefixSettings
1099
1695
  : public DBBasicTestWithTimestampBase,
1100
1696
  public testing::WithParamInterface<
1101
1697
  std::tuple<std::shared_ptr<const FilterPolicy>, bool, bool,
1102
- std::shared_ptr<const SliceTransform>, bool, double>> {
1698
+ std::shared_ptr<const SliceTransform>, bool, double,
1699
+ BlockBasedTableOptions::IndexType>> {
1103
1700
  public:
1104
1701
  DBBasicTestWithTimestampFilterPrefixSettings()
1105
1702
  : DBBasicTestWithTimestampBase(
@@ -1114,6 +1711,7 @@ TEST_P(DBBasicTestWithTimestampFilterPrefixSettings, GetAndMultiGet) {
1114
1711
  bbto.filter_policy = std::get<0>(GetParam());
1115
1712
  bbto.whole_key_filtering = std::get<1>(GetParam());
1116
1713
  bbto.cache_index_and_filter_blocks = std::get<2>(GetParam());
1714
+ bbto.index_type = std::get<6>(GetParam());
1117
1715
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1118
1716
  options.prefix_extractor = std::get<3>(GetParam());
1119
1717
  options.memtable_whole_key_filtering = std::get<4>(GetParam());
@@ -1127,38 +1725,33 @@ TEST_P(DBBasicTestWithTimestampFilterPrefixSettings, GetAndMultiGet) {
1127
1725
 
1128
1726
  // Write any value
1129
1727
  WriteOptions write_opts;
1130
- std::string ts_str = Timestamp(1, 0);
1131
- Slice ts = ts_str;
1132
- write_opts.timestamp = &ts;
1728
+ std::string ts = Timestamp(1, 0);
1133
1729
 
1134
1730
  int idx = 0;
1135
1731
  for (; idx < kMaxKey / 4; idx++) {
1136
- ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1137
- ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1732
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), ts, "bar"));
1733
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), ts, "bar"));
1138
1734
  }
1139
1735
 
1140
1736
  ASSERT_OK(Flush());
1141
1737
  ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1142
1738
 
1143
1739
  for (; idx < kMaxKey / 2; idx++) {
1144
- ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1145
- ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1740
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), ts, "bar"));
1741
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), ts, "bar"));
1146
1742
  }
1147
1743
 
1148
1744
  ASSERT_OK(Flush());
1149
1745
 
1150
1746
  for (; idx < kMaxKey; idx++) {
1151
- ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1152
- ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1747
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), ts, "bar"));
1748
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), ts, "bar"));
1153
1749
  }
1154
1750
 
1155
1751
  // Read with MultiGet
1156
1752
  ReadOptions read_opts;
1157
- read_opts.timestamp = &ts;
1158
-
1159
- ReadOptions read_opts_total_order;
1160
- read_opts_total_order.timestamp = &ts;
1161
- read_opts_total_order.total_order_seek = true;
1753
+ Slice read_ts = ts;
1754
+ read_opts.timestamp = &read_ts;
1162
1755
 
1163
1756
  for (idx = 0; idx < kMaxKey; idx++) {
1164
1757
  size_t batch_size = 4;
@@ -1218,7 +1811,13 @@ INSTANTIATE_TEST_CASE_P(
1218
1811
  std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(4)),
1219
1812
  std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(7)),
1220
1813
  std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(8))),
1221
- ::testing::Bool(), ::testing::Values(0, 0.1)));
1814
+ ::testing::Bool(), ::testing::Values(0, 0.1),
1815
+ ::testing::Values(
1816
+ BlockBasedTableOptions::IndexType::kBinarySearch,
1817
+ BlockBasedTableOptions::IndexType::kHashSearch,
1818
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch,
1819
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey)));
1820
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1222
1821
 
1223
1822
  class DataVisibilityTest : public DBBasicTestWithTimestampBase {
1224
1823
  public:
@@ -1248,12 +1847,10 @@ class DataVisibilityTest : public DBBasicTestWithTimestampBase {
1248
1847
  void PutTestData(int index, ColumnFamilyHandle* cfh = nullptr) {
1249
1848
  ASSERT_LE(index, kTestDataSize);
1250
1849
  WriteOptions write_opts;
1251
- Slice ts_slice = test_data_[index].timestamp;
1252
- write_opts.timestamp = &ts_slice;
1253
1850
 
1254
1851
  if (cfh == nullptr) {
1255
- ASSERT_OK(
1256
- db_->Put(write_opts, test_data_[index].key, test_data_[index].value));
1852
+ ASSERT_OK(db_->Put(write_opts, test_data_[index].key,
1853
+ test_data_[index].timestamp, test_data_[index].value));
1257
1854
  const Snapshot* snap = db_->GetSnapshot();
1258
1855
  test_data_[index].seq_num = snap->GetSequenceNumber();
1259
1856
  if (index > 0) {
@@ -1262,7 +1859,7 @@ class DataVisibilityTest : public DBBasicTestWithTimestampBase {
1262
1859
  db_->ReleaseSnapshot(snap);
1263
1860
  } else {
1264
1861
  ASSERT_OK(db_->Put(write_opts, cfh, test_data_[index].key,
1265
- test_data_[index].value));
1862
+ test_data_[index].timestamp, test_data_[index].value));
1266
1863
  }
1267
1864
  }
1268
1865
 
@@ -1374,13 +1971,11 @@ TEST_F(DataVisibilityTest, PointLookupWithoutSnapshot1) {
1374
1971
  });
1375
1972
  SyncPoint::GetInstance()->EnableProcessing();
1376
1973
  port::Thread writer_thread([this]() {
1377
- std::string write_ts_str = Timestamp(1, 0);
1378
- Slice write_ts = write_ts_str;
1974
+ std::string write_ts = Timestamp(1, 0);
1379
1975
  WriteOptions write_opts;
1380
- write_opts.timestamp = &write_ts;
1381
1976
  TEST_SYNC_POINT(
1382
1977
  "DataVisibilityTest::PointLookupWithoutSnapshot1:BeforePut");
1383
- Status s = db_->Put(write_opts, "foo", "value");
1978
+ Status s = db_->Put(write_opts, "foo", write_ts, "value");
1384
1979
  ASSERT_OK(s);
1385
1980
  TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithoutSnapshot1:AfterPut");
1386
1981
  });
@@ -1422,20 +2017,16 @@ TEST_F(DataVisibilityTest, PointLookupWithoutSnapshot2) {
1422
2017
  });
1423
2018
  SyncPoint::GetInstance()->EnableProcessing();
1424
2019
  port::Thread writer_thread([this]() {
1425
- std::string write_ts_str = Timestamp(1, 0);
1426
- Slice write_ts = write_ts_str;
2020
+ std::string write_ts = Timestamp(1, 0);
1427
2021
  WriteOptions write_opts;
1428
- write_opts.timestamp = &write_ts;
1429
2022
  TEST_SYNC_POINT(
1430
2023
  "DataVisibilityTest::PointLookupWithoutSnapshot2:BeforePut");
1431
- Status s = db_->Put(write_opts, "foo", "value");
2024
+ Status s = db_->Put(write_opts, "foo", write_ts, "value");
1432
2025
  ASSERT_OK(s);
1433
2026
  ASSERT_OK(Flush());
1434
2027
 
1435
- write_ts_str = Timestamp(2, 0);
1436
- write_ts = write_ts_str;
1437
- write_opts.timestamp = &write_ts;
1438
- s = db_->Put(write_opts, "bar", "value");
2028
+ write_ts = Timestamp(2, 0);
2029
+ s = db_->Put(write_opts, "bar", write_ts, "value");
1439
2030
  ASSERT_OK(s);
1440
2031
  TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithoutSnapshot2:AfterPut");
1441
2032
  });
@@ -1476,12 +2067,10 @@ TEST_F(DataVisibilityTest, PointLookupWithSnapshot1) {
1476
2067
  });
1477
2068
  SyncPoint::GetInstance()->EnableProcessing();
1478
2069
  port::Thread writer_thread([this]() {
1479
- std::string write_ts_str = Timestamp(1, 0);
1480
- Slice write_ts = write_ts_str;
2070
+ std::string write_ts = Timestamp(1, 0);
1481
2071
  WriteOptions write_opts;
1482
- write_opts.timestamp = &write_ts;
1483
2072
  TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot1:BeforePut");
1484
- Status s = db_->Put(write_opts, "foo", "value");
2073
+ Status s = db_->Put(write_opts, "foo", write_ts, "value");
1485
2074
  TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot1:AfterPut");
1486
2075
  ASSERT_OK(s);
1487
2076
  });
@@ -1528,19 +2117,15 @@ TEST_F(DataVisibilityTest, PointLookupWithSnapshot2) {
1528
2117
  });
1529
2118
  SyncPoint::GetInstance()->EnableProcessing();
1530
2119
  port::Thread writer_thread([this]() {
1531
- std::string write_ts_str = Timestamp(1, 0);
1532
- Slice write_ts = write_ts_str;
2120
+ std::string write_ts = Timestamp(1, 0);
1533
2121
  WriteOptions write_opts;
1534
- write_opts.timestamp = &write_ts;
1535
2122
  TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot2:BeforePut");
1536
- Status s = db_->Put(write_opts, "foo", "value1");
2123
+ Status s = db_->Put(write_opts, "foo", write_ts, "value1");
1537
2124
  ASSERT_OK(s);
1538
2125
  ASSERT_OK(Flush());
1539
2126
 
1540
- write_ts_str = Timestamp(2, 0);
1541
- write_ts = write_ts_str;
1542
- write_opts.timestamp = &write_ts;
1543
- s = db_->Put(write_opts, "bar", "value2");
2127
+ write_ts = Timestamp(2, 0);
2128
+ s = db_->Put(write_opts, "bar", write_ts, "value2");
1544
2129
  ASSERT_OK(s);
1545
2130
  });
1546
2131
  const Snapshot* snap = db_->GetSnapshot();
@@ -1585,10 +2170,8 @@ TEST_F(DataVisibilityTest, RangeScanWithoutSnapshot) {
1585
2170
  WriteOptions write_opts;
1586
2171
  TEST_SYNC_POINT("DataVisibilityTest::RangeScanWithoutSnapshot:BeforePut");
1587
2172
  for (int i = 0; i < 3; ++i) {
1588
- std::string write_ts_str = Timestamp(i + 1, 0);
1589
- Slice write_ts = write_ts_str;
1590
- write_opts.timestamp = &write_ts;
1591
- Status s = db_->Put(write_opts, "key" + std::to_string(i),
2173
+ std::string write_ts = Timestamp(i + 1, 0);
2174
+ Status s = db_->Put(write_opts, "key" + std::to_string(i), write_ts,
1592
2175
  "value" + std::to_string(i));
1593
2176
  ASSERT_OK(s);
1594
2177
  }
@@ -1632,10 +2215,8 @@ TEST_F(DataVisibilityTest, RangeScanWithSnapshot) {
1632
2215
  WriteOptions write_opts;
1633
2216
  TEST_SYNC_POINT("DataVisibilityTest::RangeScanWithSnapshot:BeforePut");
1634
2217
  for (int i = 0; i < 3; ++i) {
1635
- std::string write_ts_str = Timestamp(i + 1, 0);
1636
- Slice write_ts = write_ts_str;
1637
- write_opts.timestamp = &write_ts;
1638
- Status s = db_->Put(write_opts, "key" + std::to_string(i),
2218
+ std::string write_ts = Timestamp(i + 1, 0);
2219
+ Status s = db_->Put(write_opts, "key" + std::to_string(i), write_ts,
1639
2220
  "value" + std::to_string(i));
1640
2221
  ASSERT_OK(s);
1641
2222
  }
@@ -1809,6 +2390,7 @@ TEST_F(DataVisibilityTest, MultiGetCrossCF) {
1809
2390
  Close();
1810
2391
  }
1811
2392
 
2393
+ #if !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
1812
2394
  class DBBasicTestWithTimestampCompressionSettings
1813
2395
  : public DBBasicTestWithTimestampBase,
1814
2396
  public testing::WithParamInterface<
@@ -1826,7 +2408,8 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGet) {
1826
2408
  Options options = CurrentOptions();
1827
2409
  options.create_if_missing = true;
1828
2410
  options.env = env_;
1829
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2411
+ options.memtable_factory.reset(
2412
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
1830
2413
  size_t ts_sz = Timestamp(0, 0).size();
1831
2414
  TestComparator test_cmp(ts_sz);
1832
2415
  options.comparator = &test_cmp;
@@ -1867,12 +2450,11 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGet) {
1867
2450
  read_ts_list.push_back(Timestamp(1 + i * 2, 0));
1868
2451
  const Slice write_ts = write_ts_list.back();
1869
2452
  WriteOptions wopts;
1870
- wopts.timestamp = &write_ts;
1871
2453
  for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
1872
2454
  for (size_t j = 0; j != (kNumKeysPerFile - 1) / kNumTimestamps; ++j) {
1873
- ASSERT_OK(Put(cf, Key1(j),
1874
- "value_" + std::to_string(j) + "_" + std::to_string(i),
1875
- wopts));
2455
+ ASSERT_OK(
2456
+ db_->Put(wopts, handles_[cf], Key1(j), write_ts,
2457
+ "value_" + std::to_string(j) + "_" + std::to_string(i)));
1876
2458
  }
1877
2459
  }
1878
2460
  }
@@ -1904,7 +2486,8 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutDeleteGet) {
1904
2486
  TestComparator test_cmp(kTimestampSize);
1905
2487
  options.comparator = &test_cmp;
1906
2488
  const int kNumKeysPerFile = 1024;
1907
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2489
+ options.memtable_factory.reset(
2490
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
1908
2491
  BlockBasedTableOptions bbto;
1909
2492
  bbto.filter_policy = std::get<0>(GetParam());
1910
2493
  bbto.whole_key_filtering = true;
@@ -1936,43 +2519,47 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutDeleteGet) {
1936
2519
  const size_t kNumL0Files =
1937
2520
  static_cast<size_t>(Options().level0_file_num_compaction_trigger);
1938
2521
  {
1939
- // Generate enough L0 files with ts=1 to trigger compaction to L1
1940
- std::string ts_str = Timestamp(1, 0);
1941
- Slice ts = ts_str;
2522
+ // Half of the keys will go through Deletion and remaining half with
2523
+ // SingleDeletion. Generate enough L0 files with ts=1 to trigger compaction
2524
+ // to L1
2525
+ std::string ts = Timestamp(1, 0);
1942
2526
  WriteOptions wopts;
1943
- wopts.timestamp = &ts;
1944
- for (size_t i = 0; i != kNumL0Files; ++i) {
1945
- for (int j = 0; j != kNumKeysPerFile; ++j) {
1946
- ASSERT_OK(db_->Put(wopts, Key1(j), "value" + std::to_string(i)));
2527
+ for (size_t i = 0; i < kNumL0Files; ++i) {
2528
+ for (int j = 0; j < kNumKeysPerFile; ++j) {
2529
+ ASSERT_OK(db_->Put(wopts, Key1(j), ts, "value" + std::to_string(i)));
1947
2530
  }
1948
2531
  ASSERT_OK(db_->Flush(FlushOptions()));
1949
2532
  }
1950
2533
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
1951
2534
  // Generate another L0 at ts=3
1952
- ts_str = Timestamp(3, 0);
1953
- ts = ts_str;
1954
- wopts.timestamp = &ts;
1955
- for (int i = 0; i != kNumKeysPerFile; ++i) {
2535
+ ts = Timestamp(3, 0);
2536
+ for (int i = 0; i < kNumKeysPerFile; ++i) {
1956
2537
  std::string key_str = Key1(i);
1957
2538
  Slice key(key_str);
1958
2539
  if ((i % 3) == 0) {
1959
- ASSERT_OK(db_->Delete(wopts, key));
2540
+ if (i < kNumKeysPerFile / 2) {
2541
+ ASSERT_OK(db_->Delete(wopts, key, ts));
2542
+ } else {
2543
+ ASSERT_OK(db_->SingleDelete(wopts, key, ts));
2544
+ }
1960
2545
  } else {
1961
- ASSERT_OK(db_->Put(wopts, key, "new_value"));
2546
+ ASSERT_OK(db_->Put(wopts, key, ts, "new_value"));
1962
2547
  }
1963
2548
  }
1964
2549
  ASSERT_OK(db_->Flush(FlushOptions()));
1965
2550
  // Populate memtable at ts=5
1966
- ts_str = Timestamp(5, 0);
1967
- ts = ts_str;
1968
- wopts.timestamp = &ts;
2551
+ ts = Timestamp(5, 0);
1969
2552
  for (int i = 0; i != kNumKeysPerFile; ++i) {
1970
2553
  std::string key_str = Key1(i);
1971
2554
  Slice key(key_str);
1972
2555
  if ((i % 3) == 1) {
1973
- ASSERT_OK(db_->Delete(wopts, key));
2556
+ if (i < kNumKeysPerFile / 2) {
2557
+ ASSERT_OK(db_->Delete(wopts, key, ts));
2558
+ } else {
2559
+ ASSERT_OK(db_->SingleDelete(wopts, key, ts));
2560
+ }
1974
2561
  } else if ((i % 3) == 2) {
1975
- ASSERT_OK(db_->Put(wopts, key, "new_value_2"));
2562
+ ASSERT_OK(db_->Put(wopts, key, ts, "new_value_2"));
1976
2563
  }
1977
2564
  }
1978
2565
  }
@@ -2033,7 +2620,8 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGetWithCompaction) {
2033
2620
  Options options = CurrentOptions();
2034
2621
  options.create_if_missing = true;
2035
2622
  options.env = env_;
2036
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2623
+ options.memtable_factory.reset(
2624
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
2037
2625
 
2038
2626
  FlushedFileCollector* collector = new FlushedFileCollector();
2039
2627
  options.listeners.emplace_back(collector);
@@ -2096,13 +2684,12 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGetWithCompaction) {
2096
2684
  read_ts_list.push_back(Timestamp(1 + i * 2, 0));
2097
2685
  const Slice write_ts = write_ts_list.back();
2098
2686
  WriteOptions wopts;
2099
- wopts.timestamp = &write_ts;
2100
2687
  for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2101
2688
  size_t memtable_get_start = 0;
2102
2689
  for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2103
- ASSERT_OK(Put(cf, Key1(j),
2104
- "value_" + std::to_string(j) + "_" + std::to_string(i),
2105
- wopts));
2690
+ ASSERT_OK(
2691
+ db_->Put(wopts, handles_[cf], Key1(j), write_ts,
2692
+ "value_" + std::to_string(j) + "_" + std::to_string(i)));
2106
2693
  if (j == kSplitPosBase + i || j == kNumKeysPerTimestamp - 1) {
2107
2694
  verify_records_func(i, memtable_get_start, j, handles_[cf]);
2108
2695
  memtable_get_start = j + 1;
@@ -2111,6 +2698,8 @@ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGetWithCompaction) {
2111
2698
  // incremental positions such that lowerlevel[1].smallest.userkey ==
2112
2699
  // higherlevel[0].largest.userkey
2113
2700
  ASSERT_OK(Flush(cf));
2701
+ ASSERT_OK(dbfull()->TEST_WaitForCompact()); // wait for flush (which
2702
+ // is also a compaction)
2114
2703
 
2115
2704
  // compact files (2 at each level) to a lower level such that all
2116
2705
  // keys with the same timestamp is at one level, with newer versions
@@ -2149,7 +2738,8 @@ TEST_F(DBBasicTestWithTimestamp, BatchWriteAndMultiGet) {
2149
2738
  Options options = CurrentOptions();
2150
2739
  options.create_if_missing = true;
2151
2740
  options.env = env_;
2152
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2741
+ options.memtable_factory.reset(
2742
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
2153
2743
  options.memtable_prefix_bloom_size_ratio = 0.1;
2154
2744
  options.memtable_whole_key_filtering = true;
2155
2745
 
@@ -2198,19 +2788,22 @@ TEST_F(DBBasicTestWithTimestamp, BatchWriteAndMultiGet) {
2198
2788
  }
2199
2789
  };
2200
2790
 
2791
+ const std::string dummy_ts(ts_sz, '\0');
2201
2792
  for (size_t i = 0; i != kNumTimestamps; ++i) {
2202
2793
  write_ts_list.push_back(Timestamp(i * 2, 0));
2203
2794
  read_ts_list.push_back(Timestamp(1 + i * 2, 0));
2204
2795
  const Slice& write_ts = write_ts_list.back();
2205
2796
  for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2206
2797
  WriteOptions wopts;
2207
- WriteBatch batch(0, 0, ts_sz);
2798
+ WriteBatch batch(0, 0, 0, ts_sz);
2208
2799
  for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2209
- ASSERT_OK(
2210
- batch.Put(handles_[cf], Key1(j),
2211
- "value_" + std::to_string(j) + "_" + std::to_string(i)));
2800
+ const std::string key = Key1(j);
2801
+ const std::string value =
2802
+ "value_" + std::to_string(j) + "_" + std::to_string(i);
2803
+ ASSERT_OK(batch.Put(handles_[cf], key, value));
2212
2804
  }
2213
- ASSERT_OK(batch.AssignTimestamp(write_ts));
2805
+ ASSERT_OK(batch.UpdateTimestamps(write_ts,
2806
+ [ts_sz](uint32_t) { return ts_sz; }));
2214
2807
  ASSERT_OK(db_->Write(wopts, &batch));
2215
2808
 
2216
2809
  verify_records_func(i, handles_[cf]);
@@ -2242,18 +2835,16 @@ TEST_F(DBBasicTestWithTimestamp, MultiGetNoReturnTs) {
2242
2835
  options.comparator = &test_cmp;
2243
2836
  DestroyAndReopen(options);
2244
2837
  WriteOptions write_opts;
2245
- std::string ts_str = Timestamp(1, 0);
2246
- Slice ts = ts_str;
2247
- write_opts.timestamp = &ts;
2248
- ASSERT_OK(db_->Put(write_opts, "foo", "value"));
2249
- ASSERT_OK(db_->Put(write_opts, "bar", "value"));
2250
- ASSERT_OK(db_->Put(write_opts, "fooxxxxxxxxxxxxxxxx", "value"));
2251
- ASSERT_OK(db_->Put(write_opts, "barxxxxxxxxxxxxxxxx", "value"));
2838
+ std::string ts = Timestamp(1, 0);
2839
+ ASSERT_OK(db_->Put(write_opts, "foo", ts, "value"));
2840
+ ASSERT_OK(db_->Put(write_opts, "bar", ts, "value"));
2841
+ ASSERT_OK(db_->Put(write_opts, "fooxxxxxxxxxxxxxxxx", ts, "value"));
2842
+ ASSERT_OK(db_->Put(write_opts, "barxxxxxxxxxxxxxxxx", ts, "value"));
2252
2843
  ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
2253
- ts_str = Timestamp(2, 0);
2254
- ts = ts_str;
2844
+ ts = Timestamp(2, 0);
2845
+ Slice read_ts = ts;
2255
2846
  ReadOptions read_opts;
2256
- read_opts.timestamp = &ts;
2847
+ read_opts.timestamp = &read_ts;
2257
2848
  {
2258
2849
  ColumnFamilyHandle* column_families[] = {cfh, cfh};
2259
2850
  Slice keys[] = {"foo", "bar"};
@@ -2299,14 +2890,15 @@ class DBBasicTestWithTimestampPrefixSeek
2299
2890
  : public DBBasicTestWithTimestampBase,
2300
2891
  public testing::WithParamInterface<
2301
2892
  std::tuple<std::shared_ptr<const SliceTransform>,
2302
- std::shared_ptr<const FilterPolicy>, bool>> {
2893
+ std::shared_ptr<const FilterPolicy>, bool,
2894
+ BlockBasedTableOptions::IndexType>> {
2303
2895
  public:
2304
2896
  DBBasicTestWithTimestampPrefixSeek()
2305
2897
  : DBBasicTestWithTimestampBase(
2306
2898
  "/db_basic_test_with_timestamp_prefix_seek") {}
2307
2899
  };
2308
2900
 
2309
- TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2901
+ TEST_P(DBBasicTestWithTimestampPrefixSeek, IterateWithPrefix) {
2310
2902
  const size_t kNumKeysPerFile = 128;
2311
2903
  Options options = CurrentOptions();
2312
2904
  options.env = env_;
@@ -2315,9 +2907,11 @@ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2315
2907
  TestComparator test_cmp(kTimestampSize);
2316
2908
  options.comparator = &test_cmp;
2317
2909
  options.prefix_extractor = std::get<0>(GetParam());
2318
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2910
+ options.memtable_factory.reset(
2911
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
2319
2912
  BlockBasedTableOptions bbto;
2320
2913
  bbto.filter_policy = std::get<1>(GetParam());
2914
+ bbto.index_type = std::get<3>(GetParam());
2321
2915
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2322
2916
  DestroyAndReopen(options);
2323
2917
 
@@ -2328,10 +2922,9 @@ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2328
2922
  WriteOptions write_opts;
2329
2923
  {
2330
2924
  for (size_t i = 0; i != write_ts_list.size(); ++i) {
2331
- Slice write_ts = write_ts_list[i];
2332
- write_opts.timestamp = &write_ts;
2333
2925
  for (uint64_t key = kMaxKey; key >= kMinKey; --key) {
2334
- Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
2926
+ Status s = db_->Put(write_opts, Key1(key), write_ts_list[i],
2927
+ "value" + std::to_string(i));
2335
2928
  ASSERT_OK(s);
2336
2929
  }
2337
2930
  }
@@ -2356,6 +2949,13 @@ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2356
2949
  "value" + std::to_string(i), write_ts_list[i]);
2357
2950
  iter->Next();
2358
2951
  ASSERT_FALSE(iter->Valid());
2952
+
2953
+ // Seek to kMinKey
2954
+ iter->Seek(Key1(kMinKey));
2955
+ CheckIterUserEntry(iter.get(), Key1(kMinKey), kTypeValue,
2956
+ "value" + std::to_string(i), write_ts_list[i]);
2957
+ iter->Prev();
2958
+ ASSERT_FALSE(iter->Valid());
2359
2959
  }
2360
2960
  const std::vector<uint64_t> targets = {kMinKey, kMinKey + 0x10,
2361
2961
  kMinKey + 0x100, kMaxKey};
@@ -2371,6 +2971,7 @@ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2371
2971
  Slice read_ts = read_ts_list[i];
2372
2972
  read_opts.timestamp = &read_ts;
2373
2973
  std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
2974
+ // Forward and backward iterate.
2374
2975
  for (size_t j = 0; j != targets.size(); ++j) {
2375
2976
  std::string start_key = Key1(targets[j]);
2376
2977
  uint64_t expected_ub =
@@ -2394,6 +2995,24 @@ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2394
2995
  it->Next();
2395
2996
  }
2396
2997
  ASSERT_EQ(expected_ub - targets[j] + 1, count);
2998
+
2999
+ count = 0;
3000
+ expected_key = targets[j];
3001
+ it->SeekForPrev(start_key);
3002
+ uint64_t expected_lb = (targets[j] & kPrefixMask);
3003
+ while (it->Valid()) {
3004
+ // Out of prefix
3005
+ if (!read_opts.prefix_same_as_start &&
3006
+ pe->Transform(it->key()) != pe->Transform(start_key)) {
3007
+ break;
3008
+ }
3009
+ CheckIterUserEntry(it.get(), Key1(expected_key), kTypeValue,
3010
+ "value" + std::to_string(i), write_ts_list[i]);
3011
+ ++count;
3012
+ --expected_key;
3013
+ it->Prev();
3014
+ }
3015
+ ASSERT_EQ(targets[j] - std::max(expected_lb, kMinKey) + 1, count);
2397
3016
  }
2398
3017
  }
2399
3018
  }
@@ -2416,19 +3035,25 @@ INSTANTIATE_TEST_CASE_P(
2416
3035
  std::shared_ptr<const FilterPolicy>(
2417
3036
  NewBloomFilterPolicy(20 /*bits_per_key*/,
2418
3037
  false))),
2419
- ::testing::Bool()));
3038
+ ::testing::Bool(),
3039
+ ::testing::Values(
3040
+ BlockBasedTableOptions::IndexType::kBinarySearch,
3041
+ BlockBasedTableOptions::IndexType::kHashSearch,
3042
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch,
3043
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey)));
2420
3044
 
2421
3045
  class DBBasicTestWithTsIterTombstones
2422
3046
  : public DBBasicTestWithTimestampBase,
2423
3047
  public testing::WithParamInterface<
2424
3048
  std::tuple<std::shared_ptr<const SliceTransform>,
2425
- std::shared_ptr<const FilterPolicy>, int>> {
3049
+ std::shared_ptr<const FilterPolicy>, int,
3050
+ BlockBasedTableOptions::IndexType>> {
2426
3051
  public:
2427
3052
  DBBasicTestWithTsIterTombstones()
2428
3053
  : DBBasicTestWithTimestampBase("/db_basic_ts_iter_tombstones") {}
2429
3054
  };
2430
3055
 
2431
- TEST_P(DBBasicTestWithTsIterTombstones, ForwardIterDelete) {
3056
+ TEST_P(DBBasicTestWithTsIterTombstones, IterWithDelete) {
2432
3057
  constexpr size_t kNumKeysPerFile = 128;
2433
3058
  Options options = CurrentOptions();
2434
3059
  options.env = env_;
@@ -2436,9 +3061,11 @@ TEST_P(DBBasicTestWithTsIterTombstones, ForwardIterDelete) {
2436
3061
  TestComparator test_cmp(kTimestampSize);
2437
3062
  options.comparator = &test_cmp;
2438
3063
  options.prefix_extractor = std::get<0>(GetParam());
2439
- options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
3064
+ options.memtable_factory.reset(
3065
+ test::NewSpecialSkipListFactory(kNumKeysPerFile));
2440
3066
  BlockBasedTableOptions bbto;
2441
3067
  bbto.filter_policy = std::get<1>(GetParam());
3068
+ bbto.index_type = std::get<3>(GetParam());
2442
3069
  options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2443
3070
  options.num_levels = std::get<2>(GetParam());
2444
3071
  DestroyAndReopen(options);
@@ -2449,24 +3076,23 @@ TEST_P(DBBasicTestWithTsIterTombstones, ForwardIterDelete) {
2449
3076
  uint64_t key = kMinKey;
2450
3077
  WriteOptions write_opts;
2451
3078
  Slice ts = write_ts_strs[0];
2452
- write_opts.timestamp = &ts;
2453
3079
  do {
2454
- Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(key));
3080
+ Status s = db_->Put(write_opts, Key1(key), write_ts_strs[0],
3081
+ "value" + std::to_string(key));
2455
3082
  ASSERT_OK(s);
2456
3083
  if (kMaxKey == key) {
2457
3084
  break;
2458
3085
  }
2459
3086
  ++key;
2460
3087
  } while (true);
2461
- // Delete them all
2462
- ts = write_ts_strs[1];
2463
- write_opts.timestamp = &ts;
3088
+
2464
3089
  for (key = kMaxKey; key >= kMinKey; --key) {
2465
3090
  Status s;
2466
3091
  if (0 != (key % 2)) {
2467
- s = db_->Put(write_opts, Key1(key), "value1" + std::to_string(key));
3092
+ s = db_->Put(write_opts, Key1(key), write_ts_strs[1],
3093
+ "value1" + std::to_string(key));
2468
3094
  } else {
2469
- s = db_->Delete(write_opts, Key1(key));
3095
+ s = db_->Delete(write_opts, Key1(key), write_ts_strs[1]);
2470
3096
  }
2471
3097
  ASSERT_OK(s);
2472
3098
  }
@@ -2485,6 +3111,13 @@ TEST_P(DBBasicTestWithTsIterTombstones, ForwardIterDelete) {
2485
3111
  ASSERT_EQ("value1" + std::to_string(key), iter->value());
2486
3112
  }
2487
3113
  ASSERT_EQ((kMaxKey - kMinKey + 1) / 2, count);
3114
+
3115
+ for (iter->SeekToLast(), count = 0, key = kMaxKey; iter->Valid();
3116
+ key -= 2, ++count, iter->Prev()) {
3117
+ ASSERT_EQ(Key1(key), iter->key());
3118
+ ASSERT_EQ("value1" + std::to_string(key), iter->value());
3119
+ }
3120
+ ASSERT_EQ((kMaxKey - kMinKey + 1) / 2, count);
2488
3121
  }
2489
3122
  Close();
2490
3123
  }
@@ -2500,18 +3133,16 @@ INSTANTIATE_TEST_CASE_P(
2500
3133
  NewBloomFilterPolicy(10, false)),
2501
3134
  std::shared_ptr<const FilterPolicy>(
2502
3135
  NewBloomFilterPolicy(20, false))),
2503
- ::testing::Values(2, 6)));
3136
+ ::testing::Values(2, 6),
3137
+ ::testing::Values(
3138
+ BlockBasedTableOptions::IndexType::kBinarySearch,
3139
+ BlockBasedTableOptions::IndexType::kHashSearch,
3140
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch,
3141
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey)));
3142
+ #endif // !defined(ROCKSDB_VALGRIND_RUN) || defined(ROCKSDB_FULL_VALGRIND_RUN)
2504
3143
 
2505
3144
  } // namespace ROCKSDB_NAMESPACE
2506
3145
 
2507
- #ifdef ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
2508
- extern "C" {
2509
- void RegisterCustomObjects(int argc, char** argv);
2510
- }
2511
- #else
2512
- void RegisterCustomObjects(int /*argc*/, char** /*argv*/) {}
2513
- #endif // !ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
2514
-
2515
3146
  int main(int argc, char** argv) {
2516
3147
  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
2517
3148
  ::testing::InitGoogleTest(&argc, argv);