Improve backfill robustness by trying more servers. (#13890)

Co-authored-by: Eric Eastwood <erice@element.io>
This commit is contained in:
reivilibre 2022-09-29 10:00:02 +00:00 committed by GitHub
parent 5f659d4a88
commit 73ecff7e9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 2 deletions

1
changelog.d/13890.misc Normal file
View File

@ -0,0 +1 @@
Improve backfill robustness by trying more servers when we get a `4xx` error back.

View File

@ -417,6 +417,15 @@ class FederationHandler:
async def try_backfill(domains: Collection[str]) -> bool: async def try_backfill(domains: Collection[str]) -> bool:
# TODO: Should we try multiple of these at a time? # TODO: Should we try multiple of these at a time?
# Number of contacted remote homeservers that have denied our backfill
# request with a 4xx code.
denied_count = 0
# Maximum number of contacted remote homeservers that can deny our
# backfill request with 4xx codes before we give up.
max_denied_count = 5
for dom in domains: for dom in domains:
# We don't want to ask our own server for information we don't have # We don't want to ask our own server for information we don't have
if dom == self.server_name: if dom == self.server_name:
@ -435,13 +444,33 @@ class FederationHandler:
continue continue
except HttpResponseException as e: except HttpResponseException as e:
if 400 <= e.code < 500: if 400 <= e.code < 500:
raise e.to_synapse_error() logger.warning(
"Backfill denied from %s because %s [%d/%d]",
dom,
e,
denied_count,
max_denied_count,
)
denied_count += 1
if denied_count >= max_denied_count:
return False
continue
logger.info("Failed to backfill from %s because %s", dom, e) logger.info("Failed to backfill from %s because %s", dom, e)
continue continue
except CodeMessageException as e: except CodeMessageException as e:
if 400 <= e.code < 500: if 400 <= e.code < 500:
raise logger.warning(
"Backfill denied from %s because %s [%d/%d]",
dom,
e,
denied_count,
max_denied_count,
)
denied_count += 1
if denied_count >= max_denied_count:
return False
continue
logger.info("Failed to backfill from %s because %s", dom, e) logger.info("Failed to backfill from %s because %s", dom, e)
continue continue