@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
@@ -15,53 +15,74 @@ class CoalescingIteratorTest : public DBTestBase {
15
15
 
16
16
  // Verify Iteration of CoalescingIterator
17
17
  // by SeekToFirst() + Next() and SeekToLast() + Prev()
18
- void verifyCoalescingIterator(const std::vector<ColumnFamilyHandle*>& cfhs,
18
+ void VerifyCoalescingIterator(const std::vector<ColumnFamilyHandle*>& cfhs,
19
19
  const std::vector<Slice>& expected_keys,
20
20
  const std::vector<Slice>& expected_values,
21
21
  const std::optional<std::vector<WideColumns>>&
22
22
  expected_wide_columns = std::nullopt,
23
23
  const Slice* lower_bound = nullptr,
24
- const Slice* upper_bound = nullptr) {
25
- int i = 0;
24
+ const Slice* upper_bound = nullptr,
25
+ bool allow_unprepared_value = false) {
26
+ const size_t num_keys = expected_keys.size();
27
+
26
28
  ReadOptions read_options;
27
29
  read_options.iterate_lower_bound = lower_bound;
28
30
  read_options.iterate_upper_bound = upper_bound;
31
+ read_options.allow_unprepared_value = allow_unprepared_value;
32
+
29
33
  std::unique_ptr<Iterator> iter =
30
34
  db_->NewCoalescingIterator(read_options, cfhs);
31
- for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
32
- ASSERT_EQ(expected_keys[i], iter->key());
33
- ASSERT_EQ(expected_values[i], iter->value());
35
+
36
+ auto check_iter_entry = [&](size_t idx) {
37
+ ASSERT_EQ(iter->key(), expected_keys[idx]);
38
+
39
+ if (allow_unprepared_value) {
40
+ ASSERT_TRUE(iter->value().empty());
41
+ ASSERT_TRUE(iter->PrepareValue());
42
+ ASSERT_TRUE(iter->Valid());
43
+ }
44
+
45
+ ASSERT_EQ(iter->value(), expected_values[idx]);
34
46
  if (expected_wide_columns.has_value()) {
35
- ASSERT_EQ(expected_wide_columns.value()[i], iter->columns());
47
+ ASSERT_EQ(iter->columns(), expected_wide_columns.value()[idx]);
36
48
  }
37
- ++i;
49
+ };
50
+
51
+ {
52
+ size_t i = 0;
53
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
54
+ check_iter_entry(i);
55
+ ++i;
56
+ }
57
+
58
+ ASSERT_EQ(num_keys, i);
59
+ ASSERT_OK(iter->status());
38
60
  }
39
- ASSERT_EQ(expected_keys.size(), i);
40
- ASSERT_OK(iter->status());
41
61
 
42
- int rev_i = i - 1;
43
- for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
44
- ASSERT_EQ(expected_keys[rev_i], iter->key());
45
- ASSERT_EQ(expected_values[rev_i], iter->value());
46
- if (expected_wide_columns.has_value()) {
47
- ASSERT_EQ(expected_wide_columns.value()[rev_i], iter->columns());
62
+ {
63
+ size_t i = 0;
64
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
65
+ check_iter_entry(num_keys - 1 - i);
66
+ ++i;
48
67
  }
49
- rev_i--;
68
+
69
+ ASSERT_EQ(num_keys, i);
70
+ ASSERT_OK(iter->status());
50
71
  }
51
- ASSERT_OK(iter->status());
52
72
  }
53
73
 
54
- void verifyExpectedKeys(ColumnFamilyHandle* cfh,
74
+ void VerifyExpectedKeys(ColumnFamilyHandle* cfh,
55
75
  const std::vector<Slice>& expected_keys) {
56
- int i = 0;
57
- Iterator* iter = db_->NewIterator(ReadOptions(), cfh);
76
+ std::unique_ptr<Iterator> iter(db_->NewIterator(ReadOptions(), cfh));
77
+
78
+ size_t i = 0;
58
79
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
59
- ASSERT_EQ(expected_keys[i], iter->key());
80
+ ASSERT_EQ(iter->key(), expected_keys[i]);
60
81
  ++i;
61
82
  }
62
- ASSERT_EQ(expected_keys.size(), i);
83
+
84
+ ASSERT_EQ(i, expected_keys.size());
63
85
  ASSERT_OK(iter->status());
64
- delete iter;
65
86
  }
66
87
  };
67
88
 
