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 2CAF76339E for ; Thu, 24 Feb 2022 13:47:14 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D2D6E7E85 for ; Thu, 24 Feb 2022 13:46:43 +0100 (CET) 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 id A90947E78 for ; Thu, 24 Feb 2022 13:46:42 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 7ADC646296 for ; Thu, 24 Feb 2022 13:46:42 +0100 (CET) Message-ID: Date: Thu, 24 Feb 2022 13:46:41 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:98.0) Gecko/20100101 Thunderbird/98.0 Content-Language: en-US To: Proxmox VE development discussion , Aaron Lauterer References: <20220218113827.1415641-1-a.lauterer@proxmox.com> <20220218113827.1415641-6-a.lauterer@proxmox.com> From: Thomas Lamprecht In-Reply-To: <20220218113827.1415641-6-a.lauterer@proxmox.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.057 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 NICE_REPLY_A -0.001 Looks like a legit reply (A) 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 - URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com] Subject: Re: [pve-devel] [PATCH manager 5/6] ui: osd: warn if removal could be problematic X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Feb 2022 12:47:14 -0000 On 18.02.22 12:38, Aaron Lauterer wrote: > If an OSD is removed during the wrong conditions, it could lead to > blocked IO or worst case data loss. > > Check against global flags that limit the capabilities of Ceph to heal > itself (norebalance, norecover, noout) and if there are degraded > objects. > > Unfortunately, the 'safe-to-destroy' API endpoint will not help here as > it only works as long as the OSD is still running. By the time the > destroy button is enabled, the OSD needs to be stopped. > > Signed-off-by: Aaron Lauterer > --- > After the short discussion on the previous version [0] and the hints to > ok-to-stop & safe-to-destroy I kept the original approach with the > reason given in the commit message. > > But now the checks are run before opening the window and showing a > loading screen. > > [0] https://lists.proxmox.com/pipermail/pve-devel/2022-February/051597.html > > www/manager6/ceph/OSD.js | 66 +++++++++++++++++++++++++++++++++++++++- > 1 file changed, 65 insertions(+), 1 deletion(-) > > diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js > index e126f8d0..27f56760 100644 > --- a/www/manager6/ceph/OSD.js > +++ b/www/manager6/ceph/OSD.js > @@ -178,6 +178,20 @@ Ext.define('PVE.CephRemoveOsd', { > labelWidth: 130, > fieldLabel: gettext('Cleanup Disks'), > }, > + { > + xtype: 'displayfield', > + name: 'osd-flag-hint', > + userCls: 'pmx-hint', > + value: gettext('Global flags limiting the self healing of Ceph are enabled.'), > + hidden: true, > + }, > + { > + xtype: 'displayfield', > + name: 'degraded-objects-hint', > + userCls: 'pmx-hint', > + value: gettext('Objects are degraded. Consider waiting until the cluster is healthy.'), > + hidden: true, > + }, > ], > initComponent: function() { > let me = this; > @@ -198,6 +212,13 @@ Ext.define('PVE.CephRemoveOsd', { > }); > > me.callParent(); > + > + if (me.warnings.flags) { > + me.down('field[name=osd-flag-hint]').setHidden(false); > + } > + if (me.warnings.degraded) { > + me.down('field[name=degraded-objects-hint]').setHidden(false); > + } > }, > }); > > @@ -434,12 +455,55 @@ Ext.define('PVE.node.CephOsdTree', { > }).show(); > }, > > - destroy_osd: function() { > + destroy_osd: async function() { > let me = this; > let vm = this.getViewModel(); > + > + let warnings = { > + flags: false, > + degraded: false, > + }; > + > + let flagsPromise = Proxmox.Async.api2({ > + url: `/cluster/ceph/flags`, > + method: 'GET', > + }); > + > + let statusPromise = Proxmox.Async.api2({ > + url: `/cluster/ceph/status`, > + method: 'GET', > + }); > + > + me.getView().mask(gettext('Please wait...')); 'Loading...' is used by ExtJS, well, loading mask; I'd use the same here > + > + try { > + let result = await Promise.all([flagsPromise, statusPromise]); > + > + let flagsData = result[0].result.data; > + let statusData = result[1].result.data; one could deconstruct this directly, but it gets rather noisy: let [ { result: { data: flagsData } }, { result: { data: statusData } } ] = await Promise.all(...); meh... > + > + let flags = Array.from( > + flagsData.filter(v => v.value), > + v => v.name, > + ).filter(v => ['norebalance', 'norecover', 'noout'].includes(v)); > + > + if (flags.length) { > + warnings.flags = true; > + } > + if (Object.keys(statusData.pgmap).includes('degraded_objects')) { > + warnings.degraded = true; > + } > + } catch (error) { > + Ext.Msg.alert(gettext('Error'), error.htmlStatus); > + me.getView().unmask(); > + return; > + } > + > + me.getView().unmask(); > Ext.create('PVE.CephRemoveOsd', { > nodename: vm.get('osdhost'), > osdid: vm.get('osdid'), > + warnings: warnings, > taskDone: () => { me.reload(); }, > }).show(); we normally set `autoShow: true` instead for new additions of such window instances. > },