diff options
author | Mark Haines <mark.haines@matrix.org> | 2016-04-06 13:05:19 +0100 |
---|---|---|
committer | Mark Haines <mark.haines@matrix.org> | 2016-04-06 13:05:19 +0100 |
commit | a1e0d316ea354fce07939073d9afc9c5d1013939 (patch) | |
tree | 36704658b58fcea2bdd62a3d810dccf452e02828 /synapse/storage/_base.py | |
parent | Merge pull request #692 from matrix-org/markjh/replicate_reshuffle (diff) | |
download | synapse-a1e0d316ea354fce07939073d9afc9c5d1013939.tar.xz |
Move _get_cache_dict into the SQLBaseStore
Diffstat (limited to 'synapse/storage/_base.py')
-rw-r--r-- | synapse/storage/_base.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/synapse/storage/_base.py b/synapse/storage/_base.py index b75b79df36..04d7fcf6d6 100644 --- a/synapse/storage/_base.py +++ b/synapse/storage/_base.py @@ -816,6 +816,40 @@ class SQLBaseStore(object): self._next_stream_id += 1 return i + def _get_cache_dict(self, db_conn, table, entity_column, stream_column, + max_value): + # Fetch a mapping of room_id -> max stream position for "recent" rooms. + # It doesn't really matter how many we get, the StreamChangeCache will + # do the right thing to ensure it respects the max size of cache. + sql = ( + "SELECT %(entity)s, MAX(%(stream)s) FROM %(table)s" + " WHERE %(stream)s > ? - 100000" + " GROUP BY %(entity)s" + ) % { + "table": table, + "entity": entity_column, + "stream": stream_column, + } + + sql = self.database_engine.convert_param_style(sql) + + txn = db_conn.cursor() + txn.execute(sql, (int(max_value),)) + rows = txn.fetchall() + txn.close() + + cache = { + row[0]: int(row[1]) + for row in rows + } + + if cache: + min_val = min(cache.values()) + else: + min_val = max_value + + return cache, min_val + class _RollbackButIsFineException(Exception): """ This exception is used to rollback a transaction without implying |