@@ -96,7 +117,7 @@ TEST_F(CoalescingIteratorTest, SimpleValues) {
96
117
  // Test for iteration over CF default->1->2->3
97
118
  std::vector<ColumnFamilyHandle*> cfhs_order_0_1_2_3 = {
98
119
  handles_[0], handles_[1], handles_[2], handles_[3]};
99
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
120
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
100
121
  expected_values);
101
122
 
102
123
  // Test for iteration over CF 3->1->default_cf->2
@@ -104,7 +125,7 @@ TEST_F(CoalescingIteratorTest, SimpleValues) {
104
125
  handles_[3], handles_[1], handles_[0], handles_[2]};
105
126
  // Iteration order and the return values should be the same since keys are
106
127
  // unique per CF
107
- verifyCoalescingIterator(cfhs_order_3_1_0_2, expected_keys,
128
+ VerifyCoalescingIterator(cfhs_order_3_1_0_2, expected_keys,
108
129
  expected_values);
109
130
 
110
131
  // Verify Seek()
@@ -163,14 +184,14 @@ TEST_F(CoalescingIteratorTest, SimpleValues) {
163
184
  handles_[0], handles_[1], handles_[2], handles_[3]};
164
185
  std::vector<Slice> expected_values = {"key_1_cf_3_val", "key_2_cf_2_val",
165
186
  "key_3_cf_3_val"};
166
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
187
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
167
188
  expected_values);
168
189
 
169
190
  // Test for iteration over CFs 3->2->default_cf->1
170
191
  std::vector<ColumnFamilyHandle*> cfhs_order_3_2_0_1 = {
171
192
  handles_[3], handles_[2], handles_[0], handles_[1]};
172
193
  expected_values = {"key_1_cf_0_val", "key_2_cf_1_val", "key_3_cf_1_val"};
173
- verifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
194
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
174
195
  expected_values);
175
196
 
176
197
  // Verify Seek()
@@ -227,7 +248,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
227
248
  std::vector<Slice> expected_keys = {"key_2", "key_3", "key_4"};
228
249
  std::vector<Slice> expected_values = {"key_2_cf_1_val", "key_3_cf_2_val",
229
250
  "key_4_cf_3_val"};
230
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
251
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
231
252
  expected_values, std::nullopt, &lb);
232
253
  }
233
254
  // with upper_bound
@@ -236,7 +257,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
236
257
  Slice ub = Slice("key_3");
237
258
  std::vector<Slice> expected_keys = {"key_1", "key_2"};
238
259
  std::vector<Slice> expected_values = {"key_1_cf_0_val", "key_2_cf_1_val"};
239
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
260
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
240
261
  expected_values, std::nullopt, nullptr, &ub);
241
262
  }
242
263
  // with lower and upper bound
@@ -245,7 +266,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
245
266
  Slice ub = Slice("key_4");
246
267
  std::vector<Slice> expected_keys = {"key_2", "key_3"};
247
268
  std::vector<Slice> expected_values = {"key_2_cf_1_val", "key_3_cf_2_val"};
248
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
269
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
249
270
  expected_values, std::nullopt, &lb, &ub);
250
271
  }
251
272
 
@@ -312,7 +333,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
312
333
  Slice lb = Slice("key_2");
313
334
  std::vector<Slice> expected_keys = {"key_2", "key_3"};
314
335
  std::vector<Slice> expected_values = {"key_2_cf_2_val", "key_3_cf_3_val"};
315
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
336
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
316
337
  expected_values, std::nullopt, &lb);
317
338
  }
318
339
  // with upper_bound
@@ -321,7 +342,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
321
342
  Slice ub = Slice("key_3");
322
343
  std::vector<Slice> expected_keys = {"key_1", "key_2"};
323
344
  std::vector<Slice> expected_values = {"key_1_cf_3_val", "key_2_cf_2_val"};
324
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
345
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
325
346
  expected_values, std::nullopt, nullptr, &ub);
326
347
  }
327
348
  // with lower and upper bound
@@ -330,7 +351,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
330
351
  Slice ub = Slice("key_3");
331
352
  std::vector<Slice> expected_keys = {"key_2"};
332
353
  std::vector<Slice> expected_values = {"key_2_cf_2_val"};
333
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
354
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys,
334
355
  expected_values, std::nullopt, &lb, &ub);
335
356
  }
336
357
 
@@ -342,7 +363,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
342
363
  Slice lb = Slice("key_2");
343
364
  std::vector<Slice> expected_keys = {"key_2", "key_3"};
