@nxtedition/rocksdb 7.1.20 → 7.1.21

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 (262) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +13 -6
  2. package/deps/rocksdb/rocksdb/Makefile +1 -1
  3. package/deps/rocksdb/rocksdb/TARGETS +2 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager_test.cc +1 -0
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +4 -4
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +139 -161
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +92 -82
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +16 -3
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -3
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +73 -30
  11. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +25 -67
  12. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +41 -40
  13. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +109 -155
  14. package/deps/rocksdb/rocksdb/cache/lru_cache.h +127 -149
  15. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +75 -80
  16. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +22 -172
  17. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +272 -85
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +12 -4
  19. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator_test.cc +1 -0
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +1 -0
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +1 -0
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +1 -0
  24. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +1 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_garbage_meter_test.cc +1 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +13 -4
  27. package/deps/rocksdb/rocksdb/db/builder.cc +1 -1
  28. package/deps/rocksdb/rocksdb/db/column_family.cc +15 -1
  29. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +1 -0
  30. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator_test.cc +1 -0
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +25 -7
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +10 -0
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +22 -8
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +14 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1 -0
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +38 -12
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -6
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +408 -6
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +244 -54
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +27 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +25 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +87 -26
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +23 -4
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +61 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +294 -21
  46. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +1 -0
  47. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +1 -0
  48. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -10
  49. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +4 -4
  50. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +272 -0
  51. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +38 -0
  52. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +69 -25
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +7 -3
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +29 -12
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +0 -12
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +10 -4
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +35 -22
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +5 -1
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +40 -5
  60. package/deps/rocksdb/rocksdb/db/db_iter.cc +1 -0
  61. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +1 -0
  62. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +22 -0
  64. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +1 -0
  65. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +1 -0
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +72 -5
  67. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +60 -21
  68. package/deps/rocksdb/rocksdb/db/db_test.cc +170 -1
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +9 -3
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +19 -0
  71. package/deps/rocksdb/rocksdb/db/db_test_util.h +32 -0
  72. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +444 -3
  73. package/deps/rocksdb/rocksdb/db/db_write_test.cc +8 -8
  74. package/deps/rocksdb/rocksdb/db/dbformat.cc +13 -0
  75. package/deps/rocksdb/rocksdb/db/dbformat.h +59 -4
  76. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +1 -0
  77. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -1
  78. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +24 -3
  79. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +1 -0
  80. package/deps/rocksdb/rocksdb/db/filename_test.cc +1 -0
  81. package/deps/rocksdb/rocksdb/db/flush_job.cc +4 -3
  82. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +1 -0
  83. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +85 -43
  84. package/deps/rocksdb/rocksdb/db/forward_iterator.h +3 -1
  85. package/deps/rocksdb/rocksdb/db/internal_stats.cc +33 -6
  86. package/deps/rocksdb/rocksdb/db/internal_stats.h +6 -0
  87. package/deps/rocksdb/rocksdb/db/listener_test.cc +1 -0
  88. package/deps/rocksdb/rocksdb/db/log_test.cc +1 -0
  89. package/deps/rocksdb/rocksdb/db/log_writer.cc +1 -1
  90. package/deps/rocksdb/rocksdb/db/log_writer.h +1 -1
  91. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +1 -0
  92. package/deps/rocksdb/rocksdb/db/memtable.cc +158 -56
  93. package/deps/rocksdb/rocksdb/db/memtable.h +2 -0
  94. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +1 -0
  95. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +1 -0
  96. package/deps/rocksdb/rocksdb/db/options_file_test.cc +1 -0
  97. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +1 -0
  98. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +1 -0
  99. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1 -0
  100. package/deps/rocksdb/rocksdb/db/prefix_test.cc +1 -0
  101. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +52 -9
  102. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +31 -2
  103. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +1 -0
  104. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +81 -42
  105. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +78 -12
  106. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -0
  107. package/deps/rocksdb/rocksdb/db/repair_test.cc +1 -0
  108. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +154 -27
  109. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +21 -4
  110. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +4 -1
  111. package/deps/rocksdb/rocksdb/db/table_cache.cc +18 -6
  112. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -0
  113. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1 -0
  114. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +1 -0
  115. package/deps/rocksdb/rocksdb/db/version_set.cc +15 -7
  116. package/deps/rocksdb/rocksdb/db/version_set.h +2 -1
  117. package/deps/rocksdb/rocksdb/db/version_set_test.cc +1 -0
  118. package/deps/rocksdb/rocksdb/db/version_util.h +3 -1
  119. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +1 -0
  120. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +28 -9
  121. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +21 -0
  122. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +30 -0
  123. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +4 -0
  124. package/deps/rocksdb/rocksdb/db/write_batch.cc +30 -7
  125. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +24 -13
  126. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +5 -4
  127. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +1 -0
  128. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +1 -0
  129. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +104 -60
  130. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +199 -108
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +39 -0
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +8 -0
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +3 -1
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +19 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +26 -0
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +247 -118
  137. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +24 -4
  138. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +18 -0
  139. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +129 -1
  140. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +22 -0
  141. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -0
  142. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +312 -117
  143. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +1 -0
  144. package/deps/rocksdb/rocksdb/env/fs_posix.cc +10 -2
  145. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +1 -0
  146. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +1 -0
  147. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +5 -1
  148. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +1 -0
  149. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +1 -0
  150. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +1 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +49 -1
  152. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +44 -18
  153. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +8 -7
  154. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +6 -1
  155. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +3 -0
  156. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -4
  157. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +4 -0
  158. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +7 -0
  159. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +1 -1
  160. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +9 -0
  161. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +3 -6
  162. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +1 -0
  163. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +1 -0
  164. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -0
  165. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -88
  166. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  167. package/deps/rocksdb/rocksdb/memory/arena_test.cc +61 -0
  168. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +1 -0
  169. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +1 -0
  170. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +1 -0
  171. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +1 -0
  172. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +1 -0
  173. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +1 -0
  174. package/deps/rocksdb/rocksdb/options/cf_options.cc +19 -0
  175. package/deps/rocksdb/rocksdb/options/cf_options.h +8 -0
  176. package/deps/rocksdb/rocksdb/options/configurable_test.cc +1 -0
  177. package/deps/rocksdb/rocksdb/options/options.cc +7 -0
  178. package/deps/rocksdb/rocksdb/options/options_helper.cc +6 -0
  179. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +6 -0
  180. package/deps/rocksdb/rocksdb/options/options_test.cc +63 -40
  181. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  182. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  183. package/deps/rocksdb/rocksdb/port/stack_trace.cc +7 -0
  184. package/deps/rocksdb/rocksdb/port/stack_trace.h +4 -1
  185. package/deps/rocksdb/rocksdb/port/win/port_win.h +2 -7
  186. package/deps/rocksdb/rocksdb/src.mk +1 -0
  187. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +7 -7
  188. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -3
  189. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +1 -0
  190. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +1 -0
  191. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +1 -0
  192. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +1 -0
  193. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +1 -0
  194. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +1 -0
  195. package/deps/rocksdb/rocksdb/table/get_context.cc +19 -1
  196. package/deps/rocksdb/rocksdb/table/get_context.h +9 -0
  197. package/deps/rocksdb/rocksdb/table/merger_test.cc +1 -0
  198. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +10 -11
  199. package/deps/rocksdb/rocksdb/table/mock_table.cc +37 -19
  200. package/deps/rocksdb/rocksdb/table/mock_table.h +5 -1
  201. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +6 -0
  202. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +33 -0
  203. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +45 -6
  204. package/deps/rocksdb/rocksdb/test_util/testharness.h +2 -0
  205. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +1 -0
  206. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +5 -0
  207. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +1 -0
  208. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +1 -0
  209. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +36 -0
  210. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +1 -0
  211. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +1 -0
  212. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +1 -0
  213. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +1 -0
  214. package/deps/rocksdb/rocksdb/util/autovector_test.cc +1 -0
  215. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -0
  216. package/deps/rocksdb/rocksdb/util/coding_test.cc +1 -0
  217. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +1 -0
  218. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +1 -0
  219. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -0
  220. package/deps/rocksdb/rocksdb/util/filelock_test.cc +1 -0
  221. package/deps/rocksdb/rocksdb/util/gflags_compat.h +12 -7
  222. package/deps/rocksdb/rocksdb/util/hash_test.cc +1 -0
  223. package/deps/rocksdb/rocksdb/util/heap_test.cc +4 -2
  224. package/deps/rocksdb/rocksdb/util/random_test.cc +1 -0
  225. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +1 -0
  226. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +1 -0
  227. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +1 -0
  228. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +1 -0
  229. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +1 -0
  230. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +1 -0
  231. package/deps/rocksdb/rocksdb/util/timer_test.cc +1 -0
  232. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +4 -0
  233. package/deps/rocksdb/rocksdb/utilities/agg_merge/agg_merge_test.cc +1 -0
  234. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +13 -0
  235. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -3
  236. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +1 -0
  237. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +1 -0
  238. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +1 -0
  239. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +1 -0
  240. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +1 -0
  241. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +1 -0
  242. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +1 -0
  243. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +8 -0
  244. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -0
  245. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +1 -0
  246. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +1 -0
  247. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +1 -0
  248. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -0
  249. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +1 -0
  250. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1 -0
  251. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +1 -0
  252. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1 -0
  253. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +1 -0
  254. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +1 -0
  255. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +1 -0
  256. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +1 -0
  257. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +7 -0
  258. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +20 -0
  259. package/index.js +12 -4
  260. package/package.json +1 -1
  261. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  262. package/prebuilds/linux-x64/node.napi.node +0 -0
