0.3.16-pre.007-fix.001
This commit is contained in:
@@ -6,7 +6,7 @@ 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"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.3.16-pre.7"
|
||||
version = "0.3.16-pre.7.fix.1"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
|
||||
// version: 14
|
||||
// version: 15
|
||||
|
||||
fn network() -> ksp_store_api::RawNetworkId {
|
||||
return match ksp_store_api::RawNetworkId::new("devnet") {
|
||||
@@ -346,7 +346,7 @@ fn pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only()
|
||||
let network = network();
|
||||
let incoming = raw_transaction(9, &[1, 2, 3, 4], 7);
|
||||
let matching = super::compare_existing_transaction(&network, transaction_row("full"), &incoming);
|
||||
assert!(matching.is_err(), "fixture intentionally differs in slot/content and must conflict");
|
||||
assert!(matches!(matching, std::result::Result::Ok(super::ExistingTransactionMatch::ActiveConflict(_))));
|
||||
let mut exact_row = transaction_row("full");
|
||||
exact_row.signature = vec![9; 64];
|
||||
exact_row.slot_text = "42".to_owned();
|
||||
@@ -362,7 +362,7 @@ fn pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only()
|
||||
same_hash_different_bytes.format_version = 1;
|
||||
same_hash_different_bytes.payload = std::option::Option::Some(vec![9, 9, 9, 9]);
|
||||
let conflict = super::compare_existing_transaction(&network, same_hash_different_bytes, &incoming);
|
||||
assert_eq!(conflict.err().map(|value| return value.kind()), std::option::Option::Some(crate::PostgresBackendErrorKind::Conflict));
|
||||
assert!(matches!(conflict, std::result::Result::Ok(super::ExistingTransactionMatch::ActiveConflict(_))));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs
|
||||
// version: 13
|
||||
// version: 14
|
||||
|
||||
struct ActiveTaskGuard {
|
||||
active: std::sync::Arc<std::sync::atomic::AtomicUsize>,
|
||||
@@ -522,7 +522,7 @@ async fn v0_3_16_pre_007_quarantined_conflict_keeps_worker_running_and_degraded(
|
||||
assert_eq!(snapshot.store_failure_total(), 0);
|
||||
assert!(handle.request_stop());
|
||||
let terminal = handle.wait_terminal().await;
|
||||
assert_eq!(terminal, std::result::Result::Ok(ksp_worker_api::WorkerState::Stopped));
|
||||
assert!(matches!(terminal, std::result::Result::Ok(ksp_worker_api::WorkerState::Stopped)));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
115
deltas/0.3.16/pre.007-fix.001.md
Normal file
115
deltas/0.3.16/pre.007-fix.001.md
Normal file
@@ -0,0 +1,115 @@
|
||||
<!-- file: deltas/0.3.16/pre.007-fix.001.md -->
|
||||
<!-- version: 1 -->
|
||||
|
||||
# Delta `0.3.16-pre.007-fix.001` — réalignement des canaris Worker et PostgreSQL
|
||||
|
||||
## Base requise
|
||||
|
||||
```text
|
||||
0.3.16-pre.007 appliqué
|
||||
workspace.package.version = 0.3.16-pre.7
|
||||
```
|
||||
|
||||
Le gate opérateur de `pre.007` confirme que les audits Rust/export/KSP/Markdown sont propres, que `cargo check --workspace` passe et que les suites Store API et Store façade exécutées avant les défauts sont vertes.
|
||||
|
||||
Deux défauts de tests bloquent ensuite le gate :
|
||||
|
||||
1. un test Worker compare avec `assert_eq!` un `Result<WorkerState, ksp_core_lib::Error>`, alors que `ksp_core_lib::Error` n'implémente volontairement pas `PartialEq` ;
|
||||
2. un test PostgreSQL hérité de `pre.005` attend encore qu'une divergence active soit retournée comme `PostgresBackendErrorKind::Conflict`, alors que `pre.007` la classe désormais comme `ExistingTransactionMatch::ActiveConflict(...)` afin de permettre sa quarantaine durable.
|
||||
|
||||
Aucun des deux défauts ne nécessite une modification runtime.
|
||||
|
||||
## Version
|
||||
|
||||
Le correctif modifie des tests Rust et synchronise donc la version Cargo :
|
||||
|
||||
```text
|
||||
workspace.package.version = 0.3.16-pre.7.fix.1
|
||||
```
|
||||
|
||||
## Correction Worker
|
||||
|
||||
Le test `v0_3_16_pre_007_durable_conflict_is_non_terminal_and_degrades_health` conserve exactement la même exigence fonctionnelle : après une quarantaine durable, le Worker reste contrôlable et un stop explicite doit terminer en `WorkerState::Stopped`.
|
||||
|
||||
L'assertion n'utilise plus `assert_eq!` sur le `Result` complet. Elle vérifie la variante de succès avec `matches!`, ce qui ne requiert pas `PartialEq` sur le type d'erreur.
|
||||
|
||||
## Correction PostgreSQL
|
||||
|
||||
Le test `pre_005_existing_full_content_requires_exact_payload_equality_not_hash_only` conserve son objectif historique : un hash identique ne suffit jamais à déclarer deux payloads exacts.
|
||||
|
||||
Sous le contrat `pre.007`, une divergence d'une transaction active n'est toutefois plus une erreur backend terminale. Le comparateur PostgreSQL doit retourner :
|
||||
|
||||
```text
|
||||
ExistingTransactionMatch::ActiveConflict(_)
|
||||
```
|
||||
|
||||
Le test exige désormais ce résultat pour :
|
||||
|
||||
- la fixture volontairement différente en contenu/slot ;
|
||||
- le cas de même hash avec bytes de payload différents.
|
||||
|
||||
Le cas exact reste `ExistingTransactionMatch::Active`, et le comportement particulier des tombstones `Purged` n'est pas modifié.
|
||||
|
||||
## Fichiers modifiés
|
||||
|
||||
```text
|
||||
Cargo.toml
|
||||
crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
|
||||
crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs
|
||||
```
|
||||
|
||||
## Fichier ajouté
|
||||
|
||||
```text
|
||||
deltas/0.3.16/pre.007-fix.001.md
|
||||
```
|
||||
|
||||
## Fichiers supprimés
|
||||
|
||||
```text
|
||||
aucun
|
||||
```
|
||||
|
||||
## Validations exécutées lors de la génération
|
||||
|
||||
```bash
|
||||
python3 scripts/audit_rust_workspace_rules.py
|
||||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
|
||||
```
|
||||
|
||||
Le toolchain Rust n'est pas installé dans l'environnement de génération. `cargo fmt`, `cargo check`, Clippy et les tests Cargo ne sont donc pas déclarés exécutés ici.
|
||||
|
||||
## Validations opérateur demandées
|
||||
|
||||
```bash
|
||||
cargo fmt --all
|
||||
cargo fmt --all -- --check
|
||||
|
||||
python3 scripts/audit_rust_workspace_rules.py
|
||||
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas
|
||||
|
||||
cargo check --workspace
|
||||
cargo clippy --workspace --all-targets --all-features -- -D warnings
|
||||
|
||||
cargo test -p ksp-store-api --all-targets --all-features
|
||||
cargo test -p ksp-store-lib --all-targets --all-features
|
||||
cargo test -p ksp-store-postgres-lib --all-targets --all-features
|
||||
cargo test -p ksp-job-backfill-lib --all-targets --all-features
|
||||
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
|
||||
```
|
||||
|
||||
## Décisions prises
|
||||
|
||||
- aucune logique runtime de `pre.007` n'est modifiée ;
|
||||
- `ksp_core_lib::Error` n'est pas rendu `PartialEq` uniquement pour satisfaire un test ;
|
||||
- les divergences actives restent explicitement classées `ActiveConflict` afin d'alimenter le chemin de quarantaine durable ;
|
||||
- le test de collision de hash continue d'exiger une comparaison byte-exacte ;
|
||||
- les conflits portant sur une transaction `Purged` conservent leur comportement fail-closed existant.
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
Aucune question bloquante.
|
||||
|
||||
## Suite
|
||||
|
||||
Après gate propre : `0.3.16-pre.008` — hardening concurrence/rollback et régressions finales Store/Backfill/Worker.
|
||||
Reference in New Issue
Block a user