wireprotov2peer: report exceptions in frame handling against request future
authorGregory Szorc <gregory.szorc@gmail.com>
Thu, 23 Aug 2018 13:50:47 -0700
changeset 39485 42bc1c70a6b8
parent 39484 98995b689e03
child 39486 43d92d68ac88
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
mercurial/wireprotov2peer.py
--- 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)