@nxtedition/rocksdb 8.2.8 → 9.0.1

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 (483) hide show
  1. package/binding.cc +0 -21
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +20 -10
  3. package/deps/rocksdb/rocksdb/Makefile +37 -25
  4. package/deps/rocksdb/rocksdb/README.md +29 -0
  5. package/deps/rocksdb/rocksdb/TARGETS +25 -2
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +35 -0
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +229 -74
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +2 -1
  9. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +4 -3
  10. package/deps/rocksdb/rocksdb/cache/cache_test.cc +58 -95
  11. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +4 -2
  12. package/deps/rocksdb/rocksdb/cache/charged_cache.h +5 -3
  13. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +2683 -496
  14. package/deps/rocksdb/rocksdb/cache/clock_cache.h +580 -159
  15. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +145 -42
  16. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +20 -1
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +391 -17
  18. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +7 -5
  19. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +309 -212
  20. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +0 -32
  21. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +439 -12
  22. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.h +44 -2
  23. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +11 -1
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -3
  25. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +119 -0
  26. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +155 -0
  27. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +711 -0
  28. package/deps/rocksdb/rocksdb/cache/typed_cache.h +17 -11
  29. package/deps/rocksdb/rocksdb/crash_test.mk +14 -0
  30. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +28 -12
  31. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +1 -0
  32. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +2 -1
  33. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +1 -1
  34. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -1
  35. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +2 -2
  36. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +1 -1
  37. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +20 -22
  38. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +1 -2
  39. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +2 -3
  41. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +1 -1
  42. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +8 -0
  43. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +7 -3
  44. package/deps/rocksdb/rocksdb/db/builder.cc +35 -10
  45. package/deps/rocksdb/rocksdb/db/c.cc +233 -6
  46. package/deps/rocksdb/rocksdb/db/c_test.c +140 -6
  47. package/deps/rocksdb/rocksdb/db/column_family.cc +110 -51
  48. package/deps/rocksdb/rocksdb/db/column_family.h +34 -2
  49. package/deps/rocksdb/rocksdb/db/column_family_test.cc +314 -7
  50. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +4 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +106 -23
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +47 -9
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +10 -11
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -6
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +2 -2
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +148 -60
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +22 -7
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -0
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -4
  60. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +33 -23
  61. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +14 -5
  62. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -11
  63. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +3 -0
  64. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +90 -4
  65. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +170 -95
  66. package/deps/rocksdb/rocksdb/db/compaction/file_pri.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +32 -58
  68. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +3 -1
  69. package/deps/rocksdb/rocksdb/db/convenience.cc +20 -3
  70. package/deps/rocksdb/rocksdb/db/convenience_impl.h +15 -0
  71. package/deps/rocksdb/rocksdb/db/corruption_test.cc +17 -0
  72. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  73. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +46 -10
  74. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +13 -3
  75. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +74 -15
  76. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +27 -3
  77. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +850 -44
  78. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +2 -29
  79. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +275 -1
  80. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +52 -19
  81. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +6 -5
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +733 -320
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +155 -66
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +516 -155
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +8 -4
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
  87. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +17 -4
  88. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +100 -35
  89. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +95 -50
  90. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +13 -9
  91. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +136 -79
  92. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +6 -95
  93. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +31 -22
  94. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +6 -0
  95. package/deps/rocksdb/rocksdb/db/db_iter.cc +85 -57
  96. package/deps/rocksdb/rocksdb/db/db_iter.h +11 -2
  97. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +29 -0
  98. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +276 -21
  99. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +35 -0
  100. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +4 -11
  101. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +193 -7
  102. package/deps/rocksdb/rocksdb/db/db_options_test.cc +294 -26
  103. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +26 -36
  104. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +364 -0
  105. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +13 -3
  106. package/deps/rocksdb/rocksdb/db/db_readonly_with_timestamp_test.cc +52 -0
  107. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +74 -1
  108. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +22 -4
  109. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +1 -1
  110. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +1 -0
  111. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +282 -167
  112. package/deps/rocksdb/rocksdb/db/db_test.cc +180 -49
  113. package/deps/rocksdb/rocksdb/db/db_test2.cc +84 -12
  114. package/deps/rocksdb/rocksdb/db/db_test_util.cc +25 -12
  115. package/deps/rocksdb/rocksdb/db/db_test_util.h +45 -2
  116. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +14 -1
  117. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +245 -0
  118. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +480 -1
  119. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +6 -6
  120. package/deps/rocksdb/rocksdb/db/db_write_test.cc +2 -2
  121. package/deps/rocksdb/rocksdb/db/dbformat.cc +36 -0
  122. package/deps/rocksdb/rocksdb/db/dbformat.h +169 -20
  123. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +129 -0
  124. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +2 -0
  125. package/deps/rocksdb/rocksdb/db/error_handler.cc +67 -34
  126. package/deps/rocksdb/rocksdb/db/error_handler.h +13 -9
  127. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +4 -4
  128. package/deps/rocksdb/rocksdb/db/event_helpers.cc +4 -0
  129. package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
  130. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +4 -4
  131. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +17 -8
  132. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +144 -4
  133. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -1
  134. package/deps/rocksdb/rocksdb/db/file_indexer.cc +2 -4
  135. package/deps/rocksdb/rocksdb/db/flush_job.cc +105 -17
  136. package/deps/rocksdb/rocksdb/db/flush_job.h +27 -4
  137. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -12
  138. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +2 -3
  139. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +159 -91
  140. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +19 -10
  141. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +143 -0
  142. package/deps/rocksdb/rocksdb/db/internal_stats.cc +13 -1
  143. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -0
  144. package/deps/rocksdb/rocksdb/db/listener_test.cc +2 -1
  145. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -2
  146. package/deps/rocksdb/rocksdb/db/log_test.cc +17 -21
  147. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  148. package/deps/rocksdb/rocksdb/db/log_writer.h +3 -2
  149. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +6 -3
  150. package/deps/rocksdb/rocksdb/db/memtable.cc +70 -83
  151. package/deps/rocksdb/rocksdb/db/memtable.h +45 -1
  152. package/deps/rocksdb/rocksdb/db/memtable_list.cc +45 -11
  153. package/deps/rocksdb/rocksdb/db/memtable_list.h +43 -2
  154. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +91 -5
  155. package/deps/rocksdb/rocksdb/db/merge_helper.cc +330 -115
  156. package/deps/rocksdb/rocksdb/db/merge_helper.h +100 -12
  157. package/deps/rocksdb/rocksdb/db/merge_operator.cc +82 -0
  158. package/deps/rocksdb/rocksdb/db/merge_test.cc +267 -0
  159. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +5 -2
  160. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +4 -4
  161. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -0
  162. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +4 -0
  164. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +4 -0
  165. package/deps/rocksdb/rocksdb/db/repair.cc +25 -7
  166. package/deps/rocksdb/rocksdb/db/repair_test.cc +143 -2
  167. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +459 -74
  168. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +105 -69
  169. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +83 -46
  170. package/deps/rocksdb/rocksdb/db/table_cache.cc +76 -54
  171. package/deps/rocksdb/rocksdb/db/table_cache.h +18 -12
  172. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  173. package/deps/rocksdb/rocksdb/db/version_builder.cc +0 -1
  174. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +236 -204
  175. package/deps/rocksdb/rocksdb/db/version_edit.cc +66 -4
  176. package/deps/rocksdb/rocksdb/db/version_edit.h +58 -10
  177. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +80 -8
  178. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +12 -0
  179. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +86 -17
  180. package/deps/rocksdb/rocksdb/db/version_set.cc +207 -110
  181. package/deps/rocksdb/rocksdb/db/version_set.h +36 -15
  182. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +2 -5
  183. package/deps/rocksdb/rocksdb/db/version_set_test.cc +47 -26
  184. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +525 -0
  185. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +6 -22
  186. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -20
  187. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +0 -29
  188. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +46 -0
  189. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +40 -0
  190. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper_test.cc +39 -0
  191. package/deps/rocksdb/rocksdb/db/write_batch.cc +55 -20
  192. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +3 -0
  193. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +16 -0
  194. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +1 -0
  195. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +4 -4
  196. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +4 -7
  197. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +88 -10
  198. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +37 -13
  199. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +110 -58
  200. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +42 -0
  201. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +68 -17
  202. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +34 -0
  203. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +8 -1
  204. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +429 -237
  205. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +13 -6
  206. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +21 -14
  207. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.cc +51 -0
  208. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_wide_merge_operator.h +27 -0
  209. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +3 -6
  210. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +2 -0
  211. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +29 -38
  212. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +302 -101
  213. package/deps/rocksdb/rocksdb/env/env.cc +6 -2
  214. package/deps/rocksdb/rocksdb/env/env_encryption.cc +11 -165
  215. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +0 -17
  216. package/deps/rocksdb/rocksdb/env/env_posix.cc +6 -2
  217. package/deps/rocksdb/rocksdb/env/env_test.cc +86 -2
  218. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  219. package/deps/rocksdb/rocksdb/env/unique_id_gen.cc +79 -0
  220. package/deps/rocksdb/rocksdb/env/unique_id_gen.h +34 -0
  221. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +1 -0
  222. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +15 -4
  223. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +100 -70
  224. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +64 -18
  225. package/deps/rocksdb/rocksdb/file/file_util.cc +10 -5
  226. package/deps/rocksdb/rocksdb/file/file_util.h +13 -1
  227. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1225 -97
  228. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +72 -33
  229. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +3 -16
  230. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +23 -12
  231. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +3 -0
  232. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +40 -14
  233. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +163 -91
  234. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +112 -2
  235. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +108 -16
  236. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +11 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -0
  238. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +42 -2
  239. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +1 -1
  240. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +92 -12
  241. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +34 -4
  242. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +9 -109
  243. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +91 -13
  244. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +8 -3
  245. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +10 -4
  246. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  248. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +55 -4
  249. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +130 -22
  250. package/deps/rocksdb/rocksdb/include/rocksdb/port_defs.h +4 -0
  251. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +9 -0
  252. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +92 -9
  253. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +2 -1
  254. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +5 -1
  255. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +37 -2
  256. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +35 -0
  257. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +15 -0
  258. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +7 -1
  259. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +20 -3
  260. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +7 -0
  261. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +7 -0
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +6 -1
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +33 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +2 -1
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +14 -0
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +42 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +0 -3
  268. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  269. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +53 -2
  270. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -2
  271. package/deps/rocksdb/rocksdb/memory/arena_test.cc +18 -11
  272. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +4 -3
  273. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +1 -1
  274. package/deps/rocksdb/rocksdb/microbench/README.md +60 -0
  275. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +69 -34
  276. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +1 -1
  277. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +22 -1
  278. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +18 -7
  279. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +14 -0
  280. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  281. package/deps/rocksdb/rocksdb/options/cf_options.h +10 -2
  282. package/deps/rocksdb/rocksdb/options/customizable_test.cc +6 -1
  283. package/deps/rocksdb/rocksdb/options/db_options.cc +54 -2
  284. package/deps/rocksdb/rocksdb/options/db_options.h +4 -0
  285. package/deps/rocksdb/rocksdb/options/options.cc +15 -1
  286. package/deps/rocksdb/rocksdb/options/options_helper.cc +18 -0
  287. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +14 -4
  288. package/deps/rocksdb/rocksdb/options/options_test.cc +14 -1
  289. package/deps/rocksdb/rocksdb/plugin/README.md +43 -0
  290. package/deps/rocksdb/rocksdb/port/README +10 -0
  291. package/deps/rocksdb/rocksdb/port/mmap.h +20 -0
  292. package/deps/rocksdb/rocksdb/port/port_example.h +1 -1
  293. package/deps/rocksdb/rocksdb/port/port_posix.cc +1 -1
  294. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -4
  295. package/deps/rocksdb/rocksdb/port/stack_trace.cc +32 -12
  296. package/deps/rocksdb/rocksdb/port/win/env_win.h +1 -1
  297. package/deps/rocksdb/rocksdb/port/win/port_win.h +5 -2
  298. package/deps/rocksdb/rocksdb/src.mk +10 -1
  299. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +2 -1
  300. package/deps/rocksdb/rocksdb/table/block_based/block.cc +48 -22
  301. package/deps/rocksdb/rocksdb/table/block_based/block.h +60 -12
  302. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +116 -43
  303. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +9 -6
  304. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +321 -49
  305. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +98 -4
  306. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +233 -98
  307. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +58 -23
  308. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +12 -8
  309. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +52 -24
  310. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +219 -51
  311. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +41 -8
  312. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +25 -1
  313. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +3 -1
  314. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +26 -7
  315. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +50 -18
  316. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +20 -8
  317. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +232 -71
  318. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -6
  319. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +44 -26
  320. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +2 -1
  321. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +1 -1
  322. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +31 -16
  323. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +97 -58
  324. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +2 -2
  325. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +6 -0
  326. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +36 -19
  327. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +3 -1
  328. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +114 -70
  329. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +4 -3
  330. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +11 -7
  331. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +15 -3
  332. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +6 -3
  333. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +1 -1
  334. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +14 -13
  335. package/deps/rocksdb/rocksdb/table/block_fetcher.h +4 -0
  336. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +9 -2
  337. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +1 -0
  338. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +6 -2
  339. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -2
  340. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +2 -3
  341. package/deps/rocksdb/rocksdb/table/format.cc +175 -33
  342. package/deps/rocksdb/rocksdb/table/format.h +63 -10
  343. package/deps/rocksdb/rocksdb/table/get_context.cc +52 -89
  344. package/deps/rocksdb/rocksdb/table/get_context.h +12 -3
  345. package/deps/rocksdb/rocksdb/table/internal_iterator.h +11 -0
  346. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +29 -1
  347. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +22 -2
  348. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +12 -4
  349. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -0
  350. package/deps/rocksdb/rocksdb/table/mock_table.cc +8 -3
  351. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +10 -5
  352. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +10 -1
  353. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +1 -2
  354. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +3 -3
  355. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +45 -9
  356. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +1 -0
  357. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +24 -1
  358. package/deps/rocksdb/rocksdb/table/table_builder.h +6 -2
  359. package/deps/rocksdb/rocksdb/table/table_properties.cc +6 -0
  360. package/deps/rocksdb/rocksdb/table/table_reader.h +6 -0
  361. package/deps/rocksdb/rocksdb/table/table_test.cc +52 -22
  362. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +31 -0
  363. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -1
  364. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.h +19 -7
  365. package/deps/rocksdb/rocksdb/test_util/sync_point.h +3 -1
  366. package/deps/rocksdb/rocksdb/test_util/testutil.cc +29 -0
  367. package/deps/rocksdb/rocksdb/test_util/testutil.h +19 -0
  368. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +3 -3
  369. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +87 -65
  370. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +221 -33
  371. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +36 -0
  372. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  373. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  374. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +33 -11
  375. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -0
  376. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +73 -0
  377. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +27 -0
  378. package/deps/rocksdb/rocksdb/unreleased_history/behavior_changes/.gitkeep +0 -0
  379. package/deps/rocksdb/rocksdb/unreleased_history/bug_fixes/.gitkeep +0 -0
  380. package/deps/rocksdb/rocksdb/unreleased_history/new_features/.gitkeep +0 -0
  381. package/deps/rocksdb/rocksdb/unreleased_history/performance_improvements/.gitkeep +0 -0
  382. package/deps/rocksdb/rocksdb/unreleased_history/public_api_changes/.gitkeep +0 -0
  383. package/deps/rocksdb/rocksdb/unreleased_history/release.sh +104 -0
  384. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +5 -0
  385. package/deps/rocksdb/rocksdb/util/bloom_impl.h +3 -3
  386. package/deps/rocksdb/rocksdb/util/bloom_test.cc +32 -11
  387. package/deps/rocksdb/rocksdb/util/cast_util.h +24 -0
  388. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +2 -0
  389. package/deps/rocksdb/rocksdb/util/comparator.cc +55 -8
  390. package/deps/rocksdb/rocksdb/util/compression.cc +4 -4
  391. package/deps/rocksdb/rocksdb/util/compression.h +119 -35
  392. package/deps/rocksdb/rocksdb/util/core_local.h +2 -1
  393. package/deps/rocksdb/rocksdb/util/crc32c.cc +7 -1
  394. package/deps/rocksdb/rocksdb/util/distributed_mutex.h +1 -1
  395. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +4 -4
  396. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -0
  397. package/deps/rocksdb/rocksdb/util/hash.h +7 -3
  398. package/deps/rocksdb/rocksdb/util/hash_test.cc +44 -0
  399. package/deps/rocksdb/rocksdb/util/math.h +58 -6
  400. package/deps/rocksdb/rocksdb/util/math128.h +29 -7
  401. package/deps/rocksdb/rocksdb/util/mutexlock.h +35 -27
  402. package/deps/rocksdb/rocksdb/util/overload.h +23 -0
  403. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +53 -18
  404. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +6 -1
  405. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +90 -19
  406. package/deps/rocksdb/rocksdb/util/single_thread_executor.h +1 -0
  407. package/deps/rocksdb/rocksdb/util/slice_test.cc +30 -0
  408. package/deps/rocksdb/rocksdb/util/status.cc +1 -0
  409. package/deps/rocksdb/rocksdb/util/stop_watch.h +1 -1
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +39 -0
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +10 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +385 -0
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +192 -1
  415. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +461 -0
  416. package/deps/rocksdb/rocksdb/util/write_batch_util.cc +25 -0
  417. package/deps/rocksdb/rocksdb/util/write_batch_util.h +80 -0
  418. package/deps/rocksdb/rocksdb/util/xxhash.h +0 -3
  419. package/deps/rocksdb/rocksdb/util/xxph3.h +0 -4
  420. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -4
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +71 -26
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +7 -6
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +1 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +2 -3
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +6 -11
  426. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -2
  427. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +4 -5
  428. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +1 -0
  429. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +20 -16
  430. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +11 -7
  431. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +2 -2
  432. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +7 -1
  433. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +3 -0
  434. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +12 -3
  435. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -2
  436. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +7 -4
  437. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +2 -3
  438. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +2 -2
  439. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  440. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/README +13 -0
  441. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +23 -8
  442. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +9 -6
  443. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +37 -12
  444. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +272 -33
  445. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +15 -9
  446. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +4 -1
  447. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +76 -20
  448. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +18 -9
  449. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +195 -23
  450. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +19 -12
  451. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +88 -1
  452. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +1 -1
  453. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +43 -17
  454. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +6 -3
  455. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +73 -24
  456. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +19 -4
  457. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +60 -107
  458. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +41 -12
  459. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +6 -3
  460. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +15 -8
  461. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +1 -1
  462. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +10 -5
  463. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +1 -1
  464. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -1
  465. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +59 -28
  466. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +127 -120
  467. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +129 -59
  468. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +111 -14
  469. package/deps/rocksdb/rocksdb.gyp +6 -2
  470. package/index.js +0 -8
  471. package/package.json +1 -1
  472. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  473. package/prebuilds/linux-x64/node.napi.node +0 -0
  474. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +0 -7
  475. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +0 -29
  476. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +0 -29
  477. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +0 -29
  478. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +0 -33
  479. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +0 -29
  480. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +0 -29
  481. package/deps/rocksdb/rocksdb/cmake/modules/Finduring.cmake +0 -26
  482. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +0 -29
  483. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +0 -10
