@nxtedition/rocksdb 10.0.13 → 10.0.15

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 (700) hide show
  1. package/.tap/coverage/213879bb-47ae-470e-bb54-f4157d9f60e2.json +162898 -0
  2. package/.tap/processinfo/{4c642b53-6895-4ef0-9391-7c6b8d484262.json → 213879bb-47ae-470e-bb54-f4157d9f60e2.json} +117 -121
  3. package/.tap/test-results/node_modules/abstract-level/test/get-test.js.tap +0 -0
  4. package/.tap/test-results/test/abstract-level-test.js.tap +1705 -0
  5. package/.tap/test-results/test/batch-test.js.tap +12 -0
  6. package/.tap/test-results/test/chained-batch-gc-test.js.tap +11 -0
  7. package/.tap/test-results/test/cleanup-hanging-iterators-test.js.tap +58 -0
  8. package/.tap/test-results/test/clear-gc-test.js.tap +13 -0
  9. package/.tap/test-results/test/column-test.js.tap +55 -0
  10. package/.tap/test-results/test/common.js.tap +0 -0
  11. package/.tap/test-results/test/compression-test.js.tap +30 -0
  12. package/.tap/test-results/test/db-identity.js.tap +12 -0
  13. package/.tap/test-results/test/electron.js.tap +0 -0
  14. package/.tap/test-results/test/env-cleanup-hook-test.js.tap +2 -0
  15. package/.tap/test-results/test/env-cleanup-hook.js.tap +0 -0
  16. package/.tap/test-results/test/gc.js.tap +0 -0
  17. package/.tap/test-results/test/getproperty-test.js.tap +29 -0
  18. package/.tap/test-results/test/iterator-gc-test.js.tap +4 -0
  19. package/.tap/test-results/test/iterator-hwm-test.js.tap +24 -0
  20. package/.tap/test-results/test/iterator-recursion-test.js.tap +12 -0
  21. package/.tap/test-results/test/iterator-starvation-test.js.tap +2 -0
  22. package/.tap/test-results/test/iterator-test.js.tap +0 -0
  23. package/.tap/test-results/test/leak-tester-batch.js.tap +0 -0
  24. package/.tap/test-results/test/leak-tester-iterator.js.tap +0 -0
  25. package/.tap/test-results/test/leak-tester.js.tap +0 -0
  26. package/.tap/test-results/test/lock-test.js.tap +0 -0
  27. package/.tap/test-results/test/lock.js.tap +0 -0
  28. package/.tap/test-results/test/make.js.tap +0 -0
  29. package/.tap/test-results/test/max-rev-merge.js.tap +0 -12
  30. package/.tap/test-results/test/merge-operator-test.js.tap +0 -0
  31. package/.tap/test-results/test/mkdir-test.js.tap +0 -0
  32. package/.tap/test-results/test/segfault-test.js.tap +0 -0
  33. package/.tap/test-results/test/stack-blower.js.tap +0 -0
  34. package/binding.cc +42 -34
  35. package/deps/rocksdb/rocksdb/CMakeLists.txt +44 -14
  36. package/deps/rocksdb/rocksdb/Makefile +34 -17
  37. package/deps/rocksdb/rocksdb/TARGETS +27 -0
  38. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +95 -42
  39. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +0 -1
  40. package/deps/rocksdb/rocksdb/cache/cache_test.cc +5 -3
  41. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +381 -393
  42. package/deps/rocksdb/rocksdb/cache/clock_cache.h +88 -51
  43. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +14 -7
  44. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +1 -1
  45. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +21 -19
  46. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +8 -7
  47. package/deps/rocksdb/rocksdb/cache/lru_cache.h +1 -1
  48. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +89 -13
  49. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +16 -8
  50. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +6 -6
  51. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.cc +15 -9
  52. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache.h +16 -13
  53. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +306 -23
  54. package/deps/rocksdb/rocksdb/cache/typed_cache.h +3 -4
  55. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +30 -27
  56. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +8 -10
  57. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.cc +20 -0
  58. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +83 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +19 -16
  60. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +6 -5
  61. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +18 -21
  62. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +5 -4
  63. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +7 -6
  64. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +56 -27
  65. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +11 -7
  66. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +20 -19
  67. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +106 -31
  68. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +5 -8
  69. package/deps/rocksdb/rocksdb/db/blob/prefetch_buffer_collection.cc +4 -2
  70. package/deps/rocksdb/rocksdb/db/builder.cc +89 -44
  71. package/deps/rocksdb/rocksdb/db/builder.h +4 -6
  72. package/deps/rocksdb/rocksdb/db/c.cc +205 -57
  73. package/deps/rocksdb/rocksdb/db/c_test.c +141 -20
  74. package/deps/rocksdb/rocksdb/db/coalescing_iterator.cc +47 -0
  75. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +79 -0
  76. package/deps/rocksdb/rocksdb/db/column_family.cc +100 -36
  77. package/deps/rocksdb/rocksdb/db/column_family.h +46 -28
  78. package/deps/rocksdb/rocksdb/db/column_family_test.cc +168 -46
  79. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +51 -6
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +72 -24
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +11 -14
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +7 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +87 -8
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -3
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +310 -70
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +78 -62
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +0 -1
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +2 -3
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +33 -96
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +18 -10
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -8
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +42 -22
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +20 -16
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +7 -3
  95. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +18 -17
  96. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +95 -10
  97. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -7
  98. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +213 -34
  99. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +4 -4
  100. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -8
  101. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +16 -16
  102. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +75 -142
  103. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +577 -34
  104. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +4 -4
  105. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  106. package/deps/rocksdb/rocksdb/db/corruption_test.cc +7 -38
  107. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +5 -5
  108. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +366 -136
  109. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +9 -10
  110. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +282 -6
  111. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +6 -6
  112. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +551 -150
  113. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +1 -1
  114. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +41 -13
  115. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +54 -17
  116. package/deps/rocksdb/rocksdb/db/db_follower_test.cc +527 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +40 -58
  118. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +34 -45
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +699 -580
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +308 -230
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +180 -107
  122. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +6 -2
  123. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +10 -6
  124. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +36 -61
  125. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +347 -0
  126. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.h +54 -0
  127. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +206 -155
  128. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +5 -8
  129. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +41 -39
  130. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +26 -22
  131. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +14 -9
  132. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +126 -46
  133. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +21 -9
  134. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +294 -0
  135. package/deps/rocksdb/rocksdb/db/db_iter.cc +116 -78
  136. package/deps/rocksdb/rocksdb/db/db_iter.h +31 -7
  137. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +34 -14
  138. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +69 -8
  139. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +153 -18
  140. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +9 -11
  141. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +9 -1
  142. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +6 -2
  143. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +105 -0
  144. package/deps/rocksdb/rocksdb/db/db_options_test.cc +97 -111
  145. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -3
  146. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +82 -30
  147. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +5 -7
  148. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +64 -22
  149. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +74 -0
  150. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +175 -47
  151. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +4 -3
  152. package/deps/rocksdb/rocksdb/db/db_test.cc +133 -109
  153. package/deps/rocksdb/rocksdb/db/db_test2.cc +227 -139
  154. package/deps/rocksdb/rocksdb/db/db_test_util.cc +42 -19
  155. package/deps/rocksdb/rocksdb/db/db_test_util.h +67 -24
  156. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +140 -2
  157. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +17 -19
  158. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +332 -87
  159. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +4 -4
  160. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +4 -4
  161. package/deps/rocksdb/rocksdb/db/db_write_test.cc +250 -30
  162. package/deps/rocksdb/rocksdb/db/dbformat.cc +41 -8
  163. package/deps/rocksdb/rocksdb/db/dbformat.h +100 -17
  164. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +48 -8
  165. package/deps/rocksdb/rocksdb/db/error_handler.cc +102 -116
  166. package/deps/rocksdb/rocksdb/db/error_handler.h +28 -6
  167. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +263 -99
  168. package/deps/rocksdb/rocksdb/db/event_helpers.cc +3 -1
  169. package/deps/rocksdb/rocksdb/db/experimental.cc +1073 -7
  170. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +261 -111
  171. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +263 -183
  172. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +31 -12
  173. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +698 -7
  174. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +5 -3
  175. package/deps/rocksdb/rocksdb/db/flush_job.cc +41 -41
  176. package/deps/rocksdb/rocksdb/db/flush_job.h +11 -8
  177. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +90 -13
  178. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +19 -6
  179. package/deps/rocksdb/rocksdb/db/forward_iterator.h +12 -12
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +83 -52
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +169 -2
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +12 -6
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  184. package/deps/rocksdb/rocksdb/db/job_context.h +17 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +4 -4
  186. package/deps/rocksdb/rocksdb/db/log_reader.cc +44 -20
  187. package/deps/rocksdb/rocksdb/db/log_reader.h +3 -0
  188. package/deps/rocksdb/rocksdb/db/log_test.cc +81 -17
  189. package/deps/rocksdb/rocksdb/db/log_writer.cc +135 -92
  190. package/deps/rocksdb/rocksdb/db/log_writer.h +11 -10
  191. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +2 -3
  192. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -1
  193. package/deps/rocksdb/rocksdb/db/memtable.cc +82 -62
  194. package/deps/rocksdb/rocksdb/db/memtable.h +17 -9
  195. package/deps/rocksdb/rocksdb/db/memtable_list.cc +19 -13
  196. package/deps/rocksdb/rocksdb/db/memtable_list.h +3 -1
  197. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +38 -5
  198. package/deps/rocksdb/rocksdb/db/merge_context.h +3 -0
  199. package/deps/rocksdb/rocksdb/db/merge_helper.cc +34 -156
  200. package/deps/rocksdb/rocksdb/db/merge_helper.h +52 -46
  201. package/deps/rocksdb/rocksdb/db/merge_test.cc +16 -11
  202. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +289 -0
  203. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +918 -0
  204. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +4 -6
  205. package/deps/rocksdb/rocksdb/db/options_file_test.cc +4 -4
  206. package/deps/rocksdb/rocksdb/db/output_validator.cc +8 -12
  207. package/deps/rocksdb/rocksdb/db/output_validator.h +1 -4
  208. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +23 -4
  209. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +2 -3
  210. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -1
  211. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +2 -2
  212. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +3 -6
  213. package/deps/rocksdb/rocksdb/db/prefix_test.cc +21 -8
  214. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +0 -2
  215. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +0 -1
  216. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +17 -4
  217. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +6 -3
  218. package/deps/rocksdb/rocksdb/db/repair.cc +35 -29
  219. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -2
  220. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +428 -156
  221. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +393 -227
  222. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +154 -82
  223. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +2 -2
  224. package/deps/rocksdb/rocksdb/db/table_cache.cc +9 -11
  225. package/deps/rocksdb/rocksdb/db/table_cache.h +2 -1
  226. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +8 -3
  227. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +27 -26
  228. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +23 -23
  229. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +5 -5
  230. package/deps/rocksdb/rocksdb/db/version_builder.cc +6 -0
  231. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +62 -29
  232. package/deps/rocksdb/rocksdb/db/version_edit.cc +1 -2
  233. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -11
  234. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +291 -116
  235. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +54 -11
  236. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +3 -1
  237. package/deps/rocksdb/rocksdb/db/version_set.cc +301 -141
  238. package/deps/rocksdb/rocksdb/db/version_set.h +90 -33
  239. package/deps/rocksdb/rocksdb/db/version_set_test.cc +817 -193
  240. package/deps/rocksdb/rocksdb/db/version_util.h +10 -5
  241. package/deps/rocksdb/rocksdb/db/wal_manager.cc +15 -11
  242. package/deps/rocksdb/rocksdb/db/wal_manager.h +2 -1
  243. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +10 -9
  244. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +403 -28
  245. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +2 -2
  246. package/deps/rocksdb/rocksdb/db/write_batch.cc +204 -18
  247. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +4 -0
  248. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +149 -5
  249. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +7 -7
  250. package/deps/rocksdb/rocksdb/db/write_stall_stats.h +7 -7
  251. package/deps/rocksdb/rocksdb/db/write_thread.cc +86 -47
  252. package/deps/rocksdb/rocksdb/db/write_thread.h +2 -0
  253. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +176 -68
  254. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +337 -125
  255. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +38 -9
  256. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +126 -34
  257. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +1 -1
  258. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -2
  259. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +161 -1
  260. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +267 -9
  261. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.cc +13 -7
  262. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +9 -9
  263. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +535 -86
  264. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +27 -5
  265. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +8 -15
  266. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +46 -21
  267. package/deps/rocksdb/rocksdb/db_stress_tool/expected_value.h +74 -4
  268. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +28 -11
  269. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +426 -151
  270. package/deps/rocksdb/rocksdb/env/composite_env.cc +1 -1
  271. package/deps/rocksdb/rocksdb/env/emulated_clock.h +6 -6
  272. package/deps/rocksdb/rocksdb/env/env.cc +21 -11
  273. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +9 -9
  274. package/deps/rocksdb/rocksdb/env/env_chroot.cc +3 -2
  275. package/deps/rocksdb/rocksdb/env/env_encryption.cc +3 -3
  276. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -2
  277. package/deps/rocksdb/rocksdb/env/env_posix.cc +12 -10
  278. package/deps/rocksdb/rocksdb/env/env_test.cc +24 -18
  279. package/deps/rocksdb/rocksdb/env/file_system.cc +7 -6
  280. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +3 -3
  281. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +3 -3
  282. package/deps/rocksdb/rocksdb/env/fs_on_demand.cc +331 -0
  283. package/deps/rocksdb/rocksdb/env/fs_on_demand.h +139 -0
  284. package/deps/rocksdb/rocksdb/env/fs_posix.cc +14 -15
  285. package/deps/rocksdb/rocksdb/env/io_posix.cc +15 -10
  286. package/deps/rocksdb/rocksdb/env/io_posix.h +86 -92
  287. package/deps/rocksdb/rocksdb/env/mock_env.cc +1 -1
  288. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +6 -6
  289. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +8 -6
  290. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -1
  291. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +599 -592
  292. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +312 -200
  293. package/deps/rocksdb/rocksdb/file/file_util.cc +19 -14
  294. package/deps/rocksdb/rocksdb/file/file_util.h +34 -24
  295. package/deps/rocksdb/rocksdb/file/filename.cc +32 -17
  296. package/deps/rocksdb/rocksdb/file/filename.h +51 -53
  297. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +82 -441
  298. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +7 -6
  299. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +5 -5
  300. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +9 -3
  301. package/deps/rocksdb/rocksdb/file/read_write_util.h +3 -3
  302. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +6 -2
  303. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +9 -4
  304. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +8 -4
  305. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +110 -89
  306. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +34 -17
  307. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_cache.h +16 -0
  308. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +39 -189
  309. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +114 -0
  310. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +91 -6
  311. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +52 -7
  312. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +1 -1
  313. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +27 -0
  314. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +146 -0
  315. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +2 -2
  316. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +254 -151
  317. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +39 -36
  318. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -1
  319. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +431 -0
  320. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +1 -1
  321. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +57 -23
  322. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +27 -57
  323. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +74 -0
  324. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +2 -1
  325. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +1 -1
  326. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +11 -11
  327. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +1 -1
  328. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +146 -71
  329. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +6 -1
  330. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +7 -4
  331. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +17 -13
  332. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -19
  333. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +5 -5
  334. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +10 -8
  335. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +18 -2
  336. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +12 -2
  337. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +3 -3
  338. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +118 -116
  339. package/deps/rocksdb/rocksdb/include/rocksdb/system_clock.h +4 -4
  340. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +26 -21
  341. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +18 -6
  342. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +1 -1
  343. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +5 -5
  344. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record_result.h +8 -8
  345. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +12 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/cache_dump_load.h +4 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +3 -3
  348. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +8 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +1 -1
  350. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -4
  351. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +3 -3
  352. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +5 -6
  353. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +159 -167
  354. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +1 -2
  355. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +52 -17
  356. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +3 -4
  357. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/types_util.h +36 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +118 -20
  359. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  360. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +1 -1
  361. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +87 -45
  362. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +26 -3
  363. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +22 -1
  364. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +7 -9
  365. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +5 -6
  366. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +2 -2
  367. package/deps/rocksdb/rocksdb/logging/env_logger.h +3 -3
  368. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -1
  369. package/deps/rocksdb/rocksdb/logging/log_buffer.h +3 -3
  370. package/deps/rocksdb/rocksdb/memory/arena.h +11 -0
  371. package/deps/rocksdb/rocksdb/memory/arena_test.cc +17 -2
  372. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +1 -1
  373. package/deps/rocksdb/rocksdb/memory/memory_allocator.cc +1 -0
  374. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  375. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +1 -1
  376. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +11 -10
  377. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +8 -7
  378. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +2 -2
  379. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +2 -2
  380. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -1
  381. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +3 -3
  382. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +2 -2
  383. package/deps/rocksdb/rocksdb/microbench/db_basic_bench.cc +3 -1
  384. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +2 -2
  385. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +20 -10
  386. package/deps/rocksdb/rocksdb/monitoring/histogram.h +15 -15
  387. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +7 -3
  388. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +14 -14
  389. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +1 -1
  390. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +4 -0
  391. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +8 -1
  392. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +1 -1
  393. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +5 -2
  394. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +64 -58
  395. package/deps/rocksdb/rocksdb/monitoring/statistics_impl.h +11 -12
  396. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  397. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +1 -1
  398. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +7 -1
  399. package/deps/rocksdb/rocksdb/options/cf_options.cc +20 -28
  400. package/deps/rocksdb/rocksdb/options/cf_options.h +7 -14
  401. package/deps/rocksdb/rocksdb/options/configurable.cc +20 -12
  402. package/deps/rocksdb/rocksdb/options/configurable_test.cc +4 -6
  403. package/deps/rocksdb/rocksdb/options/configurable_test.h +2 -2
  404. package/deps/rocksdb/rocksdb/options/customizable.cc +1 -1
  405. package/deps/rocksdb/rocksdb/options/customizable_test.cc +3 -2
  406. package/deps/rocksdb/rocksdb/options/db_options.cc +22 -48
  407. package/deps/rocksdb/rocksdb/options/db_options.h +3 -3
  408. package/deps/rocksdb/rocksdb/options/offpeak_time_info.cc +59 -0
  409. package/deps/rocksdb/rocksdb/options/offpeak_time_info.h +37 -0
  410. package/deps/rocksdb/rocksdb/options/options.cc +14 -6
  411. package/deps/rocksdb/rocksdb/options/options_helper.cc +8 -13
  412. package/deps/rocksdb/rocksdb/options/options_helper.h +2 -3
  413. package/deps/rocksdb/rocksdb/options/options_parser.cc +35 -26
  414. package/deps/rocksdb/rocksdb/options/options_parser.h +4 -2
  415. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +3 -3
  416. package/deps/rocksdb/rocksdb/options/options_test.cc +30 -23
  417. package/deps/rocksdb/rocksdb/port/lang.h +1 -1
  418. package/deps/rocksdb/rocksdb/port/port_example.h +7 -7
  419. package/deps/rocksdb/rocksdb/port/port_posix.cc +7 -7
  420. package/deps/rocksdb/rocksdb/port/port_posix.h +7 -7
  421. package/deps/rocksdb/rocksdb/port/stack_trace.cc +85 -24
  422. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1 -2
  423. package/deps/rocksdb/rocksdb/port/win/io_win.cc +4 -4
  424. package/deps/rocksdb/rocksdb/port/win/io_win.h +13 -17
  425. package/deps/rocksdb/rocksdb/port/win/port_win.cc +3 -2
  426. package/deps/rocksdb/rocksdb/port/win/port_win.h +4 -4
  427. package/deps/rocksdb/rocksdb/src.mk +16 -1
  428. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +1 -7
  429. package/deps/rocksdb/rocksdb/table/block_based/block.cc +39 -15
  430. package/deps/rocksdb/rocksdb/table/block_based/block.h +7 -7
  431. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +80 -40
  432. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +2 -3
  433. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +20 -5
  434. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +228 -122
  435. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +50 -9
  436. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +82 -25
  437. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +17 -20
  438. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +47 -13
  439. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +163 -50
  440. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +1 -2
  441. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +23 -23
  442. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +2 -12
  443. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -2
  444. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +6 -4
  445. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +32 -27
  446. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +1 -1
  447. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +7 -10
  448. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +2 -2
  449. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +1 -2
  450. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +25 -7
  451. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -5
  452. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +4 -6
  453. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +6 -6
  454. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +1 -1
  455. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -5
  456. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +2 -2
  457. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +4 -5
  458. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +138 -86
  459. package/deps/rocksdb/rocksdb/table/block_fetcher.h +22 -0
  460. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +26 -13
  461. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +11 -11
  462. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +11 -11
  463. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +10 -5
  464. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +6 -7
  465. package/deps/rocksdb/rocksdb/table/format.cc +15 -21
  466. package/deps/rocksdb/rocksdb/table/format.h +8 -0
  467. package/deps/rocksdb/rocksdb/table/get_context.cc +121 -78
  468. package/deps/rocksdb/rocksdb/table/get_context.h +11 -6
  469. package/deps/rocksdb/rocksdb/table/internal_iterator.h +12 -5
  470. package/deps/rocksdb/rocksdb/table/iterator.cc +4 -0
  471. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -1
  472. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -1
  473. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +5 -0
  474. package/deps/rocksdb/rocksdb/table/merging_iterator.h +4 -3
  475. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +15 -11
  476. package/deps/rocksdb/rocksdb/table/meta_blocks.h +8 -4
  477. package/deps/rocksdb/rocksdb/table/mock_table.cc +12 -8
  478. package/deps/rocksdb/rocksdb/table/mock_table.h +1 -3
  479. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +0 -1
  480. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +29 -21
  481. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +4 -14
  482. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +7 -8
  483. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +7 -5
  484. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +15 -8
  485. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +1 -1
  486. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +75 -30
  487. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +7 -2
  488. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +76 -11
  489. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +358 -2
  490. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +93 -16
  491. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +12 -12
  492. package/deps/rocksdb/rocksdb/table/table_builder.h +12 -6
  493. package/deps/rocksdb/rocksdb/table/table_iterator.h +69 -0
  494. package/deps/rocksdb/rocksdb/table/table_properties.cc +1 -1
  495. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +8 -6
  496. package/deps/rocksdb/rocksdb/table/table_test.cc +732 -121
  497. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +3 -1
  498. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +1 -1
  499. package/deps/rocksdb/rocksdb/table/unique_id.cc +2 -2
  500. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +2 -2
  501. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +5 -5
  502. package/deps/rocksdb/rocksdb/test_util/secondary_cache_test_util.cc +2 -6
  503. package/deps/rocksdb/rocksdb/test_util/testharness.cc +2 -4
  504. package/deps/rocksdb/rocksdb/test_util/testutil.cc +56 -32
  505. package/deps/rocksdb/rocksdb/test_util/testutil.h +57 -34
  506. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +18 -1
  507. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +1 -0
  508. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +3 -3
  509. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +210 -112
  510. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +3 -3
  511. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +1 -1
  512. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +22 -27
  513. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +10 -4
  514. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +328 -59
  515. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +34 -2
  516. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +64 -17
  517. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +8 -1
  518. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +3 -2
  519. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +136 -10
  520. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +4 -2
  521. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +50 -8
  522. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +51 -45
  523. package/deps/rocksdb/rocksdb/trace_replay/trace_record.cc +1 -1
  524. package/deps/rocksdb/rocksdb/trace_replay/trace_record_handler.h +10 -10
  525. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +14 -4
  526. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +2 -1
  527. package/deps/rocksdb/rocksdb/unreleased_history/README.txt +2 -2
  528. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +2 -4
  529. package/deps/rocksdb/rocksdb/util/atomic.h +111 -0
  530. package/deps/rocksdb/rocksdb/util/autovector.h +5 -1
  531. package/deps/rocksdb/rocksdb/util/bloom_test.cc +12 -2
  532. package/deps/rocksdb/rocksdb/util/cast_util.h +22 -0
  533. package/deps/rocksdb/rocksdb/util/coding.h +34 -38
  534. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -1
  535. package/deps/rocksdb/rocksdb/util/comparator.cc +18 -5
  536. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +1 -1
  537. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +4 -4
  538. package/deps/rocksdb/rocksdb/util/crc32c.cc +3 -6
  539. package/deps/rocksdb/rocksdb/util/crc32c.h +3 -3
  540. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +3 -4
  541. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +1 -2
  542. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +2 -4
  543. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -4
  544. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +3 -2
  545. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +3 -3
  546. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +83 -59
  547. package/deps/rocksdb/rocksdb/util/filelock_test.cc +3 -3
  548. package/deps/rocksdb/rocksdb/util/hash.h +4 -4
  549. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +3 -3
  550. package/deps/rocksdb/rocksdb/util/murmurhash.cc +1 -1
  551. package/deps/rocksdb/rocksdb/util/random.cc +3 -4
  552. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +23 -43
  553. package/deps/rocksdb/rocksdb/util/rate_limiter_impl.h +21 -16
  554. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +44 -24
  555. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +2 -3
  556. package/deps/rocksdb/rocksdb/util/ribbon_config.cc +2 -10
  557. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +2 -2
  558. package/deps/rocksdb/rocksdb/util/slice.cc +4 -5
  559. package/deps/rocksdb/rocksdb/util/slice_test.cc +70 -4
  560. package/deps/rocksdb/rocksdb/util/status.cc +1 -1
  561. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +39 -7
  562. package/deps/rocksdb/rocksdb/util/stderr_logger.h +12 -2
  563. package/deps/rocksdb/rocksdb/util/string_util.cc +31 -18
  564. package/deps/rocksdb/rocksdb/util/string_util.h +9 -9
  565. package/deps/rocksdb/rocksdb/util/string_util_test.cc +36 -0
  566. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +5 -5
  567. package/deps/rocksdb/rocksdb/util/thread_local.cc +1 -1
  568. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +3 -4
  569. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +1 -1
  570. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +4 -4
  571. package/deps/rocksdb/rocksdb/util/vector_iterator.h +12 -16
  572. package/deps/rocksdb/rocksdb/util/write_batch_util.h +5 -0
  573. package/deps/rocksdb/rocksdb/util/xxhash.h +116 -116
  574. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge.cc +4 -5
  575. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_impl.h +2 -2
  576. package/deps/rocksdb/rocksdb/utilities/agg_merge/test_agg_merge.cc +1 -2
  577. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +33 -31
  578. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +123 -22
  579. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +9 -7
  580. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +3 -6
  581. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +22 -55
  582. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +113 -74
  583. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +36 -24
  584. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +27 -11
  585. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +5 -3
  586. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +68 -54
  587. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +3 -6
  588. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +16 -16
  589. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +3 -2
  590. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +29 -9
  591. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +27 -14
  592. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +2 -4
  593. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +3 -3
  594. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +2 -4
  595. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +2 -4
  596. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +2 -4
  597. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +2 -4
  598. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +2 -4
  599. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +8 -8
  600. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +3 -7
  601. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +7 -8
  602. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +2 -4
  603. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +9 -7
  604. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +7 -10
  605. package/deps/rocksdb/rocksdb/utilities/debug.cc +6 -2
  606. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +18 -11
  607. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +2 -2
  608. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +18 -25
  609. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +32 -23
  610. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +51 -48
  611. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +5 -3
  612. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +2 -2
  613. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -1
  614. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +2 -3
  615. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +3 -1
  616. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +7 -7
  617. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +10 -10
  618. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +5 -6
  619. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +5 -6
  620. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +1 -1
  621. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +1 -8
  622. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +29 -21
  623. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +14 -15
  624. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +2 -2
  625. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +1 -1
  626. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +3 -3
  627. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +3 -5
  628. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  629. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +2 -2
  630. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +8 -8
  631. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +4 -4
  632. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +1 -1
  633. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +6 -9
  634. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +2 -2
  635. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +1 -1
  636. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +6 -6
  637. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +1 -2
  638. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +2 -3
  639. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +1 -1
  640. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +1 -1
  641. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  642. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +5 -0
  643. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +1 -1
  644. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +3 -3
  645. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +1 -1
  646. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +4 -0
  647. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +4 -0
  648. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  649. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +4 -0
  650. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +12 -3
  651. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +17 -3
  652. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +3 -3
  653. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +1 -1
  654. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +3 -3
  655. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +4 -2
  656. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +1 -1
  657. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +1 -2
  658. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +2 -3
  659. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +3 -4
  660. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +442 -10
  661. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +27 -9
  662. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +28 -7
  663. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +70 -12
  664. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +50 -22
  665. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -1
  666. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -1
  667. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +64 -3
  668. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +76 -17
  669. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +6 -6
  670. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +573 -77
  671. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +6 -2
  672. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +65 -3
  673. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +13 -11
  674. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +1 -0
  675. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +14 -16
  676. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +37 -24
  677. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +23 -29
  678. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +4 -2
  679. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +31 -40
  680. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +8 -6
  681. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +3 -4
  682. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +34 -18
  683. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +21 -25
  684. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +26 -5
  685. package/deps/rocksdb/rocksdb/utilities/types_util.cc +88 -0
  686. package/deps/rocksdb/rocksdb/utilities/types_util_test.cc +98 -0
  687. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -1
  688. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +463 -90
  689. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +259 -76
  690. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +70 -14
  691. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +609 -10
  692. package/deps/rocksdb/rocksdb.gyp +8 -4
  693. package/index.js +18 -4
  694. package/max_rev_operator.h +2 -0
  695. package/package.json +2 -2
  696. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  697. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  698. package/util.h +29 -5
  699. package/.tap/coverage/4c642b53-6895-4ef0-9391-7c6b8d484262.json +0 -14334
  700. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +0 -57
