@nxtedition/rocksdb 13.1.5 → 13.3.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 +62 -15
  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
@@ -139,9 +139,17 @@ ToggleUDT CompareComparator(const Comparator* new_comparator,
139
139
 
140
140
  TimestampRecoveryHandler::TimestampRecoveryHandler(
141
141
  const UnorderedMap<uint32_t, size_t>& running_ts_sz,
142
- const UnorderedMap<uint32_t, size_t>& record_ts_sz)
142
+ const UnorderedMap<uint32_t, size_t>& record_ts_sz, bool seq_per_batch,
143
+ bool batch_per_txn)
143
144
  : running_ts_sz_(running_ts_sz),
144
145
  record_ts_sz_(record_ts_sz),
146
+ // Write after commit currently uses one seq per key (instead of per
147
+ // batch). So seq_per_batch being false indicates write_after_commit
148
+ // approach.
149
+ write_after_commit_(!seq_per_batch),
150
+ // WriteUnprepared can write multiple WriteBatches per transaction, so
151
+ // batch_per_txn being false indicates write_before_prepare.
152
+ write_before_prepare_(!batch_per_txn),
145
153
  new_batch_(new WriteBatch()),
146
154
  handler_valid_(true),
147
155
  new_batch_diff_from_orig_batch_(false) {}
@@ -258,6 +266,43 @@ Status TimestampRecoveryHandler::PutBlobIndexCF(uint32_t cf, const Slice& key,
258
266
  return WriteBatchInternal::PutBlobIndex(new_batch_.get(), cf, new_key, value);
259
267
  }
260
268
 
