diff --git a/federationsender/api/api.go b/federationsender/api/api.go index 281165e84..cea0010d6 100644 --- a/federationsender/api/api.go +++ b/federationsender/api/api.go @@ -27,7 +27,7 @@ type FederationClientError struct { } func (e *FederationClientError) Error() string { - return fmt.Sprintf("%s - (retry_after=%d, blacklisted=%v", e.Err, e.RetryAfter, e.Blacklisted) + return fmt.Sprintf("%s - (retry_after=%d, blacklisted=%v)", e.Err, e.RetryAfter, e.Blacklisted) } // FederationSenderInternalAPI is used to query information from the federation sender. diff --git a/federationsender/internal/api.go b/federationsender/internal/api.go index 956981377..dd7cb63cf 100644 --- a/federationsender/internal/api.go +++ b/federationsender/internal/api.go @@ -10,6 +10,7 @@ import ( "github.com/matrix-org/dendrite/federationsender/storage" "github.com/matrix-org/dendrite/internal/config" roomserverAPI "github.com/matrix-org/dendrite/roomserver/api" + "github.com/matrix-org/gomatrix" "github.com/matrix-org/gomatrixserverlib" "go.uber.org/atomic" ) @@ -67,6 +68,21 @@ func (a *FederationSenderInternalAPI) isBlacklistedOrBackingOff(s gomatrixserver return stats, nil } +func failBlacklistableError(err error, stats *statistics.ServerStatistics) { + if err == nil { + return + } + mxerr, ok := err.(gomatrix.HTTPError) + if !ok { + stats.Failure() + return + } + if mxerr.Code == 500 { + stats.Failure() + return + } +} + func (a *FederationSenderInternalAPI) GetUserDevices( ctx context.Context, s gomatrixserverlib.ServerName, userID string, ) (gomatrixserverlib.RespUserDevices, error) { @@ -77,7 +93,7 @@ func (a *FederationSenderInternalAPI) GetUserDevices( } res, err = a.federation.GetUserDevices(ctx, s, userID) if err != nil { - stats.Failure() + failBlacklistableError(err, stats) return res, &api.FederationClientError{ Err: err.Error(), } @@ -96,7 +112,7 @@ func (a *FederationSenderInternalAPI) ClaimKeys( } res, err = a.federation.ClaimKeys(ctx, s, oneTimeKeys) if err != nil { - stats.Failure() + failBlacklistableError(err, stats) return res, &api.FederationClientError{ Err: err.Error(), } @@ -115,7 +131,7 @@ func (a *FederationSenderInternalAPI) QueryKeys( } res, err = a.federation.QueryKeys(ctx, s, keys) if err != nil { - stats.Failure() + failBlacklistableError(err, stats) return res, &api.FederationClientError{ Err: err.Error(), } diff --git a/federationsender/inthttp/client.go b/federationsender/inthttp/client.go index 846c6d746..79e220c38 100644 --- a/federationsender/inthttp/client.go +++ b/federationsender/inthttp/client.go @@ -159,7 +159,7 @@ func (h *httpFederationSenderInternalAPI) GetUserDevices( } var response getUserDevices apiURL := h.federationSenderURL + FederationSenderGetUserDevicesPath - err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response) + err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response) if err != nil { return result, err } @@ -189,7 +189,7 @@ func (h *httpFederationSenderInternalAPI) ClaimKeys( } var response claimKeys apiURL := h.federationSenderURL + FederationSenderClaimKeysPath - err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response) + err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response) if err != nil { return result, err } @@ -219,7 +219,7 @@ func (h *httpFederationSenderInternalAPI) QueryKeys( } var response queryKeys apiURL := h.federationSenderURL + FederationSenderQueryKeysPath - err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, request, response) + err := httputil.PostJSON(ctx, span, h.httpClient, apiURL, &request, &response) if err != nil { return result, err }