@@ -1,15 +1,22 @@
1
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
2
3
  // This source code is licensed under both the GPLv2 (found in the
3
4
  // COPYING file in the root directory) and Apache 2.0 License
4
5
  // (found in the LICENSE.Apache file in the root directory).
5
6
 
6
7
  #pragma once
8
+ #include <memory>
9
+ #include <optional>
7
10
  #include <sstream>
11
+ #include <unordered_map>
8
12
  #include <vector>
9
13
 
14
+ #include "db/write_batch_internal.h"
10
15
  #include "rocksdb/slice.h"
11
16
  #include "rocksdb/status.h"
17
+ #include "rocksdb/write_batch.h"
12
18
  #include "util/coding.h"
19
+ #include "util/hash_containers.h"
13
20
 
14
21
  namespace ROCKSDB_NAMESPACE {
15
22
 
@@ -74,4 +81,188 @@ class UserDefinedTimestampSizeRecord {
74
81
  std::vector<std::pair<uint32_t, size_t>> cf_to_ts_sz_;
75
82
  };
76
83
 
84
+ // This handler is used to recover a WriteBatch read from WAL logs during
85
+ // recovery. It does a best-effort recovery if the column families contained in
86
+ // the WriteBatch have inconsistency between the recorded timestamp size and the
87
+ // running timestamp size. And creates a new WriteBatch that are consistent with
88
+ // the running timestamp size with entries from the original WriteBatch.
89
+ //
90
+ // Note that for a WriteBatch with no inconsistency, a new WriteBatch is created
91
+ // nonetheless, and it should be exactly the same as the original WriteBatch.
92
+ //
93
+ // To access the new WriteBatch, invoke `TransferNewBatch` after calling
94
+ // `Iterate`. The handler becomes invalid afterwards.
95
+ //
96
+ // For the user key in each entry, the best effort recovery means:
97
+ // 1) If recorded timestamp size is 0, running timestamp size is > 0, a min
98
+ // timestamp of length running timestamp size is padded to the user key.
99
+ // 2) If recorded timestamp size is > 0, running timestamp size is 0, the last
100
+ // bytes of length recorded timestamp size is stripped from user key.
101
+ // 3) If recorded timestamp size is the same as running timestamp size, no-op.
102
+ // 4) If recorded timestamp size and running timestamp size are both non-zero
103
+ // but not equal, return Status::InvalidArgument.
104
+ class TimestampRecoveryHandler : public WriteBatch::Handler {
105
+ public:
106
+ TimestampRecoveryHandler(const UnorderedMap<uint32_t, size_t>& running_ts_sz,
107
+ const UnorderedMap<uint32_t, size_t>& record_ts_sz);
108
+
109
+ ~TimestampRecoveryHandler() override {}
110
+
111
+ // No copy or move.
112
+ TimestampRecoveryHandler(const TimestampRecoveryHandler&) = delete;
113
+ TimestampRecoveryHandler(TimestampRecoveryHandler&&) = delete;
114
+ TimestampRecoveryHandler& operator=(const TimestampRecoveryHandler&) = delete;
115
+ TimestampRecoveryHandler& operator=(TimestampRecoveryHandler&&) = delete;
116
+
117
+ Status PutCF(uint32_t cf, const Slice& key, const Slice& value) override;
118
+
119
+ Status DeleteCF(uint32_t cf, const Slice& key) override;
120
+
121
+ Status SingleDeleteCF(uint32_t cf, const Slice& key) override;
122
+
123
+ Status DeleteRangeCF(uint32_t cf, const Slice& begin_key,
124
+ const Slice& end_key) override;
125
+
126
+ Status MergeCF(uint32_t cf, const Slice& key, const Slice& value) override;
127
+
128
+ Status PutBlobIndexCF(uint32_t cf, const Slice& key,
129
+ const Slice& value) override;
130
+
131
+ Status MarkBeginPrepare(bool) override { return Status::OK(); }
132
+
133
+ Status MarkEndPrepare(const Slice&) override { return Status::OK(); }
134
+
135
+ Status MarkCommit(const Slice&) override { return Status::OK(); }
136
+
137
+ Status MarkCommitWithTimestamp(const Slice&, const Slice&) override {
138
+ return Status::OK();
139
+ }
140
+
141
+ Status MarkRollback(const Slice&) override { return Status::OK(); }
142
+
143
+ Status MarkNoop(bool /*empty_batch*/) override { return Status::OK(); }
144
+
145
+ std::unique_ptr<WriteBatch>&& TransferNewBatch() {
146
+ assert(new_batch_diff_from_orig_batch_);
147
+ handler_valid_ = false;
148
+ return std::move(new_batch_);
149
+ }
150
+
151
+ private:
152
+ Status ReconcileTimestampDiscrepancy(uint32_t cf, const Slice& key,
153
+ std::string* new_key_buf,
154
+ Slice* new_key);
155
+
156
+ // Mapping from column family id to user-defined timestamp size for all
157
+ // running column families including the ones with zero timestamp size.
158
+ const UnorderedMap<uint32_t, size_t>& running_ts_sz_;
159
+
160
+ // Mapping from column family id to user-defined timestamp size as recorded
161
+ // in the WAL. This only contains non-zero user-defined timestamp size.
162
+ const UnorderedMap<uint32_t, size_t>& record_ts_sz_;
163
+
164
+ std::unique_ptr<WriteBatch> new_batch_;
165
+ // Handler is valid upon creation and becomes invalid after its `new_batch_`
166
+ // is transferred.
167
+ bool handler_valid_;
168
+
169
+ // False upon creation, and become true if at least one user key from the
170
+ // original batch is updated when creating the new batch.
171
+ bool new_batch_diff_from_orig_batch_;
172
+ };
173
+
174
+ // Mode for checking and handling timestamp size inconsistency encountered in a
175
+ // WriteBatch read from WAL log.
176
+ enum class TimestampSizeConsistencyMode {
177
+ // Verified that the recorded user-defined timestamp size is consistent with
178
+ // the running one for all the column families involved in a WriteBatch.
179
+ // Column families referred to in the WriteBatch but are dropped are ignored.
180
+ kVerifyConsistency,
181
+ // Verified that if any inconsistency exists in a WriteBatch, it's all
182
+ // tolerable by a best-effort reconciliation. And optionally creates a new
183
+ // WriteBatch from the original WriteBatch that is consistent with the running
184
+ // timestamp size. Column families referred to in the WriteBatch but are
185
+ // dropped are ignored. If a new WriteBatch is created, such entries are
186
+ // copied over as is.
187
+ kReconcileInconsistency,
188
+ };
189
+
190
+ // Handles the inconsistency between recorded timestamp sizes and running
191
+ // timestamp sizes for a WriteBatch. A non-OK `status` indicates there are
192
+ // intolerable inconsistency with the specified `check_mode`.
193
+ //
194
+ // If `check_mode` is `kVerifyConsistency`, intolerable inconsistency means any
195
+ // running column family has an inconsistent user-defined timestamp size.
196
+ //
197
+ // If `check_mode` is `kReconcileInconsistency`, intolerable inconsistency means
198
+ // any running column family has an inconsistent user-defined timestamp size
199
+ // that cannot be reconciled with a best-effort recovery. Check
200
+ // `TimestampRecoveryHandler` for what a best-effort recovery is capable of. In
201
+ // this mode, output argument `new_batch` should be set, a new WriteBatch is
202
+ // created on the heap and transferred to `new_batch` if there is tolerable
203
+ // inconsistency.
204
+ //
205
+ // An invariant that WAL logging ensures is that all timestamp size info
206
+ // is logged prior to a WriteBatch that needed this info. And zero timestamp
207
+ // size is skipped. So `record_ts_sz` only contains column family with non-zero
208
+ // timestamp size and a column family id absent from `record_ts_sz` will be
209
+ // interpreted as that column family has zero timestamp size. On the other hand,
210
+ // `running_ts_sz` should contain the timestamp size for all running column
211
+ // families including the ones with zero timestamp size.
212
+ Status HandleWriteBatchTimestampSizeDifference(
213
+ const WriteBatch* batch,
214
+ const UnorderedMap<uint32_t, size_t>& running_ts_sz,
215
+ const UnorderedMap<uint32_t, size_t>& record_ts_sz,
216
+ TimestampSizeConsistencyMode check_mode,
217
+ std::unique_ptr<WriteBatch>* new_batch = nullptr);
218
+
219
+ // This util function is used when opening an existing column family and
220
+ // processing its VersionEdit. It does a sanity check for the column family's
221
+ // old user comparator and the persist_user_defined_timestamps flag as recorded
222
+ // in the VersionEdit, against its new settings from the column family's
223
+ // ImmutableCFOptions.
224
+ //
225
+ // Valid settings change include:
226
+ // 1) no user comparator change and no effective persist_user_defined_timestamp
227
+ // flag change.
228
+ // 2) switch user comparator to enable user-defined timestamps feature provided
229
+ // the immediately effective persist_user_defined_timestamps flag is false.
230
+ // 3) switch user comparator to disable user-defined timestamps feature provided
231
+ // that the before-change persist_user_defined_timestamps is already false.
232
+ //
233
+ // Switch user comparator to disable/enable UDT is only sanity checked by a user
234
+ // comparator name comparison. The full check includes enforcing the new user
235
+ // comparator ranks user keys exactly the same as the old user comparator and
236
+ // only add / remove the user-defined timestamp comparison. We don't have ways
237
+ // to strictly enforce this so currently only the RocksDB builtin comparator
238
+ // wrapper `ComparatorWithU64TsImpl` is supported to enable / disable
239
+ // user-defined timestamps. It formats user-defined timestamps as uint64_t.
240
+ //
241
+ // When the settings indicate a legit change to enable user-defined timestamps
242
+ // feature on a column family, `mark_sst_files_has_no_udt` will be set to true
243
+ // to indicate marking all existing SST files has no user-defined timestamps
244
+ // when re-writing the manifest.
245
+ Status ValidateUserDefinedTimestampsOptions(
246
+ const Comparator* new_comparator, const std::string& old_comparator_name,
247
+ bool new_persist_udt, bool old_persist_udt,
248
+ bool* mark_sst_files_has_no_udt);
249
+
250
+ // Given a cutoff user-defined timestamp formatted as uint64_t, get the
251
+ // effective `full_history_ts_low` timestamp, which is the next immediately
252
+ // bigger timestamp. Used by the UDT in memtable only feature when flushing
253
+ // memtables and remove timestamps. This process collapses history and increase
254
+ // the effective `full_history_ts_low`.
255
+ void GetFullHistoryTsLowFromU64CutoffTs(Slice* cutoff_ts,
256
+ std::string* full_history_ts_low);
257
+
258
+ // `start` is the inclusive lower user key bound without user-defined timestamp.
259
+ // `end` is the upper user key bound without user-defined timestamp.
260
+ // By default, `end` is treated as being exclusive. If `exclusive_end` is set to
261
+ // false, it's treated as an inclusive upper bound.
262
+ // If any of these two bounds is nullptr, an empty std::optional<Slice> is
263
+ // returned for that bound.
264
+ std::tuple<std::optional<Slice>, std::optional<Slice>>
265
+ MaybeAddTimestampsToRange(const Slice* start, const Slice* end, size_t ts_sz,
266
+ std::string* start_with_ts, std::string* end_with_ts,
267
+ bool exclusive_end = true);
77
268
  } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,461 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #include "util/udt_util.h"
