[pve-devel] applied: [PATCH manager 1/2] 5to6: more quorum / vote checking

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Jul 4 14:36:07 CEST 2019


On 7/4/19 1:52 PM, Fabian Grünbichler wrote:
> handle expected votes set to non-standard value, and try to adjust
> calculations for qdevice setups.
> 

applied with fixup, see below

> Signed-off-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
> ---
>  PVE/CLI/pve5to6.pm | 48 +++++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 45 insertions(+), 3 deletions(-)
> 
> diff --git a/PVE/CLI/pve5to6.pm b/PVE/CLI/pve5to6.pm
> index 45120265..2a1c02c2 100644
> --- a/PVE/CLI/pve5to6.pm
> +++ b/PVE/CLI/pve5to6.pm
> @@ -263,11 +263,38 @@ sub check_cluster_corosync {
>  
>      my $conf = PVE::Cluster::cfs_read_file('corosync.conf');
>      my $conf_nodelist = PVE::Corosync::nodelist($conf);
> +    my $node_votes = 0;
>  
>      if (!defined($conf_nodelist)) {
>  	log_fail("unable to retrieve nodelist from corosync.conf");
> -    } elsif (grep { $conf_nodelist->{$_}->{quorum_votes} != 1 } keys %$conf_nodelist) {
> -	log_warn("non-default quorum_votes distribution detected!");
> +    } else {
> +	if (grep { $conf_nodelist->{$_}->{quorum_votes} != 1 } keys %$conf_nodelist) {
> +	    log_warn("non-default quorum_votes distribution detected!");
> +	}
> +	map { $node_votes += $conf_nodelist->{$_}->{quorum_votes} // 0 } keys %$conf_nodelist;
> +    }
> +
> +    my ($expected_votes, $total_votes);
> +    my $filter_output = sub {
> +	my $line = shift;
> +	($expected_votes) = $line =~ /^Expected votes:\s*(\d+)\s*$/
> +	    if !defined($expected_votes);
> +	($total_votes) = $line =~ /^Total votes:\s*(\d+)\s*$/
> +	    if !defined($total_votes);
> +    };
> +    eval {
> +	PVE::Tools::run_command(['corosync-quorumtool', '-s'],
> +	                        outfunc => $filter_output,
> +	                        noerr => 1);
> +    };
> +
> +    if (!defined($expected_votes)) {
> +	log_fail("unable to get expected number of votes, setting to 0.");
> +	$expected_votes = 0;
> +    }
> +    if (!defined($total_votes)) {
> +	log_fail("unable to get expected number of votes, setting to 0.");
> +	$expected_votes = 0;

applied, with followup for above line: s/expected_votes/total_votes/


>      }
>  
>      my $cfs_nodelist = PVE::Cluster::get_clinfo()->{nodelist};
> @@ -276,10 +303,25 @@ sub check_cluster_corosync {
>  	log_fail("$offline_nodes nodes are offline!");
>      }
>  
> +    my $qdevice_votes = 0;
> +    if (my $qdevice_setup = $conf->{main}->{quorum}->{device}) {
> +	$qdevice_votes = $qdevice_setup->{votes} // 1;
> +    }
> +
> +    log_info("configured votes - nodes: $node_votes");
> +    log_info("configured votes - qdevice: $qdevice_votes");
> +    log_info("current expected votes: $expected_votes");
> +    log_info("current total votes: $total_votes");
> +
> +    log_warn("expected votes set to non-standard value '$expected_votes'.")
> +	if $expected_votes != $node_votes + $qdevice_votes;
> +    log_warn("total votes < expected votes: $total_votes/$expected_votes!")
> +	if $total_votes < $expected_votes;
> +
>      my $conf_nodelist_count = scalar(keys %$conf_nodelist);
>      my $cfs_nodelist_count = scalar(keys %$cfs_nodelist);
>      log_warn("cluster consists of less than three nodes!")
> -	if $conf_nodelist_count < 3;
> +	if $conf_nodelist_count < 3 && $conf_nodelist_count + $qdevice_votes < 3;
>  
>      log_fail("corosync.conf ($conf_nodelist_count) and pmxcfs ($cfs_nodelist_count) don't agree about size of nodelist.")
>  	if $conf_nodelist_count != $cfs_nodelist_count;
> 






More information about the pve-devel mailing list