There is a udev bug [0] which can ultimately lead to the udev database for certain devices not being actively updated. The Diskmanage package relies upon lsblk for certain info, and lsblk queries the udev database. Ensure the information is updated by manually calling 'udevadm trigger' for the changed devices.
Without the fix, and a bit of bad luck, a cleaned up disk could still show up as an 'LVM2_member' for example. [0]: https://github.com/systemd/systemd/issues/18525 Signed-off-by: Fabian Ebner <f.eb...@proxmox.com> --- PVE/API2/Ceph/OSD.pm | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/PVE/API2/Ceph/OSD.pm b/PVE/API2/Ceph/OSD.pm index 97393912..fbbc2139 100644 --- a/PVE/API2/Ceph/OSD.pm +++ b/PVE/API2/Ceph/OSD.pm @@ -371,6 +371,9 @@ __PACKAGE__->register_method ({ file_set_contents($ceph_bootstrap_osd_keyring, $bindata); }; + # See FIXME below + my @udev_trigger_devs = (); + my $create_part_or_lv = sub { my ($dev, $size, $type) = @_; @@ -393,6 +396,8 @@ __PACKAGE__->register_method ({ PVE::Storage::LVMPlugin::lvm_create_volume_group($dev->{devpath}, $vg); PVE::Storage::LVMPlugin::lvcreate($vg, $lv, "${size}k"); + push @udev_trigger_devs, $dev->{devpath}; + return "$vg/$lv"; } elsif ($dev->{used} eq 'LVM') { @@ -423,7 +428,9 @@ __PACKAGE__->register_method ({ } elsif ($dev->{used} eq 'partitions' && $dev->{gpt}) { # create new partition at the end - return PVE::Diskmanage::append_partition($dev->{devpath}, $size * 1024); + my $part = PVE::Diskmanage::append_partition($dev->{devpath}, $size * 1024); + push @udev_trigger_devs, $part; + return $part; } die "cannot use '$dev->{devpath}' for '$type'\n"; @@ -445,6 +452,8 @@ __PACKAGE__->register_method ({ my $devpath = $disklist->{$devname}->{devpath}; print "create OSD on $devpath (bluestore)\n"; + push @udev_trigger_devs, $devpath; + my $osd_size = $disklist->{$devname}->{size}; my $size_map = { db => int($osd_size / 10), # 10% of OSD @@ -476,6 +485,12 @@ __PACKAGE__->register_method ({ PVE::Diskmanage::wipe_blockdev($devpath); run_command($cmd); + + # FIXME: Remove once we depend on systemd >= v249. + # Work around udev bug https://github.com/systemd/systemd/issues/18525 to ensure the + # udev database is updated. + eval { run_command(['udevadm', 'trigger', @udev_trigger_devs]); }; + warn $@ if $@; }); }; @@ -583,6 +598,9 @@ __PACKAGE__->register_method ({ # try to unmount from standard mount point my $mountpoint = "/var/lib/ceph/osd/ceph-$osdid"; + # See FIXME below + my $udev_trigger_devs = {}; + my $remove_partition = sub { my ($part) = @_; @@ -590,6 +608,8 @@ __PACKAGE__->register_method ({ my $partnum = PVE::Diskmanage::get_partnum($part); my $devpath = PVE::Diskmanage::get_blockdev($part); + $udev_trigger_devs->{$devpath} = 1; + PVE::Diskmanage::wipe_blockdev($part); print "remove partition $part (disk '${devpath}', partnum $partnum)\n"; eval { run_command(['/sbin/sgdisk', '-d', $partnum, "${devpath}"]); }; @@ -611,6 +631,8 @@ __PACKAGE__->register_method ({ eval { run_command(['/sbin/pvremove', $dev], errfunc => sub {}) }; warn $@ if $@; + + $udev_trigger_devs->{$dev} = 1; } } } @@ -648,6 +670,14 @@ __PACKAGE__->register_method ({ } } } + + # FIXME: Remove once we depend on systemd >= v249. + # Work around udev bug https://github.com/systemd/systemd/issues/18525 to ensure the + # udev database is updated. + if ($cleanup) { + eval { run_command(['udevadm', 'trigger', keys $udev_trigger_devs->%*]); }; + warn $@ if $@; + } }; return $rpcenv->fork_worker('cephdestroyosd', $osdsection, $authuser, $worker); -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel