Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Use monotonic clock where possible for metrics
Browse files Browse the repository at this point in the history
Fixes intermittent errors observed on Apple hardware which were caused by
time.clock() appearing to go backwards when called from different threads.

Also fixes a bug where database activity times were logged as 1/1000 of their
correct ratio due to confusion between milliseconds and seconds.
  • Loading branch information
richvdh committed Jun 19, 2019
1 parent 4f68188 commit 15bf32e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 6 deletions.
1 change: 1 addition & 0 deletions changelog.d/5498.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix intermittent exceptions on Apple hardware. Also fix bug that caused database activity times to be under-reported in log lines.
20 changes: 14 additions & 6 deletions synapse/storage/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@
from synapse.util.logcontext import LoggingContext, PreserveLoggingContext
from synapse.util.stringutils import exception_to_unicode

# import a function which will return a monotonic time, in seconds
try:
# on python 3, use time.monotonic, since time.clock can go backwards
from time import monotonic as monotonic_time
except ImportError:
# ... but python 2 doesn't have it
from time import clock as monotonic_time

logger = logging.getLogger(__name__)

try:
Expand Down Expand Up @@ -352,14 +360,14 @@ def set_expiration_date_for_user_txn(self, txn, user_id, use_delta=False):
)

def start_profiling(self):
self._previous_loop_ts = self._clock.time_msec()
self._previous_loop_ts = monotonic_time()

def loop():
curr = self._current_txn_total_time
prev = self._previous_txn_total_time
self._previous_txn_total_time = curr

time_now = self._clock.time_msec()
time_now = monotonic_time()
time_then = self._previous_loop_ts
self._previous_loop_ts = time_now

Expand All @@ -385,7 +393,7 @@ def loop():
def _new_transaction(
self, conn, desc, after_callbacks, exception_callbacks, func, *args, **kwargs
):
start = time.time()
start = monotonic_time()
txn_id = self._TXN_ID

# We don't really need these to be unique, so lets stop it from
Expand Down Expand Up @@ -451,7 +459,7 @@ def _new_transaction(
logger.debug("[TXN FAIL] {%s} %s", name, e)
raise
finally:
end = time.time()
end = monotonic_time()
duration = end - start

LoggingContext.current_context().add_database_transaction(duration)
Expand Down Expand Up @@ -525,11 +533,11 @@ def runWithConnection(self, func, *args, **kwargs):
)
parent_context = None

start_time = time.time()
start_time = monotonic_time()

def inner_func(conn, *args, **kwargs):
with LoggingContext("runWithConnection", parent_context) as context:
sched_duration_sec = time.time() - start_time
sched_duration_sec = monotonic_time() - start_time
sql_scheduling_timer.observe(sched_duration_sec)
context.add_database_scheduled(sched_duration_sec)

Expand Down

0 comments on commit 15bf32e

Please sign in to comment.