[pve-devel] [PATCH manager v2] Fix #2051: preserve DB/WAL disk on destroy
Wolfgang Bumiller
w.bumiller at proxmox.com
Thu Jan 31 12:26:10 CET 2019
On Wed, Jan 30, 2019 at 10:55:37AM +0100, Alwin Antreich wrote:
> '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.
>
> Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
> ---
> PVE/API2/Ceph/OSD.pm | 10 +++-------
> PVE/Ceph/Tools.pm | 16 ++++++++++++----
> 2 files changed, 15 insertions(+), 11 deletions(-)
>
> diff --git a/PVE/API2/Ceph/OSD.pm b/PVE/API2/Ceph/OSD.pm
> index b4dc277e..3214498a 100644
> --- a/PVE/API2/Ceph/OSD.pm
> +++ b/PVE/API2/Ceph/OSD.pm
> @@ -394,7 +394,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 +401,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 +416,7 @@ __PACKAGE__->register_method ({
I noticed this loop parses /proc/mounts "quick & dirty" - would you be
willing to send a followup patch changing it to use
PVE::ProcFSTools::parse_proc_mounts()? It also takes care of potentially
required decoding of entries.
> 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|^(/.+)|; #untaint $data_part
> push @$partitions_to_remove, $data_part;
> last;
> }
> @@ -427,7 +425,7 @@ __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|^(/.+)|; # untaint $part
> if ($part) {
> push @$partitions_to_remove, $part;
> }
> @@ -443,8 +441,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..0de72483 100644
> --- a/PVE/Ceph/Tools.pm
> +++ b/PVE/Ceph/Tools.pm
> @@ -232,11 +232,19 @@ 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 $@;
> + $devpath =~ m|([^/]*)$|;
This looks like `basename()` from File::Basename (which is in the
perl-modules package and already imported in API2/APT), so you could use
that. One less dangling regex match.
> + my $dev_size = PVE::Tools::file_get_contents("/sys/class/block/$1/size");
> +
> + $dev_size =~ m|(\d+)|; # untaint $dev_size
I'm not a big fan of having those matches dangle around like that
unchecked. While we know this comes from sysfs, it's "weird" not to at
least `or die "..."`.
> + my $size = ($1 * 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 $@;
> }
> };
>
> --
> 2.11.0
More information about the pve-devel
mailing list