[pve-devel] [PATCH cluster 5/7] corosync: add atomic_write_conf and cleanup

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Aug 3 10:03:09 CEST 2017


remove conf_version, with the new config representation it is easy to get
the version.
The version increase here was not quite fitting and only needed on config
update, i.e. config write, so add it as a boolean switch to the new
atomic_write_conf method.

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 data/PVE/Corosync.pm | 39 ++++++++++++++++-----------------------
 1 file changed, 16 insertions(+), 23 deletions(-)

diff --git a/data/PVE/Corosync.pm b/data/PVE/Corosync.pm
index 1180316..1d58bf0 100644
--- a/data/PVE/Corosync.pm
+++ b/data/PVE/Corosync.pm
@@ -146,20 +146,6 @@ 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
 PVE::Cluster::cfs_register_file('corosync.conf', \&parse_conf);
 # this is read/write
@@ -182,17 +168,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, 1);
 }
 
 sub nodelist {
@@ -205,4 +183,19 @@ sub totem_config {
     return clone($conf->{main}->{totem});
 }
 
+sub atomic_write_conf {
+    my ($conf, $increase_version) = @_;
+
+    if ($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




More information about the pve-devel mailing list