[pve-devel] [PATCH manager v4 1/2] Fix #2051: preserve DB/WAL disk on destroy

Thomas Lamprecht t.lamprecht at proxmox.com
Fri Feb 8 15:29:00 CET 2019


Am 2/7/19 um 4:29 PM schrieb Alwin Antreich:
> 'pveceph osd destroy <num> --cleanup'
> 
> When executing the command above, all disks associated with the OSD are
> at the moment wiped with dd (incl. separate disks with DB/WAL).
> 
> The patch adds the ability to 'wipe_disks' to wipe the partition instead
> of the whole disk.
> 

applied, thanks! reworded CI message a bit and moved a hunk from 1/2 to 2/2
(see below)

> Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
> ---
> V3 -> V4:
>     - incorporate suggestion by Thomas
>     - and add second patch for cleanup
>     https://pve.proxmox.com/pipermail/pve-devel/2019-February/035573.html
> 
>  PVE/API2/Ceph/OSD.pm | 15 ++++++++-------
>  PVE/Ceph/Tools.pm    | 19 +++++++++++++++----
>  2 files changed, 23 insertions(+), 11 deletions(-)
> 
> diff --git a/PVE/API2/Ceph/OSD.pm b/PVE/API2/Ceph/OSD.pm
> index b4dc277e..c3858831 100644
> --- a/PVE/API2/Ceph/OSD.pm
> +++ b/PVE/API2/Ceph/OSD.pm
> @@ -17,6 +17,7 @@ use PVE::RADOS;
>  use PVE::RESTHandler;
>  use PVE::RPCEnvironment;
>  use PVE::Tools qw(run_command file_set_contents);
> +use PVE::ProcFSTools;

this use belongs it 2/2, I rebased the series to move this hunk to the
correct commit, so you may not pull cleanly.

>  
>  use base qw(PVE::RESTHandler);
>  
> @@ -394,7 +395,6 @@ __PACKAGE__->register_method ({
>  	    # try to unmount from standard mount point
>  	    my $mountpoint = "/var/lib/ceph/osd/ceph-$osdid";
>  
> -	    my $disks_to_wipe = {};
>  	    my $remove_partition = sub {
>  		my ($part) = @_;
>  
> @@ -402,11 +402,10 @@ __PACKAGE__->register_method ({
>  		my $partnum = PVE::Diskmanage::get_partnum($part);
>  		my $devpath = PVE::Diskmanage::get_blockdev($part);
>  
> +		PVE::Ceph::Tools::wipe_disks($part);
>  		print "remove partition $part (disk '${devpath}', partnum $partnum)\n";
>  		eval { run_command(['/sbin/sgdisk', '-d', $partnum, "${devpath}"]); };
>  		warn $@ if $@;
> -
> -		$disks_to_wipe->{$devpath} = 1;
>  	    };
>  
>  	    my $partitions_to_remove = [];
> @@ -418,7 +417,9 @@ __PACKAGE__->register_method ({
>  			next if !($dev && $path && $fstype);
>  			next if $dev !~ m|^/dev/|;
>  			if ($path eq $mountpoint) {
> -			    my $data_part = abs_path($dev);
> +			    my ($data_part) = abs_path($dev) =~ m|^(/.+)|
> +				or die "invalid path: $path \n"; # untaint $part
> +
>  			    push @$partitions_to_remove, $data_part;
>  			    last;
>  			}
> @@ -427,7 +428,9 @@ __PACKAGE__->register_method ({
>  		}
>  
>  		foreach my $path (qw(journal block block.db block.wal)) {
> -		    my $part = abs_path("$mountpoint/$path");
> +		    my ($part) = abs_path("$mountpoint/$path") =~ m|^(/.+)|
> +			or die "invalid path: $path \n"; # untaint $part
> +
>  		    if ($part) {
>  			push @$partitions_to_remove, $part;
>  		    }
> @@ -443,8 +446,6 @@ __PACKAGE__->register_method ({
>  		foreach my $part (@$partitions_to_remove) {
>  		    $remove_partition->($part);
>  		}
> -
> -		PVE::Ceph::Tools::wipe_disks(keys %$disks_to_wipe);
>  	    }
>  	};
>  
> diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm
> index 0ada98cf..9b02d7c8 100644
> --- a/PVE/Ceph/Tools.pm
> +++ b/PVE/Ceph/Tools.pm
> @@ -4,6 +4,7 @@ use strict;
>  use warnings;
>  
>  use File::Path;
> +use File::Basename;
>  use IO::File;
>  
>  use PVE::Tools qw(run_command dir_glob_foreach);
> @@ -232,11 +233,21 @@ sub systemd_managed {
>  sub wipe_disks {
>      my (@devs) = @_;
>  
> -    my @wipe_cmd = qw(/bin/dd if=/dev/zero bs=1M count=200 conv=fdatasync);
> +    my @wipe_cmd = qw(/bin/dd if=/dev/zero bs=1M conv=fdatasync);
> +
>      foreach my $devpath (@devs) {
> -        print "wipe disk: $devpath\n";
> -        eval { run_command([@wipe_cmd, "of=${devpath}"]) };
> -        warn $@ if $@;
> +	my $devname = basename($devpath);
> +	my $dev_size = PVE::Tools::file_get_contents("/sys/class/block/$devname/size");
> +
> +	($dev_size) = $dev_size =~ m|(\d+)|; # untaint $dev_size
> +	die "Coulnd't get the size of the device $devname\n" if (!defined($dev_size));
> +
> +	my $size = ($dev_size * 512 / 1024 / 1024);
> +	my $count = ($size < 200) ? $size : 200;
> +
> +	print "wipe disk/partition: $devpath\n";
> +	eval { run_command([@wipe_cmd, "count=$count", "of=${devpath}"]) };
> +	warn $@ if $@;
>      }
>  };
>  
> 




More information about the pve-devel mailing list