[pve-devel] [PATCH container] restore: support i/o rate limiting

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Feb 6 14:00:46 CET 2018


Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
---
 src/PVE/API2/LXC.pm   | 16 +++++++++++++++-
 src/PVE/LXC/Create.pm | 12 +++++++++++-
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
index 733826e..c49cf4f 100644
--- a/src/PVE/API2/LXC.pm
+++ b/src/PVE/API2/LXC.pm
@@ -161,6 +161,12 @@ __PACKAGE__->register_method({
 		description => "Setup public SSH keys (one key per line, " .
 				"OpenSSH format).",
 	    },
+	    bwlimit => {
+		description => "Override i/o bandwidth limit (in KiB/s).",
+		optional => 1,
+		type => 'number',
+		minimum => '0',
+	    },
 	}),
     },
     returns => {
@@ -179,6 +185,8 @@ __PACKAGE__->register_method({
 
 	my $ignore_unpack_errors = extract_param($param, 'ignore-unpack-errors');
 
+	my $bwlimit = extract_param($param, 'bwlimit');
+
 	my $basecfg_fn = PVE::LXC::Config->config_file($vmid);
 
 	my $same_container_exists = -f $basecfg_fn;
@@ -247,6 +255,7 @@ __PACKAGE__->register_method({
 	    $archive = PVE::Storage::abs_filesystem_path($storage_cfg, $ostemplate);
 	}
 
+	my %used_storages;
 	my $check_and_activate_storage = sub {
 	    my ($sid) = @_;
 
@@ -258,6 +267,8 @@ __PACKAGE__->register_method({
 	    $rpcenv->check($authuser, "/storage/$sid", ['Datastore.AllocateSpace']);
 
 	    PVE::Storage::activate_storage($storage_cfg, $sid);
+
+	    $used_storages{$sid} = 1;
 	};
 
 	my $conf = {};
@@ -387,7 +398,10 @@ __PACKAGE__->register_method({
 
 		eval {
 		    my $rootdir = PVE::LXC::mount_all($vmid, $storage_cfg, $conf, 1);
-		    PVE::LXC::Create::restore_archive($archive, $rootdir, $conf, $ignore_unpack_errors);
+		    if ($restore) {
+			$bwlimit = PVE::Storage::get_bandwidth_limit('restore', [keys %used_storages], $bwlimit);
+		    }
+		    PVE::LXC::Create::restore_archive($archive, $rootdir, $conf, $ignore_unpack_errors, $bwlimit);
 
 		    if ($restore) {
 			PVE::LXC::Create::restore_configuration($vmid, $rootdir, $conf, $authuser ne 'root at pam');
diff --git a/src/PVE/LXC/Create.pm b/src/PVE/LXC/Create.pm
index 2a37d93..0851b08 100644
--- a/src/PVE/LXC/Create.pm
+++ b/src/PVE/LXC/Create.pm
@@ -59,7 +59,7 @@ sub detect_architecture {
 }
 
 sub restore_archive {
-    my ($archive, $rootdir, $conf, $no_unpack_error) = @_;
+    my ($archive, $rootdir, $conf, $no_unpack_error, $bwlimit) = @_;
 
     my ($id_map, $rootuid, $rootgid) = PVE::LXC::parse_id_maps($conf);
     my $userns_cmd = PVE::LXC::userns_command($id_map);
@@ -74,6 +74,12 @@ sub restore_archive {
 	$archive_fh->fcntl(Fcntl::F_SETFD(), $flags & ~(Fcntl::FD_CLOEXEC()));
     }
 
+    my $bwlimit_cmd;
+    if (defined($bwlimit)) {
+	$bwlimit_cmd = ['cstream', '-t', $bwlimit*1024, '--', $tar_input_file];
+	$tar_input_file = '-';
+    }
+
     my $cmd = [@$userns_cmd, 'tar', 'xpf', $tar_input_file, '--totals',
                @PVE::Storage::Plugin::COMMON_TAR_FLAGS,
                '-C', $rootdir];
@@ -86,6 +92,10 @@ sub restore_archive {
     push @$cmd, '--anchored';
     push @$cmd, '--exclude' , './dev/*';
 
+    if ($bwlimit_cmd) {
+	$cmd = [$bwlimit_cmd, $cmd];
+    }
+
     if ($archive eq '-') {
 	print "extracting archive from STDIN\n";
 	eval { PVE::Tools::run_command($cmd, input => "<&STDIN"); };
-- 
2.11.0





More information about the pve-devel mailing list