regularly close connection while indexing

Postgres sooner or later runs out of memory when the connection
is used for too long.
This commit is contained in:
Sarah Hoffmann
2020-02-09 13:57:36 +01:00
parent 3737712044
commit 8b8aa1b4e6

View File

@@ -104,14 +104,22 @@ 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.
"""
@@ -257,13 +265,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")