mirror of
https://github.com/element-hq/synapse
synced 2024-08-20 03:50:20 +00:00
Only send events that originate on this server.
Or events that are sent via the federation "send_join" API. This should match the behaviour from before v0.18.5 and #1635 landed.
This commit is contained in:
parent
0d766c8ccf
commit
f784980d2b
3 changed files with 25 additions and 0 deletions
|
@ -36,6 +36,15 @@ class _EventInternalMetadata(object):
|
||||||
def is_invite_from_remote(self):
|
def is_invite_from_remote(self):
|
||||||
return getattr(self, "invite_from_remote", False)
|
return getattr(self, "invite_from_remote", False)
|
||||||
|
|
||||||
|
def get_send_on_behalf_of(self):
|
||||||
|
"""Whether this server should send the event on behalf of another server.
|
||||||
|
This is used by the federation "send_join" API to forward the initial join
|
||||||
|
event for a server in the room.
|
||||||
|
|
||||||
|
returns a str with the name of the server this event is sent on behalf of.
|
||||||
|
"""
|
||||||
|
return getattr(self, "get_send_on_behalf_of", None)
|
||||||
|
|
||||||
|
|
||||||
def _event_dict_property(key):
|
def _event_dict_property(key):
|
||||||
def getter(self):
|
def getter(self):
|
||||||
|
|
|
@ -61,6 +61,7 @@ class TransactionQueue(object):
|
||||||
self.transport_layer = hs.get_federation_transport_client()
|
self.transport_layer = hs.get_federation_transport_client()
|
||||||
|
|
||||||
self.clock = hs.get_clock()
|
self.clock = hs.get_clock()
|
||||||
|
self.is_mine_id = hs.is_mine_id
|
||||||
|
|
||||||
# Is a mapping from destinations -> deferreds. Used to keep track
|
# Is a mapping from destinations -> deferreds. Used to keep track
|
||||||
# of which destinations have transactions in flight and when they are
|
# of which destinations have transactions in flight and when they are
|
||||||
|
@ -152,6 +153,12 @@ class TransactionQueue(object):
|
||||||
break
|
break
|
||||||
|
|
||||||
for event in events:
|
for event in events:
|
||||||
|
# Only send events for this server.
|
||||||
|
send_on_behalf_of = event.internal_metadata.get_send_on_behalf_of()
|
||||||
|
is_mine = self.is_mine_id(event.event_id)
|
||||||
|
if not is_mine and send_on_behalf_of is None:
|
||||||
|
continue
|
||||||
|
|
||||||
# Get the state from before the event.
|
# Get the state from before the event.
|
||||||
# We need to make sure that this is the state from before
|
# We need to make sure that this is the state from before
|
||||||
# the event and not from after it.
|
# the event and not from after it.
|
||||||
|
@ -167,6 +174,11 @@ class TransactionQueue(object):
|
||||||
destinations = set(
|
destinations = set(
|
||||||
get_domain_from_id(user_id) for user_id in users_in_room
|
get_domain_from_id(user_id) for user_id in users_in_room
|
||||||
)
|
)
|
||||||
|
if send_on_behalf_of is not None:
|
||||||
|
# If we are sending the event on behalf of another server
|
||||||
|
# then it already has the event and there is no reason to
|
||||||
|
# send the event to it.
|
||||||
|
destinations.discard(send_on_behalf_of)
|
||||||
|
|
||||||
logger.debug("Sending %s to %r", event, destinations)
|
logger.debug("Sending %s to %r", event, destinations)
|
||||||
|
|
||||||
|
|
|
@ -790,6 +790,10 @@ class FederationHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
|
|
||||||
event.internal_metadata.outlier = False
|
event.internal_metadata.outlier = False
|
||||||
|
# Send this event on behalf of the origin server since they may not
|
||||||
|
# have an up to data view of the state of the room at this event so
|
||||||
|
# will not know which servers to send the event to.
|
||||||
|
event.internal_metadata.send_on_behalf_of = origin
|
||||||
|
|
||||||
context, event_stream_id, max_stream_id = yield self._handle_new_event(
|
context, event_stream_id, max_stream_id = yield self._handle_new_event(
|
||||||
origin, event
|
origin, event
|
||||||
|
|
Loading…
Reference in a new issue