mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
Merge pull request #1675 from lonvia/refresh-connection-while-indexing
Fix a couple of issues with the new Python nominatim script
This commit is contained in:
@@ -35,9 +35,14 @@ import select
|
|||||||
log = logging.getLogger()
|
log = logging.getLogger()
|
||||||
|
|
||||||
def make_connection(options, asynchronous=False):
|
def make_connection(options, asynchronous=False):
|
||||||
return psycopg2.connect(dbname=options.dbname, user=options.user,
|
params = {'dbname' : options.dbname,
|
||||||
password=options.password, host=options.host,
|
'user' : options.user,
|
||||||
port=options.port, async_=asynchronous)
|
'password' : options.password,
|
||||||
|
'host' : options.host,
|
||||||
|
'port' : options.port,
|
||||||
|
'async' : asynchronous}
|
||||||
|
|
||||||
|
return psycopg2.connect(**params)
|
||||||
|
|
||||||
|
|
||||||
class RankRunner(object):
|
class RankRunner(object):
|
||||||
@@ -104,19 +109,39 @@ class DBConnection(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, options):
|
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.conn = make_connection(options, asynchronous=True)
|
||||||
self.wait()
|
self.wait()
|
||||||
|
|
||||||
self.cursor = self.conn.cursor()
|
self.cursor = self.conn.cursor()
|
||||||
|
|
||||||
self.current_query = None
|
|
||||||
self.current_params = None
|
|
||||||
|
|
||||||
def wait(self):
|
def wait(self):
|
||||||
""" Block until any pending operation is done.
|
""" Block until any pending operation is done.
|
||||||
"""
|
"""
|
||||||
wait_select(self.conn)
|
while True:
|
||||||
self.current_query = None
|
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):
|
def perform(self, sql, args=None):
|
||||||
""" Send SQL query to the server. Returns immediately without
|
""" 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)
|
self.cursor.execute(self.current_query, self.current_params)
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
except psycopg2.errors.DeadlockDetected:
|
||||||
|
self.cursor.execute(self.current_query, self.current_params)
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -257,13 +284,25 @@ class Indexer(object):
|
|||||||
sending a query.
|
sending a query.
|
||||||
"""
|
"""
|
||||||
ready = self.threads
|
ready = self.threads
|
||||||
|
command_stat = 0
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
for thread in ready:
|
for thread in ready:
|
||||||
if thread.is_done():
|
if thread.is_done():
|
||||||
|
command_stat += 1
|
||||||
yield thread
|
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")
|
assert(False, "Unreachable code")
|
||||||
|
|
||||||
|
|||||||
@@ -31,10 +31,7 @@ export DEBIAN_FRONTEND=noninteractive #DOCS:
|
|||||||
postgresql-contrib-9.5 \
|
postgresql-contrib-9.5 \
|
||||||
apache2 php php-pgsql libapache2-mod-php \
|
apache2 php php-pgsql libapache2-mod-php \
|
||||||
php-intl python3-setuptools python3-dev python3-pip \
|
php-intl python3-setuptools python3-dev python3-pip \
|
||||||
python3-tidylib git
|
python3-tidylib python3-psycopg2 git
|
||||||
|
|
||||||
# python3-psycopg2 apt package is too old (2.6), we want at least 2.7
|
|
||||||
pip3 install --user psycopg2
|
|
||||||
|
|
||||||
# If you want to run the test suite, you need to install the following
|
# If you want to run the test suite, you need to install the following
|
||||||
# additional packages:
|
# additional packages:
|
||||||
|
|||||||
Reference in New Issue
Block a user