]> git.proxmox.com Git - pve-ha-manager.git/commitdiff
fix inf. loop error on orphaned workers
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 9 Feb 2016 07:56:10 +0000 (08:56 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 9 Feb 2016 07:56:10 +0000 (08:56 +0100)
src/PVE/HA/LRM.pm
src/PVE/HA/Tools.pm

index 1894f3c7b4e89da110881d701b5597596df147e6..eb7ac69fecda23e4de9019d493c4889637a82124 100644 (file)
@@ -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;
index 2814453b2b2e7ef13512d7630d5cc5eb6e29feb3..ada7fb6b5a81562769e3b1035b24ef136b4bec84 100644 (file)
@@ -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);