v0.3.7-pre.008-fix.001

This commit is contained in:
2026-09-02 17:02:26 +02:00
parent 48d26b43f9
commit d7db8d69e0
7 changed files with 160 additions and 9 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-job-backfill-lib/src/discovery.rs
// version: 5
// version: 6
/// Network-scoped identity of one discovered transaction candidate before canonical signature decoding.
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
@@ -166,7 +166,8 @@ struct SignaturePageEntry {
slot: u64,
}
type SignaturePageFuture<'a> = std::pin::Pin<std::boxed::Box<dyn std::future::Future<Output = ksp_core_lib::Result<std::vec::Vec<SignaturePageEntry>>> + 'a>>;
type SignaturePageFuture<'a> =
std::pin::Pin<std::boxed::Box<dyn std::future::Future<Output = ksp_core_lib::Result<std::vec::Vec<SignaturePageEntry>>> + std::marker::Send + 'a>>;
trait SignaturePageSource {
fn fetch_signature_page<'a>(

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-job-backfill-lib/src/execution.rs
// version: 3
// version: 4
use futures_util::StreamExt; // rust-rules: trait-import
@@ -266,7 +266,7 @@ pub(crate) async fn execute_backfill_discovery_cancellable(
}
type CandidateProcessFuture<'a> =
std::pin::Pin<std::boxed::Box<dyn std::future::Future<Output = ksp_core_lib::Result<crate::BackfillPersistenceOutcome>> + 'a>>;
std::pin::Pin<std::boxed::Box<dyn std::future::Future<Output = ksp_core_lib::Result<crate::BackfillPersistenceOutcome>> + std::marker::Send + 'a>>;
trait CandidateProcessor {
fn process<'a>(&'a self, candidate: &'a crate::BackfillCandidate) -> CandidateProcessFuture<'a>;

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-job-backfill-lib/unit_tests/discovery.rs
// version: 6
// version: 7
#[derive(Clone, Debug, Eq, PartialEq)]
struct PageCall {
@@ -147,6 +147,18 @@ fn candidate_signatures(discovery: &crate::BackfillDiscovery) -> std::vec::Vec<s
return signatures;
}
#[test]
fn pre_008_fix_001_signature_page_future_contract_is_send() {
fn require_send<T: std::marker::Send>(_value: T) {
return;
}
let future: super::SignaturePageFuture<'static> = std::boxed::Box::pin(async {
return std::result::Result::Ok(std::vec::Vec::new());
});
require_send(future);
return;
}
#[tokio::test]
async fn pre_005_latest_paginates_newest_first_and_deduplicates_pages_stably() {
let scope = crate::BackfillScope::latest_address(ksp_core_lib::Pubkey::new_from_array([1_u8; 32]));

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-job-backfill-lib/unit_tests/execution.rs
// version: 3
// version: 4
#[derive(Clone, Copy)]
enum FakeDisposition {
@@ -148,6 +148,18 @@ fn discovery(request: &crate::BackfillRequest, characters: &[char]) -> std::opti
));
}
#[test]
fn pre_008_fix_001_candidate_process_future_contract_is_send() {
fn require_send<T: std::marker::Send>(_value: T) {
return;
}
let future: super::CandidateProcessFuture<'static> = std::boxed::Box::pin(async {
return std::result::Result::Err(super::execution_error("test.send"));
});
require_send(future);
return;
}
#[tokio::test]
async fn pre_008_execution_is_bounded_and_reconciles_out_of_order_durable_completions() {
let request = match explicit_request(&['1', '2', '3', '4'], 2) {