From: Dietmar Maurer Date: Tue, 9 Feb 2016 07:56:10 +0000 (+0100) Subject: fix inf. loop error on orphaned workers X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=aaabde6a87011c18ec185317d5422b1a9b2093ef;p=pve-ha-manager.git fix inf. loop error on orphaned workers --- diff --git a/src/PVE/HA/LRM.pm b/src/PVE/HA/LRM.pm index 1894f3c..eb7ac69 100644 --- a/src/PVE/HA/LRM.pm +++ b/src/PVE/HA/LRM.pm @@ -376,11 +376,6 @@ sub run_workers { foreach my $sid (keys %{$self->{workers}}) { last if $count >= $max_workers; my $w = $self->{workers}->{$sid}; - my $cd = $sc->{$sid}; - if (!$cd) { - $haenv->log('err', "missing resource configuration for '$sid'"); - next; - } if (!$w->{pid}) { if ($haenv->can_fork()) { my $pid = fork(); @@ -393,7 +388,7 @@ sub run_workers { # do work my $res = -1; eval { - $res = $self->exec_resource_agent($sid, $cd, $w->{state}, $w->{target}); + $res = $self->exec_resource_agent($sid, $sc->{$sid}, $w->{state}, $w->{target}); }; if (my $err = $@) { $haenv->log('err', $err); @@ -407,7 +402,7 @@ sub run_workers { } else { my $res = -1; eval { - $res = $self->exec_resource_agent($sid, $cd, $w->{state}, $w->{target}); + $res = $self->exec_resource_agent($sid, $sc->{$sid}, $w->{state}, $w->{target}); $res = $res << 8 if $res > 0; }; if (my $err = $@) { @@ -573,7 +568,12 @@ sub handle_service_exitcode { my $tries = $self->{restart_tries}; my $sc = $haenv->read_service_config(); - my $cd = $sc->{$sid}; + + my $max_restart = 0; + + if (my $cd = $sc->{$sid}) { + $max_restart = $cd->{max_restart}; + } if ($cmd eq 'started') { @@ -588,7 +588,7 @@ sub handle_service_exitcode { $tries->{$sid} = 0 if !defined($tries->{$sid}); $tries->{$sid}++; - if ($tries->{$sid} >= $cd->{max_restart}) { + if ($tries->{$sid} >= $max_restart) { $haenv->log('err', "unable to start service $sid on local node". " after $tries->{$sid} retries"); $tries->{$sid} = 0; @@ -623,6 +623,11 @@ sub exec_resource_agent { return EUNKNOWN_SERVICE_TYPE; } + if (!$service_config) { + $haenv->log('err', "missing resource configuration for '$sid'"); + return EUNKNOWN_SERVICE; + } + if ($service_config->{node} ne $nodename) { $haenv->log('err', "service '$sid' not on this node"); return EWRONG_NODE; diff --git a/src/PVE/HA/Tools.pm b/src/PVE/HA/Tools.pm index 2814453..ada7fb6 100644 --- a/src/PVE/HA/Tools.pm +++ b/src/PVE/HA/Tools.pm @@ -18,12 +18,13 @@ use constant { EUNKNOWN_SERVICE_TYPE => 4, # no plugin for this type service found EUNKNOWN_COMMAND => 5, EINVALID_PARAMETER => 6, + EUNKNOWN_SERVICE => 7, # service not found }; # get constants out of package in a somewhat easy way use base 'Exporter'; our @EXPORT_OK = qw(SUCCESS ERROR EWRONG_NODE EUNKNOWN_SERVICE_TYPE - EUNKNOWN_COMMAND EINVALID_PARAMETER ETRY_AGAIN); + EUNKNOWN_COMMAND EINVALID_PARAMETER ETRY_AGAIN EUNKNOWN_SERVICE); our %EXPORT_TAGS = ( 'exit_codes' => [@EXPORT_OK] ); PVE::JSONSchema::register_format('pve-ha-resource-id', \&pve_verify_ha_resource_id);