Beekeeper
view release on metacpan or search on metacpan
lib/Beekeeper/Service/Supervisor/Worker.pm view on Meta::CPAN
sub get_services_status {
my ($self, $args) = @_;
my $workers = $self->_get_workers(
host => $args->{host},
pool => $args->{pool},
class => $args->{class},
);
my %services;
foreach my $worker (@$workers) {
$services{$worker->{class}}{count}++;
$services{$worker->{class}}{cps} += $worker->{cps};
$services{$worker->{class}}{nps} += $worker->{nps};
$services{$worker->{class}}{err} += $worker->{err};
$services{$worker->{class}}{cpu} += $worker->{cpu} || 0;
$services{$worker->{class}}{mem} += $worker->{mem} || 0;
$services{$worker->{class}}{load} += $worker->{load};
}
foreach my $service (values %services) {
$service->{load} = $service->{load} / $service->{count};
}
foreach my $service (values %services) {
$service->{cps} = sprintf("%.2f", $service->{cps} );
$service->{nps} = sprintf("%.2f", $service->{nps} );
$service->{err} = sprintf("%.2f", $service->{err} );
$service->{cpu} = sprintf("%.2f", $service->{cpu} );
$service->{mem} = sprintf("%.2f", $service->{mem} );
$service->{load} = sprintf("%.2f", $service->{load});
}
return \%services;
}
sub restart_workers {
my ($self, $args) = @_;
return if ($args->{host} && $args->{host} ne $self->{host});
return if ($args->{pool} && $args->{pool} ne $self->{pool});
my $workers = $self->_get_workers(
host => $self->{host},
pool => $self->{pool},
class => $args->{class},
);
log_info "Restarting workers" . ($args->{class} ? " $args->{class}..." : "...");
my @worker_pids;
foreach my $worker (@$workers) {
# Do not restart supervisor
next if ($worker->{class} eq 'Beekeeper::Service::Supervisor::Worker');
my ($pid) = ($worker->{pid} =~ m/^(\d+)$/); # untaint
push @worker_pids, $pid if ($pid);
}
if (!$args->{delay}) {
# Restart all workers at once
foreach my $pid (@worker_pids) {
kill( 'TERM', $pid );
}
}
else {
# Slowly restart all workers
my $delay = $args->{delay};
my $count = 0;
foreach my $pid (@worker_pids) {
$self->{restart_worker_tmr}->{$pid} = AnyEvent->timer(
after => $delay * $count++,
cb => sub {
delete $self->{restart_worker_tmr}->{$pid};
kill( 'TERM', $pid );
},
);
}
}
}
sub restart_pool {
my ($self, $args) = @_;
return if ($args->{host} && $args->{host} ne $self->{host});
return if ($args->{pool} && $args->{pool} ne $self->{pool});
my $wpool_pid = $self->{_WORKER}->{parent_pid};
my $delay = $args->{delay};
if (!$delay) {
kill( 'HUP', $wpool_pid );
}
else {
my $index = $self->_get_pool_index( $self->{host}, $self->{pool} );
$self->{restart_pool_tmr} = AnyEvent->timer(
after => $delay * $index,
cb => sub {
delete $self->{restart_pool_tmr};
kill( 'HUP', $wpool_pid );
},
);
}
}
sub _get_pool_index {
my ($self, $host, $pool) = @_;
# Sort all pools by name, then return the index of the requested one.
# Used by restart_pool() to determine restart order across hosts
my %pools;
( run in 1.083 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )