Tentative fix for usehttp2=true

Peter Arrenbrecht peter.arrenbrecht at gmail.com
Thu May 12 16:56:32 CDT 2011


On Thu, May 12, 2011 at 11:00 PM, Augie Fackler <durin42 at gmail.com> wrote:
> On Thu, May 12, 2011 at 3:59 PM, Peter Arrenbrecht
> <peter.arrenbrecht at gmail.com> wrote:
>> On Thu, May 12, 2011 at 10:16 PM, Augie Fackler <durin42 at gmail.com> wrote:
>>> On Thu, May 12, 2011 at 2:59 PM, Peter Arrenbrecht
>>> <peter.arrenbrecht at gmail.com> wrote:
>>>> Here's another failure with the final pushkey request when cloning thg
>>>> from bitbucket:
>>>
>>> Hm, I've seen something akin to this before, I'll try again tonight. I
>>> suspect a bug in my chunked transfer encoding code, but I've never had
>>> any luck finding it.
>>
>> As I told tonfa on IRC, it happens in the select loop in request(). If
>> I change the break for "not data" to a continue, it simply continues
>> looping. So select returns a readable socket (if r) and the recv
>> proceeds to return nothing (if not data). Weird.
>
> Yeah, and annoying.
>
> Can you find out what the connection-control header was on the request
> before the one that breaks?

The response headers are:

nginx/0.7.67
Date: Thu, 12 May 2011 21:53:54 GMT
Content-Type: application/mercurial-0.1
Transfer-Encoding: chunked
Connection: keep-alive
Strict-Transport-Security: max-age=500

will_close is False

-parren

