@nxtedition/rocksdb 8.2.7 → 9.0.0

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 (359) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -1
  2. package/deps/rocksdb/rocksdb/Makefile +22 -19
  3. package/deps/rocksdb/rocksdb/TARGETS +8 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +157 -61
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +43 -92
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +632 -455
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +244 -149
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +41 -13
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +11 -1
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +216 -17
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +279 -199
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +2 -1
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +159 -8
  15. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +28 -2
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +1 -1
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +8 -0
  18. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  19. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +3 -1
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +18 -21
  25. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  27. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  28. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  29. package/deps/rocksdb/rocksdb/db/builder.cc +32 -7
  30. package/deps/rocksdb/rocksdb/db/c.cc +169 -6
  31. package/deps/rocksdb/rocksdb/db/c_test.c +104 -6
  32. package/deps/rocksdb/rocksdb/db/column_family.cc +98 -47
  33. package/deps/rocksdb/rocksdb/db/column_family.h +25 -2
  34. package/deps/rocksdb/rocksdb/db/column_family_test.cc +213 -2
  35. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +93 -23
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +33 -9
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +107 -43
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +15 -4
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +4 -2
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +25 -17
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +13 -4
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +24 -31
  50. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +19 -19
  52. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +2 -1
  53. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  54. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  55. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  56. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  57. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +17 -3
  58. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +5 -0
  59. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +15 -15
  60. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +666 -44
  61. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  62. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +274 -1
  63. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -19
  64. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  65. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +250 -116
  66. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +51 -23
  67. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +354 -96
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -3
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +5 -0
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +50 -21
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +26 -13
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -5
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +61 -21
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -87
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +7 -1
  77. package/deps/rocksdb/rocksdb/db/db_iter.cc +2 -2
  78. package/deps/rocksdb/rocksdb/db/db_iter.h +1 -0
  79. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  80. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +6 -6
  81. package/deps/rocksdb/rocksdb/db/db_options_test.cc +39 -29
  82. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  83. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +106 -0
  84. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +12 -3
  85. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  86. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  87. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +279 -166
  88. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -21
  89. package/deps/rocksdb/rocksdb/db/db_test2.cc +81 -12
  90. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  91. package/deps/rocksdb/rocksdb/db/db_test_util.h +40 -0
  92. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +13 -1
  93. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +233 -0
  94. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +143 -0
  95. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  96. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  97. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  98. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  99. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  100. package/deps/rocksdb/rocksdb/db/error_handler.cc +16 -0
  101. package/deps/rocksdb/rocksdb/db/error_handler.h +6 -3
  102. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  103. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  104. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  105. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  106. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  107. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +86 -4
  108. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  110. package/deps/rocksdb/rocksdb/db/flush_job.cc +101 -11
  111. package/deps/rocksdb/rocksdb/db/flush_job.h +24 -1
  112. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +88 -11
  113. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  114. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  115. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  116. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  117. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  118. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  119. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  120. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  121. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  122. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  123. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  124. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +4 -3
  125. package/deps/rocksdb/rocksdb/db/memtable.cc +52 -13
  126. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  127. package/deps/rocksdb/rocksdb/db/memtable_list.cc +44 -10
  128. package/deps/rocksdb/rocksdb/db/memtable_list.h +32 -1
  129. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +90 -4
  130. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +2 -2
  131. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  132. package/deps/rocksdb/rocksdb/db/repair.cc +21 -4
  133. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  134. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +5 -4
  135. package/deps/rocksdb/rocksdb/db/table_cache.cc +44 -35
  136. package/deps/rocksdb/rocksdb/db/table_cache.h +6 -6
  137. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  138. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  139. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  140. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  141. package/deps/rocksdb/rocksdb/db/version_edit.h +48 -6
  142. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  143. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  144. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  145. package/deps/rocksdb/rocksdb/db/version_set.cc +136 -41
  146. package/deps/rocksdb/rocksdb/db/version_set.h +28 -7
  147. package/deps/rocksdb/rocksdb/db/version_set_test.cc +25 -15
  148. package/deps/rocksdb/rocksdb/db/write_batch.cc +11 -0
  149. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  150. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  151. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +22 -3
  152. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +2 -0
  153. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  154. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +32 -3
  155. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +7 -0
  156. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -120
  157. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +9 -4
  158. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +13 -6
  159. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  160. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +15 -27
  161. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +264 -69
  162. package/deps/rocksdb/rocksdb/env/env.cc +1 -2
  163. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  164. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  165. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  166. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  167. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  168. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +78 -0
  169. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  170. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  171. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  172. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +52 -43
  173. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +34 -18
  174. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  175. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  176. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +724 -79
  177. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +64 -33
  178. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  179. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  180. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  181. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +2 -1
  182. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +153 -88
  183. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +70 -2
  184. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +50 -11
  185. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  186. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +16 -2
  187. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  188. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +55 -8
  189. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +32 -4
  190. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  191. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +90 -13
  192. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  193. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +85 -17
  194. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +13 -1
  195. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  196. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  197. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +21 -2
  198. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  199. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +6 -0
  200. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +5 -0
  201. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  202. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  203. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +33 -2
  204. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  205. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  206. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -0
  207. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  208. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +2 -1
  209. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  210. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +16 -1
  211. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +10 -0
  212. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  213. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  214. package/deps/rocksdb/rocksdb/options/customizable_test.cc +2 -1
  215. package/deps/rocksdb/rocksdb/options/db_options.cc +7 -0
  216. package/deps/rocksdb/rocksdb/options/db_options.h +1 -0
  217. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  218. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  219. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +11 -3
  220. package/deps/rocksdb/rocksdb/options/options_test.cc +8 -0
  221. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  222. package/deps/rocksdb/rocksdb/port/stack_trace.cc +27 -12
  223. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  224. package/deps/rocksdb/rocksdb/src.mk +3 -0
  225. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  226. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  227. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  228. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +115 -42
  229. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +6 -5
  230. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +60 -2
  231. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +2 -0
  232. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +62 -44
  233. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +36 -14
  234. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -15
  235. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  236. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  237. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  238. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -21
  239. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +11 -4
  240. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +195 -55
  241. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  242. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  243. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  244. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +1 -1
  245. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  246. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +27 -12
  247. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  248. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  249. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -2
  250. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +9 -6
  251. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  252. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  253. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +11 -11
  254. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -0
  255. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  256. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  257. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  258. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  259. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  260. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  261. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -2
  262. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  263. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  264. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  265. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  266. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  267. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  268. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  269. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +12 -3
  270. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +26 -1
  271. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  272. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  273. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  274. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  275. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  276. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  277. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  278. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +65 -26
  279. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +8 -5
  280. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -0
  281. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  282. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +0 -1
  283. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  284. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  285. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  286. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  287. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  288. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  289. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  290. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  291. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  292. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  293. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  294. package/deps/rocksdb/rocksdb/util/cast_util.h +14 -0
  295. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  296. package/deps/rocksdb/rocksdb/util/comparator.cc +29 -7
  297. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  298. package/deps/rocksdb/rocksdb/util/compression.h +110 -32
  299. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  300. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  301. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  302. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  303. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  304. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  305. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  306. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  307. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  308. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  309. package/deps/rocksdb/rocksdb/util/thread_operation.h +8 -1
  310. package/deps/rocksdb/rocksdb/util/udt_util.cc +343 -0
  311. package/deps/rocksdb/rocksdb/util/udt_util.h +173 -1
  312. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +447 -0
  313. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  314. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  315. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  316. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +69 -25
  317. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  318. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  319. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  320. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  321. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  322. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  323. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +1 -1
  324. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  325. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -1
  326. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +3 -3
  327. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  328. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  329. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  330. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  331. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  332. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  333. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  334. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +231 -33
  335. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +0 -1
  336. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  337. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  338. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +40 -23
  339. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +13 -12
  340. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +7 -0
  341. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  342. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +41 -11
  343. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  344. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +71 -24
  345. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  346. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  347. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +39 -11
  348. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  349. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +14 -8
  350. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  351. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  352. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  353. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  354. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +2 -1
  355. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +6 -6
  356. package/deps/rocksdb/rocksdb.gyp +2 -0
  357. package/package.json +1 -1
  358. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  359. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -38,8 +38,8 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
38
38
  // complexity: human readable strings are easier to compress than random
39
39
  // strings.
40
40
  static std::map<std::string, std::string> GenerateKVMap(
41
- int num_block = 100,
42
- bool mixed_with_human_readable_string_value = false) {
41
+ int num_block = 100, bool mixed_with_human_readable_string_value = false,
42
+ size_t ts_sz = 0) {
43
43
  std::map<std::string, std::string> kv;
44
44
 
45
45
  Random rnd(101);
@@ -58,7 +58,13 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
58
58
  } else {
59
59
  v = rnd.RandomString(256);
60
60
  }
61
- kv[std::string(k)] = v;
61
+ if (ts_sz > 0) {
62
+ std::string user_key;
63
+ AppendKeyWithMinTimestamp(&user_key, std::string(k), ts_sz);
64
+ kv[user_key] = v;
65
+ } else {
66
+ kv[std::string(k)] = v;
67
+ }
62
68
  key++;
63
69
  }
64
70
  }
@@ -80,21 +86,29 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
80
86
 
81
87
  // Creates a table with the specificied key value pairs (kv).
82
88
  void CreateTable(const std::string& table_name,
89
+ const ImmutableOptions& ioptions,
83
90
  const CompressionType& compression_type,
84
- const std::map<std::string, std::string>& kv) {
91
+ const std::map<std::string, std::string>& kv,
92
+ uint32_t compression_parallel_threads = 1,
93
+ uint32_t compression_dict_bytes = 0) {
85
94
  std::unique_ptr<WritableFileWriter> writer;
86
95
  NewFileWriter(table_name, &writer);
87
96
 
88
- // Create table builder.
89
- ImmutableOptions ioptions(options_);
90
- InternalKeyComparator comparator(options_.comparator);
97
+ InternalKeyComparator comparator(ioptions.user_comparator);
91
98
  ColumnFamilyOptions cf_options;
99
+ cf_options.prefix_extractor = options_.prefix_extractor;
92
100
  MutableCFOptions moptions(cf_options);
101
+ CompressionOptions compression_opts;
102
+ compression_opts.parallel_threads = compression_parallel_threads;
103
+ // Enable compression dictionary and set a buffering limit that is the same
104
+ // as each block's size.
105
+ compression_opts.max_dict_bytes = compression_dict_bytes;
106
+ compression_opts.max_dict_buffer_bytes = compression_dict_bytes;
93
107
  IntTblPropCollectorFactories factories;
94
108
  std::unique_ptr<TableBuilder> table_builder(
95
109
  options_.table_factory->NewTableBuilder(
96
110
  TableBuilderOptions(ioptions, moptions, comparator, &factories,
97
- compression_type, CompressionOptions(),
111
+ compression_type, compression_opts,
98
112
  0 /* column_family_id */,
99
113
  kDefaultColumnFamilyName, -1 /* level */),
100
114
  writer.get()));
@@ -114,11 +128,17 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
114
128
  const std::string& table_name,
115
129
  std::unique_ptr<BlockBasedTable>* table,
116
130
  bool prefetch_index_and_filter_in_cache = true,
117
- Status* status = nullptr) {
131
+ Status* status = nullptr,
132
+ bool user_defined_timestamps_persisted = true) {
118
133
  const MutableCFOptions moptions(options_);
119
- TableReaderOptions table_reader_options =
120
- TableReaderOptions(ioptions, moptions.prefix_extractor, EnvOptions(),
121
- comparator, 0 /* block_protection_bytes_per_key */);
134
+ TableReaderOptions table_reader_options = TableReaderOptions(
135
+ ioptions, moptions.prefix_extractor, EnvOptions(), comparator,
136
+ 0 /* block_protection_bytes_per_key */, false /* _skip_filters */,
137
+ false /* _immortal */, false /* _force_direct_prefetch */,
138
+ -1 /* _level */, nullptr /* _block_cache_tracer */,
139
+ 0 /* _max_file_size_for_l0_meta_pin */, "" /* _cur_db_session_id */,
140
+ 0 /* _cur_file_num */, {} /* _unique_id */, 0 /* _largest_seqno */,
141
+ 0 /* _tail_size */, user_defined_timestamps_persisted);
122
142
 
123
143
  std::unique_ptr<RandomAccessFileReader> file;
124
144
  NewFileReader(table_name, foptions, &file);
@@ -126,9 +146,11 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
126
146
  uint64_t file_size = 0;
127
147
  ASSERT_OK(env_->GetFileSize(Path(table_name), &file_size));
128
148
 
149
+ ReadOptions read_opts;
150
+ read_opts.verify_checksums = true;
129
151
  std::unique_ptr<TableReader> general_table;
130
152
  Status s = options_.table_factory->NewTableReader(
131
- ReadOptions(), table_reader_options, std::move(file), file_size,
153
+ read_opts, table_reader_options, std::move(file), file_size,
132
154
  &general_table, prefetch_index_and_filter_in_cache);
133
155
 
134
156
  if (s.ok()) {
@@ -147,6 +169,11 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
147
169
  std::shared_ptr<FileSystem> fs_;
148
170
  Options options_;
149
171
 
172
+ std::string ToInternalKey(const std::string& key) {
173
+ InternalKey internal_key(key, 0, ValueType::kTypeValue);
174
+ return internal_key.Encode().ToString();
175
+ }
176
+
150
177
  private:
151
178
  void WriteToFile(const std::string& content, const std::string& filename) {
152
179
  std::unique_ptr<FSWritableFile> f;
@@ -173,21 +200,31 @@ class BlockBasedTableReaderBaseTest : public testing::Test {
173
200
  reader->reset(new RandomAccessFileReader(std::move(f), path,
174
201
  env_->GetSystemClock().get()));
175
202
  }
176
-
177
- std::string ToInternalKey(const std::string& key) {
178
- InternalKey internal_key(key, 0, ValueType::kTypeValue);
179
- return internal_key.Encode().ToString();
180
- }
181
203
  };
182
204
 
205
+ // Param 1: compression type
206
+ // Param 2: whether to use direct reads
207
+ // Param 3: Block Based Table Index type
208
+ // Param 4: BBTO no_block_cache option
209
+ // Param 5: test mode for the user-defined timestamp feature
210
+ // Param 6: number of parallel compression threads
211
+ // Param 7: CompressionOptions.max_dict_bytes and
212
+ // CompressionOptions.max_dict_buffer_bytes to enable/disable
213
+ // compression dictionary.
183
214
  class BlockBasedTableReaderTest
184
215
  : public BlockBasedTableReaderBaseTest,
185
216
  public testing::WithParamInterface<std::tuple<
186
- CompressionType, bool, BlockBasedTableOptions::IndexType, bool>> {
217
+ CompressionType, bool, BlockBasedTableOptions::IndexType, bool,
218
+ test::UserDefinedTimestampTestMode, uint32_t, uint32_t>> {
187
219
  protected:
188
220
  void SetUp() override {
189
221
  compression_type_ = std::get<0>(GetParam());
190
222
  use_direct_reads_ = std::get<1>(GetParam());
223
+ test::UserDefinedTimestampTestMode udt_test_mode = std::get<4>(GetParam());
224
+ udt_enabled_ = test::IsUDTEnabled(udt_test_mode);
225
+ persist_udt_ = test::ShouldPersistUDT(udt_test_mode);
226
+ compression_parallel_threads_ = std::get<5>(GetParam());
227
+ compression_dict_bytes_ = std::get<6>(GetParam());
191
228
  BlockBasedTableReaderBaseTest::SetUp();
192
229
  }
193
230
 
@@ -195,24 +232,45 @@ class BlockBasedTableReaderTest
195
232
  BlockBasedTableOptions opts;
196
233
  opts.index_type = std::get<2>(GetParam());
197
234
  opts.no_block_cache = std::get<3>(GetParam());
235
+ opts.filter_policy.reset(NewBloomFilterPolicy(10, false));
236
+ opts.partition_filters =
237
+ opts.index_type ==
238
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch;
198
239
  options_.table_factory.reset(
199
240
  static_cast<BlockBasedTableFactory*>(NewBlockBasedTableFactory(opts)));
241
+ options_.prefix_extractor =
242
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(3));
200
243
  }
201
244
 
202
245
  CompressionType compression_type_;
203
246
  bool use_direct_reads_;
247
+ bool udt_enabled_;
248
+ bool persist_udt_;
249
+ uint32_t compression_parallel_threads_;
250
+ uint32_t compression_dict_bytes_;
204
251
  };
205
252
 
206
253
  // Tests MultiGet in both direct IO and non-direct IO mode.
207
254
  // The keys should be in cache after MultiGet.
208
255
  TEST_P(BlockBasedTableReaderTest, MultiGet) {
256
+ Options options;
257
+ ReadOptions read_opts;
258
+ std::string dummy_ts(sizeof(uint64_t), '\0');
259
+ Slice read_timestamp = dummy_ts;
260
+ if (udt_enabled_) {
261
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
262
+ read_opts.timestamp = &read_timestamp;
263
+ }
264
+ options.persist_user_defined_timestamps = persist_udt_;
265
+ size_t ts_sz = options.comparator->timestamp_size();
209
266
  std::map<std::string, std::string> kv =
210
267
  BlockBasedTableReaderBaseTest::GenerateKVMap(
211
268
  100 /* num_block */,
212
- true /* mixed_with_human_readable_string_value */);
269
+ true /* mixed_with_human_readable_string_value */, ts_sz);
213
270
 
214
271
  // Prepare keys, values, and statuses for MultiGet.
215
272
  autovector<Slice, MultiGetContext::MAX_BATCH_SIZE> keys;
273
+ autovector<Slice, MultiGetContext::MAX_BATCH_SIZE> keys_without_timestamps;
216
274
  autovector<PinnableSlice, MultiGetContext::MAX_BATCH_SIZE> values;
217
275
  autovector<Status, MultiGetContext::MAX_BATCH_SIZE> statuses;
218
276
  {
@@ -221,27 +279,40 @@ TEST_P(BlockBasedTableReaderTest, MultiGet) {
221
279
  auto it = kv.begin();
222
280
  for (int i = 0; i < MultiGetContext::MAX_BATCH_SIZE; i++) {
223
281
  keys.emplace_back(it->first);
282
+ if (ts_sz > 0) {
283
+ Slice ukey_without_ts = StripTimestampFromUserKey(it->first, ts_sz);
284
+ keys_without_timestamps.push_back(ukey_without_ts);
285
+ } else {
286
+ keys_without_timestamps.emplace_back(it->first);
287
+ }
224
288
  values.emplace_back();
225
289
  statuses.emplace_back();
226
290
  std::advance(it, step);
227
291
  }
228
292
  }
229
293
 
230
- std::string table_name =
231
- "BlockBasedTableReaderTest" + CompressionTypeToString(compression_type_);
232
- CreateTable(table_name, compression_type_, kv);
294
+ std::string table_name = "BlockBasedTableReaderTest_MultiGet" +
295
+ CompressionTypeToString(compression_type_);
233
296
 
234
- std::unique_ptr<BlockBasedTable> table;
235
- Options options;
236
297
  ImmutableOptions ioptions(options);
298
+ CreateTable(table_name, ioptions, compression_type_, kv,
299
+ compression_parallel_threads_, compression_dict_bytes_);
300
+
301
+ std::unique_ptr<BlockBasedTable> table;
237
302
  FileOptions foptions;
238
303
  foptions.use_direct_reads = use_direct_reads_;
239
304
  InternalKeyComparator comparator(options.comparator);
240
- NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table);
305
+ NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table,
306
+ true /* bool prefetch_index_and_filter_in_cache */,
307
+ nullptr /* status */, persist_udt_);
308
+
309
+ ASSERT_OK(
310
+ table->VerifyChecksum(read_opts, TableReaderCaller::kUserVerifyChecksum));
241
311
 
242
312
  // Ensure that keys are not in cache before MultiGet.
243
313
  for (auto& key : keys) {
244
- ASSERT_FALSE(table->TEST_KeyInCache(ReadOptions(), key));
314
+ std::string ikey = ToInternalKey(key.ToString());
315
+ ASSERT_FALSE(table->TEST_KeyInCache(read_opts, ikey));
245
316
  }
246
317
 
247
318
  // Prepare MultiGetContext.
@@ -249,26 +320,26 @@ TEST_P(BlockBasedTableReaderTest, MultiGet) {
249
320
  autovector<KeyContext, MultiGetContext::MAX_BATCH_SIZE> key_context;
250
321
  autovector<KeyContext*, MultiGetContext::MAX_BATCH_SIZE> sorted_keys;
251
322
  for (size_t i = 0; i < keys.size(); ++i) {
252
- get_context.emplace_back(BytewiseComparator(), nullptr, nullptr, nullptr,
323
+ get_context.emplace_back(options.comparator, nullptr, nullptr, nullptr,
253
324
  GetContext::kNotFound, keys[i], &values[i],
254
325
  nullptr, nullptr, nullptr, nullptr,
255
326
  true /* do_merge */, nullptr, nullptr, nullptr,
256
327
  nullptr, nullptr, nullptr);
257
- key_context.emplace_back(nullptr, keys[i], &values[i], nullptr, nullptr,
258
- &statuses.back());
328
+ key_context.emplace_back(nullptr, keys_without_timestamps[i], &values[i],
329
+ nullptr, nullptr, &statuses.back());
259
330
  key_context.back().get_context = &get_context.back();
260
331
  }
261
332
  for (auto& key_ctx : key_context) {
262
333
  sorted_keys.emplace_back(&key_ctx);
263
334
  }
264
- MultiGetContext ctx(&sorted_keys, 0, sorted_keys.size(), 0, ReadOptions(),
335
+ MultiGetContext ctx(&sorted_keys, 0, sorted_keys.size(), 0, read_opts,
265
336
  fs_.get(), nullptr);
266
337
 
267
338
  // Execute MultiGet.
268
339
  MultiGetContext::Range range = ctx.GetMultiGetRange();
269
340
  PerfContext* perf_ctx = get_perf_context();
270
341
  perf_ctx->Reset();
271
- table->MultiGet(ReadOptions(), &range, nullptr);
342
+ table->MultiGet(read_opts, &range, nullptr);
272
343
 
273
344
  ASSERT_GE(perf_ctx->block_read_count - perf_ctx->index_block_read_count -
274
345
  perf_ctx->filter_block_read_count -
@@ -281,11 +352,78 @@ TEST_P(BlockBasedTableReaderTest, MultiGet) {
281
352
  }
282
353
  // Check that keys are in cache after MultiGet.
283
354
  for (size_t i = 0; i < keys.size(); i++) {
284
- ASSERT_TRUE(table->TEST_KeyInCache(ReadOptions(), keys[i]));
355
+ std::string ikey = ToInternalKey(keys[i].ToString());
356
+ ASSERT_TRUE(table->TEST_KeyInCache(read_opts, ikey));
285
357
  ASSERT_EQ(values[i].ToString(), kv[keys[i].ToString()]);
286
358
  }
287
359
  }
288
360
 
361
+ TEST_P(BlockBasedTableReaderTest, NewIterator) {
362
+ Options options;
363
+ ReadOptions read_opts;
364
+ std::string dummy_ts(sizeof(uint64_t), '\0');
365
+ Slice read_timestamp = dummy_ts;
366
+ if (udt_enabled_) {
367
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
368
+ read_opts.timestamp = &read_timestamp;
369
+ }
370
+ options.persist_user_defined_timestamps = persist_udt_;
371
+ size_t ts_sz = options.comparator->timestamp_size();
372
+ std::map<std::string, std::string> kv =
373
+ BlockBasedTableReaderBaseTest::GenerateKVMap(
374
+ 100 /* num_block */,
375
+ true /* mixed_with_human_readable_string_value */, ts_sz);
376
+
377
+ std::string table_name = "BlockBasedTableReaderTest_NewIterator" +
378
+ CompressionTypeToString(compression_type_);
379
+
380
+ ImmutableOptions ioptions(options);
381
+ CreateTable(table_name, ioptions, compression_type_, kv,
382
+ compression_parallel_threads_, compression_dict_bytes_);
383
+
384
+ std::unique_ptr<BlockBasedTable> table;
385
+ FileOptions foptions;
386
+ foptions.use_direct_reads = use_direct_reads_;
387
+ InternalKeyComparator comparator(options.comparator);
388
+ NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table,
389
+ true /* bool prefetch_index_and_filter_in_cache */,
390
+ nullptr /* status */, persist_udt_);
391
+ ASSERT_OK(
392
+ table->VerifyChecksum(read_opts, TableReaderCaller::kUserVerifyChecksum));
393
+
394
+ std::unique_ptr<InternalIterator> iter;
395
+ iter.reset(table->NewIterator(
396
+ read_opts, options_.prefix_extractor.get(), /*arena=*/nullptr,
397
+ /*skip_filters=*/false, TableReaderCaller::kUncategorized));
398
+
399
+ // Test forward scan.
400
+ ASSERT_TRUE(!iter->Valid());
401
+ iter->SeekToFirst();
402
+ ASSERT_OK(iter->status());
403
+ for (auto kv_iter = kv.begin(); kv_iter != kv.end(); kv_iter++) {
404
+ std::string ikey = ToInternalKey(kv_iter->first);
405
+ ASSERT_EQ(iter->key().ToString(), ikey);
406
+ ASSERT_EQ(iter->value().ToString(), kv_iter->second);
407
+ iter->Next();
408
+ ASSERT_OK(iter->status());
409
+ }
410
+ ASSERT_TRUE(!iter->Valid());
411
+ ASSERT_OK(iter->status());
412
+
413
+ // Test backward scan.
414
+ iter->SeekToLast();
415
+ ASSERT_OK(iter->status());
416
+ for (auto kv_iter = kv.rbegin(); kv_iter != kv.rend(); kv_iter++) {
417
+ std::string ikey = ToInternalKey(kv_iter->first);
418
+ ASSERT_EQ(iter->key().ToString(), ikey);
419
+ ASSERT_EQ(iter->value().ToString(), kv_iter->second);
420
+ iter->Prev();
421
+ ASSERT_OK(iter->status());
422
+ }
423
+ ASSERT_TRUE(!iter->Valid());
424
+ ASSERT_OK(iter->status());
425
+ }
426
+
289
427
  class ChargeTableReaderTest
290
428
  : public BlockBasedTableReaderBaseTest,
291
429
  public testing::WithParamInterface<
@@ -374,7 +512,8 @@ class ChargeTableReaderTest
374
512
  std::size_t approx_table_reader_mem = 0;
375
513
 
376
514
  std::string table_name = "table_for_approx_table_reader_mem";
377
- CreateTable(table_name, compression_type_, kv_);
515
+ ImmutableOptions ioptions(options_);
516
+ CreateTable(table_name, ioptions, compression_type_, kv_);
378
517
 
379
518
  std::unique_ptr<BlockBasedTable> table;
380
519
  Status s;
@@ -424,13 +563,14 @@ TEST_P(ChargeTableReaderTest, Basic) {
424
563
  std::size_t opened_table_reader_num = 0;
425
564
  std::string table_name;
426
565
  std::vector<std::unique_ptr<BlockBasedTable>> tables;
566
+ ImmutableOptions ioptions(options_);
427
567
  // Keep creating BlockBasedTableReader till hiting the memory limit based on
428
568
  // cache capacity and creation fails (when charge_table_reader_ ==
429
569
  // kEnabled) or reaching a specfied big number of table readers (when
430
570
  // charge_table_reader_ == kDisabled)
431
571
  while (s.ok() && opened_table_reader_num < max_table_reader_num_uncapped) {
432
572
  table_name = "table_" + std::to_string(opened_table_reader_num);
433
- CreateTable(table_name, compression_type_, kv_);
573
+ CreateTable(table_name, ioptions, compression_type_, kv_);
434
574
  tables.push_back(std::unique_ptr<BlockBasedTable>());
435
575
  NewBlockBasedTableReader(
436
576
  FileOptions(), ImmutableOptions(options_),
@@ -465,7 +605,7 @@ TEST_P(ChargeTableReaderTest, Basic) {
465
605
  --opened_table_reader_num;
466
606
  }
467
607
  table_name = "table_for_successful_table_reader_open";
468
- CreateTable(table_name, compression_type_, kv_);
608
+ CreateTable(table_name, ioptions, compression_type_, kv_);
469
609
  tables.push_back(std::unique_ptr<BlockBasedTable>());
470
610
  NewBlockBasedTableReader(
471
611
  FileOptions(), ImmutableOptions(options_),
@@ -491,28 +631,42 @@ class BlockBasedTableReaderTestVerifyChecksum
491
631
  };
492
632
 
493
633
  TEST_P(BlockBasedTableReaderTestVerifyChecksum, ChecksumMismatch) {
634
+ Options options;
635
+ ReadOptions read_opts;
636
+ std::string dummy_ts(sizeof(uint64_t), '\0');
637
+ Slice read_timestamp = dummy_ts;
638
+ if (udt_enabled_) {
639
+ options.comparator = test::BytewiseComparatorWithU64TsWrapper();
640
+ read_opts.timestamp = &read_timestamp;
641
+ }
642
+ options.persist_user_defined_timestamps = persist_udt_;
643
+ size_t ts_sz = options.comparator->timestamp_size();
494
644
  std::map<std::string, std::string> kv =
495
- BlockBasedTableReaderBaseTest::GenerateKVMap(800 /* num_block */);
645
+ BlockBasedTableReaderBaseTest::GenerateKVMap(
646
+ 800 /* num_block */,
647
+ false /* mixed_with_human_readable_string_value=*/, ts_sz);
496
648
 
649
+ options.statistics = CreateDBStatistics();
650
+ ImmutableOptions ioptions(options);
497
651
  std::string table_name =
498
652
  "BlockBasedTableReaderTest" + CompressionTypeToString(compression_type_);
499
- CreateTable(table_name, compression_type_, kv);
653
+ CreateTable(table_name, ioptions, compression_type_, kv,
654
+ compression_parallel_threads_, compression_dict_bytes_);
500
655
 
501
656
  std::unique_ptr<BlockBasedTable> table;
502
- Options options;
503
- options.statistics = CreateDBStatistics();
504
- ImmutableOptions ioptions(options);
505
657
  FileOptions foptions;
506
658
  foptions.use_direct_reads = use_direct_reads_;
507
659
  InternalKeyComparator comparator(options.comparator);
508
- NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table);
660
+ NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table,
661
+ true /* bool prefetch_index_and_filter_in_cache */,
662
+ nullptr /* status */, persist_udt_);
509
663
 
510
664
  // Use the top level iterator to find the offset/size of the first
511
665
  // 2nd level index block and corrupt the block
512
666
  IndexBlockIter iiter_on_stack;
513
667
  BlockCacheLookupContext context{TableReaderCaller::kUserVerifyChecksum};
514
668
  InternalIteratorBase<IndexValue>* iiter = table->NewIndexIterator(
515
- ReadOptions(), /*disable_prefix_seek=*/false, &iiter_on_stack,
669
+ read_opts, /*need_upper_bound_check=*/false, &iiter_on_stack,
516
670
  /*get_context=*/nullptr, &context);
517
671
  std::unique_ptr<InternalIteratorBase<IndexValue>> iiter_unique_ptr;
518
672
  if (iiter != &iiter_on_stack) {
@@ -529,11 +683,13 @@ TEST_P(BlockBasedTableReaderTestVerifyChecksum, ChecksumMismatch) {
529
683
  ASSERT_OK(test::CorruptFile(options.env, Path(table_name),
530
684
  static_cast<int>(handle.offset()), 128));
531
685
 
532
- NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table);
686
+ NewBlockBasedTableReader(foptions, ioptions, comparator, table_name, &table,
687
+ true /* bool prefetch_index_and_filter_in_cache */,
688
+ nullptr /* status */, persist_udt_);
533
689
  ASSERT_EQ(0,
534
690
  options.statistics->getTickerCount(BLOCK_CHECKSUM_MISMATCH_COUNT));
535
- Status s = table->VerifyChecksum(ReadOptions(),
536
- TableReaderCaller::kUserVerifyChecksum);
691
+ Status s =
692
+ table->VerifyChecksum(read_opts, TableReaderCaller::kUserVerifyChecksum);
537
693
  ASSERT_EQ(1,
538
694
  options.statistics->getTickerCount(BLOCK_CHECKSUM_MISMATCH_COUNT));
539
695
  ASSERT_EQ(s.code(), Status::kCorruption);
@@ -541,14 +697,25 @@ TEST_P(BlockBasedTableReaderTestVerifyChecksum, ChecksumMismatch) {
541
697
 
542
698
  // Param 1: compression type
543
699
  // Param 2: whether to use direct reads
544
- // Param 3: Block Based Table Index type
700
+ // Param 3: Block Based Table Index type, partitioned filters are also enabled
701
+ // when index type is kTwoLevelIndexSearch
545
702
  // Param 4: BBTO no_block_cache option
703
+ // Param 5: test mode for the user-defined timestamp feature
704
+ // Param 6: number of parallel compression threads
705
+ // Param 7: CompressionOptions.max_dict_bytes and
706
+ // CompressionOptions.max_dict_buffer_bytes. This enable/disables
707
+ // compression dictionary.
546
708
  INSTANTIATE_TEST_CASE_P(
547
- MultiGet, BlockBasedTableReaderTest,
709
+ BlockBasedTableReaderTest, BlockBasedTableReaderTest,
548
710
  ::testing::Combine(
549
711
  ::testing::ValuesIn(GetSupportedCompressions()), ::testing::Bool(),
550
- ::testing::Values(BlockBasedTableOptions::IndexType::kBinarySearch),
551
- ::testing::Values(false)));
712
+ ::testing::Values(
713
+ BlockBasedTableOptions::IndexType::kBinarySearch,
714
+ BlockBasedTableOptions::IndexType::kHashSearch,
715
+ BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch,
716
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey),
717
+ ::testing::Values(false), ::testing::ValuesIn(test::GetUDTTestModes()),
718
+ ::testing::Values(1, 2), ::testing::Values(0, 4096)));
552
719
  INSTANTIATE_TEST_CASE_P(
553
720
  VerifyChecksum, BlockBasedTableReaderTestVerifyChecksum,
554
721
  ::testing::Combine(
@@ -556,7 +723,8 @@ INSTANTIATE_TEST_CASE_P(
556
723
  ::testing::Values(false),
557
724
  ::testing::Values(
558
725
  BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch),
559
- ::testing::Values(true)));
726
+ ::testing::Values(true), ::testing::ValuesIn(test::GetUDTTestModes()),
727
+ ::testing::Values(1, 2), ::testing::Values(0)));
560
728
 
561
729
  } // namespace ROCKSDB_NAMESPACE
562
730
 
@@ -48,10 +48,13 @@ BlockBuilder::BlockBuilder(
48
48
  int block_restart_interval, bool use_delta_encoding,
49
49
  bool use_value_delta_encoding,
50
50
  BlockBasedTableOptions::DataBlockIndexType index_type,
51
- double data_block_hash_table_util_ratio)
51
+ double data_block_hash_table_util_ratio, size_t ts_sz,
52
+ bool persist_user_defined_timestamps, bool is_user_key)
52
53
  : block_restart_interval_(block_restart_interval),
53
54
  use_delta_encoding_(use_delta_encoding),
54
55
  use_value_delta_encoding_(use_value_delta_encoding),
56
+ strip_ts_sz_(persist_user_defined_timestamps ? 0 : ts_sz),
57
+ is_user_key_(is_user_key),
55
58
  restarts_(1, 0), // First restart point is at offset 0
56
59
  counter_(0),
57
60
  finished_(false) {
@@ -96,6 +99,9 @@ size_t BlockBuilder::EstimateSizeAfterKV(const Slice& key,
96
99
  // Note: this is an imprecise estimate as it accounts for the whole key size
97
100
  // instead of non-shared key size.
98
101
  estimate += key.size();
102
+ if (strip_ts_sz_ > 0) {
103
+ estimate -= strip_ts_sz_;
104
+ }
99
105
  // In value delta encoding we estimate the value delta size as half the full
100
106
  // value size since only the size field of block handle is encoded.
101
107
  estimate +=
@@ -168,13 +174,13 @@ void BlockBuilder::AddWithLastKey(const Slice& key, const Slice& value,
168
174
  // or Reset. This is more convenient for the caller and we can be more
169
175
  // clever inside BlockBuilder. On this hot code path, we want to avoid
170
176
  // conditional jumps like `buffer_.empty() ? ... : ...` so we can use a
171
- // fast min operation instead, with an assertion to be sure our logic is
172
- // sound.
177
+ // fast arithmetic operation instead, with an assertion to be sure our logic
178
+ // is sound.
173
179
  size_t buffer_size = buffer_.size();
174
180
  size_t last_key_size = last_key_param.size();
175
- assert(buffer_size == 0 || buffer_size >= last_key_size);
181
+ assert(buffer_size == 0 || buffer_size >= last_key_size - strip_ts_sz_);
176
182
 
177
- Slice last_key(last_key_param.data(), std::min(buffer_size, last_key_size));
183
+ Slice last_key(last_key_param.data(), last_key_size * (buffer_size > 0));
178
184
 
179
185
  AddWithLastKeyImpl(key, value, last_key, delta_value, buffer_size);
180
186
  }
@@ -187,6 +193,15 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
187
193
  assert(!finished_);
188
194
  assert(counter_ <= block_restart_interval_);
189
195
  assert(!use_value_delta_encoding_ || delta_value);
196
+ std::string key_buf;
197
+ std::string last_key_buf;
198
+ const Slice key_to_persist = MaybeStripTimestampFromKey(&key_buf, key);
199
+ // For delta key encoding, the first key in each restart interval doesn't have
200
+ // a last key to share bytes with.
201
+ const Slice last_key_persisted =
202
+ last_key.size() == 0
203
+ ? last_key
204
+ : MaybeStripTimestampFromKey(&last_key_buf, last_key);
190
205
  size_t shared = 0; // number of bytes shared with prev key
191
206
  if (counter_ >= block_restart_interval_) {
192
207
  // Restart compression
@@ -195,10 +210,10 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
195
210
  counter_ = 0;
196
211
  } else if (use_delta_encoding_) {
197
212
  // See how much sharing to do with previous string
198
- shared = key.difference_offset(last_key);
213
+ shared = key_to_persist.difference_offset(last_key_persisted);
199
214
  }
200
215
 
201
- const size_t non_shared = key.size() - shared;
216
+ const size_t non_shared = key_to_persist.size() - shared;
202
217
 
203
218
  if (use_value_delta_encoding_) {
204
219
  // Add "<shared><non_shared>" to buffer_
@@ -212,7 +227,7 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
212
227
  }
213
228
 
214
229
  // Add string delta to buffer_ followed by value
215
- buffer_.append(key.data() + shared, non_shared);
230
+ buffer_.append(key_to_persist.data() + shared, non_shared);
216
231
  // Use value delta encoding only when the key has shared bytes. This would
217
232
  // simplify the decoding, where it can figure which decoding to use simply by
218
233
  // looking at the shared bytes size.
@@ -222,7 +237,12 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
222
237
  buffer_.append(value.data(), value.size());
223
238
  }
224
239
 
240
+ // TODO(yuzhangyu): make user defined timestamp work with block hash index.
225
241
  if (data_block_hash_index_builder_.Valid()) {
242
+ // Only data blocks should be using `kDataBlockBinaryAndHash` index type.
243
+ // And data blocks should always be built with internal keys instead of
244
+ // user keys.
245
+ assert(!is_user_key_);
226
246
  data_block_hash_index_builder_.Add(ExtractUserKey(key),
227
247
  restarts_.size() - 1);
228
248
  }
@@ -231,4 +251,17 @@ inline void BlockBuilder::AddWithLastKeyImpl(const Slice& key,
231
251
  estimate_ += buffer_.size() - buffer_size;
232
252
  }
233
253
 
254
+ const Slice BlockBuilder::MaybeStripTimestampFromKey(std::string* key_buf,
255
+ const Slice& key) {
256
+ Slice stripped_key = key;
257
+ if (strip_ts_sz_ > 0) {
258
+ if (is_user_key_) {
259
+ stripped_key.remove_suffix(strip_ts_sz_);
260
+ } else {
261
+ StripTimestampFromInternalKey(key_buf, key, strip_ts_sz_);
262
+ stripped_key = *key_buf;
263
+ }
264
+ }
265
+ return stripped_key;
266
+ }
234
267
  } // namespace ROCKSDB_NAMESPACE
@@ -28,7 +28,10 @@ class BlockBuilder {
28
28
  bool use_value_delta_encoding = false,
29
29
  BlockBasedTableOptions::DataBlockIndexType index_type =
30
30
  BlockBasedTableOptions::kDataBlockBinarySearch,
31
- double data_block_hash_table_util_ratio = 0.75);
31
+ double data_block_hash_table_util_ratio = 0.75,
32
+ size_t ts_sz = 0,
33
+ bool persist_user_defined_timestamps = true,
34
+ bool is_user_key = false);
32
35
 
