Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> --- changes v2 -> v3: * add comments * atomic_write_conf 'increase version parameter' changed to negated 'no_increase_version'. Almost all of the time we want to increase the version so this makes sense
data/PVE/Corosync.pm | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/data/PVE/Corosync.pm b/data/PVE/Corosync.pm index 9041d87..dc2f28b 100644 --- a/data/PVE/Corosync.pm +++ b/data/PVE/Corosync.pm @@ -132,21 +132,7 @@ sub write_conf { return $raw; } -sub conf_version { - my ($conf, $noerr, $new_value) = @_; - - my $totem = $conf->{main}->{totem}; - if (defined($totem) && defined($totem->{config_version})) { - $totem->{config_version} = $new_value if $new_value; - return $totem->{config_version}; - } - - return undef if $noerr; - - die "invalid corosync config - unable to read version\n"; -} - -# read only - use "rename corosync.conf.new corosync.conf" to write +# read only - use atomic_write_conf method to write PVE::Cluster::cfs_register_file('corosync.conf', \&parse_conf); # this is read/write PVE::Cluster::cfs_register_file('corosync.conf.new', \&parse_conf, @@ -168,17 +154,9 @@ sub check_conf_exists { sub update_nodelist { my ($conf, $nodelist) = @_; - delete $conf->{digest}; - - my $version = conf_version($conf); - conf_version($conf, undef, $version + 1); - $conf->{main}->{nodelist}->{node} = $nodelist; - PVE::Cluster::cfs_write_file("corosync.conf.new", $conf); - - rename("/etc/pve/corosync.conf.new", "/etc/pve/corosync.conf") - || die "activate corosync.conf.new failed - $!\n"; + atomic_write_conf($conf); } sub nodelist { @@ -191,4 +169,20 @@ sub totem_config { return clone($conf->{main}->{totem}); } +# caller must hold corosync.conf cfs lock if used in read-modify-write cycle +sub atomic_write_conf { + my ($conf, $no_increase_version) = @_; + + if (!$no_increase_version) { + die "invalid corosync config: unable to read config version\n" + if !defined($conf->{main}->{totem}->{config_version}); + $conf->{main}->{totem}->{config_version}++; + } + + PVE::Cluster::cfs_write_file("corosync.conf.new", $conf); + + rename("/etc/pve/corosync.conf.new", "/etc/pve/corosync.conf") + || die "activating corosync.conf.new failed - $!\n"; +} + 1; -- 2.11.0 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel