Run push_receipts_to_remotes as background job (#4707)
I suspect the CPU usage metrics for this are going to /dev/null at the moment.
This commit is contained in:
parent
16e0680498
commit
6d65659b62
|
@ -0,0 +1 @@
|
||||||
|
Run push_receipts_to_remotes as background job.
|
|
@ -16,8 +16,8 @@ import logging
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
|
||||||
|
from synapse.metrics.background_process_metrics import run_as_background_process
|
||||||
from synapse.types import get_domain_from_id
|
from synapse.types import get_domain_from_id
|
||||||
from synapse.util import logcontext
|
|
||||||
|
|
||||||
from ._base import BaseHandler
|
from ._base import BaseHandler
|
||||||
|
|
||||||
|
@ -59,7 +59,9 @@ class ReceiptsHandler(BaseHandler):
|
||||||
if is_new:
|
if is_new:
|
||||||
# fire off a process in the background to send the receipt to
|
# fire off a process in the background to send the receipt to
|
||||||
# remote servers
|
# remote servers
|
||||||
self._push_remotes([receipt])
|
run_as_background_process(
|
||||||
|
'push_receipts_to_remotes', self._push_remotes, receipt
|
||||||
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _received_remote_receipt(self, origin, content):
|
def _received_remote_receipt(self, origin, content):
|
||||||
|
@ -125,44 +127,42 @@ class ReceiptsHandler(BaseHandler):
|
||||||
|
|
||||||
defer.returnValue(True)
|
defer.returnValue(True)
|
||||||
|
|
||||||
@logcontext.preserve_fn # caller should not yield on this
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _push_remotes(self, receipts):
|
def _push_remotes(self, receipt):
|
||||||
"""Given a list of receipts, works out which remote servers should be
|
"""Given a receipt, works out which remote servers should be
|
||||||
poked and pokes them.
|
poked and pokes them.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# TODO: Some of this stuff should be coallesced.
|
# TODO: optimise this to move some of the work to the workers.
|
||||||
for receipt in receipts:
|
room_id = receipt["room_id"]
|
||||||
room_id = receipt["room_id"]
|
receipt_type = receipt["receipt_type"]
|
||||||
receipt_type = receipt["receipt_type"]
|
user_id = receipt["user_id"]
|
||||||
user_id = receipt["user_id"]
|
event_ids = receipt["event_ids"]
|
||||||
event_ids = receipt["event_ids"]
|
data = receipt["data"]
|
||||||
data = receipt["data"]
|
|
||||||
|
|
||||||
users = yield self.state.get_current_user_in_room(room_id)
|
users = yield self.state.get_current_user_in_room(room_id)
|
||||||
remotedomains = set(get_domain_from_id(u) for u in users)
|
remotedomains = set(get_domain_from_id(u) for u in users)
|
||||||
remotedomains = remotedomains.copy()
|
remotedomains = remotedomains.copy()
|
||||||
remotedomains.discard(self.server_name)
|
remotedomains.discard(self.server_name)
|
||||||
|
|
||||||
logger.debug("Sending receipt to: %r", remotedomains)
|
logger.debug("Sending receipt to: %r", remotedomains)
|
||||||
|
|
||||||
for domain in remotedomains:
|
for domain in remotedomains:
|
||||||
self.federation.send_edu(
|
self.federation.send_edu(
|
||||||
destination=domain,
|
destination=domain,
|
||||||
edu_type="m.receipt",
|
edu_type="m.receipt",
|
||||||
content={
|
content={
|
||||||
room_id: {
|
room_id: {
|
||||||
receipt_type: {
|
receipt_type: {
|
||||||
user_id: {
|
user_id: {
|
||||||
"event_ids": event_ids,
|
"event_ids": event_ids,
|
||||||
"data": data,
|
"data": data,
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
},
|
},
|
||||||
key=(room_id, receipt_type, user_id),
|
},
|
||||||
)
|
key=(room_id, receipt_type, user_id),
|
||||||
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.exception("Error pushing receipts to remote servers")
|
logger.exception("Error pushing receipts to remote servers")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue