0.3.15-pre.009-fix.003
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md -->
|
||||
<!-- version: 15 -->
|
||||
<!-- version: 16 -->
|
||||
|
||||
# Plan v0.3.15 — Raw Transaction Ingest Desk
|
||||
|
||||
@@ -904,3 +904,21 @@ Le gate opérateur de `fix.001` invalide la conclusion selon laquelle le défaut
|
||||
Deux régressions statiques de `fix.001` doivent être fermées avant toute nouvelle hypothèse live : le test des defaults Worker doit attendre 10 s comme la constante publique, et la cible `tracing` explicite doit être possédée par `src/constants.rs` puis consommée via la façade crate.
|
||||
|
||||
La trace sûre de faute source est étendue avec le contexte interne `condition` déjà borné par `runtime_error`; aucune valeur provider, endpoint, signature, payload ou secret n'est ajoutée. Le prochain gate live doit relever cette `condition` pour Yellowstone et HTTP polling avant toute correction fonctionnelle supplémentaire. Les faults `standard-logs-hydrated` (`timeout` après rate-limit), `standard-block-direct` (`rpc_application_error`) et `helius-transaction-hydrated` (`rpc_application_error`) sont des fautes antérieures au Stop et restent séparées du diagnostic shutdown.
|
||||
|
||||
### `pre.009-fix.003` — race Stop / admission drain
|
||||
|
||||
Le gate opérateur de `fix.002` ferme les deux régressions statiques de `fix.001` : les 158 tests unitaires Worker passent et le canari workspace de cible tracing passe. Un unique test d’intégration Worker reste rouge parce que `src/constants.rs`, ajouté par `fix.002`, n’a pas été ajouté à l’inventaire exact de `tests/release_completeness.rs`.
|
||||
|
||||
Les nouvelles traces live qualifient désormais la cause Mainnet des deux faults de shutdown :
|
||||
|
||||
```text
|
||||
yellowstone-hydrated : Stop -> runtime_invalid / condition=source.admission_closed
|
||||
http-block-polling : Stop -> runtime_invalid / condition=source.admission_closed
|
||||
```
|
||||
|
||||
La cause est la même pour les deux routes et se situe dans le drain Worker commun. Après `request_stop`, le superviseur externe signale le Stop au child `run_live_sources`, puis `drain_admission_and_persistence` ferme immédiatement le receiver d’admission. Le child doit encore relayer ce Stop à ses sources internes ; pendant cette fenêtre, un dernier `send()` peut donc observer un receiver fermé avant que son propre `stop_receiver` ne soit passé à `true`, et la fermeture coopérative devient artificiellement `source.admission_closed`.
|
||||
|
||||
`fix.003` garde le receiver d’admission ouvert pendant le drain coopératif. Les sources ont déjà reçu l’ordre de Stop ; le drain continue à consommer les éléments déjà produits jusqu’à ce que les derniers senders soient naturellement détruits. La fermeture forcée de l’admission reste réservée au chemin de timeout borné, qui abort/join les tâches non coopératives. Un test unitaire reproduit la fenêtre de propagation retardée et exige un terminal `Stopped` sans `source_failure_total`.
|
||||
|
||||
Le fault Yellowstone Devnet observé dans le même gate reste distinct : OrbitFlare répond `onchain_transport.grpc_status` avec refus de permission dès l’ouverture du Subscribe, avant toute demande de Stop. Il n’est pas reclassé par ce correctif.
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md -->
|
||||
<!-- version: 16 -->
|
||||
<!-- version: 17 -->
|
||||
|
||||
# Validation v0.3.15 — Raw Transaction Ingest Desk
|
||||
|
||||
@@ -591,3 +591,59 @@ helius-transaction-hydrated
|
||||
```
|
||||
|
||||
Conclusion : le passage du drain par défaut à 10 s reste conservé mais n'est pas une preuve de correction Yellowstone. `fix.002` répare les deux gates statiques et expose dans la trace source le contexte interne statique `condition` des erreurs `runtime_invalid`. Le prochain live doit fournir cette `condition` exacte pour Yellowstone et HTTP polling ; aucune conversion générique `runtime_invalid -> Stopped` n'est autorisée.
|
||||
|
||||
### `pre.009-fix.003` — résultat du gate opérateur `fix.002`
|
||||
|
||||
Le gate opérateur de `0.3.15-pre.009-fix.002` confirme :
|
||||
|
||||
```text
|
||||
audit Rust workspace PASS
|
||||
audit Markdown PASS (318 tables / 210 fichiers)
|
||||
cargo check --workspace PASS
|
||||
Clippy workspace strict -D warnings PASS
|
||||
tests unitaires Worker PASS : 158 / 158
|
||||
workspace_logging PASS
|
||||
tests Worker complets FAIL : 1 canari release_completeness
|
||||
tests workspace FAIL : même canari Worker
|
||||
cargo tauri dev lancé et application opérationnelle
|
||||
```
|
||||
|
||||
L’échec statique restant est exact :
|
||||
|
||||
```text
|
||||
pre_010_production_module_inventory_is_exact
|
||||
réel : admission.rs, constants.rs, continuity.rs, ...
|
||||
attendu : admission.rs, continuity.rs, ...
|
||||
```
|
||||
|
||||
`constants.rs` est une production source volontaire de `fix.002`; le canari doit donc l’inclure.
|
||||
|
||||
Le live apporte surtout la qualification attendue :
|
||||
|
||||
```text
|
||||
Mainnet / yellowstone-hydrated
|
||||
route productive via Yellowstone Block + HTTP getBlock
|
||||
Stop demandé
|
||||
~5 s plus tard : worker_raw_transaction_ingest.runtime_invalid
|
||||
condition=source.admission_closed
|
||||
transport_domain=none
|
||||
transport_code=none
|
||||
|
||||
Mainnet / http-block-polling
|
||||
route productive via getSlot/getBlocks/getBlock
|
||||
Stop demandé
|
||||
~10 ms plus tard : worker_raw_transaction_ingest.runtime_invalid
|
||||
condition=source.admission_closed
|
||||
transport_domain=none
|
||||
transport_code=none
|
||||
|
||||
Devnet / yellowstone-hydrated
|
||||
fault avant Stop lors de SubscribeOpen
|
||||
source_failed / onchain_transport.grpc_status
|
||||
OrbitFlare refuse la permission
|
||||
```
|
||||
|
||||
La cause Mainnet est une race interne commune : le superviseur Worker ferme le receiver d’admission au début du drain alors que `run_live_sources` n’a pas nécessairement encore relayé le Stop à sa source interne. Un dernier `send()` voit alors l’admission fermée alors que son `stop_receiver` local vaut encore `false`, ce qui fabrique `source.admission_closed`.
|
||||
|
||||
Validation attendue après `fix.003` : le drain coopératif ne ferme plus l’admission au début ; il consomme la file jusqu’à destruction naturelle des senders après propagation du Stop. Le hard-close reste dans le chemin `shutdown_drain_timeout`. Un test unitaire force cette fenêtre de propagation et exige `Stopped` sans source failure.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user