v0.2.1-pre.003-fix.001
This commit is contained in:
@@ -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"]
|
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]
|
[workspace.package]
|
||||||
version = "0.2.1-pre.3"
|
version = "0.2.1-pre.3.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-onchain-transport-lib/src/pool.rs
|
// file: crates/ksp-onchain-transport-lib/src/pool.rs
|
||||||
// version: 1
|
// version: 2
|
||||||
|
|
||||||
/// Safe snapshot of the logical HTTP endpoint pool.
|
/// Safe snapshot of the logical HTTP endpoint pool.
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
@@ -23,7 +23,7 @@ impl HttpTransportPoolSnapshot {
|
|||||||
/// Returns the number of endpoints currently eligible for routing.
|
/// Returns the number of endpoints currently eligible for routing.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn available_endpoint_count(&self) -> usize {
|
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() {
|
if candidates.is_empty() {
|
||||||
return selection_failed(role, request_kind);
|
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 first_candidate = candidates.first();
|
||||||
let best_priority = match first_candidate {
|
let best_priority = match first_candidate {
|
||||||
std::option::Option::Some(candidate) => candidate.priority,
|
std::option::Option::Some(candidate) => candidate.priority,
|
||||||
std::option::Option::None => return selection_failed(role, request_kind),
|
std::option::Option::None => return selection_failed(role, request_kind),
|
||||||
};
|
};
|
||||||
let best_tier: std::vec::Vec<PoolCandidate> = candidates.into_iter().take_while(|candidate| candidate.priority == best_priority).collect();
|
let best_tier: std::vec::Vec<PoolCandidate> = 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_position = self.next_position(role, request_kind, best_priority, best_tier.len());
|
||||||
let selected = match best_tier.get(selected_position) {
|
let selected = match best_tier.get(selected_position) {
|
||||||
std::option::Option::Some(selected) => selected,
|
std::option::Option::Some(selected) => selected,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
// file: crates/ksp-onchain-transport-lib/unit_tests/pool.rs
|
// 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::HttpRequestKind>) -> crate::HttpEndpointRoleSettings {
|
fn role(name: &str, priority: u32, request_kinds: std::vec::Vec<crate::HttpRequestKind>) -> crate::HttpEndpointRoleSettings {
|
||||||
return crate::HttpEndpointRoleSettings::new(
|
return crate::HttpEndpointRoleSettings::new(
|
||||||
@@ -135,6 +135,13 @@ fn disabled_role_is_excluded_before_priority_selection() {
|
|||||||
1,
|
1,
|
||||||
crate::HttpRoleLimits::new(std::option::Option::None, std::option::Option::None, std::option::Option::None, std::option::Option::None),
|
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(
|
let disabled_role_endpoint = crate::HttpEndpointSettings::new(
|
||||||
base.name(),
|
base.name(),
|
||||||
true,
|
true,
|
||||||
@@ -144,7 +151,7 @@ fn disabled_role_is_excluded_before_priority_selection() {
|
|||||||
base.connect_timeout(),
|
base.connect_timeout(),
|
||||||
base.request_timeout(),
|
base.request_timeout(),
|
||||||
base.max_idle_connections_per_host(),
|
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![
|
let pool = super::HttpTransportPool::new(settings(std::vec![
|
||||||
disabled_role_endpoint,
|
disabled_role_endpoint,
|
||||||
|
|||||||
135
deltas/0.2.1/pre.003-fix.001.md
Normal file
135
deltas/0.2.1/pre.003-fix.001.md
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<!-- file: deltas/0.2.1/pre.003-fix.001.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# 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é.
|
||||||
Reference in New Issue
Block a user