use super::*;
use crate::note_write::race_seam;
use tokio::sync::Barrier;
type CreateOutcome = RuntimeResult<(Note, crate::retrieval::EmbeddingTruncationReport)>;
async fn meet(barrier: &Barrier) {
tokio::time::timeout(std::time::Duration::from_secs(10), barrier.wait())
.await
.expect("the parked create must reach its pause point");
}
fn spawn_racer(
runtime: Arc<KhiveRuntime>,
token: NamespaceToken,
barrier: Arc<Barrier>,
content: &'static str,
key: String,
properties: Option<serde_json::Value>,
) -> tokio::task::JoinHandle<CreateOutcome> {
tokio::spawn(race_seam::AFTER_PREPARE_BARRIER.scope(barrier, async move {
runtime
.create_note_with_options(
&token,
"head",
None,
content,
None,
None,
None,
properties,
vec![],
None,
NoteWriteOptions {
key: Some(key),
embed: Some(false),
..Default::default()
},
)
.await
}))
}
fn one_winner_one_conflict(a: CreateOutcome, b: CreateOutcome) -> (Note, RuntimeError) {
match (a, b) {
(Ok((note, _)), Err(error)) => (note, error),
(Err(error), Ok((note, _))) => (note, error),
other => panic!("expected exactly one winner and one key_conflict, got {other:?}"),
}
}
#[tokio::test]
async fn item3_concurrent_equal_racers_settle_to_one_holder_and_a_true_replay() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let properties = Some(json!({"n": 1}));
let a = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"equal\"}",
"item3/equal".into(),
properties.clone(),
);
let b = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"equal\"}",
"item3/equal".into(),
properties,
);
let (winner, loser) = one_winner_one_conflict(
a.await.expect("racer a task"),
b.await.expect("racer b task"),
);
assert_eq!(winner.key.as_deref(), Some("item3/equal"));
let details = details(loser);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], winner.id.to_string());
assert_eq!(
details["equal"], "true",
"an identical racer must be reported equal: {details}"
);
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(token.namespace().as_str(), "item3/equal", Some("head"))
.await
.unwrap();
assert_eq!(live.len(), 1, "exactly one live holder must remain");
assert_eq!(live[0].id, winner.id);
}
#[tokio::test]
async fn item3_concurrent_different_content_racers_conflict_without_replay() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let a = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"a\"}",
"item3/diff-content".into(),
None,
);
let b = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"b\"}",
"item3/diff-content".into(),
None,
);
let (winner, loser) = one_winner_one_conflict(
a.await.expect("racer a task"),
b.await.expect("racer b task"),
);
let details = details(loser);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], winner.id.to_string());
assert_eq!(
details["equal"], "false",
"differing content must not report equal: {details}"
);
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(
token.namespace().as_str(),
"item3/diff-content",
Some("head"),
)
.await
.unwrap();
assert_eq!(live.len(), 1);
assert_eq!(live[0].id, winner.id);
}
#[tokio::test]
async fn item3_concurrent_different_properties_racers_conflict_without_replay() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let a = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"props\"}",
"item3/diff-props".into(),
Some(json!({"n": 1})),
);
let b = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"race\":\"props\"}",
"item3/diff-props".into(),
Some(json!({"n": 2})),
);
let (_winner, loser) = one_winner_one_conflict(
a.await.expect("racer a task"),
b.await.expect("racer b task"),
);
let details = details(loser);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(
details["equal"], "false",
"differing properties must not report equal: {details}"
);
}
#[tokio::test]
async fn item4_holder_changed_mid_flight_conflict_reflects_current_state() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{}",
"item4/change".into(),
None,
);
meet(&barrier).await;
let seed = create(&runtime, &token, "item4/change", Some(false)).await;
assert_eq!(seed.version, 1);
runtime
.update_note(&token, seed.id, patch("{\"changed\":true}", 1, Some(false)))
.await
.unwrap();
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"the racer's stale-equal candidate must conflict against the now-current holder",
);
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], seed.id.to_string());
assert_eq!(
details["equal"], "false",
"must compare against CURRENT content, not content observed before the race: {details}"
);
}
#[tokio::test]
async fn item4_holder_deleted_mid_flight_lets_the_racer_insert_fresh() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{}",
"item4/delete".into(),
None,
);
meet(&barrier).await;
let seed = create(&runtime, &token, "item4/delete", Some(false)).await;
assert!(
runtime.delete_note(&token, seed.id, false).await.unwrap(),
"soft delete must report a live row removed"
);
meet(&barrier).await;
let (note, _) = racer.await.expect("racer task").expect(
"the key is free once its only holder is soft-deleted, so the racer must insert fresh",
);
assert_ne!(
note.id, seed.id,
"a fresh insert must mint a new id, not resurrect the deleted holder"
);
assert_eq!(note.key.as_deref(), Some("item4/delete"));
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(token.namespace().as_str(), "item4/delete", Some("head"))
.await
.unwrap();
assert_eq!(live.len(), 1);
assert_eq!(live[0].id, note.id);
}
#[tokio::test]
async fn item4_holder_replaced_mid_flight_conflict_names_the_new_holder() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{}",
"item4/replace".into(),
None,
);
meet(&barrier).await;
let original = create(&runtime, &token, "item4/replace", Some(false)).await;
assert!(runtime
.delete_note(&token, original.id, false)
.await
.unwrap());
let (replacement, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{\"replaced\":true}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item4/replace".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
assert_ne!(replacement.id, original.id);
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"the racer's candidate must conflict against the replacement holder, \
not silently replay against the deleted original",
);
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(
details["existing_id"],
replacement.id.to_string(),
"must name the CURRENT (replacement) holder: {details}"
);
assert_eq!(details["equal"], "false");
}
#[tokio::test]
async fn item4_fence_invalidated_mid_flight_refuses_the_dependent_create() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let fenced = create(&runtime, &token, "item4/fence-target", Some(false)).await;
assert_eq!(fenced.version, 1);
let barrier = Arc::new(Barrier::new(2));
let racer = {
let runtime = Arc::clone(&runtime);
let token = token.clone();
let barrier = Arc::clone(&barrier);
tokio::spawn(race_seam::AFTER_PREPARE_BARRIER.scope(barrier, async move {
runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item4/fence-dependent".into()),
embed: Some(false),
fence: Some(
NoteFence {
key: "item4/fence-target".into(),
kind: "head".into(),
expected_version: Some(1),
live_until: None,
id: None,
}
.into(),
),
..Default::default()
},
)
.await
}))
};
meet(&barrier).await;
runtime
.update_note(
&token,
fenced.id,
patch("{\"bumped\":true}", 1, Some(false)),
)
.await
.unwrap();
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"a fence valid at prep time but stale at admission time must refuse the dependent create",
);
let details = details(error);
assert_eq!(details["reason"], "fence_conflict");
assert_eq!(details["key"], "item4/fence-target");
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(
token.namespace().as_str(),
"item4/fence-dependent",
Some("head"),
)
.await
.unwrap();
assert!(
live.is_empty(),
"a fence-refused create must not leave a row behind"
);
}
#[tokio::test]
async fn item5_independent_writer_completes_with_equal_content_then_racer_replays() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"v\":1}",
"item5/equal".into(),
None,
);
meet(&barrier).await;
let (independent, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{\"v\":1}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item5/equal".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"the racer's equal payload must replay against the just-committed independent holder",
);
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], independent.id.to_string());
assert_eq!(details["equal"], "true");
}
#[tokio::test]
async fn item5_independent_writer_completes_with_different_content_then_racer_conflicts() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"v\":1}",
"item5/diff".into(),
None,
);
meet(&barrier).await;
let (independent, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{\"v\":2}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item5/diff".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
meet(&barrier).await;
let error = racer
.await
.expect("racer task")
.expect_err("a different independent holder must conflict, not replay");
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], independent.id.to_string());
assert_eq!(details["equal"], "false");
}
#[tokio::test]
async fn item5_independent_writer_on_another_key_proceeds_while_racer_is_parked() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"{\"v\":1}",
"item5/absent".into(),
None,
);
meet(&barrier).await;
let unrelated = create(&runtime, &token, "item5/absent-control", Some(false)).await;
meet(&barrier).await;
let (note, _) = racer
.await
.expect("racer task")
.expect("a still-absent key must insert fresh");
assert_eq!(note.key.as_deref(), Some("item5/absent"));
assert_ne!(note.id, unrelated.id);
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(token.namespace().as_str(), "item5/absent", Some("head"))
.await
.unwrap();
assert_eq!(live.len(), 1);
assert_eq!(live[0].id, note.id);
}
#[tokio::test]
async fn item5_fresh_insert_fault_rolls_back_and_leaves_the_key_free() {
let (runtime, token, _service) = fixture();
let ns = token.namespace().as_str().to_string();
let _arm = crate::operations::arm_vector_fail_scoped(ns.as_str());
let error = runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item5/fault".into()),
embed: Some(false),
..Default::default()
},
)
.await
.expect_err("an injected insertion fault must surface as a genuine error, never a replay");
assert!(
!matches!(error, RuntimeError::Khive(_)),
"a fault-injected failure must not take the key_conflict/replay shape at all: {error:?}"
);
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(ns.as_str(), "item5/fault", Some("head"))
.await
.unwrap();
assert!(
live.is_empty(),
"a rolled-back insert must leave the key free: {live:?}"
);
drop(_arm);
let (fresh, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("item5/fault".into()),
embed: Some(false),
..Default::default()
},
)
.await
.expect("the key must still be free for a genuine, unfaulted create");
assert_eq!(fresh.key.as_deref(), Some("item5/fault"));
}
#[tokio::test]
async fn item4_equal_replay_survives_a_vanished_annotates_target() {
let (runtime, token, _service) = fixture();
let target = runtime
.create_entity(
&token,
"concept",
None,
"boundary-target",
None,
None,
vec![],
)
.await
.unwrap();
let (holder, _) = runtime
.create_note_with_options(
&token,
"observation",
None,
"{}",
None,
None,
None,
None,
vec![target.id],
None,
NoteWriteOptions {
key: Some("boundary/annotates-gone".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
assert!(runtime
.delete_entity(&token, target.id, false)
.await
.unwrap());
let edges_before = runtime
.neighbors(
&token,
holder.id,
khive_storage::types::Direction::Out,
None,
Some(vec![khive_storage::EdgeRelation::Annotates]),
)
.await
.unwrap()
.len();
let error = runtime
.create_note_with_options(
&token,
"observation",
None,
"{}",
None,
None,
None,
None,
vec![target.id],
None,
NoteWriteOptions {
key: Some("boundary/annotates-gone".into()),
embed: Some(false),
..Default::default()
},
)
.await
.expect_err("an equal replay must not require its annotates target to still exist");
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["equal"], "true");
assert_eq!(details["existing_id"], holder.id.to_string());
let current = runtime
.notes(&token)
.unwrap()
.get_note(holder.id)
.await
.unwrap()
.unwrap();
assert_eq!(
current, holder,
"a replay must leave the holder row untouched"
);
let edges_after = runtime
.neighbors(
&token,
holder.id,
khive_storage::types::Direction::Out,
None,
Some(vec![khive_storage::EdgeRelation::Annotates]),
)
.await
.unwrap()
.len();
assert_eq!(
edges_before, edges_after,
"a replay must not add a new annotates edge"
);
}
#[tokio::test]
async fn item4_equal_replay_survives_an_unregistered_embedding_model() {
let (runtime, token, _service) = fixture();
let holder = create(&runtime, &token, "boundary/model-gone", Some(false)).await;
let error = runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
Some("boundary-nonexistent-model"),
NoteWriteOptions {
key: Some("boundary/model-gone".into()),
embed: Some(true),
..Default::default()
},
)
.await
.expect_err("an equal replay must not require its embedding model to be resolvable");
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["equal"], "true");
assert_eq!(details["existing_id"], holder.id.to_string());
}
#[tokio::test]
async fn item4_equal_replay_with_different_name_and_salience_leaves_the_holder_unchanged() {
let (runtime, token, _service) = fixture();
let (holder, _) = runtime
.create_note_with_options(
&token,
"observation",
Some("the original name"),
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/name-salience".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
assert_eq!(holder.name.as_deref(), Some("the original name"));
let error = runtime
.create_note_with_options(
&token,
"observation",
Some("a different name"),
"{}",
None,
Some(0.9),
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/name-salience".into()),
embed: Some(false),
..Default::default()
},
)
.await
.expect_err("a name/salience-only difference must still replay");
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["equal"], "true");
let current = runtime
.notes(&token)
.unwrap()
.get_note(holder.id)
.await
.unwrap()
.unwrap();
assert_eq!(
current, holder,
"a replay must leave the holder's name and salience untouched"
);
}
#[tokio::test]
async fn item4_initial_equal_replay_never_attempts_embedding() {
const CONTENT: &str = "{\"text\":\"a replay never embeds\"}";
let (runtime, token, service) = fixture();
let (holder, _) = runtime
.create_note_with_options(
&token,
"head",
None,
CONTENT,
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/no-embed-on-replay".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
let calls_before = service.calls.load(std::sync::atomic::Ordering::SeqCst);
let error = runtime
.create_note_with_options(
&token,
"head",
None,
CONTENT,
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/no-embed-on-replay".into()),
embed: Some(true),
..Default::default()
},
)
.await
.expect_err("an equal replay must still report key_conflict");
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["equal"], "true");
assert_eq!(details["existing_id"], holder.id.to_string());
assert_eq!(
service.calls.load(std::sync::atomic::Ordering::SeqCst),
calls_before,
"an initial-equal replay must never call the embedding service"
);
runtime
.create_note_with_options(
&token,
"head",
None,
CONTENT,
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/no-embed-on-replay-control".into()),
embed: Some(true),
..Default::default()
},
)
.await
.expect("a fresh key must create and embed");
assert_eq!(
service.calls.load(std::sync::atomic::Ordering::SeqCst),
calls_before + 1,
"embedding this prefix must reach the service, or the replay assertion proves nothing"
);
}
#[tokio::test]
async fn item4_fence_stale_at_the_initial_check_refuses_before_preparation_runs() {
let (runtime, token, service) = fixture();
let fenced = create(&runtime, &token, "boundary/fence-target", Some(false)).await;
assert_eq!(fenced.version, 1);
runtime
.update_note(
&token,
fenced.id,
patch("{\"bumped\":true}", 1, Some(false)),
)
.await
.unwrap();
let calls_before = service.calls.load(std::sync::atomic::Ordering::SeqCst);
let error = runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/fence-dependent".into()),
embed: Some(true),
fence: Some(
NoteFence {
key: "boundary/fence-target".into(),
kind: "head".into(),
expected_version: Some(1),
live_until: None,
id: None,
}
.into(),
),
..Default::default()
},
)
.await
.expect_err("a fence stale at the initial check must refuse before preparation runs");
let details = details(error);
assert_eq!(details["reason"], "fence_conflict");
assert_eq!(details["key"], "boundary/fence-target");
assert_eq!(
service.calls.load(std::sync::atomic::Ordering::SeqCst),
calls_before,
"a fence refused at the initial check must never reach preparation"
);
let live = runtime
.notes(&token)
.unwrap()
.get_live_notes_by_key(
token.namespace().as_str(),
"boundary/fence-dependent",
Some("head"),
)
.await
.unwrap();
assert!(
live.is_empty(),
"a fence-refused create must not leave a row behind"
);
runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/fence-dependent".into()),
embed: Some(true),
..Default::default()
},
)
.await
.expect("the same create without the stale fence must succeed");
assert_eq!(
service.calls.load(std::sync::atomic::Ordering::SeqCst),
calls_before + 1,
"this create's preparation must reach the service, or the refusal assertion proves nothing"
);
}
fn spawn_prep_failing_racer(
runtime: Arc<KhiveRuntime>,
token: NamespaceToken,
barrier: Arc<Barrier>,
key: String,
content: &'static str,
) -> tokio::task::JoinHandle<CreateOutcome> {
let missing_target = uuid::Uuid::new_v4();
tokio::spawn(race_seam::AFTER_PREPARE_BARRIER.scope(barrier, async move {
runtime
.create_note_with_options(
&token,
"head",
None,
content,
None,
None,
None,
None,
vec![missing_target],
None,
NoteWriteOptions {
key: Some(key),
embed: Some(false),
..Default::default()
},
)
.await
}))
}
#[tokio::test]
async fn item5_prepared_failure_then_an_equal_independent_holder_replays() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_prep_failing_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"boundary/prep-fails-equal".into(),
"{}",
);
meet(&barrier).await;
let (independent, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/prep-fails-equal".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"a parked preparation failure must not surface once an equal holder now exists",
);
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], independent.id.to_string());
assert_eq!(details["equal"], "true");
}
#[tokio::test]
async fn item5_prepared_failure_then_a_different_independent_holder_conflicts() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_prep_failing_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"boundary/prep-fails-diff".into(),
"{\"v\":1}",
);
meet(&barrier).await;
let (independent, _) = runtime
.create_note_with_options(
&token,
"head",
None,
"{\"v\":2}",
None,
None,
None,
None,
vec![],
None,
NoteWriteOptions {
key: Some("boundary/prep-fails-diff".into()),
embed: Some(false),
..Default::default()
},
)
.await
.unwrap();
meet(&barrier).await;
let error = racer.await.expect("racer task").expect_err(
"a different independent holder must conflict, discarding the preparation failure",
);
let details = details(error);
assert_eq!(details["reason"], "key_conflict");
assert_eq!(details["existing_id"], independent.id.to_string());
assert_eq!(details["equal"], "false");
}
#[tokio::test]
async fn item5_prepared_failure_with_the_key_still_absent_returns_the_original_failure() {
let (runtime, token, _service) = fixture();
let runtime = Arc::new(runtime);
let barrier = Arc::new(Barrier::new(2));
let racer = spawn_prep_failing_racer(
Arc::clone(&runtime),
token.clone(),
Arc::clone(&barrier),
"boundary/prep-fails-absent".into(),
"{}",
);
meet(&barrier).await;
meet(&barrier).await;
let error = racer
.await
.expect("racer task")
.expect_err("a still-absent key must surface the original preparation failure");
assert!(
matches!(error, RuntimeError::NotFound(_)),
"must be the original NotFound, not a key_conflict: {error:?}"
);
}