first pass at Manager worker

This commit is contained in:
Oliver Gorwits
2013-01-01 23:45:56 +00:00
parent e2b9fd3430
commit 61a3542834
4 changed files with 108 additions and 139 deletions

View File

@@ -10,6 +10,9 @@ use Dancer qw/:moose :script/;
# callbacks and local job queue management
use App::Netdisco::Daemon::Queue ':all';
# needed to quench AF_INET6 symbol errors
use NetAddr::IP::Lite ':lower';
use MCE;
use Role::Tiny;
use Path::Class 'dir';
@@ -64,29 +67,30 @@ sub worker_factory {
my $role = shift;
return sub {
my $self = shift;
# with "App::Netdisco::Daemon::Worker::$role";
with "App::Netdisco::Daemon::Worker::$role";
$self->worker_begin if $self->can('worker_begin');
};
}
__END__
sub interruptible_sleep {
my ($period) = @_;
my $hires = 0;
sub register_worker {
my (undef, $pid) = @_;
$workers{$pid} = $next_role;
}
sub unregister_worker {
my (undef, $pid, $status) = @_;
delete $workers{$pid};
# also check for bad exit status?
# revert any running jobs (will be such if child died)
try {
schema('daemon')->resultset('Admin')
->search({status => "running-$pid"})
->update({status => 'queued', started => undef});
if ($period * 1000 != int($period * 1000)) {
$hires = 1;
require Time::HiRes;
import Time::HiRes qw(time sleep);
}
catch { warn "error reverting jobs for pid $pid: $_\n" };
}
my $t = time;
while (time - $t < $period) {
if ($hires) {
my $p = (time - $t < 1)
? time - $t
: 1;
sleep($p);
} else {
sleep(1);
}
}
}