--- nfo/perl/libs/POE/Component/LookupClient.pm 2003/06/29 01:35:29 1.1 +++ nfo/perl/libs/POE/Component/LookupClient.pm 2003/07/01 13:05:01 1.2 @@ -1,7 +1,10 @@ ## ------------------------------------------------------------------------ -## $Id: LookupClient.pm,v 1.1 2003/06/29 01:35:29 joko Exp $ +## $Id: LookupClient.pm,v 1.2 2003/07/01 13:05:01 joko Exp $ ## ------------------------------------------------------------------------ ## $Log: LookupClient.pm,v $ +## Revision 1.2 2003/07/01 13:05:01 joko +## major changes, tried to clean up shutdown phase - the watchdog-mech didn't work out well..... - what's about IKC's monitor? does it work on Linux? +## ## Revision 1.1 2003/06/29 01:35:29 joko ## initial commit ## @@ -29,7 +32,7 @@ #my $event_handler = lookupd->new(); POE::Session->create( object_states => [ - $self => [qw( _start _stop boot_intercom )] + $self => [qw( _start _stop boot_intercom start_session waste_time watchdog )] ] ); @@ -76,20 +79,73 @@ create_ikc_client( host => $host, port => 30, - name => 'Client', + #name => 'Client', + #on_connect => sub { $self->build(); }, on_connect => sub { $self->build(); }, - subscribe => [qw( poe://LookupService/ServiceRegistrar/ )], - ); + #subscribe => [qw( poe://LookupService/ServiceRegistrar )], + #subscribe => [qw( poe://LookupService/ServiceRegistrar )], + ); + + #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' }); + #$kernel->post( IKC => 'monitor', 'LookupService' => { register => 'start_session' }); + #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' ); + + # start up the watchdog which monitors the required IKC intercom session + #$kernel->yield('waste_time'); + #$kernel->delay('watchdog', 2); }; +sub start_session { + #my $self = shift; + print STDERR "start_session", "\n"; +} + sub build { my $self = shift; - #print "BUILD", "\n"; + print "build", "\n"; # create sessions that depend on the foreign kernel. POE::Component::LookupClient::Session->new(); } +sub watchdog { + my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; + $self->debug("watchdog"); + + #$kernel->post( IKC => 'monitor', '*' => { register => 'start_session' }); + + #if (not defined $kernel->alias_resolve('DeviceClient')) { + if (not defined $kernel->alias_resolve('IKC')) { + print STDERR "Session died, trying to restart!", "\n"; + #$kernel->yield('boot_intercom'); + return; + } + + $kernel->delay('watchdog', 2); +}; + +#------------------------------------------------------------------------------ +# This event keeps this POE kernel alive. +# (stolen from POE::Component::IKC::Server, but not used 'til now...) +sub waste_time { + my($kernel, $heap)=@_[KERNEL, HEAP]; + return if $heap->{'is a child'}; + + unless($heap->{'been told we are parent'}) { + warn "$$: Telling everyone we are the parent\n"; + $heap->{'been told we are parent'}=1; + $kernel->signal($kernel, '__parent'); + } + if($heap->{'die'}) { + #DEBUG and warn "$$: Orderly shutdown\n"; + } else { + $kernel->yield('watchdog'); + $kernel->delay('waste_time', 60); + } + return; +} + + package POE::Component::LookupClient::Session; @@ -112,7 +168,7 @@ POE::Session->create( object_states => [ - $self => [qw( _start _stop response register_lease renew_lease )] + $self => [qw( _start _stop on_response on_subscribe register_lease renew_lease remote_shutdown remote_timeout )] ] ); @@ -138,29 +194,52 @@ # set up communication channel for asynchronous responses $kernel->alias_set('DeviceClient'); - $kernel->post('IKC', 'publish', 'DeviceClient', [qw( response )]); - - # try to register on startup - $kernel->yield('register_lease'); + $kernel->post('IKC', 'publish', 'DeviceClient', [qw( on_response )]); + + #$kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'poe:start_session' ); + + $kernel->post( IKC => 'subscribe', [qw( poe://LookupService/ServiceRegistrar )], 'on_subscribe' ); + + # try to register on startup? + #$kernel->yield('register_lease'); }; sub _stop { my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; $self->debug("_stop"); + + # try to re-register if session dies? + #$kernel->yield('register_lease'); + + #$kernel->alias_remove('DeviceClient'); + + #$self = undef; }; + +# Subscription receipt callback, see "perldoc POE::Component::IKC::Responder". +sub on_subscribe { + my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; + $self->debug("on_subscribe"); + # register lease on subscription + $kernel->yield('register_lease'); +} + # Main response dispatcher, this should dispatch to local states programmatically. -sub response { +sub on_response { my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; #$self->debug("response"); + $heap->{'cancel timeout'} = 1; + my $payload = $_[ARG0]; $payload ||= ''; # If registration succeeded, start the renewal cycle. if ($payload eq 'REG_OK') { - $self->debug("Starting lease loop."); + $self->debug("Starting lease renewal loop."); + #$kernel->post( IKC => 'monitor', '*' => { shutdown => 'remote_shutdown' }); $kernel->yield( 'renew_lease' ); } elsif ($payload eq 'LEASE_OK') { @@ -172,6 +251,7 @@ } else { #print Dumper($payload); $heap->{'destroy lease'} = 1; + #$kernel->alarm_remove_all(); } @@ -180,35 +260,127 @@ sub register_lease { my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; $self->debug("register_lease"); + my $ONE_arg = "Hello World!"; # V1 - without subscription #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/register_lease", $ONE_arg); # V2 - with subscription - $kernel->post( "poe://LookupService/ServiceRegistrar", "register_lease", $ONE_arg); + $kernel->post( "poe://LookupService/ServiceRegistrar", "register_lease", $ONE_arg ); } sub renew_lease { my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; if ($heap->{'destroy lease'}) { - $heap->{'destroy lease'} = 0; + #$heap->{'destroy lease'} = 0; + #$kernel->delay_set('remote_timeout'); $self->debug("destroyed lease"); + #undef $self; + #$kernel->alias_remove('DeviceClient'); + #undef $_[SESSION]; + #$kernel->post( 'IKC' => 'shutdown' ); + # clear delayed posts + #$kernel->delay('renew_lease'); + #$kernel->delay('remote_timeout'); return; } $self->debug("renew_lease"); - + + # check if remote kernel(s) are still around + #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', '', 'poe:remote_timeout'); + #$kernel->post('IKC', 'call', 'poe://LookupService/IKC/ping', undef, 'poe:remote_timeout'); + #$kernel->post('poe://remote/IKC', 'ping', 'poe:remote_timeout'); + #$kernel->delay('remote_timeout', 5); # timeout + my $ONE_arg = ''; #$kernel->post('IKC', 'post', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg); # V1 - without subscription - $kernel->post('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:response'); + $kernel->post('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:on_response'); + # V2 - with subscription #my $resp = $kernel->call( "poe://LookupService/ServiceRegistrar", "renew_lease", $ONE_arg); #print $resp, "\n"; - + + # V3 - have we been able to post? + #my $resp = $kernel->call('IKC', 'call', "poe://LookupService/ServiceRegistrar/renew_lease", $ONE_arg, 'poe:response'); + #print "resp: $resp", "\n"; + # and again... $kernel->delay('renew_lease', 15); + #$kernel->delay_set('renew_lease', 15); + #$kernel->delay_add('renew_lease', 15); + + # timeout!? + #$kernel->delay('remote_timeout', 20); + $kernel->delay_add('remote_timeout', 20); + #$kernel->delay_set('remote_timeout', 5); + #$kernel->delay_set('remote_timeout', 20); + +} + +sub remote_shutdown { + my ( $self, $kernel, $heap ) = @_[ OBJECT, KERNEL, HEAP ]; + $self->debug("remote_shutdown"); +} + +sub remote_timeout { + + #my ($pong) = $_[ARG0]; + #return if $pong; # all is cool + + my ($self, $kernel, $heap) = @_[OBJECT, KERNEL, HEAP]; + +#=pod + if ($heap->{'cancel timeout'}) { + $heap->{'cancel timeout'} = 0; + return; + } +#=cut + + $self->debug("remote_timeout"); + + $heap->{'destroy lease'} = 1; + + # YOW! Remote kernel timed out. RUN AROUND SCREAMING! + print STDERR "# YOW! Remote kernel timed out. RUN AROUND SCREAMING!", "\n"; + + # free all resources that keep this session running + $kernel->delay('renew_lease'); + $kernel->delay('remote_timeout'); + + #$kernel->post( 'IKC' => 'shutdown' ); + + #$kernel->alias_remove('DeviceClient'); + + #$kernel->alias_remove('DeviceClient'); + #$kernel->yield('renew_lease'); + + #sub POE::Component::IKC::Responder::DEBUG { return 1; } + #$kernel->post( 'IKC' => 'unregister' ); + + #print Dumper($kernel->alias_list()); + + $kernel->post( IKC => 'retract', 'DeviceClient' => [qw( on_response )]); + #$kernel->post( IKC => 'retract', 'me' => [qw( on_response )]); + $kernel->post( IKC => 'unsubscribe', [qw( poe://LookupService/ServiceRegistrar )]); + $kernel->post( IKC => 'unregister', [qw( poe://LookupService )]); + #$kernel->post( IKC => 'unsubscribe', [qw( poe://me )]); + #$kernel->post( IKC => 'unregister', [qw( poe://me )]); + #$kernel->run_one_timeslice(); + #$kernel->run_one_timeslice(); + #$kernel->run_one_timeslice(); + #return; + + $kernel->post( 'IKC' => 'shutdown' ); + #$kernel->run_one_timeslice(); + #$kernel->run_one_timeslice(); + + $kernel->alias_remove('DeviceClient'); + #$kernel->run_one_timeslice(); + #$kernel->run_one_timeslice(); + } 1;