v0.3.15-pre.008-fix.001
This commit is contained in:
@@ -1,12 +1,12 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 609
|
# version: 610
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
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"]
|
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]
|
[workspace.package]
|
||||||
version = "0.3.15-pre.8"
|
version = "0.3.15-pre.8.fix.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs
|
// 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.
|
//! 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.
|
/// 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<crate::RouteRuntimeLaunch> {
|
pub(crate) async fn start_route(&self, request: &crate::RawIngestRouteStartRequestDto) -> ksp_core_lib::Result<crate::RouteRuntimeLaunch> {
|
||||||
let generation = self.inventory_generation.lock();
|
let generation = {
|
||||||
let generation = match generation {
|
let generation = self.inventory_generation.lock();
|
||||||
std::result::Result::Ok(value) => *value,
|
match generation {
|
||||||
std::result::Result::Err(_) => {
|
std::result::Result::Ok(value) => *value,
|
||||||
return std::result::Result::Err(ksp_core_lib::Error::new(
|
std::result::Result::Err(_) => {
|
||||||
crate::ERROR_CODE_APP_STATE_LOCK_FAILED,
|
return std::result::Result::Err(ksp_core_lib::Error::new(
|
||||||
"Raw Transaction Ingest Desk route inventory generation lock is poisoned",
|
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 = crate::prepare_route_start(&self.config_management, generation, request);
|
||||||
let prepared = match prepared {
|
let prepared = match prepared {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-app-raw-transaction-ingest-desk/src/route_runtime.rs
|
// 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.
|
//! 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_POLL_INTERVAL: std::time::Duration = std::time::Duration::from_millis(5);
|
||||||
const STORE_RECLAIM_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(1);
|
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.
|
/// Shared mono-route runtime state. `pre.008` admits at most one active or starting Worker.
|
||||||
pub(crate) struct RouteRuntimeState {
|
pub(crate) struct RouteRuntimeState {
|
||||||
inner: std::sync::Mutex<RouteRuntimeInner>,
|
inner: std::sync::Mutex<RouteRuntimeInner>,
|
||||||
@@ -74,7 +79,7 @@ impl crate::RouteRuntimeState {
|
|||||||
std::result::Result::Err(_) => return std::result::Result::Err(runtime_lock_error()),
|
std::result::Result::Err(_) => return std::result::Result::Err(runtime_lock_error()),
|
||||||
};
|
};
|
||||||
match &inner.slot {
|
match &inner.slot {
|
||||||
RouteRuntimeSlot::Starting { token } if *token == reservation.token => {},
|
RouteRuntimeSlot::Starting { token } if token == reservation.token => {},
|
||||||
RouteRuntimeSlot::Idle | RouteRuntimeSlot::Starting { .. } | RouteRuntimeSlot::Active { .. } => {
|
RouteRuntimeSlot::Idle | RouteRuntimeSlot::Starting { .. } | RouteRuntimeSlot::Active { .. } => {
|
||||||
return std::result::Result::Err(ksp_core_lib::Error::new(
|
return std::result::Result::Err(ksp_core_lib::Error::new(
|
||||||
crate::ERROR_CODE_ROUTE_RUNTIME_STATE_INVALID,
|
crate::ERROR_CODE_ROUTE_RUNTIME_STATE_INVALID,
|
||||||
@@ -93,7 +98,7 @@ impl crate::RouteRuntimeState {
|
|||||||
std::result::Result::Ok(value) => value,
|
std::result::Result::Ok(value) => value,
|
||||||
std::result::Result::Err(_) => return,
|
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;
|
inner.slot = RouteRuntimeSlot::Idle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,7 +109,7 @@ impl crate::RouteRuntimeState {
|
|||||||
std::result::Result::Ok(value) => value,
|
std::result::Result::Ok(value) => value,
|
||||||
std::result::Result::Err(_) => return,
|
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;
|
inner.slot = RouteRuntimeSlot::Idle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
54
deltas/0.3.15/pre.008-fix.001.md
Normal file
54
deltas/0.3.15/pre.008-fix.001.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<!-- file: deltas/0.3.15/pre.008-fix.001.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# 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.
|
||||||
Reference in New Issue
Block a user