Changeset 3847

Show
Ignore:
Timestamp:
07/28/10 19:15:11 (1 month ago)
Author:
ligne
Message:

move the code for restarting crashed pollers into it's own method. it should be just about testable that way :-)

update the pid -> service hash as part of the poller launch process.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/node/lib/Munin/Node/ProxySpooler.pm

    r3845 r3847  
    4848 
    4949    my $self = __PACKAGE__->new(%args); 
    50  
    51     my %poller_restarted;  # when each service's poller was last restarted 
    5250 
    5351    croak "No pidfile specified" unless $args{pid_file}; 
     
    9088    # Reap any dead pollers 
    9189    while (my $deceased = wait) { 
    92         if ($deceased < 0) { 
    93             last if $!{ECHILD};  # all the children are dead! 
    94             logger("wait() error: $!"); 
    95         } 
    96  
    97         my $service = delete $self->{pollers}->{$deceased}; 
    98  
    99         my $exit   = ($? >> 8); 
    100         my $signal = ($? & 127); 
    101         logger("Poller $deceased ($service) exited with $exit/$signal"); 
    102  
    103         # avoid restarting the poller if it was last restarted too recently. 
    104         if (time - ($poller_restarted{$service} || 0) < 10) { 
    105             logger("Poller for '$service' last restarted at $poller_restarted{$service}.  Giving up."); 
    106             next; 
    107         } 
    108  
    109         # Respawn the poller 
    110         logger("Respawning poller for '$service'"); 
    111         my $new_pid = $self->_launch_single_poller($service, $self->{intervals}->{$service}); 
    112         $self->{pollers}{$new_pid} = $service; 
    113         $poller_restarted{$service} = time; 
     90        $self->_restart_poller($deceased); 
    11491    } 
    11592 
     
    204181    while (my ($service, $interval) = each %$intervals) { 
    205182        my $poller_pid = $self->_launch_single_poller($service, $interval); 
    206         $pollers{$poller_pid} = $service; 
    207     } 
    208  
    209     $self->{pollers} = \%pollers; 
     183    } 
    210184 
    211185    return; 
     
    221195 
    222196    if (my $poller_pid = safe_fork()) { 
    223         # report back to parent 
    224197        logger("Poller for '$service' running with pid $poller_pid") 
    225198            if $config->{DEBUG}; 
    226         return $poller_pid; 
     199 
     200        $self->{pollers}{$poller_pid} = $service; 
     201 
     202        return; 
    227203    } 
    228204 
     
    288264 
    289265 
     266sub _restart_poller 
     267{ 
     268    my ($self, $deceased) = @_; 
     269 
     270    if ($deceased < 0) { 
     271        last if $!{ECHILD};  # all the children are dead! 
     272        logger("wait() error: $!"); 
     273    } 
     274 
     275    my $service = delete $self->{pollers}->{$deceased}; 
     276 
     277    my $exit   = ($? >> 8); 
     278    my $signal = ($? & 127); 
     279    logger("Poller $deceased ($service) exited with $exit/$signal"); 
     280 
     281    # avoid restarting the poller if it was last restarted too recently. 
     282    if (time - ($self->{poller_restarted}{$service} || 0) < 10) { 
     283        logger("Poller for '$service' last restarted at $self->{poller_restarted}{$service}.  Giving up."); 
     284        return; 
     285    } 
     286 
     287    # Respawn the poller 
     288    logger("Respawning poller for '$service'"); 
     289    $self->_launch_single_poller($service, $self->{intervals}{$service}); 
     290    $self->{poller_restarted}{$service} = time; 
     291 
     292    return; 
     293} 
     294 
    290295### NODE INTERACTION ########################################################### 
    291296