mirror of
https://github.com/element-hq/synapse
synced 2024-08-17 12:50:54 +00:00
Generalise _maybe_store_room_on_invite (#8754)
There's a handy function called maybe_store_room_on_invite which allows us to create an entry in the rooms table for a room and its version for which we aren't joined to yet, but we can reference when ingesting events about. This is currently used for invites where we receive some stripped state about the room and pass it down via /sync to the client, without us being in the room yet. There is a similar requirement for knocking, where we will eventually do the same thing, and need an entry in the rooms table as well. Thus, reusing this function works, however its name needs to be generalised a bit. Separated out from #6739.
This commit is contained in:
parent
34226ec761
commit
e8d0853739
4 changed files with 18 additions and 13 deletions
1
changelog.d/8754.misc
Normal file
1
changelog.d/8754.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Generalise `RoomStore.maybe_store_room_on_invite` to handle other, non-invite membership events.
|
|
@ -67,7 +67,7 @@ from synapse.replication.http.devices import ReplicationUserDevicesResyncRestSer
|
||||||
from synapse.replication.http.federation import (
|
from synapse.replication.http.federation import (
|
||||||
ReplicationCleanRoomRestServlet,
|
ReplicationCleanRoomRestServlet,
|
||||||
ReplicationFederationSendEventsRestServlet,
|
ReplicationFederationSendEventsRestServlet,
|
||||||
ReplicationStoreRoomOnInviteRestServlet,
|
ReplicationStoreRoomOnOutlierMembershipRestServlet,
|
||||||
)
|
)
|
||||||
from synapse.state import StateResolutionStore
|
from synapse.state import StateResolutionStore
|
||||||
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
|
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
|
||||||
|
@ -152,12 +152,14 @@ class FederationHandler(BaseHandler):
|
||||||
self._user_device_resync = ReplicationUserDevicesResyncRestServlet.make_client(
|
self._user_device_resync = ReplicationUserDevicesResyncRestServlet.make_client(
|
||||||
hs
|
hs
|
||||||
)
|
)
|
||||||
self._maybe_store_room_on_invite = ReplicationStoreRoomOnInviteRestServlet.make_client(
|
self._maybe_store_room_on_outlier_membership = ReplicationStoreRoomOnOutlierMembershipRestServlet.make_client(
|
||||||
hs
|
hs
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self._device_list_updater = hs.get_device_handler().device_list_updater
|
self._device_list_updater = hs.get_device_handler().device_list_updater
|
||||||
self._maybe_store_room_on_invite = self.store.maybe_store_room_on_invite
|
self._maybe_store_room_on_outlier_membership = (
|
||||||
|
self.store.maybe_store_room_on_outlier_membership
|
||||||
|
)
|
||||||
|
|
||||||
# When joining a room we need to queue any events for that room up.
|
# When joining a room we need to queue any events for that room up.
|
||||||
# For each room, a list of (pdu, origin) tuples.
|
# For each room, a list of (pdu, origin) tuples.
|
||||||
|
@ -1617,7 +1619,7 @@ class FederationHandler(BaseHandler):
|
||||||
# keep a record of the room version, if we don't yet know it.
|
# keep a record of the room version, if we don't yet know it.
|
||||||
# (this may get overwritten if we later get a different room version in a
|
# (this may get overwritten if we later get a different room version in a
|
||||||
# join dance).
|
# join dance).
|
||||||
await self._maybe_store_room_on_invite(
|
await self._maybe_store_room_on_outlier_membership(
|
||||||
room_id=event.room_id, room_version=room_version
|
room_id=event.room_id, room_version=room_version
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -254,20 +254,20 @@ class ReplicationCleanRoomRestServlet(ReplicationEndpoint):
|
||||||
return 200, {}
|
return 200, {}
|
||||||
|
|
||||||
|
|
||||||
class ReplicationStoreRoomOnInviteRestServlet(ReplicationEndpoint):
|
class ReplicationStoreRoomOnOutlierMembershipRestServlet(ReplicationEndpoint):
|
||||||
"""Called to clean up any data in DB for a given room, ready for the
|
"""Called to clean up any data in DB for a given room, ready for the
|
||||||
server to join the room.
|
server to join the room.
|
||||||
|
|
||||||
Request format:
|
Request format:
|
||||||
|
|
||||||
POST /_synapse/replication/store_room_on_invite/:room_id/:txn_id
|
POST /_synapse/replication/store_room_on_outlier_membership/:room_id/:txn_id
|
||||||
|
|
||||||
{
|
{
|
||||||
"room_version": "1",
|
"room_version": "1",
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
NAME = "store_room_on_invite"
|
NAME = "store_room_on_outlier_membership"
|
||||||
PATH_ARGS = ("room_id",)
|
PATH_ARGS = ("room_id",)
|
||||||
|
|
||||||
def __init__(self, hs):
|
def __init__(self, hs):
|
||||||
|
@ -282,7 +282,7 @@ class ReplicationStoreRoomOnInviteRestServlet(ReplicationEndpoint):
|
||||||
async def _handle_request(self, request, room_id):
|
async def _handle_request(self, request, room_id):
|
||||||
content = parse_json_object_from_request(request)
|
content = parse_json_object_from_request(request)
|
||||||
room_version = KNOWN_ROOM_VERSIONS[content["room_version"]]
|
room_version = KNOWN_ROOM_VERSIONS[content["room_version"]]
|
||||||
await self.store.maybe_store_room_on_invite(room_id, room_version)
|
await self.store.maybe_store_room_on_outlier_membership(room_id, room_version)
|
||||||
return 200, {}
|
return 200, {}
|
||||||
|
|
||||||
|
|
||||||
|
@ -291,4 +291,4 @@ def register_servlets(hs, http_server):
|
||||||
ReplicationFederationSendEduRestServlet(hs).register(http_server)
|
ReplicationFederationSendEduRestServlet(hs).register(http_server)
|
||||||
ReplicationGetQueryRestServlet(hs).register(http_server)
|
ReplicationGetQueryRestServlet(hs).register(http_server)
|
||||||
ReplicationCleanRoomRestServlet(hs).register(http_server)
|
ReplicationCleanRoomRestServlet(hs).register(http_server)
|
||||||
ReplicationStoreRoomOnInviteRestServlet(hs).register(http_server)
|
ReplicationStoreRoomOnOutlierMembershipRestServlet(hs).register(http_server)
|
||||||
|
|
|
@ -1240,13 +1240,15 @@ class RoomStore(RoomBackgroundUpdateStore, RoomWorkerStore, SearchStore):
|
||||||
logger.error("store_room with room_id=%s failed: %s", room_id, e)
|
logger.error("store_room with room_id=%s failed: %s", room_id, e)
|
||||||
raise StoreError(500, "Problem creating room.")
|
raise StoreError(500, "Problem creating room.")
|
||||||
|
|
||||||
async def maybe_store_room_on_invite(self, room_id: str, room_version: RoomVersion):
|
async def maybe_store_room_on_outlier_membership(
|
||||||
|
self, room_id: str, room_version: RoomVersion
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
When we receive an invite over federation, store the version of the room if we
|
When we receive an invite or any other event over federation that may relate to a room
|
||||||
don't already know the room version.
|
we are not in, store the version of the room if we don't already know the room version.
|
||||||
"""
|
"""
|
||||||
await self.db_pool.simple_upsert(
|
await self.db_pool.simple_upsert(
|
||||||
desc="maybe_store_room_on_invite",
|
desc="maybe_store_room_on_outlier_membership",
|
||||||
table="rooms",
|
table="rooms",
|
||||||
keyvalues={"room_id": room_id},
|
keyvalues={"room_id": room_id},
|
||||||
values={},
|
values={},
|
||||||
|
|
Loading…
Reference in a new issue