@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
@@ -168,46 +168,113 @@ inline void UnPackSequenceAndType(uint64_t packed, uint64_t* seq,
168
168
  EntryType GetEntryType(ValueType value_type);
169
169
 
170
170
  // Append the serialization of "key" to *result.
171
- extern void AppendInternalKey(std::string* result,
172
- const ParsedInternalKey& key);
171
+ //
172
+ // input [internal key]: <user_key | seqno + type>
173
+ // output before: empty
174
+ // output: <user_key | seqno + type>
175
+ void AppendInternalKey(std::string* result, const ParsedInternalKey& key);
173
176
 
174
177
  // Append the serialization of "key" to *result, replacing the original
175
178
  // timestamp with argument ts.
176
- extern void AppendInternalKeyWithDifferentTimestamp(
177
- std::string* result, const ParsedInternalKey& key, const Slice& ts);
179
+ //
180
+ // input [internal key]: <user_provided_key | original_ts | seqno + type>
181
+ // output before: empty
182
+ // output after: <user_provided_key | ts | seqno + type>
183
+ void AppendInternalKeyWithDifferentTimestamp(std::string* result,
184
+ const ParsedInternalKey& key,
185
+ const Slice& ts);
178
186
 
179
187
  // Serialized internal key consists of user key followed by footer.
180
188
  // This function appends the footer to *result, assuming that *result already
181
189
  // contains the user key at the end.
182
- extern void AppendInternalKeyFooter(std::string* result, SequenceNumber s,
183
- ValueType t);
190
+ //
191
+ // output before: <user_key>
192
+ // output after: <user_key | seqno + type>
193
+ void AppendInternalKeyFooter(std::string* result, SequenceNumber s,
194
+ ValueType t);
184
195
 
185
196
  // Append the key and a minimal timestamp to *result
186
- extern void AppendKeyWithMinTimestamp(std::string* result, const Slice& key,
187
- size_t ts_sz);
197
+ //
198
+ // input [user key without ts]: <user_provided_key>
199
+ // output before: empty
200
+ // output after: <user_provided_key | min_ts>
201
+ void AppendKeyWithMinTimestamp(std::string* result, const Slice& key,
202
+ size_t ts_sz);
188
203
 
189
204
  // Append the key and a maximal timestamp to *result
190
- extern void AppendKeyWithMaxTimestamp(std::string* result, const Slice& key,
191
- size_t ts_sz);
205
+ //
206
+ // input [user key without ts]: <user_provided_key>
207
+ // output before: empty
208
+ // output after: <user_provided_key | max_ts>
209
+ void AppendKeyWithMaxTimestamp(std::string* result, const Slice& key,
210
+ size_t ts_sz);
211
+
212
+ // `key` is a user key with timestamp. Append the user key without timestamp
213
+ // and the minimum timestamp to *result.
214
+ //
215
+ // input [user key]: <user_provided_key | original_ts>
216
+ // output before: empty
217
+ // output after: <user_provided_key | min_ts>
218
+ void AppendUserKeyWithMinTimestamp(std::string* result, const Slice& key,
219
+ size_t ts_sz);
192
220
 
193
221
  // `key` is a user key with timestamp. Append the user key without timestamp
194
222
  // and the maximal timestamp to *result.
195
- extern void AppendUserKeyWithMaxTimestamp(std::string* result, const Slice& key,
196
- size_t ts_sz);
223
+ //
224
+ // input [user key]: <user_provided_key | original_ts>
225
+ // output before: empty
226
+ // output after: <user_provided_key | max_ts>
227
+ void AppendUserKeyWithMaxTimestamp(std::string* result, const Slice& key,
228
+ size_t ts_sz);
229
+
230
+ // `key` is an internal key containing a user key without timestamp. Create a
231
+ // new key in *result by padding a min timestamp of size `ts_sz` to the user key
232
+ // and copying the remaining internal key bytes.
233
+ //
234
+ // input [internal key]: <user_provided_key | seqno + type>
235
+ // output before: empty
236
+ // output after: <user_provided_key | min_ts | seqno + type>
237
+ void PadInternalKeyWithMinTimestamp(std::string* result, const Slice& key,
238
+ size_t ts_sz);
239
+
240
+ // `key` is an internal key containing a user key with timestamp of size
241
+ // `ts_sz`. Create a new internal key in *result by stripping the timestamp from
242
+ // the user key and copying the remaining internal key bytes.
243
+ //
244
+ // input [internal key]: <user_provided_key | original_ts | seqno + type>
245
+ // output before: empty
246
+ // output after: <user_provided_key | seqno + type>
247
+ void StripTimestampFromInternalKey(std::string* result, const Slice& key,
248
+ size_t ts_sz);
249
+
250
+ // `key` is an internal key containing a user key with timestamp of size
251
+ // `ts_sz`. Create a new internal key in *result while replace the original
252
+ // timestamp with min timestamp.
253
+ //
254
+ // input [internal key]: <user_provided_key | original_ts | seqno + type>
255
+ // output before: empty
256
+ // output after: <user_provided_key | min_ts | seqno + type>
257
+ void ReplaceInternalKeyWithMinTimestamp(std::string* result, const Slice& key,
258
+ size_t ts_sz);
197
259
 
198
260
  // Attempt to parse an internal key from "internal_key". On success,
199
261
  // stores the parsed data in "*result", and returns true.
200
262
  //
201
263
  // On error, returns false, leaves "*result" in an undefined state.
202
- extern Status ParseInternalKey(const Slice& internal_key,
203
- ParsedInternalKey* result, bool log_err_key);
264
+ Status ParseInternalKey(const Slice& internal_key, ParsedInternalKey* result,
265
+ bool log_err_key);
204
266
 
205
267
  // Returns the user key portion of an internal key.
268
+ //
269
+ // input [internal key]: <user_key | seqno + type>
270
+ // output: <user_key>
206
271
  inline Slice ExtractUserKey(const Slice& internal_key) {
207
272
  assert(internal_key.size() >= kNumInternalBytes);
208
273
  return Slice(internal_key.data(), internal_key.size() - kNumInternalBytes);
209
274
  }
210
275
 
276
+ // input [internal key]: <user_provided_key | ts | seqno + type>
277
+ // output : <user_provided_key>
211
278
  inline Slice ExtractUserKeyAndStripTimestamp(const Slice& internal_key,
212
279
  size_t ts_sz) {
213
280
  Slice ret = internal_key;
@@ -215,17 +282,23 @@ inline Slice ExtractUserKeyAndStripTimestamp(const Slice& internal_key,
215
282
  return ret;
216
283
  }
217
284
 
285
+ // input [user key]: <user_provided_key | ts>
286
+ // output: <user_provided_key>
218
287
  inline Slice StripTimestampFromUserKey(const Slice& user_key, size_t ts_sz) {
219
288
  Slice ret = user_key;
220
289
  ret.remove_suffix(ts_sz);
221
290
  return ret;
222
291
  }
223
292
 
293
+ // input [user key]: <user_provided_key | ts>
294
+ // output: <ts>
224
295
  inline Slice ExtractTimestampFromUserKey(const Slice& user_key, size_t ts_sz) {
225
296
  assert(user_key.size() >= ts_sz);
226
297
  return Slice(user_key.data() + user_key.size() - ts_sz, ts_sz);
227
298
  }
228
299
 
300
+ // input [internal key]: <user_provided_key | ts | seqno + type>
301
+ // output: <ts>
229
302
  inline Slice ExtractTimestampFromKey(const Slice& internal_key, size_t ts_sz) {
230
303
  const size_t key_size = internal_key.size();
231
304
  assert(key_size >= kNumInternalBytes + ts_sz);
@@ -233,12 +306,16 @@ inline Slice ExtractTimestampFromKey(const Slice& internal_key, size_t ts_sz) {
233
306
  ts_sz);
234
307
  }
235
308
 
309
+ // input [internal key]: <user_provided_key | ts | seqno + type>
310
+ // output: <seqno + type>
236
311
  inline uint64_t ExtractInternalKeyFooter(const Slice& internal_key) {
237
312
  assert(internal_key.size() >= kNumInternalBytes);
238
313
  const size_t n = internal_key.size();
239
314
  return DecodeFixed64(internal_key.data() + n - kNumInternalBytes);
240
315
  }
241
316
 
317
+ // input [internal key]: <user_provided_key | ts | seqno + type>
318
+ // output: <type>
242
319
  inline ValueType ExtractValueType(const Slice& internal_key) {
243
320
  uint64_t num = ExtractInternalKeyFooter(internal_key);
244
321
  unsigned char c = num & 0xff;
@@ -504,6 +581,62 @@ class IterKey {
504
581
  key_size_ = total_size;
505
582
  }
506
583
 
584
+ // A version of `TrimAppend` assuming the last bytes of length `ts_sz` in the
585
+ // user key part of `key_` is not counted towards shared bytes. And the
586
+ // decoded key needed a min timestamp of length `ts_sz` pad to the user key.
587
+ void TrimAppendWithTimestamp(const size_t shared_len,
588
+ const char* non_shared_data,
589
+ const size_t non_shared_len,
590
+ const size_t ts_sz) {
591
+ std::string kTsMin(ts_sz, static_cast<unsigned char>(0));
592
+ std::string key_with_ts;
593
+ std::vector<Slice> key_parts_with_ts;
594
+ if (IsUserKey()) {
595
+ key_parts_with_ts = {Slice(key_, shared_len),
596
+ Slice(non_shared_data, non_shared_len),
597
+ Slice(kTsMin)};
598
+ } else {
599
+ assert(shared_len + non_shared_len >= kNumInternalBytes);
600
+ // Invaraint: shared_user_key_len + shared_internal_bytes_len = shared_len
601
+ // In naming below `*_len` variables, keyword `user_key` refers to the
602
+ // user key part of the existing key in `key_` as apposed to the new key.
603
+ // Similary, `internal_bytes` refers to the footer part of the existing
604
+ // key. These bytes potentially will move between user key part and the
605
+ // footer part in the new key.
606
+ const size_t user_key_len = key_size_ - kNumInternalBytes;
607
+ const size_t sharable_user_key_len = user_key_len - ts_sz;
608
+ const size_t shared_user_key_len =
609
+ std::min(shared_len, sharable_user_key_len);
610
+ const size_t shared_internal_bytes_len = shared_len - shared_user_key_len;
611
+
612
+ // One Slice among the three Slices will get split into two Slices, plus
613
+ // a timestamp slice.
614
+ key_parts_with_ts.reserve(5);
615
+ bool ts_added = false;
616
+ // Add slice parts and find the right location to add the min timestamp.
617
+ MaybeAddKeyPartsWithTimestamp(
618
+ key_, shared_user_key_len,
619
+ shared_internal_bytes_len + non_shared_len < kNumInternalBytes,
620
+ shared_len + non_shared_len - kNumInternalBytes, kTsMin,
621
+ key_parts_with_ts, &ts_added);
622
+ MaybeAddKeyPartsWithTimestamp(
623
+ key_ + user_key_len, shared_internal_bytes_len,
624
+ non_shared_len < kNumInternalBytes,
625
+ shared_internal_bytes_len + non_shared_len - kNumInternalBytes,
626
+ kTsMin, key_parts_with_ts, &ts_added);
627
+ MaybeAddKeyPartsWithTimestamp(non_shared_data, non_shared_len,
628
+ non_shared_len >= kNumInternalBytes,
629
+ non_shared_len - kNumInternalBytes, kTsMin,
630
+ key_parts_with_ts, &ts_added);
631
+ assert(ts_added);
632
+ }
633
+
634
+ Slice new_key(SliceParts(&key_parts_with_ts.front(),
635
+ static_cast<int>(key_parts_with_ts.size())),
636
+ &key_with_ts);
637
+ SetKey(new_key);
638
+ }
639
+
507
640
  Slice SetKey(const Slice& key, bool copy = true) {
508
641
  // is_user_key_ expected to be set already via SetIsUserKey
509
642
  return SetKeyImpl(key, copy);
@@ -620,7 +753,7 @@ class IterKey {
620
753
  const char* key_;
621
754
  size_t key_size_;
622
755
  size_t buf_size_;
623
- char space_[32]; // Avoid allocation for short keys
756
+ char space_[39]; // Avoid allocation for short keys
624
757
  bool is_user_key_;
625
758
 
626
759
  Slice SetKeyImpl(const Slice& key, bool copy) {
@@ -661,6 +794,23 @@ class IterKey {
661
794
  }
662
795
 
663
796
  void EnlargeBuffer(size_t key_size);
797
+
798
+ void MaybeAddKeyPartsWithTimestamp(const char* slice_data,
799
+ const size_t slice_sz, bool add_timestamp,
800
+ const size_t left_sz,
801
+ const std::string& min_timestamp,
802
+ std::vector<Slice>& key_parts,
803
+ bool* ts_added) {
804
+ if (add_timestamp && !*ts_added) {
805
+ assert(slice_sz >= left_sz);
806
+ key_parts.emplace_back(slice_data, left_sz);
807
+ key_parts.emplace_back(min_timestamp);
808
+ key_parts.emplace_back(slice_data + left_sz, slice_sz - left_sz);
809
+ *ts_added = true;
810
+ } else {
811
+ key_parts.emplace_back(slice_data, slice_sz);
812
+ }
813
+ }
664
814
  };
665
815
 
666
816
  // Convert from a SliceTransform of user keys, to a SliceTransform of
@@ -698,8 +848,7 @@ class InternalKeySliceTransform : public SliceTransform {
698
848
  // Read the key of a record from a write batch.
699
849
  // if this record represent the default column family then cf_record
700
850
  // must be passed as false, otherwise it must be passed as true.
701
- extern bool ReadKeyFromWriteBatchEntry(Slice* input, Slice* key,
702
- bool cf_record);
851
+ bool ReadKeyFromWriteBatchEntry(Slice* input, Slice* key, bool cf_record);
703
852
 
704
853
  // Read record from a write batch piece from input.
705
854
  // tag, column_family, key, value and blob are return values. Callers own the
@@ -708,9 +857,9 @@ extern bool ReadKeyFromWriteBatchEntry(Slice* input, Slice* key,
708
857
  // input will be advanced to after the record.
709
858
  // If user-defined timestamp is enabled for a column family, then the `key`
710
859
  // resulting from this call will include timestamp.
711
- extern Status ReadRecordFromWriteBatch(Slice* input, char* tag,
712
- uint32_t* column_family, Slice* key,
713
- Slice* value, Slice* blob, Slice* xid);
860
+ Status ReadRecordFromWriteBatch(Slice* input, char* tag,
861
+ uint32_t* column_family, Slice* key,
862
+ Slice* value, Slice* blob, Slice* xid);
714
863
 
715
864
  // When user call DeleteRange() to delete a range of keys,
716
865
  // we will store a serialized RangeTombstone in MemTable and SST.
@@ -178,6 +178,79 @@ TEST_F(FormatTest, IterKeyOperation) {
178
178
  "abcdefghijklmnopqrstuvwxyz"));
179
179
  }
180
180
 
181
+ TEST_F(FormatTest, IterKeyWithTimestampOperation) {
182
+ IterKey k;
183
+ k.SetUserKey("");
184
+ const char p[] = "abcdefghijklmnopqrstuvwxyz";
185
+ const char q[] = "0123456789";
186
+
187
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
188
+ std::string(""));
189
+
190
+ size_t ts_sz = 8;
191
+ std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
192
+ k.TrimAppendWithTimestamp(0, p, 3, ts_sz);
193
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
194
+ "abc" + min_timestamp);
195
+
196
+ k.TrimAppendWithTimestamp(1, p, 3, ts_sz);
197
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
198
+ "aabc" + min_timestamp);
199
+
200
+ k.TrimAppendWithTimestamp(0, p, 26, ts_sz);
201
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
202
+ "abcdefghijklmnopqrstuvwxyz" + min_timestamp);
203
+
204
+ k.TrimAppendWithTimestamp(26, q, 10, ts_sz);
205
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
206
+ "abcdefghijklmnopqrstuvwxyz0123456789" + min_timestamp);
207
+
208
+ k.TrimAppendWithTimestamp(36, q, 1, ts_sz);
209
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
210
+ "abcdefghijklmnopqrstuvwxyz01234567890" + min_timestamp);
211
+
212
+ k.TrimAppendWithTimestamp(26, q, 1, ts_sz);
213
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
214
+ "abcdefghijklmnopqrstuvwxyz0" + min_timestamp);
215
+
216
+ k.TrimAppendWithTimestamp(27, p, 26, ts_sz);
217
+ ASSERT_EQ(std::string(k.GetUserKey().data(), k.GetUserKey().size()),
218
+ "abcdefghijklmnopqrstuvwxyz0"
219
+ "abcdefghijklmnopqrstuvwxyz" +
220
+ min_timestamp);
221
+ // IterKey holds an internal key, the last 8 bytes hold the key footer, the
222
+ // timestamp is expected to be added before the key footer.
223
+ std::string key_without_ts = "keywithoutts";
224
+ k.SetInternalKey(key_without_ts + min_timestamp + "internal");
225
+
226
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
227
+ key_without_ts + min_timestamp + "internal");
228
+ k.TrimAppendWithTimestamp(0, p, 10, ts_sz);
229
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
230
+ "ab" + min_timestamp + "cdefghij");
231
+
232
+ k.TrimAppendWithTimestamp(1, p, 8, ts_sz);
233
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
234
+ "a" + min_timestamp + "abcdefgh");
235
+
236
+ k.TrimAppendWithTimestamp(9, p, 3, ts_sz);
237
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
238
+ "aabc" + min_timestamp + "defghabc");
239
+
240
+ k.TrimAppendWithTimestamp(10, q, 10, ts_sz);
241
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
242
+ "aabcdefgha01" + min_timestamp + "23456789");
243
+
244
+ k.TrimAppendWithTimestamp(20, q, 1, ts_sz);
245
+ ASSERT_EQ(std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
246
+ "aabcdefgha012" + min_timestamp + "34567890");
247
+
248
+ k.TrimAppendWithTimestamp(21, p, 26, ts_sz);
249
+ ASSERT_EQ(
250
+ std::string(k.GetInternalKey().data(), k.GetInternalKey().size()),
251
+ "aabcdefgha01234567890abcdefghijklmnopqr" + min_timestamp + "stuvwxyz");
252
+ }
253
+
181
254
  TEST_F(FormatTest, UpdateInternalKey) {
182
255
  std::string user_key("abcdefghijklmnopqrstuvwxyz");
183
256
  uint64_t new_seq = 0x123456;
@@ -204,6 +277,62 @@ TEST_F(FormatTest, RangeTombstoneSerializeEndKey) {
204
277
  ASSERT_LT(cmp.Compare(t.SerializeEndKey(), k), 0);
205
278
  }
206
279
 
280
+ TEST_F(FormatTest, PadInternalKeyWithMinTimestamp) {
281
+ std::string orig_user_key = "foo";
282
+ std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
283
+ size_t ts_sz = 8;
284
+
285
+ std::string key_buf;
286
+ PadInternalKeyWithMinTimestamp(&key_buf, orig_internal_key, ts_sz);
287
+ ParsedInternalKey key_with_timestamp;
288
+ Slice in(key_buf);
289
+ ASSERT_OK(ParseInternalKey(in, &key_with_timestamp, true /*log_err_key*/));
290
+
291
+ std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
292
+ ASSERT_EQ(orig_user_key + min_timestamp, key_with_timestamp.user_key);
293
+ ASSERT_EQ(100, key_with_timestamp.sequence);
294
+ ASSERT_EQ(kTypeValue, key_with_timestamp.type);
295
+ }
296
+
297
+ TEST_F(FormatTest, StripTimestampFromInternalKey) {
298
+ std::string orig_user_key = "foo";
299
+ size_t ts_sz = 8;
300
+ std::string timestamp(ts_sz, static_cast<unsigned char>(0));
301
+ orig_user_key.append(timestamp.data(), timestamp.size());
302
+ std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
303
+
304
+ std::string key_buf;
305
+ StripTimestampFromInternalKey(&key_buf, orig_internal_key, ts_sz);
306
+ ParsedInternalKey key_without_timestamp;
307
+ Slice in(key_buf);
308
+ ASSERT_OK(ParseInternalKey(in, &key_without_timestamp, true /*log_err_key*/));
309
+
310
+ ASSERT_EQ("foo", key_without_timestamp.user_key);
311
+ ASSERT_EQ(100, key_without_timestamp.sequence);
312
+ ASSERT_EQ(kTypeValue, key_without_timestamp.type);
313
+ }
314
+
315
+ TEST_F(FormatTest, ReplaceInternalKeyWithMinTimestamp) {
316
+ std::string orig_user_key = "foo";
317
+ size_t ts_sz = 8;
318
+ orig_user_key.append(ts_sz, static_cast<unsigned char>(1));
319
+ std::string orig_internal_key = IKey(orig_user_key, 100, kTypeValue);
320
+
321
+ std::string key_buf;
322
+ ReplaceInternalKeyWithMinTimestamp(&key_buf, orig_internal_key, ts_sz);
323
+ ParsedInternalKey new_key;
324
+ Slice in(key_buf);
325
+ ASSERT_OK(ParseInternalKey(in, &new_key, true /*log_err_key*/));
326
+
327
+ std::string min_timestamp(ts_sz, static_cast<unsigned char>(0));
328
+ size_t ukey_diff_offset = new_key.user_key.difference_offset(orig_user_key);
329
+ ASSERT_EQ(min_timestamp,
330
+ Slice(new_key.user_key.data() + ukey_diff_offset, ts_sz));
331
+ ASSERT_EQ(orig_user_key.size(), new_key.user_key.size());
332
+ ASSERT_EQ(100, new_key.sequence);
333
+ ASSERT_EQ(kTypeValue, new_key.type);
334
+ }
335
+
207
336
  } // namespace ROCKSDB_NAMESPACE
208
337
 
209
338
  int main(int argc, char** argv) {
@@ -279,6 +279,7 @@ const Status& ErrorHandler::HandleKnownErrors(const Status& bg_err,
279
279
 
280
280
  if (bg_error_stats_ != nullptr) {
281
281
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
282
+ RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
282
283
  }
283
284
  ROCKS_LOG_INFO(db_options_.info_log,
284
285
  "ErrorHandler: Set regular background error\n");
@@ -416,7 +417,11 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
416
417
  CheckAndSetRecoveryAndBGError(bg_err);
417
418
  if (bg_error_stats_ != nullptr) {
418
419
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
420
+ RecordTick(bg_error_stats_.get(),
421
+ ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
419
422
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
423
+ RecordTick(bg_error_stats_.get(),
424
+ ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
420
425
  }
421
426
  ROCKS_LOG_INFO(
422
427
  db_options_.info_log,
@@ -443,9 +448,15 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
443
448
  &auto_recovery);
444
449
  if (bg_error_stats_ != nullptr) {
445
450
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_ERROR_COUNT);
451
+ RecordTick(bg_error_stats_.get(),
452
+ ERROR_HANDLER_BG_ERROR_COUNT_MISSPELLED);
446
453
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
454
+ RecordTick(bg_error_stats_.get(),
455
+ ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
447
456
  RecordTick(bg_error_stats_.get(),
448
457
  ERROR_HANDLER_BG_RETRYABLE_IO_ERROR_COUNT);
458
+ RecordTick(bg_error_stats_.get(),
459
+ ERROR_HANDLER_BG_RETRYABLE_IO_ERROR_COUNT_MISSPELLED);
449
460
  }
450
461
  ROCKS_LOG_INFO(db_options_.info_log,
451
462
  "ErrorHandler: Set background retryable IO error\n");
@@ -486,6 +497,8 @@ const Status& ErrorHandler::SetBGError(const Status& bg_status,
486
497
  } else {
487
498
  if (bg_error_stats_ != nullptr) {
488
499
  RecordTick(bg_error_stats_.get(), ERROR_HANDLER_BG_IO_ERROR_COUNT);
500
+ RecordTick(bg_error_stats_.get(),
501
+ ERROR_HANDLER_BG_IO_ERROR_COUNT_MISSPELLED);
489
502
  }
490
503
  // HandleKnownErrors() will use recovery_error_, so ignore
491
504
  // recovery_io_error_.
@@ -640,6 +653,7 @@ const Status& ErrorHandler::StartRecoverFromRetryableBGIOError(
640
653
  }
641
654
 
642
655
  recovery_in_prog_ = true;
656
+ TEST_SYNC_POINT("StartRecoverFromRetryableBGIOError::in_progress");
643
657
  recovery_thread_.reset(
644
658
  new port::Thread(&ErrorHandler::RecoverFromRetryableBGIOError, this));
645
659
 
@@ -654,6 +668,7 @@ const Status& ErrorHandler::StartRecoverFromRetryableBGIOError(
654
668
  // mutex is released.
655
669
  void ErrorHandler::RecoverFromRetryableBGIOError() {
656
670
  TEST_SYNC_POINT("RecoverFromRetryableBGIOError:BeforeStart");
671
+ TEST_SYNC_POINT("RecoverFromRetryableBGIOError:BeforeStart2");
657
672
  InstrumentedMutexLock l(db_mutex_);
658
673
  if (end_recovery_) {
659
674
  EventHelpers::NotifyOnErrorRecoveryEnd(db_options_.listeners, bg_error_,
@@ -662,6 +677,7 @@ void ErrorHandler::RecoverFromRetryableBGIOError() {
662
677
  return;
663
678
  }
664
679
  DBRecoverContext context = recover_context_;
680
+ context.flush_after_recovery = true;
665
681
  int resume_count = db_options_.max_bgerror_resume_count;
666
682
  uint64_t wait_interval = db_options_.bgerror_resume_retry_interval;
667
683
  uint64_t retry_count = 0;
@@ -19,10 +19,13 @@ class DBImpl;
19
19
  // FlushReason, which tells the flush job why this flush is called.
20
20
  struct DBRecoverContext {
21
21
  FlushReason flush_reason;
22
+ bool flush_after_recovery;
22
23
 
23
- DBRecoverContext() : flush_reason(FlushReason::kErrorRecovery) {}
24
-
25
- DBRecoverContext(FlushReason reason) : flush_reason(reason) {}
24
+ DBRecoverContext()
25
+ : flush_reason(FlushReason::kErrorRecovery),
26
+ flush_after_recovery(false) {}
27
+ DBRecoverContext(FlushReason reason)
28
+ : flush_reason(reason), flush_after_recovery(false) {}
26
29
  };
27
30
 
28
31
  class ErrorHandler {
@@ -2565,8 +2565,8 @@ TEST_F(DBErrorHandlingFSTest, AtomicFlushReadError) {
2565
2565
  s = dbfull()->TEST_GetBGError();
2566
2566
  ASSERT_OK(s);
2567
2567
 
2568
- TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
2569
- GetDefaultOptions());
2568
+ ASSERT_OK(TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
2569
+ GetDefaultOptions()));
2570
2570
  ASSERT_EQ("val", Get(Key(0)));
2571
2571
  }
2572
2572
 
@@ -2606,8 +2606,8 @@ TEST_F(DBErrorHandlingFSTest, AtomicFlushNoSpaceError) {
2606
2606
  s = dbfull()->TEST_GetBGError();
2607
2607
  ASSERT_OK(s);
2608
2608
 
2609
- TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
2610
- GetDefaultOptions());
2609
+ ASSERT_OK(TryReopenWithColumnFamilies({kDefaultColumnFamilyName, "pikachu"},
2610
+ GetDefaultOptions()));
2611
2611
  ASSERT_EQ("val", Get(Key(0)));
2612
2612
  }
2613
2613
 
@@ -122,6 +122,8 @@ void EventHelpers::LogAndNotifyTableFileCreationFinished(
122
122
  << "column_family_name" << table_properties.column_family_name
123
123
  << "column_family_id" << table_properties.column_family_id
124
124
  << "comparator" << table_properties.comparator_name
125
+ << "user_defined_timestamps_persisted"
126
+ << table_properties.user_defined_timestamps_persisted
125
127
  << "merge_operator" << table_properties.merge_operator_name
126
128
  << "prefix_extractor_name"
127
129
  << table_properties.prefix_extractor_name << "property_collectors"
@@ -238,6 +240,8 @@ void EventHelpers::NotifyOnErrorRecoveryEnd(
238
240
  info.new_bg_error.PermitUncheckedError();
239
241
  }
240
242
  db_mutex->Lock();
243
+ } else {
244
+ old_bg_error.PermitUncheckedError();
241
245
  }
242
246
  }
243
247
 
@@ -102,7 +102,8 @@ Status UpdateManifestForFilesState(
102
102
  lf->oldest_blob_file_number, lf->oldest_ancester_time,
103
103
  lf->file_creation_time, lf->epoch_number, lf->file_checksum,
104
104
  lf->file_checksum_func_name, lf->unique_id,
105
- lf->compensated_range_deletion_size, lf->tail_size);
105
+ lf->compensated_range_deletion_size, lf->tail_size,
106
+ lf->user_defined_timestamps_persisted);
106
107
  }
107
108
  }
108
109
  } else {
@@ -1346,7 +1346,7 @@ TEST_P(ExternalSSTFileBasicTest, IngestionWithRangeDeletions) {
1346
1346
  // range del [0, 50) in L6 file, [50, 100) in L0 file, [100, 150) in memtable
1347
1347
  for (int i = 0; i < 3; i++) {
1348
1348
  if (i != 0) {
1349
- db_->Flush(FlushOptions());
1349
+ ASSERT_OK(db_->Flush(FlushOptions()));
1350
1350
  if (i == 1) {
1351
1351
  MoveFilesToLevel(kNumLevels - 1);
1352
1352
  }
@@ -1747,11 +1747,11 @@ TEST_F(ExternalSSTFileBasicTest, IngestFileAfterDBPut) {
1747
1747
  Options options = CurrentOptions();
1748
1748
 
1749
1749
  ASSERT_OK(Put("k", "a"));
1750
- Flush();
1750
+ ASSERT_OK(Flush());
1751
1751
  ASSERT_OK(Put("k", "a"));
1752
- Flush();
1752
+ ASSERT_OK(Flush());
1753
1753
  ASSERT_OK(Put("k", "a"));
1754
- Flush();
1754
+ ASSERT_OK(Flush());
1755
1755
  SstFileWriter sst_file_writer(EnvOptions(), options);
1756
1756
 
1757
1757
  // Current file size should be 0 after sst_file_writer init and before open a
@@ -217,6 +217,8 @@ Status ExternalSstFileIngestionJob::Prepare(
217
217
  std::string requested_checksum_func_name;
218
218
  // TODO: rate limit file reads for checksum calculation during file
219
219
  // ingestion.
220
+ // TODO: plumb Env::IOActivity
221
+ ReadOptions ro;
220
222
  IOStatus io_s = GenerateOneFileChecksum(
221
223
  fs_.get(), files_to_ingest_[i].internal_file_path,
222
224
  db_options_.file_checksum_gen_factory.get(),
@@ -224,8 +226,8 @@ Status ExternalSstFileIngestionJob::Prepare(
224
226
  &generated_checksum_func_name,
225
227
  ingestion_options_.verify_checksums_readahead_size,
226
228
  db_options_.allow_mmap_reads, io_tracer_,
227
- db_options_.rate_limiter.get(),
228
- Env::IO_TOTAL /* rate_limiter_priority */);
229
+ db_options_.rate_limiter.get(), ro, db_options_.stats,
230
+ db_options_.clock);
229
231
  if (!io_s.ok()) {
230
232
  status = io_s;
231
233
  ROCKS_LOG_WARN(db_options_.info_log,
@@ -348,7 +350,7 @@ Status ExternalSstFileIngestionJob::NeedsFlush(bool* flush_needed,
348
350
  std::string end_str;
349
351
  AppendUserKeyWithMaxTimestamp(
350
352
  &begin_str, file_to_ingest.smallest_internal_key.user_key(), ts_sz);
351
- AppendKeyWithMinTimestamp(
353
+ AppendUserKeyWithMinTimestamp(
352
354
  &end_str, file_to_ingest.largest_internal_key.user_key(), ts_sz);
353
355
  keys.emplace_back(std::move(begin_str));
354
356
  keys.emplace_back(std::move(end_str));
@@ -482,7 +484,9 @@ Status ExternalSstFileIngestionJob::Run() {
482
484
  ingestion_options_.ingest_behind
483
485
  ? kReservedEpochNumberForFileIngestedBehind
484
486
  : cfd_->NewEpochNumber(),
485
- f.file_checksum, f.file_checksum_func_name, f.unique_id, 0, tail_size);
487
+ f.file_checksum, f.file_checksum_func_name, f.unique_id, 0, tail_size,
488
+ static_cast<bool>(
489
+ f.table_properties.user_defined_timestamps_persisted));
486
490
  f_metadata.temperature = f.file_temperature;
487
491
  edit_.AddFile(f.picked_level, f_metadata);
488
492
  }
@@ -684,6 +688,9 @@ Status ExternalSstFileIngestionJob::GetIngestedFileInfo(
684
688
  sst_file_reader.reset(new RandomAccessFileReader(
685
689
  std::move(sst_file), external_file, nullptr /*Env*/, io_tracer_));
686
690
 
691
+ // TODO(yuzhangyu): User-defined timestamps doesn't support external sst file
692
+ // ingestion. Pass in the correct `user_defined_timestamps_persisted` flag
693
+ // for creating `TableReaderOptions` when the support is there.
687
694
  status = cfd_->ioptions()->table_factory->NewTableReader(
688
695
  TableReaderOptions(
689
696
  *cfd_->ioptions(), sv->mutable_cf_options.prefix_extractor,
@@ -708,9 +715,9 @@ Status ExternalSstFileIngestionJob::GetIngestedFileInfo(
708
715
  ro.readahead_size = ingestion_options_.verify_checksums_readahead_size;
709
716
  status = table_reader->VerifyChecksum(
710
717
  ro, TableReaderCaller::kExternalSSTIngestion);
711
- }
712
- if (!status.ok()) {
713
- return status;
718
+ if (!status.ok()) {
719
+ return status;
720
+ }
714
721
  }
715
722
 
716
723
  // Get the external file properties
@@ -1053,13 +1060,15 @@ IOStatus ExternalSstFileIngestionJob::GenerateChecksumForIngestedFile(
1053
1060
  std::string file_checksum_func_name;
1054
1061
  std::string requested_checksum_func_name;
1055
1062
  // TODO: rate limit file reads for checksum calculation during file ingestion.
1063
+ // TODO: plumb Env::IOActivity
1064
+ ReadOptions ro;
1056
1065
  IOStatus io_s = GenerateOneFileChecksum(
1057
1066
  fs_.get(), file_to_ingest->internal_file_path,
1058
1067
  db_options_.file_checksum_gen_factory.get(), requested_checksum_func_name,
1059
1068
  &file_checksum, &file_checksum_func_name,
1060
1069
  ingestion_options_.verify_checksums_readahead_size,
1061
1070
  db_options_.allow_mmap_reads, io_tracer_, db_options_.rate_limiter.get(),
1062
- Env::IO_TOTAL /* rate_limiter_priority */);
1071
+ ro, db_options_.stats, db_options_.clock);
1063
1072
  if (!io_s.ok()) {
1064
1073
  return io_s;
1065
1074
  }