From fe512637d4b9731419b5440e6c44d96590c377ab Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Sun, 13 Sep 2026 22:34:26 +0200 Subject: [PATCH] v0.3.15-pre.008-fix.001 --- Cargo.toml | 4 +- .../src/app_state.rs | 22 ++++---- .../src/route_runtime.rs | 13 +++-- deltas/0.3.15/pre.008-fix.001.md | 54 +++++++++++++++++++ 4 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 deltas/0.3.15/pre.008-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index ecc4e4d..8b953a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ # file: Cargo.toml -# version: 609 +# version: 610 [workspace] resolver = "3" members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"] [workspace.package] -version = "0.3.15-pre.8" +version = "0.3.15-pre.8.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs b/crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs index 655f265..7e97ad1 100644 --- a/crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs +++ b/crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs -// version: 4 +// version: 5 //! Shared backend state owned by the Raw Transaction Ingest Desk Tauri application. @@ -117,15 +117,17 @@ impl crate::AppState { /// Starts one real mono-route Store + Worker runtime after repeating the complete Start-time revalidation. pub(crate) async fn start_route(&self, request: &crate::RawIngestRouteStartRequestDto) -> ksp_core_lib::Result { - let generation = self.inventory_generation.lock(); - let generation = match generation { - std::result::Result::Ok(value) => *value, - std::result::Result::Err(_) => { - return std::result::Result::Err(ksp_core_lib::Error::new( - crate::ERROR_CODE_APP_STATE_LOCK_FAILED, - "Raw Transaction Ingest Desk route inventory generation lock is poisoned", - )); - }, + let generation = { + let generation = self.inventory_generation.lock(); + match generation { + std::result::Result::Ok(value) => *value, + std::result::Result::Err(_) => { + return std::result::Result::Err(ksp_core_lib::Error::new( + crate::ERROR_CODE_APP_STATE_LOCK_FAILED, + "Raw Transaction Ingest Desk route inventory generation lock is poisoned", + )); + }, + } }; let prepared = crate::prepare_route_start(&self.config_management, generation, request); let prepared = match prepared { diff --git a/crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs b/crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs index ca91655..c155f6b 100644 --- a/crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs +++ b/crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs @@ -1,5 +1,5 @@ // file: crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs -// version: 1 +// version: 2 //! Mono-route Store and Worker lifecycle owned by Raw Transaction Ingest Desk. @@ -7,6 +7,11 @@ const ROUTE_STOP_CLEANUP_TIMEOUT: std::time::Duration = std::time::Duration::fro const STORE_RECLAIM_POLL_INTERVAL: std::time::Duration = std::time::Duration::from_millis(5); const STORE_RECLAIM_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(1); +struct RouteRuntimeInner { + next_sequence: u64, + slot: RouteRuntimeSlot, +} + /// Shared mono-route runtime state. `pre.008` admits at most one active or starting Worker. pub(crate) struct RouteRuntimeState { inner: std::sync::Mutex, @@ -74,7 +79,7 @@ impl crate::RouteRuntimeState { std::result::Result::Err(_) => return std::result::Result::Err(runtime_lock_error()), }; match &inner.slot { - RouteRuntimeSlot::Starting { token } if *token == reservation.token => {}, + RouteRuntimeSlot::Starting { token } if token == reservation.token => {}, RouteRuntimeSlot::Idle | RouteRuntimeSlot::Starting { .. } | RouteRuntimeSlot::Active { .. } => { return std::result::Result::Err(ksp_core_lib::Error::new( crate::ERROR_CODE_ROUTE_RUNTIME_STATE_INVALID, @@ -93,7 +98,7 @@ impl crate::RouteRuntimeState { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; - if matches!(&inner.slot, RouteRuntimeSlot::Starting { token: current, .. } if *current == token) { + if matches!(&inner.slot, RouteRuntimeSlot::Starting { token: current, .. } if current == token) { inner.slot = RouteRuntimeSlot::Idle; } } @@ -104,7 +109,7 @@ impl crate::RouteRuntimeState { std::result::Result::Ok(value) => value, std::result::Result::Err(_) => return, }; - if matches!(&inner.slot, RouteRuntimeSlot::Active { token: current, .. } if *current == token) { + if matches!(&inner.slot, RouteRuntimeSlot::Active { token: current, .. } if current == token) { inner.slot = RouteRuntimeSlot::Idle; } } diff --git a/deltas/0.3.15/pre.008-fix.001.md b/deltas/0.3.15/pre.008-fix.001.md new file mode 100644 index 0000000..3930404 --- /dev/null +++ b/deltas/0.3.15/pre.008-fix.001.md @@ -0,0 +1,54 @@ + + + +# Delta `0.3.15-pre.008-fix.001` + +## Objet + +Corriger les erreurs de compilation révélées par le premier gate opérateur de `pre.008`, sans modifier le périmètre fonctionnel du runtime mono-route. + +## Défauts observés + +Le gate `cargo check --workspace` de `pre.008` a révélé quatre défauts localisés dans le nouveau runtime Desk : + +- le conteneur privé `RouteRuntimeInner` était référencé mais absent ; +- trois gardes de pattern appliquaient un déréférencement invalide à des tokens `u64` ; +- `AppState::start_route` conservait potentiellement le résultat du verrou `inventory_generation` dans l'état de la future jusqu'au premier `await`, rendant la commande Tauri non `Send` ; +- les erreurs précédentes empêchaient Clippy, les tests et le lancement Tauri d'atteindre le runtime `pre.008`. + +## Correction + +`route_runtime.rs` matérialise désormais le conteneur privé exact du slot mono-route : + +```text +RouteRuntimeInner + next_sequence : u64 + slot : RouteRuntimeSlot +``` + +Les trois comparaisons de token utilisent directement les valeurs `u64` produites par les patterns Rust 2024, sans déréférencement. + +`AppState::start_route` lit maintenant `inventory_generation` dans un bloc synchrone borné. Le `MutexGuard` est détruit avant `prepare_route_start` puis avant l'appel async `start_route_runtime(...).await`, de sorte que la future Tauri ne transporte aucun guard `std::sync::MutexGuard` à travers un point de suspension. + +## Périmètre inchangé + +Le fix ne change aucun contrat de `pre.008` : + +- un seul runtime route peut être `Starting` ou `Active` ; +- même revalidation Start `pre.007` ; +- même `Store::open` / health / close via `ksp-store-lib` ; +- même lancement `RawTransactionIngestWorker::start_with_runtime_resources` ; +- même Stop coopératif et nettoyage Store ; +- aucun multi-route de `pre.009` ; +- aucun monitoring continu de `pre.010`. + +## Version + +```text +header racine : 609 -> 610 +workspace : 0.3.15-pre.8 -> 0.3.15-pre.8.fix.1 +``` + +## Gate opérateur + +Le gate complet de `pre.008` doit être rejoué après application de ce fix.