diff --git a/dvc/main.py b/dvc/main.py index f00dc0ced..d6bc5f5d0 100644 --- a/dvc/main.py +++ b/dvc/main.py @@ -8,6 +8,7 @@ from dvc.cli import parse_args from dvc.config import ConfigError from dvc.analytics import Analytics from dvc.exceptions import NotDvcRepoError, DvcParserError +from dvc.remote.ssh.pool import close_ssh_pools logger = logging.getLogger("dvc") @@ -53,6 +54,9 @@ def main(argv=None): ret = 255 finally: logger.setLevel(outerLogLevel) + # Python 2 fails to close these clean occasionally and users see + # weird error messages, so we do it manually + close_ssh_pools() Analytics().send_cmd(cmd, args, ret) diff --git a/dvc/remote/ssh/pool.py b/dvc/remote/ssh/pool.py index abba1b53c..2a519c02e 100644 --- a/dvc/remote/ssh/pool.py +++ b/dvc/remote/ssh/pool.py @@ -22,6 +22,12 @@ def get_ssh_pool(*conn_args, **conn_kwargs): return SSHPool(conn_args, conn_kwargs) +def close_ssh_pools(): + for pool in get_ssh_pool.memory.values(): + pool.close() + get_ssh_pool.memory.clear() + + class SSHPool(object): def __init__(self, conn_args, conn_kwargs): self._conn_args = conn_args