From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 08DA11FF13C for ; Thu, 19 Mar 2026 10:41:08 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id F2CC315829; Thu, 19 Mar 2026 10:41:16 +0100 (CET) From: Christian Ebner To: pbs-devel@lists.proxmox.com Subject: [PATCH proxmox v6 03/12] s3-client: add counters for upload/download traffic Date: Thu, 19 Mar 2026 10:40:29 +0100 Message-ID: <20260319094100.240765-4-c.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260319094100.240765-1-c.ebner@proxmox.com> References: <20260319094100.240765-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: 1773913229816 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.061 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 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: 4WY3ZTOS5JCBR4LXIIP2I3YV53ISMYYT X-Message-ID-Hash: 4WY3ZTOS5JCBR4LXIIP2I3YV53ISMYYT 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 | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/proxmox-s3-client/src/shared_request_counters.rs b/proxmox-s3-client/src/shared_request_counters.rs index edd1df3d..b8627825 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 { @@ -80,6 +83,32 @@ impl RequestCounters { self.head.0.store(0, ordering); self.post.0.store(0, ordering); self.put.0.store(0, ordering); + self.upload.0.store(0, ordering); + self.download.0.store(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) } } @@ -180,4 +209,40 @@ impl SharedRequestCounters { pub fn reset(&self, ordering: Ordering) { 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) + } } -- 2.47.3