@@ -9,6 +9,7 @@
9
9
  #include "db/seqno_to_time_mapping.h"
10
10
  #include "port/stack_trace.h"
11
11
  #include "rocksdb/iostats_context.h"
12
+ #include "rocksdb/utilities/debug.h"
12
13
  #include "test_util/mock_time_env.h"
13
14
 
14
15
  #ifndef ROCKSDB_LITE
@@ -37,7 +38,7 @@ class SeqnoTimeTest : public DBTestBase {
37
38
  }
38
39
 
39
40
  // make sure the file is not in cache, otherwise it won't have IO info
40
- void AssertKetTemperature(int key_id, Temperature expected_temperature) {
41
+ void AssertKeyTemperature(int key_id, Temperature expected_temperature) {
41
42
  get_iostats_context()->Reset();
42
43
  IOStatsContext* iostats = get_iostats_context();
43
44
  std::string result = Get(Key(key_id));
@@ -101,7 +102,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
101
102
  ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
102
103
 
103
104
  // read a random key, which should be hot (kUnknown)
104
- AssertKetTemperature(20, Temperature::kUnknown);
105
+ AssertKeyTemperature(20, Temperature::kUnknown);
105
106
 
106
107
  // Write more data, but still all hot until the 10th SST, as:
107
108
  // write a key every 10 seconds, 100 keys per SST, each SST takes 1000 seconds
@@ -139,7 +140,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
139
140
  ASSERT_GT(hot_data_size, 0);
140
141
  ASSERT_GT(cold_data_size, 0);
141
142
  // the first a few key should be cold
142
- AssertKetTemperature(20, Temperature::kCold);
143
+ AssertKeyTemperature(20, Temperature::kCold);
143
144
 
144
145
  for (int i = 0; i < 30; i++) {
145
146
  dbfull()->TEST_WaitForPeridicTaskRun([&] {
@@ -148,8 +149,8 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
148
149
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
149
150
 
150
151
  // the hot/cold data cut off range should be between i * 20 + 200 -> 250
151
- AssertKetTemperature(i * 20 + 250, Temperature::kUnknown);
152
- AssertKetTemperature(i * 20 + 200, Temperature::kCold);
152
+ AssertKeyTemperature(i * 20 + 250, Temperature::kUnknown);
153
+ AssertKeyTemperature(i * 20 + 200, Temperature::kCold);
153
154
  }
154
155
 
155
156
  ASSERT_LT(GetSstSizeHelper(Temperature::kUnknown), hot_data_size);
@@ -166,7 +167,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
166
167
  }
167
168
 
168
169
  // any random data close to the end should be cold
169
- AssertKetTemperature(1000, Temperature::kCold);
170
+ AssertKeyTemperature(1000, Temperature::kCold);
170
171
 
171
172
  // close explicitly, because the env is local variable which will be released
172
173
  // first.
@@ -215,7 +216,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
215
216
  ASSERT_EQ(GetSstSizeHelper(Temperature::kCold), 0);
216
217
 
217
218
  // read a random key, which should be hot (kUnknown)
218
- AssertKetTemperature(20, Temperature::kUnknown);
219
+ AssertKeyTemperature(20, Temperature::kUnknown);
219
220
 
220
221
  // Adding more data to have mixed hot and cold data
221
222
  for (; sst_num < 14; sst_num++) {
@@ -237,7 +238,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
237
238
  ASSERT_GT(hot_data_size, 0);
238
239
  ASSERT_GT(cold_data_size, 0);
239
240
  // the first a few key should be cold
240
- AssertKetTemperature(20, Temperature::kCold);
241
+ AssertKeyTemperature(20, Temperature::kCold);
241
242
 
242
243
  // Wait some time, with each wait, the cold data is increasing and hot data is
243
244
  // decreasing
@@ -253,8 +254,8 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
253
254
  ASSERT_GT(cold_data_size, pre_cold);
254
255
 
255
256
  // the hot/cold cut_off key should be around i * 20 + 400 -> 450
256
- AssertKetTemperature(i * 20 + 450, Temperature::kUnknown);
257
- AssertKetTemperature(i * 20 + 400, Temperature::kCold);
257
+ AssertKeyTemperature(i * 20 + 450, Temperature::kUnknown);
258
+ AssertKeyTemperature(i * 20 + 400, Temperature::kCold);
258
259
  }
259
260
 
260
261
  // Wait again, the most of the data should be cold after that
@@ -267,14 +268,53 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
267
268
  }
268
269
 
269
270
  // any random data close to the end should be cold
270
- AssertKetTemperature(1000, Temperature::kCold);
271
+ AssertKeyTemperature(1000, Temperature::kCold);
271
272
 
272
273
  Close();
273
274
  }
274
275
 
275
- TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
276
+ enum class SeqnoTimeTestType : char {
277
+ kTrackInternalTimeSeconds = 0,
278
+ kPrecludeLastLevel = 1,
279
+ kBothSetTrackSmaller = 2,
280
+ };
281
+
282
+ class SeqnoTimeTablePropTest
283
+ : public SeqnoTimeTest,
284
+ public ::testing::WithParamInterface<SeqnoTimeTestType> {
285
+ public:
286
+ SeqnoTimeTablePropTest() : SeqnoTimeTest() {}
287
+
288
+ void SetTrackTimeDurationOptions(uint64_t track_time_duration,
289
+ Options& options) const {
290
+ // either option set will enable the time tracking feature
291
+ switch (GetParam()) {
292
+ case SeqnoTimeTestType::kTrackInternalTimeSeconds:
293
+ options.preclude_last_level_data_seconds = 0;
294
+ options.preserve_internal_time_seconds = track_time_duration;
295
+ break;
296
+ case SeqnoTimeTestType::kPrecludeLastLevel:
297
+ options.preclude_last_level_data_seconds = track_time_duration;
298
+ options.preserve_internal_time_seconds = 0;
299
+ break;
300
+ case SeqnoTimeTestType::kBothSetTrackSmaller:
301
+ options.preclude_last_level_data_seconds = track_time_duration;
302
+ options.preserve_internal_time_seconds = track_time_duration / 10;
303
+ break;
304
+ }
305
+ }
306
+ };
307
+
308
+ INSTANTIATE_TEST_CASE_P(
309
+ SeqnoTimeTablePropTest, SeqnoTimeTablePropTest,
310
+ ::testing::Values(SeqnoTimeTestType::kTrackInternalTimeSeconds,
311
+ SeqnoTimeTestType::kPrecludeLastLevel,
312
+ SeqnoTimeTestType::kBothSetTrackSmaller));
313
+
314
+ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
276
315
  Options options = CurrentOptions();
277
- options.preclude_last_level_data_seconds = 10000;
316
+ SetTrackTimeDurationOptions(10000, options);
317
+
278
318
  options.env = mock_env_.get();
279
319
  options.disable_auto_compactions = true;
280
320
  DestroyAndReopen(options);
@@ -297,6 +337,8 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
297
337
  ASSERT_OK(tp_mapping.Sort());
298
338
  ASSERT_FALSE(tp_mapping.Empty());
299
339
  auto seqs = tp_mapping.TEST_GetInternalMapping();
340
+ // about ~20 seqs->time entries, because the sample rate is 10000/100, and it
341
+ // passes 2k time.
300
342
  ASSERT_GE(seqs.size(), 19);
301
343
  ASSERT_LE(seqs.size(), 21);
302
344
  SequenceNumber seq_end = dbfull()->GetLatestSequenceNumber();
@@ -444,7 +486,8 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
444
486
  ASSERT_LE(seqs.size(), 101);
445
487
  for (auto i = start_seq; i < seq_end - 99; i++) {
446
488
  // likely the first 100 entries reports 0
447
- ASSERT_LE(tp_mapping.GetOldestApproximateTime(i), (i - start_seq) + 3000);
489
+ ASSERT_LE(tp_mapping.GetOldestApproximateTime(i),
490
+ (i - start_seq) * 100 + 50000);
448
491
  }
449
492
  start_seq += 101;
450
493
 
@@ -457,9 +500,10 @@ TEST_F(SeqnoTimeTest, BasicSeqnoToTimeMapping) {
457
500
  ASSERT_OK(db_->Close());
458
501
  }
459
502
 
460
- TEST_F(SeqnoTimeTest, MultiCFs) {
503
+ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
461
504
  Options options = CurrentOptions();
462
505
  options.preclude_last_level_data_seconds = 0;
506
+ options.preserve_internal_time_seconds = 0;
463
507
  options.env = mock_env_.get();
464
508
  options.stats_dump_period_sec = 0;
465
509
  options.stats_persist_period_sec = 0;
@@ -485,7 +529,7 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
485
529
  ASSERT_TRUE(dbfull()->TEST_GetSeqnoToTimeMapping().Empty());
486
530
 
487
531
  Options options_1 = options;
488
- options_1.preclude_last_level_data_seconds = 10000; // 10k
532
+ SetTrackTimeDurationOptions(10000, options_1);
489
533
  CreateColumnFamilies({"one"}, options_1);
490
534
  ASSERT_TRUE(scheduler.TEST_HasTask(PeriodicTaskType::kRecordSeqnoTime));
491
535
 
@@ -514,11 +558,11 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
514
558
  ASSERT_FALSE(tp_mapping.Empty());
515
559
  auto seqs = tp_mapping.TEST_GetInternalMapping();
516
560
  ASSERT_GE(seqs.size(), 1);
517
- ASSERT_LE(seqs.size(), 3);
561
+ ASSERT_LE(seqs.size(), 4);
518
562
 
519
563
  // Create one more CF with larger preclude_last_level time
520
564
  Options options_2 = options;
521
- options_2.preclude_last_level_data_seconds = 1000000; // 1m
565
+ SetTrackTimeDurationOptions(1000000, options_2); // 1m
522
566
  CreateColumnFamilies({"two"}, options_2);
523
567
 
524
568
  // Add more data to CF "two" to fill the in memory mapping
@@ -618,11 +662,11 @@ TEST_F(SeqnoTimeTest, MultiCFs) {
618
662
  Close();
619
663
  }
620
664
 
621
- TEST_F(SeqnoTimeTest, MultiInstancesBasic) {
665
+ TEST_P(SeqnoTimeTablePropTest, MultiInstancesBasic) {
622
666
  const int kInstanceNum = 2;
623
667
 
624
668
  Options options = CurrentOptions();
625
- options.preclude_last_level_data_seconds = 10000;
669
+ SetTrackTimeDurationOptions(10000, options);
626
670
  options.env = mock_env_.get();
627
671
  options.stats_dump_period_sec = 0;
628
672
  options.stats_persist_period_sec = 0;
@@ -650,17 +694,32 @@ TEST_F(SeqnoTimeTest, MultiInstancesBasic) {
650
694
  }
651
695
  }
652
696
 
653
- TEST_F(SeqnoTimeTest, SeqnoToTimeMappingUniversal) {
697
+ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
698
+ const int kNumTrigger = 4;
699
+ const int kNumLevels = 7;
700
+ const int kNumKeys = 100;
701
+
654
702
  Options options = CurrentOptions();
703
+ SetTrackTimeDurationOptions(10000, options);
655
704
  options.compaction_style = kCompactionStyleUniversal;
656
- options.preclude_last_level_data_seconds = 10000;
705
+ options.num_levels = kNumLevels;
657
706
  options.env = mock_env_.get();
658
707
 
659
708
  DestroyAndReopen(options);
660
709
 
661
- for (int j = 0; j < 3; j++) {
662
- for (int i = 0; i < 100; i++) {
663
- ASSERT_OK(Put(Key(i), "value"));
710
+ std::atomic_uint64_t num_seqno_zeroing{0};
711
+
712
+ SyncPoint::GetInstance()->DisableProcessing();
713
+ SyncPoint::GetInstance()->ClearAllCallBacks();
714
+ SyncPoint::GetInstance()->SetCallBack(
715
+ "CompactionIterator::PrepareOutput:ZeroingSeq",
716
+ [&](void* /*arg*/) { num_seqno_zeroing++; });
717
+ SyncPoint::GetInstance()->EnableProcessing();
718
+
719
+ int sst_num = 0;
720
+ for (; sst_num < kNumTrigger - 1; sst_num++) {
721
+ for (int i = 0; i < kNumKeys; i++) {
722
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
664
723
  dbfull()->TEST_WaitForPeridicTaskRun(
665
724
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
666
725
  }
@@ -681,11 +740,12 @@ TEST_F(SeqnoTimeTest, SeqnoToTimeMappingUniversal) {
681
740
  }
682
741
 
683
742
  // Trigger a compaction
684
- for (int i = 0; i < 100; i++) {
685
- ASSERT_OK(Put(Key(i), "value"));
743
+ for (int i = 0; i < kNumKeys; i++) {
744
+ ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
686
745
  dbfull()->TEST_WaitForPeridicTaskRun(
687
746
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
688
747
  }
748
+ sst_num++;
689
749
  ASSERT_OK(Flush());
690
750
  ASSERT_OK(dbfull()->TEST_WaitForCompact());
691
751
  tables_props.clear();
@@ -696,6 +756,73 @@ TEST_F(SeqnoTimeTest, SeqnoToTimeMappingUniversal) {
696
756
  SeqnoToTimeMapping tp_mapping;
697
757
  ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
698
758
  ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
759
+
760
+ // compact to the last level
761
+ CompactRangeOptions cro;
762
+ cro.bottommost_level_compaction = BottommostLevelCompaction::kForce;
763
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
764
+ // make sure the data is all compacted to penultimate level if the feature is
765
+ // on, otherwise, compacted to the last level.
766
+ if (options.preclude_last_level_data_seconds > 0) {
767
+ ASSERT_GT(NumTableFilesAtLevel(5), 0);
768
+ ASSERT_EQ(NumTableFilesAtLevel(6), 0);
769
+ } else {
770
+ ASSERT_EQ(NumTableFilesAtLevel(5), 0);
771
+ ASSERT_GT(NumTableFilesAtLevel(6), 0);
772
+ }
773
+
774
+ // regardless the file is on the last level or not, it should keep the time
775
+ // information and sequence number are not set
776
+ tables_props.clear();
777
+ tp_mapping.Clear();
778
+ ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
779
+
780
+ ASSERT_EQ(tables_props.size(), 1);
781
+ ASSERT_EQ(num_seqno_zeroing, 0);
782
+
783
+ it = tables_props.begin();
784
+ ASSERT_FALSE(it->second->seqno_to_time_mapping.empty());
785
+ ASSERT_OK(tp_mapping.Add(it->second->seqno_to_time_mapping));
786
+
787
+ // make half of the data expired
788
+ mock_clock_->MockSleepForSeconds(static_cast<int>(8000));
789
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
790
+
791
+ tables_props.clear();
792
+ tp_mapping.Clear();
793
+ ASSERT_OK(dbfull()->GetPropertiesOfAllTables(&tables_props));
794
+
795
+ if (options.preclude_last_level_data_seconds > 0) {
796
+ ASSERT_EQ(tables_props.size(), 2);
797
+ } else {
798
+ ASSERT_EQ(tables_props.size(), 1);
799
+ }
800
+ ASSERT_GT(num_seqno_zeroing, 0);
801
+ std::vector<KeyVersion> key_versions;
802
+ ASSERT_OK(GetAllKeyVersions(db_, Slice(), Slice(),
803
+ std::numeric_limits<size_t>::max(),
804
+ &key_versions));
805
+ // make sure there're more than 300 keys and first 100 keys are having seqno
806
+ // zeroed out, the last 100 key seqno not zeroed out
807
+ ASSERT_GT(key_versions.size(), 300);
808
+ for (int i = 0; i < 100; i++) {
809
+ ASSERT_EQ(key_versions[i].sequence, 0);
810
+ }
811
+ auto rit = key_versions.rbegin();
812
+ for (int i = 0; i < 100; i++) {
813
+ ASSERT_GT(rit->sequence, 0);
814
+ rit++;
815
+ }
816
+
817
+ // make all data expired and compact again to push it to the last level
818
+ // regardless if the tiering feature is enabled or not
819
+ mock_clock_->MockSleepForSeconds(static_cast<int>(20000));
820
+
821
+ ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
822
+
823
+ ASSERT_GT(num_seqno_zeroing, 0);
824
+ ASSERT_GT(NumTableFilesAtLevel(6), 0);
825
+
699
826
  Close();
700
827
  }
701
828
 
@@ -31,11 +31,11 @@ void SeqnoToTimeMapping::Add(SequenceNumber seqno, uint64_t time) {
31
31
  seqno_time_mapping_.emplace_back(seqno, time);
32
32
  }
33
33
 
34
- SequenceNumber SeqnoToTimeMapping::TruncateOldEntries(const uint64_t now) {
34
+ void SeqnoToTimeMapping::TruncateOldEntries(const uint64_t now) {
35
35
  assert(is_sorted_);
36
36
 
37
37
  if (max_time_duration_ == 0) {
38
- return 0;
38
+ return;
39
39
  }
40
40
 
41
41
  const uint64_t cut_off_time =
@@ -48,12 +48,25 @@ SequenceNumber SeqnoToTimeMapping::TruncateOldEntries(const uint64_t now) {
48
48
  return target < other.time;
49
49
  });
50
50
  if (it == seqno_time_mapping_.begin()) {
51
- return 0;
51
+ return;
52
52
  }
53
53
  it--;
54
54
  seqno_time_mapping_.erase(seqno_time_mapping_.begin(), it);
55
+ }
55
56
 
56
- return seqno_time_mapping_.front().seqno;
57
+ SequenceNumber SeqnoToTimeMapping::GetOldestSequenceNum(uint64_t time) {
58
+ assert(is_sorted_);
59
+
60
+ auto it = std::upper_bound(
61
+ seqno_time_mapping_.begin(), seqno_time_mapping_.end(), time,
62
+ [](uint64_t target, const SeqnoTimePair& other) -> bool {
63
+ return target < other.time;
64
+ });
65
+ if (it == seqno_time_mapping_.begin()) {
66
+ return 0;
67
+ }
68
+ it--;
69
+ return it->seqno;
57
70
  }
58
71
 
59
72
  // The encoded format is:
@@ -94,6 +107,10 @@ void SeqnoToTimeMapping::Encode(std::string& dest, const SequenceNumber start,
94
107
  start_it++;
95
108
  }
96
109
  }
110
+ // to include the first element
111
+ if (start_it != seqno_time_mapping_.begin()) {
112
+ start_it--;
113
+ }
97
114
 
98
115
  // If there are more data than needed, pick the entries for encoding.
99
116
  // It's not the most optimized algorithm for selecting the best representative
@@ -107,7 +107,10 @@ class SeqnoToTimeMapping {
107
107
  uint64_t GetOldestApproximateTime(SequenceNumber seqno) const;
108
108
 
109
109
  // Truncate the old entries based on the current time and max_time_duration_
110
- SequenceNumber TruncateOldEntries(uint64_t now);
110
+ void TruncateOldEntries(uint64_t now);
111
+
112
+ // Given a time, return it's oldest possible sequence number
113
+ SequenceNumber GetOldestSequenceNum(uint64_t time);
111
114
 
112
115
  // Encode to a binary string
113
116
  void Encode(std::string& des, SequenceNumber start, SequenceNumber end,
@@ -490,9 +490,15 @@ Status TableCache::Get(
490
490
  std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
491
491
  t->NewRangeTombstoneIterator(options));
492
492
  if (range_del_iter != nullptr) {
493
- *max_covering_tombstone_seq = std::max(
494
- *max_covering_tombstone_seq,
495
- range_del_iter->MaxCoveringTombstoneSeqnum(ExtractUserKey(k)));
493
+ SequenceNumber seq =
494
+ range_del_iter->MaxCoveringTombstoneSeqnum(ExtractUserKey(k));
495
+ if (seq > *max_covering_tombstone_seq) {
496
+ *max_covering_tombstone_seq = seq;
497
+ if (get_context->NeedTimestamp()) {
498
+ get_context->SetTimestampFromRangeTombstone(
499
+ range_del_iter->timestamp());
500
+ }
501
+ }
496
502
  }
497
503
  }
498
504
  if (s.ok()) {
@@ -535,9 +541,15 @@ void TableCache::UpdateRangeTombstoneSeqnums(
535
541
  for (auto iter = table_range.begin(); iter != table_range.end(); ++iter) {
536
542
  SequenceNumber* max_covering_tombstone_seq =
537
543
  iter->get_context->max_covering_tombstone_seq();
538
- *max_covering_tombstone_seq = std::max(
539
- *max_covering_tombstone_seq,
540
- range_del_iter->MaxCoveringTombstoneSeqnum(iter->ukey_with_ts));
544
+ SequenceNumber seq =
545
+ range_del_iter->MaxCoveringTombstoneSeqnum(iter->ukey_with_ts);
546
+ if (seq > *max_covering_tombstone_seq) {
547
+ *max_covering_tombstone_seq = seq;
548
+ if (iter->get_context->NeedTimestamp()) {
549
+ iter->get_context->SetTimestampFromRangeTombstone(
550
+ range_del_iter->timestamp());
551
+ }
552
+ }
541
553
  }
542
554
  }
543
555
  }
@@ -507,6 +507,7 @@ INSTANTIATE_TEST_CASE_P(CustomizedTablePropertiesCollector, TablePropertiesTest,
507
507
  } // namespace ROCKSDB_NAMESPACE
508
508
 
509
509
  int main(int argc, char** argv) {
510
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
510
511
  ::testing::InitGoogleTest(&argc, argv);
511
512
  return RUN_ALL_TESTS();
512
513
  }
@@ -1689,6 +1689,7 @@ TEST_F(VersionBuilderTest, EstimatedActiveKeys) {
1689
1689
  } // namespace ROCKSDB_NAMESPACE
1690
1690
 
1691
1691
  int main(int argc, char** argv) {
1692
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
1692
1693
  ::testing::InitGoogleTest(&argc, argv);
1693
1694
  return RUN_ALL_TESTS();
1694
1695
  }
@@ -724,6 +724,7 @@ TEST(FileMetaDataTest, UpdateBoundariesBlobIndex) {
724
724
  } // namespace ROCKSDB_NAMESPACE
725
725
 
726
726
  int main(int argc, char** argv) {
727
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
727
728
  ::testing::InitGoogleTest(&argc, argv);
728
729
  return RUN_ALL_TESTS();
729
730
  }
@@ -1632,6 +1632,7 @@ Status Version::TablesRangeTombstoneSummary(int max_entries_to_print,
1632
1632
  if (tombstone_iter) {
1633
1633
  tombstone_iter->SeekToFirst();
1634
1634
 
1635
+ // TODO: print timestamp
1635
1636
  while (tombstone_iter->Valid() && num_entries_left > 0) {
1636
1637
  ss << "start: " << tombstone_iter->start_key().ToString(true)
1637
1638
  << " end: " << tombstone_iter->end_key().ToString(true)
@@ -2914,7 +2915,9 @@ void VersionStorageInfo::PrepareForVersionAppend(
2914
2915
  GenerateFileIndexer();
2915
2916
  GenerateLevelFilesBrief();
2916
2917
  GenerateLevel0NonOverlapping();
2917
- GenerateBottommostFiles();
2918
+ if (!immutable_options.allow_ingest_behind) {
2919
+ GenerateBottommostFiles();
2920
+ }
2918
2921
  GenerateFileLocationIndex();
2919
2922
  }
2920
2923
 
@@ -3354,7 +3357,9 @@ void VersionStorageInfo::ComputeCompactionScore(
3354
3357
  }
3355
3358
  }
3356
3359
  ComputeFilesMarkedForCompaction();
3357
- ComputeBottommostFilesMarkedForCompaction();
3360
+ if (!immutable_options.allow_ingest_behind) {
3361
+ ComputeBottommostFilesMarkedForCompaction();
3362
+ }
3358
3363
  if (mutable_cf_options.ttl > 0) {
3359
3364
  ComputeExpiredTtlFiles(immutable_options, mutable_cf_options.ttl);
3360
3365
  }
@@ -4560,6 +4565,10 @@ std::string Version::DebugString(bool hex, bool print_stats) const {
4560
4565
  AppendNumberTo(&r, level);
4561
4566
  r.append(" --- version# ");
4562
4567
  AppendNumberTo(&r, version_number_);
4568
+ if (storage_info_.compact_cursor_[level].Valid()) {
4569
+ r.append(" --- compact_cursor: ");
4570
+ r.append(storage_info_.compact_cursor_[level].DebugString(hex));
4571
+ }
4563
4572
  r.append(" ---\n");
4564
4573
  const std::vector<FileMetaData*>& files = storage_info_.files_[level];
4565
4574
  for (size_t i = 0; i < files.size(); i++) {
@@ -5514,7 +5523,7 @@ Status VersionSet::GetCurrentManifestPath(const std::string& dbname,
5514
5523
 
5515
5524
  Status VersionSet::Recover(
5516
5525
  const std::vector<ColumnFamilyDescriptor>& column_families, bool read_only,
5517
- std::string* db_id) {
5526
+ std::string* db_id, bool no_error_if_files_missing) {
5518
5527
  // Read "CURRENT" file, which contains a pointer to the current manifest file
5519
5528
  std::string manifest_path;
5520
5529
  Status s = GetCurrentManifestPath(dbname_, fs_.get(), &manifest_path,
@@ -5547,10 +5556,9 @@ Status VersionSet::Recover(
5547
5556
  reporter.status = &log_read_status;
5548
5557
  log::Reader reader(nullptr, std::move(manifest_file_reader), &reporter,
5549
5558
  true /* checksum */, 0 /* log_number */);
5550
- VersionEditHandler handler(read_only, column_families,
5551
- const_cast<VersionSet*>(this),
5552
- /*track_missing_files=*/false,
5553
- /*no_error_if_files_missing=*/false, io_tracer_);
5559
+ VersionEditHandler handler(
5560
+ read_only, column_families, const_cast<VersionSet*>(this),
5561
+ /*track_missing_files=*/false, no_error_if_files_missing, io_tracer_);
5554
5562
  handler.Iterate(reader, &log_read_status);
5555
5563
  s = handler.status();
5556
5564
  if (s.ok()) {
@@ -1175,7 +1175,8 @@ class VersionSet {
1175
1175
  // If read_only == true, Recover() will not complain if some column families
1176
1176
  // are not opened
1177
1177
  Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families,
1178
- bool read_only = false, std::string* db_id = nullptr);
1178
+ bool read_only = false, std::string* db_id = nullptr,
1179
+ bool no_error_if_files_missing = false);
1179
1180
 
1180
1181
  Status TryRecover(const std::vector<ColumnFamilyDescriptor>& column_families,
1181
1182
  bool read_only,
@@ -3579,6 +3579,7 @@ TEST_P(ChargeFileMetadataTestWithParam, Basic) {
3579
3579
  } // namespace ROCKSDB_NAMESPACE
3580
3580
 
3581
3581
  int main(int argc, char** argv) {
3582
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3582
3583
  ::testing::InitGoogleTest(&argc, argv);
3583
3584
  return RUN_ALL_TESTS();
3584
3585
  }
@@ -28,7 +28,9 @@ class OfflineManifestWriter {
28
28
  /*db_id*/ "", /*db_session_id*/ "") {}
29
29
 
30
30
  Status Recover(const std::vector<ColumnFamilyDescriptor>& column_families) {
31
- return versions_.Recover(column_families);
31
+ return versions_.Recover(column_families, /*read_only*/ false,
32
+ /*db_id*/ nullptr,
33
+ /*no_error_if_files_missing*/ true);
32
34
  }
33
35
 
34
36
  Status LogAndApply(ColumnFamilyData* cfd, VersionEdit* edit,
@@ -329,6 +329,7 @@ TEST_F(WalManagerTest, TransactionLogIteratorNewFileWhileScanning) {
329
329
  } // namespace ROCKSDB_NAMESPACE
330
330
 
331
331
  int main(int argc, char** argv) {
332
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
332
333
  ::testing::InitGoogleTest(&argc, argv);
333
334
  return RUN_ALL_TESTS();
334
335
  }
@@ -15,20 +15,32 @@
15
15
 
16
16
  namespace ROCKSDB_NAMESPACE {
17
17
 
18
- const Slice kDefaultWideColumnName;
18
+ Status WideColumnSerialization::SerializeImpl(const Slice* value_of_default,
19
+ const WideColumns& columns,
20
+ std::string& output) {
21
+ const size_t num_columns =
22
+ value_of_default ? columns.size() + 1 : columns.size();
19
23
 
20
- const WideColumns kNoWideColumns;
21
-
22
- Status WideColumnSerialization::Serialize(const WideColumns& columns,
23
- std::string& output) {
24
- if (columns.size() >
25
- static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
24
+ if (num_columns > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
26
25
  return Status::InvalidArgument("Too many wide columns");
27
26
  }
28
27
 
29
28
  PutVarint32(&output, kCurrentVersion);
30
29
 
31
- PutVarint32(&output, static_cast<uint32_t>(columns.size()));
30
+ PutVarint32(&output, static_cast<uint32_t>(num_columns));
31
+
32
+ const Slice* prev_name = nullptr;
33
+ if (value_of_default) {
34
+ if (value_of_default->size() >
35
+ static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
36
+ return Status::InvalidArgument("Wide column value too long");
37
+ }
38
+
39
+ PutLengthPrefixedSlice(&output, kDefaultWideColumnName);
40
+ PutVarint32(&output, static_cast<uint32_t>(value_of_default->size()));
41
+
42
+ prev_name = &kDefaultWideColumnName;
43
+ }
32
44
 
33
45
  for (size_t i = 0; i < columns.size(); ++i) {
34
46
  const WideColumn& column = columns[i];
@@ -38,7 +50,8 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
38
50
  static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
39
51
  return Status::InvalidArgument("Wide column name too long");
40
52
  }
41
- if (i > 0 && columns[i - 1].name().compare(name) >= 0) {
53
+
54
+ if (prev_name && prev_name->compare(name) >= 0) {
42
55
  return Status::Corruption("Wide columns out of order");
43
56
  }
44
57
 
@@ -50,6 +63,12 @@ Status WideColumnSerialization::Serialize(const WideColumns& columns,
50
63
 
51
64
  PutLengthPrefixedSlice(&output, name);
52
65
  PutVarint32(&output, static_cast<uint32_t>(value.size()));
66
+
67
+ prev_name = &name;
68
+ }
69
+
70
+ if (value_of_default) {
71
+ output.append(value_of_default->data(), value_of_default->size());
53
72
  }
54
73
 
55
74
  for (const auto& column : columns) {
@@ -44,6 +44,10 @@ class Slice;
44
44
  class WideColumnSerialization {
45
45
  public:
46
46
  static Status Serialize(const WideColumns& columns, std::string& output);
47
+ static Status Serialize(const Slice& value_of_default,
48
+ const WideColumns& other_columns,
49
+ std::string& output);
50
+
47
51
  static Status Deserialize(Slice& input, WideColumns& columns);
48
52
 
49
53
  static WideColumns::const_iterator Find(const WideColumns& columns,
@@ -51,6 +55,23 @@ class WideColumnSerialization {
51
55
  static Status GetValueOfDefaultColumn(Slice& input, Slice& value);
52
56
 
53
57
  static constexpr uint32_t kCurrentVersion = 1;
58
+
59
+ private:
60
+ static Status SerializeImpl(const Slice* value_of_default,
61
+ const WideColumns& columns, std::string& output);
54
62
  };
55
63
 
64
+ inline Status WideColumnSerialization::Serialize(const WideColumns& columns,
65
+ std::string& output) {
66
+ constexpr Slice* value_of_default = nullptr;
67
+
68
+ return SerializeImpl(value_of_default, columns, output);
69
+ }
70
+
71
+ inline Status WideColumnSerialization::Serialize(
72
+ const Slice& value_of_default, const WideColumns& other_columns,
73
+ std::string& output) {
74
+ return SerializeImpl(&value_of_default, other_columns, output);
75
+ }
76
+
56
77
  } // namespace ROCKSDB_NAMESPACE