-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Ensure that we never stop reconnecting to redis #9391
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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. |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -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 | ||||||
|
@@ -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 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FWIW we can now do the following I think?
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thought that was py3.6? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, maybe. I'm guessing this is why you need the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe it should understand descriptors enough to understand, but empirically it didn't. Possibly because of the |
||||||
|
||||||
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. | ||||||
|
@@ -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", | ||||||
|
@@ -243,7 +266,6 @@ class RedisDirectTcpReplicationClientFactory(SynapseRedisFactory): | |||||
""" | ||||||
|
||||||
maxDelay = 5 | ||||||
continueTrying = True | ||||||
protocol = RedisSubscriber | ||||||
|
||||||
def __init__( | ||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you just use the
@property
decorator (or does that raise when attempting to set it?)There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that raises. We could do
continueTrying = property(lambda _: True, lambda _a, _b: True)
but eww