diff --git a/crates/ecstore/src/disk/local.rs b/crates/ecstore/src/disk/local.rs index ab7e58eb6..a11ed35f0 100644 --- a/crates/ecstore/src/disk/local.rs +++ b/crates/ecstore/src/disk/local.rs @@ -13291,7 +13291,7 @@ mod test { }), _ => unreachable!(), }; - if published && owner_probe.upgrade().is_none() { + if published && owner_probe.upgrade().is_none() && !ctx.namespace_commits_pending() { break; } tokio::task::yield_now().await; @@ -13429,7 +13429,10 @@ mod test { let generation = ctx.namespace_commit_generation(); drop(release_tx); tokio::time::timeout(Duration::from_secs(5), async { - while !std::fs::read(&xl_path).is_ok_and(|data| data == old_meta) || owner_probe.upgrade().is_some() { + while !std::fs::read(&xl_path).is_ok_and(|data| data == old_meta) + || owner_probe.upgrade().is_some() + || ctx.namespace_commits_pending() + { tokio::task::yield_now().await; } }) @@ -13554,7 +13557,7 @@ mod test { .expect("quota claim drains after syscall") .expect("revoke"); tokio::time::timeout(Duration::from_secs(5), async { - while owner_probe.upgrade().is_some() { + while owner_probe.upgrade().is_some() || ctx.namespace_commits_pending() { tokio::task::yield_now().await; } }) diff --git a/crates/ecstore/src/disk/os.rs b/crates/ecstore/src/disk/os.rs index 39ffeb955..caf878742 100644 --- a/crates/ecstore/src/disk/os.rs +++ b/crates/ecstore/src/disk/os.rs @@ -6437,7 +6437,12 @@ mod tests { let generations = (first_ctx.namespace_commit_generation(), second_ctx.namespace_commit_generation()); drop(release_tx); tokio::time::timeout(Duration::from_secs(5), async { - while Arc::strong_count(&group.dir_file) != 1 || first_probe.upgrade().is_some() || second_probe.upgrade().is_some() { + while Arc::strong_count(&group.dir_file) != 1 + || first_probe.upgrade().is_some() + || second_probe.upgrade().is_some() + || first_ctx.namespace_commits_pending() + || second_ctx.namespace_commits_pending() + { tokio::task::yield_now().await; } }) diff --git a/crates/ecstore/src/set_disk/core/io_primitives.rs b/crates/ecstore/src/set_disk/core/io_primitives.rs index 567edf151..04ff49743 100644 --- a/crates/ecstore/src/set_disk/core/io_primitives.rs +++ b/crates/ecstore/src/set_disk/core/io_primitives.rs @@ -11038,6 +11038,16 @@ mod tests { assert_eq!(stored.size, 11); assert_eq!(stored.data.as_deref(), Some(b"inline-body".as_slice())); } + // The lease releases its locks before dropping the namespace owner, and the + // owner's `Drop` runs after its `Weak` probe stops upgrading, so wait for the + // pending counter itself instead of asserting it right after the drain. + tokio::time::timeout(Duration::from_secs(5), async { + while ctx.namespace_commits_pending() || namespace_probe.upgrade().is_some() { + tokio::task::yield_now().await; + } + }) + .await + .expect("released physical publishers must release namespace ownership"); let generation_after_publication = ctx.namespace_commit_generation(); assert!(!ctx.namespace_commits_pending()); assert!(namespace_probe.upgrade().is_none()); @@ -11177,6 +11187,13 @@ mod tests { .await .expect("late physical tail drains"); drop(lease); + tokio::time::timeout(Duration::from_secs(5), async { + while ctx.namespace_commits_pending() || owner_probe.upgrade().is_some() { + tokio::task::yield_now().await; + } + }) + .await + .expect("late physical tail must release namespace ownership"); for dir in &dirs { let stored = reopen_local_disk(dir) .await