This should prevent race conditions by preventing config
file changes inbetween checking locks and actually doing
the start/stop/.. operation.

Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
---
 src/PVE/API2/LXC/Status.pm | 83 ++++++++++++++++++++++++++++------------------
 1 file changed, 50 insertions(+), 33 deletions(-)

diff --git a/src/PVE/API2/LXC/Status.pm b/src/PVE/API2/LXC/Status.pm
index e119211..8d59436 100644
--- a/src/PVE/API2/LXC/Status.pm
+++ b/src/PVE/API2/LXC/Status.pm
@@ -156,20 +156,24 @@ __PACKAGE__->register_method({
 
                syslog('info', "starting CT $vmid: $upid\n");
 
-               my $conf = PVE::LXC::load_config($vmid);
+               my $lockcmd = sub {
+                   my $conf = PVE::LXC::load_config($vmid);
 
-               die "you can't start a CT if it's a template\n"
-                   if PVE::LXC::is_template($conf);
+                   die "you can't start a CT if it's a template\n"
+                       if PVE::LXC::is_template($conf);
 
-               PVE::LXC::check_lock($conf);
+                   PVE::LXC::check_lock($conf);
 
-               my $storage_cfg = cfs_read_file("storage.cfg");
+                   my $storage_cfg = cfs_read_file("storage.cfg");
 
-               PVE::LXC::update_lxc_config($storage_cfg, $vmid, $conf);
+                   PVE::LXC::update_lxc_config($storage_cfg, $vmid, $conf);
 
-               my $cmd = ['lxc-start', '-n', $vmid];
+                   my $cmd = ['lxc-start', '-n', $vmid];
 
-               run_command($cmd);
+                   run_command($cmd);
+               };
+
+               PVE::LXC::lock_container($vmid, 10, $lockcmd);
 
                return;
            };
@@ -236,13 +240,17 @@ __PACKAGE__->register_method({
 
                syslog('info', "stopping CT $vmid: $upid\n");
 
-               my $conf = PVE::LXC::load_config($vmid);
+               my $lockcmd = sub {
+                   my $conf = PVE::LXC::load_config($vmid);
 
-               PVE::LXC::check_lock($conf);
+                   PVE::LXC::check_lock($conf);
 
-               my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
+                   my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
 
-               run_command($cmd);
+                   run_command($cmd);
+               };
+
+               PVE::LXC::lock_container($vmid, 10, $lockcmd);
 
                return;
            };
@@ -304,32 +312,37 @@ __PACKAGE__->register_method({
 
            syslog('info', "shutdown CT $vmid: $upid\n");
 
-           my $cmd = ['lxc-stop', '-n', $vmid];
+           my $lockcmd = sub {
+               my $cmd = ['lxc-stop', '-n', $vmid];
 
-           $timeout = 60 if !defined($timeout);
+               $timeout = 60 if !defined($timeout);
 
-           my $conf = PVE::LXC::load_config($vmid);
+               my $conf = PVE::LXC::load_config($vmid);
 
-           PVE::LXC::check_lock($conf);
+               PVE::LXC::check_lock($conf);
 
-           my $storage_cfg = PVE::Storage::config();
+               my $storage_cfg = PVE::Storage::config();
 
-           push @$cmd, '--timeout', $timeout;
+               push @$cmd, '--timeout', $timeout;
 
-           eval { run_command($cmd, timeout => $timeout+5); };
-           my $err = $@;
-           if ($err && $param->{forceStop}) {
-               $err = undef;
-               warn "shutdown failed - forcing stop now\n";
+               eval { run_command($cmd, timeout => $timeout+5); };
+               my $err = $@;
+               if ($err && $param->{forceStop}) {
+                   $err = undef;
+                   warn "shutdown failed - forcing stop now\n";
 
-               my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
-               run_command($cmd);
-           }
+                   my $cmd = ['lxc-stop', '-n', $vmid, '--kill'];
+                   run_command($cmd);
+               }
+           };
+
+           PVE::LXC::lock_container($vmid, 10, $lockcmd);
 
            # make sure container is stopped
-           $cmd = ['lxc-wait',  '-n', $vmid, '-t', 5, '-s', 'STOPPED'];
+           my $cmd = ['lxc-wait',  '-n', $vmid, '-t', 5, '-s', 'STOPPED'];
            run_command($cmd);
-           
+           my $err = $@;
+
            die $err if $err;
 
            return;
@@ -378,15 +391,19 @@ __PACKAGE__->register_method({
 
             syslog('info', "suspend CT $vmid: $upid\n");
 
-           my $conf = PVE::LXC::load_config($vmid);
+           my $lockcmd = sub {
+               my $conf = PVE::LXC::load_config($vmid);
+
+               PVE::LXC::check_lock($conf);
 
-           PVE::LXC::check_lock($conf);
+               my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', 
'/var/liv/vz/dump'];
 
-           my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', 
'/var/liv/vz/dump'];
+               run_command($cmd);
+           };
 
-           run_command($cmd);
+           PVE::LXC::lock_container($vmid, 10, $lockcmd);
 
-            return;
+           return;
         };
 
         my $upid = $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, 
$realcmd);
-- 
2.1.4


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

Reply via email to