Fix bug where we kept re-requesting a remote server's key repeatedly. (#16257)

* Correctly handle multiple rows per server/key

* Newsfile
pull/16260/head
Erik Johnston 2023-09-05 20:27:41 +01:00 committed by GitHub
parent 02bc5906ec
commit c9cec2daed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 6 deletions

1
changelog.d/16257.bugfix Normal file
View File

@ -0,0 +1 @@
Fix long-standing bug where we kept re-requesting a remote server's key repeatedly, potentially causing delays in receiving events over federation.

View File

@ -221,12 +221,17 @@ class KeyStore(CacheInvalidationWorkerStore):
"""Processes a batch of keys to fetch, and adds the result to `keys`.""" """Processes a batch of keys to fetch, and adds the result to `keys`."""
# batch_iter always returns tuples so it's safe to do len(batch) # batch_iter always returns tuples so it's safe to do len(batch)
sql = """ where_clause = " OR (server_name=? AND key_id=?)" * len(batch)
# `server_keys_json` can have multiple entries per server (one per
# remote server we fetched from, if using perspectives). Order by
# `ts_added_ms` so the most recently fetched one always wins.
sql = f"""
SELECT server_name, key_id, key_json, ts_valid_until_ms SELECT server_name, key_id, key_json, ts_valid_until_ms
FROM server_keys_json WHERE 1=0 FROM server_keys_json WHERE 1=0
""" + " OR (server_name=? AND key_id=?)" * len( {where_clause}
batch ORDER BY ts_added_ms
) """
txn.execute(sql, tuple(itertools.chain.from_iterable(batch))) txn.execute(sql, tuple(itertools.chain.from_iterable(batch)))