[PATCH STABLE] changegroup: retry read() when partial data returned

Jun Wu quark at fb.com
Sun Mar 26 15:17:18 EDT 2017


The direction looks good. I'd like to see more solid code. Commented below.

Excerpts from Gregory Szorc's message of 2017-03-26 11:56:59 -0700:
> +    # Retry to get remaining data. In cases where the stream has errored or
> +    # is at EOF, this will do a bit of redundant work. But it helps prevent
> +    # intermittent failures and isn't common. So the overhead is acceptable.
> +    for i in range(3):

If "stream.read" does not behave as expected, assume it's totally broken.
So we need to reset the retry counter once we got data. Something like:

    def readexactly(..., retry=3):
        ....
        retryremaining = retry
        while True:
            chunk = stream.read(left)
            if not chunk:
                retryremaining -= 1
                if not retryremaining:
                    break
            retryremaining = retry
            left -= len(chunk)
            ....

> +        chunk = stream.read(left)
> +        chunks.append(chunk)
> +        left -= len(chunk)
> +        assert left >= 0
> +
> +        if not left:
> +            break
> +
> +    if left:
>          raise error.Abort(_("stream ended unexpectedly"
>                             " (got %d bytes, expected %d)")
> -                          % (len(s), n))
> -    return s
> +                          % (n - left, n))
> +
> +    return b''.join(chunks)
>  
>  def getchunk(stream):
>      """return the next chunk from stream as a string"""


More information about the Mercurial-devel mailing list