diff --git a/synapse/push/__init__.py b/synapse/push/__init__.py
index 07b5f0187c..6f143a5df9 100644
--- a/synapse/push/__init__.py
+++ b/synapse/push/__init__.py
@@ -147,11 +147,14 @@ class Pusher(object):
logger.warn("event_match condition with no pattern")
return False
# XXX: optimisation: cache our pattern regexps
- r = r'\b%s\b' % self._glob_to_regexp(condition['pattern'])
+ if condition['key'] == 'content.body':
+ r = r'\b%s\b' % self._glob_to_regexp(condition['pattern'])
+ else:
+ r = r'^%s$' % self._glob_to_regexp(condition['pattern'])
val = _value_for_dotted_key(condition['key'], ev)
if val is None:
return False
- return re.match(r, val, flags=re.IGNORECASE) != None
+ return re.search(r, val, flags=re.IGNORECASE) is not None
elif condition['kind'] == 'device':
if 'profile_tag' not in condition:
@@ -167,8 +170,8 @@ class Pusher(object):
return False
if not display_name:
return False
- return re.match("\b%s\b" % re.escape(display_name),
- ev['content']['body'], flags=re.IGNORECASE) != None
+ return re.search("\b%s\b" % re.escape(display_name),
+ ev['content']['body'], flags=re.IGNORECASE) is not None
elif condition['kind'] == 'room_member_count':
if 'is' not in condition:
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py
index 310ee0104c..5ddd410607 100644
--- a/synapse/storage/_base.py
+++ b/synapse/storage/_base.py
@@ -88,6 +88,8 @@ class SQLBaseStore(object):
self._previous_txn_total_time = 0
self._current_txn_total_time = 0
self._previous_loop_ts = 0
+ self._txn_perf_counters = {}
+ self._previous_txn_perf_counters = {}
def start_profiling(self):
self._previous_loop_ts = self._clock.time_msec()
@@ -103,7 +105,29 @@ class SQLBaseStore(object):
ratio = (curr - prev)/(time_now - time_then)
- logger.info("Total database time: %.3f%%", ratio * 100)
+ txn_counters = []
+ for name, (count, cum_time) in self._txn_perf_counters.items():
+ prev_count, prev_time = self._previous_txn_perf_counters.get(
+ name, (0,0)
+ )
+ txn_counters.append((
+ (cum_time - prev_time) / (time_now - time_then),
+ count - prev_count,
+ name
+ ))
+
+ self._previous_txn_perf_counters = dict(self._txn_perf_counters)
+
+ txn_counters.sort(reverse=True)
+ top_three_counters = ", ".join(
+ "%s(%d): %.3f%%" % (name, count, 100 * ratio)
+ for ratio, count, name in txn_counters[:3]
+ )
+
+ logger.info(
+ "Total database time: %.3f%% {%s}",
+ ratio * 100, top_three_counters
+ )
self._clock.looping_call(loop, 10000)
@@ -116,7 +140,7 @@ class SQLBaseStore(object):
with LoggingContext("runInteraction") as context:
current_context.copy_to(context)
start = time.time() * 1000
- txn_id = SQLBaseStore._TXN_ID
+ txn_id = self._TXN_ID
# We don't really need these to be unique, so lets stop it from
# growing really large.
@@ -139,6 +163,11 @@ class SQLBaseStore(object):
self._current_txn_total_time += end - start
+ count, cum_time = self._txn_perf_counters.get(desc, (0,0))
+ count += 1
+ cum_time += end - start
+ self._txn_perf_counters[desc] = (count, cum_time)
+
with PreserveLoggingContext():
result = yield self._db_pool.runInteraction(
inner_func, *args, **kwargs
|