269
+ Status TimestampRecoveryHandler::MarkBeginPrepare(bool unprepare) {
270
+ // Transaction policy change requires empty WAL and User-defined timestamp is
271
+ // only supported for write committed txns.
272
+ // WriteBatch::Iterate has will handle this based on
273
+ // handler->WriteAfterCommit() and handler->WriteBeforePrepare().
274
+ if (unprepare) {
275
+ return Status::InvalidArgument(
276
+ "Handle user defined timestamp setting change is not supported for"
277
+ "write unprepared policy. The WAL must be emptied.");
278
+ }
279
+ return WriteBatchInternal::InsertBeginPrepare(new_batch_.get(),
280
+ write_after_commit_,
281
+ /* unprepared_batch */ false);
282
+ }
283
+
284
+ Status TimestampRecoveryHandler::MarkEndPrepare(const Slice& name) {
285
+ return WriteBatchInternal::InsertEndPrepare(new_batch_.get(), name);
286
+ }
287
+
288
+ Status TimestampRecoveryHandler::MarkCommit(const Slice& name) {
289
+ return WriteBatchInternal::MarkCommit(new_batch_.get(), name);
290
+ }
291
+
292
+ Status TimestampRecoveryHandler::MarkCommitWithTimestamp(
293
+ const Slice& name, const Slice& commit_ts) {
294
+ return WriteBatchInternal::MarkCommitWithTimestamp(new_batch_.get(), name,
295
+ commit_ts);
296
+ }
297
+
298
+ Status TimestampRecoveryHandler::MarkRollback(const Slice& name) {
299
+ return WriteBatchInternal::MarkRollback(new_batch_.get(), name);
300
+ }
301
+
302
+ Status TimestampRecoveryHandler::MarkNoop(bool /*empty_batch*/) {
303
+ return WriteBatchInternal::InsertNoop(new_batch_.get());
304
+ }
305
+
261
306
  Status TimestampRecoveryHandler::ReconcileTimestampDiscrepancy(
262
307
  uint32_t cf, const Slice& key, std::string* new_key_buf, Slice* new_key) {
263
308
  assert(handler_valid_);
@@ -304,8 +349,8 @@ Status HandleWriteBatchTimestampSizeDifference(
304
349
  const WriteBatch* batch,
305
350
  const UnorderedMap<uint32_t, size_t>& running_ts_sz,
306
351
  const UnorderedMap<uint32_t, size_t>& record_ts_sz,
307
- TimestampSizeConsistencyMode check_mode,
308
- std::unique_ptr<WriteBatch>* new_batch) {
352
+ TimestampSizeConsistencyMode check_mode, bool seq_per_batch,
353
+ bool batch_per_txn, std::unique_ptr<WriteBatch>* new_batch) {
309
354
  // Quick path to bypass checking the WriteBatch.
310
355
  if (AllRunningColumnFamiliesConsistent(running_ts_sz, record_ts_sz)) {
311
356
  return Status::OK();
@@ -318,7 +363,8 @@ Status HandleWriteBatchTimestampSizeDifference(
318
363
  } else if (need_recovery) {
319
364
  assert(new_batch);
320
365
  SequenceNumber sequence = WriteBatchInternal::Sequence(batch);
321
- TimestampRecoveryHandler recovery_handler(running_ts_sz, record_ts_sz);
366
+ TimestampRecoveryHandler recovery_handler(running_ts_sz, record_ts_sz,
367
+ seq_per_batch, batch_per_txn);
322
368
  status = batch->Iterate(&recovery_handler);
323
369
  if (!status.ok()) {
324
370
  return status;
@@ -105,7 +105,8 @@ class UserDefinedTimestampSizeRecord {
105
105
  class TimestampRecoveryHandler : public WriteBatch::Handler {
106
106
  public:
107
107
  TimestampRecoveryHandler(const UnorderedMap<uint32_t, size_t>& running_ts_sz,
108
- const UnorderedMap<uint32_t, size_t>& record_ts_sz);
108
+ const UnorderedMap<uint32_t, size_t>& record_ts_sz,
109
+ bool seq_per_batch, bool batch_per_txn);
109
110
 
110
111
  ~TimestampRecoveryHandler() override {}
111
112
 
@@ -135,19 +136,18 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
135
136
  Status PutBlobIndexCF(uint32_t cf, const Slice& key,
136
137
  const Slice& value) override;
137
138
 
138
- Status MarkBeginPrepare(bool) override { return Status::OK(); }
139
+ Status MarkBeginPrepare(bool unprepare) override;
139
140
 
140
- Status MarkEndPrepare(const Slice&) override { return Status::OK(); }
141
+ Status MarkEndPrepare(const Slice& name) override;
141
142
 
142
- Status MarkCommit(const Slice&) override { return Status::OK(); }
143
+ Status MarkCommit(const Slice& name) override;
143
144
 
144
- Status MarkCommitWithTimestamp(const Slice&, const Slice&) override {
145
- return Status::OK();
146
- }
145
+ Status MarkCommitWithTimestamp(const Slice& name,
146
+ const Slice& commit_ts) override;
147
147
 
148
- Status MarkRollback(const Slice&) override { return Status::OK(); }
148
+ Status MarkRollback(const Slice& name) override;
149
149
 
150
- Status MarkNoop(bool /*empty_batch*/) override { return Status::OK(); }
150
+ Status MarkNoop(bool empty_batch) override;
151
151
 
152
152
  std::unique_ptr<WriteBatch>&& TransferNewBatch() {
153
153
  assert(new_batch_diff_from_orig_batch_);
@@ -155,6 +155,16 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
155
155
  return std::move(new_batch_);
156
156
  }
157
157
 
158
+ protected:
159
+ Handler::OptionState WriteBeforePrepare() const override {
160
+ return write_before_prepare_ ? Handler::OptionState::kEnabled
161
+ : Handler::OptionState::kDisabled;
162
+ }
163
+ Handler::OptionState WriteAfterCommit() const override {
164
+ return write_after_commit_ ? Handler::OptionState::kEnabled
165
+ : Handler::OptionState::kDisabled;
166
+ }
167
+
158
168
  private:
159
169
  Status ReconcileTimestampDiscrepancy(uint32_t cf, const Slice& key,
160
170
  std::string* new_key_buf,
@@ -168,6 +178,9 @@ class TimestampRecoveryHandler : public WriteBatch::Handler {
168
178
  // in the WAL. This only contains non-zero user-defined timestamp size.
169
179
  const UnorderedMap<uint32_t, size_t>& record_ts_sz_;
170
180
 
181
+ bool write_after_commit_;
182
+ bool write_before_prepare_;
183
+
171
184
  std::unique_ptr<WriteBatch> new_batch_;
172
185
  // Handler is valid upon creation and becomes invalid after its `new_batch_`
173
186
  // is transferred.
@@ -220,8 +233,8 @@ Status HandleWriteBatchTimestampSizeDifference(
220
233
  const WriteBatch* batch,
221
234
  const UnorderedMap<uint32_t, size_t>& running_ts_sz,
222
235
  const UnorderedMap<uint32_t, size_t>& record_ts_sz,
223
- TimestampSizeConsistencyMode check_mode,
224
- std::unique_ptr<WriteBatch>* new_batch = nullptr);
236
+ TimestampSizeConsistencyMode check_mode, bool seq_per_batch,
237
+ bool batch_per_txn, std::unique_ptr<WriteBatch>* new_batch = nullptr);
225
238
 
226
239
  // This util function is used when opening an existing column family and
227
240
  // processing its VersionEdit. It does a sanity check for the column family's
@@ -226,11 +226,13 @@ TEST_F(HandleTimestampSizeDifferenceTest, AllColumnFamiliesConsistent) {
226
226
  // All `check_mode` pass with OK status and `batch` not checked or updated.
227
227
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
228
228
  &batch, running_ts_sz, record_ts_sz,
229
- TimestampSizeConsistencyMode::kVerifyConsistency));
229
+ TimestampSizeConsistencyMode::kVerifyConsistency,
230
+ /* seq_per_batch */ false, /* batch_per_txn */ true));
230
231
  std::unique_ptr<WriteBatch> new_batch(nullptr);
231
232
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
232
233
  &batch, running_ts_sz, record_ts_sz,
233
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
234
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
235
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
234
236
  ASSERT_TRUE(new_batch.get() == nullptr);
235
237
  }
236
238
 
@@ -245,11 +247,13 @@ TEST_F(HandleTimestampSizeDifferenceTest,
245
247
  // All `check_mode` pass with OK status and `batch` not checked or updated.
246
248
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
247
249
  &batch, running_ts_sz, record_ts_sz,
248
- TimestampSizeConsistencyMode::kVerifyConsistency));
250
+ TimestampSizeConsistencyMode::kVerifyConsistency,
251
+ /* seq_per_batch */ false, /* batch_per_txn */ true));
249
252
  std::unique_ptr<WriteBatch> new_batch(nullptr);
