If a callback throws an exception, Consumer.wait() hangs.

未关闭
#147 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
database

调研方向

从 couchdbkit/consumer/sync.py 中 traceback 所示的 wait loop 附近开始,然后使用 Consumer.wait(cb) 针对持续的 _changes feed 以及会引发 ValueError 的 callback 重现该问题。跟踪 with restkit wrapper 的清理过程,并确认 callback 异常不再导致 wait 在 stream 保持打开时一直挂起。

由索引模型根据 Issue 内容生成。

描述

>>> import couchdbkit
>>> db = couchdbkit.Server("http://localhost:5984")["temp"]
>>> c = couchdbkit.Consumer(db)
>>> def cb(*args):
...     print "In callback"
...     raise ValueError
... 
>>> c.wait(cb)
In callback

Nothing is printed after this point, and the process hangs. It continues to read from _changes, though it does nothing.

Control-C reveals where it's stuck:

^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/daniel/temp/src/couchdbkit/couchdbkit/consumer/__init__.py", line 103, in wait
    return self._consumer.wait(cb, **params)
  File "/home/daniel/temp/src/couchdbkit/couchdbkit/consumer/sync.py", line 56, in wait
    break
  File "/home/daniel/temp/lib/python2.6/site-packages/restkit/wrappers.py", line 161, in __exit__
    self.close()
  File "/home/daniel/temp/lib/python2.6/site-packages/restkit/wrappers.py", line 169, in close
    self.body.read()
  File "/usr/lib/python2.6/io.py", line 940, in read
    return self._read_unlocked(n)
  File "/usr/lib/python2.6/io.py", line 955, in _read_unlocked
    chunk = self.raw.read()
  File "/usr/lib/python2.6/io.py", line 589, in read
    return self.readall()
  File "/usr/lib/python2.6/io.py", line 599, in readall
    data = self.read(DEFAULT_BUFFER_SIZE)
  File "/usr/lib/python2.6/io.py", line 591, in read
    n = self.readinto(b)
  File "/home/daniel/temp/lib/python2.6/site-packages/http_parser/reader.py", line 60, in readinto
    recved = self.http_stream.stream.readinto(buf)
  File "/home/daniel/temp/lib/python2.6/site-packages/http_parser/reader.py", line 150, in readinto
    return _readinto(self._sock, b)
  File "/home/daniel/temp/lib/python2.6/site-packages/http_parser/reader.py", line 25, in _readinto
    buf = sock.recv(l)
KeyboardInterrupt

As far as I can tell, __ exit __ is called because of the 'with restkit wrapper:' block in sync.py. It then attempts to read the remainder of the stream, which it can't do because continuous changes never ends.

The above console output was produced after installing 'git://github.com/benoitc/couchdbkit.git#egg=couchdbkit' into a clean virtualenv, though I get the same problem with couchdbkit 0.6.3 on python2.7 on another box.

Thanks,
Daniel

主要语言
Python
星标
261
派生
90
PR 合并指标
30 天内没有已合并 PR

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

benoitc/couchdbkit 的其他 Issue

查看 benoitc/couchdbkit 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。