[pve-devel] [PATCH rebased container] Refactor lock_container into lock_config_[xx]
Fabian Grünbichler
f.gruenbichler at proxmox.com
Thu Feb 11 14:37:41 CET 2016
Subject: [PATCH rebased container] 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.
---
Note: this requires the "Add missing use statement" patch,
because the calls to lock_file[_full] are unqualified now.
Rebased on current master.
src/PVE/API2/LXC.pm | 10 +++++-----
src/PVE/API2/LXC/Config.pm | 2 +-
src/PVE/API2/LXC/Snapshot.pm | 2 +-
src/PVE/API2/LXC/Status.pm | 8 ++++----
src/PVE/CLI/pct.pm | 4 ++--
src/PVE/LXC.pm | 42 ++++++++++++++++++++++++++++++------------
src/PVE/LXC/Migrate.pm | 2 +-
src/PVE/VZDump/LXC.pm | 4 ++--
8 files changed, 46 insertions(+), 28 deletions(-)
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 {
--
2.1.4
> Fabian Grünbichler <f.gruenbichler at proxmox.com> hat am 11. Februar 2016 um
> 12:55 geschrieben:
>
>
> 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.
> ---
> Note: this requires the "Add missing use statement" patch,
> because the calls to lock_file[_full] are unqualified now.
>
> src/PVE/API2/LXC.pm | 10 +++++-----
> src/PVE/API2/LXC/Config.pm | 2 +-
> src/PVE/API2/LXC/Snapshot.pm | 2 +-
> src/PVE/API2/LXC/Status.pm | 8 ++++----
> src/PVE/CLI/pct.pm | 4 ++--
> src/PVE/LXC.pm | 41 +++++++++++++++++++++++++++++------------
> src/PVE/LXC/Migrate.pm | 2 +-
> src/PVE/VZDump/LXC.pm | 4 ++--
> 8 files changed, 45 insertions(+), 28 deletions(-)
>
> 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 a2cb67d..74d15da 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -7,7 +7,6 @@ use POSIX qw(EINTR);
> use File::Path;
> use File::Spec;
> use Cwd qw();
> -use Fcntl ':flock';
>
> use PVE::Cluster qw(cfs_register_file cfs_read_file);
> use PVE::Storage;
> @@ -638,28 +637,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) = @_;
>
> @@ -1730,7 +1747,7 @@ my $snapshot_prepare = sub {
> write_config($vmid, $conf);
> };
>
> - lock_container($vmid, 10, $updatefn);
> + lock_config($vmid, $updatefn);
>
> return $snap;
> };
> @@ -1759,7 +1776,7 @@ my $snapshot_commit = sub {
> write_config($vmid, $conf);
> };
>
> - lock_container($vmid, 10 ,$updatefn);
> + lock_config($vmid ,$updatefn);
> };
>
> sub has_feature {
> @@ -1856,7 +1873,7 @@ sub snapshot_delete {
> write_config($vmid, $conf);
> };
>
> - lock_container($vmid, 10, $updatefn);
> + lock_config($vmid, $updatefn);
>
> my $storecfg = PVE::Storage::config();
>
> @@ -1905,7 +1922,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";
> }
> @@ -1964,11 +1981,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 {
> --
> 2.1.4
>
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
More information about the pve-devel
mailing list