Changeset 770

Show
Ignore:
Timestamp:
03/15/07 20:18:53 (2 years ago)
Author:
bradfitz
Message:

+ * make perlbal's "shutdown graceful" work, by not doing
+ sidechannel accepting ourselves (which never hung up),
+ but subclass Perlbal's TCPListener class, which does it
+ all correctly.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/server/CHANGES.mogstored

    r520 r770  
     12007-03-15: 
     2        * this changelog is totally neglected.  :/  see svn log. 
     3 
     4        * make perlbal's "shutdown graceful" work, by not doing 
     5          sidechannel accepting ourselves (which never hung up), 
     6          but subclass Perlbal's TCPListener class, which does it 
     7          all correctly. 
     8 
    192006-12-27: 
    210        * kill child processes (diskusage and iostat) when being killed. 
  • trunk/server/mogstored

    r768 r770  
    113113   SET persist_client = 1 
    114114ENABLE mogstored 
     115 
     116# don't listen... this is just a stub service. 
     117CREATE SERVICE mgmt 
     118   SET role = management 
     119ENABLE mgmt 
    115120"; 
    116121 
     
    300305 
    301306sub setup_sidechannel_listener { 
    302     # setup a new socket for handling size requests 
    303     my $server = IO::Socket::INET->new(LocalAddr => $mgmt_listen, 
    304                                        Type      => SOCK_STREAM, 
    305                                        Proto     => 'tcp', 
    306                                        Blocking  => 0, 
    307                                        Reuse     => 1, 
    308                                        Listen    => 10 ) 
    309         or die "Error creating management socket: $@\n"; 
    310  
    311     # in Perl 5.6, we weren't always seeing this turned off by IO::Socket 
    312     # so we have to do it manually here just to be sure. 
    313     IO::Handle::blocking($server, 0); 
    314  
    315     # accept handler for new workers 
    316     my $accept_handler = sub { 
    317         my $csock = $server->accept or return; 
    318         IO::Handle::blocking($csock, 0); 
    319         my $client = SideChannelClient->new($csock); 
    320         $client->watch_read(1); 
    321     }; 
    322  
    323     # add to fd list so this one gets processed 
    324     Perlbal::Socket->AddOtherFds(fileno($server) => $accept_handler); 
     307    Mogstored::SideChannelListener->new($mgmt_listen); 
    325308} 
    326309 
     
    506489 
    507490############################################################################# 
     491package Mogstored::SideChannelListener; 
     492use strict; 
     493use base 'Perlbal::TCPListener'; 
     494 
     495sub new { 
     496    my ($class, $hostport) = @_; 
     497    # we don't _really_ need this, but TCPListener kinda does, to keep it from 
     498    # exploding/warning.  so we created this stub service above in our static 
     499    # config, just for this. 
     500    my $svc    = Perlbal->service("mgmt") or die "Where is mgmt service?"; 
     501    return $class->SUPER::new($hostport, $svc); 
     502} 
     503 
     504sub event_read { 
     505    my $self = shift; 
     506    # accept as many connections as we can 
     507    while (my ($csock, $peeraddr) = $self->{sock}->accept) { 
     508        IO::Handle::blocking($csock, 0); 
     509        my $client = Mogstored::SideChannelClient->new($csock); 
     510        $client->watch_read(1); 
     511    } 
     512} 
     513 
     514############################################################################# 
    508515### simple package for handling the stream request port 
    509 package SideChannelClient; 
     516package Mogstored::SideChannelClient; 
    510517 
    511518use strict; 
    512 use base qw{Danga::Socket}; 
     519use base qw{Perlbal::Socket}; 
    513520use fields ( 
    514521            'count',      # how many requests we've serviced 
     
    521528 
    522529sub new { 
    523     my SideChannelClient $self = shift; 
     530    my Mogstored::SideChannelClient $self = shift; 
    524531    $self = fields::new($self) unless ref $self; 
    525532    $self->SUPER::new(@_); 
     
    531538 
    532539sub event_read { 
    533     my SideChannelClient $self = shift; 
     540    my Mogstored::SideChannelClient $self = shift; 
    534541 
    535542    my $bref = $self->read(1024); 
     
    580587# as_string handler 
    581588sub as_string { 
    582     my SideChannelClient $self = shift; 
     589    my Mogstored::SideChannelClient $self = shift; 
    583590 
    584591    my $ret = $self->SUPER::as_string; 
     
    589596 
    590597sub close { 
    591     my SideChannelClient $self = shift; 
     598    my Mogstored::SideChannelClient $self = shift; 
    592599    main::iostat_unsubscribe($self); 
    593600    $self->SUPER::close;