mirror of
https://git.anonymousland.org/anonymousland/synapse-product.git
synced 2025-08-14 18:15:25 -04:00
Federation Sender & Appservice Pusher Stream Optimisations (#13251)
* Replace `get_new_events_for_appservice` with `get_all_new_events_stream` The functions were near identical and this brings the AS worker closer to the way federation senders work which can allow for multiple workers to handle AS traffic. * Pull received TS alongside events when processing the stream This avoids an extra query -per event- when both federation sender and appservice pusher process events.
This commit is contained in:
parent
fe15a865a5
commit
21eeacc995
7 changed files with 62 additions and 89 deletions
|
@ -371,52 +371,30 @@ class ApplicationServiceTransactionWorkerStore(
|
|||
device_list_summary=DeviceListUpdates(),
|
||||
)
|
||||
|
||||
async def get_appservice_last_pos(self) -> int:
|
||||
"""
|
||||
Get the last stream ordering position for the appservice process.
|
||||
"""
|
||||
|
||||
return await self.db_pool.simple_select_one_onecol(
|
||||
table="appservice_stream_position",
|
||||
retcol="stream_ordering",
|
||||
keyvalues={},
|
||||
desc="get_appservice_last_pos",
|
||||
)
|
||||
|
||||
async def set_appservice_last_pos(self, pos: int) -> None:
|
||||
def set_appservice_last_pos_txn(txn: LoggingTransaction) -> None:
|
||||
txn.execute(
|
||||
"UPDATE appservice_stream_position SET stream_ordering = ?", (pos,)
|
||||
)
|
||||
"""
|
||||
Set the last stream ordering position for the appservice process.
|
||||
"""
|
||||
|
||||
await self.db_pool.runInteraction(
|
||||
"set_appservice_last_pos", set_appservice_last_pos_txn
|
||||
await self.db_pool.simple_update_one(
|
||||
table="appservice_stream_position",
|
||||
keyvalues={},
|
||||
updatevalues={"stream_ordering": pos},
|
||||
desc="set_appservice_last_pos",
|
||||
)
|
||||
|
||||
async def get_new_events_for_appservice(
|
||||
self, current_id: int, limit: int
|
||||
) -> Tuple[int, List[EventBase]]:
|
||||
"""Get all new events for an appservice"""
|
||||
|
||||
def get_new_events_for_appservice_txn(
|
||||
txn: LoggingTransaction,
|
||||
) -> Tuple[int, List[str]]:
|
||||
sql = (
|
||||
"SELECT e.stream_ordering, e.event_id"
|
||||
" FROM events AS e"
|
||||
" WHERE"
|
||||
" (SELECT stream_ordering FROM appservice_stream_position)"
|
||||
" < e.stream_ordering"
|
||||
" AND e.stream_ordering <= ?"
|
||||
" ORDER BY e.stream_ordering ASC"
|
||||
" LIMIT ?"
|
||||
)
|
||||
|
||||
txn.execute(sql, (current_id, limit))
|
||||
rows = txn.fetchall()
|
||||
|
||||
upper_bound = current_id
|
||||
if len(rows) == limit:
|
||||
upper_bound = rows[-1][0]
|
||||
|
||||
return upper_bound, [row[1] for row in rows]
|
||||
|
||||
upper_bound, event_ids = await self.db_pool.runInteraction(
|
||||
"get_new_events_for_appservice", get_new_events_for_appservice_txn
|
||||
)
|
||||
|
||||
events = await self.get_events_as_list(event_ids, get_prev_content=True)
|
||||
|
||||
return upper_bound, events
|
||||
|
||||
async def get_type_stream_id_for_appservice(
|
||||
self, service: ApplicationService, type: str
|
||||
) -> int:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue