Limit the number of DB queries from the main thread
Basically, we want to make the interval we ask for configs and for now()
longer. The now may use the DB time only to calibrate local clock. This is a proposed diff (with some other changes to report transactions taking a long time, but we may want that too, possibly with a longer time):
import threading
import traceback
import time
+import datetime
from master_config import get
logger = logging.getLogger(name='database')
@@ -33,6 +34,7 @@ class __CursorContext:
def __init__(self, connection):
self.__connection = connection
self.__depth = 0
+ self.__start_time = None
self.reuse()
def reuse(self):
@@ -41,6 +43,7 @@ class __CursorContext:
def __enter__(self):
if not self.__depth:
logger.debug('Entering transaction %s', self)
+ self.__start_time = time.time()
self.__depth += 1
return self._cursor
@@ -48,6 +51,8 @@ class __CursorContext:
self.__depth -= 1
if self.__depth:
return # Didn't exit all the contexts yet
+ if time.time() - self.__start_time > 2:
+ logger.error("Transaction took a long time: %s", traceback.format_stack())
if exc_type:
logger.error('Rollback of transaction %s:%s/%s/%s', self, exc_type, exc_val, trace
self.__connection.rollback()
@@ -115,9 +120,10 @@ def now():
global __time_update
global __time_db
t = time.time()
- if __time_update + 2 < t:
+ diff = t - __time_update
+ if diff > 600000:
__time_update = t
with transaction() as t:
t.execute("SELECT CURRENT_TIMESTAMP AT TIME ZONE 'UTC'");
(__time_db,) = t.fetchone()
- return __time_db
+ return __time_db + datetime.timedelta(seconds=diff)