250
253
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
251
254
  &batch, running_ts_sz, record_ts_sz,
252
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
255
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
256
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
253
257
  ASSERT_TRUE(new_batch.get() == nullptr);
254
258
  }
255
259
 
@@ -263,11 +267,13 @@ TEST_F(HandleTimestampSizeDifferenceTest, InvolvedColumnFamiliesConsistent) {
263
267
  // All `check_mode` pass with OK status and `batch` not updated.
264
268
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
265
269
  &batch, running_ts_sz, record_ts_sz,
266
- TimestampSizeConsistencyMode::kVerifyConsistency));
270
+ TimestampSizeConsistencyMode::kVerifyConsistency,
271
+ /* seq_per_batch */ false, /* batch_per_txn */ true));
267
272
  std::unique_ptr<WriteBatch> new_batch(nullptr);
268
273
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
269
274
  &batch, running_ts_sz, record_ts_sz,
270
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
275
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
276
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
271
277
  ASSERT_TRUE(new_batch.get() == nullptr);
272
278
  }
273
279
 
@@ -282,13 +288,15 @@ TEST_F(HandleTimestampSizeDifferenceTest,
282
288
  // families.
283
289
  ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
284
290
  &batch, running_ts_sz, record_ts_sz,
285
- TimestampSizeConsistencyMode::kVerifyConsistency)
291
+ TimestampSizeConsistencyMode::kVerifyConsistency,
292
+ /* seq_per_batch */ false, /* batch_per_txn */ true)
286
293
  .IsInvalidArgument());
