forked from MirrorHub/synapse
Merge branch 'develop' of github.com:matrix-org/synapse into erikj/state_storage
This commit is contained in:
commit
3baf641a48
6 changed files with 59 additions and 15 deletions
|
@ -399,6 +399,9 @@ class SynchrotronServer(HomeServer):
|
||||||
notify_from_stream(
|
notify_from_stream(
|
||||||
result, "typing", "typing_key", room="room_id"
|
result, "typing", "typing_key", room="room_id"
|
||||||
)
|
)
|
||||||
|
notify_from_stream(
|
||||||
|
result, "to_device", "to_device_key", user="user_id"
|
||||||
|
)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -223,16 +223,14 @@ class FederationServer(FederationBase):
|
||||||
if not in_room:
|
if not in_room:
|
||||||
raise AuthError(403, "Host not in room.")
|
raise AuthError(403, "Host not in room.")
|
||||||
|
|
||||||
pdus = yield self.handler.get_state_for_pdu(
|
state_ids = yield self.handler.get_state_ids_for_pdu(
|
||||||
room_id, event_id,
|
room_id, event_id,
|
||||||
)
|
)
|
||||||
auth_chain = yield self.store.get_auth_chain(
|
auth_chain_ids = yield self.store.get_auth_chain_ids(state_ids)
|
||||||
[pdu.event_id for pdu in pdus]
|
|
||||||
)
|
|
||||||
|
|
||||||
defer.returnValue((200, {
|
defer.returnValue((200, {
|
||||||
"pdu_ids": [pdu.event_id for pdu in pdus],
|
"pdu_ids": state_ids,
|
||||||
"auth_chain_ids": [pdu.event_id for pdu in auth_chain],
|
"auth_chain_ids": auth_chain_ids,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
|
|
@ -101,6 +101,9 @@ class FederationHandler(BaseHandler):
|
||||||
def on_receive_pdu(self, origin, pdu, state=None, auth_chain=None):
|
def on_receive_pdu(self, origin, pdu, state=None, auth_chain=None):
|
||||||
""" Called by the ReplicationLayer when we have a new pdu. We need to
|
""" Called by the ReplicationLayer when we have a new pdu. We need to
|
||||||
do auth checks and put it through the StateHandler.
|
do auth checks and put it through the StateHandler.
|
||||||
|
|
||||||
|
auth_chain and state are None if we already have the necessary state
|
||||||
|
and prev_events in the db
|
||||||
"""
|
"""
|
||||||
event = pdu
|
event = pdu
|
||||||
|
|
||||||
|
@ -118,12 +121,21 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
# FIXME (erikj): Awful hack to make the case where we are not currently
|
# FIXME (erikj): Awful hack to make the case where we are not currently
|
||||||
# in the room work
|
# in the room work
|
||||||
|
# If state and auth_chain are None, then we don't need to do this check
|
||||||
|
# as we already know we have enough state in the DB to handle this
|
||||||
|
# event.
|
||||||
|
if state and auth_chain and not event.internal_metadata.is_outlier():
|
||||||
is_in_room = yield self.auth.check_host_in_room(
|
is_in_room = yield self.auth.check_host_in_room(
|
||||||
event.room_id,
|
event.room_id,
|
||||||
self.server_name
|
self.server_name
|
||||||
)
|
)
|
||||||
if not is_in_room and not event.internal_metadata.is_outlier():
|
else:
|
||||||
logger.debug("Got event for room we're not in.")
|
is_in_room = True
|
||||||
|
if not is_in_room:
|
||||||
|
logger.info(
|
||||||
|
"Got event for room we're not in: %r %r",
|
||||||
|
event.room_id, event.event_id
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
event_stream_id, max_stream_id = yield self._persist_auth_tree(
|
event_stream_id, max_stream_id = yield self._persist_auth_tree(
|
||||||
|
@ -1062,6 +1074,8 @@ class FederationHandler(BaseHandler):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_state_for_pdu(self, room_id, event_id):
|
def get_state_for_pdu(self, room_id, event_id):
|
||||||
|
"""Returns the state at the event. i.e. not including said event.
|
||||||
|
"""
|
||||||
yield run_on_reactor()
|
yield run_on_reactor()
|
||||||
|
|
||||||
state_groups = yield self.store.get_state_groups(
|
state_groups = yield self.store.get_state_groups(
|
||||||
|
@ -1102,6 +1116,34 @@ class FederationHandler(BaseHandler):
|
||||||
else:
|
else:
|
||||||
defer.returnValue([])
|
defer.returnValue([])
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def get_state_ids_for_pdu(self, room_id, event_id):
|
||||||
|
"""Returns the state at the event. i.e. not including said event.
|
||||||
|
"""
|
||||||
|
yield run_on_reactor()
|
||||||
|
|
||||||
|
state_groups = yield self.store.get_state_groups_ids(
|
||||||
|
room_id, [event_id]
|
||||||
|
)
|
||||||
|
|
||||||
|
if state_groups:
|
||||||
|
_, state = state_groups.items().pop()
|
||||||
|
results = state
|
||||||
|
|
||||||
|
event = yield self.store.get_event(event_id)
|
||||||
|
if event and event.is_state():
|
||||||
|
# Get previous state
|
||||||
|
if "replaces_state" in event.unsigned:
|
||||||
|
prev_id = event.unsigned["replaces_state"]
|
||||||
|
if prev_id != event.event_id:
|
||||||
|
results[(event.type, event.state_key)] = prev_id
|
||||||
|
else:
|
||||||
|
del results[(event.type, event.state_key)]
|
||||||
|
|
||||||
|
defer.returnValue(results.values())
|
||||||
|
else:
|
||||||
|
defer.returnValue([])
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
@log_function
|
@log_function
|
||||||
def on_backfill_request(self, origin, room_id, pdu_list, limit):
|
def on_backfill_request(self, origin, room_id, pdu_list, limit):
|
||||||
|
|
|
@ -423,7 +423,8 @@ class Notifier(object):
|
||||||
def _is_world_readable(self, room_id):
|
def _is_world_readable(self, room_id):
|
||||||
state = yield self.state_handler.get_current_state(
|
state = yield self.state_handler.get_current_state(
|
||||||
room_id,
|
room_id,
|
||||||
EventTypes.RoomHistoryVisibility
|
EventTypes.RoomHistoryVisibility,
|
||||||
|
"",
|
||||||
)
|
)
|
||||||
if state and "history_visibility" in state.content:
|
if state and "history_visibility" in state.content:
|
||||||
defer.returnValue(state.content["history_visibility"] == "world_readable")
|
defer.returnValue(state.content["history_visibility"] == "world_readable")
|
||||||
|
|
|
@ -78,7 +78,7 @@ class SendToDeviceRestServlet(servlet.RestServlet):
|
||||||
stream_id = yield self.store.add_messages_to_device_inbox(local_messages)
|
stream_id = yield self.store.add_messages_to_device_inbox(local_messages)
|
||||||
|
|
||||||
self.notifier.on_new_event(
|
self.notifier.on_new_event(
|
||||||
"to_device", stream_id, users=local_messages.keys()
|
"to_device_key", stream_id, users=local_messages.keys()
|
||||||
)
|
)
|
||||||
|
|
||||||
response = (200, {})
|
response = (200, {})
|
||||||
|
|
|
@ -245,7 +245,7 @@ class TransactionStore(SQLBaseStore):
|
||||||
|
|
||||||
return self.cursor_to_dict(txn)
|
return self.cursor_to_dict(txn)
|
||||||
|
|
||||||
@cached()
|
@cached(max_entries=10000)
|
||||||
def get_destination_retry_timings(self, destination):
|
def get_destination_retry_timings(self, destination):
|
||||||
"""Gets the current retry timings (if any) for a given destination.
|
"""Gets the current retry timings (if any) for a given destination.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue