Mercurial > hg
view hgext/remotefilelog/connectionpool.py @ 47109:33e5511b571a
rust: Remove DirstateMap::file_fold_map
This was a HashMap constructed on demand and then cached in the DirstateMap
struct to avoid reconstructing at the next access. However the only use is
in Python bindings converting it to a PyDict. That method in turn is wrapped
in a @cachedproperty in Python code.
This was two redudant layers of caching. This changeset removes the Rust-level
one to keep the Python dict cache, and have bindings create a PyDict by
iterating.
Differential Revision: https://phab.mercurial-scm.org/D10493
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 13 Apr 2021 17:02:58 +0200 |
parents | c7f6c3027af2 |
children | 6000f5b25c9b |
line wrap: on
line source
# connectionpool.py - class for pooling peer connections for reuse # # Copyright 2017 Facebook, Inc. # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. from __future__ import absolute_import from mercurial import ( hg, pycompat, sshpeer, util, ) _sshv1peer = sshpeer.sshv1peer class connectionpool(object): def __init__(self, repo): self._repo = repo self._pool = dict() def get(self, path): pathpool = self._pool.get(path) if pathpool is None: pathpool = list() self._pool[path] = pathpool conn = None if len(pathpool) > 0: try: conn = pathpool.pop() peer = conn.peer # If the connection has died, drop it if isinstance(peer, _sshv1peer): if peer._subprocess.poll() is not None: conn = None except IndexError: pass if conn is None: peer = hg.peer(self._repo.ui, {}, path) if util.safehasattr(peer, '_cleanup'): class mypeer(peer.__class__): def _cleanup(self, warn=None): # close pipee first so peer.cleanup reading it won't # deadlock, if there are other processes with pipeo # open (i.e. us). if util.safehasattr(self, 'pipee'): self.pipee.close() return super(mypeer, self)._cleanup() peer.__class__ = mypeer conn = connection(pathpool, peer) return conn def close(self): for pathpool in pycompat.itervalues(self._pool): for conn in pathpool: conn.close() del pathpool[:] class connection(object): def __init__(self, pool, peer): self._pool = pool self.peer = peer def __enter__(self): return self def __exit__(self, type, value, traceback): # Only add the connection back to the pool if there was no exception, # since an exception could mean the connection is not in a reusable # state. if type is None: self._pool.append(self) else: self.close() def close(self): if util.safehasattr(self.peer, 'cleanup'): self.peer.cleanup()