From b46adbad224eabd915fa5363b719afd0c8571476 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sat, 27 Feb 2021 10:24:40 +0100 Subject: [PATCH] make sure psql always finishes If an execption is raised by other means, we still have to close the stdin pipe to psql to make sure that it exits and releases its connection to the database. --- nominatim/db/utils.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/nominatim/db/utils.py b/nominatim/db/utils.py index 6d2eb297..0a2e2c06 100644 --- a/nominatim/db/utils.py +++ b/nominatim/db/utils.py @@ -35,24 +35,25 @@ def execute_file(dsn, fname, ignore_errors=False, pre_code=None, post_code=None) cmd.append('--quiet') proc = subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE) - if not LOG.isEnabledFor(logging.INFO): - proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8')) - - if pre_code: - proc.stdin.write((pre_code + ';').encode('utf-8')) - - if fname.suffix == '.gz': - with gzip.open(str(fname), 'rb') as fdesc: - remain = _pipe_to_proc(proc, fdesc) - else: - with fname.open('rb') as fdesc: - remain = _pipe_to_proc(proc, fdesc) - - if remain == 0 and post_code: - proc.stdin.write((';' + post_code).encode('utf-8')) - - proc.stdin.close() + try: + if not LOG.isEnabledFor(logging.INFO): + proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8')) + + if pre_code: + proc.stdin.write((pre_code + ';').encode('utf-8')) + + if fname.suffix == '.gz': + with gzip.open(str(fname), 'rb') as fdesc: + remain = _pipe_to_proc(proc, fdesc) + else: + with fname.open('rb') as fdesc: + remain = _pipe_to_proc(proc, fdesc) + + if remain == 0 and post_code: + proc.stdin.write((';' + post_code).encode('utf-8')) + finally: + proc.stdin.close() + ret = proc.wait() - ret = proc.wait() if ret != 0 or remain > 0: raise UsageError("Failed to execute SQL file.") -- 2.39.5