344
365
  std::vector<Slice> expected_values = {"key_2_cf_1_val", "key_3_cf_1_val"};
345
- verifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
366
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
346
367
  expected_values, std::nullopt, &lb);
347
368
  }
348
369
  // with upper_bound
@@ -351,7 +372,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
351
372
  Slice ub = Slice("key_3");
352
373
  std::vector<Slice> expected_keys = {"key_1", "key_2"};
353
374
  std::vector<Slice> expected_values = {"key_1_cf_0_val", "key_2_cf_1_val"};
354
- verifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
375
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
355
376
  expected_values, std::nullopt, nullptr, &ub);
356
377
  }
357
378
  // with lower and upper bound
@@ -360,7 +381,7 @@ TEST_F(CoalescingIteratorTest, LowerAndUpperBounds) {
360
381
  Slice ub = Slice("key_3");
361
382
  std::vector<Slice> expected_keys = {"key_2"};
362
383
  std::vector<Slice> expected_values = {"key_2_cf_1_val"};
363
- verifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
384
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys,
364
385
  expected_values, std::nullopt, &lb, &ub);
365
386
  }
366
387
  {
@@ -662,7 +683,7 @@ TEST_F(CoalescingIteratorTest, WideColumns) {
662
683
  key_2_expected_columns_cfh_order_1_2, key_3_expected_columns,
663
684
  key_4_expected_columns};
664
685
 
665
- verifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys, expected_values,
686
+ VerifyCoalescingIterator(cfhs_order_0_1_2_3, expected_keys, expected_values,
666
687
  expected_wide_columns_0_1_2_3);
667
688
  }
668
689
 
@@ -677,7 +698,7 @@ TEST_F(CoalescingIteratorTest, WideColumns) {
677
698
  key_2_expected_columns_cfh_order_2_1, key_3_expected_columns,
678
699
  key_4_expected_columns};
679
700
 
680
- verifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys, expected_values,
701
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys, expected_values,
681
702
  expected_wide_columns_3_2_0_1);
682
703
  }
683
704
  }
@@ -700,8 +721,8 @@ TEST_F(CoalescingIteratorTest, DifferentComparatorsInMultiCFs) {
700
721
  ASSERT_OK(Put(1, "key_2", "value_2"));
701
722
  ASSERT_OK(Put(1, "key_3", "value_3"));
702
723
 
703
- verifyExpectedKeys(handles_[0], {"key_1", "key_2", "key_3"});
704
- verifyExpectedKeys(handles_[1], {"key_3", "key_2", "key_1"});
724
+ VerifyExpectedKeys(handles_[0], {"key_1", "key_2", "key_3"});
725
+ VerifyExpectedKeys(handles_[1], {"key_3", "key_2", "key_1"});
705
726
 
706
727
  std::unique_ptr<Iterator> iter =
707
728
  db_->NewCoalescingIterator(ReadOptions(), handles_);
@@ -742,10 +763,10 @@ TEST_F(CoalescingIteratorTest, CustomComparatorsInMultiCFs) {
742
763
  ASSERT_OK(Put(1, "key_003_005", "value_1_5"));
743
764
  ASSERT_OK(Put(1, "key_003_006", "value_1_4"));
744
765
 
745
- verifyExpectedKeys(
766
+ VerifyExpectedKeys(
746
767
  handles_[0], {"key_001_003", "key_001_002", "key_001_001", "key_002_003",
747
768
  "key_002_002", "key_002_001"});
748
- verifyExpectedKeys(
769
+ VerifyExpectedKeys(
749
770
  handles_[1], {"key_001_003", "key_001_002", "key_001_001", "key_003_006",
750
771
  "key_003_005", "key_003_004"});
751
772
 
@@ -755,66 +776,205 @@ TEST_F(CoalescingIteratorTest, CustomComparatorsInMultiCFs) {
755
776
  std::vector<Slice> expected_values = {"value_1_1", "value_1_2", "value_1_3",
756
777
  "value_0_4", "value_0_5", "value_0_6",
757
778
  "value_1_4", "value_1_5", "value_1_6"};
758
- int i = 0;
759
779
  std::unique_ptr<Iterator> iter =
760
780
  db_->NewCoalescingIterator(ReadOptions(), handles_);
781
+
782
+ size_t i = 0;
761
783
  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
762
784
  ASSERT_EQ(expected_keys[i], iter->key());
763
785
  ASSERT_EQ(expected_values[i], iter->value());
764
786
  ++i;
765
787
  }
788
+
789
+ ASSERT_EQ(expected_keys.size(), i);
766
790
  ASSERT_OK(iter->status());
767
791
  }
768
792
 
793
+ TEST_F(CoalescingIteratorTest, AllowUnpreparedValue) {
794
+ Options options = GetDefaultOptions();
795
+ options.enable_blob_files = true;
796
+
797
+ CreateAndReopenWithCF({"cf_1", "cf_2", "cf_3"}, options);
798
+
799
+ ASSERT_OK(Put(0, "key_1", "key_1_cf_0_val"));
800
+ ASSERT_OK(Put(3, "key_1", "key_1_cf_3_val"));
801
+ ASSERT_OK(Put(1, "key_2", "key_2_cf_1_val"));
802
+ ASSERT_OK(Put(2, "key_2", "key_2_cf_2_val"));
803
+ ASSERT_OK(Put(0, "key_3", "key_3_cf_0_val"));
804
+ ASSERT_OK(Put(1, "key_3", "key_3_cf_1_val"));
805
+ ASSERT_OK(Put(3, "key_3", "key_3_cf_3_val"));
806
+
807
+ ASSERT_OK(Flush());
808
+
809
+ std::vector<ColumnFamilyHandle*> cfhs_order_3_2_0_1{handles_[3], handles_[2],
810
+ handles_[0], handles_[1]};
811
+ std::vector<Slice> expected_keys{"key_1", "key_2", "key_3"};
812
+ std::vector<Slice> expected_values{"key_1_cf_0_val", "key_2_cf_1_val",
813
+ "key_3_cf_1_val"};
814
+
815
+ VerifyCoalescingIterator(cfhs_order_3_2_0_1, expected_keys, expected_values,
816
+ /* expected_wide_columns */ std::nullopt,
817
+ /* lower_bound */ nullptr, /* upper_bound */ nullptr,
818
+ /* allow_unprepared_value */ true);
819
+
820
+ ReadOptions read_options;
821
+ read_options.allow_unprepared_value = true;
822
+
823
+ {
824
+ std::unique_ptr<Iterator> iter =
825
+ db_->NewCoalescingIterator(read_options, cfhs_order_3_2_0_1);
826
+ iter->Seek("");
827
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->");
828
+ ASSERT_TRUE(iter->PrepareValue());
829
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->key_1_cf_0_val");
830
+
831
+ iter->Seek("key_1");
832
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->");
833
+ ASSERT_TRUE(iter->PrepareValue());
834
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->key_1_cf_0_val");
835
+
836
+ iter->Seek("key_2");
837
+ ASSERT_EQ(IterStatus(iter.get()), "key_2->");
838
+ ASSERT_TRUE(iter->PrepareValue());
839
+ ASSERT_EQ(IterStatus(iter.get()), "key_2->key_2_cf_1_val");
840
+
841
+ iter->Next();
842
+ ASSERT_EQ(IterStatus(iter.get()), "key_3->");
843
+ ASSERT_TRUE(iter->PrepareValue());
844
+ ASSERT_EQ(IterStatus(iter.get()), "key_3->key_3_cf_1_val");
845
+
846
+ iter->Seek("key_x");
847
+ ASSERT_EQ(IterStatus(iter.get()), "(invalid)");
848
+ }
849
+
850
+ {
851
+ std::unique_ptr<Iterator> iter =
852
+ db_->NewCoalescingIterator(read_options, cfhs_order_3_2_0_1);
853
+ iter->SeekForPrev("");
854
+ ASSERT_EQ(IterStatus(iter.get()), "(invalid)");
855
+
856
+ iter->SeekForPrev("key_1");
857
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->");
858
+ ASSERT_TRUE(iter->PrepareValue());
859
+ ASSERT_EQ(IterStatus(iter.get()), "key_1->key_1_cf_0_val");
860
+
861
+ iter->Next();
862
+ ASSERT_EQ(IterStatus(iter.get()), "key_2->");
863
+ ASSERT_TRUE(iter->PrepareValue());
864
+ ASSERT_EQ(IterStatus(iter.get()), "key_2->key_2_cf_1_val");
865
+
866
+ iter->SeekForPrev("key_x");
867
+ ASSERT_EQ(IterStatus(iter.get()), "key_3->");
868
+ ASSERT_TRUE(iter->PrepareValue());
869
+ ASSERT_EQ(IterStatus(iter.get()), "key_3->key_3_cf_1_val");
870
+
871
+ iter->Next();
872
+ ASSERT_EQ(IterStatus(iter.get()), "(invalid)");
873
+ }
874
+ }
875
+
876
+ TEST_F(CoalescingIteratorTest, AllowUnpreparedValue_Corruption) {
877
+ Options options = GetDefaultOptions();
878
+ options.enable_blob_files = true;
879
+
880
+ CreateAndReopenWithCF({"cf_1", "cf_2", "cf_3"}, options);
881
+
882
+ ASSERT_OK(Put(0, "key_1", "key_1_cf_0_val"));
883
+ ASSERT_OK(Put(3, "key_1", "key_1_cf_3_val"));
884
+ ASSERT_OK(Put(1, "key_2", "key_2_cf_1_val"));
885
+ ASSERT_OK(Put(2, "key_2", "key_2_cf_2_val"));
886
+ ASSERT_OK(Put(0, "key_3", "key_3_cf_0_val"));
887
+ ASSERT_OK(Put(1, "key_3", "key_3_cf_1_val"));
888
+ ASSERT_OK(Put(3, "key_3", "key_3_cf_3_val"));
889
+
890
+ ASSERT_OK(Flush());
891
+
892
+ ReadOptions read_options;
893
+ read_options.allow_unprepared_value = true;
894
+
895
+ std::vector<ColumnFamilyHandle*> cfhs_order_3_2_0_1{handles_[3], handles_[2],
896
+ handles_[0], handles_[1]};
897
+
898
+ std::unique_ptr<Iterator> iter =
899
+ db_->NewCoalescingIterator(read_options, cfhs_order_3_2_0_1);
900
+ iter->SeekToFirst();
901
+
902
+ ASSERT_TRUE(iter->Valid());
903
+ ASSERT_OK(iter->status());
904
+ ASSERT_EQ(iter->key(), "key_1");
905
+ ASSERT_TRUE(iter->value().empty());
906
+
907
+ SyncPoint::GetInstance()->SetCallBack(
908
+ "BlobFileReader::GetBlob:TamperWithResult", [](void* arg) {
909
+ Slice* const blob_index = static_cast<Slice*>(arg);
910
+ assert(blob_index);
911
+ assert(!blob_index->empty());
912
+ blob_index->remove_prefix(1);
913
+ });
914
+ SyncPoint::GetInstance()->EnableProcessing();
915
+
916
+ ASSERT_FALSE(iter->PrepareValue());
917
+ ASSERT_FALSE(iter->Valid());
918
+ ASSERT_TRUE(iter->status().IsCorruption());
919
+
920
+ SyncPoint::GetInstance()->DisableProcessing();
921
+ SyncPoint::GetInstance()->ClearAllCallBacks();
922
+ }
923
+
769
924
  class AttributeGroupIteratorTest : public DBTestBase {
770
925
  public:
771
926
  AttributeGroupIteratorTest()
772
927
  : DBTestBase("attribute_group_iterator_test", /*env_do_fsync=*/true) {}
773
928
 
774
- void verifyAttributeGroupIterator(
929
+ void VerifyAttributeGroupIterator(
775
930
  const std::vector<ColumnFamilyHandle*>& cfhs,
776
931
  const std::vector<Slice>& expected_keys,
777
- const std::vector<AttributeGroups>& expected_attribute_groups,
778
- const Slice* lower_bound = nullptr, const Slice* upper_bound = nullptr) {
779
- int i = 0;
932
+ const std::vector<IteratorAttributeGroups>& expected_attribute_groups,
933
+ const Slice* lower_bound = nullptr, const Slice* upper_bound = nullptr,
934
+ bool allow_unprepared_value = false) {
935
+ const size_t num_keys = expected_keys.size();
936
+
780
937
  ReadOptions read_options;
781
938
  read_options.iterate_lower_bound = lower_bound;
782
939
  read_options.iterate_upper_bound = upper_bound;
940
+ read_options.allow_unprepared_value = allow_unprepared_value;
941
+
783
942
  std::unique_ptr<AttributeGroupIterator> iter =
784
943
  db_->NewAttributeGroupIterator(read_options, cfhs);
785
- for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
786
- ASSERT_EQ(expected_keys[i], iter->key());
787
- auto iterator_attribute_groups = iter->attribute_groups();
788
- ASSERT_EQ(expected_attribute_groups[i].size(),
789
- iterator_attribute_groups.size());
790
- for (size_t cfh_i = 0; cfh_i < iterator_attribute_groups.size();
791
- cfh_i++) {
792
- ASSERT_EQ(expected_attribute_groups[i][cfh_i].column_family(),
793
- iterator_attribute_groups[cfh_i].column_family());
794
- ASSERT_EQ(expected_attribute_groups[i][cfh_i].columns(),
795
- iterator_attribute_groups[cfh_i].columns());
944
+
945
+ auto check_iter_entry = [&](size_t idx) {
946
+ ASSERT_EQ(iter->key(), expected_keys[idx]);
947
+
948
+ if (allow_unprepared_value) {
949
+ ASSERT_TRUE(iter->attribute_groups().empty());
950
+ ASSERT_TRUE(iter->PrepareValue());
951
+ ASSERT_TRUE(iter->Valid());
796
952
  }
797
- ++i;
953
+
954
+ ASSERT_EQ(iter->attribute_groups(), expected_attribute_groups[idx]);
955
+ };
956
+
957
+ {
958
+ size_t i = 0;
959
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
960
+ check_iter_entry(i);
961
+ ++i;
962
+ }
963
+
964
+ ASSERT_EQ(i, num_keys);
965
+ ASSERT_OK(iter->status());
798
966
  }
799
- ASSERT_EQ(expected_keys.size(), i);
800
- ASSERT_OK(iter->status());
801
967
 
802
- int rev_i = i - 1;
803
- for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
804
- ASSERT_EQ(expected_keys[rev_i], iter->key());
805
- auto iterator_attribute_groups = iter->attribute_groups();
806
- ASSERT_EQ(expected_attribute_groups[rev_i].size(),
807
- iterator_attribute_groups.size());
808
- for (size_t cfh_i = 0; cfh_i < iterator_attribute_groups.size();
809
- cfh_i++) {
810
- ASSERT_EQ(expected_attribute_groups[rev_i][cfh_i].column_family(),
811
- iterator_attribute_groups[cfh_i].column_family());
812
- ASSERT_EQ(expected_attribute_groups[rev_i][cfh_i].columns(),
813
- iterator_attribute_groups[cfh_i].columns());
968
+ {
969
+ size_t i = 0;
970
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
971
+ check_iter_entry(num_keys - 1 - i);
972
+ ++i;
814
973
  }
815
- rev_i--;
974
+
975
+ ASSERT_EQ(i, num_keys);
976
+ ASSERT_OK(iter->status());
816
977
  }
817
- ASSERT_OK(iter->status());
818
978
  }
819
979
  };
820
980
 
@@ -870,45 +1030,140 @@ TEST_F(AttributeGroupIteratorTest, IterateAttributeGroups) {
870
1030
  ASSERT_OK(db_->PutEntity(WriteOptions(), key_3, key_3_attribute_groups));
871
1031
  ASSERT_OK(db_->PutEntity(WriteOptions(), key_4, key_4_attribute_groups));
872
1032
 
1033
+ IteratorAttributeGroups key_1_expected_attribute_groups{
1034
+ IteratorAttributeGroup(key_1_attribute_groups[0]),
1035
+ IteratorAttributeGroup(key_1_attribute_groups[1])};
1036
+ IteratorAttributeGroups key_2_expected_attribute_groups{
1037
+ IteratorAttributeGroup(key_2_attribute_groups[0]),
1038
+ IteratorAttributeGroup(key_2_attribute_groups[1])};
1039
+ IteratorAttributeGroups key_3_expected_attribute_groups{
1040
+ IteratorAttributeGroup(key_3_attribute_groups[0]),
1041
+ IteratorAttributeGroup(key_3_attribute_groups[1])};
1042
+ IteratorAttributeGroups key_4_expected_attribute_groups{
1043
+ IteratorAttributeGroup(key_4_attribute_groups[0]),
1044
+ IteratorAttributeGroup(key_4_attribute_groups[1])};
1045
+
873
1046
  // Test for iteration over CF default->1->2->3
874
1047
  std::vector<ColumnFamilyHandle*> cfhs_order_0_1_2_3 = {
875
1048
  handles_[0], handles_[1], handles_[2], handles_[3]};
876
1049
  {
877
1050
  std::vector<Slice> expected_keys = {key_1, key_2, key_3, key_4};
878
- std::vector<AttributeGroups> expected_attribute_groups = {
879
- key_1_attribute_groups, key_2_attribute_groups, key_3_attribute_groups,
880
- key_4_attribute_groups};
881
- verifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
1051
+ std::vector<IteratorAttributeGroups> expected_attribute_groups{
1052
+ key_1_expected_attribute_groups, key_2_expected_attribute_groups,
1053
+ key_3_expected_attribute_groups, key_4_expected_attribute_groups};
1054
+ VerifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
882
1055
  expected_attribute_groups);
883
1056
  }
1057
+
884
1058
  Slice lb = Slice("key_2");
885
1059
  Slice ub = Slice("key_4");
1060
+
886
1061
  // Test for lower bound only
887
1062
  {
888
1063
  std::vector<Slice> expected_keys = {key_2, key_3, key_4};
889
- std::vector<AttributeGroups> expected_attribute_groups = {
890
- key_2_attribute_groups, key_3_attribute_groups, key_4_attribute_groups};
891
- verifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
1064
+ std::vector<IteratorAttributeGroups> expected_attribute_groups{
1065
+ key_2_expected_attribute_groups, key_3_expected_attribute_groups,
1066
+ key_4_expected_attribute_groups};
1067
+ VerifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
892
1068
  expected_attribute_groups, &lb);
893
1069
  }
1070
+
894
1071
  // Test for upper bound only
895
1072
  {
896
1073
  std::vector<Slice> expected_keys = {key_1, key_2, key_3};
897
- std::vector<AttributeGroups> expected_attribute_groups = {
898
- key_1_attribute_groups, key_2_attribute_groups, key_3_attribute_groups};
899
- verifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
1074
+ std::vector<IteratorAttributeGroups> expected_attribute_groups{
1075
+ key_1_expected_attribute_groups, key_2_expected_attribute_groups,
1076
+ key_3_expected_attribute_groups};
1077
+ VerifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
900
1078
  expected_attribute_groups, nullptr, &ub);
901
1079
  }
1080
+
902
1081
  // Test for lower and upper bound
903
1082
  {
904
1083
  std::vector<Slice> expected_keys = {key_2, key_3};
905
- std::vector<AttributeGroups> expected_attribute_groups = {
906
- key_2_attribute_groups, key_3_attribute_groups};
907
- verifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
1084
+ std::vector<IteratorAttributeGroups> expected_attribute_groups{
1085
+ key_2_expected_attribute_groups, key_3_expected_attribute_groups};
1086
+ VerifyAttributeGroupIterator(cfhs_order_0_1_2_3, expected_keys,
908
1087
  expected_attribute_groups, &lb, &ub);
909
1088
  }
910
1089
  }
911
1090
 
1091
+ TEST_F(AttributeGroupIteratorTest, AllowUnpreparedValue) {
1092
+ Options options = GetDefaultOptions();
1093
+ CreateAndReopenWithCF({"cf_1", "cf_2", "cf_3"}, options);
1094
+
1095
+ constexpr char key_1[] = "key_1";
1096
+ WideColumns key_1_columns_in_cf_2{
1097
+ {kDefaultWideColumnName, "cf_2_col_val_0_key_1"},
1098
+ {"cf_2_col_name_1", "cf_2_col_val_1_key_1"},
1099
+ {"cf_2_col_name_2", "cf_2_col_val_2_key_1"}};
1100
+ WideColumns key_1_columns_in_cf_3{
1101
+ {"cf_3_col_name_1", "cf_3_col_val_1_key_1"},
1102
+ {"cf_3_col_name_2", "cf_3_col_val_2_key_1"},
1103
+ {"cf_3_col_name_3", "cf_3_col_val_3_key_1"}};
1104
+
1105
+ constexpr char key_2[] = "key_2";
1106
+ WideColumns key_2_columns_in_cf_1{
1107
+ {"cf_1_col_name_1", "cf_1_col_val_1_key_2"}};
1108
+ WideColumns key_2_columns_in_cf_2{
1109
+ {"cf_2_col_name_1", "cf_2_col_val_1_key_2"},
1110
+ {"cf_2_col_name_2", "cf_2_col_val_2_key_2"}};
1111
+
1112
+ constexpr char key_3[] = "key_3";
1113
+ WideColumns key_3_columns_in_cf_1{
1114
+ {"cf_1_col_name_1", "cf_1_col_val_1_key_3"}};
1115
+ WideColumns key_3_columns_in_cf_3{
1116
+ {"cf_3_col_name_1", "cf_3_col_val_1_key_3"}};
1117
+
1118
+ constexpr char key_4[] = "key_4";
1119
+ WideColumns key_4_columns_in_cf_0{
1120
+ {"cf_0_col_name_1", "cf_0_col_val_1_key_4"}};
1121
+ WideColumns key_4_columns_in_cf_2{
1122
+ {"cf_2_col_name_1", "cf_2_col_val_1_key_4"}};
1123
+
1124
+ AttributeGroups key_1_attribute_groups{
1125
+ AttributeGroup(handles_[2], key_1_columns_in_cf_2),
1126
+ AttributeGroup(handles_[3], key_1_columns_in_cf_3)};
1127
+ AttributeGroups key_2_attribute_groups{
1128
+ AttributeGroup(handles_[1], key_2_columns_in_cf_1),
1129
+ AttributeGroup(handles_[2], key_2_columns_in_cf_2)};
1130
+ AttributeGroups key_3_attribute_groups{
1131
+ AttributeGroup(handles_[1], key_3_columns_in_cf_1),
1132
+ AttributeGroup(handles_[3], key_3_columns_in_cf_3)};
1133
+ AttributeGroups key_4_attribute_groups{
1134
+ AttributeGroup(handles_[0], key_4_columns_in_cf_0),
1135
+ AttributeGroup(handles_[2], key_4_columns_in_cf_2)};
1136
+
1137
+ ASSERT_OK(db_->PutEntity(WriteOptions(), key_1, key_1_attribute_groups));
1138
+ ASSERT_OK(db_->PutEntity(WriteOptions(), key_2, key_2_attribute_groups));
1139
+ ASSERT_OK(db_->PutEntity(WriteOptions(), key_3, key_3_attribute_groups));
1140
+ ASSERT_OK(db_->PutEntity(WriteOptions(), key_4, key_4_attribute_groups));
1141
+
1142
+ IteratorAttributeGroups key_1_expected_attribute_groups{
1143
+ IteratorAttributeGroup(key_1_attribute_groups[0]),
1144
+ IteratorAttributeGroup(key_1_attribute_groups[1])};
1145
+ IteratorAttributeGroups key_2_expected_attribute_groups{
1146
+ IteratorAttributeGroup(key_2_attribute_groups[0]),
1147
+ IteratorAttributeGroup(key_2_attribute_groups[1])};
1148
+ IteratorAttributeGroups key_3_expected_attribute_groups{
1149
+ IteratorAttributeGroup(key_3_attribute_groups[0]),
1150
+ IteratorAttributeGroup(key_3_attribute_groups[1])};
1151
+ IteratorAttributeGroups key_4_expected_attribute_groups{
1152
+ IteratorAttributeGroup(key_4_attribute_groups[0]),
1153
+ IteratorAttributeGroup(key_4_attribute_groups[1])};
1154
+
1155
+ std::vector<ColumnFamilyHandle*> cfhs_order_0_1_2_3{handles_[0], handles_[1],
1156
+ handles_[2], handles_[3]};
1157
+ std::vector<Slice> expected_keys{key_1, key_2, key_3, key_4};
1158
+ std::vector<IteratorAttributeGroups> expected_attribute_groups{
1159
+ key_1_expected_attribute_groups, key_2_expected_attribute_groups,
1160
+ key_3_expected_attribute_groups, key_4_expected_attribute_groups};
1161
+ VerifyAttributeGroupIterator(
1162
+ cfhs_order_0_1_2_3, expected_keys, expected_attribute_groups,
1163
+ /* lower_bound */ nullptr, /* upper_bound */ nullptr,
1164
+ /* allow_unprepared_value */ true);
1165
+ }
1166
+
912
1167
  } // namespace ROCKSDB_NAMESPACE
913
1168
 
914
1169
  int main(int argc, char** argv) {
@@ -197,11 +197,10 @@ class FragmentedRangeTombstoneIterator : public InternalIterator {
197
197
  pinned_seq_pos_ = tombstones_->seq_end();
198
198
  }
199
199
 
200
- RangeTombstone Tombstone(bool logical_strip_timestamp = false) const {
200
+ RangeTombstone Tombstone() const {
201
201
  assert(Valid());
202
202
  if (icmp_->user_comparator()->timestamp_size()) {
203
- return RangeTombstone(start_key(), end_key(), seq(), timestamp(),
204
- logical_strip_timestamp);
203
+ return RangeTombstone(start_key(), end_key(), seq(), timestamp());
205
204
  }
206
205
  return RangeTombstone(start_key(), end_key(), seq());
207
206
  }