[pve-devel] [PATCH manager v2 1/5] ceph: split out pool set into own method

Alwin Antreich a.antreich at proxmox.com
Mon Oct 19 12:39:30 CEST 2020


to reduce code duplication and make it easier to add more options for
pool commands.

Use a new rados object for each 'osd pool set', as each command can set
an option independent of the previous commands success/failure. On
failure a new rados object would need to be created and that will
confuse task tracking of the REST environment.

Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
---
Note:
    v1 -> v2:
	* reorder patches, since pool create & set share common pool
	  options.
	* include new setpool API

 PVE/API2/Ceph.pm  | 17 +++++++----
 PVE/Ceph/Tools.pm | 74 +++++++++++++++++++++++++----------------------
 2 files changed, 52 insertions(+), 39 deletions(-)

diff --git a/PVE/API2/Ceph.pm b/PVE/API2/Ceph.pm
index d7e5892c..48d0484f 100644
--- a/PVE/API2/Ceph.pm
+++ b/PVE/API2/Ceph.pm
@@ -751,14 +751,21 @@ __PACKAGE__->register_method ({
 		if !PVE::JSONSchema::parse_storage_id($pool);
 	}
 
-	my $pg_num = $param->{pg_num} || 128;
-	my $size = $param->{size} || 3;
-	my $min_size = $param->{min_size} || 2;
-	my $application = $param->{application} // 'rbd';
+	my $ceph_param = \%$param;
+	for my $item ('add_storages', 'name', 'node') {
+	    # not ceph parameters
+	    delete $ceph_param->{$item};
+	}
+
+	# pool defaults
+	$ceph_param->{pg_num} //= 128;
+	$ceph_param->{size} //= 3;
+	$ceph_param->{min_size} //= 2;
+	$ceph_param->{application} //= 'rbd';
 
 	my $worker = sub {
 
-	    PVE::Ceph::Tools::create_pool($pool, $param);
+	    PVE::Ceph::Tools::create_pool($pool, $ceph_param);
 
 	    if ($param->{add_storages}) {
 		my $err;
diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm
index 2d8a4c1d..cc4238c9 100644
--- a/PVE/Ceph/Tools.pm
+++ b/PVE/Ceph/Tools.pm
@@ -202,6 +202,45 @@ sub check_ceph_enabled {
     return 1;
 }
 
+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",
+	    };
+	} else {
+	    $command = {
+		prefix => "osd pool set",
+		pool   => "$pool",
+		var    => "$setting",
+		val    => "$value",
+		format => 'plain',
+	    };
+	}
+
+	my $rados = PVE::RADOS->new();
+	eval { $rados->mon_command($command); };
+	if ($@) {
+	    print "$@";
+	} else {
+	    delete $param->{$setting};
+	}
+    }
+
+    if ((keys %$param) > 0) {
+	my @missing = join(', ', keys %$param );
+	die "Could not set: @missing\n";
+    }
+
+}
+
 sub create_pool {
     my ($pool, $param, $rados) = @_;
 
@@ -210,9 +249,6 @@ sub create_pool {
     }
 
     my $pg_num = $param->{pg_num} || 128;
-    my $size = $param->{size} || 3;
-    my $min_size = $param->{min_size} || 2;
-    my $application = $param->{application} // 'rbd';
 
     $rados->mon_command({
 	prefix => "osd pool create",
@@ -221,37 +257,7 @@ sub create_pool {
 	format => 'plain',
     });
 
-    $rados->mon_command({
-	prefix => "osd pool set",
-	pool => $pool,
-	var => 'min_size',
-	val => "$min_size",
-	format => 'plain',
-    });
-
-    $rados->mon_command({
-	prefix => "osd pool set",
-	pool => $pool,
-	var => 'size',
-	val => "$size",
-	format => 'plain',
-    });
-
-    if (defined($param->{crush_rule})) {
-	$rados->mon_command({
-	    prefix => "osd pool set",
-	    pool => $pool,
-	    var => 'crush_rule',
-	    val => $param->{crush_rule},
-	    format => 'plain',
-	});
-    }
-
-    $rados->mon_command({
-	prefix => "osd pool application enable",
-	pool => $pool,
-	app => $application,
-    });
+    set_pool($pool, $param);
 
 }
 
-- 
2.27.0






More information about the pve-devel mailing list