potential pipe-lining corruption fix

dormando dormando at rydia.net
Wed Sep 20 01:38:15 UTC 2006


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