diff options
author | Erik Johnston <erik@matrix.org> | 2018-03-01 15:53:04 +0000 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2018-03-01 17:08:17 +0000 |
commit | a83c514d1f8e1573246e0235c97ba140cbff12db (patch) | |
tree | 804c9d8da51efc28551c2d4845f76a7b85ad8b95 /synapse/storage | |
parent | Add some caches to help read marker API (diff) | |
download | synapse-a83c514d1f8e1573246e0235c97ba140cbff12db.tar.xz |
Improve caching for read_marker API
We add a new storage function to get a paritcular type of room account data. This allows us to prefill the cache when updating that acount data.
Diffstat (limited to 'synapse/storage')
-rw-r--r-- | synapse/storage/account_data.py | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/synapse/storage/account_data.py b/synapse/storage/account_data.py index c062e03d13..077b4faa5f 100644 --- a/synapse/storage/account_data.py +++ b/synapse/storage/account_data.py @@ -157,6 +157,38 @@ class AccountDataWorkerStore(SQLBaseStore): "get_account_data_for_room", get_account_data_for_room_txn ) + @cached(num_args=3, max_entries=5000) + def get_account_data_for_room_and_type(self, user_id, room_id, account_data_type): + """Get all the client account_data for a user for a room. + + Args: + user_id(str): The user to get the account_data for. + room_id(str): The room to get the account_data for. + account_data_type (str): The account data type to get. + Returns: + A deferred dict of the room account_data for that type, or None if + there isn't any set. + """ + def get_account_data_for_room_and_type_txn(txn): + content_json = self._simple_select_one_onecol_txn( + txn, + table="room_account_data", + keyvalues={ + "user_id": user_id, + "room_id": room_id, + "account_data_type": account_data_type, + }, + retcol="content", + allow_none=True + ) + + return json.loads(content_json) if content_json else None + + return self.runInteraction( + "get_account_data_for_room_and_type", + get_account_data_for_room_and_type_txn, + ) + def get_all_updated_account_data(self, last_global_id, last_room_id, current_id, limit): """Get all the client account_data that has changed on the server @@ -312,6 +344,9 @@ class AccountDataStore(AccountDataWorkerStore): self._account_data_stream_cache.entity_has_changed(user_id, next_id) self.get_account_data_for_user.invalidate((user_id,)) self.get_account_data_for_room.invalidate((user_id, room_id,)) + self.get_account_data_for_room_and_type.prefill( + (user_id, room_id, account_data_type,), content, + ) result = self._account_data_id_gen.get_current_token() defer.returnValue(result) |