1 ### simple package for handling the stream request port
2 package Mogstored
::SideChannelClient
;
5 use base
qw{Perlbal
::Socket
};
7 'count', # how many requests we've serviced
8 'read_buf', # unprocessed read buffer
9 'mogsvc', # the mogstored Perlbal::Service object
12 # needed since we're pretending to be a Perlbal::Socket... never idle out
13 sub max_idle_time
{ return 0; }
16 my Mogstored
::SideChannelClient
$self = shift;
17 $self = fields
::new
($self) unless ref $self;
18 $self->SUPER::new
(@_);
20 $self->{read_buf
} = '';
21 $self->{mogsvc
} = Perlbal
->service('mogstored');
26 my Mogstored
::SideChannelClient
$self = shift;
28 my $bref = $self->read(1024);
29 return $self->close unless defined $bref;
30 $self->{read_buf
} .= $$bref;
32 my $path = $self->{mogsvc
}->{docroot
};
34 while ($self->{read_buf
} =~ s/^(.+?)\r?\n//) {
36 if ($cmd =~ /^size (\S+)$/) {
43 $self->write("ERROR: uri invalid (contains ..)\r\n");
47 # now stat the file to get the size and such
48 Perlbal
::AIO
::aio_stat
("$path$uri", sub {
49 return if $self->{closed
};
50 my $size = -e _ ?
-s _
: -1;
51 $self->write("$uri $size\r\n");
53 } elsif ($cmd =~ /^watch$/i) {
54 unless (Mogstored
->iostat_available) {
55 $self->write("ERR iostat unavailable\r\n");
59 Mogstored
->iostat_subscribe($self);
61 # we don't understand this so pass it on to manage command interface
63 Perlbal
::run_manage_command
($cmd, sub { push @out, $_[0]; });
64 $self->write(join("\r\n", @out) . "\r\n");
69 # stop watching writeability if we've nothing else to
70 # write to them. else just kick off more writes.
73 $self->watch_write(0) if $self->write(undef);
76 # override Danga::Socket's event handlers which die
77 sub event_err
{ $_[0]->close; }
78 sub event_hup
{ $_[0]->close; }
82 my Mogstored
::SideChannelClient
$self = shift;
84 my $ret = $self->SUPER::as_string
;
85 $ret .= "; size_requests=$self->{count}";
91 my Mogstored
::SideChannelClient
$self = shift;
92 Mogstored
->iostat_unsubscribe($self);
97 Mogstored
->on_sidechannel_die_gracefully;