From ce2670bcd9c127416a7cc8cc22da2c37dca8f64c Mon Sep 17 00:00:00 2001 From: Devon Hudson Date: Thu, 6 Oct 2022 16:58:25 -0600 Subject: [PATCH] Remove server from blacklist cache when retrying sending to that server --- federationapi/queue/queue.go | 1 + federationapi/statistics/statistics.go | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/federationapi/queue/queue.go b/federationapi/queue/queue.go index 88664fcf9..18c481ad2 100644 --- a/federationapi/queue/queue.go +++ b/federationapi/queue/queue.go @@ -329,6 +329,7 @@ func (oqs *OutgoingQueues) RetryServer(srv gomatrixserverlib.ServerName) { if oqs.disabled { return } + oqs.statistics.ForServer(srv).RemoveBlacklist() if queue := oqs.getQueue(srv); queue != nil { queue.wakeQueueIfNeeded() } diff --git a/federationapi/statistics/statistics.go b/federationapi/statistics/statistics.go index db6d5c735..f03b2d27a 100644 --- a/federationapi/statistics/statistics.go +++ b/federationapi/statistics/statistics.go @@ -83,6 +83,7 @@ func (s *ServerStatistics) duration(count uint32) time.Duration { func (s *ServerStatistics) cancel() { s.blacklisted.Store(false) s.backoffUntil.Store(time.Time{}) + s.backoffCount.Store(0) select { case s.interrupt <- struct{}{}: default: @@ -96,7 +97,6 @@ func (s *ServerStatistics) cancel() { func (s *ServerStatistics) Success() { s.cancel() s.successCounter.Inc() - s.backoffCount.Store(0) if s.statistics.DB != nil { if err := s.statistics.DB.RemoveServerFromBlacklist(s.serverName); err != nil { logrus.WithError(err).Errorf("Failed to remove %q from blacklist", s.serverName) @@ -174,6 +174,11 @@ func (s *ServerStatistics) Blacklisted() bool { return s.blacklisted.Load() } +// RemoveBlacklist removes the blacklisted status from the server. +func (s *ServerStatistics) RemoveBlacklist() { + s.cancel() +} + // SuccessCount returns the number of successful requests. This is // usually useful in constructing transaction IDs. func (s *ServerStatistics) SuccessCount() uint32 {