changeset 40723:94b0d0f996e1 stable

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.
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 28 Nov 2018 10:37:43 -0800
parents 25b7c4cb5de1
children 15a643304728
files mercurial/wireprotov2peer.py
diffstat 1 files changed, 5 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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())