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 6B2B86D6DE for ; Tue, 28 Sep 2021 13:40:17 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A9938DFB7 for ; Tue, 28 Sep 2021 13:40:16 +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 id D1734DCDA for ; Tue, 28 Sep 2021 13:40:06 +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 97C0044A56 for ; Tue, 28 Sep 2021 13:40:06 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Tue, 28 Sep 2021 13:39:53 +0200 Message-Id: <20210928114001.164081-14-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210928114001.164081-1-f.ebner@proxmox.com> References: <20210928114001.164081-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.303 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 URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [osd.pm] Subject: [pve-devel] [PATCH manager 1/9] api: ceph: create osd: re-check disk requirements after fork/lock 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: Tue, 28 Sep 2021 11:40:17 -0000 Signed-off-by: Fabian Ebner --- PVE/API2/Ceph/OSD.pm | 54 +++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/PVE/API2/Ceph/OSD.pm b/PVE/API2/Ceph/OSD.pm index 79548b2f..83a9c932 100644 --- a/PVE/API2/Ceph/OSD.pm +++ b/PVE/API2/Ceph/OSD.pm @@ -319,29 +319,35 @@ __PACKAGE__->register_method ({ } } - # test osd requirements early - my $devlist = [ map { $_->{name} } values %$devs ]; - my $disklist = PVE::Diskmanage::get_disks($devlist, 1); - my $dev = $devs->{dev}->{dev}; - my $devname = $devs->{dev}->{name}; - die "unable to get device info for '$dev'\n" if !$disklist->{$devname}; - die "device '$dev' is already in use\n" if $disklist->{$devname}->{used}; - - # test db/wal requirements early - for my $type ( qw(db_dev wal_dev) ) { - my $d = $devs->{$type}; - next if !$d; - my $name = $d->{name}; - my $info = $disklist->{$name}; - die "unable to get device info for '$d->{dev}' for type $type\n" if !$disklist->{$name}; - if (my $usage = $info->{used}) { - if ($usage eq 'partitions') { - die "device '$d->{dev}' is not GPT partitioned\n" if !$info->{gpt}; - } elsif ($usage ne 'LVM') { - die "device '$d->{dev}' is already in use and has no LVM on it\n"; + my $test_disk_requirements = sub { + my ($disklist) = @_; + + my $dev = $devs->{dev}->{dev}; + my $devname = $devs->{dev}->{name}; + die "unable to get device info for '$dev'\n" if !$disklist->{$devname}; + die "device '$dev' is already in use\n" if $disklist->{$devname}->{used}; + + for my $type ( qw(db_dev wal_dev) ) { + my $d = $devs->{$type}; + next if !$d; + my $name = $d->{name}; + my $info = $disklist->{$name}; + die "unable to get device info for '$d->{dev}' for type $type\n" if !$disklist->{$name}; + if (my $usage = $info->{used}) { + if ($usage eq 'partitions') { + die "device '$d->{dev}' is not GPT partitioned\n" if !$info->{gpt}; + } elsif ($usage ne 'LVM') { + die "device '$d->{dev}' is already in use and has no LVM on it\n"; + } } } - } + }; + + + # test disk requirements early + my $devlist = [ map { $_->{name} } values %$devs ]; + my $disklist = PVE::Diskmanage::get_disks($devlist, 1); + $test_disk_requirements->($disklist); # get necessary ceph infos my $rados = PVE::RADOS->new(); @@ -427,13 +433,15 @@ __PACKAGE__->register_method ({ my $upid = shift; PVE::Diskmanage::locked_disk_action(sub { - # update disklist + # update disklist and re-test requirements $disklist = PVE::Diskmanage::get_disks($devlist, 1); + $test_disk_requirements->($disklist); my $dev_class = $param->{'crush-device-class'}; my $cmd = ['ceph-volume', 'lvm', 'create', '--cluster-fsid', $fsid ]; push @$cmd, '--crush-device-class', $dev_class if $dev_class; + my $devname = $devs->{dev}->{name}; my $devpath = $disklist->{$devname}->{devpath}; print "create OSD on $devpath (bluestore)\n"; @@ -471,7 +479,7 @@ __PACKAGE__->register_method ({ }); }; - return $rpcenv->fork_worker('cephcreateosd', $devname, $authuser, $worker); + return $rpcenv->fork_worker('cephcreateosd', $devs->{dev}->{name}, $authuser, $worker); }}); # Check if $osdid belongs to $nodename -- 2.30.2