diff --git a/synapse/crypto/keyring.py b/synapse/crypto/keyring.py
index 9e9b1c1c86..4a34b798a5 100644
--- a/synapse/crypto/keyring.py
+++ b/synapse/crypto/keyring.py
@@ -544,22 +544,18 @@ class BaseV2KeyFetcher(KeyFetcher):
key_json_bytes = encode_canonical_json(response_json)
- await make_deferred_yieldable(
- defer.gatherResults(
- [
- run_in_background(
- self.store.store_server_keys_json,
- server_name=server_name,
- key_id=key_id,
- from_server=from_server,
- ts_now_ms=time_added_ms,
- ts_expires_ms=ts_valid_until_ms,
- key_json_bytes=key_json_bytes,
- )
- for key_id in verify_keys
- ],
- consumeErrors=True,
- ).addErrback(unwrapFirstError)
+ await self.store.store_server_keys_json_multi(
+ [
+ (
+ server_name,
+ key_id,
+ from_server,
+ time_added_ms,
+ ts_valid_until_ms,
+ key_json_bytes,
+ )
+ for key_id in verify_keys
+ ],
)
return verify_keys
diff --git a/synapse/storage/databases/main/keys.py b/synapse/storage/databases/main/keys.py
index 6990f3ed1d..1f01a5df0a 100644
--- a/synapse/storage/databases/main/keys.py
+++ b/synapse/storage/databases/main/keys.py
@@ -138,6 +138,19 @@ class KeyStore(SQLBaseStore):
for i in invalidations:
invalidate((i,))
+ async def store_server_keys_json_multi(
+ self,
+ entries: List[Tuple[str, str, str, int, int, bytes]],
+ ):
+ await self.db_pool.simple_upsert_many(
+ table="server_keys_json",
+ key_names=("server_name", "key_id", "from_server"),
+ key_values=[e[:3] for e in entries],
+ value_names=("ts_added_ms", "ts_valid_until_ms", "key_json"),
+ value_values=[(e[3], e[4], db_binary_type(e[5])) for e in entries],
+ desc="store_server_keys_json_multi",
+ )
+
async def store_server_keys_json(
self,
server_name: str,
|