3.3 KiB
Delta 0.2.8-pre.007-fix.003 — driver I/O sous horloge Tokio pausée
1. Base et défaut restant
Base appliquée :
0.2.8-pre.7.fix.2
Le replay opérateur du fix.002 est propre pour fmt/audit/check/Clippy mais reste à 330/331 unit sur le même canari :
helius_heartbeat_sends_ping_at_sixty_seconds_and_rearms
Après 256 yield_now() bornés, le Ping n'est toujours pas visible par le canal de la fixture TCP locale.
2. Version technique
workspace.package.version = 0.2.8-pre.7.fix.3
commit attendu = v0.2.8-pre.007-fix.003
Git tag = aucun tag prerelease
Le header root Cargo.toml passe en version 230.
3. Diagnostic affiné
La revue du runtime confirme que src/ws_session.rs possède déjà le chemin attendu :
heartbeat_deadline = now + 60 s
tokio::select! -> sleep_until(heartbeat_deadline)
send_helius_heartbeat() -> websocket.send(Ping)
succès -> heartbeat_deadline = now + 60 s
Le canari de reconnexion actor réel reste vert et observe un Ping après réarmement. Aucun défaut runtime nouveau n'est donc démontré.
Le défaut est dans le harness : avec l'horloge Tokio pausée, yield_now() fait progresser les tâches runnable mais ne garantit pas à lui seul un tour du driver I/O OS. Une frame écrite vers le socket loopback peut donc ne pas encore être remontée jusqu'au websocket.next() de la fixture.
4. Correction du canari
Le helper yield-only est remplacé par une observation bornée qui :
1. reprend temporairement l'horloge Tokio ;
2. attend `ping_rx.recv()` avec un timeout réel de 1 s maximum ;
3. mesure le temps réel consommé ;
4. repause immédiatement l'horloge ;
5. exige qu'un Ping ait été reçu.
La fenêtre n'est ouverte qu'après que l'horloge virtuelle a atteint le deadline attendu. Une seconde réelle ne peut donc pas masquer l'absence d'un heartbeat dont la cadence nominale est 60 s.
Pour le second intervalle, le temps réel consommé lors de la première propagation est soustrait de la phase pré-deadline puis réinjecté lors du franchissement suivant. Cela garantit :
avant contrôle négatif : moins de 59 s depuis le réarmement réel
après avance positive : au moins 60 s depuis le réarmement réel
5. Runtime inchangé
Ce fix ne modifie pas :
crates/ksp-onchain-transport-lib/src/ws_session.rs
HELIUS_WS_HEARTBEAT_INTERVAL = 60 s
WebSocket Ping control frame
actor/reconnect/shutdown
WsSessionSettings
Config / schema / env
transactionSubscribe / transactionNotification lifecycle
Aucune dépendance, feature, API ou visibilité n'est ajoutée.
6. Fichiers modifiés
Cargo.toml
crates/ksp-onchain-transport-lib/unit_tests/ws_session.rs
docs/plans/015-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET_PLAN.md
docs/validation/011-V0_2_8_HELIUS_LASERSTREAM_WEBSOCKET.md
deltas/0.2.8/pre.007-fix.003.md
7. Gate opérateur
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-onchain-transport-lib
cargo test --workspace
Critère de fermeture : zéro warning, audit clean, 331 unit / 40 public API / 29 completeness / 4 doctests et workspace vert.