changeset a87d1206c5cc in trytond:6.4
details: https://hg.tryton.org/trytond?cmd=changeset&node=a87d1206c5cc
description:
Catch get_connection errors in Cache listener
issue11563
review411271003
(grafted from 7123014d260c278bd36a25d9c4a7543db553733c)
diffstat:
trytond/cache.py | 26 ++++++++++++++++----------
1 files changed, 16 insertions(+), 10 deletions(-)
diffs (45 lines):
diff -r a1b42a36e1f7 -r a87d1206c5cc trytond/cache.py
--- a/trytond/cache.py Thu Sep 15 21:49:12 2022 +0200
+++ b/trytond/cache.py Sat Sep 17 19:00:48 2022 +0200
@@ -348,16 +348,20 @@
@classmethod
def _listen(cls, dbname):
- database = backend.Database(dbname)
- if not database.has_channel():
- raise NotImplementedError
+ current_thread = threading.current_thread()
+ pid = os.getpid()
- logger.info("listening on channel '%s' of '%s'", cls._channel, dbname)
- conn = database.get_connection(autocommit=True)
- pid = os.getpid()
- selector = selectors.DefaultSelector()
- current_thread = threading.current_thread()
+ conn, selector = None, None
try:
+ database = backend.Database(dbname)
+ if not database.has_channel():
+ raise NotImplementedError
+
+ logger.info(
+ "listening on channel '%s' of '%s'", cls._channel, dbname)
+ conn = database.get_connection(autocommit=True)
+ selector = selectors.DefaultSelector()
+
cursor = conn.cursor()
cursor.execute('LISTEN "%s"' % cls._channel)
current_thread.listening = True
@@ -380,8 +384,10 @@
"cache listener on '%s' crashed", dbname, exc_info=True)
raise
finally:
- selector.close()
- database.put_connection(conn)
+ if selector:
+ selector.close()
+ if conn:
+ database.put_connection(conn)
with cls._listener_lock[pid]:
if cls._listener.get((pid, dbname)) == current_thread:
del cls._listener[pid, dbname]