From ed978179d8b7943391ead30a715540fb8666b92c Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 17 Aug 2026 18:59:01 +0200 Subject: [PATCH] v0.2.1-pre.003-fix.001 --- Cargo.toml | 2 +- crates/ksp-onchain-transport-lib/src/pool.rs | 8 +- .../unit_tests/pool.rs | 11 +- deltas/0.2.1/pre.003-fix.001.md | 135 ++++++++++++++++++ 4 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 deltas/0.2.1/pre.003-fix.001.md diff --git a/Cargo.toml b/Cargo.toml index 5833482..02fb78a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ resolver = "3" members = ["crates/ksp-app-config-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-logging-lib", "crates/ksp-onchain-transport-lib"] [workspace.package] -version = "0.2.1-pre.3" +version = "0.2.1-pre.3.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" diff --git a/crates/ksp-onchain-transport-lib/src/pool.rs b/crates/ksp-onchain-transport-lib/src/pool.rs index 782d504..854e2ad 100644 --- a/crates/ksp-onchain-transport-lib/src/pool.rs +++ b/crates/ksp-onchain-transport-lib/src/pool.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/src/pool.rs -// version: 1 +// version: 2 /// Safe snapshot of the logical HTTP endpoint pool. #[derive(Clone, Debug, Eq, PartialEq)] @@ -23,7 +23,7 @@ impl HttpTransportPoolSnapshot { /// Returns the number of endpoints currently eligible for routing. #[must_use] pub fn available_endpoint_count(&self) -> usize { - return self.endpoints.iter().filter(|endpoint| endpoint.availability() == crate::HttpEndpointAvailability::Available).count(); + return self.endpoints.iter().filter(|endpoint| return endpoint.availability() == crate::HttpEndpointAvailability::Available).count(); } } @@ -132,13 +132,13 @@ impl HttpTransportPool { if candidates.is_empty() { return selection_failed(role, request_kind); } - candidates.sort_by_key(|candidate| candidate.priority); + candidates.sort_by_key(|candidate| return candidate.priority); let first_candidate = candidates.first(); let best_priority = match first_candidate { std::option::Option::Some(candidate) => candidate.priority, std::option::Option::None => return selection_failed(role, request_kind), }; - let best_tier: std::vec::Vec = candidates.into_iter().take_while(|candidate| candidate.priority == best_priority).collect(); + let best_tier: std::vec::Vec = candidates.into_iter().take_while(|candidate| return candidate.priority == best_priority).collect(); let selected_position = self.next_position(role, request_kind, best_priority, best_tier.len()); let selected = match best_tier.get(selected_position) { std::option::Option::Some(selected) => selected, diff --git a/crates/ksp-onchain-transport-lib/unit_tests/pool.rs b/crates/ksp-onchain-transport-lib/unit_tests/pool.rs index 31f8d81..4ccc3c9 100644 --- a/crates/ksp-onchain-transport-lib/unit_tests/pool.rs +++ b/crates/ksp-onchain-transport-lib/unit_tests/pool.rs @@ -1,5 +1,5 @@ // file: crates/ksp-onchain-transport-lib/unit_tests/pool.rs -// version: 1 +// version: 2 fn role(name: &str, priority: u32, request_kinds: std::vec::Vec) -> crate::HttpEndpointRoleSettings { return crate::HttpEndpointRoleSettings::new( @@ -135,6 +135,13 @@ fn disabled_role_is_excluded_before_priority_selection() { 1, crate::HttpRoleLimits::new(std::option::Option::None, std::option::Option::None, std::option::Option::None, std::option::Option::None), ); + let enabled_non_matching_role = crate::HttpEndpointRoleSettings::new( + crate::HttpRoleName::new("maintenance"), + true, + std::vec![crate::HttpRequestKind::wildcard()], + 1, + crate::HttpRoleLimits::new(std::option::Option::None, std::option::Option::None, std::option::Option::None, std::option::Option::None), + ); let disabled_role_endpoint = crate::HttpEndpointSettings::new( base.name(), true, @@ -144,7 +151,7 @@ fn disabled_role_is_excluded_before_priority_selection() { base.connect_timeout(), base.request_timeout(), base.max_idle_connections_per_host(), - std::vec![disabled_role], + std::vec![disabled_role, enabled_non_matching_role], ); let pool = super::HttpTransportPool::new(settings(std::vec![ disabled_role_endpoint, diff --git a/deltas/0.2.1/pre.003-fix.001.md b/deltas/0.2.1/pre.003-fix.001.md new file mode 100644 index 0000000..d5d1434 --- /dev/null +++ b/deltas/0.2.1/pre.003-fix.001.md @@ -0,0 +1,135 @@ + + + +# Delta `v0.2.1-pre.003-fix.001` + +## Base + +Base attendue : + +```text +v0.2.1-pre.003 +``` + +Version Cargo cible : + +```text +0.2.1-pre.3.fix.1 +``` + +## Objectif + +Corriger exclusivement les écarts révélés par la validation locale de `pre.003`, sans modifier le contrat fonctionnel du client/pool HTTP ni la planification de `0.2.1` : + +- satisfaire la règle workspace `clippy::implicit-return` dans trois closures de `pool.rs` ; +- corriger le test `disabled_role_is_excluded_before_priority_selection` afin qu'il construise des settings valides tout en vérifiant réellement qu'un rôle disabled n'est pas sélectionnable ; +- conserver inchangés la stratégie priority + round-robin, le fallback, les snapshots, la feature TLS `reqwest/rustls` et les frontières de `pre.003`. + +`ROADMAP.md` n'est pas modifié par ce fix : le détail des corrections appartient au delta et ne constitue pas un changement de roadmap. + +## Validation ayant déclenché le fix + +Après application de `pre.003`, les commandes exécutées localement par le user ont donné : + +```text +cargo fmt --all : exécuté +cargo check --workspace : OK +cargo clippy --workspace --all-targets : échec, 3 x clippy::implicit-return +cargo test -p ksp-onchain-transport-lib : échec, 46 passés / 1 échoué +cargo test --workspace : échec sur le même test Transport +cargo tree -p ksp-onchain-transport-lib : exécuté +cargo tree -p ksp-onchain-transport-lib -d : exécuté +cargo tree -p ksp-onchain-transport-lib -e features : exécuté +cargo tree -p ksp-onchain-transport-lib -e normal : exécuté +``` + +Les trois erreurs Clippy concernaient uniquement des closures dans `pool.rs` : + +```text +filter(...) +sort_by_key(...) +take_while(...) +``` + +Le test en échec construisait un endpoint `enabled = true` dont l'unique rôle était `enabled = false`. Cette fixture contredisait la validation Transport déjà définie, qui exige qu'un endpoint activé expose au moins un rôle activé. + +## Corrections + +### `pool.rs` + +Les trois closures signalées utilisent maintenant un `return` explicite, conformément à la configuration Clippy KSP : + +```text +filter(|endpoint| return ...) +sort_by_key(|candidate| return ...) +take_while(|candidate| return ...) +``` + +Aucune sémantique de sélection n'est modifiée. + +### Test du rôle disabled + +La fixture de test conserve désormais sur le premier endpoint : + +- un rôle `default` disabled, de priorité 1 ; +- un rôle `maintenance` enabled, également valide pour l'endpoint mais ne correspondant pas au rôle demandé. + +Le pool est donc valide à la construction. Lors d'une sélection sur le rôle `default`, le rôle disabled du premier endpoint doit être ignoré et l'endpoint fallback reste sélectionné. + +Cette forme teste réellement le comportement annoncé sans contourner l'invariant de validation des settings. + +## Version Cargo + +Le fix touche du Rust de production et de test : + +```text +0.2.1-pre.3 -> 0.2.1-pre.3.fix.1 +``` + +Toutes les crates membres continuent d'hériter `version.workspace = true`. + +## Graphe de dépendances + +Aucune dépendance ni feature n'est ajoutée, retirée ou modifiée par ce fix. + +Les `cargo tree` exécutés sur `pre.003` montrent notamment : + +- `reqwest 0.13.4` avec la feature `rustls` attendue ; +- aucun retour de dépendance Transport vers Config/Store/Program ; +- `cargo tree -d` ne signale que `syn 2.x / 3.x`, déjà identifié comme duplication transitive de proc-macros et ne nécessitant pas de modification KSP. + +Il n'est donc pas nécessaire de répéter les quatre `cargo tree` pour ce correctif. + +## Fichiers ajoutés + +```text +deltas/0.2.1/pre.003-fix.001.md +``` + +## Fichiers modifiés + +```text +Cargo.toml +crates/ksp-onchain-transport-lib/src/pool.rs +crates/ksp-onchain-transport-lib/unit_tests/pool.rs +``` + +## Fichiers supprimés + +Aucun. + +## Validation du fix + +Le sandbox de préparation ne dispose pas de `cargo`/`rustc`. Les validations Rust ne sont donc pas déclarées réussies ici. + +Après application du delta : + +```bash +cargo fmt --all +cargo check --workspace +cargo clippy --workspace --all-targets +cargo test -p ksp-onchain-transport-lib +cargo test --workspace +``` + +Les commandes `cargo tree` n'ont pas à être répétées puisque le graphe de dépendances est inchangé.