Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit f31f8e6

Browse files
authored
Remove stream ordering from Metadata dict (#8452)
There's no need for it to be in the dict as well as the events table. Instead, we store it in a separate attribute in the EventInternalMetadata object, and populate that on load. This means that we can rely on it being correctly populated for any event which has been persited to the database.
1 parent f64c6aa commit f31f8e6

File tree

13 files changed

+53
-33
lines changed

13 files changed

+53
-33
lines changed

changelog.d/8452.misc

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove redundant databae loads of stream_ordering for events we already have.

synapse/events/__init__.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,16 @@ def __get__(self, instance, owner=None):
9797

9898

9999
class _EventInternalMetadata:
100-
__slots__ = ["_dict"]
100+
__slots__ = ["_dict", "stream_ordering"]
101101

102102
def __init__(self, internal_metadata_dict: JsonDict):
103103
# we have to copy the dict, because it turns out that the same dict is
104104
# reused. TODO: fix that
105105
self._dict = dict(internal_metadata_dict)
106106

107+
# the stream ordering of this event. None, until it has been persisted.
108+
self.stream_ordering = None # type: Optional[int]
109+
107110
outlier = DictProperty("outlier") # type: bool
108111
out_of_band_membership = DictProperty("out_of_band_membership") # type: bool
109112
send_on_behalf_of = DictProperty("send_on_behalf_of") # type: str
@@ -113,7 +116,6 @@ def __init__(self, internal_metadata_dict: JsonDict):
113116
redacted = DictProperty("redacted") # type: bool
114117
txn_id = DictProperty("txn_id") # type: str
115118
token_id = DictProperty("token_id") # type: str
116-
stream_ordering = DictProperty("stream_ordering") # type: int
117119

118120
# XXX: These are set by StreamWorkerStore._set_before_and_after.
119121
# I'm pretty sure that these are never persisted to the database, so shouldn't

synapse/events/utils.py

+5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ def prune_event(event: EventBase) -> EventBase:
4949
pruned_event_dict, event.room_version, event.internal_metadata.get_dict()
5050
)
5151

52+
# copy the internal fields
53+
pruned_event.internal_metadata.stream_ordering = (
54+
event.internal_metadata.stream_ordering
55+
)
56+
5257
# Mark the event as redacted
5358
pruned_event.internal_metadata.redacted = True
5459

synapse/federation/sender/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ async def _send_pdu(self, pdu: EventBase, destinations: Iterable[str]) -> None:
297297
sent_pdus_destination_dist_total.inc(len(destinations))
298298
sent_pdus_destination_dist_count.inc()
299299

300+
assert pdu.internal_metadata.stream_ordering
301+
300302
# track the fact that we have a PDU for these destinations,
301303
# to allow us to perform catch-up later on if the remote is unreachable
302304
# for a while.

synapse/federation/sender/per_destination_queue.py

+2
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ def send_pdu(self, pdu: EventBase) -> None:
158158
# yet know if we have anything to catch up (None)
159159
self._pending_pdus.append(pdu)
160160
else:
161+
assert pdu.internal_metadata.stream_ordering
161162
self._catchup_last_skipped = pdu.internal_metadata.stream_ordering
162163

163164
self.attempt_new_transaction()
@@ -361,6 +362,7 @@ async def _transaction_transmission_loop(self) -> None:
361362
last_successful_stream_ordering = (
362363
final_pdu.internal_metadata.stream_ordering
363364
)
365+
assert last_successful_stream_ordering
364366
await self._store.set_destination_last_successful_stream_ordering(
365367
self._destination, last_successful_stream_ordering
366368
)

synapse/handlers/federation.py