287
294
 
288
295
  std::unique_ptr<WriteBatch> new_batch(nullptr);
289
296
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
290
297
  &batch, running_ts_sz, record_ts_sz,
291
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
298
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
299
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
292
300
  ASSERT_TRUE(new_batch.get() != nullptr);
293
301
  CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
294
302
  std::nullopt /* dropped_cf */);
@@ -307,13 +315,15 @@ TEST_F(HandleTimestampSizeDifferenceTest,
307
315
  // families.
308
316
  ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
309
317
  &batch, running_ts_sz, record_ts_sz,
310
- TimestampSizeConsistencyMode::kVerifyConsistency)
318
+ TimestampSizeConsistencyMode::kVerifyConsistency,
319
+ /* seq_per_batch */ false, /* batch_per_txn */ true)
311
320
  .IsInvalidArgument());
312
321
 
313
322
  std::unique_ptr<WriteBatch> new_batch(nullptr);
314
323
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
315
324
  &batch, running_ts_sz, record_ts_sz,
316
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
325
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
326
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
317
327
  ASSERT_TRUE(new_batch.get() != nullptr);
318
328
  CheckContentsWithTimestampPadding(batch, *new_batch, sizeof(uint64_t));
319
329
  }
@@ -331,7 +341,8 @@ TEST_F(HandleTimestampSizeDifferenceTest,
331
341
  // and all related entries copied over to the new WriteBatch.
332
342
  ASSERT_OK(HandleWriteBatchTimestampSizeDifference(
333
343
  &batch, running_ts_sz, record_ts_sz,
334
- TimestampSizeConsistencyMode::kReconcileInconsistency, &new_batch));
344
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
345
+ /* seq_per_batch */ false, /* batch_per_txn */ true, &new_batch));
335
346
 
336
347
  ASSERT_TRUE(new_batch.get() != nullptr);
337
348
  CheckContentsWithTimestampStripping(batch, *new_batch, sizeof(uint64_t),
@@ -346,12 +357,14 @@ TEST_F(HandleTimestampSizeDifferenceTest, UnrecoverableInconsistency) {
346
357
 
347
358
  ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
348
359
  &batch, running_ts_sz, record_ts_sz,
349
- TimestampSizeConsistencyMode::kVerifyConsistency)
360
+ TimestampSizeConsistencyMode::kVerifyConsistency,
361
+ /* seq_per_batch */ false, /* batch_per_txn */ true)
350
362
  .IsInvalidArgument());
351
363
 
352
364
  ASSERT_TRUE(HandleWriteBatchTimestampSizeDifference(
353
365
  &batch, running_ts_sz, record_ts_sz,
354
- TimestampSizeConsistencyMode::kReconcileInconsistency)
366
+ TimestampSizeConsistencyMode::kReconcileInconsistency,
367
+ /* seq_per_batch */ false, /* batch_per_txn */ true)
355
368
  .IsInvalidArgument());
356
369
  }
357
370
 
@@ -34,15 +34,6 @@ class MemoryTest : public testing::Test {
34
34
  }
35
35
  }
36
36
 