>> -parren
>>
>>>
>>>>
>>>> $ hg clone https://bitbucket.org/tortoisehg/thg/ /tmp/cloned --config
>>>> ui.usehttp2=true --config ui.http2debuglevel=debug
>>>> ...
>>>> reading remaining 6647 of existing chunk
>>>> looping with 7 data remaining
>>>> reading chunk of length 0
>>>> looping with 2 data remaining
>>>> added 11737 changesets with 17160 changes to 1363 files (+1 heads)
>>>> updating to branch default
>>>> 735 files updated, 0 files merged, 0 files removed, 0 files unresolved
>>>> sending GET request for
>>>> /tortoisehg/thg/?cmd=listkeys&namespace=bookmarks to bitbucket.org on
>>>> port 443
>>>> socket appears closed in read
>>>> response read 0 data during _select
>>>> ** unknown exception encountered, please report by visiting
>>>> **  http://mercurial.selenic.com/wiki/BugTracker
>>>> ** Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) [GCC 4.4.5]
>>>> ** Mercurial Distributed SCM (version 1.8.3+149-7ebdbef38406)
>>>> ** Extensions loaded:
>>>> Traceback (most recent call last):
>>>>  File "./hg", line 38, in <module>
>>>>    mercurial.dispatch.run()
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 16, in run
>>>>    sys.exit(dispatch(sys.argv[1:]))
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 36, in dispatch
>>>>    return _runcatch(u, args)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 58, in _runcatch
>>>>    return _dispatch(ui, args)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 613, in _dispatch
>>>>    cmdpats, cmdoptions)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 418, in
>>>> runcommand
>>>>    ret = _runcommand(ui, options, cmd, d)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 667, in
>>>> _runcommand
>>>>    return checkargs()
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 621, in checkargs
>>>>    return cmdfunc()
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 610, in <lambda>
>>>>    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/util.py", line 385, in check
>>>>    return func(*args, **kwargs)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/commands.py", line 1034, in clone
>>>>    branch=opts.get('branch'))
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/hg.py", line 362, in clone
>>>>    rb = src_repo.listkeys('bookmarks')
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/wireproto.py", line 103, in listkeys
>>>>    d = self._call("listkeys", namespace=encoding.fromlocal(namespace))
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httprepo.py", line 162, in _call
>>>>    fp = self._callstream(cmd, **args)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httprepo.py", line 113, in
>>>> _callstream
>>>>    resp = self.urlopener.open(req)
>>>>  File "/usr/lib/python2.6/urllib2.py", line 391, in open
>>>>    response = self._open(req, data)
>>>>  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
>>>>    '_open', req)
>>>>  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
>>>>    result = func(*args)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpconnection.py", line
>>>> 230, in https_open
>>>>    return self.do_open(self._makesslconnection, req)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpconnection.py", line
>>>> 201, in do_open
>>>>    r = h.getresponse()
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpclient/__init__.py",
>>>> line 644, in getresponse
>>>>    r._select()
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpclient/__init__.py",
>>>> line 178, in _select
>>>>    self._load_response(self._end_headers)
>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpclient/__init__.py",
>>>> line 261, in _load_response
>>>>    http_ver, status = hdrs.split(' ', 1)
>>>> ValueError: need more than 1 value to unpack
>>>> closed connection to bitbucket.org on 443
>>>>
>>>> -parren
>>>>
>>>> On Thu, May 12, 2011 at 9:24 PM, Peter Arrenbrecht
>>>> <peter.arrenbrecht at gmail.com> wrote:
>>>>> On Thu, May 12, 2011 at 7:12 PM, Augie Fackler <durin42 at gmail.com> wrote:
>>>>>> For anyone experiencing the ssl defect, I've got a proposed fix out
>>>>>> for review at http://codereview.appspot.com/4532054/. If that works,
>>>>>> I'll push it to py-nonblocking-http and mail the corresponding change
>>>>>> for Mercurial. I'd like someone to test this that was experiencing the
>>>>>> defect, since I can't reproduce it myself (but I think I got unit
>>>>>> tests that are about right).
>>>>>
>>>>> Works for me. Thanks,
>>>>> -parren
>>>>>
>>>>>> On Wed, May 11, 2011 at 7:34 AM, Peter Arrenbrecht
>>>>>> <peter.arrenbrecht at gmail.com> wrote:
>>>>>>> On Wed, May 11, 2011 at 2:20 PM, Peter Arrenbrecht
>>>>>>> <peter.arrenbrecht at gmail.com> wrote:
>>>>>>>> On Wed, May 11, 2011 at 2:19 PM, Peter Arrenbrecht
>>>>>>>> <peter.arrenbrecht at gmail.com> wrote:
>>>>>>>>> On Wed, May 11, 2011 at 2:17 PM, Augie Fackler <durin42 at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>> On May 11, 2011, at 7:16 AM, Peter Arrenbrecht wrote:
>>>>>>>>>>
>>>>>>>>>>> On Wed, May 11, 2011 at 2:13 PM, Augie Fackler <durin42 at gmail.com> wrote:
>>>>>>>>>>>> Wow, I'm dumb. I'll get a test and fix (probably what you posted) into the upstream library and then get it imported back into hg.
>>>>>>>>>>>
>>>>>>>>>>> Please also look into the read error I mentioned on IRC:
>>>>>>>>>>> http://paste.pocoo.org/show/386790/
>>>>>>>>>>> -parren
>>>>>>>>>>
>>>>>>>>>> Was this repeatable consistently?
>>>>>>>>>
>>>>>>>>> Was and still is. ;)
>>>>>>>>> -parren
>>>>>>>>
>>>>>>>> Saw this with pull/incoming from Bitbucket and on a fresh clone of
>>>>>>>> oplop from Google Code.
>>>>>>>
>>>>>>> Better stack trace here:
>>>>>>>
>>>>>>> using https://bitbucket.org/tortoisehg/thg
>>>>>>> sending capabilities command
>>>>>>> warning: bitbucket.org certificate with fingerprint
>>>>>>> 81:2b:08:90:dc:d3:71:ee:e0:7c:b4:75:ce:9b:6c:48:94:56:a1:fe not
>>>>>>> verified (check hostfingerprints or web.cacerts config setting)
>>>>>>> comparing with https://bitbucket.org/tortoisehg/thg
>>>>>>> sending changegroupsubset command
>>>>>>> Traceback (most recent call last):
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 58, in _runcatch
>>>>>>>    return _dispatch(ui, args)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 613, in _dispatch
>>>>>>>    cmdpats, cmdoptions)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 418, in
>>>>>>> runcommand
>>>>>>>    ret = _runcommand(ui, options, cmd, d)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 667, in
>>>>>>> _runcommand
>>>>>>>    return checkargs()
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 621, in checkargs
>>>>>>>    return cmdfunc()
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/dispatch.py", line 610, in <lambda>
>>>>>>>    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/util.py", line 385, in check
>>>>>>>    return func(*args, **kwargs)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/commands.py", line 2717, in incoming
>>>>>>>    ret = hg.incoming(ui, repo, source, opts)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/hg.py", line 472, in incoming
>>>>>>>    return _incoming(display, subreporecurse, ui, repo, source, opts)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/hg.py", line 431, in _incoming
>>>>>>>    revs, opts["bundle"], opts["force"])
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/bundlerepo.py", line 333,
>>>>>>> in getremotechanges
>>>>>>>    cg = other.changegroupsubset(incoming, onlyheads, 'incoming')
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/wireproto.py", line 123,
>>>>>>> in changegroupsubset
>>>>>>>    bases=bases, heads=heads)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httprepo.py", line 113, in
>>>>>>> _callstream
>>>>>>>    resp = self.urlopener.open(req)
>>>>>>>  File "/usr/lib/python2.6/urllib2.py", line 391, in open
>>>>>>>    response = self._open(req, data)
>>>>>>>  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
>>>>>>>    '_open', req)
>>>>>>>  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
>>>>>>>    result = func(*args)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpconnection.py", line
>>>>>>> 232, in https_open
>>>>>>>    return self.do_open(self._makesslconnection, req)
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpconnection.py", line
>>>>>>> 201, in do_open
>>>>>>>    r = h.getresponse()
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpclient/__init__.py",
>>>>>>> line 631, in getresponse
>>>>>>>    r._select()
>>>>>>>  File "/home/peo/dev/hg/dev-crew/mercurial/httpclient/__init__.py",
>>>>>>> line 168, in _select
>>>>>>>    data = self.sock.recv(INCOMING_BUFFER_SIZE)
>>>>>>>  File "/usr/lib/python2.6/ssl.py", line 215, in recv
>>>>>>>    return self.read(buflen)
>>>>>>>  File "/usr/lib/python2.6/ssl.py", line 136, in read
>>>>>>>    return self._sslobj.read(len)
>>>>>>> SSLError: [Errno 2] _ssl.c:1331: The operation did not complete (read)
>>>>>>> abort: _ssl.c:1331: The operation did not complete (read)
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>


More information about the Mercurial-devel mailing list