This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Create a worker for event creation #2854
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
e3624fa
Remove pointless ratelimit check
erikjohnston 24dd730
Add replication http endpoint for event sending
erikjohnston 8ec2e63
Add event_creator worker
erikjohnston 50fe92c
Move presence handling into handle_new_client_event
erikjohnston f133228
Add note in docs/workers.rst
erikjohnston 32c7b8e
Update workers docs to include http port
erikjohnston 059d3a6
Update docs
erikjohnston File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
#!/usr/bin/env python | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2018 New Vector Ltd | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
import logging | ||
import sys | ||
|
||
import synapse | ||
from synapse import events | ||
from synapse.app import _base | ||
from synapse.config._base import ConfigError | ||
from synapse.config.homeserver import HomeServerConfig | ||
from synapse.config.logger import setup_logging | ||
from synapse.crypto import context_factory | ||
from synapse.http.server import JsonResource | ||
from synapse.http.site import SynapseSite | ||
from synapse.metrics.resource import METRICS_PREFIX, MetricsResource | ||
from synapse.replication.slave.storage._base import BaseSlavedStore | ||
from synapse.replication.slave.storage.appservice import SlavedApplicationServiceStore | ||
from synapse.replication.slave.storage.client_ips import SlavedClientIpStore | ||
from synapse.replication.slave.storage.devices import SlavedDeviceStore | ||
from synapse.replication.slave.storage.events import SlavedEventStore | ||
from synapse.replication.slave.storage.registration import SlavedRegistrationStore | ||
from synapse.replication.slave.storage.room import RoomStore | ||
from synapse.replication.tcp.client import ReplicationClientHandler | ||
from synapse.rest.client.v1.room import RoomSendEventRestServlet | ||
from synapse.server import HomeServer | ||
from synapse.storage.engines import create_engine | ||
from synapse.util.httpresourcetree import create_resource_tree | ||
from synapse.util.logcontext import LoggingContext | ||
from synapse.util.manhole import manhole | ||
from synapse.util.versionstring import get_version_string | ||
from twisted.internet import reactor | ||
from twisted.web.resource import Resource | ||
|
||
logger = logging.getLogger("synapse.app.event_creator") | ||
|
||
|
||
class EventCreatorSlavedStore( | ||
SlavedDeviceStore, | ||
SlavedClientIpStore, | ||
SlavedApplicationServiceStore, | ||
SlavedEventStore, | ||
SlavedRegistrationStore, | ||
RoomStore, | ||
BaseSlavedStore, | ||
): | ||
pass | ||
|
||
|
||
class EventCreatorServer(HomeServer): | ||
def setup(self): | ||
logger.info("Setting up.") | ||
self.datastore = EventCreatorSlavedStore(self.get_db_conn(), self) | ||
logger.info("Finished setting up.") | ||
|
||
def _listen_http(self, listener_config): | ||
port = listener_config["port"] | ||
bind_addresses = listener_config["bind_addresses"] | ||
site_tag = listener_config.get("tag", port) | ||
resources = {} | ||
for res in listener_config["resources"]: | ||
for name in res["names"]: | ||
if name == "metrics": | ||
resources[METRICS_PREFIX] = MetricsResource(self) | ||
elif name == "client": | ||
resource = JsonResource(self, canonical_json=False) | ||
RoomSendEventRestServlet(self).register(resource) | ||
resources.update({ | ||
"/_matrix/client/r0": resource, | ||
"/_matrix/client/unstable": resource, | ||
"/_matrix/client/v2_alpha": resource, | ||
"/_matrix/client/api/v1": resource, | ||
}) | ||
|
||
root_resource = create_resource_tree(resources, Resource()) | ||
|
||
_base.listen_tcp( | ||
bind_addresses, | ||
port, | ||
SynapseSite( | ||
"synapse.access.http.%s" % (site_tag,), | ||
site_tag, | ||
listener_config, | ||
root_resource, | ||
) | ||
) | ||
|
||
logger.info("Synapse event creator now listening on port %d", port) | ||
|
||
def start_listening(self, listeners): | ||
for listener in listeners: | ||
if listener["type"] == "http": | ||
self._listen_http(listener) | ||
elif listener["type"] == "manhole": | ||
_base.listen_tcp( | ||
listener["bind_addresses"], | ||
listener["port"], | ||
manhole( | ||
username="matrix", | ||
password="rabbithole", | ||
globals={"hs": self}, | ||
) | ||
) | ||
else: | ||
logger.warn("Unrecognized listener type: %s", listener["type"]) | ||
|
||
self.get_tcp_replication().start_replication(self) | ||
|
||
def build_tcp_replication(self): | ||
return ReplicationClientHandler(self.get_datastore()) | ||
|
||
|
||
def start(config_options): | ||
try: | ||
config = HomeServerConfig.load_config( | ||
"Synapse event creator", config_options | ||
) | ||
except ConfigError as e: | ||
sys.stderr.write("\n" + e.message + "\n") | ||
sys.exit(1) | ||
|
||
assert config.worker_app == "synapse.app.event_creator" | ||
|
||
assert config.worker_replication_http_port is not None | ||
|
||
setup_logging(config, use_worker_options=True) | ||
|
||
events.USE_FROZEN_DICTS = config.use_frozen_dicts | ||
|
||
database_engine = create_engine(config.database_config) | ||
|
||
tls_server_context_factory = context_factory.ServerContextFactory(config) | ||
|
||
ss = EventCreatorServer( | ||
config.server_name, | ||
db_config=config.database_config, | ||
tls_server_context_factory=tls_server_context_factory, | ||
config=config, | ||
version_string="Synapse/" + get_version_string(synapse), | ||
database_engine=database_engine, | ||
) | ||
|
||
ss.setup() | ||
ss.get_handlers() | ||
ss.start_listening(config.worker_listeners) | ||
|
||
def start(): | ||
ss.get_state_handler().start_caching() | ||
ss.get_datastore().start_profiling() | ||
|
||
reactor.callWhenRunning(start) | ||
|
||
_base.start_worker_reactor("synapse-event-creator", config) | ||
|
||
|
||
if __name__ == '__main__': | ||
with LoggingContext("main"): | ||
start(sys.argv[1:]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,6 +38,7 @@ | |
from synapse.metrics.resource import METRICS_PREFIX, MetricsResource | ||
from synapse.python_dependencies import CONDITIONAL_REQUIREMENTS, \ | ||
check_requirements | ||
from synapse.replication.http import ReplicationRestResource, REPLICATION_PREFIX | ||
from synapse.replication.tcp.resource import ReplicationStreamProtocolFactory | ||
from synapse.rest import ClientRestResource | ||
from synapse.rest.key.v1.server_key_resource import LocalKey | ||
|
@@ -219,6 +220,9 @@ def _configure_named_resource(self, name, compress=False): | |
if name == "metrics" and self.get_config().enable_metrics: | ||
resources[METRICS_PREFIX] = MetricsResource(self) | ||
|
||
if name == "replication": | ||
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. needs documenting? |
||
resources[REPLICATION_PREFIX] = ReplicationRestResource(self) | ||
|
||
return resources | ||
|
||
def start_listening(self): | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,8 +33,16 @@ def read_config(self, config): | |
self.worker_pid_file = config.get("worker_pid_file") | ||
self.worker_log_file = config.get("worker_log_file") | ||
self.worker_log_config = config.get("worker_log_config") | ||
|
||
# The host used to connect to the main synapse | ||
self.worker_replication_host = config.get("worker_replication_host", None) | ||
|
||
# The port on the main synapse for TCP replication | ||
self.worker_replication_port = config.get("worker_replication_port", None) | ||
|
||
# The port on the main synapse for HTTP replication endpoint | ||
self.worker_replication_http_port = config.get("worker_replication_http_port") | ||
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. does this need documenting in |
||
|
||
self.worker_name = config.get("worker_name", self.worker_app) | ||
|
||
self.worker_main_http_uri = config.get("worker_main_http_uri", None) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
Shouldn't this also be handling the macro endpoints for creating events (https://matrix.org/docs/spec/client_server/r0.3.0.html#post-matrix-client-r0-rooms-roomid-ban etc)? Or are they deliberately being left on the master as they're not that common?
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.
We're currently only handling non-state events on this worker for now, as sometimes the membership state changes end up doing complicated things that probably need to be done on the master.