wireprotov2peer: always return a bool from _processredirect() stable
authorGregory Szorc <gregory.szorc@gmail.com>
Wed, 28 Nov 2018 10:37:43 -0800
branchstable
changeset 40723 94b0d0f996e1
parent 40674 25b7c4cb5de1
child 40724 15a643304728
wireprotov2peer: always return a bool from _processredirect() Without this, we may stop servicing the redirect response if the future has already been resolved. And the future will often be resolved very early, since many consumers iterate the decoded CBOR object stream and expect data to lazily arrive.
mercurial/wireprotov2peer.py
--- a/mercurial/wireprotov2peer.py	Tue Nov 20 18:47:19 2018 -0500
+++ b/mercurial/wireprotov2peer.py	Wed Nov 28 10:37:43 2018 -0800
@@ -458,7 +458,10 @@
         self._redirects.append((requestid, res))
 
     def _processredirect(self, rid, res):
-        """Called to continue processing a response from a redirect."""
+        """Called to continue processing a response from a redirect.
+
+        Returns a bool indicating if the redirect is still serviceable.
+        """
         response = self._responses[rid]
 
         try:
@@ -470,7 +473,7 @@
                 response._oninputcomplete()
 
             if rid not in self._futures:
-                return
+                return bool(data)
 
             if response.command not in COMMAND_DECODERS:
                 self._futures[rid].set_result(response.objects())