[pve-devel] [PATCH cluster v3 4/7] corosync: transform config to allow easier access

Wolfgang Bumiller w.bumiller at proxmox.com
Wed Sep 20 14:06:41 CEST 2017


On Mon, Sep 18, 2017 at 10:32:55AM +0200, Thomas Lamprecht wrote:
> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
> ---
> 
> changes v2 -> v3:
>  * use map instead of foreach in transform helpers
>  * rename those helper to conciser names
> 
>  data/PVE/Corosync.pm | 51 +++++++++++++++++++++++----------------------------
>  1 file changed, 23 insertions(+), 28 deletions(-)
> 
> diff --git a/data/PVE/Corosync.pm b/data/PVE/Corosync.pm
> index eaa5e39..9041d87 100644
> --- a/data/PVE/Corosync.pm
> +++ b/data/PVE/Corosync.pm
> @@ -70,6 +70,15 @@ sub parse_conf {
>  	$section->{$key} = $value;
>      }
>  
> +    # make working with the config way easier
> +    my $array_to_hash = sub {
> +	my ($section_array, $key_id) = @_;
> +	return { map { $_->{$key_id} => $_ } @$section_array };
> +    };
> +    my ($totem, $nodelist) = $conf->{main}->@{"totem", "nodelist"};
> +    $nodelist->{node} = &$array_to_hash($nodelist->{node}, 'name');

At this point we should probably copy ring0_addr into name if name is
not set. We can then also drop the name||ring0_addr cases from patch 3.
Otherwise this errors out and results in an empty node list in the
corosync config and a broken cluster if your cluster is old enough ;-)

> +    $totem->{interface} = &$array_to_hash($totem->{interface}, 'ringnumber');
> +
>      $conf->{digest} = $digest;
>  
>      return $conf;
> @@ -107,9 +116,18 @@ $dump_section = sub {
>  sub write_conf {
>      my ($filename, $conf) = @_;
>  
> -    die "no main section" if !defined($conf->{main});
> +    my $c = clone($conf->{main}) // die "no main section";
> +
> +    # retransform back for easier dumping
> +    my $hash_to_array = sub {
> +	my ($hash) = @_;
> +	return [ $hash->@{sort keys %$hash} ];
> +    };
>  
> -    my $raw = &$dump_section($conf->{main}, '');
> +    $c->{nodelist}->{node} = &$hash_to_array($c->{nodelist}->{node});
> +    $c->{totem}->{interface} = &$hash_to_array($c->{totem}->{interface});
> +
> +    my $raw = &$dump_section($c, '');
>  
>      return $raw;
>  }
> @@ -155,7 +173,7 @@ sub update_nodelist {
>      my $version = conf_version($conf);
>      conf_version($conf, undef, $version + 1);
>  
> -    $conf->{main}->{nodelist}->{node} = [values %$nodelist];
> +    $conf->{main}->{nodelist}->{node} = $nodelist;
>  
>      PVE::Cluster::cfs_write_file("corosync.conf.new", $conf);
>  
> @@ -165,35 +183,12 @@ sub update_nodelist {
>  
>  sub nodelist {
>      my ($conf) = @_;
> -
> -    my $nodelist = {};
> -
> -    my $nodes = $conf->{main}->{nodelist}->{node};
> -
> -    foreach my $node (@$nodes) {
> -	# use 'name' over 'ring0_addr' if set
> -	my $name = $node->{name} // $node->{ring0_addr};
> -	if ($name) {
> -	    $nodelist->{$name} = $node;
> -	}
> -    }
> -
> -    return $nodelist;
> +    return clone($conf->{main}->{nodelist}->{node});
>  }
>  
>  sub totem_config {
>      my ($conf) = @_;
> -
> -    # we reorder elements from totem->interface and don't want to change $conf
> -    my $totem = clone($conf->{main}->{totem});
> -    my $ifs = $totem->{interface};
> -
> -    $totem->{interface} = {};
> -    foreach my $if (@$ifs) {
> -	$totem->{interface}->{$if->{ringnumber}} = $if;
> -    }
> -
> -    return $totem;
> +    return clone($conf->{main}->{totem});
>  }
>  
>  1;
> -- 
> 2.11.0




More information about the pve-devel mailing list