From 11789958b446c613f583f1557afe4ac81f9dc308 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Wed, 14 Oct 2026 07:45:23 +0000 Subject: [PATCH] fix(worker): infernet.service owns the daemon when enabled; manual update too; v0.2.31 - infernet_systemd_managed() also accepts an enabled unit, so a worker restart while infernet.service is mid-restart ("activating") no longer starts a second daemon. - `c0mpute update` skips `infernet update` under infernet.service: it restarted the daemon from the operator's shell beside systemd's. - v0.2.31 (Cargo, JS packages, latest.json fallback). Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 32 +++++++++---------- Cargo.toml | 2 +- apps/tui/package.json | 2 +- apps/web/package.json | 2 +- .../web/src/app/releases/latest.json/route.ts | 2 +- node/crates/c0mpute-cli/src/main.rs | 24 ++++++++++---- package.json | 2 +- packages/shared/package.json | 2 +- 8 files changed, 39 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62199ae..02fecca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -476,7 +476,7 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "c0mpute-api" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "c0mpute-proto", @@ -491,7 +491,7 @@ dependencies = [ [[package]] name = "c0mpute-bench" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "blake3", @@ -502,7 +502,7 @@ dependencies = [ [[package]] name = "c0mpute-cli" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "axum", @@ -532,7 +532,7 @@ dependencies = [ [[package]] name = "c0mpute-core" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "async-trait", @@ -566,7 +566,7 @@ dependencies = [ [[package]] name = "c0mpute-doctor" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "serde", @@ -578,7 +578,7 @@ dependencies = [ [[package]] name = "c0mpute-envelope" -version = "0.2.30" +version = "0.2.31" dependencies = [ "blake3", "bs58", @@ -591,7 +591,7 @@ dependencies = [ [[package]] name = "c0mpute-gateway" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "axum", @@ -613,7 +613,7 @@ dependencies = [ [[package]] name = "c0mpute-market" -version = "0.2.30" +version = "0.2.31" dependencies = [ "c0mpute-envelope", "serde", @@ -623,7 +623,7 @@ dependencies = [ [[package]] name = "c0mpute-net" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "async-trait", @@ -640,7 +640,7 @@ dependencies = [ [[package]] name = "c0mpute-placement" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "async-trait", @@ -661,7 +661,7 @@ dependencies = [ [[package]] name = "c0mpute-proto" -version = "0.2.30" +version = "0.2.31" dependencies = [ "blake3", "hex", @@ -673,7 +673,7 @@ dependencies = [ [[package]] name = "c0mpute-secure-chat" -version = "0.2.30" +version = "0.2.31" dependencies = [ "aes-gcm", "anyhow", @@ -696,7 +696,7 @@ dependencies = [ [[package]] name = "c0mpute-store" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "blake3", @@ -714,7 +714,7 @@ dependencies = [ [[package]] name = "c0mpute-transcode" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "c0mpute-proto", @@ -726,7 +726,7 @@ dependencies = [ [[package]] name = "c0mpute-update" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "hex", @@ -740,7 +740,7 @@ dependencies = [ [[package]] name = "c0mpute-verify" -version = "0.2.30" +version = "0.2.31" dependencies = [ "anyhow", "blake3", diff --git a/Cargo.toml b/Cargo.toml index 77d6b09..a792a5d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,7 @@ members = [ ] [workspace.package] -version = "0.2.30" +version = "0.2.31" edition = "2024" license = "MIT" repository = "https://github.com/profullstack/c0mpute" diff --git a/apps/tui/package.json b/apps/tui/package.json index 4050a7a..5a87d1b 100644 --- a/apps/tui/package.json +++ b/apps/tui/package.json @@ -1,6 +1,6 @@ { "name": "@c0mpute/tui", - "version": "0.2.30", + "version": "0.2.31", "private": true, "type": "module", "bin": { diff --git a/apps/web/package.json b/apps/web/package.json index df00c98..630ed69 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "c0mpute", - "version": "0.2.30", + "version": "0.2.31", "private": true, "type": "module", "scripts": { diff --git a/apps/web/src/app/releases/latest.json/route.ts b/apps/web/src/app/releases/latest.json/route.ts index 88f366b..313ee1e 100644 --- a/apps/web/src/app/releases/latest.json/route.ts +++ b/apps/web/src/app/releases/latest.json/route.ts @@ -28,7 +28,7 @@ export const dynamic = "force-dynamic"; * this in sync with the workspace version in `Cargo.toml` on each release so a * freshly built CLI reports "already latest" rather than a phantom upgrade. */ -const FALLBACK_VERSION = "0.2.30"; +const FALLBACK_VERSION = "0.2.31"; const FALLBACK_MIN_REQUIRED = "0.0.1"; type Channel = "stable" | "beta" | "nightly"; diff --git a/node/crates/c0mpute-cli/src/main.rs b/node/crates/c0mpute-cli/src/main.rs index 3e2b245..048a0f2 100644 --- a/node/crates/c0mpute-cli/src/main.rs +++ b/node/crates/c0mpute-cli/src/main.rs @@ -2665,6 +2665,12 @@ const PLUGIN_UPDATERS: &[(&str, &[&str])] = fn upgrade_plugins_foreground() { for (bin, args) in PLUGIN_UPDATERS { if let Some(path) = which_on_path(bin) { + // `infernet update` restarts the daemon from this shell; under infernet.service that + // starts a second daemon beside systemd's, and the daemon updates itself anyway. + if *bin == "infernet" && infernet_systemd_managed() { + println!("→ infernet is managed by infernet.service (it updates itself); skipping"); + continue; + } println!("→ upgrading {bin}…"); match Command::new(path).args(*args).status() { Ok(s) if s.success() => println!(" ✓ {bin} up to date"), @@ -2704,13 +2710,17 @@ fn refresh_plugins() { /// (and the daemon auto-updates itself), so the worker must not start, update or restart another /// one: two daemons on one config dir fight over the socket, port and pidfile. fn infernet_systemd_managed() -> bool { - Command::new("systemctl") - .args(["is-active", "--quiet", "infernet.service"]) - .stdin(std::process::Stdio::null()) - .stdout(std::process::Stdio::null()) - .stderr(std::process::Stdio::null()) - .status() - .is_ok_and(|s| s.success()) + // Enabled, not only active: during the unit's own restart it is briefly "activating", and the + // worker must not slip a second daemon in then. + ["is-enabled", "is-active"].iter().any(|verb| { + Command::new("systemctl") + .args([*verb, "--quiet", "infernet.service"]) + .stdin(std::process::Stdio::null()) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status() + .is_ok_and(|s| s.success()) + }) } /// npm package the infernet installer pulls (`npm install -g @infernetprotocol/cli`). diff --git a/package.json b/package.json index 16be507..3b77415 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "c0mpute-monorepo", - "version": "0.2.30", + "version": "0.2.31", "private": true, "workspaces": [ "apps/*", diff --git a/packages/shared/package.json b/packages/shared/package.json index 48c81d7..dca92ad 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@c0mpute/shared", - "version": "0.2.30", + "version": "0.2.31", "private": true, "type": "module", "main": "./dist/index.js",