From: Sarah Hoffmann Date: Wed, 12 Feb 2020 07:18:09 +0000 (+0100) Subject: Merge pull request #1675 from lonvia/refresh-connection-while-indexing X-Git-Tag: v3.5.0~83 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/97b892fac224564bc82ec292a1f352204f1b8b3f?hp=b3fdf19b85deba79dea7a0ce2049a42639b4276c Merge pull request #1675 from lonvia/refresh-connection-while-indexing Fix a couple of issues with the new Python nominatim script --- diff --git a/nominatim/nominatim.py b/nominatim/nominatim.py index 54d9b208..14643770 100755 --- a/nominatim/nominatim.py +++ b/nominatim/nominatim.py @@ -35,9 +35,14 @@ import select log = logging.getLogger() def make_connection(options, asynchronous=False): - return psycopg2.connect(dbname=options.dbname, user=options.user, - password=options.password, host=options.host, - port=options.port, async_=asynchronous) + params = {'dbname' : options.dbname, + 'user' : options.user, + 'password' : options.password, + 'host' : options.host, + 'port' : options.port, + 'async' : asynchronous} + + return psycopg2.connect(**params) class RankRunner(object): @@ -104,19 +109,39 @@ class DBConnection(object): """ def __init__(self, options): + self.current_query = None + self.current_params = None + + self.conn = None + self.connect() + + def connect(self): + if self.conn is not None: + self.cursor.close() + self.conn.close() + self.conn = make_connection(options, asynchronous=True) self.wait() self.cursor = self.conn.cursor() - self.current_query = None - self.current_params = None - def wait(self): """ Block until any pending operation is done. """ - wait_select(self.conn) - self.current_query = None + while True: + try: + wait_select(self.conn) + self.current_query = None + return + except psycopg2.extensions.TransactionRollbackError as e: + if e.pgcode == '40P01': + log.info("Deadlock detected (params = {}), retry." + .format(self.current_params)) + self.cursor.execute(self.current_query, self.current_params) + else: + raise + except psycopg2.errors.DeadlockDetected: + self.cursor.execute(self.current_query, self.current_params) def perform(self, sql, args=None): """ Send SQL query to the server. Returns immediately without @@ -150,6 +175,8 @@ class DBConnection(object): self.cursor.execute(self.current_query, self.current_params) else: raise + except psycopg2.errors.DeadlockDetected: + self.cursor.execute(self.current_query, self.current_params) return False @@ -257,13 +284,25 @@ class Indexer(object): sending a query. """ ready = self.threads + command_stat = 0 while True: for thread in ready: if thread.is_done(): + command_stat += 1 yield thread - ready, _, _ = select.select(self.threads, [], []) + # refresh the connections occasionaly to avoid potential + # memory leaks in Postgresql. + if command_stat > 100000: + for t in self.threads: + while not t.is_done(): + wait_select(t.conn) + t.connect() + command_stat = 0 + ready = self.threads + else: + ready, _, _ = select.select(self.threads, [], []) assert(False, "Unreachable code") diff --git a/vagrant/Install-on-Ubuntu-16.sh b/vagrant/Install-on-Ubuntu-16.sh index 3539851f..393cd0b1 100755 --- a/vagrant/Install-on-Ubuntu-16.sh +++ b/vagrant/Install-on-Ubuntu-16.sh @@ -31,10 +31,7 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: postgresql-contrib-9.5 \ apache2 php php-pgsql libapache2-mod-php \ php-intl python3-setuptools python3-dev python3-pip \ - python3-tidylib git - - # python3-psycopg2 apt package is too old (2.6), we want at least 2.7 - pip3 install --user psycopg2 + python3-tidylib python3-psycopg2 git # If you want to run the test suite, you need to install the following # additional packages: