From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id D5F021FF141 for ; Mon, 13 Apr 2026 15:19:17 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 0538A25539; Mon, 13 Apr 2026 15:20:06 +0200 (CEST) From: =?UTF-8?q?Michael=20K=C3=B6ppl?= To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox-backup v5 3/3] fix #7400: proxy: self-heal corrupted job statefiles Date: Mon, 13 Apr 2026 15:20:00 +0200 Message-ID: <20260413132000.49889-4-m.koeppl@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260413132000.49889-1-m.koeppl@proxmox.com> References: <20260413132000.49889-1-m.koeppl@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1776086327969 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.899 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_MAILER 2 Automated Mailer Tag Left in Email SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [jobstate.rs,proxmox-backup-proxy.rs] Message-ID-Hash: 2RNSQWU567RLYIOFHRBYHTOQFPJJSPHA X-Message-ID-Hash: 2RNSQWU567RLYIOFHRBYHTOQFPJJSPHA X-MailFrom: m.koeppl@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Backup Server development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Update update_job_last_run_time to transition JobState::Unknown into JobState::Created so the corrupted statefile is overwritten. In addition, update the scheduling loops to actively overwrite corrupted statefiles and return the time for the next scheduled run of the affected job. Signed-off-by: Michael Köppl --- src/bin/proxmox-backup-proxy.rs | 6 ++++-- src/server/jobstate.rs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index 2932e4d7b..b18550420 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -33,7 +33,7 @@ use pbs_datastore::DataStore; use proxmox_backup::{ server::{ auth::check_pbs_auth, - jobstate::{self, Job}, + jobstate::{self, Job, SCHEDULE_FALLBACK_OFFSET}, }, traffic_control_cache::{SharedRateLimit, TRAFFIC_CONTROL_CACHE}, }; @@ -567,6 +567,7 @@ async fn schedule_datastore_garbage_collection() { Ok(time) => time, Err(err) => { eprintln!("could not get last run time of {worker_type} {store}: {err}"); + let _ = jobstate::update_job_last_run_time(worker_type, &store); continue; } }; @@ -1026,7 +1027,8 @@ fn check_schedule(worker_type: &str, event_str: &str, id: &str) -> bool { Ok(time) => time, Err(err) => { eprintln!("could not get last run time of {worker_type} {id}: {err}"); - return false; + let _ = jobstate::update_job_last_run_time(worker_type, id); + proxmox_time::epoch_i64() - SCHEDULE_FALLBACK_OFFSET } }; diff --git a/src/server/jobstate.rs b/src/server/jobstate.rs index 94f3a5e5d..fb96ea1da 100644 --- a/src/server/jobstate.rs +++ b/src/server/jobstate.rs @@ -161,7 +161,7 @@ pub fn update_job_last_run_time(jobtype: &str, jobname: &str) -> Result<(), Erro state, updated: Some(time), }, - JobState::Unknown => bail!("cannot update last run time for unknown job state"), + JobState::Unknown => JobState::Created { time }, }; job.write_state() } -- 2.47.3