swarm-controller: retry the legacy forge token sweep from the mint pass
The sweep ran once at startup and was never retried: a boot where store::connect or the roster read failed (e.g. the controller up before bao) left the tokens live until the next restart. It now runs off forge::agent_token::spawn's five-minute mint pass, reusing that pass's roster observation instead of a second store/roster read, so a failed first tick retries on the next one. Idempotent, so a re-run after a partial sweep deletes nothing extra. Drops the one-shot startup spawn; one call path. Also updates the forge.md and agent_token.rs docs that still said the legacy hyperhive-<seconds> tokens stay until manually removed. Refs #4644
This commit is contained in:
parent
23e0c313b8
commit
e9206505d4
4 changed files with 36 additions and 67 deletions
|
|
@ -6,7 +6,8 @@
|
|||
//! refuses a second token with a name the user already has, so a rotation is a
|
||||
//! delete then a create, and there is never more than one of these per agent.
|
||||
//! The `hyperhive-<unix-seconds>` tokens `hive-c0re` used to mint are never
|
||||
//! touched here: the name cannot match them.
|
||||
//! touched here: the name cannot match them. [`spawn`]'s pass deletes them
|
||||
//! separately, via [`super::legacy_tokens`].
|
||||
//!
|
||||
//! Two callers insert the same `MintAgentForgeToken` job node: agent creation,
|
||||
//! and [`spawn`]'s pass at start and every [`RECONCILE_INTERVAL`] over every
|
||||
|
|
@ -322,7 +323,11 @@ impl Client {
|
|||
|
||||
/// Check every agent's token now and every [`RECONCILE_INTERVAL`] after, and
|
||||
/// hand the agents that need one to `enqueue`, which inserts a
|
||||
/// `MintAgentForgeToken` node for each.
|
||||
/// `MintAgentForgeToken` node for each. Also sweeps each `Keep`-decided
|
||||
/// agent's legacy `hyperhive-<seconds>` tokens off the same observation
|
||||
/// (`super::legacy_tokens::sweepable`), so a boot where the first tick's
|
||||
/// store or forge read fails retries the sweep on the next tick instead of
|
||||
/// leaving those tokens live until a restart.
|
||||
///
|
||||
/// The roster is the store's `hive-agent-*` cert-auth roles: exactly the
|
||||
/// agents that can read what the node writes. The first tick fires
|
||||
|
|
@ -335,6 +340,9 @@ pub fn spawn(client: Arc<Client>, enqueue: impl Fn(Vec<String>) + Send + 'static
|
|||
ticker.tick().await;
|
||||
match client.observe_all().await {
|
||||
Ok(observed) => {
|
||||
let legacy = super::legacy_tokens::sweepable(&observed);
|
||||
client.sweep_legacy_tokens(&legacy).await;
|
||||
|
||||
let agents = plan(&observed);
|
||||
if agents.is_empty() {
|
||||
tracing::debug!(
|
||||
|
|
|
|||
Loading…
Reference in a new issue