App-aep
view release on metacpan or search on metacpan
lib/App/aep.pm view on Meta::CPAN
$wheel->put( $msg ) if $wheel;
$clients->{ $cid }->{ 'unknown_handled' } = 1;
}
elsif ( $default_act eq 'runlast' )
{
# Queue it - will be processed after order list exhaustion
push @{ poe->heap->{ 'lock' }->{ 'unknown_queue' } }, $cid
unless grep { $_ == $cid } @{ poe->heap->{ 'lock' }->{ 'unknown_queue' } };
}
else
{
# ignore
$debug->( 'STDERR', __LINE__, "Unknown lock-id '$lid' (cid $cid): ignoring (default=ignore)." );
$clients->{ $cid }->{ 'unknown_handled' } = 1;
}
}
return;
}
# Handle what happens when the lock order list is fully exhausted
sub _lock_server_handle_exhaust
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
my $opt = poe->heap->{ '_' }->{ 'opt' };
my $action = $opt->lock_server_exhaust_action || 'idle';
# First, run any "runlast" queued unknowns
my $queue = poe->heap->{ 'lock' }->{ 'unknown_queue' } || [];
for my $cid ( @{ $queue } )
{
$debug->( 'STDERR', __LINE__, "Exhaust: sending run to queued unknown cid $cid." );
my $msg = { 'event' => 'run' };
my $wheel = poe->heap->{ 'afunixsrv' }->{ 'client' }->{ 'obj' }->{ $cid }->{ 'wheel' };
$wheel->put( $msg ) if $wheel;
}
poe->heap->{ 'lock' }->{ 'unknown_queue' } = [];
if ( $action eq 'exit' )
{
$debug->( 'STDERR', __LINE__, "Lock order exhausted: exiting." );
poe->heap->{ '_' }->{ 'set_exit' }->( '0', 'lock-order-exhausted' );
poe->kernel->stop();
}
elsif ( $action eq 'restart' )
{
$debug->( 'STDERR', __LINE__, "Lock order exhausted: restarting order list." );
poe->heap->{ 'lock' }->{ 'order_idx' } = 0;
poe->heap->{ 'lock' }->{ 'order' } = [ map { [ @{ $_ } ] } @{ poe->heap->{ 'lock' }->{ 'order_orig' } } ];
poe->heap->{ 'lock' }->{ 'id2cid' } = {};
poe->heap->{ 'lock' }->{ 'step_completed' } = 0;
poe->heap->{ 'lock' }->{ 'run_sent' } = {};
}
elsif ( $action eq 'execute' )
{
$debug->( 'STDERR', __LINE__, "Lock order exhausted: starting own command." );
poe->kernel->yield( 'command_start' );
}
else
{
# idle - do nothing, just keep the event loop alive
$debug->( 'STDERR', __LINE__, "Lock order exhausted: idling." );
}
return;
}
# As client - handle input from the lock server
sub afunixcli_server_input ( $self, $input, $wid )
{
my $debug = poe->heap->{ '_' }->{ 'debug' };
# Increment the received packet count
poe->heap->{ 'afunixcli' }->{ 'server' }->{ 'rx_count' }++;
# Shortcut to the wheel the client is connected to
my $wheel = poe->heap->{ 'afunixcli' }->{ 'server' }->{ 'wheel' };
# Format the packet, should be small
my $packet = Dumper( $input );
$packet =~ s#[\r\n]##g;
$packet =~ s#\s+# #g;
$debug->( 'STDERR', __LINE__, "Server(-) RX: $packet", 'debug' );
my $event = $input->{ 'event' } || '';
# Server says run - start our command (post to main session, not this socket session)
if ( $event eq 'run' )
{
$debug->( 'STDERR', __LINE__, "Received 'run' from lock server, starting command." );
poe->heap->{ 'command' }->{ 'lock_cleared' } = 1;
# Cancel the timeout if one was set
poe->kernel->post( poe->heap->{ '_' }->{ 'main_session' }, 'lock_client_timeout_cancel' );
poe->kernel->post( poe->heap->{ '_' }->{ 'main_session' }, 'command_start' );
}
# Server sends health status
elsif ( $event eq 'health_status' )
{
require JSON::MaybeXS;
say STDOUT JSON::MaybeXS::encode_json( $input );
poe->heap->{ '_' }->{ 'set_exit' }->( 0, 'health-check-ok' );
poe->kernel->stop();
}
return;
}
# As server
sub afunixsrv_client_error ( $self, $syscall, $errno, $error, $wid )
{
my $cid = poe->heap->{ 'afunixsrv' }->{ 'client' }->{ 'wid2cid' }->{ $wid };
my $debug = poe->heap->{ '_' }->{ 'debug' };
if ( !$errno )
{
$error = "Normal disconnection for wheel: $wid, cid: $cid";
}
$debug->( 'STDERR', __LINE__, "Server session encountered $syscall error $errno: $error", 'error' );
( run in 1.491 second using v1.01-cache-2.11-cpan-df04353d9ac )