all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Christian Ebner <c.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [PATCH proxmox-backup v8 16/17] bin: proxy: periodically schedule counter reset task
Date: Thu,  2 Apr 2026 12:53:32 +0200	[thread overview]
Message-ID: <20260402105333.463088-17-c.ebner@proxmox.com> (raw)
In-Reply-To: <20260402105333.463088-1-c.ebner@proxmox.com>

Analogous to other recurring scheduled tasks, check the configured
counter reset schedule for each datastore and periodically execute
the reset task if set. By performing this as a dedicated job, it is
assured to keep track of the scheduled executions.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 7:
- no changes

 src/bin/proxmox-backup-proxy.rs | 81 ++++++++++++++++++++++++++++++++-
 1 file changed, 79 insertions(+), 2 deletions(-)

diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs
index b0efa78ae..238637989 100644
--- a/src/bin/proxmox-backup-proxy.rs
+++ b/src/bin/proxmox-backup-proxy.rs
@@ -1,5 +1,6 @@
 use std::path::{Path, PathBuf};
 use std::pin::pin;
+use std::sync::atomic::Ordering;
 use std::sync::{Arc, Mutex};
 
 use anyhow::{bail, format_err, Context, Error};
@@ -17,6 +18,7 @@ use url::form_urlencoded;
 
 use proxmox_http::Body;
 use proxmox_http::RateLimiterTag;
+use proxmox_human_byte::HumanByte;
 use proxmox_lang::try_block;
 use proxmox_rest_server::{
     cleanup_old_tasks, cookie_from_header, rotate_task_log_archive, ApiConfig, Redirector,
@@ -40,8 +42,8 @@ use pbs_buildcfg::configdir;
 use proxmox_time::CalendarEvent;
 
 use pbs_api_types::{
-    Authid, DataStoreConfig, Operation, PruneJobConfig, SyncJobConfig, TapeBackupJobConfig,
-    VerificationJobConfig,
+    Authid, DataStoreConfig, DatastoreBackendConfig, Operation, PruneJobConfig, SyncJobConfig,
+    TapeBackupJobConfig, VerificationJobConfig,
 };
 
 use proxmox_backup::auth_helpers::*;
@@ -508,6 +510,7 @@ async fn schedule_tasks() -> Result<(), Error> {
     schedule_datastore_verify_jobs().await;
     schedule_tape_backup_jobs().await;
     schedule_task_log_rotate().await;
+    schedule_notification_threshold_counter_reset().await;
 
     Ok(())
 }
@@ -881,6 +884,80 @@ async fn schedule_task_log_rotate() {
     }
 }
 
+async fn schedule_notification_threshold_counter_reset() {
+    let config = match pbs_config::datastore::config() {
+        Err(err) => {
+            eprintln!("unable to read datastore config - {err}");
+            return;
+        }
+        Ok((config, _digest)) => config,
+    };
+
+    for (store, (_, store_config)) in config.sections {
+        let store_config: DataStoreConfig = match serde_json::from_value(store_config) {
+            Ok(c) => c,
+            Err(err) => {
+                eprintln!("datastore config from_value failed - {err}");
+                continue;
+            }
+        };
+
+        let event_str = match &store_config.counter_reset_schedule {
+            Some(event_str) => event_str,
+            None => continue,
+        };
+
+        let worker_type = "notification-threshold-counter-reset";
+        if check_schedule(worker_type, event_str, &store) {
+            let mut job = match Job::new(worker_type, &store) {
+                Ok(job) => job,
+                Err(_) => continue, // could not get lock
+            };
+
+            if let Err(err) = WorkerTask::new_thread(
+                worker_type,
+                None,
+                Authid::root_auth_id().to_string(),
+                false,
+                move |worker| {
+                    job.start(&worker.upid().to_string())?;
+                    info!("executing counter reset for {store}");
+
+                    let result = try_block!({
+                        let backend_config: DatastoreBackendConfig =
+                            store_config.backend.as_deref().unwrap_or("").parse()?;
+                        let request_counters =
+                            DataStore::request_counters(&store_config, &backend_config)?;
+                        let last_values = request_counters.reset(Ordering::Release);
+                        info!("Last counter values before reset:");
+                        info!("Request traffic volume:");
+                        info!("Uploaded: {}", HumanByte::from(last_values.upload));
+                        info!("Downloaded: {}", HumanByte::from(last_values.download));
+                        info!("Request count by method:");
+                        info!("GET: {}", last_values.get);
+                        info!("PUT: {}", last_values.put);
+                        info!("POST: {}", last_values.post);
+                        info!("HEAD: {}", last_values.head);
+                        info!("DELETE: {}", last_values.delete);
+
+                        Ok(())
+                    });
+
+                    let status = worker.create_state(&result);
+
+                    if let Err(err) = job.finish(status) {
+                        eprintln!("could not finish job state for {worker_type}: {err}");
+                    }
+
+                    result
+                },
+            ) {
+                eprintln!("unable to start counter reset task: {err}");
+            }
+        }
+    }
+}
+
 async fn command_reopen_access_logfiles() -> Result<(), Error> {
     // only care about the most recent daemon instance for each, proxy & api, as other older ones
     // should not respond to new requests anyway, but only finish their current one and then exit.
-- 
2.47.3





  parent reply	other threads:[~2026-04-02 10:53 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-02 10:53 [PATCH proxmox-backup v8 00/17] partially fix #6563: add s3 counter for statistics and notifications Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 01/17] api: s3: add endpoint to reset s3 request counters Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 02/17] bin: s3: expose request counter reset method as cli command Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 03/17] ui: datastore summary: move store to be part of summary panel Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 04/17] ui: expose s3 request counter statistics in the datastore summary Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 05/17] metrics: collect s3 datastore statistics as rrd metrics Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 06/17] api: admin: expose s3 statistics in datastore rrd data Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 07/17] partially fix #6563: ui: expose s3 rrd charts in datastore summary Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 08/17] datastore: refactor datastore lookup parameters into dedicated type Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 09/17] api: config: update notification thresholds for config and counters Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 10/17] ui: add notification thresholds edit window Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 11/17] notification: define templates and template data for thresholds Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 12/17] datastore: add thresholds notification callback on datastore lookup Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 13/17] api/ui: notifications: add 'thresholds' as notification type value Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 14/17] api: config: allow counter reset schedule editing Christian Ebner
2026-04-02 10:53 ` [PATCH proxmox-backup v8 15/17] ui: expose counter reset schedule edit window Christian Ebner
2026-04-02 10:53 ` Christian Ebner [this message]
2026-04-02 10:53 ` [PATCH proxmox-backup v8 17/17] ui: add task description for scheduled counter reset Christian Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260402105333.463088-17-c.ebner@proxmox.com \
    --to=c.ebner@proxmox.com \
    --cc=pbs-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal