@nxtedition/rocksdb 13.1.4 → 13.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/binding.cc +43 -16
  2. package/deps/rocksdb/rocksdb/{TARGETS → BUCK} +27 -0
  3. package/deps/rocksdb/rocksdb/CMakeLists.txt +3 -1
  4. package/deps/rocksdb/rocksdb/Makefile +2 -2
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +3 -1
  6. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +2 -0
  7. package/deps/rocksdb/rocksdb/db/attribute_group_iterator_impl.h +34 -9
  8. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +7 -6
  9. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +5 -1
  10. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +22 -14
  11. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +149 -0
  12. package/deps/rocksdb/rocksdb/db/builder.cc +13 -24
  13. package/deps/rocksdb/rocksdb/db/coalescing_iterator.h +35 -10
  14. package/deps/rocksdb/rocksdb/db/column_family.cc +21 -10
  15. package/deps/rocksdb/rocksdb/db/column_family.h +15 -8
  16. package/deps/rocksdb/rocksdb/db/column_family_test.cc +98 -7
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +126 -16
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +51 -5
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +2 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +2 -8
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +24 -0
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +52 -22
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +9 -7
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +36 -9
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +6 -0
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +30 -17
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +26 -23
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +43 -33
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +6 -5
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +19 -9
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +6 -5
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +632 -411
  33. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +171 -51
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +7 -5
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +37 -10
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +51 -11
  37. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +10 -3
  38. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +350 -154
  39. package/deps/rocksdb/rocksdb/db/convenience.cc +1 -1
  40. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +62 -27
  41. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +68 -1
  42. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +91 -0
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +134 -70
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +71 -23
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +43 -16
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +47 -33
  47. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +27 -19
  48. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +38 -25
  49. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -3
  50. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +7 -4
  51. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +258 -42
  52. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +161 -9
  53. package/deps/rocksdb/rocksdb/db/db_iter.cc +118 -86
  54. package/deps/rocksdb/rocksdb/db/db_iter.h +44 -17
  55. package/deps/rocksdb/rocksdb/db/db_options_test.cc +27 -6
  56. package/deps/rocksdb/rocksdb/db/db_test.cc +48 -16
  57. package/deps/rocksdb/rocksdb/db/db_test2.cc +60 -15
  58. package/deps/rocksdb/rocksdb/db/db_test_util.cc +97 -44
  59. package/deps/rocksdb/rocksdb/db/db_test_util.h +7 -1
  60. package/deps/rocksdb/rocksdb/db/dbformat.cc +15 -5
  61. package/deps/rocksdb/rocksdb/db/dbformat.h +137 -55
  62. package/deps/rocksdb/rocksdb/db/event_helpers.cc +1 -0
  63. package/deps/rocksdb/rocksdb/db/experimental.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +663 -8
  65. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +152 -91
  66. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +134 -11
  67. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +55 -9
  68. package/deps/rocksdb/rocksdb/db/flush_job.cc +52 -29
  69. package/deps/rocksdb/rocksdb/db/flush_job.h +5 -3
  70. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +18 -12
  71. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +23 -29
  72. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +2 -0
  74. package/deps/rocksdb/rocksdb/db/internal_stats.cc +9 -6
  75. package/deps/rocksdb/rocksdb/db/internal_stats.h +54 -0
  76. package/deps/rocksdb/rocksdb/db/job_context.h +1 -1
  77. package/deps/rocksdb/rocksdb/db/log_reader.cc +6 -7
  78. package/deps/rocksdb/rocksdb/db/manifest_ops.cc +47 -0
  79. package/deps/rocksdb/rocksdb/db/manifest_ops.h +20 -0
  80. package/deps/rocksdb/rocksdb/db/memtable.cc +165 -64
  81. package/deps/rocksdb/rocksdb/db/memtable.h +422 -243
  82. package/deps/rocksdb/rocksdb/db/memtable_list.cc +99 -68
  83. package/deps/rocksdb/rocksdb/db/memtable_list.h +63 -38
  84. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +28 -25
  85. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_impl.h +118 -60
  86. package/deps/rocksdb/rocksdb/db/multi_cf_iterator_test.cc +344 -89
  87. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +2 -3
  88. package/deps/rocksdb/rocksdb/db/repair.cc +15 -14
  89. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -13
  90. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +7 -0
  91. package/deps/rocksdb/rocksdb/db/table_cache.cc +62 -65
  92. package/deps/rocksdb/rocksdb/db/table_cache.h +70 -76
  93. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +5 -6
  94. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  95. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +8 -7
  96. package/deps/rocksdb/rocksdb/db/version_builder.cc +17 -19
  97. package/deps/rocksdb/rocksdb/db/version_builder.h +13 -12
  98. package/deps/rocksdb/rocksdb/db/version_edit.h +30 -0
  99. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +3 -5
  100. package/deps/rocksdb/rocksdb/db/version_set.cc +89 -129
  101. package/deps/rocksdb/rocksdb/db/version_set.h +12 -4
  102. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -2
  103. package/deps/rocksdb/rocksdb/db/version_set_test.cc +12 -8
  104. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +0 -15
  105. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.h +0 -2
  106. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization_test.cc +9 -7
  107. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.cc +0 -8
  108. package/deps/rocksdb/rocksdb/db/wide/wide_columns_helper.h +28 -2
  109. package/deps/rocksdb/rocksdb/db/write_batch.cc +32 -10
  110. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +9 -0
  111. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +2 -1
  112. package/deps/rocksdb/rocksdb/db/write_thread.cc +3 -1
  113. package/deps/rocksdb/rocksdb/db/write_thread.h +6 -2
  114. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +15 -0
  115. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +7 -0
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +4 -0
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +18 -2
  118. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +100 -22
  119. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +15 -4
  120. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +34 -8
  121. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +223 -78
  122. package/deps/rocksdb/rocksdb/env/file_system.cc +6 -1
  123. package/deps/rocksdb/rocksdb/env/fs_posix.cc +53 -0
  124. package/deps/rocksdb/rocksdb/env/io_posix.cc +63 -17
  125. package/deps/rocksdb/rocksdb/env/io_posix.h +30 -1
  126. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +132 -48
  127. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +92 -24
  128. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +727 -109
  129. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +3 -4
  130. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +1 -1
  131. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +8 -0
  132. package/deps/rocksdb/rocksdb/include/rocksdb/attribute_groups.h +20 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +9 -0
  134. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +9 -5
  135. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +2 -0
  136. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +10 -2
  137. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +7 -0
  139. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +34 -37
  140. package/deps/rocksdb/rocksdb/include/rocksdb/iterator_base.h +21 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +56 -28
  142. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +3 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +36 -28
  144. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +11 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +84 -60
  147. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +102 -0
  148. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +89 -2
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +32 -0
  150. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +30 -1
  151. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +23 -2
  152. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +2 -2
  153. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -0
  154. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +79 -21
  155. package/deps/rocksdb/rocksdb/memtable/skiplist.h +41 -18
  156. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +1 -5
  157. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +169 -0
  158. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +400 -0
  159. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +2 -0
  160. package/deps/rocksdb/rocksdb/options/cf_options.cc +137 -82
  161. package/deps/rocksdb/rocksdb/options/cf_options.h +18 -6
  162. package/deps/rocksdb/rocksdb/options/configurable.cc +31 -17
  163. package/deps/rocksdb/rocksdb/options/configurable_helper.h +7 -6
  164. package/deps/rocksdb/rocksdb/options/options_helper.cc +10 -8
  165. package/deps/rocksdb/rocksdb/options/options_parser.cc +74 -54
  166. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +89 -0
  167. package/deps/rocksdb/rocksdb/options/options_test.cc +112 -26
  168. package/deps/rocksdb/rocksdb/port/port.h +5 -9
  169. package/deps/rocksdb/rocksdb/src.mk +8 -0
  170. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +4 -0
  171. package/deps/rocksdb/rocksdb/table/block_based/block.h +1 -7
  172. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +2 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +62 -80
  174. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +13 -3
  175. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +16 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +38 -7
  177. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +12 -4
  178. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +4 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +4 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +204 -1
  181. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +3 -3
  182. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +2 -1
  183. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +4 -0
  184. package/deps/rocksdb/rocksdb/table/format.cc +3 -3
  185. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +4 -1
  186. package/deps/rocksdb/rocksdb/table/mock_table.cc +0 -50
  187. package/deps/rocksdb/rocksdb/table/mock_table.h +53 -0
  188. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +4 -0
  189. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  190. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +10 -5
  191. package/deps/rocksdb/rocksdb/table/table_builder.h +3 -1
  192. package/deps/rocksdb/rocksdb/table/table_properties.cc +181 -0
  193. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +5 -5
  194. package/deps/rocksdb/rocksdb/table/table_test.cc +71 -64
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +45 -45
  196. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +35 -35
  197. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +43 -43
  198. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +41 -4
  199. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +1 -0
  200. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +1 -1
  201. package/deps/rocksdb/rocksdb/unreleased_history/add.sh +13 -0
  202. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +24 -5
  203. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +7 -0
  204. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +0 -52
  205. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +1 -10
  206. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +92 -0
  207. package/deps/rocksdb/rocksdb/util/thread_operation.h +1 -0
  208. package/deps/rocksdb/rocksdb/util/udt_util.cc +50 -4
  209. package/deps/rocksdb/rocksdb/util/udt_util.h +24 -11
  210. package/deps/rocksdb/rocksdb/util/udt_util_test.cc +26 -13
  211. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +1 -16
  212. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +2 -0
  213. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +214 -0
  214. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.h +60 -0
  215. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +124 -0
  216. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +441 -0
  217. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.cc +34 -3
  218. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_for_tiering_collector.h +7 -2
  219. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +437 -0
  220. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +34 -11
  221. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +14 -7
  222. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +7 -1
  223. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +17 -0
  224. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +69 -0
  225. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +20 -0
  226. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1290 -0
  227. package/deps/rocksdb/rocksdb/utilities/transactions/write_committed_transaction_ts_test.cc +324 -0
  228. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +18 -1
  229. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +8 -1
  230. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +57 -12
  231. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +32 -3
  232. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +33 -2
  233. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +721 -9
  234. package/deps/rocksdb/rocksdb.gyp +2 -0
  235. package/package.json +1 -1
  236. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  237. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -21,27 +21,21 @@ struct MultiCfIteratorInfo {
21
21
  int order;
22
22
  };
