Fix race condition in postmaster_start_time() (#1243)

when it is executed not from the main thread we need to create a new cursor object.
This commit is contained in:
Alexander Kukushkin
2019-10-24 11:23:34 +02:00
committed by GitHub
parent d770c910fd
commit 0947ac1e43
2 changed files with 10 additions and 3 deletions
+6 -3
View File
@@ -728,9 +728,12 @@ class Postgresql(object):
def postmaster_start_time(self):
try:
cursor = self.query("SELECT pg_catalog.to_char(pg_catalog.pg_postmaster_start_time(),"
" 'YYYY-MM-DD HH24:MI:SS.MS TZ')")
return cursor.fetchone()[0]
query = "SELECT pg_catalog.to_char(pg_catalog.pg_postmaster_start_time(), 'YYYY-MM-DD HH24:MI:SS.MS TZ')"
if current_thread().ident == self.__thread_ident:
return self.query(query).fetchone()[0]
with self.connection().cursor() as cursor:
cursor.execute(query)
return cursor.fetchone()[0]
except psycopg2.Error:
return None
+4
View File
@@ -458,6 +458,10 @@ class TestPostgresql(BaseTestPostgresql):
def test_postmaster_start_time(self):
with patch.object(MockCursor, "fetchone", Mock(return_value=('foo', True, '', '', '', '', False))):
self.assertEqual(self.p.postmaster_start_time(), 'foo')
t = Thread(target=self.p.postmaster_start_time)
t.start()
t.join()
with patch.object(MockCursor, "execute", side_effect=psycopg2.Error):
self.assertIsNone(self.p.postmaster_start_time())