+3
Original file line numberDiff line numberDiff line change
@@ -3008,6 +3008,9 @@ async def _notify_persisted_event(
30083008
elif event.internal_metadata.is_outlier():
30093009
return
30103010

3011+
# the event has been persisted so it should have a stream ordering.
3012+
assert event.internal_metadata.stream_ordering
3013+
30113014
event_pos = PersistedEventPosition(
30123015
self._instance_name, event.internal_metadata.stream_ordering
30133016
)

synapse/handlers/message.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,9 @@ async def send_nonmember_event(
682682
event.event_id,
683683
prev_event.event_id,
684684
)
685-
return await self.store.get_stream_id_for_event(prev_event.event_id)
685+
# we know it was persisted, so must have a stream ordering
686+
assert prev_event.internal_metadata.stream_ordering
687+
return prev_event.internal_metadata.stream_ordering
686688

687689
return await self.handle_new_client_event(
688690
requester=requester, event=event, context=context, ratelimit=ratelimit

synapse/handlers/room_member.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,9 @@ async def _local_membership_update(
194194
)
195195
if duplicate is not None:
196196
# Discard the new event since this membership change is a no-op.
197-
_, stream_id = await self.store.get_event_ordering(duplicate.event_id)
198-
return duplicate.event_id, stream_id
197+
# we know it was persisted, so must have a stream ordering.
198+
assert duplicate.internal_metadata.stream_ordering
199+
return duplicate.event_id, duplicate.internal_metadata.stream_ordering
199200

200201
prev_state_ids = await context.get_prev_state_ids()
201202

@@ -441,12 +442,12 @@ async def _update_membership(
441442
same_membership = old_membership == effective_membership_state
442443
same_sender = requester.user.to_string() == old_state.sender
443444
if same_sender and same_membership and same_content:
444-
_, stream_id = await self.store.get_event_ordering(
445-
old_state.event_id
446-
)
445+
# duplicate event.
446+
# we know it was persisted, so must have a stream ordering.
447+
assert old_state.internal_metadata.stream_ordering
447448
return (
448449
old_state.event_id,
449-
stream_id,
450+
old_state.internal_metadata.stream_ordering,
450451
)
451452

452453
if old_membership in ["ban", "leave"] and action == "kick":

synapse/rest/admin/__init__.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
UsersRestServletV2,
5858
WhoisRestServlet,
5959
)
60+
from synapse.types import RoomStreamToken
6061
from synapse.util.versionstring import get_version_string
6162

6263
logger = logging.getLogger(__name__)
@@ -109,7 +110,9 @@ async def on_POST(self, request, room_id, event_id):
109110
if event.room_id != room_id:
110111
raise SynapseError(400, "Event is for wrong room.")
111112

112-
room_token = await self.store.get_topological_token_for_event(event_id)
113+
room_token = RoomStreamToken(
114+
event.depth, event.internal_metadata.stream_ordering
115+
)
113116
token = await room_token.to_string(self.store)
114117

115118
logger.info("[purge] purging up to token %s (event_id %s)", token, event_id)

synapse/storage/databases/main/events.py

+4
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,10 @@ def _persist_events_txn(
331331
min_stream_order = events_and_contexts[0][0].internal_metadata.stream_ordering
332332
max_stream_order = events_and_contexts[-1][0].internal_metadata.stream_ordering
333333

334+
# stream orderings should have been assigned by now
335+
assert min_stream_order
336+
assert max_stream_order
337+
334338
self._update_forward_extremities_txn(
335339
txn,
336340
new_forward_extremities=new_forward_extremeties,

synapse/storage/databases/main/events_worker.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,7 @@ async def _get_events_from_db(self, event_ids, allow_rejected=False):
723723
internal_metadata_dict=internal_metadata,
724724
rejected_reason=rejected_reason,
725725
)
726+
original_ev.internal_metadata.stream_ordering = row["stream_ordering"]
726727

727728
event_map[event_id] = original_ev
728729

@@ -790,6 +791,8 @@ def _fetch_event_rows(self, txn, event_ids):
790791
791792
* event_id (str)
792793
794+
* stream_ordering (int): stream ordering for this event
795+
793796
* json (str): json-encoded event structure
794797
795798
* internal_metadata (str): json-encoded internal metadata dict
@@ -822,13 +825,15 @@ def _fetch_event_rows(self, txn, event_ids):
822825
sql = """\
823826
SELECT
824827
e.event_id,
825-
e.internal_metadata,
826-
e.json,
827-
e.format_version,
828+
e.stream_ordering,
829+
ej.internal_metadata,
830+
ej.json,
831+
ej.format_version,
828832
r.room_version,
829833
rej.reason
830-
FROM event_json as e
831-
LEFT JOIN rooms r USING (room_id)
834+
FROM events AS e
835+
JOIN event_json AS ej USING (event_id)
836+
LEFT JOIN rooms r ON r.room_id = e.room_id
832837
LEFT JOIN rejections as rej USING (event_id)
833838
WHERE """
834839

@@ -842,11 +847,12 @@ def _fetch_event_rows(self, txn, event_ids):
842847
event_id = row[0]
843848
event_dict[event_id] = {
844849
"event_id": event_id,
845-
"internal_metadata": row[1],
846-
"json": row[2],
847-
"format_version": row[3],
848-
"room_version_id": row[4],
849-
"rejected_reason": row[5],
850+
"stream_ordering": row[1],
851+
"internal_metadata": row[2],
852+
"json": row[3],
853+
"format_version": row[4],
854+
"room_version_id": row[5],
855+
"rejected_reason": row[6],
850856
"redactions": [],
851857
}
852858

synapse/storage/databases/main/stream.py

-13
Original file line numberDiff line numberDiff line change
@@ -589,19 +589,6 @@ async def get_room_events_max_id(self, room_id: Optional[str] = None) -> str:
589589
)
590590
return "t%d-%d" % (topo, token)
591591

592-
async def get_stream_id_for_event(self, event_id: str) -> int:
593-
"""The stream ID for an event
594-
Args:
595-
event_id: The id of the event to look up a stream token for.
596-
Raises:
597-
StoreError if the event wasn't in the database.
598-
Returns:
599-
A stream ID.
600-
"""
601-
return await self.db_pool.runInteraction(
602-
"get_stream_id_for_event", self.get_stream_id_for_event_txn, event_id,
603-
)
604-
605592
def get_stream_id_for_event_txn(
606593
self, txn: LoggingTransaction, event_id: str, allow_none=False,
607594
) -> int:

synapse/storage/persist_events.py

+2
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ async def persist_event(
248248
await make_deferred_yieldable(deferred)
249249

250250
event_stream_id = event.internal_metadata.stream_ordering
251+
# stream ordering should have been assigned by now
252+
assert event_stream_id
251253

252254
pos = PersistedEventPosition(self._instance_name, event_stream_id)
253255
return pos, self.main_store.get_room_max_token()

0 commit comments

Comments
 (0)