keepalive: ensure `close_all()` actually closes all cached connections stable
authorMatt Harbison <matt_harbison@yahoo.com>
Tue, 18 Oct 2022 11:54:58 -0400
branchstable
changeset 49542 8251f7cc787d
parent 49540 bc2ecf08ae04
child 49543 76fbb1b6692a
keepalive: ensure `close_all()` actually closes all cached connections While debugging why LFS blob downloads are getting corrupted with workers, I noticed that prior to spinning up the workers, the ConnectionManager has 2 connections to the server and calling `KeepAliveHandler.close_all()` left one behind. The reason is the value component of `self._cm.get_all().items()` is a list, and `self._cm.remove()` modifies said list while the caller is iterating over it. Now `get_all()` is a deep copy of both the dict and lists in all cases.
mercurial/keepalive.py
--- a/mercurial/keepalive.py	Wed Nov 02 16:46:46 2022 -0400
+++ b/mercurial/keepalive.py	Tue Oct 18 11:54:58 2022 -0400
@@ -166,7 +166,9 @@
         if host:
             return list(self._hostmap[host])
         else:
-            return dict(self._hostmap)
+            return dict(
+                {h: list(conns) for (h, conns) in self._hostmap.items()}
+            )
 
 
 class KeepAliveHandler: