mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-03 22:44:49 -04:00
Catch-up after Federation Outage (split, 1) (#8230)
Signed-off-by: Olivier Wilkinson (reivilibre) <olivier@librepush.net>
This commit is contained in:
parent
e351298444
commit
58f61f10f7
7 changed files with 201 additions and 7 deletions
|
@ -15,13 +15,14 @@
|
|||
|
||||
import logging
|
||||
from collections import namedtuple
|
||||
from typing import Optional, Tuple
|
||||
from typing import Iterable, Optional, Tuple
|
||||
|
||||
from canonicaljson import encode_canonical_json
|
||||
|
||||
from synapse.metrics.background_process_metrics import run_as_background_process
|
||||
from synapse.storage._base import SQLBaseStore, db_to_json
|
||||
from synapse.storage.database import DatabasePool
|
||||
from synapse.storage.database import DatabasePool, LoggingTransaction
|
||||
from synapse.storage.engines import PostgresEngine, Sqlite3Engine
|
||||
from synapse.types import JsonDict
|
||||
from synapse.util.caches.expiringcache import ExpiringCache
|
||||
|
||||
|
@ -164,7 +165,9 @@ class TransactionStore(SQLBaseStore):
|
|||
allow_none=True,
|
||||
)
|
||||
|
||||
if result and result["retry_last_ts"] > 0:
|
||||
# check we have a row and retry_last_ts is not null or zero
|
||||
# (retry_last_ts can't be negative)
|
||||
if result and result["retry_last_ts"]:
|
||||
return result
|
||||
else:
|
||||
return None
|
||||
|
@ -273,3 +276,60 @@ class TransactionStore(SQLBaseStore):
|
|||
await self.db_pool.runInteraction(
|
||||
"_cleanup_transactions", _cleanup_transactions_txn
|
||||
)
|
||||
|
||||
async def store_destination_rooms_entries(
|
||||
self, destinations: Iterable[str], room_id: str, stream_ordering: int,
|
||||
) -> None:
|
||||
"""
|
||||
Updates or creates `destination_rooms` entries in batch for a single event.
|
||||
|
||||
Args:
|
||||
destinations: list of destinations
|
||||
room_id: the room_id of the event
|
||||
stream_ordering: the stream_ordering of the event
|
||||
"""
|
||||
|
||||
return await self.db_pool.runInteraction(
|
||||
"store_destination_rooms_entries",
|
||||
self._store_destination_rooms_entries_txn,
|
||||
destinations,
|
||||
room_id,
|
||||
stream_ordering,
|
||||
)
|
||||
|
||||
def _store_destination_rooms_entries_txn(
|
||||
self,
|
||||
txn: LoggingTransaction,
|
||||
destinations: Iterable[str],
|
||||
room_id: str,
|
||||
stream_ordering: int,
|
||||
) -> None:
|
||||
|
||||
# ensure we have a `destinations` row for this destination, as there is
|
||||
# a foreign key constraint.
|
||||
if isinstance(self.database_engine, PostgresEngine):
|
||||
q = """
|
||||
INSERT INTO destinations (destination)
|
||||
VALUES (?)
|
||||
ON CONFLICT DO NOTHING;
|
||||
"""
|
||||
elif isinstance(self.database_engine, Sqlite3Engine):
|
||||
q = """
|
||||
INSERT OR IGNORE INTO destinations (destination)
|
||||
VALUES (?);
|
||||
"""
|
||||
else:
|
||||
raise RuntimeError("Unknown database engine")
|
||||
|
||||
txn.execute_batch(q, ((destination,) for destination in destinations))
|
||||
|
||||
rows = [(destination, room_id) for destination in destinations]
|
||||
|
||||
self.db_pool.simple_upsert_many_txn(
|
||||
txn,
|
||||
"destination_rooms",
|
||||
["destination", "room_id"],
|
||||
rows,
|
||||
["stream_ordering"],
|
||||
[(stream_ordering,)] * len(rows),
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue