potential pipe-lining corruption fix

Brad Fitzpatrick brad at danga.com
Wed Sep 20 02:11:26 UTC 2006


Thanks!

On Tue, 19 Sep 2006, dormando wrote:

> I can't screw with the site past 4:30pm, so first thing tomorrow morning
> I'll patch (hopefully just one of?) the LB's and try it out.
>
> Thanks!
> -Alan
>
> Brad Fitzpatrick wrote:
> > Today at the MogileFS summit Alan (from http://www.gaiaonline.com/)
> > mentioned that if he enables persistent backend connections, users get
> > mismatched requests to responses.... but not when he accesses it.  And it
> > takes awhile to happen during low load.
> >
> > All this pointed to errors handling malformed client requests, and sure
> > enough, I think this is it....
> >
> > We don't disconnect users who do pipelining.  I was able to sneak through
> > multiple requests to the backend and then two requests would come back,
> > but they'd be assigned to different users.
> >
> > This fix doesn't break the test suite, but before I commit, Alan --- can
> > you verify it fixes things for you?
> >
> >
> >
> > Index: lib/Perlbal/ClientProxy.pm
> > ===================================================================
> > --- lib/Perlbal/ClientProxy.pm  (revision 565)
> > +++ lib/Perlbal/ClientProxy.pm  (working copy)
> > @@ -584,13 +584,11 @@
> >      # (see: Danga::Socket::read)
> >      return $self->client_disconnected unless defined $bref;
> >
> > -    # if we got data that we weren't expecting, something's bogus with
> > -    # our state machine (internal error)
> > -    if (defined $remain && ! $remain) {
> > -        my $blen = length($$bref);
> > -        my $content = substr($$bref, 0, 80 < $blen ? 80 : $blen);
> > -        Carp::cluck("INTERNAL ERROR: event_read called on when we're expecting no more bytes.  len=$blen, content=[$content]\n");
> > -        $self->close;
> > +    # if they didn't declare a content body length and we just got a
> > +    # readable event that's not a disconnect, something's messed up.
> > +    # they're overflowing us.  disconnect!
> > +    if (! $remain) {
> > +        $self->close("over_wrote");
> >          return;
> >      }
> >
> >
> > - Brad
>
>


More information about the perlbal mailing list