Re: PoCo::Client::Ping intermittently fails to emit pings

Rocco Caputo <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
The post($sender, $event, ....) call sends $event response back to  
your code if send() fails.  The response address, round-trip time, and  
TTL are undefined.  The response time is "now".

You've added logging in a good place, if you want to solve this by  
modifying the module.  It might be better to catch the $event in your  
application and log the problem there.

-- 
Rocco Caputo - [email protected]


On Apr 21, 2009, at 16:31, Stuart Kendrick wrote:

> i'm walking through .../perl5/site_perl/5.10.0/POE/Component/Client/ 
> Ping.pm
>
> where do we emit an error if we are unable to send an ICMP packet?
>
>
>
> seems to me that we decide to send the ping in the very last line of  
> 'sub poco_ping_ping':
>
> [...]
> # Request a ping.  This code borrows heavily from Net::Ping.
>
> sub poco_ping_ping {
> [...]
>  _send_packet($kernel, $heap);
> }
>
>
> and we actually send the ping on line 362, within the '_send_packet'  
> routine, specifically, from the 'send' phrase within the 'unless'   
> clause:
>
>
> sub _send_packet {
>  my ($kernel, $heap) = @_;
>  return unless (scalar @{$heap->{queue}});
> [...]
>  # Send the packet.  If send() fails, then we bail with an error.
>  my @user_args = ();
>  ($event, @user_args) = @$event if ref($event) eq "ARRAY";
>
>  DEBUG and warn "sending packet sequence number $seq\n";
>  unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS,  
> $socket_address)) {
>    $kernel->post(
>      $sender, $event,
>      [ $address,    # REQ_ADDRESS
>        $timeout,    # REQ_TIMEOUT
>        time(),      # REQ_TIME
>        @user_args,  # REQ_USER_ARGS
>      ],
>      [ undef,   # RES_ADDRESS
>        undef,   # RES_ROUNDTRIP
>        time(),  # RES_TIME
>        undef,   # RES_TTL
>      ],
>    );
>    _check_for_close($kernel, $heap);
>    return;
>  }
> [...]
>
>
> now, i see the comment "If send() fails, then we bail with an  
> error".  but i don't see where we actually spit out an error  
> message.  seems to me that _send_packet returns with a value of 0  
> (that 'return' statement just after the call to  
> _check_for_close) ... but i don't see us checking the return value  
> of _send_packet, back in "sub poco_ping_ping"
>
>
> or ... does the "$kernel-post( ..." event trigger an error message,  
> through some mechanism i don't understand?
>
> would it be reasonable for me to add the following, in order to  
> track the success/failure of the call to send()  ?
>
> [...]
>  unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS,  
> $socket_address)) {
>    warn "Unable to send() ICMP packet";
>    $kernel->post(
> [...]
>
> or would i be duplicating effort performed elsewhere?
>
> actually, what i really want to do is to log such events to syslog,  
> so am i headed in a fruitful direction by adding the following?
>
> [...]
>  unless (send($heap->{socket_handle}, $msg, ICMP_FLAGS,  
> $socket_address)) {
>    use Sys::Syslog;
>    openlog('PoCo-Ping', 'nofatal,ndelay,pid', 'local0');
>    syslog('error', 'Unable to send() ICMP packet');
>    closelog();
>    $kernel->post(
> [...]
>
>
> --sk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.