@@ -33,10 +33,11 @@ class SeqnoTimeTest : public DBTestBase {
33
33
  void SetUp() override {
34
34
  mock_clock_->InstallTimedWaitFixCallback();
35
35
  SyncPoint::GetInstance()->SetCallBack(
36
- "DBImpl::StartPeriodicTaskScheduler:Init", [&](void* arg) {
36
+ "DBImpl::StartPeriodicTaskScheduler:Init",
37
+ [mock_clock = mock_clock_](void* arg) {
37
38
  auto periodic_task_scheduler_ptr =
38
- reinterpret_cast<PeriodicTaskScheduler*>(arg);
39
- periodic_task_scheduler_ptr->TEST_OverrideTimer(mock_clock_.get());
39
+ static_cast<PeriodicTaskScheduler*>(arg);
40
+ periodic_task_scheduler_ptr->TEST_OverrideTimer(mock_clock.get());
40
41
  });
41
42
  mock_clock_->SetCurrentTime(kMockStartTime);
42
43
  }
@@ -78,7 +79,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
78
79
  options.compaction_style = kCompactionStyleUniversal;
79
80
  options.preclude_last_level_data_seconds = 10000;
80
81
  options.env = mock_env_.get();
81
- options.bottommost_temperature = Temperature::kCold;
82
+ options.last_level_temperature = Temperature::kCold;
82
83
  options.num_levels = kNumLevels;
83
84
  DestroyAndReopen(options);
84
85
 
@@ -180,7 +181,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
180
181
  Options options = CurrentOptions();
181
182
  options.preclude_last_level_data_seconds = 10000;
182
183
  options.env = mock_env_.get();
183
- options.bottommost_temperature = Temperature::kCold;
184
+ options.last_level_temperature = Temperature::kCold;
184
185
  options.num_levels = kNumLevels;
185
186
  options.level_compaction_dynamic_level_bytes = true;
186
187
  // TODO(zjay): for level compaction, auto-compaction may stuck in deadloop, if
@@ -330,25 +331,41 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
330
331
  ASSERT_EQ(tables_props.size(), 1);
331
332
  auto it = tables_props.begin();
332
333
  SeqnoToTimeMapping tp_mapping;
333
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
334
- ASSERT_OK(tp_mapping.Sort());
334
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
335
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
335
336
  ASSERT_FALSE(tp_mapping.Empty());
336
337
  auto seqs = tp_mapping.TEST_GetInternalMapping();
337
338
  // about ~20 seqs->time entries, because the sample rate is 10000/100, and it
338
339
  // passes 2k time. Add (roughly) one for starting entry.
339
- ASSERT_GE(seqs.size(), 20);
340
- ASSERT_LE(seqs.size(), 22);
341
- SequenceNumber seq_end = dbfull()->GetLatestSequenceNumber() + 1;
342
- for (auto i = start_seq; i < seq_end; i++) {
343
- // The result is within the range
344
- ASSERT_GE(tp_mapping.GetProximalTimeBeforeSeqno(i),
345
- start_time + (i - start_seq) * 10 - 100);
346
- ASSERT_LE(tp_mapping.GetProximalTimeBeforeSeqno(i),
347
- start_time + (i - start_seq) * 10);
348
- }
340
+ // Revised: with automatic pre-population of mappings, some of these entries
341
+ // might be purged to keep the DB mapping within capacity.
342
+ EXPECT_GE(seqs.size(), 20 / 2);
343
+ EXPECT_LE(seqs.size(), 22);
344
+
345
+ auto ValidateProximalSeqnos = [&](const char* name, double fuzz_ratio) {
346
+ SequenceNumber seq_end = dbfull()->GetLatestSequenceNumber() + 1;
347
+ uint64_t end_time = mock_clock_->NowSeconds();
348
+ uint64_t seqno_fuzz =
349
+ static_cast<uint64_t>((seq_end - start_seq) * fuzz_ratio + 0.999999);
350
+ for (unsigned time_pct = 0; time_pct <= 100; time_pct++) {
351
+ SCOPED_TRACE("name=" + std::string(name) +
352
+ " time_pct=" + std::to_string(time_pct));
353
+ // Validate the important proximal API (GetProximalSeqnoBeforeTime)
354
+ uint64_t t = start_time + time_pct * (end_time - start_time) / 100;
355
+ auto seqno_reported = tp_mapping.GetProximalSeqnoBeforeTime(t);
356
+ auto seqno_expected = start_seq + time_pct * (seq_end - start_seq) / 100;
357
+ EXPECT_LE(seqno_reported, seqno_expected);
358
+ if (end_time - t < 10000) {
359
+ EXPECT_LE(seqno_expected, seqno_reported + seqno_fuzz);
360
+ }
361
+ }
362
+ start_seq = seq_end;
363
+ start_time = end_time;
364
+ };
365
+
366
+ ValidateProximalSeqnos("a", 0.1);
367
+
349
368
  checked_file_nums.insert(it->second->orig_file_number);
350
- start_seq = seq_end;
351
- start_time = mock_clock_->NowSeconds();
352
369
 
353
370
  // Write a key every 1 seconds
354
371
  for (int i = 0; i < 200; i++) {
@@ -356,7 +373,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
356
373
  dbfull()->TEST_WaitForPeriodicTaskRun(
357
374
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(1)); });
358
375
  }
