use super::{
identity::{row, Resolver},
publication::{build, publish},
setup, FIELD, TABLE,
};
use crate::diskann_index::{
format::{DiskANNCanonicalOrigin, DiskANNGeneration, DiskANNVectorVersion, PAGE_BYTES},
pages::{DiskANNOriginReader, DiskANNPageSource, DiskANNReadLimits},
DiskANNCanonicalScorer, RetainedDiskANNIndex,
};
use crate::key_value::{
conformance::{expect, expect_eq},
KeyValueDiskANNCanonical, KeyValueDiskANNStore, RetainedDiskANNCanonical,
};
use crate::{
read_control::StorageReadControl, CatalogFacade, KeyValueCatalog, KeyValueStore,
StorageBackendResult, VectorIndex,
};
use std::sync::Arc;
fn capture(
canonical: &KeyValueDiskANNCanonical,
control: &StorageReadControl,
) -> StorageBackendResult<RetainedDiskANNCanonical> {
canonical.retain_for_index(&row([91; 16])?.relation, control)
}
fn owned(
canonical: &KeyValueDiskANNCanonical,
control: &StorageReadControl,
) -> StorageBackendResult<RetainedDiskANNIndex<RetainedDiskANNCanonical>> {
Ok(capture(canonical, control)?
.into_vector_index(
&Resolver,
DiskANNReadLimits {
resident_bytes: 65_536,
cache_bytes: PAGE_BYTES,
max_in_flight_page_bytes: 2 * PAGE_BYTES,
max_record_bytes: 8192,
},
control,
)?
.expect("published retained index"))
}
fn check_owned(
index: &dyn VectorIndex,
canonical: &RetainedDiskANNCanonical,
count: usize,
control: &StorageReadControl,
) -> StorageBackendResult<()> {
let fresh = StorageReadControl::with_limit(1);
let nested = index
.snapshot_with_control(&fresh)?
.snapshot_with_control(&fresh)?;
expect_eq(
&nested.index_kind(),
&"diskann",
"nested snapshot retains the physical index",
)?;
expect_eq(&nested.count()?, &count, "retained tensor ordinal count")?;
expect(
nested.contains_document(1)?,
"retained nonempty tensor membership",
)?;
expect(
!nested.contains_document(2)?,
"empty tensor has no vector membership",
)?;
expect(
!nested.contains_document(99)?,
"absent document has no vector membership",
)?;
let exact =
DiskANNCanonicalScorer::new(canonical, &[1.0, 0.0], control)?.search_exact_knn(10)?;
expect_eq(
&nested.search_knn(&[1.0, 0.0], 10)?,
&exact,
"owned snapshot keeps raw canonical scores",
)?;
let threshold =
DiskANNCanonicalScorer::new(canonical, &[1.0, 0.0], control)?.search_threshold(0.0)?;
expect_eq(
&nested.search_threshold(&[1.0, 0.0], 0.0)?,
&threshold,
"owned snapshot keeps exact thresholds",
)?;
expect_eq(
&fresh.memory().used(),
&0,
"nested snapshot does not replace the original allowance",
)
}
fn check(
view: &RetainedDiskANNCanonical,
generation: DiskANNGeneration,
version: DiskANNVectorVersion,
control: &StorageReadControl,
) -> StorageBackendResult<()> {
let source = view
.selected_source(&Resolver, control)?
.expect("published fixture");
expect_eq(
&source.generation(),
&generation,
"selected head stays on its query view",
)?;
let origins = DiskANNOriginReader::open(source.clone(), 8192, control)?;
expect_eq(
&origins
.origin(1, control)?
.map(DiskANNCanonicalOrigin::version),
&Some(version),
"physical origins stay with the selected head",
)?;
expect_eq(
&view.origin(1, control)?,
&Some(version),
"canonical input stays on its query view",
)?;
let mut count = 0;
source.read_graph_pages(&[0], control, &mut |id, bytes| {
expect_eq(&id, &0, "selected graph page")?;
expect_eq(&bytes.len(), &PAGE_BYTES, "selected graph page width")?;
count += 1;
Ok(())
})?;
expect_eq(&count, &1, "one complete selected graph page")?;
let query = view
.query(
&Resolver,
DiskANNReadLimits {
resident_bytes: 65_536,
cache_bytes: 0,
max_in_flight_page_bytes: 2 * PAGE_BYTES,
max_record_bytes: 8192,
},
control,
)?
.expect("published query");
let actual = query.search_knn(&[1.0, 0.0], 10, control)?.postings;
let exact = DiskANNCanonicalScorer::new(view, &[1.0, 0.0], control)?.search_exact_knn(10)?;
let bits = |postings: &uqa_core::PostingList| {
postings
.iter()
.map(|posting| (posting.doc_id, posting.payload.score.to_bits()))
.collect::<Vec<_>>()
};
expect_eq(
&bits(&actual),
&bits(&exact),
"selected generation merges the retained canonical changes and full tensors",
)
}
pub fn verify_diskann_query_views(
store: &Arc<dyn KeyValueStore>,
) -> StorageBackendResult<DiskANNGeneration> {
let control = StorageReadControl::with_limit(1 << 20);
let canonical = setup(store)?;
KeyValueCatalog::new(store.clone()).save_catalog_index_row(&row([91; 16])?)?;
canonical.replace(1, &[vec![1.0, 0.0]], &control)?;
canonical.replace(2, &[], &control)?;
let missing = capture(&canonical, &control)?;
expect(
missing.selected_source(&Resolver, &control)?.is_none(),
"missing head remains absent",
)?;
let repository = KeyValueDiskANNStore::connect(store, &control)?;
let (private, private_generation, private_version) =
private_view(store, &canonical, &repository, &control)?;
check(&private, private_generation, private_version, &control)?;
expect(
missing.selected_source(&Resolver, &control)?.is_none(),
"old absent selection never follows a later publication",
)?;
let (first, stage) = build(&canonical, &repository, &control)?;
publish(store, &first, &control)?;
let first_generation = stage.generation();
let first_version = canonical.retain(&control)?.origin(1, &control)?.unwrap();
let held = capture(&canonical, &control)?;
let held_index = owned(&canonical, &control)?;
let second_version = canonical.replace(1, &[vec![0.0, 1.0]], &control)?;
let (second, second_stage) = build(&canonical, &repository, &control)?;
publish(store, &second, &control)?;
let second_generation = second_stage.generation();
drop((first, stage, second, second_stage, repository));
check(&held, first_generation, first_version, &control)?;
check_owned(&held_index, &held, 2, &control)?;
check(&private, private_generation, private_version, &control)?;
check(
&capture(&canonical, &control)?,
second_generation,
second_version,
&control,
)?;
let tiny = StorageReadControl::with_limit(1);
expect(
held.selected_source(&Resolver, &tiny).is_err(),
"query source respects invoking allowance",
)?;
expect_eq(
&tiny.memory().used(),
&0,
"failed query selection releases its allowance",
)?;
cancellation(&canonical, &control)?;
configuration(store, &canonical, &control)?;
Ok(second_generation)
}
fn private_view(
store: &Arc<dyn KeyValueStore>,
canonical: &KeyValueDiskANNCanonical,
repository: &KeyValueDiskANNStore,
control: &StorageReadControl,
) -> StorageBackendResult<(
RetainedDiskANNCanonical,
DiskANNGeneration,
DiskANNVectorVersion,
)> {
store.begin_transaction()?;
store.savepoint("before_generation")?;
let version = canonical.replace(1, &[vec![0.0, 1.0], vec![1.0, 0.0]], control)?;
repository.initialize(control)?;
let (coverage, stage) = build(canonical, repository, control)?;
publish(store, &coverage, control)?;
let held = capture(canonical, control)?;
let held_index = owned(canonical, control)?;
check(&held, stage.generation(), version, control)?;
private_replacement(store, canonical, repository, &held, control)?;
store.savepoint("published_generation")?;
let peer = store.open_session()?;
let peer_canonical = KeyValueDiskANNCanonical::new(peer.clone(), TABLE, FIELD, 2)?;
peer_canonical.replace(3, &[vec![0.5, 0.5]], control)?;
expect(
canonical.retain(control)?.origin(3, control)?.is_none(),
"physical selection does not advance SQL data",
)?;
expect(
capture(&peer_canonical, control)?
.selected_source(&Resolver, control)?
.is_none(),
"private head is invisible to peer",
)?;
store.refresh_transaction_snapshot(control.cancellation())?;
check(
&capture(canonical, control)?,
stage.generation(),
version,
control,
)?;
expect(
canonical.retain(control)?.origin(3, control)?.is_some(),
"explicit command refresh advances canonical data",
)?;
store.rollback_to_savepoint("published_generation")?;
check(
&capture(canonical, control)?,
stage.generation(),
version,
control,
)?;
expect(
canonical.retain(control)?.origin(3, control)?.is_none(),
"savepoint restores its committed boundary",
)?;
store.rollback_to_savepoint("before_generation")?;
expect(
capture(canonical, control)?
.selected_source(&Resolver, control)?
.is_none(),
"undo clears the selecting private head",
)?;
store.rollback_transaction()?;
let generation = stage.generation();
drop((coverage, stage, peer_canonical, peer));
check_owned(&held_index, &held, 2, control)?;
Ok((held, generation, version))
}
fn private_replacement(
store: &Arc<dyn KeyValueStore>,
canonical: &KeyValueDiskANNCanonical,
repository: &KeyValueDiskANNStore,
held: &RetainedDiskANNCanonical,
control: &StorageReadControl,
) -> StorageBackendResult<()> {
store.savepoint("original_head")?;
let scope = held.index_scope(&Resolver, control)?;
let mut selection_key = b"\0uqa-diskann-v1\0\x05".to_vec();
for id in [
scope.table_object(),
scope.storage_generation(),
scope.index_object(),
] {
selection_key.extend_from_slice(&id);
}
let bytes = store.get(&selection_key)?.unwrap();
store.put(&selection_key, &bytes)?;
expect(
capture(canonical, control)?
.selected_source(&Resolver, control)
.is_err(),
"equal private head bytes do not recreate a discarded physical source",
)?;
expect(
held.selected_source(&Resolver, control)?.is_some(),
"older private query keeps its source after head replacement",
)?;
store.rollback_to_savepoint("original_head")?;
let (next, stage) = build(canonical, repository, control)?;
publish(store, &next, control)?;
check(
&capture(canonical, control)?,
stage.generation(),
held.origin(1, control)?.unwrap(),
control,
)?;
expect(
held.selected_source(&Resolver, control)?.is_some(),
"superseded private query keeps its original publication",
)?;
store.rollback_to_savepoint("original_head")?;
store.release_savepoint("original_head")?;
Ok(())
}
fn configuration(
store: &Arc<dyn KeyValueStore>,
canonical: &KeyValueDiskANNCanonical,
control: &StorageReadControl,
) -> StorageBackendResult<()> {
let catalog = KeyValueCatalog::new(store.clone());
let original = row([91; 16])?;
let held = capture(canonical, control)?;
let mut parameters = held.index_parameters().unwrap();
parameters.search_list_size += 1;
let mut changed = original.clone();
changed.parameters_json = serde_json::to_string(¶meters.to_catalog_map(2)?)?;
catalog.save_catalog_index_row(&changed)?;
expect(
capture(canonical, control)?
.selected_source(&Resolver, control)
.is_err(),
"same identity with different configuration cannot select old pages",
)?;
expect(
held.selected_source(&Resolver, control)?.is_some(),
"retained catalog keeps its original configuration",
)?;
catalog.save_catalog_index_row(&original)
}
fn cancellation(
canonical: &KeyValueDiskANNCanonical,
control: &StorageReadControl,
) -> StorageBackendResult<()> {
let original = StorageReadControl::with_limit(1 << 20);
let view = capture(canonical, &original)?;
let source = view.selected_source(&Resolver, control)?.unwrap();
original.cancellation().cancel();
expect(
view.selected_source(&Resolver, control).is_err(),
"query view retains original cancellation",
)?;
expect(
source
.read_graph_pages(&[0], control, &mut |_, _| Ok(()))
.is_err(),
"selected pages retain canonical query cancellation",
)
}
pub fn verify_diskann_query_reopen(
store: &Arc<dyn KeyValueStore>,
generation: DiskANNGeneration,
) -> StorageBackendResult<()> {
let control = StorageReadControl::with_limit(65_536);
let canonical = KeyValueDiskANNCanonical::new(store.clone(), TABLE, FIELD, 2)?;
let held = capture(&canonical, &control)?;
let version = held.origin(1, &control)?.unwrap();
check(&held, generation, version, &control)?;
check_owned(&owned(&canonical, &control)?, &held, 2, &control)
}