Fix bug where we kept re-requesting a remote server's key repeatedly. (#16257)
* Correctly handle multiple rows per server/key * Newsfilepull/16260/head
parent
02bc5906ec
commit
c9cec2daed
|
@ -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.
|
|
@ -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)))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue