Since Ceph Nautilus 14.2.10 and Octopus 15.2.2 the min_size of a pool is
calculated by the size (round(size / 2)). When size is applied after
min_size to the pool, the manual specified min_size will be overwritten.

Signed-off-by: Alwin Antreich <a.antre...@proxmox.com>
---
 PVE/Ceph/Tools.pm | 61 +++++++++++++++++++++++++++++++----------------
 1 file changed, 40 insertions(+), 21 deletions(-)

diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm
index ab38f7bc..9d4d595f 100644
--- a/PVE/Ceph/Tools.pm
+++ b/PVE/Ceph/Tools.pm
@@ -200,33 +200,52 @@ sub check_ceph_enabled {
     return 1;
 }
 
+my $set_pool_setting = sub {
+    my ($pool, $setting, $value) = @_;
+
+    my $command;
+    if ($setting eq 'application') {
+       $command = {
+           prefix => "osd pool application enable",
+           pool   => "$pool",
+           app    => "$value",
+       };
+    } else {
+       $command = {
+           prefix => "osd pool set",
+           pool   => "$pool",
+           var    => "$setting",
+           val    => "$value",
+           format => 'plain',
+       };
+    }
+
+    my $rados = PVE::RADOS->new();
+    eval { $rados->mon_command($command); };
+    return $@ ? $@ : undef;
+};
+
 sub set_pool {
     my ($pool, $param) = @_;
 
-    foreach my $setting (keys %$param) {
-       my $value = $param->{$setting};
-
-       my $command;
-       if ($setting eq 'application') {
-           $command = {
-               prefix => "osd pool application enable",
-               pool   => "$pool",
-               app    => "$value",
-           };
+    # by default, pool size always sets min_size,
+    # set it and forget it, as first item
+    # https://tracker.ceph.com/issues/44862
+    if ($param->{size}) {
+       my $value = $param->{size};
+       if (my $err = $set_pool_setting->($pool, 'size', $value)) {
+           print "$err";
        } else {
-           $command = {
-               prefix => "osd pool set",
-               pool   => "$pool",
-               var    => "$setting",
-               val    => "$value",
-               format => 'plain',
-           };
+           delete $param->{size};
        }
+    }
+
+    foreach my $setting (keys %$param) {
+       my $value = $param->{$setting};
+       next if $setting eq 'size';
 
-       my $rados = PVE::RADOS->new();
-       eval { $rados->mon_command($command); };
-       if ($@) {
-           print "$@";
+       if (my $err = $set_pool_setting->($pool, $setting, $value)) {
+           print "$err";
        } else {
            delete $param->{$setting};
        }
-- 
2.29.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to