From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 34268607A1 for ; Thu, 13 Aug 2020 10:29:25 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3039C180B2 for ; Thu, 13 Aug 2020 10:29:25 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 0F9E718079 for ; Thu, 13 Aug 2020 10:29:23 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id C69DD445F0 for ; Thu, 13 Aug 2020 10:29:22 +0200 (CEST) From: Dominik Csapak To: pbs-devel@lists.proxmox.com Date: Thu, 13 Aug 2020 10:29:14 +0200 Message-Id: <20200813082921.28946-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200813082921.28946-1-d.csapak@proxmox.com> References: <20200813082921.28946-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.050 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods NO_DNS_FOR_FROM 0.379 Envelope sender has no MX or A DNS records RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Subject: [pbs-devel] [PATCH proxmox-backup v3 2/9] server/worker_task: let upid_read_status also return the endtime X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 13 Aug 2020 08:29:25 -0000 the endtime should be the timestamp of the last log line or if there is no log at all, the starttime Signed-off-by: Dominik Csapak --- src/api2/node/tasks.rs | 2 +- src/server/worker_task.rs | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index 0bb043d9..1e9643ec 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -105,7 +105,7 @@ async fn get_task_status( if crate::server::worker_is_active(&upid).await? { result["status"] = Value::from("running"); } else { - let exitstatus = crate::server::upid_read_status(&upid).unwrap_or(TaskState::Unknown); + let (_, exitstatus) = crate::server::upid_read_status(&upid).unwrap_or((0, TaskState::Unknown)); result["status"] = Value::from("stopped"); result["exitstatus"] = Value::from(exitstatus.to_string()); }; diff --git a/src/server/worker_task.rs b/src/server/worker_task.rs index 62cceb3d..da1a877e 100644 --- a/src/server/worker_task.rs +++ b/src/server/worker_task.rs @@ -190,9 +190,12 @@ pub fn create_task_log_dirs() -> Result<(), Error> { Ok(()) } -/// Read exits status from task log file -pub fn upid_read_status(upid: &UPID) -> Result { +/// Read endtime (time of last log line) and exitstatus from task log file +/// If there is not a single line with at valid datetime, we assume the +/// starttime to be the endtime +pub fn upid_read_status(upid: &UPID) -> Result<(i64, TaskState), Error> { let mut status = TaskState::Unknown; + let mut time = upid.starttime; let path = upid.log_path(); @@ -208,9 +211,15 @@ pub fn upid_read_status(upid: &UPID) -> Result { for line in reader.lines() { let line = line?; - let mut iter = line.splitn(2, ": TASK "); - if iter.next() == None { continue; } - match iter.next() { + let mut iter = line.splitn(2, ": "); + if let Some(time_str) = iter.next() { + time = chrono::DateTime::parse_from_rfc3339(time_str) + .map_err(|err| format_err!("cannot parse '{}': {}", time_str, err))? + .timestamp(); + } else { + continue; + } + match iter.next().and_then(|rest| rest.strip_prefix("TASK ")) { None => continue, Some(rest) => { if let Ok(state) = rest.parse() { @@ -220,7 +229,7 @@ pub fn upid_read_status(upid: &UPID) -> Result { } } - Ok(status) + Ok((time, status)) } /// Task State @@ -325,10 +334,10 @@ fn update_active_workers(new_upid: Option<&UPID>) -> Result, E }, None => { println!("Detected stopped UPID {}", upid_str); - let status = upid_read_status(&upid) - .unwrap_or_else(|_| TaskState::Unknown); + let (time, status) = upid_read_status(&upid) + .unwrap_or_else(|_| (Local::now().timestamp(), TaskState::Unknown)); finish_list.push(TaskListInfo { - upid, upid_str, state: Some((Local::now().timestamp(), status)) + upid, upid_str, state: Some((time, status)) }); }, Some((endtime, status)) => { -- 2.20.1