6.3 KiB
Delta v0.3.15-pre.013 — Yellowstone Block hydration backpressure
Base
ksp-general-0.3.15-pre.012-fix.004.zip
SHA-256: f88de2b95c2aab48043fd64b7825d9c508dc38d8f6ef51247ebce0da31be810e
Le gate opérateur de pre.012-fix.004 compile et teste proprement les nouveaux diagnostics Store/Worker. Le live Mainnet ne reproduit aucun content_conflict, mais Yellowstone devient deux fois terminal source_failed / onchain_transport.grpc_backpressure_overflow.
Les WARN Transport apparaissent avant les Stop opérateur :
22:06:52.734796 Yellowstone subscribe update queue overflowed
22:07:10.781900 Stop Yellowstone demandé
22:08:39.746262 Yellowstone subscribe update queue overflowed
22:08:51.337483 Stop Yellowstone demandé
Le défaut n'appartient donc ni au Stop Desk ni au diagnostic pre.012-fix.004. Il appartient au couloir acquisition Yellowstone antérieur. Conformément à VER-LIFECYCLE-010, il ouvre une nouvelle prerelease dédiée et ne devient pas pre.012-fix.005.
Cause
Le mode Yellowstone Block était la seule voie d'hydration HTTP exécutée séquentiellement dans la boucle de réception source :
Block update gRPC
-> await HTTP getBlock
-> await admission de toutes les transactions du bloc
-> next_update gRPC suivant
Pendant ces attentes, le Worker ne vidait plus la queue d'updates Transport. Sur Mainnet, la queue bornée finissait donc par atteindre sa capacité et Transport terminait correctement fail-closed avec grpc_backpressure_overflow.
Le mode Block était également exclu de RawTransactionIngestLiveSource::uses_hydration(), donc il ne recevait aucun quota pending/in-flight lors du partitionnement déjà utilisé par les sources à hydration HTTP.
Correction
RawTransactionIngestLiveSource::Yellowstone participe désormais toujours au budget d'hydration, y compris en mode BlockHydration.
Le nouveau coordinateur privé RawTransactionIngestYellowstoneBlockHydrationCoordinator :
pending slots <= quota pending attribué à la source
getBlock/admission tasks in flight <= quota in-flight attribué à la source
JoinSet possédé par la source
aucune queue non bornée
aucun task détaché
aucun silent drop
La notification Block gRPC ne lance plus directement un await getBlock dans la branche session.next_update(). Elle réserve le slot dans le coordinateur. Jusqu'au quota in-flight, des tâches possédées exécutent en parallèle :
HTTP getBlock Full/Base64
-> construction Common RAW existante
-> admission complète de toutes les transactions du bloc
-> retour du slot terminé
Le slot n'est settled dans la processing frontier qu'après admission complète du bloc. Un Stop ou abort annule/joint les tâches et purge les pending sans settlement artificiel.
La boucle Yellowstone continue à consommer session.next_update() tant que le quota pending possède une place. Si le débit aval reste durablement inférieur au débit de chaîne jusqu'à saturation de toutes les bornes, la politique fail-closed reste inchangée : aucun agrandissement de la queue Transport ne masque la surcharge.
Frontières
Aucun changement de :
YellowstoneGrpcSessionSettings.update_channel_capacity
Transport gRPC actor
Store / schema / RAW canonical identity
content_conflict policy / diagnostics pre.012-fix.004
Config
Desk Start/Stop/shutdown/IPC
HTTP Block Polling
Standard Block / Standard Logs / Helius
Backfill
public Worker API
Le correctif réutilise uniquement les budgets admission_queue_capacity et persistence_concurrency déjà possédés par le Worker pour partitionner les sources hydratantes.
Canaris
Ajouts/évolutions :
v0_3_15_pre_013_yellowstone_block_hydration_coordinator_is_bounded_before_http_work
v0_3_15_pre_013_yellowstone_block_hydration_is_bounded_concurrent_and_stop_preemptible
v0_3_15_pre_013_yellowstone_block_backpressure_fix_adds_no_public_surface
Le test historique pre_009_yellowstone_block_mode_uses_get_block_without_transaction_hydration vérifie maintenant aussi que le mode Block participe au budget d'hydration sans devenir une hydration getTransaction.
Plan
Le forecast est décalé d'une prerelease :
pre.013 Yellowstone Block hydration backpressure
pre.014 completeness/security cross-layer
pre.015 gate technique/live final
pre.016 réconciliation documentaire finale
pre.017 préparation publication
rel.001 stable mécanique
Version
workspace.package.version : 0.3.15-pre.13
root Cargo header counter : 627
Validation attendue
cargo fmt --all
cargo fmt --all -- --check
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.15
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features
cargo test --workspace --all-targets --all-features
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev)
Live obligatoire :
1. Yellowstone Mainnet seul pendant au moins plusieurs minutes, donc au-delà des ~80 s de reproduction.
2. Vérifier absence de grpc_backpressure_overflow et état Healthy/Running.
3. Stop ciblé Yellowstone => Stopped/Healthy.
4. Yellowstone + HTTP Block Polling en parallèle pendant plusieurs minutes.
5. Vérifier les deux routes productives et manipulables.
6. Vérifier absence de grpc_backpressure_overflow.
7. Si content_conflict réapparaît, exploiter le diagnostic sémantique de pre.012-fix.004 sans le masquer.
Inventaire exact du delta
Ajout :
deltas/0.3.15/pre.013.md
Modifications :
Cargo.toml
crates/ksp-worker-raw-transaction-ingest-lib/README.md
crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs
crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs
crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs
docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md
docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md
Suppressions : aucune.