Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Ensure that we never stop reconnecting to redis (#9391)
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston authored and Half-Shot committed Feb 17, 2021
1 parent 7b990f6 commit fd63237
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog.d/9391.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix bug where Synapse would occaisonally stop reconnecting after the connection was lost.
26 changes: 24 additions & 2 deletions synapse/replication/tcp/redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@

import logging
from inspect import isawaitable
from typing import TYPE_CHECKING, Optional, Type, cast
from typing import TYPE_CHECKING, Generic, Optional, Type, TypeVar, cast

import attr
import txredisapi

from synapse.logging.context import PreserveLoggingContext, make_deferred_yieldable
Expand All @@ -42,6 +43,24 @@

logger = logging.getLogger(__name__)

T = TypeVar("T")
V = TypeVar("V")


@attr.s
class ConstantProperty(Generic[T, V]):
"""A descriptor that returns the given constant, ignoring attempts to set
it.
"""

constant = attr.ib() # type: V

def __get__(self, obj: Optional[T], objtype: Type[T] = None) -> V:
return self.constant

def __set__(self, obj: Optional[T], value: V):
pass


class RedisSubscriber(txredisapi.SubscriberProtocol, AbstractConnection):
"""Connection to redis subscribed to replication stream.
Expand Down Expand Up @@ -195,6 +214,10 @@ class SynapseRedisFactory(txredisapi.RedisFactory):
we detect dead connections.
"""

# We want to *always* retry connecting, txredisapi will stop if there is a
# failure during certain operations, e.g. during AUTH.
continueTrying = cast(bool, ConstantProperty(True))

def __init__(
self,
hs: "HomeServer",
Expand Down Expand Up @@ -243,7 +266,6 @@ class RedisDirectTcpReplicationClientFactory(SynapseRedisFactory):
"""

maxDelay = 5
continueTrying = True
protocol = RedisSubscriber

def __init__(
Expand Down

0 comments on commit fd63237

Please sign in to comment.