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 928891FF13A for ; Wed, 01 Apr 2026 15:48:59 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3FF0B1D800; Wed, 1 Apr 2026 15:49:12 +0200 (CEST) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox v7 02/34] s3-client: add counters for upload/download traffic Date: Wed, 1 Apr 2026 15:47:45 +0200 Message-ID: <20260401134817.926499-3-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260401134817.926499-1-c.ebner@proxmox.com> References: <20260401134817.926499-1-c.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1775051260797 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.435 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 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 1 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: PXAX73EDWYA7EEZD6AIVMMVLZZBCUKEI X-Message-ID-Hash: PXAX73EDWYA7EEZD6AIVMMVLZZBCUKEI X-MailFrom: c.ebner@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: In addition to accounting for requests, also allow to track the number of bytes uploaded or downloaded via the s3 clients. Just like for request counters, zero them on reset. With the intention to estimate shared upload/download bandwidth in Proxmox Backup Server as well as easily estimate the total traffic volume. Signed-off-by: Christian Ebner --- .../src/shared_request_counters.rs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/proxmox-s3-client/src/shared_request_counters.rs b/proxmox-s3-client/src/shared_request_counters.rs index e6820a04..1ffad4bc 100644 --- a/proxmox-s3-client/src/shared_request_counters.rs +++ b/proxmox-s3-client/src/shared_request_counters.rs @@ -37,6 +37,9 @@ struct RequestCounters { put: AlignedAtomic, head: AlignedAtomic, post: AlignedAtomic, + // traffic in bytes + upload: AlignedAtomic, + download: AlignedAtomic, } impl Init for RequestCounters { @@ -83,8 +86,34 @@ impl RequestCounters { head: self.head.0.swap(0, ordering), post: self.post.0.swap(0, ordering), put: self.put.0.swap(0, ordering), + upload: self.upload.0.swap(0, ordering), + download: self.download.0.swap(0, ordering), } } + + /// Account for new upload traffic. + /// + /// Returns the previously stored value. + pub fn add_upload_traffic(&self, count: u64, ordering: Ordering) -> u64 { + self.upload.0.fetch_add(count, ordering) + } + + /// Returns upload traffic count. + pub fn get_upload_traffic(&self, ordering: Ordering) -> u64 { + self.upload.0.load(ordering) + } + + /// Account for new download traffic. + /// + /// Returns the previously stored value. + pub fn add_download_traffic(&self, count: u64, ordering: Ordering) -> u64 { + self.download.0.fetch_add(count, ordering) + } + + /// Returns download traffic count. + pub fn get_download_traffic(&self, ordering: Ordering) -> u64 { + self.download.0.load(ordering) + } } /// Size of the padding to align the mmapped request counters to 4k default @@ -186,6 +215,42 @@ impl SharedRequestCounters { pub fn reset(&self, ordering: Ordering) -> RequestCounterValues { self.shared_memory.data().counters.reset(ordering) } + + /// Account for new upload traffic. + /// + /// Returns the previously stored value. + pub fn add_upload_traffic(&self, count: u64, ordering: Ordering) -> u64 { + self.shared_memory + .data() + .counters + .add_upload_traffic(count, ordering) + } + + /// Returns upload traffic count. + pub fn get_upload_traffic(&self, ordering: Ordering) -> u64 { + self.shared_memory + .data() + .counters + .get_upload_traffic(ordering) + } + + /// Account for new download traffic. + /// + /// Returns the previously stored value. + pub fn add_download_traffic(&self, count: u64, ordering: Ordering) -> u64 { + self.shared_memory + .data() + .counters + .add_download_traffic(count, ordering) + } + + /// Returns download traffic count. + pub fn get_download_traffic(&self, ordering: Ordering) -> u64 { + self.shared_memory + .data() + .counters + .get_download_traffic(ordering) + } } /// Current value of the individual request counters. @@ -202,4 +267,8 @@ pub struct RequestCounterValues { pub head: u64, /// number of POST requests pub post: u64, + /// bytes uploaded + pub upload: u64, + /// bytes downloaded + pub download: u64, } -- 2.47.3