diff --git a/Netdisco/bin/netdisco-daemon b/Netdisco/bin/netdisco-daemon index d09664ce..5cd4584e 100755 --- a/Netdisco/bin/netdisco-daemon +++ b/Netdisco/bin/netdisco-daemon @@ -10,15 +10,14 @@ use Role::Tiny; use Try::Tiny; my $pp = Parallel::Prefork->new( - max_workers => (setting('daemon_workers') || 2), + max_workers => (setting('daemon_workers') || 5), spawn_interval => 1, - before_fork => \&next_worker_role, + before_fork => \&set_next_worker_role, after_fork => \®ister_worker, on_child_reap => \&unregister_worker, trap_signals => { TERM => 'TERM', INT => 'TERM', - HUP => undef, # catch but don't relay to workers }, ); @@ -34,7 +33,7 @@ newdaemon( ); sub gd_preconfig { - my $self = shift; + my $gd = shift; my $daemon = schema('daemon'); # deploy the daemon's local DB schema @@ -52,7 +51,7 @@ sub gd_preconfig { } # used for locking jobs in central Pg queue - $self->{nd_host} = hostfqdn; + $gd->{nd_host} = hostfqdn; # do not remove this line - required by Daemon::Generic return (); @@ -60,25 +59,25 @@ sub gd_preconfig { # main loop sub gd_run_body { - my $self = shift; + my $gd = shift; - $self->handle_term + $gd->handle_term if $pp->signal_received =~ m/^(?:TERM|INT)$/; - $self->handle_hup + $gd->handle_hup if $pp->signal_received eq 'HUP'; if ($pp->num_workers < $pp->max_workers) { $pp->start and return; with "Netdisco::Daemon::Worker::$next_role"; - print STDERR ">>> I am a $next_role Worker\n"; - $self->worker_body; + print STDERR ">>> new $next_role worker started.\n"; + $gd->worker_body; $pp->finish; } # I don't think Parallel::Prefork ever returns from start() # until a child exits. Not sure this is ever reached. - $self->gd_sleep( setting('daemon_sleep_time') || 5 ); + $gd->gd_sleep( setting('daemon_sleep_time') || 5 ); } sub register_worker { @@ -100,40 +99,34 @@ sub unregister_worker { catch { warn "error reverting jobs for pid $pid: $_\n" }; } -sub next_worker_role { - my $self = shift; +sub set_next_worker_role { + my $pp = shift; + $next_role = _find_next_worker_role(); +} +sub _find_next_worker_role { my @cur = values %workers; my $manager = scalar grep {$_ eq 'Manager'} @cur; my $poller = scalar grep {$_ eq 'Poller'} @cur; my $inter = scalar grep {$_ eq 'Interactive'} @cur; - if ($manager < 1) { - $next_role = 'Manager'; - return; - } + return 'Manager' if $manager < 1; - my $need_poller = $poller < (setting('daemon_pollers') || 0); - my $need_inter = $inter < (setting('daemon_interactive') || 2); + my $need_poller = $poller < (setting('daemon_pollers') || 2); + my $need_inter = $inter < (setting('daemon_interactives') || 2); if ($need_poller and $need_inter) { - $next_role = (int(rand(2)) ? 'Interactive' : 'Poller'); - return; + return (int(rand(2)) ? 'Interactive' : 'Poller'); } - $next_role = 'Interactive' if $need_inter; - $next_role = 'Poller' if $need_poller; -} - -sub handle_hup { - my $self = shift; - print "HUP is not supported. Please instead.\n"; + return 'Interactive' if $need_inter; + return 'Poller' if $need_poller; } sub handle_term { - my $self = shift; + my $gd = shift; $pp->wait_all_children; - $self->gd_quit_event + $gd->gd_quit_event } # in case we screw up and die ourselves diff --git a/Netdisco/config.yml b/Netdisco/config.yml index 50225a7d..518bed90 100644 --- a/Netdisco/config.yml +++ b/Netdisco/config.yml @@ -27,3 +27,8 @@ engines: end_tag: '%]' PRE_CHOMP: 1 +# how many daemon processes +# NB one worker will always be a Queue Manager +daemon_workers: 2 +daemon_pollers: 0 +daemon_interactives: 2