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 C0ABF8B227 for ; Wed, 24 Aug 2022 12:28:02 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BC6CD18F2D for ; Wed, 24 Aug 2022 12:27:32 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (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 for ; Wed, 24 Aug 2022 12:27:30 +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 7D7A94330C for ; Wed, 24 Aug 2022 12:27:30 +0200 (CEST) From: Daniel Tschlatscher To: pbs-devel@lists.proxmox.com Date: Wed, 24 Aug 2022 12:26:56 +0200 Message-Id: <20220824102657.159735-2-d.tschlatscher@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220824102657.159735-1-d.tschlatscher@proxmox.com> References: <20220824102657.159735-1-d.tschlatscher@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.084 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% 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 T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pbs-devel] [PATCH proxmox-backup v4 2/3] expose the unpriviliged total in the api and use it in the GUI 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: Wed, 24 Aug 2022 10:28:02 -0000 Until now, the total size for a datastore was reported as the total space on the filesystem. On ext4 filesystems this number will not match the observed behaviour when some amount of blocks are reserved though, as the proxmox-backup-proxy uses the unpriviliged 'backup' user. Therefore backup-ing new data would fail, even though the GUI still displays that X% of the datastore is free. I think using the unpriviliged total makes more sense as it communicates to the user how much they can actually still store on the datastore, rather than the full total of which some part might not be usable. This will also not lead to issues in the GUI when the reserved space is written to, because the value reported by statfs will automatically increase accordingly. I.e. when the unprivliged space is full and a 500MB file is written by the root user, the fields for "unpriv_total" and "used" will both increase by this amount, simply keeping the usage at 100%. Note: I've opted to create a new field in the API result for the unpriviliged total of the datastore, as overwriting the existing total might break compatibility for users who retrieve the actual datastore disk size this way. Signed-off-by: Daniel Tschlatscher --- No changes from v3 pbs-api-types/src/datastore.rs | 5 +++++ src/api2/admin/datastore.rs | 3 +++ src/api2/status.rs | 1 + www/dashboard/DataStoreStatistics.js | 6 +++--- www/datastore/DataStoreListSummary.js | 4 ++-- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 0af11b33..d1730715 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -1235,6 +1235,8 @@ pub struct GarbageCollectionStatus { pub struct DataStoreStatus { /// Total space (bytes). pub total: u64, + /// Total space available to unpriviliged users (bytes) + pub unpriv_total: u64, /// Used space (bytes). pub used: u64, /// Available space (bytes). @@ -1269,6 +1271,8 @@ pub struct DataStoreStatusListItem { pub store: String, /// The Size of the underlying storage in bytes. (-1 on error) pub total: i64, + /// The total space available to unpriviliged users (-1 on error) + pub unpriv_total: i64, /// The used bytes of the underlying storage. (-1 on error) pub used: i64, /// The available bytes of the underlying storage. (-1 on error) @@ -1301,6 +1305,7 @@ impl DataStoreStatusListItem { DataStoreStatusListItem { store: store.to_owned(), total: -1, + unpriv_total: -1, used: -1, avail: -1, history: None, diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs index 7b103fb7..cd5d01e8 100644 --- a/src/api2/admin/datastore.rs +++ b/src/api2/admin/datastore.rs @@ -715,12 +715,14 @@ pub async fn status( total: storage.total, used: storage.used, avail: storage.available, + unpriv_total: storage.used + storage.available, gc_status, counts, } } else { DataStoreStatus { total: 0, + unpriv_total: 0, used: 0, avail: 0, gc_status, @@ -1804,6 +1806,7 @@ pub fn get_rrd_stats( let mut rrd_fields = vec![ "total", + "unpriv_total", "used", "read_ios", "read_bytes", diff --git a/src/api2/status.rs b/src/api2/status.rs index b918156e..26ca750c 100644 --- a/src/api2/status.rs +++ b/src/api2/status.rs @@ -69,6 +69,7 @@ pub async fn datastore_status( let mut entry = DataStoreStatusListItem { store: store.clone(), total: status.total as i64, + unpriv_total: (status.used + status.available) as i64, used: status.used as i64, avail: status.available as i64, history: None, diff --git a/www/dashboard/DataStoreStatistics.js b/www/dashboard/DataStoreStatistics.js index 38f7a2fe..8dbd1caf 100644 --- a/www/dashboard/DataStoreStatistics.js +++ b/www/dashboard/DataStoreStatistics.js @@ -3,7 +3,7 @@ Ext.define('pbs-datastore-statistics', { fields: [ 'store', - 'total', + 'unpriv_total', 'used', 'avail', 'estimated-full-date', @@ -27,7 +27,7 @@ Ext.define('pbs-datastore-statistics', { name: 'usage', calculate: function(data) { let used = data.used || 0; - let total = data.total || 0; + let total = data["unpriv-total"] || 0; if (total > 0) { return used/total; } else { @@ -78,7 +78,7 @@ Ext.define('PBS.DatastoreStatistics', { }, { text: gettext('Size'), - dataIndex: 'total', + dataIndex: 'unpriv-total', sortable: true, width: 90, renderer: v => v === undefined || v < 0 ? '-' : Proxmox.Utils.format_size(v, true), diff --git a/www/datastore/DataStoreListSummary.js b/www/datastore/DataStoreListSummary.js index c7b67d56..3714528e 100644 --- a/www/datastore/DataStoreListSummary.js +++ b/www/datastore/DataStoreListSummary.js @@ -52,10 +52,10 @@ Ext.define('PBS.datastore.DataStoreListSummary', { vm.set('maintenance', ''); } - let usage = statusData.used/statusData.total; + let usage = statusData.used/statusData["unpriv-total"]; let usagetext = Ext.String.format(gettext('{0} of {1}'), Proxmox.Utils.format_size(statusData.used, true), - Proxmox.Utils.format_size(statusData.total, true), + Proxmox.Utils.format_size(statusData["unpriv-total"], true), ); let usagePanel = me.lookup('usage'); -- 2.30.2