359
- seq_end = dbfull()->GetLatestSequenceNumber() + 1;
376
+
360
377
  ASSERT_OK(Flush());
361
378
  tables_props.clear();
362
379
  ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
@@ -371,21 +388,17 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
371
388
  ASSERT_TRUE(it != tables_props.end());
372
389
 
373
390
  tp_mapping.Clear();
374
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
375
- ASSERT_OK(tp_mapping.Sort());
391
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
392
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
376
393
  seqs = tp_mapping.TEST_GetInternalMapping();
377
394
  // There only a few time sample
378
395
  ASSERT_GE(seqs.size(), 1);
379
396
  ASSERT_LE(seqs.size(), 3);
380
- for (auto i = start_seq; i < seq_end; i++) {
381
- ASSERT_GE(tp_mapping.GetProximalTimeBeforeSeqno(i),
382
- start_time + (i - start_seq) - 100);
383
- ASSERT_LE(tp_mapping.GetProximalTimeBeforeSeqno(i),
384
- start_time + (i - start_seq));
385
- }
397
+
398
+ // High fuzz ratio because of low number of samples
399
+ ValidateProximalSeqnos("b", 0.5);
400
+
386
401
  checked_file_nums.insert(it->second->orig_file_number);
387
- start_seq = seq_end;
388
- start_time = mock_clock_->NowSeconds();
389
402
 
