Merge pull request #2927 from matrix-org/erikj/read_marker_caches
Improve caching for read_marker API
This commit is contained in:
commit
9e08a93a7b
|
@ -41,9 +41,9 @@ class ReadMarkerHandler(BaseHandler):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
with (yield self.read_marker_linearizer.queue((room_id, user_id))):
|
with (yield self.read_marker_linearizer.queue((room_id, user_id))):
|
||||||
account_data = yield self.store.get_account_data_for_room(user_id, room_id)
|
existing_read_marker = yield self.store.get_account_data_for_room_and_type(
|
||||||
|
user_id, room_id, "m.fully_read",
|
||||||
existing_read_marker = account_data.get("m.fully_read", None)
|
)
|
||||||
|
|
||||||
should_update = True
|
should_update = True
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,10 @@ class SlavedAccountDataStore(TagsWorkerStore, AccountDataWorkerStore, BaseSlaved
|
||||||
(row.data_type, row.user_id,)
|
(row.data_type, row.user_id,)
|
||||||
)
|
)
|
||||||
self.get_account_data_for_user.invalidate((row.user_id,))
|
self.get_account_data_for_user.invalidate((row.user_id,))
|
||||||
|
self.get_account_data_for_room.invalidate((row.user_id, row.room_id,))
|
||||||
|
self.get_account_data_for_room_and_type.invalidate(
|
||||||
|
(row.user_id, row.room_id, row.account_data_type,),
|
||||||
|
)
|
||||||
self._account_data_stream_cache.entity_has_changed(
|
self._account_data_stream_cache.entity_has_changed(
|
||||||
row.user_id, token
|
row.user_id, token
|
||||||
)
|
)
|
||||||
|
|
|
@ -133,6 +133,7 @@ class AccountDataWorkerStore(SQLBaseStore):
|
||||||
for row in rows
|
for row in rows
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@cached(num_args=2)
|
||||||
def get_account_data_for_room(self, user_id, room_id):
|
def get_account_data_for_room(self, user_id, room_id):
|
||||||
"""Get all the client account_data for a user for a room.
|
"""Get all the client account_data for a user for a room.
|
||||||
|
|
||||||
|
@ -156,6 +157,38 @@ class AccountDataWorkerStore(SQLBaseStore):
|
||||||
"get_account_data_for_room", get_account_data_for_room_txn
|
"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 the client account_data of given type 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 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,
|
def get_all_updated_account_data(self, last_global_id, last_room_id,
|
||||||
current_id, limit):
|
current_id, limit):
|
||||||
"""Get all the client account_data that has changed on the server
|
"""Get all the client account_data that has changed on the server
|
||||||
|
@ -310,6 +343,10 @@ class AccountDataStore(AccountDataWorkerStore):
|
||||||
|
|
||||||
self._account_data_stream_cache.entity_has_changed(user_id, next_id)
|
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_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()
|
result = self._account_data_id_gen.get_current_token()
|
||||||
defer.returnValue(result)
|
defer.returnValue(result)
|
||||||
|
|
|
@ -28,7 +28,7 @@ from synapse.util.logutils import log_function
|
||||||
from synapse.util.metrics import Measure
|
from synapse.util.metrics import Measure
|
||||||
from synapse.api.constants import EventTypes
|
from synapse.api.constants import EventTypes
|
||||||
from synapse.api.errors import SynapseError
|
from synapse.api.errors import SynapseError
|
||||||
from synapse.util.caches.descriptors import cached
|
from synapse.util.caches.descriptors import cached, cachedInlineCallbacks
|
||||||
from synapse.types import get_domain_from_id
|
from synapse.types import get_domain_from_id
|
||||||
|
|
||||||
from canonicaljson import encode_canonical_json
|
from canonicaljson import encode_canonical_json
|
||||||
|
@ -2033,7 +2033,7 @@ class EventsStore(EventsWorkerStore):
|
||||||
to_2, so_2 = yield self._get_event_ordering(event_id2)
|
to_2, so_2 = yield self._get_event_ordering(event_id2)
|
||||||
defer.returnValue((to_1, so_1) > (to_2, so_2))
|
defer.returnValue((to_1, so_1) > (to_2, so_2))
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@cachedInlineCallbacks(max_entries=5000)
|
||||||
def _get_event_ordering(self, event_id):
|
def _get_event_ordering(self, event_id):
|
||||||
res = yield self._simple_select_one(
|
res = yield self._simple_select_one(
|
||||||
table="events",
|
table="events",
|
||||||
|
|
Loading…
Reference in New Issue