Make get_room_version use cached get_room_version_id. (#11808)

This commit is contained in:
lukasdenk 2022-03-02 11:35:34 +01:00 committed by GitHub
parent 5f62a094de
commit 8e56a1b73c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 15 deletions

1
changelog.d/11808.misc Normal file
View File

@ -0,0 +1 @@
Make method `get_room_version` use cached `get_room_version_id`.

View File

@ -42,6 +42,16 @@ logger = logging.getLogger(__name__)
MAX_STATE_DELTA_HOPS = 100 MAX_STATE_DELTA_HOPS = 100
def _retrieve_and_check_room_version(room_id: str, room_version_id: str) -> RoomVersion:
v = KNOWN_ROOM_VERSIONS.get(room_version_id)
if not v:
raise UnsupportedRoomVersionError(
"Room %s uses a room version %s which is no longer supported"
% (room_id, room_version_id)
)
return v
# this inherits from EventsWorkerStore because it calls self.get_events # this inherits from EventsWorkerStore because it calls self.get_events
class StateGroupWorkerStore(EventsWorkerStore, SQLBaseStore): class StateGroupWorkerStore(EventsWorkerStore, SQLBaseStore):
"""The parts of StateGroupStore that can be called from workers.""" """The parts of StateGroupStore that can be called from workers."""
@ -62,11 +72,8 @@ class StateGroupWorkerStore(EventsWorkerStore, SQLBaseStore):
Typically this happens if support for the room's version has been Typically this happens if support for the room's version has been
removed from Synapse. removed from Synapse.
""" """
return await self.db_pool.runInteraction( room_version_id = await self.get_room_version_id(room_id)
"get_room_version_txn", return _retrieve_and_check_room_version(room_id, room_version_id)
self.get_room_version_txn,
room_id,
)
def get_room_version_txn( def get_room_version_txn(
self, txn: LoggingTransaction, room_id: str self, txn: LoggingTransaction, room_id: str
@ -82,15 +89,7 @@ class StateGroupWorkerStore(EventsWorkerStore, SQLBaseStore):
removed from Synapse. removed from Synapse.
""" """
room_version_id = self.get_room_version_id_txn(txn, room_id) room_version_id = self.get_room_version_id_txn(txn, room_id)
v = KNOWN_ROOM_VERSIONS.get(room_version_id) return _retrieve_and_check_room_version(room_id, room_version_id)
if not v:
raise UnsupportedRoomVersionError(
"Room %s uses a room version %s which is no longer supported"
% (room_id, room_version_id)
)
return v
@cached(max_entries=10000) @cached(max_entries=10000)
async def get_room_version_id(self, room_id: str) -> str: async def get_room_version_id(self, room_id: str) -> str:

View File

@ -658,7 +658,7 @@ class SpaceSummaryTestCase(unittest.HomeserverTestCase):
def test_unknown_room_version(self): def test_unknown_room_version(self):
""" """
If an room with an unknown room version is encountered it should not cause If a room with an unknown room version is encountered it should not cause
the entire summary to skip. the entire summary to skip.
""" """
# Poke the database and update the room version to an unknown one. # Poke the database and update the room version to an unknown one.
@ -670,6 +670,9 @@ class SpaceSummaryTestCase(unittest.HomeserverTestCase):
desc="updated-room-version", desc="updated-room-version",
) )
) )
# Invalidate method so that it returns the currently updated version
# instead of the cached version.
self.hs.get_datastores().main.get_room_version_id.invalidate((self.room,))
# The result should have only the space, along with a link from space -> room. # The result should have only the space, along with a link from space -> room.
expected = [(self.space, [self.room])] expected = [(self.space, [self.room])]