33
36
  // Reset the contents as if the BlockBuilder was just constructed.
34
37
  void Reset();
@@ -83,11 +86,32 @@ class BlockBuilder {
83
86
  const Slice* const delta_value,
84
87
  size_t buffer_size);
85
88
 
89
+ inline const Slice MaybeStripTimestampFromKey(std::string* key_buf,
90
+ const Slice& key);
91
+
86
92
  const int block_restart_interval_;
87
93
  // TODO(myabandeh): put it into a separate IndexBlockBuilder
88
94
  const bool use_delta_encoding_;
89
95
  // Refer to BlockIter::DecodeCurrentValue for format of delta encoded values
90
96
  const bool use_value_delta_encoding_;
97
+ // Size in bytes for the user-defined timestamp to strip in a user key.
98
+ // This is non-zero if there is user-defined timestamp in the user key and it
99
+ // should not be persisted.
100
+ const size_t strip_ts_sz_;
101
+ // Whether the keys provided to build this block are user keys. If not,
102
+ // the keys are internal keys. This will affect how timestamp stripping is
103
+ // done for the key if `persisted_user_defined_timestamps_` is false and
104
+ // `ts_sz_` is non-zero.
105
+ // The timestamp stripping only applies to the keys added to the block. If the
106
+ // value contains user defined timestamp that needed to be stripped too, such
107
+ // as the `first_internal_key` in an `IndexValue` for an index block, the
108
+ // value part for a range deletion entry, their timestamp should be stripped
109
+ // before calling `BlockBuilder::Add`.
110
+ // Timestamp stripping only applies to data block and index blocks including
111
+ // index block for data blocks, index block for partitioned filter blocks,
112
+ // index block for partitioned index blocks. In summary, this only applies to
113
+ // block whose key are real user keys or internal keys created from user keys.
114
+ const bool is_user_key_;
91
115
 
92
116
  std::string buffer_; // Destination buffer
93
117
  std::vector<uint32_t> restarts_; // Restart points