8
+
9
+ #include <gtest/gtest.h>
10
+
11
+ #include "db/dbformat.h"
12
+ #include "test_util/testharness.h"
13
+ #include "test_util/testutil.h"
14
+
15
+ namespace ROCKSDB_NAMESPACE {
16
+ namespace {
17
+ static const std::string kTestKeyWithoutTs = "key";
18
+ static const std::string kValuePlaceHolder = "value";
19
+ } // namespace
20
+
21
+ class HandleTimestampSizeDifferenceTest : public testing::Test {
22
+ public:
23
+ HandleTimestampSizeDifferenceTest() {}
24
+
25
+ // Test handler used to collect the column family id and user keys contained
26
+ // in a WriteBatch for test verification. And verifies the value part stays
27
+ // the same if it's available.
28
+ class KeyCollector : public WriteBatch::Handler {
29
+ public:
30
+ explicit KeyCollector() {}
31
+
32
+ ~KeyCollector() override {}
33
+
34
+ Status PutCF(uint32_t cf, const Slice& key, const Slice& value) override {
35
+ if (value.compare(kValuePlaceHolder) != 0) {
36
+ return Status::InvalidArgument();
37
+ }
38
+ return AddKey(cf, key);
39
+ }
40
+
41
+ Status DeleteCF(uint32_t cf, const Slice& key) override {
42
+ return AddKey(cf, key);
43
+ }
44
+
45
+ Status SingleDeleteCF(uint32_t cf, const Slice& key) override {
46
+ return AddKey(cf, key);
47
+ }
48
+
49
+ Status DeleteRangeCF(uint32_t cf, const Slice& begin_key,
50
+ const Slice& end_key) override {
51
+ Status status = AddKey(cf, begin_key);
52
+ if (!status.ok()) {
53
+ return status;
54
+ }
55
+ return AddKey(cf, end_key);
56
+ }
57
+
58
+ Status MergeCF(uint32_t cf, const Slice& key, const Slice& value) override {
59
+ if (value.compare(kValuePlaceHolder) != 0) {
60
+ return Status::InvalidArgument();
61
+ }
62
+ return AddKey(cf, key);
63
+ }
64
+
65
+ Status PutBlobIndexCF(uint32_t cf, const Slice& key,
66
+ const Slice& value) override {
67
+ if (value.compare(kValuePlaceHolder) != 0) {
68
+ return Status::InvalidArgument();
69
+ }
70
+ return AddKey(cf, key);
71
+ }
72
+
73
+ Status MarkBeginPrepare(bool) override { return Status::OK(); }
74
+
75
+ Status MarkEndPrepare(const Slice&) override { return Status::OK(); }
76
+
77
+ Status MarkRollback(const Slice&) override { return Status::OK(); }
78
+
79
+ Status MarkCommit(const Slice&) override { return Status::OK(); }
80
+
81
+ Status MarkCommitWithTimestamp(const Slice&, const Slice&) override {
82
+ return Status::OK();
83
+ }
84
+
85
+ Status MarkNoop(bool) override { return Status::OK(); }
86
+
87
+ const std::vector<std::pair<uint32_t, const Slice>>& GetKeys() const {
88
+ return keys_;
89
+ }
90
+
91
+ private:
92
+ Status AddKey(uint32_t cf, const Slice& key) {
93
+ keys_.push_back(std::make_pair(cf, key));
94
+ return Status::OK();
95
+ }
96
+ std::vector<std::pair<uint32_t, const Slice>> keys_;
97
+ };
98
+
99
+ void CreateKey(std::string* key_buf, size_t ts_sz) {
100
+ if (ts_sz > 0) {
101
+ AppendKeyWithMinTimestamp(key_buf, kTestKeyWithoutTs, ts_sz);
102
+ } else {
103
+ key_buf->assign(kTestKeyWithoutTs);
104
+ }
105
+ }
106
+
107
+ void CreateWriteBatch(const UnorderedMap<uint32_t, size_t>& ts_sz_for_batch,
108
+ WriteBatch* batch) {
109
+ for (const auto& [cf_id, ts_sz] : ts_sz_for_batch) {
110
+ std::string key;
111
+ CreateKey(&key, ts_sz);
112
+ ASSERT_OK(WriteBatchInternal::Put(batch, cf_id, key, kValuePlaceHolder));
113
+ ASSERT_OK(WriteBatchInternal::Delete(batch, cf_id, key));
114
+ ASSERT_OK(WriteBatchInternal::SingleDelete(batch, cf_id, key));
115
+ ASSERT_OK(WriteBatchInternal::DeleteRange(batch, cf_id, key, key));
116
+ ASSERT_OK(
117
+ WriteBatchInternal::Merge(batch, cf_id, key, kValuePlaceHolder));
118
+ ASSERT_OK(WriteBatchInternal::PutBlobIndex(batch, cf_id, key,
119
+ kValuePlaceHolder));
120
+ }
121
+ }
122
+
123
+ void CheckSequenceEqual(const WriteBatch& orig_batch,
124
+ const WriteBatch& new_batch) {
125
+ ASSERT_EQ(WriteBatchInternal::Sequence(&orig_batch),
126
+ WriteBatchInternal::Sequence(&new_batch));
127
+ }
128
+ void CheckCountEqual(const WriteBatch& orig_batch,
129
+ const WriteBatch& new_batch) {
130
+ ASSERT_EQ(WriteBatchInternal::Count(&orig_batch),
131
+ WriteBatchInternal::Count(&new_batch));
132
+ }
133
+
134
+ void VerifyKeys(
135
+ const std::vector<std::pair<uint32_t, const Slice>>& keys_with_ts,
136
+ const std::vector<std::pair<uint32_t, const Slice>>& keys_without_ts,
137
+ size_t ts_sz, std::optional<uint32_t> dropped_cf) {
138
+ ASSERT_EQ(keys_with_ts.size(), keys_without_ts.size());
139
+ const std::string kTsMin(ts_sz, static_cast<unsigned char>(0));
140
+ for (size_t i = 0; i < keys_with_ts.size(); i++) {
141
+ // TimestampRecoveryHandler ignores dropped column family and copy it over
142
+ // as is. Check the keys stay the same.
143
+ if (dropped_cf.has_value() &&
144
+ keys_with_ts[i].first == dropped_cf.value()) {
145
+ ASSERT_EQ(keys_with_ts[i].first, keys_without_ts[i].first);
146
+ ASSERT_EQ(keys_with_ts[i].second, keys_without_ts[i].second);
147
+ continue;
148
+ }
149
+ const Slice& key_with_ts = keys_with_ts[i].second;
150
+ const Slice& key_without_ts = keys_without_ts[i].second;
151
+ ASSERT_TRUE(key_with_ts.starts_with(key_without_ts));
152
+ ASSERT_EQ(key_with_ts.size() - key_without_ts.size(), ts_sz);
153
+ ASSERT_TRUE(key_with_ts.ends_with(kTsMin));
154
+ }
155
+ }
156
+
157
+ void CheckContentsWithTimestampStripping(const WriteBatch& orig_batch,
158
+ const WriteBatch& new_batch,
159
+ size_t ts_sz,
160
+ std::optional<uint32_t> dropped_cf) {
161
+ CheckSequenceEqual(orig_batch, new_batch);
162
+ CheckCountEqual(orig_batch, new_batch);
163
+ KeyCollector collector_for_orig_batch;
164
+ ASSERT_OK(orig_batch.Iterate(&collector_for_orig_batch));
165
+ KeyCollector collector_for_new_batch;
166
+ ASSERT_OK(new_batch.Iterate(&collector_for_new_batch));
167
+ VerifyKeys(collector_for_orig_batch.GetKeys(),
168
+ collector_for_new_batch.GetKeys(), ts_sz, dropped_cf);
169
+ }
170
+
171
+ void CheckContentsWithTimestampPadding(const WriteBatch& orig_batch,
172
+ const WriteBatch& new_batch,
173
+ size_t ts_sz) {
174
+ CheckSequenceEqual(orig_batch, new_batch);
175
+ CheckCountEqual(orig_batch, new_batch);
176
+ KeyCollector collector_for_orig_batch;
177
+ ASSERT_OK(orig_batch.Iterate(&collector_for_orig_batch));
178
+ KeyCollector collector_for_new_batch;
179
+ ASSERT_OK(new_batch.Iterate(&collector_for_new_batch));
180
+ VerifyKeys(collector_for_new_batch.GetKeys(),
181
+ collector_for_orig_batch.GetKeys(), ts_sz,
182
+ std::nullopt /* dropped_cf */);
183
+ }
184
+ };
185
+
186
+ TEST_F(HandleTimestampSizeDifferenceTest, AllColumnFamiliesConsistent) {
187
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)},
188
+ {2, 0}};
189
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
190
+ WriteBatch batch;
191
+ CreateWriteBatch(running_ts_sz, &batch);
192
+
193
+ // All `check_mode` pass with OK status and `batch` not checked or updated.
194
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
195
+ &batch, running_ts_sz, record_ts_sz,
196
+ TimestampSizeConsistencyMode::kVerifyConsistency));
197
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
198
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
199
+ &batch, running_ts_sz, record_ts_sz,
200
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
201
+ ASSERT_TRUE(new_batch.get() == nullptr);
202
+ }
203
+
204
+ TEST_F(HandleTimestampSizeDifferenceTest,
205
+ AllInconsistentColumnFamiliesDropped) {
206
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{2, 0}};
207
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)},
208
+ {3, sizeof(char)}};
209
+ WriteBatch batch;
210
+ CreateWriteBatch(record_ts_sz, &batch);
211
+
212
+ // All `check_mode` pass with OK status and `batch` not checked or updated.
213
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
214
+ &batch, running_ts_sz, record_ts_sz,
215
+ TimestampSizeConsistencyMode::kVerifyConsistency));
216
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
217
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
218
+ &batch, running_ts_sz, record_ts_sz,
219
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
220
+ ASSERT_TRUE(new_batch.get() == nullptr);
221
+ }
222
+
223
+ TEST_F(HandleTimestampSizeDifferenceTest, InvolvedColumnFamiliesConsistent) {
224
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)},
225
+ {2, sizeof(char)}};
226
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
227
+ WriteBatch batch;
228
+ CreateWriteBatch(record_ts_sz, &batch);
229
+
230
+ // All `check_mode` pass with OK status and `batch` not updated.
231
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
232
+ &batch, running_ts_sz, record_ts_sz,
233
+ TimestampSizeConsistencyMode::kVerifyConsistency));
234
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
235
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
236
+ &batch, running_ts_sz, record_ts_sz,
237
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
238
+ ASSERT_TRUE(new_batch.get() == nullptr);
239
+ }
240
+
241
+ TEST_F(HandleTimestampSizeDifferenceTest,
242
+ InconsistentColumnFamilyNeedsTimestampStripping) {
243
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, 0}, {2, sizeof(char)}};
244
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
245
+ WriteBatch batch;
246
+ CreateWriteBatch(record_ts_sz, &batch);
247
+
248
+ // kVerifyConsistency doesn't tolerate inconsistency for running column
249
+ // families.
250
+ ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
251
+ &batch, running_ts_sz, record_ts_sz,
252
+ TimestampSizeConsistencyMode::kVerifyConsistency)
253
+ .IsInvalidArgument());
254
+
255
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
256
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
257
+ &batch, running_ts_sz, record_ts_sz,
258
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
259
+ ASSERT_TRUE(new_batch.get() != nullptr);
260
+ CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
261
+ std::nullopt /* dropped_cf */);
262
+ }
263
+
264
+ TEST_F(HandleTimestampSizeDifferenceTest,
265
+ InconsistentColumnFamilyNeedsTimestampPadding) {
266
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(uint64_t)}};
267
+ // Make `record_ts_sz` not contain zero timestamp size entries to follow the
268
+ // behavior of actual WAL log timestamp size record.
269
+ UnorderedMap<uint32_t, size_t> record_ts_sz;
270
+ WriteBatch batch;
271
+ CreateWriteBatch({{1, 0}}, &batch);
272
+
273
+ // kVerifyConsistency doesn't tolerate inconsistency for running column
274
+ // families.
275
+ ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
276
+ &batch, running_ts_sz, record_ts_sz,
277
+ TimestampSizeConsistencyMode::kVerifyConsistency)
278
+ .IsInvalidArgument());
279
+
280
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
281
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
282
+ &batch, running_ts_sz, record_ts_sz,
283
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
284
+ ASSERT_TRUE(new_batch.get() != nullptr);
285
+ CheckContentsWithTimestampPadding(batch, *new_batch, sizeof(uint64_t));
286
+ }
287
+
288
+ TEST_F(HandleTimestampSizeDifferenceTest,
289
+ InconsistencyReconcileCopyOverDroppedColumnFamily) {
290
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, 0}};
291
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)},
292
+ {2, sizeof(char)}};
293
+ WriteBatch batch;
294
+ CreateWriteBatch(record_ts_sz, &batch);
295
+ std::unique_ptr<WriteBatch> new_batch(nullptr);
296
+
297
+ // kReconcileInconsistency tolerate inconsistency for dropped column family
298
+ // and all related entries copied over to the new WriteBatch.
299
+ ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
300
+ &batch, running_ts_sz, record_ts_sz,
301
+ TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
302
+
303
+ ASSERT_TRUE(new_batch.get() != nullptr);
304
+ CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
305
+ std::optional<uint32_t>(2));
306
+ }
307
+
308
+ TEST_F(HandleTimestampSizeDifferenceTest, UnrecoverableInconsistency) {
309
+ UnorderedMap<uint32_t, size_t> running_ts_sz = {{1, sizeof(char)}};
310
+ UnorderedMap<uint32_t, size_t> record_ts_sz = {{1, sizeof(uint64_t)}};
311
+ WriteBatch batch;
312
+ CreateWriteBatch(record_ts_sz, &batch);
313
+
314
+ ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
315
+ &batch, running_ts_sz, record_ts_sz,
316
+ TimestampSizeConsistencyMode::kVerifyConsistency)
317
+ .IsInvalidArgument());
318
+
319
+ ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
320
+ &batch, running_ts_sz, record_ts_sz,
321
+ TimestampSizeConsistencyMode::kReconcileInconsistency)
322
+ .IsInvalidArgument());
323
+ }
324
+
325
+ TEST(ValidateUserDefinedTimestampsOptionsTest, EnableUserDefinedTimestamps) {
326
+ bool mark_sst_files = false;
327
+ const Comparator* new_comparator = test::BytewiseComparatorWithU64TsWrapper();
328
+ const Comparator* old_comparator = BytewiseComparator();
329
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
330
+ new_comparator, std::string(old_comparator->Name()),
331
+ false /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
332
+ ASSERT_TRUE(mark_sst_files);
333
+
334
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
335
+ new_comparator, std::string(old_comparator->Name()),
336
+ false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
337
+ ASSERT_TRUE(mark_sst_files);
338
+ }
339
+
340
+ TEST(ValidateUserDefinedTimestampsOptionsTest,
341
+ EnableUserDefinedTimestampsNewPersistUDTFlagIncorrect) {
342
+ bool mark_sst_files = false;
343
+ const Comparator* new_comparator = test::BytewiseComparatorWithU64TsWrapper();
344
+ const Comparator* old_comparator = BytewiseComparator();
345
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
346
+ new_comparator, std::string(old_comparator->Name()),
347
+ true /*new_persist_udt*/, true /*old_persist_udt*/,
348
+ &mark_sst_files)
349
+ .IsInvalidArgument());
350
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
351
+ new_comparator, std::string(old_comparator->Name()),
352
+ true /*new_persist_udt*/, false /*old_persist_udt*/,
353
+ &mark_sst_files)
354
+ .IsInvalidArgument());
355
+ }
356
+
357
+ TEST(ValidateUserDefinedTimestampsOptionsTest, DisableUserDefinedTimestamps) {
358
+ bool mark_sst_files = false;
359
+ const Comparator* new_comparator = ReverseBytewiseComparator();
360
+ const Comparator* old_comparator =
361
+ test::ReverseBytewiseComparatorWithU64TsWrapper();
362
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
363
+ new_comparator, std::string(old_comparator->Name()),
364
+ false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
365
+ ASSERT_FALSE(mark_sst_files);
366
+
367
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
368
+ new_comparator, std::string(old_comparator->Name()),
369
+ true /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
370
+ ASSERT_FALSE(mark_sst_files);
371
+ }
372
+
373
+ TEST(ValidateUserDefinedTimestampsOptionsTest,
374
+ DisableUserDefinedTimestampsOldPersistUDTFlagIncorrect) {
375
+ bool mark_sst_files = false;
376
+ const Comparator* new_comparator = BytewiseComparator();
377
+ const Comparator* old_comparator = test::BytewiseComparatorWithU64TsWrapper();
378
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
379
+ new_comparator, std::string(old_comparator->Name()),
380
+ false /*new_persist_udt*/, true /*old_persist_udt*/,
381
+ &mark_sst_files)
382
+ .IsInvalidArgument());
383
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
384
+ new_comparator, std::string(old_comparator->Name()),
385
+ true /*new_persist_udt*/, true /*old_persist_udt*/,
386
+ &mark_sst_files)
387
+ .IsInvalidArgument());
388
+ }
389
+
390
+ TEST(ValidateUserDefinedTimestampsOptionsTest, UserComparatorUnchanged) {
391
+ bool mark_sst_files = false;
392
+ const Comparator* ucmp_without_ts = BytewiseComparator();
393
+ const Comparator* ucmp_with_ts = test::BytewiseComparatorWithU64TsWrapper();
394
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
395
+ ucmp_without_ts, std::string(ucmp_without_ts->Name()),
396
+ false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
397
+ ASSERT_FALSE(mark_sst_files);
398
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
399
+ ucmp_without_ts, std::string(ucmp_without_ts->Name()),
400
+ true /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
401
+ ASSERT_FALSE(mark_sst_files);
402
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
403
+ ucmp_without_ts, std::string(ucmp_without_ts->Name()),
404
+ true /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
405
+ ASSERT_FALSE(mark_sst_files);
406
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
407
+ ucmp_without_ts, std::string(ucmp_without_ts->Name()),
408
+ false /*new_persist_udt*/, true /*old_persist_udt*/, &mark_sst_files));
409
+ ASSERT_FALSE(mark_sst_files);
410
+
411
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
412
+ ucmp_with_ts, std::string(ucmp_with_ts->Name()), true /*new_persist_udt*/,
413
+ true /*old_persist_udt*/, &mark_sst_files));
414
+ ASSERT_FALSE(mark_sst_files);
415
+ ASSERT_OK(ValidateUserDefinedTimestampsOptions(
416
+ ucmp_with_ts, std::string(ucmp_with_ts->Name()),
417
+ false /*new_persist_udt*/, false /*old_persist_udt*/, &mark_sst_files));
418
+ ASSERT_FALSE(mark_sst_files);
419
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
420
+ ucmp_with_ts, std::string(ucmp_with_ts->Name()),
421
+ true /*new_persist_udt*/, false /*old_persist_udt*/,
422
+ &mark_sst_files)
423
+ .IsInvalidArgument());
424
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
425
+ ucmp_with_ts, std::string(ucmp_with_ts->Name()),
426
+ false /*new_persist_udt*/, true /*old_persist_udt*/,
427
+ &mark_sst_files)
428
+ .IsInvalidArgument());
429
+ }
430
+
431
+ TEST(ValidateUserDefinedTimestampsOptionsTest, InvalidUserComparatorChange) {
432
+ bool mark_sst_files = false;
433
+ const Comparator* new_comparator = BytewiseComparator();
434
+ const Comparator* old_comparator = ReverseBytewiseComparator();
435
+ ASSERT_TRUE(ValidateUserDefinedTimestampsOptions(
436
+ new_comparator, std::string(old_comparator->Name()),
437
+ false /*new_persist_udt*/, true /*old_persist_udt*/,
438
+ &mark_sst_files)
439
+ .IsInvalidArgument());
440
+ }
441
+
442
+ TEST(GetFullHistoryTsLowFromU64CutoffTsTest, Success) {
443
+ std::string cutoff_ts;
444
+ uint64_t cutoff_ts_int = 3;
445
+ PutFixed64(&cutoff_ts, 3);
446
+ Slice cutoff_ts_slice = cutoff_ts;
447
+ std::string actual_full_history_ts_low;
448
+ GetFullHistoryTsLowFromU64CutoffTs(&cutoff_ts_slice,
449
+ &actual_full_history_ts_low);
450
+
451
+ std::string expected_ts_low;
452
+ PutFixed64(&expected_ts_low, cutoff_ts_int + 1);
453
+ ASSERT_EQ(expected_ts_low, actual_full_history_ts_low);
454
+ }
455
+ } // namespace ROCKSDB_NAMESPACE
456
+
457
+ int main(int argc, char** argv) {
458
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
459
+ ::testing::InitGoogleTest(&argc, argv);
460
+ return RUN_ALL_TESTS();
461
+ }