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.
--- 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: