観測
配送ポンプが broadcast の lag で終了し、以後その参加者へ何も届かなくなる。ソケットは開いたままなので、画面にも名簿にも異常が出ない。
serve_participant の pump は次の形をしている(src-tauri/src/room.rs)。
while let Ok(fanout) = from_room.recv().await {
if fanout.origin == own_origin { continue; }
if sink.send(Message::Text(fanout.frame.into())).await.is_err() { break; }
}
tokio::sync::broadcast::Receiver::recv は、受信が容量(256)ぶん遅れたとき Err(RecvError::Lagged(n)) を返す。while let Ok(..) はこれで抜ける。Lagged の後も receiver 自体は使えるため、本来は取りこぼした件数を記録して継続できる。現状は恒久的に離脱する。
Err(RecvError::Closed) との区別も無い。
前提
制約
Lagged と Closed を分けて扱う。Lagged は継続、Closed は離脱。
- 取りこぼしは沈黙させない。件数を stderr へ出す。部屋の発言が落ちたことは参加者側から観測できないため、ログが唯一の手がかりになる。
- 落ちた発言の再送は行わない。部屋は履歴を持たない設計であり、ここで持たせない。
対象ファイル
完了条件
- lag した参加者が、その後の発言を受け取り続ける。
- 取りこぼした件数が stderr に出る。
- ソケットが閉じたときは従来どおり離脱し、名簿から外れる。
関連
観測
配送ポンプが broadcast の lag で終了し、以後その参加者へ何も届かなくなる。ソケットは開いたままなので、画面にも名簿にも異常が出ない。
serve_participantの pump は次の形をしている(src-tauri/src/room.rs)。tokio::sync::broadcast::Receiver::recvは、受信が容量(256)ぶん遅れたときErr(RecvError::Lagged(n))を返す。while let Ok(..)はこれで抜ける。Laggedの後も receiver 自体は使えるため、本来は取りこぼした件数を記録して継続できる。現状は恒久的に離脱する。Err(RecvError::Closed)との区別も無い。前提
制約
LaggedとClosedを分けて扱う。Laggedは継続、Closedは離脱。対象ファイル
src-tauri/src/room.rs完了条件
関連