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 7B3C91FF141 for ; Tue, 05 May 2026 15:49:26 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4A03043C4; Tue, 5 May 2026 15:49:26 +0200 (CEST) Message-ID: Date: Tue, 5 May 2026 15:48:52 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Christian Ebner Subject: Re: [PATCH proxmox-backup 01/10] task tracking: count Reclaim datastore operations as writes To: Robert Obkircher , pbs-devel@lists.proxmox.com References: <20260430150607.330413-1-r.obkircher@proxmox.com> <20260430150607.330413-5-r.obkircher@proxmox.com> Content-Language: en-US, de-DE In-Reply-To: <20260430150607.330413-5-r.obkircher@proxmox.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777988826958 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.070 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: URN4RMXTKSCMIKARAUBOQXR3V3GAUH32 X-Message-ID-Hash: URN4RMXTKSCMIKARAUBOQXR3V3GAUH32 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: one question regarding the accounting On 4/30/26 5:04 PM, Robert Obkircher wrote: > This ensures that changing a Write to a Reclaim does not break forward > compatibility when older versions read the counters. > > Ideally, Write operations would also be tracked separately to display > them as conflicts of the GarbageCollection maintenance mode, but an > extra field would lead to parse errors in older versions which are not > always propagated (for example when cloning a Datastore) and would > thus result in incorrect values. The following test works without issues: #[test] fn test_active_operation_parsing() { let raw_str = "[{\"pid\":111,\"starttime\":111,\"active_operations\":{\"read\":1,\"write\":3,\"reclaim\":2}}]"; assert!(serde_json::from_str::>(&raw_str).is_ok()); } So reclaim operations could be accounted for by writes and an optional reclaim for the time being (ignored and not written by older versions), allowing to switch in the future, once all versions are expected to handle it directly. Or am I missing something here? > > Signed-off-by: Robert Obkircher > --- > pbs-datastore/src/task_tracking.rs | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/pbs-datastore/src/task_tracking.rs b/pbs-datastore/src/task_tracking.rs > index 44a4522dc..c8833759b 100644 > --- a/pbs-datastore/src/task_tracking.rs > +++ b/pbs-datastore/src/task_tracking.rs > @@ -106,6 +106,7 @@ pub fn update_active_operations( > let mut updated_active_operations = match operation { > Operation::Read => ActiveOperationStats { read: 1, write: 0 }, > Operation::Write => ActiveOperationStats { read: 0, write: 1 }, > + Operation::Reclaim => ActiveOperationStats { read: 0, write: 1 }, > Operation::Lookup => ActiveOperationStats { read: 0, write: 0 }, > }; > let mut found_entry = false; > @@ -121,6 +122,7 @@ pub fn update_active_operations( > match operation { > Operation::Read => task.active_operations.read += count, > Operation::Write => task.active_operations.write += count, > + Operation::Reclaim => task.active_operations.write += count, > Operation::Lookup => (), // no IO must happen there > }; > updated_active_operations = task.active_operations;