390
403
  // Write a key every 200 seconds
391
404
  for (int i = 0; i < 200; i++) {
@@ -393,7 +406,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
393
406
  dbfull()->TEST_WaitForPeriodicTaskRun(
394
407
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(200)); });
395
408
  }
396
- seq_end = dbfull()->GetLatestSequenceNumber() + 1;
409
+ // seq_end = dbfull()->GetLatestSequenceNumber() + 1;
397
410
  ASSERT_OK(Flush());
398
411
  tables_props.clear();
399
412
  ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
@@ -408,24 +421,16 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
408
421
  ASSERT_TRUE(it != tables_props.end());
409
422
 
410
423
  tp_mapping.Clear();
411
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
412
- ASSERT_OK(tp_mapping.Sort());
424
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
425
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
413
426
  seqs = tp_mapping.TEST_GetInternalMapping();
414
- // The sequence number -> time entries should be maxed
415
- ASSERT_GE(seqs.size(), 99);
416
- ASSERT_LE(seqs.size(), 101);
417
- for (auto i = start_seq; i < seq_end; i++) {
418
- // aged out entries allowed to report time=0
419
- if ((seq_end - i) * 200 <= 10000) {
420
- ASSERT_GE(tp_mapping.GetProximalTimeBeforeSeqno(i),
421
- start_time + (i - start_seq) * 200 - 100);
422
- }
423
- ASSERT_LE(tp_mapping.GetProximalTimeBeforeSeqno(i),
424
- start_time + (i - start_seq) * 200);
425
- }
427
+ // For the preserved time span, only 10000/200=50 (+1) entries were recorded
428
+ ASSERT_GE(seqs.size(), 50);
429
+ ASSERT_LE(seqs.size(), 51);
430
+
431
+ ValidateProximalSeqnos("c", 0.04);
432
+
426
433
  checked_file_nums.insert(it->second->orig_file_number);
427
- start_seq = seq_end;
428
- start_time = mock_clock_->NowSeconds();
429
434
 
430
435
  // Write a key every 100 seconds
431
436
  for (int i = 0; i < 200; i++) {
@@ -433,7 +438,6 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
433
438
  dbfull()->TEST_WaitForPeriodicTaskRun(
434
439
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
435
440
  }
436
- seq_end = dbfull()->GetLatestSequenceNumber() + 1;
437
441
  ASSERT_OK(Flush());
438
442
  tables_props.clear();
439
443
  ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
@@ -447,9 +451,11 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
447
451
  }
448
452
  ASSERT_TRUE(it != tables_props.end());
449
453
  tp_mapping.Clear();
450
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
451
- ASSERT_OK(tp_mapping.Sort());
454
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
455
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
452
456
  seqs = tp_mapping.TEST_GetInternalMapping();
457
+ // For the preserved time span, max entries were recorded and
458
+ // preserved (10000/100=100 (+1))
453
459
  ASSERT_GE(seqs.size(), 99);
454
460
  ASSERT_LE(seqs.size(), 101);
455
461
 
@@ -474,21 +480,14 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
474
480
  }
475
481
  ASSERT_TRUE(it != tables_props.end());
476
482
  tp_mapping.Clear();
477
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
478
- ASSERT_OK(tp_mapping.Sort());
483
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
484
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
479
485
  seqs = tp_mapping.TEST_GetInternalMapping();
480
486
  ASSERT_GE(seqs.size(), 99);
481
487
  ASSERT_LE(seqs.size(), 101);
482
- for (auto i = start_seq; i < seq_end; i++) {
483
- // aged out entries allowed to report time=0
484
- // FIXME: should be <=
485
- if ((seq_end - i) * 100 < 10000) {
486
- ASSERT_GE(tp_mapping.GetProximalTimeBeforeSeqno(i),
487
- start_time + (i - start_seq) * 100 - 100);
488
- }
489
- ASSERT_LE(tp_mapping.GetProximalTimeBeforeSeqno(i),
490
- start_time + (i - start_seq) * 100);
491
- }
488
+
489
+ ValidateProximalSeqnos("d", 0.02);
490
+
492
491
  ASSERT_OK(db_->Close());
493
492
  }
494
493
 
@@ -545,8 +544,8 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
545
544
  ASSERT_EQ(tables_props.size(), 1);
546
545
  it = tables_props.begin();
547
546
  SeqnoToTimeMapping tp_mapping;
548
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
549
- ASSERT_OK(tp_mapping.Sort());
547
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
548
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
550
549
  ASSERT_FALSE(tp_mapping.Empty());
551
550
  auto seqs = tp_mapping.TEST_GetInternalMapping();
552
551
  ASSERT_GE(seqs.size(), 1);
@@ -565,7 +564,8 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
565
564
  }
566
565
  seqs = dbfull()->TEST_GetSeqnoToTimeMapping().TEST_GetInternalMapping();
567
566
  ASSERT_GE(seqs.size(), 1000 - 1);
568
- ASSERT_LE(seqs.size(), 1000 + 1);
567
+ // Non-strict limit can exceed capacity by a reasonable fraction
568
+ ASSERT_LE(seqs.size(), 1000 * 9 / 8);
569
569
 
570
570
  ASSERT_OK(Flush(2));
571
571
  tables_props.clear();
@@ -573,8 +573,8 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
573
573
  ASSERT_EQ(tables_props.size(), 1);
574
574
  it = tables_props.begin();
575
575
  tp_mapping.Clear();
576
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
577
- ASSERT_OK(tp_mapping.Sort());
576
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
577
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
578
578
  seqs = tp_mapping.TEST_GetInternalMapping();
579
579
  // the max encoded entries is 100
580
580
  ASSERT_GE(seqs.size(), 100 - 1);
@@ -606,8 +606,8 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
606
606
  ASSERT_EQ(tables_props.size(), 1);
607
607
  it = tables_props.begin();
608
608
  tp_mapping.Clear();
609
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
610
- ASSERT_OK(tp_mapping.Sort());
609
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
610
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
611
611
  seqs = tp_mapping.TEST_GetInternalMapping();
612
612
  ASSERT_GE(seqs.size(), 99);
613
613
  ASSERT_LE(seqs.size(), 101);
