Enable passing typing stream writers as a list. (#11237)

This makes the typing stream writer config match the other stream writers
that only currently support a single worker.
This commit is contained in:
Nick Barrett 2021-11-03 14:25:47 +00:00 committed by GitHub
parent 2735b3e6f2
commit af54167516
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 24 additions and 16 deletions

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

@ -0,0 +1 @@
Allow `stream_writers.typing` config to be a list of one worker.

View File

@ -63,7 +63,8 @@ class WriterLocations:
Attributes: Attributes:
events: The instances that write to the event and backfill streams. events: The instances that write to the event and backfill streams.
typing: The instance that writes to the typing stream. typing: The instances that write to the typing stream. Currently
can only be a single instance.
to_device: The instances that write to the to_device stream. Currently to_device: The instances that write to the to_device stream. Currently
can only be a single instance. can only be a single instance.
account_data: The instances that write to the account data streams. Currently account_data: The instances that write to the account data streams. Currently
@ -75,9 +76,15 @@ class WriterLocations:
""" """
events = attr.ib( events = attr.ib(
default=["master"], type=List[str], converter=_instance_to_list_converter default=["master"],
type=List[str],
converter=_instance_to_list_converter,
)
typing = attr.ib(
default=["master"],
type=List[str],
converter=_instance_to_list_converter,
) )
typing = attr.ib(default="master", type=str)
to_device = attr.ib( to_device = attr.ib(
default=["master"], default=["master"],
type=List[str], type=List[str],
@ -217,6 +224,11 @@ class WorkerConfig(Config):
% (instance, stream) % (instance, stream)
) )
if len(self.writers.typing) != 1:
raise ConfigError(
"Must only specify one instance to handle `typing` messages."
)
if len(self.writers.to_device) != 1: if len(self.writers.to_device) != 1:
raise ConfigError( raise ConfigError(
"Must only specify one instance to handle `to_device` messages." "Must only specify one instance to handle `to_device` messages."

View File

@ -1232,10 +1232,6 @@ class FederationHandlerRegistry:
self.query_handlers[query_type] = handler self.query_handlers[query_type] = handler
def register_instance_for_edu(self, edu_type: str, instance_name: str) -> None:
"""Register that the EDU handler is on a different instance than master."""
self._edu_type_to_instance[edu_type] = [instance_name]
def register_instances_for_edu( def register_instances_for_edu(
self, edu_type: str, instance_names: List[str] self, edu_type: str, instance_names: List[str]
) -> None: ) -> None:

View File

@ -62,8 +62,8 @@ class FollowerTypingHandler:
if hs.should_send_federation(): if hs.should_send_federation():
self.federation = hs.get_federation_sender() self.federation = hs.get_federation_sender()
if hs.config.worker.writers.typing != hs.get_instance_name(): if hs.get_instance_name() not in hs.config.worker.writers.typing:
hs.get_federation_registry().register_instance_for_edu( hs.get_federation_registry().register_instances_for_edu(
"m.typing", "m.typing",
hs.config.worker.writers.typing, hs.config.worker.writers.typing,
) )
@ -205,7 +205,7 @@ class TypingWriterHandler(FollowerTypingHandler):
def __init__(self, hs: "HomeServer"): def __init__(self, hs: "HomeServer"):
super().__init__(hs) super().__init__(hs)
assert hs.config.worker.writers.typing == hs.get_instance_name() assert hs.get_instance_name() in hs.config.worker.writers.typing
self.auth = hs.get_auth() self.auth = hs.get_auth()
self.notifier = hs.get_notifier() self.notifier = hs.get_notifier()

View File

@ -138,7 +138,7 @@ class ReplicationCommandHandler:
if isinstance(stream, TypingStream): if isinstance(stream, TypingStream):
# Only add TypingStream as a source on the instance in charge of # Only add TypingStream as a source on the instance in charge of
# typing. # typing.
if hs.config.worker.writers.typing == hs.get_instance_name(): if hs.get_instance_name() in hs.config.worker.writers.typing:
self._streams_to_replicate.append(stream) self._streams_to_replicate.append(stream)
continue continue

View File

@ -328,8 +328,7 @@ class TypingStream(Stream):
ROW_TYPE = TypingStreamRow ROW_TYPE = TypingStreamRow
def __init__(self, hs: "HomeServer"): def __init__(self, hs: "HomeServer"):
writer_instance = hs.config.worker.writers.typing if hs.get_instance_name() in hs.config.worker.writers.typing:
if writer_instance == hs.get_instance_name():
# On the writer, query the typing handler # On the writer, query the typing handler
typing_writer_handler = hs.get_typing_writer_handler() typing_writer_handler = hs.get_typing_writer_handler()
update_function: Callable[ update_function: Callable[

View File

@ -914,7 +914,7 @@ class RoomTypingRestServlet(RestServlet):
# If we're not on the typing writer instance we should scream if we get # If we're not on the typing writer instance we should scream if we get
# requests. # requests.
self._is_typing_writer = ( self._is_typing_writer = (
hs.config.worker.writers.typing == hs.get_instance_name() hs.get_instance_name() in hs.config.worker.writers.typing
) )
async def on_PUT( async def on_PUT(

View File

@ -463,7 +463,7 @@ class HomeServer(metaclass=abc.ABCMeta):
@cache_in_self @cache_in_self
def get_typing_writer_handler(self) -> TypingWriterHandler: def get_typing_writer_handler(self) -> TypingWriterHandler:
if self.config.worker.writers.typing == self.get_instance_name(): if self.get_instance_name() in self.config.worker.writers.typing:
return TypingWriterHandler(self) return TypingWriterHandler(self)
else: else:
raise Exception("Workers cannot write typing") raise Exception("Workers cannot write typing")
@ -474,7 +474,7 @@ class HomeServer(metaclass=abc.ABCMeta):
@cache_in_self @cache_in_self
def get_typing_handler(self) -> FollowerTypingHandler: def get_typing_handler(self) -> FollowerTypingHandler:
if self.config.worker.writers.typing == self.get_instance_name(): if self.get_instance_name() in self.config.worker.writers.typing:
# Use get_typing_writer_handler to ensure that we use the same # Use get_typing_writer_handler to ensure that we use the same
# cached version. # cached version.
return self.get_typing_writer_handler() return self.get_typing_writer_handler()