23
23
 
24
+ template <typename ResetFunc, typename PopulateFunc>
24
25
  class MultiCfIteratorImpl {
25
26
  public:
26
27
  MultiCfIteratorImpl(
27
- const Comparator* comparator,
28
- const std::vector<ColumnFamilyHandle*>& column_families,
29
- const std::vector<Iterator*>& child_iterators,
30
- std::function<void()> reset_func,
31
- std::function<void(const autovector<MultiCfIteratorInfo>&)> populate_func)
32
- : comparator_(comparator),
33
- heap_(MultiCfMinHeap(
34
- MultiCfHeapItemComparator<std::greater<int>>(comparator_))),
28
+ const ReadOptions& read_options, const Comparator* comparator,
29
+ std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>&&
30
+ cfh_iter_pairs,
31
+ ResetFunc reset_func, PopulateFunc populate_func)
32
+ : allow_unprepared_value_(read_options.allow_unprepared_value),
33
+ comparator_(comparator),
34
+ cfh_iter_pairs_(std::move(cfh_iter_pairs)),
35
35
  reset_func_(std::move(reset_func)),
36
- populate_func_(std::move(populate_func)) {
37
- assert(column_families.size() > 0 &&
38
- column_families.size() == child_iterators.size());
39
- cfh_iter_pairs_.reserve(column_families.size());
40
- for (size_t i = 0; i < column_families.size(); ++i) {
41
- cfh_iter_pairs_.emplace_back(
42
- column_families[i], std::unique_ptr<Iterator>(child_iterators[i]));
43
- }
44
- }
36
+ populate_func_(std::move(populate_func)),
37
+ heap_(MultiCfMinHeap(
38
+ MultiCfHeapItemComparator<std::greater<int>>(comparator_))) {}
45
39
  ~MultiCfIteratorImpl() { status_.PermitUncheckedError(); }
46
40
 
47
41
  // No copy allowed
@@ -101,10 +95,28 @@ class MultiCfIteratorImpl {
101
95
  AdvanceIterator(max_heap, [](Iterator* iter) { iter->Prev(); });
102
96
  }
103
97
 
98
+ bool PrepareValue() {
99
+ assert(Valid());
100
+
101
+ if (!allow_unprepared_value_) {
102
+ return true;
103
+ }
104
+
105
+ if (std::holds_alternative<MultiCfMaxHeap>(heap_)) {
106
+ return PopulateIterator(std::get<MultiCfMaxHeap>(heap_));
107
+ }
108
+
109
+ return PopulateIterator(std::get<MultiCfMinHeap>(heap_));
110
+ }
111
+
104
112
  private:
113
+ Status status_;
114
+ bool allow_unprepared_value_;
115
+ const Comparator* comparator_;
105
116
  std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>
106
117
  cfh_iter_pairs_;
107
- Status status_;
118
+ ResetFunc reset_func_;
119
+ PopulateFunc populate_func_;
108
120
 
109
121
  template <typename CompareOp>
110
122
  class MultiCfHeapItemComparator {
@@ -125,7 +137,7 @@ class MultiCfIteratorImpl {
125
137
  private:
126
138
  const Comparator* comparator_;
127
139
  };
128
- const Comparator* comparator_;
140
+
129
141
  using MultiCfMinHeap =
130
142
  BinaryHeap<MultiCfIteratorInfo,
131
143
  MultiCfHeapItemComparator<std::greater<int>>>;
@@ -136,9 +148,6 @@ class MultiCfIteratorImpl {
136
148
 
137
149
  MultiCfIterHeap heap_;
138
150
 
139
- std::function<void()> reset_func_;
140
- std::function<void(autovector<MultiCfIteratorInfo>)> populate_func_;
141
-
142
151
  Iterator* current() const {
143
152
  if (std::holds_alternative<MultiCfMaxHeap>(heap_)) {
144
153
  auto& max_heap = std::get<MultiCfMaxHeap>(heap_);
@@ -163,11 +172,11 @@ class MultiCfIteratorImpl {
163
172
  }
164
173
 
165
174
  void InitMinHeap() {
166
- heap_.emplace<MultiCfMinHeap>(
175
+ heap_.template emplace<MultiCfMinHeap>(
167
176
  MultiCfHeapItemComparator<std::greater<int>>(comparator_));
168
177
  }
169
178
  void InitMaxHeap() {
170
- heap_.emplace<MultiCfMaxHeap>(
179
+ heap_.template emplace<MultiCfMaxHeap>(
171
180
  MultiCfHeapItemComparator<std::less<int>>(comparator_));
172
181
  }
173
182
 
@@ -186,13 +195,14 @@ class MultiCfIteratorImpl {
186
195
  if (!status_.ok()) {
187
196
  // Non-OK status from the iterator. Bail out early
188
197
  heap.clear();
189
- break;
198
+ return;
190
199
  }
191
200
  }
192
201
  ++i;
193
202
  }
194
- if (!heap.empty()) {
195
- PopulateIterator(heap);
203
+ if (!allow_unprepared_value_ && !heap.empty()) {
204
+ [[maybe_unused]] const bool result = PopulateIterator(heap);
205
+ assert(result || (!Valid() && !status_.ok()));
196
206
  }
197
207
  }
198
208
 
@@ -212,32 +222,41 @@ class MultiCfIteratorImpl {
212
222
  // 2. Make sure all others have iterated past the top iterator key slice
213
223
  // 3. Advance the top iterator, and add it back to the heap if valid
214
224
  auto top = heap.top();
225
+ assert(top.iterator);
226
+ assert(top.iterator->Valid());
227
+ assert(top.iterator->status().ok());
228
+
215
229
  heap.pop();
216
- if (!heap.empty()) {
230
+
231
+ while (!heap.empty()) {
217
232
  auto current = heap.top();
218
233
  assert(current.iterator);
219
- while (current.iterator->Valid() &&
220
- comparator_->Compare(top.iterator->key(),
221
- current.iterator->key()) == 0) {
234
+ assert(current.iterator->Valid());
235
+ assert(current.iterator->status().ok());
236
+
237
+ if (comparator_->Compare(current.iterator->key(), top.iterator->key()) !=
238
+ 0) {
239
+ break;
240
+ }
241
+
242
+ advance_func(current.iterator);
243
+
244
+ if (current.iterator->Valid()) {
222
245
  assert(current.iterator->status().ok());
223
- advance_func(current.iterator);
224
- if (current.iterator->Valid()) {
225
- heap.replace_top(heap.top());
246
+ heap.replace_top(current);
247
+ } else {
248
+ considerStatus(current.iterator->status());
249
+ if (!status_.ok()) {
250
+ heap.clear();
251
+ return;
226
252
  } else {
227
- considerStatus(current.iterator->status());
228
- if (!status_.ok()) {
229
- heap.clear();
230
- return;
231
- } else {
232
- heap.pop();
233
- }
234
- }
235
- if (!heap.empty()) {
236
- current = heap.top();
253
+ heap.pop();
237
254
  }
238
255
  }
239
256
  }
257
+
240
258
  advance_func(top.iterator);
259
+
241
260
  if (top.iterator->Valid()) {
242
261
  assert(top.iterator->status().ok());
243
262
  heap.push(top);
@@ -249,13 +268,14 @@ class MultiCfIteratorImpl {
249
268
  }
250
269
  }
251
270
 
252
- if (!heap.empty()) {
253
- PopulateIterator(heap);
271
+ if (!allow_unprepared_value_ && !heap.empty()) {
272
+ [[maybe_unused]] const bool result = PopulateIterator(heap);
273
+ assert(result || (!Valid() && !status_.ok()));
254
274
  }
255
275
  }
256
276
 
257
277
  template <typename BinaryHeap>
258
- void PopulateIterator(BinaryHeap& heap) {
278
+ bool PopulateIterator(BinaryHeap& heap) {
259
279
  // 1. Keep the top iterator (by popping it from the heap) and add it to list
260
280
  // to populate
261
281
  // 2. For all non-top iterators having the same key as top iter popped
@@ -265,31 +285,69 @@ class MultiCfIteratorImpl {
265
285
  // populate the value/columns and attribute_groups from the list
266
286
  // collected in step 1 and 2 and add all the iters back to the heap
267
287
  assert(!heap.empty());
288
+
289
+ auto prepare_value = [this, &heap](Iterator* iterator) {
290
+ assert(iterator);
291
+ assert(iterator->Valid());
292
+ assert(iterator->status().ok());
293
+
294
+ if (!iterator->PrepareValue()) {
295
+ assert(!iterator->Valid());
296
+ assert(!iterator->status().ok());
297
+
298
+ considerStatus(iterator->status());
299
+ heap.clear();
300
+
301
+ assert(!Valid());
302
+ assert(!status_.ok());
303
+
304
+ return false;
305
+ }
306
+
307
+ return true;
308
+ };
309
+
268
310
  auto top = heap.top();
269
- heap.pop();
311
+ assert(top.iterator);
312
+ assert(top.iterator->Valid());
313
+ assert(top.iterator->status().ok());
314
+
315
+ if (!prepare_value(top.iterator)) {
316
+ return false;
317
+ }
318
+
270
319
  autovector<MultiCfIteratorInfo> to_populate;
320
+
271
321
  to_populate.push_back(top);
272
- if (!heap.empty()) {
322
+ heap.pop();
323
+
324
+ while (!heap.empty()) {
273
325
  auto current = heap.top();
274
326
  assert(current.iterator);
275
- while (current.iterator->Valid() &&
276
- comparator_->Compare(top.iterator->key(),
277
- current.iterator->key()) == 0) {
278
- assert(current.iterator->status().ok());
279
- to_populate.push_back(current);
280
- heap.pop();
281
- if (!heap.empty()) {
282
- current = heap.top();
283
- } else {
284
- break;
285
- }
327
+ assert(current.iterator->Valid());
328
+ assert(current.iterator->status().ok());
329
+
330
+ if (comparator_->Compare(current.iterator->key(), top.iterator->key()) !=
331
+ 0) {
332
+ break;
333
+ }
334
+
335
+ if (!prepare_value(current.iterator)) {
336
+ return false;
286
337
  }
338
+
339
+ to_populate.push_back(current);
340
+ heap.pop();
287
341
  }
342
+
288
343
  // Add the items back to the heap
289
344
  for (auto& item : to_populate) {
290
345
  heap.push(item);
291
346
  }
347
+
292
348
  populate_func_(to_populate);
349
+
350
+ return true;
293
351
  }
294
352
  };
295
353