@@ -721,8 +721,8 @@ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
721
721
  for (const auto& props : tables_props) {
722
722
  ASSERT_FALSE(props.second->seqno_to_time_mapping.empty());
723
723
  SeqnoToTimeMapping tp_mapping;
724
- ASSERT_OK(tp_mapping.Add(props.second->seqno_to_time_mapping));
725
- ASSERT_OK(tp_mapping.Sort());
724
+ ASSERT_OK(tp_mapping.DecodeFrom(props.second->seqno_to_time_mapping));
725
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
726
726
  ASSERT_FALSE(tp_mapping.Empty());
727
727
  auto seqs = tp_mapping.TEST_GetInternalMapping();
728
728
  // Add (roughly) one for starting entry.
@@ -746,7 +746,8 @@ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
746
746
  auto it = tables_props.begin();
747
747
  SeqnoToTimeMapping tp_mapping;
748
748
  ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
749
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
749
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
750
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
750
751
 
751
752
  // compact to the last level
752
753
  CompactRangeOptions cro;
@@ -773,7 +774,8 @@ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
773
774
 
774
775
  it = tables_props.begin();
775
776
  ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
776
- ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
777
+ ASSERT_OK(tp_mapping.DecodeFrom(it->second->seqno_to_time_mapping));
778
+ ASSERT_TRUE(tp_mapping.TEST_IsEnforced());
777
779
 
778
780
  // make half of the data expired
779
781
  mock_clock_->MockSleepForSeconds(static_cast<int>(8000));
@@ -929,7 +931,7 @@ TEST_P(SeqnoTimeTablePropTest, PrePopulateInDB) {
929
931
  DestroyAndReopen(track_options);
930
932
 
931
933
  // Ensure pre-population
932
- constexpr auto kPrePopPairs = SeqnoToTimeMapping::kMaxSeqnoTimePairsPerSST;
934
+ constexpr auto kPrePopPairs = kMaxSeqnoTimePairsPerSST;
933
935
  sttm = dbfull()->TEST_GetSeqnoToTimeMapping();
934
936
  latest_seqno = db_->GetLatestSequenceNumber();
935
937
  start_time = mock_clock_->NowSeconds();
@@ -970,7 +972,7 @@ TEST_P(SeqnoTimeTablePropTest, PrePopulateInDB) {
970
972
  sttm = dbfull()->TEST_GetSeqnoToTimeMapping();
971
973
  latest_seqno = db_->GetLatestSequenceNumber();
972
974
  end_time = mock_clock_->NowSeconds();
973
- ASSERT_EQ(sttm.Size(), kPrePopPairs);
975
+ ASSERT_GE(sttm.Size(), kPrePopPairs);
974
976
  ASSERT_EQ(sttm.GetProximalSeqnoBeforeTime(end_time), latest_seqno);
975
977
  ASSERT_EQ(sttm.GetProximalSeqnoBeforeTime(start_time - kPreserveSecs / 2),
976
978
  kPrePopPairs / 2);
@@ -1015,42 +1017,153 @@ TEST_P(SeqnoTimeTablePropTest, PrePopulateInDB) {
1015
1017
  }
1016
1018
 
1017
1019
  TEST_F(SeqnoTimeTest, MappingAppend) {
1018
- SeqnoToTimeMapping test(/*max_time_duration=*/100, /*max_capacity=*/10);
1020
+ using P = SeqnoToTimeMapping::SeqnoTimePair;
1021
+ SeqnoToTimeMapping test;
1022
+ test.SetMaxTimeSpan(100).SetCapacity(10);
1019
1023
 
1020
1024
  // ignore seqno == 0, as it may mean the seqno is zeroed out
1021
- ASSERT_FALSE(test.Append(0, 9));
1025
+ ASSERT_FALSE(test.Append(0, 100));
1022
1026
 
1023
- ASSERT_TRUE(test.Append(3, 10));
1027
+ ASSERT_TRUE(test.Append(3, 200));
1024
1028
  auto size = test.Size();
1025
1029
  // normal add
1026
- ASSERT_TRUE(test.Append(10, 11));
1030
+ ASSERT_TRUE(test.Append(10, 300));
1027
1031
  size++;
1028
1032
  ASSERT_EQ(size, test.Size());
1029
1033
 
1030
- // Append unsorted
1031
- ASSERT_FALSE(test.Append(8, 12));
1032
- ASSERT_EQ(size, test.Size());
1033
-
1034
1034
  // Append with the same seqno, newer time is rejected because that makes
1035
1035
  // GetProximalSeqnoBeforeTime queries worse (see later test)
1036
- ASSERT_FALSE(test.Append(10, 12));
1036
+ ASSERT_FALSE(test.Append(10, 301));
1037
1037
  ASSERT_EQ(size, test.Size());
1038
- // older time will be ignored
1039
- ASSERT_FALSE(test.Append(10, 9));
1038
+ ASSERT_EQ(test.TEST_GetLastEntry(), P({10, 300}));
1039
+
1040
+ // Same or new seqno with same or older time (as last successfully added) is
1041
+ // accepted by replacing last entry (improves GetProximalSeqnoBeforeTime
1042
+ // queries without blowing up size)
1043
+ ASSERT_FALSE(test.Append(10, 299));
1040
1044
  ASSERT_EQ(size, test.Size());
1045
+ ASSERT_EQ(test.TEST_GetLastEntry(), P({10, 299}));
1041
1046
 
1042
- // new seqno with old time will be ignored
1043
- ASSERT_FALSE(test.Append(12, 8));
1047
+ ASSERT_FALSE(test.Append(11, 299));
1044
1048
  ASSERT_EQ(size, test.Size());
1049
+ ASSERT_EQ(test.TEST_GetLastEntry(), P({11, 299}));
1045
1050
 
1046
- // new seqno with same time is accepted by replacing last entry
1047
- // (improves GetProximalSeqnoBeforeTime queries without blowing up size)
1048
- ASSERT_TRUE(test.Append(12, 11));
1051
+ ASSERT_FALSE(test.Append(11, 250));
1049
1052
  ASSERT_EQ(size, test.Size());
1053
+ ASSERT_EQ(test.TEST_GetLastEntry(), P({11, 250}));
1054
+ }
1055
+
1056
+ TEST_F(SeqnoTimeTest, CapacityLimits) {
1057
+ using P = SeqnoToTimeMapping::SeqnoTimePair;
1058
+ SeqnoToTimeMapping test;
1059
+
1060
+ test.SetCapacity(3);
1061
+ EXPECT_TRUE(test.Append(10, 300));
1062
+ EXPECT_TRUE(test.Append(20, 400));
1063
+ EXPECT_TRUE(test.Append(30, 500));
1064
+ EXPECT_TRUE(test.Append(40, 600));
1065
+ // Capacity 3 is small enough that the non-strict limit is
1066
+ // equal to the strict limit.
1067
+ EXPECT_EQ(3U, test.Size());
1068
+ EXPECT_EQ(test.TEST_GetLastEntry(), P({40, 600}));
1069
+
1070
+ // Same for Capacity 2
1071
+ test.SetCapacity(2);
1072
+ EXPECT_EQ(2U, test.Size());
1073
+ EXPECT_EQ(test.TEST_GetLastEntry(), P({40, 600}));
1074
+
1075
+ EXPECT_TRUE(test.Append(50, 700));
1076
+ EXPECT_EQ(2U, test.Size());
1077
+ EXPECT_EQ(test.TEST_GetLastEntry(), P({50, 700}));
1078
+
1079
+ // Capacity 1 is difficult to work with internally, so is
1080
+ // coerced to 2.
1081
+ test.SetCapacity(1);
1082
+ EXPECT_EQ(2U, test.Size());
1083
+ EXPECT_EQ(test.TEST_GetLastEntry(), P({50, 700}));
1084
+
1085
+ EXPECT_TRUE(test.Append(60, 800));
1086
+ EXPECT_EQ(2U, test.Size());
1087
+ EXPECT_EQ(test.TEST_GetLastEntry(), P({60, 800}));
1088
+
1089
+ // Capacity 0 means throw everything away
1090
+ test.SetCapacity(0);
1091
+ EXPECT_EQ(0U, test.Size());
1092
+
1093
+ EXPECT_FALSE(test.Append(70, 900));
1094
+ EXPECT_EQ(0U, test.Size());
1095
+
1096
+ // Unlimited capacity
1097
+ test.SetCapacity(UINT64_MAX);
1098
+ for (unsigned i = 1; i <= 10101U; i++) {
1099
+ EXPECT_TRUE(test.Append(i, 11U * i));
1100
+ }
1101
+ EXPECT_EQ(10101U, test.Size());
1102
+ }
1103
+
1104
+ TEST_F(SeqnoTimeTest, TimeSpanLimits) {
1105
+ SeqnoToTimeMapping test;
1106
+
1107
+ // Default: no limit
1108
+ for (unsigned i = 1; i <= 63U; i++) {
1109
+ EXPECT_TRUE(test.Append(1000 + i, uint64_t{1} << i));
1110
+ }
1111
+ // None dropped.
1112
+ EXPECT_EQ(63U, test.Size());
1113
+
1114
+ test.Clear();
1115
+
1116
+ // Explicit no limit
1117
+ test.SetMaxTimeSpan(UINT64_MAX);
1118
+ for (unsigned i = 1; i <= 63U; i++) {
1119
+ EXPECT_TRUE(test.Append(1000 + i, uint64_t{1} << i));
1120
+ }
1121
+ // None dropped.
1122
+ EXPECT_EQ(63U, test.Size());
1123
+
1124
+ // We generally keep 2 entries as long as the configured max time span
1125
+ // is non-zero
1126
+ test.SetMaxTimeSpan(10);
1127
+ EXPECT_EQ(2U, test.Size());
1128
+
1129
+ test.SetMaxTimeSpan(1);
1130
+ EXPECT_EQ(2U, test.Size());
1131
+
1132
+ // But go down to 1 entry if the max time span is zero
1133
+ test.SetMaxTimeSpan(0);
1134
+ EXPECT_EQ(1U, test.Size());
1135
+
1136
+ EXPECT_TRUE(test.Append(2000, (uint64_t{1} << 63) + 42U));
1137
+ EXPECT_EQ(1U, test.Size());
1138
+
1139
+ test.Clear();
1140
+
1141
+ // Test more typical behavior. Note that one entry at or beyond the max span
1142
+ // is kept.
1143
+ test.SetMaxTimeSpan(100);
1144
+ EXPECT_TRUE(test.Append(1001, 123));
1145
+ EXPECT_TRUE(test.Append(1002, 134));
1146
+ EXPECT_TRUE(test.Append(1003, 150));
1147
+ EXPECT_TRUE(test.Append(1004, 189));
1148
+ EXPECT_TRUE(test.Append(1005, 220));
1149
+ EXPECT_EQ(5U, test.Size());
1150
+ EXPECT_TRUE(test.Append(1006, 233));
1151
+ EXPECT_EQ(6U, test.Size());
1152
+ EXPECT_TRUE(test.Append(1007, 234));
1153
+ EXPECT_EQ(6U, test.Size());
1154
+ EXPECT_TRUE(test.Append(1008, 235));
1155
+ EXPECT_EQ(7U, test.Size());
1156
+ EXPECT_TRUE(test.Append(1009, 300));
1157
+ EXPECT_EQ(6U, test.Size());
1158
+ EXPECT_TRUE(test.Append(1010, 350));
1159
+ EXPECT_EQ(3U, test.Size());
1160
+ EXPECT_TRUE(test.Append(1011, 470));
1161
+ EXPECT_EQ(2U, test.Size());
1050
1162
  }
1051
1163
 
1052
1164
  TEST_F(SeqnoTimeTest, ProximalFunctions) {
1053
- SeqnoToTimeMapping test(/*max_time_duration=*/100, /*max_capacity=*/10);
1165
+ SeqnoToTimeMapping test;
1166
+ test.SetCapacity(10);
1054
1167
 
1055
1168
  EXPECT_EQ(test.GetProximalTimeBeforeSeqno(1), kUnknownTimeBeforeAll);
1056
1169
  EXPECT_EQ(test.GetProximalTimeBeforeSeqno(1000000000000U),
@@ -1081,6 +1194,7 @@ TEST_F(SeqnoTimeTest, ProximalFunctions) {
1081
1194
  // More samples
1082
1195
  EXPECT_TRUE(test.Append(20, 600));
1083
1196
  EXPECT_TRUE(test.Append(30, 700));
1197
+ EXPECT_EQ(test.Size(), 3U);
1084
1198
 
1085
1199
  EXPECT_EQ(test.GetProximalTimeBeforeSeqno(10), kUnknownTimeBeforeAll);
1086
1200
  EXPECT_EQ(test.GetProximalTimeBeforeSeqno(11), 500U);
@@ -1140,8 +1254,9 @@ TEST_F(SeqnoTimeTest, ProximalFunctions) {
1140
1254
 
1141
1255
  // Burst of writes during a short time creates an opportunity
1142
1256
  // for better results from GetProximalSeqnoBeforeTime(), at the
1143
- // expense of GetProximalTimeBeforeSeqno().
1144
- EXPECT_TRUE(test.Append(50, 900));
1257
+ // expense of GetProximalTimeBeforeSeqno(). False return indicates
1258
+ // merge with previous entry.
1259
+ EXPECT_FALSE(test.Append(50, 900));
1145
1260
 
1146
1261
  // These are subject to later revision depending on priorities
1147
1262
  EXPECT_EQ(test.GetProximalTimeBeforeSeqno(49), 700U);
@@ -1151,7 +1266,8 @@ TEST_F(SeqnoTimeTest, ProximalFunctions) {
1151
1266
  }
1152
1267
 
1153
1268
  TEST_F(SeqnoTimeTest, PrePopulate) {
1154
- SeqnoToTimeMapping test(/*max_time_duration=*/100, /*max_capacity=*/10);
1269
+ SeqnoToTimeMapping test;
1270
+ test.SetMaxTimeSpan(100).SetCapacity(10);
1155
1271
 
1156
1272
  EXPECT_EQ(test.Size(), 0U);
1157
1273
 
@@ -1194,14 +1310,102 @@ TEST_F(SeqnoTimeTest, PrePopulate) {
1194
1310
  }
1195
1311
  }
1196
1312
 
1197
- TEST_F(SeqnoTimeTest, TruncateOldEntries) {
1198
- constexpr uint64_t kMaxTimeDuration = 42;
1199
- SeqnoToTimeMapping test(kMaxTimeDuration, /*max_capacity=*/10);
1313
+ TEST_F(SeqnoTimeTest, CopyFromSeqnoRange) {
1314
+ SeqnoToTimeMapping test_from;
1315
+ SeqnoToTimeMapping test_to;
1316
+
1317
+ // With zero to draw from
1318
+ test_to.Clear();
1319
+ test_to.CopyFromSeqnoRange(test_from, 0, 1000000);
1320
+ EXPECT_EQ(test_to.Size(), 0U);
1321
+
1322
+ test_to.Clear();
1323
+ test_to.CopyFromSeqnoRange(test_from, 100, 100);
1324
+ EXPECT_EQ(test_to.Size(), 0U);
1325
+
1326
+ test_to.Clear();
1327
+ test_to.CopyFromSeqnoRange(test_from, kMaxSequenceNumber, 0);
1328
+ EXPECT_EQ(test_to.Size(), 0U);
1329
+
1330
+ // With one to draw from
1331
+ EXPECT_TRUE(test_from.Append(10, 500));
1332
+
1333
+ test_to.Clear();
1334
+ test_to.CopyFromSeqnoRange(test_from, 0, 1000000);
1335
+ EXPECT_EQ(test_to.Size(), 1U);
1336
+
1337
+ // Includes one entry before range
1338
+ test_to.Clear();
1339
+ test_to.CopyFromSeqnoRange(test_from, 100, 100);
1340
+ EXPECT_EQ(test_to.Size(), 1U);
1341
+
1342
+ // Includes one entry before range (even if somewhat nonsensical)
1343
+ test_to.Clear();
1344
+ test_to.CopyFromSeqnoRange(test_from, kMaxSequenceNumber, 0);
1345
+ EXPECT_EQ(test_to.Size(), 1U);
1346
+
1347
+ test_to.Clear();
1348
+ test_to.CopyFromSeqnoRange(test_from, 0, 9);
1349
+ EXPECT_EQ(test_to.Size(), 0U);
1350
+
1351
+ test_to.Clear();
1352
+ test_to.CopyFromSeqnoRange(test_from, 0, 10);
1353
+ EXPECT_EQ(test_to.Size(), 1U);
1354
+
1355
+ // With more to draw from
1356
+ EXPECT_TRUE(test_from.Append(20, 600));
1357
+ EXPECT_TRUE(test_from.Append(30, 700));
1358
+ EXPECT_TRUE(test_from.Append(40, 800));
1359
+ EXPECT_TRUE(test_from.Append(50, 900));
1360
+
1361
+ test_to.Clear();
1362
+ test_to.CopyFromSeqnoRange(test_from, 0, 1000000);
1363
+ EXPECT_EQ(test_to.Size(), 5U);
1364
+
1365
+ // Includes one entry before range
1366
+ test_to.Clear();
1367
+ test_to.CopyFromSeqnoRange(test_from, 100, 100);
1368
+ EXPECT_EQ(test_to.Size(), 1U);
1369
+
1370
+ test_to.Clear();
1371
+ test_to.CopyFromSeqnoRange(test_from, 19, 19);
1372
+ EXPECT_EQ(test_to.Size(), 1U);
1373
+
1374
+ // Includes one entry before range (even if somewhat nonsensical)
1375
+ test_to.Clear();
1376
+ test_to.CopyFromSeqnoRange(test_from, kMaxSequenceNumber, 0);
1377
+ EXPECT_EQ(test_to.Size(), 1U);
1378
+
1379
+ test_to.Clear();
1380
+ test_to.CopyFromSeqnoRange(test_from, 0, 9);
1381
+ EXPECT_EQ(test_to.Size(), 0U);
1382
+
1383
+ test_to.Clear();
1384
+ test_to.CopyFromSeqnoRange(test_from, 0, 10);
1385
+ EXPECT_EQ(test_to.Size(), 1U);
1386
+
1387
+ test_to.Clear();
1388
+ test_to.CopyFromSeqnoRange(test_from, 20, 20);
1389
+ EXPECT_EQ(test_to.Size(), 2U);
1390
+
1391
+ test_to.Clear();
1392
+ test_to.CopyFromSeqnoRange(test_from, 20, 29);
1393
+ EXPECT_EQ(test_to.Size(), 2U);
1394
+
1395
+ test_to.Clear();
1396
+ test_to.CopyFromSeqnoRange(test_from, 20, 30);
1397
+ EXPECT_EQ(test_to.Size(), 3U);
1398
+ }
1399
+
1400
+ TEST_F(SeqnoTimeTest, EnforceWithNow) {
1401
+ constexpr uint64_t kMaxTimeSpan = 420;
1402
+ SeqnoToTimeMapping test;
1403
+ test.SetMaxTimeSpan(kMaxTimeSpan).SetCapacity(10);
1200
1404
 
1201
1405
  EXPECT_EQ(test.Size(), 0U);
1202
1406
 
1203
1407
  // Safe on empty mapping
1204
- test.TruncateOldEntries(500);
1408
+ test.Enforce(/*now=*/500);
1205
1409
 
1206
1410
  EXPECT_EQ(test.Size(), 0U);
1207
1411
 
@@ -1223,13 +1427,13 @@ TEST_F(SeqnoTimeTest, TruncateOldEntries) {
1223
1427
  // etc.
1224
1428
 
1225
1429
  // Must keep first entry
1226
- test.TruncateOldEntries(500 + kMaxTimeDuration);
1430
+ test.Enforce(/*now=*/500 + kMaxTimeSpan);
1227
1431
  EXPECT_EQ(test.Size(), 5U);
1228
- test.TruncateOldEntries(599 + kMaxTimeDuration);
1432
+ test.Enforce(/*now=*/599 + kMaxTimeSpan);
1229
1433
  EXPECT_EQ(test.Size(), 5U);
1230
1434
 
1231
1435
  // Purges first entry
1232
- test.TruncateOldEntries(600 + kMaxTimeDuration);
1436
+ test.Enforce(/*now=*/600 + kMaxTimeSpan);
1233
1437
  EXPECT_EQ(test.Size(), 4U);
1234
1438
 
1235
1439
  EXPECT_EQ(test.GetProximalSeqnoBeforeTime(500), kUnknownSeqnoBeforeAll);
@@ -1239,20 +1443,20 @@ TEST_F(SeqnoTimeTest, TruncateOldEntries) {
1239
1443
  EXPECT_EQ(test.GetProximalSeqnoBeforeTime(700), 30U);
1240
1444
 
1241
1445
  // No effect
1242
- test.TruncateOldEntries(600 + kMaxTimeDuration);
1446
+ test.Enforce(/*now=*/600 + kMaxTimeSpan);
1243
1447
  EXPECT_EQ(test.Size(), 4U);
1244
- test.TruncateOldEntries(699 + kMaxTimeDuration);
1448
+ test.Enforce(/*now=*/699 + kMaxTimeSpan);
1245
1449
  EXPECT_EQ(test.Size(), 4U);
1246
1450
 
1247
1451
  // Purges next two
1248
- test.TruncateOldEntries(899 + kMaxTimeDuration);
1452
+ test.Enforce(/*now=*/899 + kMaxTimeSpan);
1249
1453
  EXPECT_EQ(test.Size(), 2U);
1250
1454
 
1251
1455
  EXPECT_EQ(test.GetProximalSeqnoBeforeTime(799), kUnknownSeqnoBeforeAll);
1252
1456
  EXPECT_EQ(test.GetProximalSeqnoBeforeTime(899), 40U);
1253
1457
 
1254
1458
  // Always keep last entry, to have a non-trivial seqno bound
1255
- test.TruncateOldEntries(10000000);
1459
+ test.Enforce(/*now=*/10000000);
1256
1460
  EXPECT_EQ(test.Size(), 1U);
1257
1461
 
1258
1462
  EXPECT_EQ(test.GetProximalSeqnoBeforeTime(10000000), 50U);
@@ -1262,67 +1466,114 @@ TEST_F(SeqnoTimeTest, Sort) {
1262
1466
  SeqnoToTimeMapping test;
1263
1467
 
1264
1468
  // single entry
1265
- test.Add(10, 11);
1266
- ASSERT_OK(test.Sort());
1469
+ test.AddUnenforced(10, 11);
1470
+ test.Enforce();
1267
1471
  ASSERT_EQ(test.Size(), 1);
1268
1472
 
1269
- // duplicate, should be removed by sort
1270
- test.Add(10, 11);
1271
- // same seqno, but older time, should be removed
1272
- test.Add(10, 9);
1473
+ // duplicate is ignored
1474
+ test.AddUnenforced(10, 11);
1475
+ test.Enforce();
1476
+ ASSERT_EQ(test.Size(), 1);
1273
1477
 
1274
- // unuseful ones, should be removed by sort
1275
- test.Add(11, 9);
1276
- test.Add(9, 8);
1478
+ // add some revised mappings for that seqno
1479
+ test.AddUnenforced(10, 10);
1480
+ test.AddUnenforced(10, 12);
1277
1481
 
1278
- // Good ones
1279
- test.Add(1, 10);
1280
- test.Add(100, 100);
1482
+ // We currently favor GetProximalSeqnoBeforeTime over
1483
+ // GetProximalTimeBeforeSeqno by keeping the older time.
1484
+ test.Enforce();
1485
+ auto seqs = test.TEST_GetInternalMapping();
1486
+ std::deque<SeqnoToTimeMapping::SeqnoTimePair> expected;
1487
+ expected.emplace_back(10, 10);
1488
+ ASSERT_EQ(expected, seqs);
1281
1489
 
1282
- ASSERT_OK(test.Sort());
1490
+ // add an inconsistent / unuseful mapping
1491
+ test.AddUnenforced(9, 11);
1492
+ test.Enforce();
1493
+ seqs = test.TEST_GetInternalMapping();
1494
+ ASSERT_EQ(expected, seqs);
1283
1495
 
1284
- auto seqs = test.TEST_GetInternalMapping();
1496
+ // And a mapping that is considered more useful (for
1497
+ // GetProximalSeqnoBeforeTime) and thus replaces that one
1498
+ test.AddUnenforced(11, 9);
1499
+ test.Enforce();
1500
+ seqs = test.TEST_GetInternalMapping();
1501
+ expected.clear();
1502
+ expected.emplace_back(11, 9);
1503
+ ASSERT_EQ(expected, seqs);
1285
1504
 
1286
- std::deque<SeqnoToTimeMapping::SeqnoTimePair> expected;
1287
- expected.emplace_back(1, 10);
1288
- expected.emplace_back(10, 11);
1505
+ // Add more good, non-mergable entries
1506
+ test.AddUnenforced(1, 5);
1507
+ test.AddUnenforced(100, 100);
1508
+ test.Enforce();
1509
+ seqs = test.TEST_GetInternalMapping();
1510
+ expected.clear();
1511
+ expected.emplace_back(1, 5);
1512
+ expected.emplace_back(11, 9);
1289
1513
  expected.emplace_back(100, 100);
1290
-
1291
1514
  ASSERT_EQ(expected, seqs);
1292
1515
  }
1293
1516
 
1294
1517
  TEST_F(SeqnoTimeTest, EncodeDecodeBasic) {
1295
- SeqnoToTimeMapping test(0, 1000);
1518
+ constexpr uint32_t kOriginalSamples = 1000;
1519
+ SeqnoToTimeMapping test;
1520
+ test.SetCapacity(kOriginalSamples);
1296
1521
 
1297
1522
  std::string output;
1298
- test.Encode(output, 0, 1000, 100);
1523
+ test.EncodeTo(output);
1299
1524
  ASSERT_TRUE(output.empty());
1300
1525
 
1301
- for (int i = 1; i <= 1000; i++) {
1302
- ASSERT_TRUE(test.Append(i, i * 10));
1303
- }
1304
- test.Encode(output, 0, 1000, 100);
1526
+ ASSERT_OK(test.DecodeFrom(output));
1527
+ ASSERT_EQ(test.Size(), 0U);
1305
1528
 
1529
+ Random rnd(123);
1530
+ for (uint32_t i = 1; i <= kOriginalSamples; i++) {
1531
+ ASSERT_TRUE(test.Append(i, i * 10 + rnd.Uniform(10)));
1532
+ }
1533
+ output.clear();
1534
+ test.EncodeTo(output);
1306
1535
  ASSERT_FALSE(output.empty());
1307
1536
 
1308
1537
  SeqnoToTimeMapping decoded;
1309
- ASSERT_OK(decoded.Add(output));
1310
- ASSERT_OK(decoded.Sort());
1311
- ASSERT_EQ(decoded.Size(), SeqnoToTimeMapping::kMaxSeqnoTimePairsPerSST);
1312
- ASSERT_EQ(test.Size(), 1000);
1313
-
1314
- for (SequenceNumber seq = 0; seq <= 1000; seq++) {
1315
- // test has the more accurate time mapping, encode only pick
1316
- // kMaxSeqnoTimePairsPerSST number of entries, which is less accurate
1317
- uint64_t target_time = test.GetProximalTimeBeforeSeqno(seq);
1318
- ASSERT_GE(decoded.GetProximalTimeBeforeSeqno(seq),
1319
- target_time < 200 ? 0 : target_time - 200);
1320
- ASSERT_LE(decoded.GetProximalTimeBeforeSeqno(seq), target_time);
1538
+ ASSERT_OK(decoded.DecodeFrom(output));
1539
+ ASSERT_TRUE(decoded.TEST_IsEnforced());
1540
+ ASSERT_EQ(test.Size(), decoded.Size());
1541
+ ASSERT_EQ(test.TEST_GetInternalMapping(), decoded.TEST_GetInternalMapping());
1542
+
1543
+ // Encode a reduced set of mappings
1544
+ constexpr uint32_t kReducedSize = 51U;
1545
+ output.clear();
1546
+ SeqnoToTimeMapping(test).SetCapacity(kReducedSize).EncodeTo(output);
1547
+
1548
+ decoded.Clear();
1549
+ ASSERT_OK(decoded.DecodeFrom(output));
1550
+ ASSERT_TRUE(decoded.TEST_IsEnforced());
1551
+ ASSERT_EQ(decoded.Size(), kReducedSize);
1552
+
1553
+ for (uint64_t t = 1; t <= kOriginalSamples * 11; t += 1 + t / 100) {
1554
+ SCOPED_TRACE("t=" + std::to_string(t));
1555
+ // `test` has the more accurate time mapping, but the reduced set should
1556
+ // nicely span and approximate the whole range
1557
+ auto orig_s = test.GetProximalSeqnoBeforeTime(t);
1558
+ auto approx_s = decoded.GetProximalSeqnoBeforeTime(t);
1559
+ // The oldest entry should be preserved exactly
1560
+ ASSERT_EQ(orig_s == kUnknownSeqnoBeforeAll,
1561
+ approx_s == kUnknownSeqnoBeforeAll);
1562
+ // The newest entry should be preserved exactly
1563
+ ASSERT_EQ(orig_s == kOriginalSamples, approx_s == kOriginalSamples);
1564
+
1565
+ // Approximate seqno before time should err toward older seqno to avoid
1566
+ // classifying data as old too early, but should be within a reasonable
1567
+ // bound.
1568
+ constexpr uint32_t kSeqnoFuzz = kOriginalSamples * 3 / 2 / kReducedSize;
1569
+ EXPECT_GE(approx_s + kSeqnoFuzz, orig_s);
1570
+ EXPECT_GE(orig_s, approx_s);
1321
1571
  }
1322
1572
  }
1323
1573
 
1324
- TEST_F(SeqnoTimeTest, EncodeDecodePerferNewTime) {
1325
- SeqnoToTimeMapping test(0, 10);
1574
+ TEST_F(SeqnoTimeTest, EncodeDecodeMinimizeTimeGaps) {
1575
+ SeqnoToTimeMapping test;
1576
+ test.SetCapacity(10);
1326
1577
 
1327
1578
  test.Append(1, 10);
1328
1579
  test.Append(5, 17);
@@ -1330,45 +1581,66 @@ TEST_F(SeqnoTimeTest, EncodeDecodePerferNewTime) {
1330
1581
  test.Append(8, 30);
1331
1582
 
1332
1583
  std::string output;
1333
- test.Encode(output, 1, 10, 0, 3);
1584
+ SeqnoToTimeMapping(test).SetCapacity(3).EncodeTo(output);
1334
1585
 
1335
1586
  SeqnoToTimeMapping decoded;
1336
- ASSERT_OK(decoded.Add(output));
1337
- ASSERT_OK(decoded.Sort());
1587
+ ASSERT_OK(decoded.DecodeFrom(output));
1588
+ ASSERT_TRUE(decoded.TEST_IsEnforced());
1338
1589
 
1339
1590
  ASSERT_EQ(decoded.Size(), 3);
1340
1591
 
1341
1592
  auto seqs = decoded.TEST_GetInternalMapping();
1342
1593
  std::deque<SeqnoToTimeMapping::SeqnoTimePair> expected;
1343
1594
  expected.emplace_back(1, 10);
1344
- expected.emplace_back(6, 25);
1595
+ expected.emplace_back(5, 17);
1345
1596
  expected.emplace_back(8, 30);
1346
1597
  ASSERT_EQ(expected, seqs);
1347
1598
 
1348
1599
  // Add a few large time number
1349
1600
  test.Append(10, 100);
1350
1601
  test.Append(13, 200);
1351
- test.Append(16, 300);
1602
+ test.Append(40, 250);
1603
+ test.Append(70, 300);
1352
1604
 
1353
1605
  output.clear();
1354
- test.Encode(output, 1, 20, 0, 4);
1606
+ SeqnoToTimeMapping(test).SetCapacity(4).EncodeTo(output);
1355
1607
  decoded.Clear();
1356
- ASSERT_OK(decoded.Add(output));
1357
- ASSERT_OK(decoded.Sort());
1608
+ ASSERT_OK(decoded.DecodeFrom(output));
1609
+ ASSERT_TRUE(decoded.TEST_IsEnforced());
1358
1610
  ASSERT_EQ(decoded.Size(), 4);
1359
1611
 
1360
1612
  expected.clear();
1613
+ // Except for beginning and end, entries are removed that minimize the
1614
+ // remaining time gaps, regardless of seqno gaps.
1361
1615
  expected.emplace_back(1, 10);
1362
- // entry #6, #8 are skipped as they are too close to #1.
1363
- // entry #100 is also within skip range, but if it's skipped, there not enough
1364
- // number to fill 4 entries, so select it.
1365
1616
  expected.emplace_back(10, 100);
1366
1617
  expected.emplace_back(13, 200);
1367
- expected.emplace_back(16, 300);
1618
+ expected.emplace_back(70, 300);
1368
1619
  seqs = decoded.TEST_GetInternalMapping();
1369
1620
  ASSERT_EQ(expected, seqs);
1370
1621
  }
1371
1622
 
1623
+ TEST(PackValueAndSeqnoTest, Basic) {
1624
+ std::string packed_value_buf;
1625
+ Slice packed_value_slice =
1626
+ PackValueAndWriteTime("foo", 30u, &packed_value_buf);
1627
+ auto [unpacked_value, write_time] =
1628
+ ParsePackedValueWithWriteTime(packed_value_slice);
1629
+ ASSERT_EQ(unpacked_value, "foo");
1630
+ ASSERT_EQ(write_time, 30u);
1631
+ ASSERT_EQ(ParsePackedValueForValue(packed_value_slice), "foo");
1632
+ }
1633
+
1634
+ TEST(PackValueAndWriteTimeTest, Basic) {
1635
+ std::string packed_value_buf;
1636
+ Slice packed_value_slice = PackValueAndSeqno("foo", 30u, &packed_value_buf);
1637
+ auto [unpacked_value, write_time] =
1638
+ ParsePackedValueWithSeqno(packed_value_slice);
1639
+ ASSERT_EQ(unpacked_value, "foo");
1640
+ ASSERT_EQ(write_time, 30u);
1641
+ ASSERT_EQ(ParsePackedValueForValue(packed_value_slice), "foo");
1642
+ }
1643
+
1372
1644
  } // namespace ROCKSDB_NAMESPACE
1373
1645
 
1374
1646