37
- void GetCachePointersFromTableFactory(
38
- const TableFactory* factory,
39
- std::unordered_set<const Cache*>* cache_set) {
40
- const auto bbto = factory->GetOptions<BlockBasedTableOptions>();
41
- if (bbto != nullptr) {
42
- cache_set->insert(bbto->block_cache.get());
43
- }
44
- }
45
-
46
37
  void GetCachePointers(const std::vector<DB*>& dbs,
47
38
  std::unordered_set<const Cache*>* cache_set) {
48
39
  cache_set->clear();
@@ -61,13 +52,8 @@ class MemoryTest : public testing::Test {
61
52
  cache_set->insert(db->GetDBOptions().row_cache.get());
62
53
 
63
54
  // Cache from table factories
64
- std::unordered_map<std::string, const ImmutableCFOptions*> iopts_map;
65
55
  if (db_impl != nullptr) {
66
- ASSERT_OK(db_impl->TEST_GetAllImmutableCFOptions(&iopts_map));
67
- }
68
- for (const auto& pair : iopts_map) {
69
- GetCachePointersFromTableFactory(pair.second->table_factory.get(),
70
- cache_set);
56
+ db_impl->TEST_GetAllBlockCaches(cache_set);
71
57
  }
72
58
  }
73
59
  }
@@ -266,4 +252,3 @@ int main(int argc, char** argv) {
266
252
  return 0;
267
253
  #endif
268
254
  }
269
-
@@ -179,6 +179,8 @@ class DummyTableFactory : public TableFactory {
179
179
  }
180
180
 
181
181
  std::string GetPrintableOptions() const override { return ""; }
182
+
183
+ std::unique_ptr<TableFactory> Clone() const override { return nullptr; }
182
184
  };
183
185
 
