and pull the actual lock_file_full handling into a helper, to make the public interface clearer:
lock_config -> standard exclusive lock with 10s timeout lock_config_full -> exclusive lock with configurable timeout lock_config_shared -> shared lock with configurable timeout the latter only has a single user (qemu-server's clone API call) currently. Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com> --- Notes: requires breaks on qemu-server that uses lock_config_mode possibly better to postpone since it does not fix an actual issue but just improves the readability/design PVE/AbstractConfig.pm | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/PVE/AbstractConfig.pm b/PVE/AbstractConfig.pm index 8ec27a6..1abe41c 100644 --- a/PVE/AbstractConfig.pm +++ b/PVE/AbstractConfig.pm @@ -253,15 +253,6 @@ sub load_current_config { return $conf; } - -# Lock config file using flock, run $code with @param, unlock config file. -# $timeout is the maximum time to acquire the flock -sub lock_config_full { - my ($class, $vmid, $timeout, $code, @param) = @_; - - return $class->lock_config_mode($vmid, $timeout, 0, $code, @param); -} - sub create_and_lock_config { my ($class, $vmid, $allow_existing, $lock) = @_; @@ -284,27 +275,41 @@ sub destroy_config { unlink $config_fn or die "failed to remove config file: $!\n"; } -# Lock config file using flock, run $code with @param, unlock config file. -# $timeout is the maximum time to acquire the flock -# $shared eq 1 creates a non-exclusive ("read") flock -sub lock_config_mode { - my ($class, $vmid, $timeout, $shared, $code, @param) = @_; +my $lock_file_full_wrapper = sub { + my ($class, $vmid, $timeout, $shared, $realcode, @param) = @_; my $filename = $class->config_file_lock($vmid); # make sure configuration file is up-to-date - my $realcode = sub { + my $code = sub { PVE::Cluster::cfs_update(); - $code->(@param); + $realcode->(@_); }; - my $res = lock_file_full($filename, $timeout, $shared, $realcode, @param); + my $res = lock_file_full($filename, $timeout, $shared, $code, @param); die $@ if $@; return $res; +}; + +# Lock config file using non-exclusive ("read") flock, run $code with @param, unlock config file. +# $timeout is the maximum time to acquire the flock +sub lock_config_shared { + my ($class, $vmid, $timeout, $code, @param) = @_; + + return $lock_file_full_wrapper->($class, $vmid, $timeout, 1, $code, @param); } +# Lock config file using flock, run $code with @param, unlock config file. +# $timeout is the maximum time to acquire the flock +sub lock_config_full { + my ($class, $vmid, $timeout, $code, @param) = @_; + + return $lock_file_full_wrapper->($class, $vmid, $timeout, 0, $code, @param); +} + + # Lock config file using flock, run $code with @param, unlock config file. sub lock_config { my ($class, $vmid, $code, @param) = @_; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel