Skip to content

feat(oe-tsa-core,oe-timesource): journal bloquant, deux traits restent synchrones - #47

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/oe-tsa-core-timesource-recorder
Sep 26, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/oe-tsa-core-timesource-recorder

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Contexte

Dernier morceau du chantier « Recorder async » (docs/WEBUI.md §7, §15 étape 2b ; item P0 J-2 de l'audit du 2026-09-25, docs/AUDIT_2026_09_25.md / TODO.md §0). Suite de #42 (oe-ca-core) et #45 (oe-raflow/oe-actions), toutes deux mergées. Base dev.

Une différence importante avec les deux PR précédentes

Contrairement à oe-ca-core et oe-raflow, ces deux traits restent synchrones. Leurs appelants tournent déjà hors de tout exécuteur async :

  • Authority::timestamp est appelée directement depuis un gestionnaire HTTP sans spawn_blocking (déjà bloquant aujourd'hui pour la signature HSM).
  • Monitor tourne dans un thread dédié (std::thread::spawn) pour les requêtes NTP, elles-mêmes bloquantes.

Un futur dos S3 y ferait un appel HTTP bloquant (reqwest::blocking), sans avoir besoin d'ajouter une dépendance juste pour bloquer sur un futur dans ces threads.

Contenu

  • oe_tsa_core::Recorder : Authority::record propage l'échec du journal (TsaError::Other) au lieu de l'ignorer. timestamp.granted est désormais journalisé avant la signature HSM (l'acte irréversible : une signature déjà produite ne s'annule pas) ; timestamp.rejected reste après (rien d'irréversible n'en dépend), mais son échec prime quand même sur le motif de rejet.
  • oe_timesource::Recorder : cas différent, décidé avec vous — aucun appelant à faire échouer ici (une mesure périodique, pas une action discrète). Un échec de journal marque la mesure non traçable (Status.traceable = false) : le mécanisme existant de now() (refus en politique Enforce si !traceable) prend le relais, sans changer la signature de poll_once.

Ce que ça débloque

Le câblage S3 réel de ca-server (2b-B) peut enfin commencer : les trois familles de Recorder du dépôt (oe-ca-core/oe-raflow/oe-actions en async ; oe-tsa-core/oe-timesource en synchrone, tous deux bloquants et propageant l'échec) sont maintenant cohérentes avec la décision « un échec du journal bloque l'opération qui en dépend ».

Vérifications

  • cargo fmt --check
  • cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1)
  • cargo test --workspace (avec OE_CASTORE_TEST_DSN) : vert
  • cargo audit --ignore RUSTSEC-2023-0071 : rien à signaler
  • Contrôle par mutation : pour oe-tsa-core, un compteur d'appels au signataire prouve qu'aucune signature n'a lieu quand le journal échoue (pas seulement qu'une erreur est rendue) ; pour oe-timesource, un test dédié prouve que traceable passe à false uniquement quand le journal échoue

…t synchrones

Dernier morceau du chantier « Recorder async » (docs/WEBUI.md §7, §15
étape 2b ; item P0 J-2 de l'audit du 2026-09-25). Contrairement à
oe-ca-core et oe-raflow, ces deux traits restent SYNCHRONES : leurs
appelants tournent déjà hors de tout exécuteur async (Authority::timestamp
est appelée directement depuis un gestionnaire HTTP sans spawn_blocking,
Monitor tourne dans un thread dédié pour les requêtes NTP bloquantes) — un
futur dos S3 y ferait un appel HTTP bloquant, sans ajouter de dépendance
pour bloquer sur un futur.

- oe_tsa_core::Recorder : Authority::record propage l'échec du journal
  (TsaError::Other) au lieu de l'ignorer ; timestamp.granted est désormais
  journalisé AVANT la signature HSM (l'acte irréversible), timestamp.rejected
  après (rien d'irréversible n'en dépend, mais son échec prime quand même).
- oe_timesource::Recorder : cas différent, aucun appelant à faire échouer
  (une mesure périodique, pas une action). Un échec de journal marque la
  mesure non traçable (Status.traceable = false) : le mécanisme existant de
  now() (refus en politique Enforce) prend le relais, sans changer la
  signature de poll_once.

Reste, seulement maintenant : câbler ca-server sur oe-s3 (2b-B proprement
dite).

Vérifications : cargo fmt --check, cargo clippy --workspace --all-targets
(1.97 et 1.98.1), cargo test --workspace (avec OE_CASTORE_TEST_DSN), cargo
audit. Contrôle par mutation : pour oe-tsa-core, un compteur d'appels au
signataire prouve qu'aucune signature n'a lieu quand le journal échoue (pas
seulement qu'une erreur est rendue) ; pour oe-timesource, un test dédié
prouve que traceable passe à false uniquement quand le journal échoue.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne merged commit 4ba7ab0 into dev Sep 26, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant