]> git.proxmox.com Git - pve-manager.git/commitdiff
ceph tools: set_pools: filter settings for erasure code pools
authorAaron Lauterer <a.lauterer@proxmox.com>
Mon, 2 May 2022 08:09:25 +0000 (10:09 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 2 May 2022 13:43:06 +0000 (15:43 +0200)
Erasure code pools cannot change certain settings after creation.
Trying to set them will cause errors on Cephs side.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
Tested-by: Dominik Csapak <d.csapak@proxmox.com>
PVE/Ceph/Tools.pm

index 7bd3eedcb832a819e0e11aaaece49763669fa8ec..a1458b40547487f9c37fb65a0c6c81e7cf398eb9 100644 (file)
@@ -205,7 +205,7 @@ sub check_ceph_enabled {
 }
 
 my $set_pool_setting = sub {
-    my ($pool, $setting, $value) = @_;
+    my ($pool, $setting, $value, $rados) = @_;
 
     my $command;
     if ($setting eq 'application') {
@@ -224,7 +224,7 @@ my $set_pool_setting = sub {
        };
     }
 
-    my $rados = PVE::RADOS->new();
+    $rados = PVE::RADOS->new() if !$rados;
     eval { $rados->mon_command($command); };
     return $@ ? $@ : undef;
 };
@@ -232,6 +232,18 @@ my $set_pool_setting = sub {
 sub set_pool {
     my ($pool, $param) = @_;
 
+    my $rados = PVE::RADOS->new();
+
+    if (get_pool_type($pool, $rados) eq 'erasure') {
+       #remove parameters that cannot be changed for erasure coded pools
+       my $ignore_params = ['size', 'crush_rule'];
+       for my $setting (@$ignore_params) {
+           if ($param->{$setting}) {
+               print "cannot set '${setting}' for erasure coded pool\n";
+               delete $param->{$setting};
+           }
+       }
+    }
     # by default, pool size always resets min_size, so set it as first item
     # https://tracker.ceph.com/issues/44862
     my $keys = [ grep { $_ ne 'size' } sort keys %$param ];
@@ -241,7 +253,7 @@ sub set_pool {
        my $value = $param->{$setting};
 
        print "pool $pool: applying $setting = $value\n";
-       if (my $err = $set_pool_setting->($pool, $setting, $value)) {
+       if (my $err = $set_pool_setting->($pool, $setting, $value, $rados)) {
            print "$err";
        } else {
            delete $param->{$setting};
@@ -267,6 +279,13 @@ sub get_pool_properties {
     return $rados->mon_command($command);
 }
 
+sub get_pool_type {
+    my ($pool, $rados) = @_;
+    $rados = PVE::RADOS->new() if !defined($rados);
+    return 'erasure' if get_pool_properties($pool, $rados)->{erasure_code_profile};
+    return 'replicated';
+}
+
 sub create_pool {
     my ($pool, $param, $rados) = @_;
     $rados = PVE::RADOS->new() if !defined($rados);