From d49403ac749fffe24ac6357597e6014bb65efa30 Mon Sep 17 00:00:00 2001 From: Peter Amstutz Date: Mon, 16 May 2022 12:24:43 -0400 Subject: [PATCH] 17004: Fix lingering resource error * Remove legacy global api_client from arv-get * Monkey patch close_connections() method to close keepalive connections * Use close_connections to tear down lingering connections from arv get test setup Arvados-DCO-1.1-Signed-off-by: Peter Amstutz --- sdk/python/arvados/api.py | 5 +++++ sdk/python/arvados/commands/get.py | 6 +----- sdk/python/tests/test_arv_get.py | 5 ++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/sdk/python/arvados/api.py b/sdk/python/arvados/api.py index e0d1c50f03..db1d0f4e12 100644 --- a/sdk/python/arvados/api.py +++ b/sdk/python/arvados/api.py @@ -133,6 +133,10 @@ def _patch_http_request(http, api_token): http._request_id = util.new_request_id return http +def _close_connections(self): + for conn in self._http.connections.values(): + conn.close() + # Monkey patch discovery._cast() so objects and arrays get serialized # with json.dumps() instead of str(). _cast_orig = apiclient_discovery._cast @@ -254,6 +258,7 @@ def api(version=None, cache=True, host=None, token=None, insecure=False, svc.request_id = request_id svc.config = lambda: util.get_config_once(svc) svc.vocabulary = lambda: util.get_vocabulary_once(svc) + svc.close_connections = types.MethodType(_close_connections, svc) kwargs['http'].max_request_size = svc._rootDesc.get('maxRequestSize', 0) kwargs['http'].cache = None kwargs['http']._request_id = lambda: svc.request_id or util.new_request_id() diff --git a/sdk/python/arvados/commands/get.py b/sdk/python/arvados/commands/get.py index c4262c59c9..bb421def61 100755 --- a/sdk/python/arvados/commands/get.py +++ b/sdk/python/arvados/commands/get.py @@ -17,7 +17,6 @@ import arvados.util as util from arvados._version import __version__ -api_client = None logger = logging.getLogger('arvados.arv-get') parser = argparse.ArgumentParser( @@ -146,8 +145,6 @@ def parse_arguments(arguments, stdout, stderr): return args def main(arguments=None, stdout=sys.stdout, stderr=sys.stderr): - global api_client - if stdout is sys.stdout and hasattr(stdout, 'buffer'): # in Python 3, write to stdout as binary stdout = stdout.buffer @@ -158,8 +155,7 @@ def main(arguments=None, stdout=sys.stdout, stderr=sys.stderr): request_id = arvados.util.new_request_id() logger.info('X-Request-Id: '+request_id) - if api_client is None: - api_client = arvados.api('v1', request_id=request_id) + api_client = arvados.api('v1', request_id=request_id) r = re.search(r'^(.*?)(/.*)?$', args.locator) col_loc = r.group(1) diff --git a/sdk/python/tests/test_arv_get.py b/sdk/python/tests/test_arv_get.py index 733cd6478c..73ef2475b9 100644 --- a/sdk/python/tests/test_arv_get.py +++ b/sdk/python/tests/test_arv_get.py @@ -49,12 +49,15 @@ class ArvadosGetTestCase(run_test_server.TestCaseWithServers, 'bar.txt' : 'bar', 'subdir/baz.txt' : 'baz', }): - c = collection.Collection() + api = arvados.api() + c = collection.Collection(api_client=api) for path, data in listitems(contents): with c.open(path, 'wb') as f: f.write(data) c.save_new() + api.close_connections() + return (c.manifest_locator(), c.portable_data_hash(), c.manifest_text(strip=strip_manifest)) -- 2.30.2