[pve-devel] [PATCH cluster v3 5/7] corosync: add atomic_write_conf and cleanup
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon Sep 18 10:32:56 CEST 2017
Signed-off-by: Thomas Lamprecht <t.lamprecht at 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
More information about the pve-devel
mailing list