sync: keep microphone uplink freshness-first
This commit is contained in:
parent
7a8150b2db
commit
dc8559f764
@ -175,5 +175,6 @@ Context: the mirrored browser probe finally reproduced the real failure class on
|
|||||||
- 0.16.22 live mirrored run still failed with p95 `433.7 ms`, median `-359.4 ms`, and 5 paired coded pulses. Client telemetry showed camera uplink `latest_age_ms` repeatedly around `300-350 ms`, matching the measured skew; patch 0.16.23 to make video queues latest-only instead of draining stale-but-under-budget backlog.
|
- 0.16.22 live mirrored run still failed with p95 `433.7 ms`, median `-359.4 ms`, and 5 paired coded pulses. Client telemetry showed camera uplink `latest_age_ms` repeatedly around `300-350 ms`, matching the measured skew; patch 0.16.23 to make video queues latest-only instead of draining stale-but-under-budget backlog.
|
||||||
- 0.16.23 local validation passed for fresh-queue behavior, uplink/probe freshness contracts, sync analyzer tests, client/server binary checks, and whitespace checks.
|
- 0.16.23 local validation passed for fresh-queue behavior, uplink/probe freshness contracts, sync analyzer tests, client/server binary checks, and whitespace checks.
|
||||||
- 0.16.23 live mirrored run improved to p95 `215.2 ms`, median `+142.2 ms`, 13 paired coded pulses, and raw activity alignment within `6.6 ms` of coded pairs. Patch 0.16.24 makes the probe print local client and remote server versions before capture so every run records what was actually tested.
|
- 0.16.23 live mirrored run improved to p95 `215.2 ms`, median `+142.2 ms`, 13 paired coded pulses, and raw activity alignment within `6.6 ms` of coded pairs. Patch 0.16.24 makes the probe print local client and remote server versions before capture so every run records what was actually tested.
|
||||||
|
- 0.16.24 live mirrored run improved again to p95 `168.4 ms`, median `-19.1 ms`, 11 paired coded pulses, but still failed because individual paired pulses bounced between about `-168 ms` and `+45 ms`. Client logs showed the microphone uplink queue still accumulating depth `16`; patch 0.16.25 makes microphone uplink queues latest-only too so stale audio PTS cannot continue acting as the server timing master under backpressure.
|
||||||
- [ ] Re-run the mirrored browser probe after the pre-start false-positive fix.
|
- [ ] Re-run the mirrored browser probe after the pre-start false-positive fix.
|
||||||
- [ ] Run Google Meet manual validation.
|
- [ ] Run Google Meet manual validation.
|
||||||
|
|||||||
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -1652,7 +1652,7 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-stream",
|
"async-stream",
|
||||||
@ -1686,7 +1686,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
@ -1698,7 +1698,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64",
|
"base64",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ path = "src/main.rs"
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_client"
|
name = "lesavka_client"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|||||||
@ -261,7 +261,7 @@ const AUDIO_UPLINK_QUEUE: crate::uplink_fresh_queue::FreshQueueConfig =
|
|||||||
crate::uplink_fresh_queue::FreshQueueConfig {
|
crate::uplink_fresh_queue::FreshQueueConfig {
|
||||||
capacity: 16,
|
capacity: 16,
|
||||||
max_age: Duration::from_millis(400),
|
max_age: Duration::from_millis(400),
|
||||||
policy: crate::uplink_fresh_queue::FreshQueuePolicy::DrainOldest,
|
policy: crate::uplink_fresh_queue::FreshQueuePolicy::LatestOnly,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(not(coverage))]
|
#[cfg(not(coverage))]
|
||||||
|
|||||||
@ -52,7 +52,7 @@ const PROBE_VIDEO_QUEUE: FreshQueueConfig = FreshQueueConfig {
|
|||||||
const PROBE_AUDIO_QUEUE: FreshQueueConfig = FreshQueueConfig {
|
const PROBE_AUDIO_QUEUE: FreshQueueConfig = FreshQueueConfig {
|
||||||
capacity: 32,
|
capacity: 32,
|
||||||
max_age: Duration::from_millis(400),
|
max_age: Duration::from_millis(400),
|
||||||
policy: crate::uplink_fresh_queue::FreshQueuePolicy::DrainOldest,
|
policy: crate::uplink_fresh_queue::FreshQueuePolicy::LatestOnly,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(any(not(coverage), test))]
|
#[cfg(any(not(coverage), test))]
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lesavka_common"
|
name = "lesavka_common"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ bench = false
|
|||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "lesavka_server"
|
name = "lesavka_server"
|
||||||
version = "0.16.24"
|
version = "0.16.25"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
autobins = false
|
autobins = false
|
||||||
|
|
||||||
|
|||||||
@ -82,7 +82,7 @@ fn microphone_uplink_queue_freshness_budget_stays_within_live_audio_window() {
|
|||||||
max_age_ms <= 400,
|
max_age_ms <= 400,
|
||||||
"AUDIO_UPLINK_QUEUE max_age is {max_age_ms}ms; keep it <= 400ms for live calls"
|
"AUDIO_UPLINK_QUEUE max_age is {max_age_ms}ms; keep it <= 400ms for live calls"
|
||||||
);
|
);
|
||||||
assert_queue_policy(block, "AUDIO_UPLINK_QUEUE", "DrainOldest");
|
assert_queue_policy(block, "AUDIO_UPLINK_QUEUE", "LatestOnly");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -105,3 +105,14 @@ fn sync_probe_video_queue_uses_same_freshness_budget() {
|
|||||||
);
|
);
|
||||||
assert_queue_policy(block, "PROBE_VIDEO_QUEUE", "LatestOnly");
|
assert_queue_policy(block, "PROBE_VIDEO_QUEUE", "LatestOnly");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sync_probe_audio_queue_uses_live_latest_only_policy() {
|
||||||
|
let block = queue_block(SYNC_PROBE_CAPTURE_SRC, "PROBE_AUDIO_QUEUE");
|
||||||
|
let max_age_ms = parse_queue_max_age_ms(block, "PROBE_AUDIO_QUEUE");
|
||||||
|
assert!(
|
||||||
|
max_age_ms <= 400,
|
||||||
|
"PROBE_AUDIO_QUEUE max_age is {max_age_ms}ms; keep probe audio from preserving stale timing anchors"
|
||||||
|
);
|
||||||
|
assert_queue_policy(block, "PROBE_AUDIO_QUEUE", "LatestOnly");
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user