184
186
  class DummyMergeOperator : public MergeOperator {
@@ -0,0 +1,214 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "utilities/secondary_index/faiss_ivf_index.h"
7
+
8
+ #include <cassert>
9
+
10
+ #include "faiss/invlists/InvertedLists.h"
11
+ #include "util/coding.h"
12
+
13
+ namespace ROCKSDB_NAMESPACE {
14
+
15
+ class FaissIVFIndex::Adapter : public faiss::InvertedLists {
16
+ public:
17
+ Adapter(size_t num_lists, size_t code_size)
18
+ : faiss::InvertedLists(num_lists, code_size) {
19
+ use_iterator = true;
20
+ }
21
+
22
+ // Non-iterator-based read interface; not implemented/used since use_iterator
23
+ // is true
24
+ size_t list_size(size_t /* list_no */) const override {
25
+ assert(false);
26
+ return 0;
27
+ }
28
+
29
+ const uint8_t* get_codes(size_t /* list_no */) const override {
30
+ assert(false);
31
+ return nullptr;
32
+ }
33
+
34
+ const faiss::idx_t* get_ids(size_t /* list_no */) const override {
35
+ assert(false);
36
+ return nullptr;
37
+ }
38
+
39
+ // Iterator-based read interface; not yet implemented
40
+ faiss::InvertedListsIterator* get_iterator(
41
+ size_t /* list_no */,
42
+ void* /* inverted_list_context */ = nullptr) const override {
43
+ // TODO: implement this
44
+
45
+ assert(false);
46
+ return nullptr;
47
+ }
48
+
49
+ // Write interface; only add_entry is implemented/required for now
50
+ size_t add_entry(size_t /* list_no */, faiss::idx_t /* id */,
51
+ const uint8_t* code,
52
+ void* inverted_list_context = nullptr) override {
53
+ std::string* const code_str =
54
+ static_cast<std::string*>(inverted_list_context);
55
+ assert(code_str);
56
+
57
+ code_str->assign(reinterpret_cast<const char*>(code), code_size);
58
+
59
+ return 0;
60
+ }
61
+
62
+ size_t add_entries(size_t /* list_no */, size_t /* num_entries */,
63
+ const faiss::idx_t* /* ids */,
64
+ const uint8_t* /* code */) override {
65
+ assert(false);
66
+ return 0;
67
+ }
68
+
69
+ void update_entry(size_t /* list_no */, size_t /* offset */,
70
+ faiss::idx_t /* id */, const uint8_t* /* code */) override {
71
+ assert(false);
72
+ }
73
+
74
+ void update_entries(size_t /* list_no */, size_t /* offset */,
75
+ size_t /* num_entries */, const faiss::idx_t* /* ids */,
76
+ const uint8_t* /* code */) override {
77
+ assert(false);
78
+ }
79
+
80
+ void resize(size_t /* list_no */, size_t /* new_size */) override {
81
+ assert(false);
82
+ }
83
+ };
84
+
85
+ std::string FaissIVFIndex::SerializeLabel(faiss::idx_t label) {
86
+ std::string label_str;
87
+ PutVarsignedint64(&label_str, label);
88
+
89
+ return label_str;
90
+ }
91
+
92
+ faiss::idx_t FaissIVFIndex::DeserializeLabel(Slice label_slice) {
93
+ faiss::idx_t label = -1;
94
+ [[maybe_unused]] const bool ok = GetVarsignedint64(&label_slice, &label);
95
+ assert(ok);
96
+
97
+ return label;
98
+ }
99
+
100
+ FaissIVFIndex::FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
101
+ std::string primary_column_name)
102
+ : adapter_(std::make_unique<Adapter>(index->nlist, index->code_size)),
103
+ index_(std::move(index)),
104
+ primary_column_name_(std::move(primary_column_name)) {
105
+ assert(index_);
106
+ assert(index_->quantizer);
107
+
108
+ index_->replace_invlists(adapter_.get());
109
+ }
110
+
111
+ FaissIVFIndex::~FaissIVFIndex() = default;
112
+
113
+ void FaissIVFIndex::SetPrimaryColumnFamily(ColumnFamilyHandle* column_family) {
114
+ assert(column_family);
115
+ primary_column_family_ = column_family;
116
+ }
117
+
118
+ void FaissIVFIndex::SetSecondaryColumnFamily(
119
+ ColumnFamilyHandle* column_family) {
120
+ assert(column_family);
121
+ secondary_column_family_ = column_family;
122
+ }
123
+
124
+ ColumnFamilyHandle* FaissIVFIndex::GetPrimaryColumnFamily() const {
125
+ return primary_column_family_;
126
+ }
127
+
128
+ ColumnFamilyHandle* FaissIVFIndex::GetSecondaryColumnFamily() const {
129
+ return secondary_column_family_;
130
+ }
131
+
132
+ Slice FaissIVFIndex::GetPrimaryColumnName() const {
133
+ return primary_column_name_;
134
+ }
135
+
136
+ Status FaissIVFIndex::UpdatePrimaryColumnValue(
137
+ const Slice& /* primary_key */, const Slice& primary_column_value,
138
+ std::optional<std::variant<Slice, std::string>>* updated_column_value)
139
+ const {
140
+ assert(updated_column_value);
141
+
142
+ if (primary_column_value.size() != index_->d * sizeof(float)) {
143
+ return Status::InvalidArgument(
144
+ "Incorrectly sized vector passed to FaissIVFIndex");
145
+ }
146
+
147
+ constexpr faiss::idx_t n = 1;
148
+ faiss::idx_t label = -1;
149
+
150
+ try {
151
+ index_->quantizer->assign(
152
+ n, reinterpret_cast<const float*>(primary_column_value.data()), &label);
153
+ } catch (const std::exception& e) {
154
+ return Status::InvalidArgument(e.what());
155
+ }
156
+
157
+ if (label < 0 || label >= index_->nlist) {
158
+ return Status::InvalidArgument(
159
+ "Unexpected label returned by coarse quantizer");
160
+ }
161
+
162
+ updated_column_value->emplace(SerializeLabel(label));
163
+
164
+ return Status::OK();
165
+ }
166
+
167
+ Status FaissIVFIndex::GetSecondaryKeyPrefix(
168
+ const Slice& /* primary_key */, const Slice& primary_column_value,
169
+ std::variant<Slice, std::string>* secondary_key_prefix) const {
170
+ assert(secondary_key_prefix);
171
+
172
+ [[maybe_unused]] const faiss::idx_t label =
173
+ DeserializeLabel(primary_column_value);
174
+ assert(label >= 0);
175
+ assert(label < index_->nlist);
176
+
177
+ *secondary_key_prefix = primary_column_value;
178
+
179
+ return Status::OK();
180
+ }
181
+
182
+ Status FaissIVFIndex::GetSecondaryValue(
183
+ const Slice& /* primary_key */, const Slice& primary_column_value,
184
+ const Slice& original_column_value,
185
+ std::optional<std::variant<Slice, std::string>>* secondary_value) const {
186
+ assert(secondary_value);
187
+
188
+ const faiss::idx_t label = DeserializeLabel(primary_column_value);
189
+ assert(label >= 0);
190
+ assert(label < index_->nlist);
191
+
192
+ constexpr faiss::idx_t n = 1;
193
+ constexpr faiss::idx_t* xids = nullptr;
194
+ std::string code_str;
195
+
196
+ try {
197
+ index_->add_core(
198
+ n, reinterpret_cast<const float*>(original_column_value.data()), xids,
199
+ &label, &code_str);
200
+ } catch (const std::exception& e) {
201
+ return Status::InvalidArgument(e.what());
202
+ }
203
+
204
+ if (code_str.size() != index_->code_size) {
205
+ return Status::InvalidArgument(
206
+ "Unexpected code returned by fine quantizer");
207
+ }
208
+
209
+ secondary_value->emplace(std::move(code_str));
210
+
211
+ return Status::OK();
212
+ }
213
+
214
+ } // namespace ROCKSDB_NAMESPACE
@@ -0,0 +1,60 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+
7
+ #pragma once
8
+
9
+ #include <memory>
10
+ #include <string>
11
+
12
+ #include "faiss/IndexIVF.h"
13
+ #include "rocksdb/utilities/secondary_index.h"
14
+
15
+ namespace ROCKSDB_NAMESPACE {
16
+
17
+ // A SecondaryIndex implementation that wraps a FAISS inverted file index.
18
+ class FaissIVFIndex : public SecondaryIndex {
19
+ public:
20
+ explicit FaissIVFIndex(std::unique_ptr<faiss::IndexIVF>&& index,
21
+ std::string primary_column_name);
22
+ ~FaissIVFIndex() override;
23
+
24
+ void SetPrimaryColumnFamily(ColumnFamilyHandle* column_family) override;
25
+ void SetSecondaryColumnFamily(ColumnFamilyHandle* column_family) override;
26
+
27
+ ColumnFamilyHandle* GetPrimaryColumnFamily() const override;
28
+ ColumnFamilyHandle* GetSecondaryColumnFamily() const override;
29
+
30
+ Slice GetPrimaryColumnName() const override;
31
+
32
+ Status UpdatePrimaryColumnValue(
33
+ const Slice& primary_key, const Slice& primary_column_value,
34
+ std::optional<std::variant<Slice, std::string>>* updated_column_value)
35
+ const override;
36
+
37
+ Status GetSecondaryKeyPrefix(
38
+ const Slice& primary_key, const Slice& primary_column_value,
39
+ std::variant<Slice, std::string>* secondary_key_prefix) const override;
40
+
41
+ Status GetSecondaryValue(const Slice& primary_key,
42
+ const Slice& primary_column_value,
43
+ const Slice& original_column_value,
44
+ std::optional<std::variant<Slice, std::string>>*
45
+ secondary_value) const override;
46
+
47
+ private:
48
+ class Adapter;
49
+
50
+ static std::string SerializeLabel(faiss::idx_t label);
51
+ static faiss::idx_t DeserializeLabel(Slice label_slice);
52
+
53
+ std::unique_ptr<Adapter> adapter_;
54
+ std::unique_ptr<faiss::IndexIVF> index_;
55
+ std::string primary_column_name_;
56
+ ColumnFamilyHandle* primary_column_family_{};
57
+ ColumnFamilyHandle* secondary_column_family_{};
58
+ };
59
+
60
+ } // namespace ROCKSDB_NAMESPACE