[pve-devel] [PATCH v2 manager] add wipe_disk option when destroying ceph disk

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Oct 24 10:31:35 CEST 2018


On 10/24/18 9:32 AM, David Limbeck wrote:
> this allows the disk to be reused as ceph disk by zeroing the first 200M
> of the destroyed disk
> 
> Signed-off-by: David Limbeck <d.limbeck at proxmox.com>
> ---
> since v1:
>     wipe is always done after remove_partition
>     fdatasync is used to make sure data is synced on some disks
>     (as proposed by Alwin)
> 
>  PVE/API2/Ceph.pm | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm
> index 69489a70..a0b5042d 100644
> --- a/PVE/API2/Ceph.pm
> +++ b/PVE/API2/Ceph.pm
> @@ -434,6 +434,13 @@ __PACKAGE__->register_method ({
>  		}
>  	    }
>  
> +	    my $disks_to_wipe = {};
> +	    foreach my $part (@$partitions_to_remove) {
> +		next if !$part || (! -b $part );
> +		my $devpath = PVE::Diskmanage::get_blockdev($part);
> +		$disks_to_wipe->{$devpath} = 1;
> +	    }

Could be done in single line with:

my $disks_to_wipe = {
    map {  PVE::Diskmanage::get_blockdev($_) => 1 } grep { -b } @partitions_to_remove
};

I find it much nicer, as more concise and using what perl provides,
but I don't think a lot other here think the same way, so take with
caution ;-)

But I have another question....

> +
>  	    print "Unmount OSD $osdsection from  $mountpoint\n";
>  	    eval { run_command(['/bin/umount', $mountpoint]); };
>  	    if (my $err = $@) {
> @@ -443,6 +450,11 @@ __PACKAGE__->register_method ({
>  		foreach my $part (@$partitions_to_remove) {
>  		    $remove_partition->($part);

...why don't you do the wiping in the $remove_partition closure?

Because your code seems to introduce two additional and unnecessary for
loops over  $partitions_to_remove

Just doing the checks in the aforementioned closure, if those checks are
needed at all, and run the command there? Should be much shorter (almost
a one-line only change)?

>  		}
> +		foreach my $devpath (keys %$disks_to_wipe) {
> +		    print "wipe disk: $devpath\n";
> +		    eval { run_command(['/bin/dd', 'if=/dev/zero', "of=${devpath}", 'bs=1M', 'count=200', 'conv=fdatasync']); };
> +		    warn $@ if $@;
> +		}
>  	    }
>  	};
>  
> 





More information about the pve-devel mailing list