Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion quest/m1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ lands before the cut.
- [A widened max age re-offers cached groups](/quest/m1/resolved-demand.md) - a warm relay serves a reader with a wider max age the cached groups a cold relay would, with no wire change
- [Drop set](/quest/m1/drop-set.md) - each cursor judges missing groups against its own budget, so a narrow reader drops promptly and a widening re-offers groups already reported dropped on lite-07
- [SUBSCRIBE_OK names where delivery starts](/quest/m1/subscribe-ok-start.md) - a warm relay names the same start group as a cold one instead of groups it skipped as stale
- [Rust resumed reads](/quest/m1/resume-ordered.md) - a Rust reader takes the lowest group across route copies in both orders, as JS does
- [Resumed close](/quest/m1/resume-closed.md) - a resumed JS track keeps its declared end across copies, and its `closed` and `largest()` settle on a clean end
- [Resumed in-flight groups](/quest/m1/resume-in-flight.md) - a replaced route copy stays while a group below its bound is in flight or it backs a handed-out group late, and no longer than the reader's budget
- [Resumed forks](/quest/m1/resume-fork.md) - a fork of a resumed JS subscriber follows route swaps like its parent
Expand Down
4 changes: 0 additions & 4 deletions quest/m1/resume-closed.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,3 @@ Regression tests:
read pending rejects that read with the abort.

Public API: behavior only. Wire: none.

## Related

- [Rust resumed reads](/quest/m1/resume-ordered.md) - another resume follow-up from #5836
1 change: 0 additions & 1 deletion quest/m1/resume-in-flight.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,3 @@ Public API: behavior only. Wire: none.
## Related

- [Resume reorder](/quest/m1/resume-reorder.md) - the gap rule this reuses
- [Rust resumed reads](/quest/m1/resume-ordered.md) - another resume follow-up from #5836
43 changes: 0 additions & 43 deletions quest/m1/resume-ordered.md

This file was deleted.

82 changes: 54 additions & 28 deletions rs/moq-net/benches/origin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1277,7 +1277,10 @@ fn bench_copy_walk(c: &mut Criterion) {

/// `(readers, retained, routes)` for [`bench_resume_overlap`]: readers of one track,
/// the groups every route holds, and the routes it swapped through.
const RESUME_OVERLAP: [(usize, usize, usize); 12] = [
const RESUME_OVERLAP: [(usize, usize, usize); 15] = [
(1, 1, 1),
(1, 64, 1),
(32, 64, 1),
(1, 1, 2),
(1, 64, 2),
(1, 1024, 2),
Expand All @@ -1298,10 +1301,24 @@ const RESUME_OVERLAP: [(usize, usize, usize); 12] = [
struct ResumeOverlap {
_producer: origin::Producer,
_generations: Vec<(broadcast::Producer, track::Producer)>,
readers: Vec<track::Subscriber>,
readers: Vec<ResumeReader>,
}

async fn resume_overlap(readers: usize, retained: usize, routes: usize) -> ResumeOverlap {
enum ResumeReader {
Arrival(track::Subscriber),
Sequence(track::Ordered),
}

impl ResumeReader {
fn poll_group(&mut self, waiter: &kio::Waiter) -> Poll<moq_net::Result<Option<moq_net::group::Consumer>>> {
match self {
Self::Arrival(reader) => reader.poll_recv_group(waiter),
Self::Sequence(reader) => reader.poll_next_group(waiter),
}
}
}

async fn resume_overlap(readers: usize, retained: usize, routes: usize, ordered: bool) -> ResumeOverlap {
let (producer, driver) = origin::Producer::new(origin::Config::default());
tokio::spawn(moq_net::time::run(driver));
let epoch = Epoch::mint();
Expand Down Expand Up @@ -1359,10 +1376,17 @@ async fn resume_overlap(readers: usize, retained: usize, routes: usize) -> Resum
for subscriber in &mut subscribers {
subscriber.set_groups(..);
}
let readers = subscribers
.into_iter()
.map(|subscriber| match ordered {
true => ResumeReader::Sequence(subscriber.ordered()),
false => ResumeReader::Arrival(subscriber),
})
.collect();
ResumeOverlap {
_producer: producer,
_generations: generations,
readers: subscribers,
readers,
}
}

Expand All @@ -1372,31 +1396,33 @@ async fn resume_overlap(readers: usize, retained: usize, routes: usize) -> Resum
fn bench_resume_overlap(c: &mut Criterion) {
let mut group = c.benchmark_group("origin/resume_overlap");
group.sample_size(10);
for (readers, retained, routes) in RESUME_OVERLAP {
group.throughput(Throughput::Elements((readers * retained) as u64));
group.bench_function(
BenchmarkId::from_parameter(format!("{readers}r_{retained}g_{routes}c")),
|b| {
let runtime = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap();
let waiter = kio::Waiter::noop();
b.iter_batched_ref(
|| runtime.block_on(resume_overlap(readers, retained, routes)),
|rig| {
for reader in &mut rig.readers {
let mut delivered = 0;
while let Poll::Ready(Ok(Some(_))) = reader.poll_recv_group(&waiter) {
delivered += 1;
for (order, ordered) in [("arrival", false), ("sequence", true)] {
for (readers, retained, routes) in RESUME_OVERLAP {
group.throughput(Throughput::Elements((readers * retained) as u64));
group.bench_function(
BenchmarkId::new(order, format!("{readers}r_{retained}g_{routes}c")),
|b| {
let runtime = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap();
let waiter = kio::Waiter::noop();
b.iter_batched_ref(
|| runtime.block_on(resume_overlap(readers, retained, routes, ordered)),
|rig| {
for reader in &mut rig.readers {
let mut delivered = 0;
while let Poll::Ready(Ok(Some(_))) = reader.poll_group(&waiter) {
delivered += 1;
}
assert_eq!(delivered, retained, "every group once");
}
assert_eq!(delivered, retained, "every group once");
}
},
BatchSize::PerIteration,
);
},
);
},
BatchSize::PerIteration,
);
},
);
}
}
group.finish();
}
Expand Down
Loading