package App::MadEye::Plugin::Agent::Gearmand; use strict; use warnings; use App::MadEye::Plugin::Agent::Base; use Gearman::Util; use Socket qw(IPPROTO_TCP TCP_NODELAY SOL_SOCKET SOCK_STREAM); use IO::Socket::INET; use IO::Select; my $MSG = "WATCHINGWATCHING"; sub is_dead { my ( $self, $host ) = @_; my $conf = $self->config->{config}; my $port = $conf->{port} || 7003; my $connect_timeout = $conf->{connect_timeout} || 10; my $select_timeout = $conf->{select_timeout} || 10; my $sock = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Timeout => $connect_timeout, ); unless ($sock) { return "Cannot open Socket to $host:$port\n$!"; } $sock->blocking(0); setsockopt( $sock, IPPROTO_TCP, TCP_NODELAY, pack( "l", 1 ) ) or die; $sock->autoflush(1); my $req = Gearman::Util::pack_req_command( 'echo_req', $MSG ); Gearman::Util::send_req( $sock, \$req ); $sock->flush; my $select = IO::Select->new; $select->add($sock); my ( $can_read, ) = $select->can_read($select_timeout); unless ($can_read) { $sock->close; return "gearmand connection timeout : $host"; } my $err; my $res = Gearman::Util::read_res_packet( $sock, \$err ); if ( $res && $res->{type} eq "error" ) { die "Error packet from server after get_status: ${$res->{blobref}}\n"; } if ( $res && $res->{type} eq 'echo_res' && ${ $res->{blobref} } eq $MSG ) { $sock->close(); return; # alive } else { $sock->close(); return "gearmand response is invaild : $res->{type}"; } } 1; __END__ =for stopwords gearmand =head1 NAME App::MadEye::Plugin::Agent::Gearmand - monitoring gearmand =head1 SCHEMA type: map mapping: target: type: seq required: yes sequence: - type: str port: required: yes type: int connect_timeout: required: yes type: int select_timeout: required: yes type: int =head1 AUTHORS Tokuhiro Matsuno =head1 SEE ALSO L, L