From: Fabian Grünbichler Date: Fri, 12 Feb 2016 06:53:28 +0000 (+0100) Subject: Refactor lock_container into lock_config_[xx] X-Git-Url: https://git.proxmox.com/?p=pve-container.git;a=commitdiff_plain;h=3cc56749060f98098690c5203b00dd21e553c66c Refactor lock_container into lock_config_[xx] This mimics the "signatures" of the methods in QemuServer.pm, and should allow us to use this methods in a future abstract "Guest" class. It also changes the various timeouts (ranging from 1, 10, 60 to undef) to use the default timeout defined in the lock_config methods (10). Also drop the now unused use statement for flock. --- diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm index 7db8488..32151c8 100644 --- a/src/PVE/API2/LXC.pm +++ b/src/PVE/API2/LXC.pm @@ -325,7 +325,7 @@ __PACKAGE__->register_method({ PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool; }; - my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); }; + my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); }; &$check_vmid_usage(); # first check before locking @@ -528,7 +528,7 @@ __PACKAGE__->register_method({ PVE::Firewall::remove_vmfw_conf($vmid); }; - my $realcmd = sub { PVE::LXC::lock_container($vmid, 1, $code); }; + my $realcmd = sub { PVE::LXC::lock_config($vmid, $code); }; return $rpcenv->fork_worker('vzdestroy', $vmid, $authuser, $realcmd); }}); @@ -947,7 +947,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('vztemplate', $vmid, $authuser, $realcmd); }; - PVE::LXC::lock_container($vmid, undef, $updatefn); + PVE::LXC::lock_config($vmid, $updatefn); return undef; }}); @@ -1186,7 +1186,7 @@ __PACKAGE__->register_method({ }; - return PVE::LXC::lock_container($vmid, undef, $clonefn); + return PVE::LXC::lock_config($vmid, $clonefn); }}); @@ -1334,7 +1334,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('resize', $vmid, $authuser, $realcmd); }; - return PVE::LXC::lock_container($vmid, undef, $code);; + return PVE::LXC::lock_config($vmid, $code);; }}); 1; diff --git a/src/PVE/API2/LXC/Config.pm b/src/PVE/API2/LXC/Config.pm index 1a1190c..8e9295b 100644 --- a/src/PVE/API2/LXC/Config.pm +++ b/src/PVE/API2/LXC/Config.pm @@ -143,7 +143,7 @@ __PACKAGE__->register_method({ PVE::LXC::update_lxc_config($storage_cfg, $vmid, $conf); }; - PVE::LXC::lock_container($vmid, undef, $code); + PVE::LXC::lock_config($vmid, $code); return undef; }}); diff --git a/src/PVE/API2/LXC/Snapshot.pm b/src/PVE/API2/LXC/Snapshot.pm index 36bbbf7..49fd4f5 100644 --- a/src/PVE/API2/LXC/Snapshot.pm +++ b/src/PVE/API2/LXC/Snapshot.pm @@ -311,7 +311,7 @@ __PACKAGE__->register_method({ PVE::LXC::write_config($vmid, $conf, 1); }; - PVE::LXC::lock_container($vmid, 10, $updatefn); + PVE::LXC::lock_config($vmid, $updatefn); return undef; }}); diff --git a/src/PVE/API2/LXC/Status.pm b/src/PVE/API2/LXC/Status.pm index cd7f04d..e91ac7c 100644 --- a/src/PVE/API2/LXC/Status.pm +++ b/src/PVE/API2/LXC/Status.pm @@ -186,7 +186,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd); }; - return PVE::LXC::lock_container($vmid, 10, $lockcmd); + return PVE::LXC::lock_config($vmid, $lockcmd); } }}); @@ -268,7 +268,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd); }; - return PVE::LXC::lock_container($vmid, 10, $lockcmd); + return PVE::LXC::lock_config($vmid, $lockcmd); } }}); @@ -361,7 +361,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd); }; - return PVE::LXC::lock_container($vmid, 10, $lockcmd); + return PVE::LXC::lock_config($vmid, $lockcmd); }}); __PACKAGE__->register_method({ @@ -417,7 +417,7 @@ __PACKAGE__->register_method({ return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd); }; - return PVE::LXC::lock_container($vmid, 10, $lockcmd); + return PVE::LXC::lock_config($vmid, $lockcmd); }}); __PACKAGE__->register_method({ diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm index e7a2292..b2bc361 100755 --- a/src/PVE/CLI/pct.pm +++ b/src/PVE/CLI/pct.pm @@ -44,7 +44,7 @@ __PACKAGE__->register_method ({ my $vmid = $param->{vmid}; - PVE::LXC::lock_container($vmid, 5, sub { + PVE::LXC::lock_config($vmid, sub { my $conf = PVE::LXC::load_config($vmid); delete $conf->{lock}; PVE::LXC::write_config($vmid, $conf); @@ -199,7 +199,7 @@ __PACKAGE__->register_method ({ PVE::Tools::run_command($command); }; - PVE::LXC::lock_container($vmid, undef, $do_fsck); + PVE::LXC::lock_config($vmid, $do_fsck); return undef; }}); diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index 1ef8a08..e701202 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -9,7 +9,7 @@ use Socket; use File::Path; use File::Spec; use Cwd qw(); -use Fcntl qw(O_RDONLY :flock); +use Fcntl qw(O_RDONLY); use PVE::Cluster qw(cfs_register_file cfs_read_file); use PVE::Storage; @@ -646,28 +646,46 @@ sub write_config { my $lock_handles = {}; my $lockdir = "/run/lock/lxc"; -sub lock_filename { +sub config_file_lock { my ($vmid) = @_; return "$lockdir/pve-config-${vmid}.lock"; } -sub lock_container { +sub lock_config_full { my ($vmid, $timeout, $code, @param) = @_; - $timeout = 10 if !$timeout; + my $filename = config_file_lock($vmid); - my $filename = lock_filename($vmid); + mkdir $lockdir if !-d $lockdir; + + my $res = lock_file($filename, $timeout, $code, @param); + + die $@ if $@; + + return $res; +} + +sub lock_config_mode { + my ($vmid, $timeout, $shared, $code, @param) = @_; + + my $filename = config_file_lock($vmid); mkdir $lockdir if !-d $lockdir; - my $res = PVE::Tools::lock_file_full($filename, $timeout, 0, $code, @param); + my $res = lock_file_full($filename, $timeout, $shared, $code, @param); die $@ if $@; return $res; } +sub lock_config { + my ($vmid, $code, @param) = @_; + + return lock_config_full($vmid, 10, $code, @param); +} + sub option_exists { my ($name) = @_; @@ -1732,7 +1750,7 @@ my $snapshot_prepare = sub { write_config($vmid, $conf); }; - lock_container($vmid, 10, $updatefn); + lock_config($vmid, $updatefn); return $snap; }; @@ -1761,7 +1779,7 @@ my $snapshot_commit = sub { write_config($vmid, $conf); }; - lock_container($vmid, 10 ,$updatefn); + lock_config($vmid ,$updatefn); }; sub has_feature { @@ -1927,7 +1945,7 @@ sub snapshot_delete { write_config($vmid, $conf); }; - lock_container($vmid, 10, $updatefn); + lock_config($vmid, $updatefn); my $storecfg = PVE::Storage::config(); @@ -1976,7 +1994,7 @@ sub snapshot_delete { my $err = $@; if(!$err || ($err && $force)) { - lock_container($vmid, 10, $del_snap); + lock_config($vmid, $del_snap); if ($err) { die "Can't delete snapshot: $vmid $snapname $err\n"; } @@ -2035,11 +2053,11 @@ sub snapshot_rollback { write_config($vmid, $conf); }; - lock_container($vmid, 10, $updatefn); + lock_config($vmid, $updatefn); PVE::Storage::volume_snapshot_rollback($storecfg, $volid, $snapname); - lock_container($vmid, 5, $unlockfn); + lock_config($vmid, $unlockfn); } sub template_create { diff --git a/src/PVE/LXC/Migrate.pm b/src/PVE/LXC/Migrate.pm index 58e4ea2..94d53a2 100644 --- a/src/PVE/LXC/Migrate.pm +++ b/src/PVE/LXC/Migrate.pm @@ -16,7 +16,7 @@ use base qw(PVE::AbstractMigrate); sub lock_vm { my ($self, $vmid, $code, @param) = @_; - return PVE::LXC::lock_container($vmid, undef, $code, @param); + return PVE::LXC::lock_config($vmid, $code, @param); } sub prepare { diff --git a/src/PVE/VZDump/LXC.pm b/src/PVE/VZDump/LXC.pm index 57dcbe2..0979f15 100644 --- a/src/PVE/VZDump/LXC.pm +++ b/src/PVE/VZDump/LXC.pm @@ -185,7 +185,7 @@ sub lock_vm { PVE::LXC::write_config($vmid, $conf); }; - PVE::LXC::lock_container($vmid, 10, $lockconfig, ($self, $vmid)); + PVE::LXC::lock_config($vmid, $lockconfig, ($self, $vmid)); } sub unlock_vm { @@ -202,7 +202,7 @@ sub unlock_vm { } }; - PVE::LXC::lock_container($vmid, 60, $unlockconfig, ($self, $vmid)); + PVE::LXC::lock_config($vmid, $unlockconfig, ($self, $vmid)); } sub snapshot {