0.3.15-pre.012-fix.001

This commit is contained in:
2026-09-16 11:38:02 +02:00
parent 31ae38853d
commit 1c28f3155f
6 changed files with 130 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/src/app_state.rs
// version: 8
// version: 9
//! Shared backend state owned by the Raw Transaction Ingest Desk Tauri application.
@@ -121,22 +121,23 @@ impl crate::AppState {
if let std::result::Result::Err(error) = admission {
return std::result::Result::Err(error);
}
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 prepared = {
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 prepared = crate::prepare_route_start(&self.config_management, *generation, request);
match prepared {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
}
};
let prepared = crate::prepare_route_start(&self.config_management, *generation, request);
let prepared = match prepared {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => return std::result::Result::Err(error),
};
std::mem::drop(generation);
return crate::start_route_runtime(std::sync::Arc::clone(&self.route_runtime), prepared).await;
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/tests/desktop_contract.rs
// version: 10
// version: 11
//! Desktop scaffold contract canaries for Raw Transaction Ingest Desk.
@@ -303,7 +303,8 @@ fn pre_012_window_shutdown_and_start_stop_races_are_bounded_backend_owned() {
assert!(runtime.contains(required), "missing pre.012 route-race marker {required}");
}
let app_state = read_text(app_root().join("src/app_state.rs").as_path());
assert!(app_state.contains("let prepared = {"));
assert!(app_state.contains("let generation = self.inventory_generation.lock()"));
assert!(app_state.contains("std::mem::drop(generation)"));
assert!(!app_state.contains("std::mem::drop(generation)"));
assert!(app_state.contains("self.route_runtime.ensure_start_admission_open()"));
}

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-app-raw-transaction-ingest-desk/unit_tests/route_runtime.rs
// version: 4
// version: 5
#[test]
fn pre_009_multi_route_runtime_starts_without_workers_or_shared_store_material() {
@@ -130,3 +130,14 @@ fn pre_012_application_shutdown_is_one_shot_and_marks_starting_routes_before_act
assert!(matches!(inner.routes.first(), std::option::Option::Some(super::RouteRuntimeSlot::Starting { stop_requested: true, .. })));
}
}
#[test]
fn pre_012_fix_001_start_route_future_is_send_for_tauri_command() {
fn assert_send_future<'a>(
state: &'a crate::AppState,
request: &'a crate::RawIngestRouteStartRequestDto,
) -> impl std::future::Future<Output = ksp_core_lib::Result<crate::RouteRuntimeLaunch>> + std::marker::Send + 'a {
return state.start_route(request);
}
let _assertion = assert_send_future;
}