@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
package/binding.cc CHANGED
@@ -505,6 +505,10 @@ class Iterator final : public BaseIterator {
505
505
  readOptions.ignore_range_deletions = false;
506
506
  NAPI_STATUS_THROWS(GetProperty(env, options, "ignoreRangeDeletions", readOptions.ignore_range_deletions));
507
507
 
508
+ if (!values) {
509
+ readOptions.allow_unprepared_value = true;
510
+ }
511
+
508
512
  // uint32_t timeout = 0;
509
513
  // NAPI_STATUS_THROWS(GetProperty(env, options, "timeout", timeout));
510
514
 
@@ -900,12 +904,39 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
900
904
  NAPI_STATUS_RETURN(GetProperty(env, options, "optimizeFiltersForHits", columnOptions.optimize_filters_for_hits));
901
905
  NAPI_STATUS_RETURN(GetProperty(env, options, "periodicCompactionSeconds", columnOptions.periodic_compaction_seconds));
902
906
 
907
+ NAPI_STATUS_RETURN(GetProperty(env, options, "enableBlobFiles", columnOptions.enable_blob_files));
908
+ NAPI_STATUS_RETURN(GetProperty(env, options, "minBlobSize", columnOptions.min_blob_size));
909
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobFileSize", columnOptions.blob_file_size));
910
+ NAPI_STATUS_RETURN(GetProperty(env, options, "enableBlobGarbageCollection", columnOptions.enable_blob_garbage_collection));
911
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobGarbageCollectionAgeCutoff", columnOptions.blob_garbage_collection_age_cutoff));
912
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobGarbageCollectionForceThreshold", columnOptions.blob_garbage_collection_force_threshold));
913
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobCompactionReadaheadSize", columnOptions.blob_compaction_readahead_size));
914
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobFileStartingLevel", columnOptions.blob_file_starting_level));
915
+
916
+ bool blobCompression = true;
917
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobCompression", blobCompression));
918
+ columnOptions.blob_compression_type = blobCompression ? rocksdb::kZSTD : rocksdb::kNoCompression;
919
+
920
+ bool prepopulateBlobCache = false;
921
+ NAPI_STATUS_RETURN(GetProperty(env, options, "prepopulateBlobCache", prepopulateBlobCache));
922
+ columnOptions.prepopulate_blob_cache = prepopulateBlobCache ? rocksdb::PrepopulateBlobCache::kFlushOnly : rocksdb::PrepopulateBlobCache::kDisable;
923
+
903
924
  rocksdb::BlockBasedTableOptions tableOptions;
904
925
  tableOptions.decouple_partitioned_filters = true;
905
926
 
927
+ {
928
+ uint32_t cacheSize = 0;
929
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blobCacheSize", cacheSize));
930
+
931
+ if (cacheSize) {
932
+ columnOptions.blob_cache = rocksdb::HyperClockCacheOptions(cacheSize, 0).MakeSharedCache();
933
+ }
934
+ }
935
+
906
936
  {
907
937
  uint32_t cacheSize = 8 << 20;
908
938
  NAPI_STATUS_RETURN(GetProperty(env, options, "cacheSize", cacheSize));
939
+ NAPI_STATUS_RETURN(GetProperty(env, options, "blockCacheSize", cacheSize));
909
940
 
910
941
  if (cacheSize) {
911
942
  tableOptions.block_cache = rocksdb::HyperClockCacheOptions(cacheSize, 0).MakeSharedCache();
@@ -914,6 +945,12 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
914
945
  }
915
946
  }
916
947
 
948
+ bool prepopulateBlockCache = false;
949
+ NAPI_STATUS_RETURN(GetProperty(env, options, "prepopulateBlockCache", prepopulateBlockCache));
950
+ tableOptions.prepopulate_block_cache = prepopulateBlockCache
951
+ ? rocksdb::BlockBasedTableOptions::PrepopulateBlockCache::kFlushOnly
952
+ : rocksdb::BlockBasedTableOptions::PrepopulateBlockCache::kDisable;
953
+
917
954
  std::string optimize = "";
918
955
  NAPI_STATUS_RETURN(GetProperty(env, options, "optimize", optimize));
919
956
 
@@ -981,18 +1018,6 @@ napi_status InitOptions(napi_env env, T& columnOptions, const U& options) {
981
1018
  return napi_invalid_arg;
982
1019
  }
983
1020
 
984
- std::string prepopulateBlockCache;
985
- NAPI_STATUS_RETURN(GetProperty(env, options, "prepopulateBlockCache", prepopulateBlockCache));
986
- if (prepopulateBlockCache == "") {
987
- // Do nothing...
988
- } else if (prepopulateBlockCache == "disable") {
989
- tableOptions.prepopulate_block_cache = rocksdb::BlockBasedTableOptions::PrepopulateBlockCache::kDisable;
990
- } else if (prepopulateBlockCache == "flushOnly") {
991
- tableOptions.prepopulate_block_cache = rocksdb::BlockBasedTableOptions::PrepopulateBlockCache::kFlushOnly;
992
- } else {
993
- return napi_invalid_arg;
994
- }
995
-
996
1021
  NAPI_STATUS_RETURN(GetProperty(env, options, "dataBlockHashTableUtilRatio", tableOptions.data_block_hash_table_util_ratio));
997
1022
  NAPI_STATUS_RETURN(GetProperty(env, options, "blockSize", tableOptions.block_size));
998
1023
  NAPI_STATUS_RETURN(GetProperty(env, options, "blockRestartInterval", tableOptions.block_restart_interval));
@@ -1090,13 +1115,15 @@ NAPI_METHOD(db_open) {
1090
1115
 
1091
1116
  NAPI_STATUS_THROWS(GetProperty(env, options, "pipelinedWrite", dbOptions.enable_pipelined_write));
1092
1117
 
1093
- NAPI_STATUS_THROWS(GetProperty(env, options, "dailyOffpeakTime", dbOptions.daily_offpeak_time_utc));
1118
+ NAPI_STATUS_THROWS(GetProperty(env, options, "dailyOffpeakTime", dbOptions.daily_offpeak_time_utc));
1119
+
1120
+ NAPI_STATUS_THROWS(GetProperty(env, options, "unorderedWrite", dbOptions.unordered_write));
1094
1121
 
1095
- NAPI_STATUS_THROWS(GetProperty(env, options, "unorderedWrite", dbOptions.unordered_write));
1122
+ NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapReads", dbOptions.allow_mmap_reads));
1096
1123
 
1097
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapReads", dbOptions.allow_mmap_reads));
1124
+ NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapWrites", dbOptions.allow_mmap_writes));
1098
1125
 
1099
- NAPI_STATUS_THROWS(GetProperty(env, options, "allowMmapWrites", dbOptions.allow_mmap_writes));
1126
+ NAPI_STATUS_THROWS(GetProperty(env, options, "memTableHugePageSize", dbOptions.memtable_huge_page_size));
1100
1127
 
1101
1128
  // TODO (feat): dbOptions.listeners
1102
1129
 
@@ -83,6 +83,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
83
83
  "db/log_writer.cc",
84
84
  "db/logs_with_prep_tracker.cc",
85
85
  "db/malloc_stats.cc",
86
+ "db/manifest_ops.cc",
86
87
  "db/memtable.cc",
87
88
  "db/memtable_list.cc",
88
89
  "db/merge_helper.cc",
@@ -149,6 +150,7 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
149
150
  "memtable/hash_skiplist_rep.cc",
150
151
  "memtable/skiplistrep.cc",
151
152
  "memtable/vectorrep.cc",
153
+ "memtable/wbwi_memtable.cc",
152
154
  "memtable/write_buffer_manager.cc",
153
155
  "monitoring/histogram.cc",
154
156
  "monitoring/histogram_windowing.cc",
@@ -366,6 +368,11 @@ cpp_library_wrapper(name="rocksdb_lib", srcs=[
366
368
 
367
369
  cpp_library_wrapper(name="rocksdb_whole_archive_lib", srcs=[], deps=[":rocksdb_lib"], headers=[], link_whole=True, extra_test_libs=False)
368
370
 
371
+ cpp_library_wrapper(name="rocksdb_with_faiss_lib", srcs=["utilities/secondary_index/faiss_ivf_index.cc"], deps=[
372
+ "//faiss:faiss",
373
+ ":rocksdb_lib",
374
+ ], headers=[], link_whole=False, extra_test_libs=False)
375
+
369
376
  cpp_library_wrapper(name="rocksdb_test_lib", srcs=[
370
377
  "db/db_test_util.cc",
371
378
  "db/db_with_timestamp_test_util.cc",
@@ -380,6 +387,20 @@ cpp_library_wrapper(name="rocksdb_test_lib", srcs=[
380
387
  "utilities/cassandra/test_utils.cc",
381
388
  ], deps=[":rocksdb_lib"], headers=[], link_whole=False, extra_test_libs=True)
382
389
 
390
+ cpp_library_wrapper(name="rocksdb_with_faiss_test_lib", srcs=[
391
+ "db/db_test_util.cc",
392
+ "db/db_with_timestamp_test_util.cc",
393
+ "table/mock_table.cc",
394
+ "test_util/mock_time_env.cc",
395
+ "test_util/secondary_cache_test_util.cc",
396
+ "test_util/testharness.cc",
397
+ "test_util/testutil.cc",
398
+ "tools/block_cache_analyzer/block_cache_trace_analyzer.cc",
399
+ "tools/trace_analyzer_tool.cc",
400
+ "utilities/agg_merge/test_agg_merge.cc",
401
+ "utilities/cassandra/test_utils.cc",
402
+ ], deps=[":rocksdb_with_faiss_lib"], headers=[], link_whole=False, extra_test_libs=True)
403
+
383
404
  cpp_library_wrapper(name="rocksdb_tools_lib", srcs=[
384
405
  "test_util/testutil.cc",
385
406
  "tools/block_cache_analyzer/block_cache_trace_analyzer.cc",
@@ -5076,6 +5097,12 @@ cpp_unittest_wrapper(name="external_sst_file_test",
5076
5097
  extra_compiler_flags=[])
5077
5098
 
5078
5099
 
5100
+ cpp_unittest_wrapper(name="faiss_ivf_index_test",
5101
+ srcs=["utilities/secondary_index/faiss_ivf_index_test.cc"],
5102
+ deps=[":rocksdb_with_faiss_test_lib"],
5103
+ extra_compiler_flags=[])
5104
+
5105
+
5079
5106
  cpp_unittest_wrapper(name="fault_injection_test",
5080
5107
  srcs=["db/fault_injection_test.cc"],
5081
5108
  deps=[":rocksdb_test_lib"],
@@ -32,7 +32,7 @@
32
32
  # 3. cmake ..
33
33
  # 4. make -j
34
34
 
35
- cmake_minimum_required(VERSION 3.10)
35
+ cmake_minimum_required(VERSION 3.12)
36
36
 
37
37
  list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/modules/")
38
38
  include(ReadVersion)
@@ -716,6 +716,7 @@ set(SOURCES
716
716
  db/log_reader.cc
717
717
  db/log_writer.cc
718
718
  db/malloc_stats.cc
719
+ db/manifest_ops.cc
719
720
  db/memtable.cc
720
721
  db/memtable_list.cc
721
722
  db/merge_helper.cc
@@ -779,6 +780,7 @@ set(SOURCES
779
780
  memtable/hash_skiplist_rep.cc
780
781
  memtable/skiplistrep.cc
781
782
  memtable/vectorrep.cc
783
+ memtable/wbwi_memtable.cc
782
784
  memtable/write_buffer_manager.cc
783
785
  monitoring/histogram.cc
784
786
  monitoring/histogram_windowing.cc
@@ -659,7 +659,7 @@ ifneq ($(filter check-headers, $(MAKECMDGOALS)),)
659
659
  # TODO: add/support JNI headers
660
660
  DEV_HEADER_DIRS := $(sort include/ $(dir $(ALL_SOURCES)))
661
661
  # Some headers like in port/ are platform-specific
662
- DEV_HEADERS_TO_CHECK := $(shell $(FIND) $(DEV_HEADER_DIRS) -type f -name '*.h' | grep -E -v 'port/|plugin/|lua/|range_tree/')
662
+ DEV_HEADERS_TO_CHECK := $(shell $(FIND) $(DEV_HEADER_DIRS) -type f -name '*.h' | grep -E -v 'port/|plugin/|lua/|range_tree/|secondary_index/')
663
663
  PUBLIC_HEADERS_TO_CHECK := $(shell $(FIND) include/ -type f -name '*.h' | grep -E -v 'lua/')
664
664
  else
665
665
  DEV_HEADERS_TO_CHECK :=
@@ -2489,7 +2489,7 @@ checkout_folly:
2489
2489
  fi
2490
2490
  @# Pin to a particular version for public CI, so that PR authors don't
2491
2491
  @# need to worry about folly breaking our integration. Update periodically
2492
- cd third-party/folly && git reset --hard 03041f014b6e6ebb6119ffae8b7a37308f52e913
2492
+ cd third-party/folly && git reset --hard 33f5b67fcaeb8705b04fd1b850873a180dc89aaa
2493
2493
  @# NOTE: this hack is required for clang in some cases
2494
2494
  perl -pi -e 's/int rv = syscall/int rv = (int)syscall/' third-party/folly/folly/detail/Futex.cpp
2495
2495
  @# NOTE: this hack is required for gcc in some cases
@@ -133,7 +133,9 @@ Status Cache::CreateFromString(const ConfigOptions& config_options,
133
133
  std::shared_ptr<Cache>* result) {
134
134
  Status status;
135
135
  std::shared_ptr<Cache> cache;
136
- if (value.find("://") == std::string::npos) {
136
+ if (StartsWith(value, "null")) {
137
+ cache = nullptr;
138
+ } else if (value.find("://") == std::string::npos) {
137
139
  if (value.find('=') == std::string::npos) {
138
140
  cache = NewLRUCache(ParseSizeT(value));
139
141
  } else {
@@ -83,6 +83,8 @@ class ArenaWrappedDBIter : public Iterator {
83
83
  Status Refresh() override;
84
84
  Status Refresh(const Snapshot*) override;
85
85
 
86
+ bool PrepareValue() override { return db_iter_->PrepareValue(); }
87
+
86
88
  void Init(Env* env, const ReadOptions& read_options,
87
89
  const ImmutableOptions& ioptions,
88
90
  const MutableCFOptions& mutable_cf_options, const Version* version,
@@ -13,14 +13,11 @@ namespace ROCKSDB_NAMESPACE {
13
13
  class AttributeGroupIteratorImpl : public AttributeGroupIterator {
14
14
  public:
15
15
  AttributeGroupIteratorImpl(
16
- const Comparator* comparator,
17
- const std::vector<ColumnFamilyHandle*>& column_families,
18
- const std::vector<Iterator*>& child_iterators)
19
- : impl_(
20
- comparator, column_families, child_iterators, [this]() { Reset(); },
21
- [this](const autovector<MultiCfIteratorInfo>& items) {
22
- AddToAttributeGroups(items);
23
- }) {}
16
+ const ReadOptions& read_options, const Comparator* comparator,
17
+ std::vector<std::pair<ColumnFamilyHandle*, std::unique_ptr<Iterator>>>&&
18
+ cfh_iter_pairs)
19
+ : impl_(read_options, comparator, std::move(cfh_iter_pairs),
20
+ ResetFunc(this), PopulateFunc(this)) {}
24
21
  ~AttributeGroupIteratorImpl() override {}
25
22
 
26
23
  // No copy allowed
@@ -45,8 +42,36 @@ class AttributeGroupIteratorImpl : public AttributeGroupIterator {
45
42
 
46
43
  void Reset() { attribute_groups_.clear(); }
47
44
 
45
+ bool PrepareValue() override { return impl_.PrepareValue(); }
46
+
48
47
  private:
49
- MultiCfIteratorImpl impl_;
48
+ class ResetFunc {
49
+ public:
50
+ explicit ResetFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
51
+
52
+ void operator()() const {
53
+ assert(iter_);
54
+ iter_->Reset();
55
+ }
56
+
57
+ private:
58
+ AttributeGroupIteratorImpl* iter_;
59
+ };
60
+
61
+ class PopulateFunc {
62
+ public:
63
+ explicit PopulateFunc(AttributeGroupIteratorImpl* iter) : iter_(iter) {}
64
+
65
+ void operator()(const autovector<MultiCfIteratorInfo>& items) const {
66
+ assert(iter_);
67
+ iter_->AddToAttributeGroups(items);
68
+ }
69
+
70
+ private:
71
+ AttributeGroupIteratorImpl* iter_;
72
+ };
73
+
74
+ MultiCfIteratorImpl<ResetFunc, PopulateFunc> impl_;
50
75
  IteratorAttributeGroups attribute_groups_;
51
76
  void AddToAttributeGroups(const autovector<MultiCfIteratorInfo>& items);
52
77
  };
@@ -20,23 +20,24 @@
20
20
 
21
21
  namespace ROCKSDB_NAMESPACE {
22
22
 
23
- BlobSource::BlobSource(const ImmutableOptions* immutable_options,
23
+ BlobSource::BlobSource(const ImmutableOptions& immutable_options,
24
+ const MutableCFOptions& mutable_cf_options,
24
25
  const std::string& db_id,
25
26
  const std::string& db_session_id,
26
27
  BlobFileCache* blob_file_cache)
27
28
  : db_id_(db_id),
28
29
  db_session_id_(db_session_id),
29
- statistics_(immutable_options->statistics.get()),
30
+ statistics_(immutable_options.statistics.get()),
30
31
  blob_file_cache_(blob_file_cache),
31
- blob_cache_(immutable_options->blob_cache),
32
- lowest_used_cache_tier_(immutable_options->lowest_used_cache_tier) {
32
+ blob_cache_(immutable_options.blob_cache),
33
+ lowest_used_cache_tier_(immutable_options.lowest_used_cache_tier) {
33
34
  auto bbto =
34
- immutable_options->table_factory->GetOptions<BlockBasedTableOptions>();
35
+ mutable_cf_options.table_factory->GetOptions<BlockBasedTableOptions>();
35
36
  if (bbto &&
36
37
  bbto->cache_usage_options.options_overrides.at(CacheEntryRole::kBlobCache)
37
38
  .charged == CacheEntryRoleOptions::Decision::kEnabled) {
38
39
  blob_cache_ = SharedCacheInterface{std::make_shared<ChargedCache>(
39
- immutable_options->blob_cache, bbto->block_cache)};
40
+ immutable_options.blob_cache, bbto->block_cache)};
40
41
  }
41
42
  }
42
43
 
@@ -21,6 +21,7 @@
21
21
  namespace ROCKSDB_NAMESPACE {
22
22
 
23
23
  struct ImmutableOptions;
24
+ struct MutableCFOptions;
24
25
  class Status;
25
26
  class FilePrefetchBuffer;
26
27
  class Slice;
@@ -31,7 +32,10 @@ class Slice;
31
32
  // storage with minimal cost.
32
33
  class BlobSource {
33
34
  public:
34
- BlobSource(const ImmutableOptions* immutable_options,
35
+ // NOTE: db_id, db_session_id, and blob_file_cache are saved by reference or
36
+ // pointer.
37
+ BlobSource(const ImmutableOptions& immutable_options,
38
+ const MutableCFOptions& mutable_cf_options,
35
39
  const std::string& db_id, const std::string& db_session_id,
36
40
  BlobFileCache* blob_file_cache);
37
41
 
@@ -148,6 +148,7 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
148
148
  DestroyAndReopen(options_);
149
149
 
150
150
  ImmutableOptions immutable_options(options_);
151
+ MutableCFOptions mutable_cf_options(options_);
151
152
 
152
153
  constexpr uint32_t column_family_id = 1;
153
154
  constexpr bool has_ttl = false;
@@ -193,8 +194,8 @@ TEST_F(BlobSourceTest, GetBlobsFromCache) {
193
194
  backing_cache.get(), &immutable_options, &file_options,
194
195
  column_family_id, blob_file_read_hist, nullptr /*IOTracer*/);
195
196
 
196
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
197
- blob_file_cache.get());
197
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
198
+ db_session_id_, blob_file_cache.get());
198
199
 
199
200
  ReadOptions read_options;
200
201
  read_options.verify_checksums = true;
@@ -464,6 +465,7 @@ TEST_F(BlobSourceTest, GetCompressedBlobs) {
464
465
  DestroyAndReopen(options_);
465
466
 
466
467
  ImmutableOptions immutable_options(options_);
468
+ MutableCFOptions mutable_cf_options(options_);
467
469
 
468
470
  constexpr uint32_t column_family_id = 1;
469
471
  constexpr bool has_ttl = false;
@@ -498,8 +500,8 @@ TEST_F(BlobSourceTest, GetCompressedBlobs) {
498
500
  backing_cache.get(), &immutable_options, &file_options,
499
501
  column_family_id, nullptr /*HistogramImpl*/, nullptr /*IOTracer*/);
500
502
 
501
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
502
- blob_file_cache.get());
503
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
504
+ db_session_id_, blob_file_cache.get());
503
505
 
504
506
  ReadOptions read_options;
505
507
  read_options.verify_checksums = true;
@@ -589,6 +591,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromMultiFiles) {
589
591
  DestroyAndReopen(options_);
590
592
 
591
593
  ImmutableOptions immutable_options(options_);
594
+ MutableCFOptions mutable_cf_options(options_);
592
595
 
593
596
  constexpr uint32_t column_family_id = 1;
594
597
  constexpr bool has_ttl = false;
@@ -644,8 +647,8 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromMultiFiles) {
644
647
  backing_cache.get(), &immutable_options, &file_options,
645
648
  column_family_id, blob_file_read_hist, nullptr /*IOTracer*/);
646
649
 
647
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
648
- blob_file_cache.get());
650
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
651
+ db_session_id_, blob_file_cache.get());
649
652
 
650
653
  ReadOptions read_options;
651
654
  read_options.verify_checksums = true;
@@ -782,6 +785,7 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
782
785
  DestroyAndReopen(options_);
783
786
 
784
787
  ImmutableOptions immutable_options(options_);
788
+ MutableCFOptions mutable_cf_options(options_);
785
789
 
786
790
  constexpr uint32_t column_family_id = 1;
787
791
  constexpr bool has_ttl = false;
@@ -827,8 +831,8 @@ TEST_F(BlobSourceTest, MultiGetBlobsFromCache) {
827
831
  backing_cache.get(), &immutable_options, &file_options,
828
832
  column_family_id, blob_file_read_hist, nullptr /*IOTracer*/);
829
833
 
830
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
831
- blob_file_cache.get());
834
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
835
+ db_session_id_, blob_file_cache.get());
832
836
 
833
837
  ReadOptions read_options;
834
838
  read_options.verify_checksums = true;
@@ -1105,6 +1109,7 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1105
1109
  DestroyAndReopen(options_);
1106
1110
 
1107
1111
  ImmutableOptions immutable_options(options_);
1112
+ MutableCFOptions mutable_cf_options(options_);
1108
1113
 
1109
1114
  constexpr uint32_t column_family_id = 1;
1110
1115
  constexpr bool has_ttl = false;
@@ -1137,8 +1142,8 @@ TEST_F(BlobSecondaryCacheTest, GetBlobsFromSecondaryCache) {
1137
1142
  backing_cache.get(), &immutable_options, &file_options, column_family_id,
1138
1143
  blob_file_read_hist, nullptr /*IOTracer*/));
1139
1144
 
1140
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
1141
- blob_file_cache.get());
1145
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
1146
+ db_session_id_, blob_file_cache.get());
1142
1147
 
1143
1148
  CacheHandleGuard<BlobFileReader> file_reader;
1144
1149
  ReadOptions read_options;
@@ -1405,6 +1410,7 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1405
1410
  DestroyAndReopen(options_);
1406
1411
 
1407
1412
  ImmutableOptions immutable_options(options_);
1413
+ MutableCFOptions mutable_cf_options(options_);
1408
1414
 
1409
1415
  constexpr ExpirationRange expiration_range;
1410
1416
 
@@ -1426,8 +1432,8 @@ TEST_F(BlobSourceCacheReservationTest, SimpleCacheReservation) {
1426
1432
  backing_cache.get(), &immutable_options, &file_options,
1427
1433
  kColumnFamilyId, blob_file_read_hist, nullptr /*IOTracer*/);
1428
1434
 
1429
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
1430
- blob_file_cache.get());
1435
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
1436
+ db_session_id_, blob_file_cache.get());
1431
1437
 
1432
1438
  ConcurrentCacheReservationManager* cache_res_mgr =
1433
1439
  static_cast<ChargedCache*>(blob_source.GetBlobCache())
@@ -1519,6 +1525,8 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservation) {
1519
1525
  DestroyAndReopen(options_);
1520
1526
 
1521
1527
  ImmutableOptions immutable_options(options_);
1528
+ MutableCFOptions mutable_cf_options(options_);
1529
+
1522
1530
  constexpr size_t blob_size = 24 << 10; // 24KB
1523
1531
  for (size_t i = 0; i < kNumBlobs; ++i) {
1524
1532
  blob_file_size_ -= blobs_[i].size(); // old blob size
@@ -1546,8 +1554,8 @@ TEST_F(BlobSourceCacheReservationTest, IncreaseCacheReservation) {
1546
1554
  backing_cache.get(), &immutable_options, &file_options,
1547
1555
  kColumnFamilyId, blob_file_read_hist, nullptr /*IOTracer*/);
1548
1556
 
1549
- BlobSource blob_source(&immutable_options, db_id_, db_session_id_,
1550
- blob_file_cache.get());
1557
+ BlobSource blob_source(immutable_options, mutable_cf_options, db_id_,
1558
+ db_session_id_, blob_file_cache.get());
1551
1559
 
1552
1560
  ConcurrentCacheReservationManager* cache_res_mgr =
1553
1561
  static_cast<ChargedCache*>(blob_source.GetBlobCache())
@@ -374,6 +374,115 @@ TEST_F(DBBlobBasicTest, IterateBlobsFromCachePinning) {
374
374
  }
375
375
  }
376
376
 
377
+ TEST_F(DBBlobBasicTest, IterateBlobsAllowUnpreparedValue) {
378
+ Options options = GetDefaultOptions();
379
+ options.enable_blob_files = true;
380
+
381
+ Reopen(options);
382
+
383
+ constexpr size_t num_blobs = 5;
384
+ std::vector<std::string> keys;
385
+ std::vector<std::string> blobs;
386
+
387
+ for (size_t i = 0; i < num_blobs; ++i) {
388
+ keys.emplace_back("key" + std::to_string(i));
389
+ blobs.emplace_back("blob" + std::to_string(i));
390
+ ASSERT_OK(Put(keys[i], blobs[i]));
391
+ }
392
+
393
+ ASSERT_OK(Flush());
394
+
395
+ ReadOptions read_options;
396
+ read_options.allow_unprepared_value = true;
397
+
398
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
399
+
400
+ {
401
+ size_t i = 0;
402
+
403
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
404
+ ASSERT_EQ(iter->key(), keys[i]);
405
+ ASSERT_TRUE(iter->value().empty());
406
+ ASSERT_OK(iter->status());
407
+
408
+ ASSERT_TRUE(iter->PrepareValue());
409
+
410
+ ASSERT_EQ(iter->key(), keys[i]);
411
+ ASSERT_EQ(iter->value(), blobs[i]);
412
+ ASSERT_OK(iter->status());
413
+
414
+ ++i;
415
+ }
416
+
417
+ ASSERT_OK(iter->status());
418
+ ASSERT_EQ(i, num_blobs);
419
+ }
420
+
421
+ {
422
+ size_t i = 0;
423
+
424
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
425
+ ASSERT_EQ(iter->key(), keys[num_blobs - 1 - i]);
426
+ ASSERT_TRUE(iter->value().empty());
427
+ ASSERT_OK(iter->status());
428
+
429
+ ASSERT_TRUE(iter->PrepareValue());
430
+
431
+ ASSERT_EQ(iter->key(), keys[num_blobs - 1 - i]);
432
+ ASSERT_EQ(iter->value(), blobs[num_blobs - 1 - i]);
433
+ ASSERT_OK(iter->status());
434
+
435
+ ++i;
436
+ }
437
+
438
+ ASSERT_OK(iter->status());
439
+ ASSERT_EQ(i, num_blobs);
440
+ }
441
+
442
+ {
443
+ size_t i = 1;
444
+
445
+ for (iter->Seek(keys[i]); iter->Valid(); iter->Next()) {
446
+ ASSERT_EQ(iter->key(), keys[i]);
447
+ ASSERT_TRUE(iter->value().empty());
448
+ ASSERT_OK(iter->status());
449
+
450
+ ASSERT_TRUE(iter->PrepareValue());
451
+
452
+ ASSERT_EQ(iter->key(), keys[i]);
453
+ ASSERT_EQ(iter->value(), blobs[i]);
454
+ ASSERT_OK(iter->status());
455
+
456
+ ++i;
457
+ }
458
+
459
+ ASSERT_OK(iter->status());
460
+ ASSERT_EQ(i, num_blobs);
461
+ }
462
+
463
+ {
464
+ size_t i = 1;
465
+
466
+ for (iter->SeekForPrev(keys[num_blobs - 1 - i]); iter->Valid();
467
+ iter->Prev()) {
468
+ ASSERT_EQ(iter->key(), keys[num_blobs - 1 - i]);
469
+ ASSERT_TRUE(iter->value().empty());
470
+ ASSERT_OK(iter->status());
471
+
472
+ ASSERT_TRUE(iter->PrepareValue());
473
+
474
+ ASSERT_EQ(iter->key(), keys[num_blobs - 1 - i]);
475
+ ASSERT_EQ(iter->value(), blobs[num_blobs - 1 - i]);
476
+ ASSERT_OK(iter->status());
477
+
478
+ ++i;
479
+ }
480
+
481
+ ASSERT_OK(iter->status());
482
+ ASSERT_EQ(i, num_blobs);
483
+ }
484
+ }
485
+
377
486
  TEST_F(DBBlobBasicTest, MultiGetBlobs) {
378
487
  constexpr size_t min_blob_size = 6;
379
488
 
@@ -1655,6 +1764,46 @@ TEST_P(DBBlobBasicIOErrorTest, CompactionFilterReadBlob_IOError) {
1655
1764
  SyncPoint::GetInstance()->ClearAllCallBacks();
1656
1765
  }
1657
1766
 
1767
+ TEST_P(DBBlobBasicIOErrorTest, IterateBlobsAllowUnpreparedValue_IOError) {
1768
+ Options options;
1769
+ options.env = fault_injection_env_.get();
1770
+ options.enable_blob_files = true;
1771
+
1772
+ Reopen(options);
1773
+
1774
+ constexpr char key[] = "key";
1775
+ constexpr char blob_value[] = "blob_value";
1776
+
1777
+ ASSERT_OK(Put(key, blob_value));
1778
+
1779
+ ASSERT_OK(Flush());
1780
+
1781
+ SyncPoint::GetInstance()->SetCallBack(sync_point_, [this](void* /* arg */) {
1782
+ fault_injection_env_->SetFilesystemActive(false,
1783
+ Status::IOError(sync_point_));
1784
+ });
1785
+ SyncPoint::GetInstance()->EnableProcessing();
1786
+
1787
+ ReadOptions read_options;
1788
+ read_options.allow_unprepared_value = true;
1789
+
1790
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_options));
1791
+ iter->SeekToFirst();
1792
+
1793
+ ASSERT_TRUE(iter->Valid());
1794
+ ASSERT_EQ(iter->key(), key);
1795
+ ASSERT_TRUE(iter->value().empty());
1796
+ ASSERT_OK(iter->status());
1797
+
1798
+ ASSERT_FALSE(iter->PrepareValue());
1799
+
1800
+ ASSERT_FALSE(iter->Valid());
1801
+ ASSERT_TRUE(iter->status().IsIOError());
1802
+
1803
+ SyncPoint::GetInstance()->DisableProcessing();
1804
+ SyncPoint::GetInstance()->ClearAllCallBacks();
1805
+ }
1806
+
1658
1807
  TEST_F(DBBlobBasicTest, WarmCacheWithBlobsDuringFlush) {
1659
1808
  Options options = GetDefaultOptions();
1660
1809