wireprotov2peer: report exceptions in frame handling against request future
Otherwise the future may never resolve, which could cause deadlock.
Differential Revision: https://phab.mercurial-scm.org/D4440
--- a/mercurial/wireprotov2peer.py Sat Sep 08 21:58:51 2018 +0800
+++ b/mercurial/wireprotov2peer.py Thu Aug 23 13:50:47 2018 -0700
@@ -133,7 +133,12 @@
response = self._responses[frame.requestid]
if action == 'responsedata':
- self._processresponsedata(frame, meta, response)
+ # Any failures processing this frame should bubble up to the
+ # future tracking the request.
+ try:
+ self._processresponsedata(frame, meta, response)
+ except BaseException as e:
+ self._futures[frame.requestid].set_exception(e)
else:
raise error.ProgrammingError(
'unhandled action from clientreactor: %s' % action)