Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 52e87fb

Browse files
authored
Run the AS senders as background processes (#4189)
This should fix some "Starting db connection from sentinel context" warnings, and will mean we get metrics for these processes.
1 parent c033242 commit 52e87fb

2 files changed

Lines changed: 26 additions & 12 deletions

File tree

changelog.d/4189.misc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Run the AS senders as background processes to fix warnings
2+

synapse/appservice/scheduler.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
from twisted.internet import defer
5454

5555
from synapse.appservice import ApplicationServiceState
56+
from synapse.metrics.background_process_metrics import run_as_background_process
5657
from synapse.util.logcontext import run_in_background
57-
from synapse.util.metrics import Measure
5858

5959
logger = logging.getLogger(__name__)
6060

@@ -104,27 +104,34 @@ def __init__(self, txn_ctrl, clock):
104104
self.clock = clock
105105

106106
def enqueue(self, service, event):
107-
# if this service isn't being sent something
108107
self.queued_events.setdefault(service.id, []).append(event)
109-
run_in_background(self._send_request, service)
110108

111-
@defer.inlineCallbacks
112-
def _send_request(self, service):
109+
# start a sender for this appservice if we don't already have one
110+
113111
if service.id in self.requests_in_flight:
114112
return
115113

114+
run_as_background_process(
115+
"as-sender-%s" % (service.id, ),
116+
self._send_request, service,
117+
)
118+
119+
@defer.inlineCallbacks
120+
def _send_request(self, service):
121+
# sanity-check: we shouldn't get here if this service already has a sender
122+
# running.
123+
assert(service.id not in self.requests_in_flight)
124+
116125
self.requests_in_flight.add(service.id)
117126
try:
118127
while True:
119128
events = self.queued_events.pop(service.id, [])
120129
if not events:
121130
return
122-
123-
with Measure(self.clock, "servicequeuer.send"):
124-
try:
125-
yield self.txn_ctrl.send(service, events)
126-
except Exception:
127-
logger.exception("AS request failed")
131+
try:
132+
yield self.txn_ctrl.send(service, events)
133+
except Exception:
134+
logger.exception("AS request failed")
128135
finally:
129136
self.requests_in_flight.discard(service.id)
130137

@@ -223,7 +230,12 @@ def __init__(self, clock, store, as_api, service, callback):
223230
self.backoff_counter = 1
224231

225232
def recover(self):
226-
self.clock.call_later((2 ** self.backoff_counter), self.retry)
233+
def _retry():
234+
run_as_background_process(
235+
"as-recoverer-%s" % (self.service.id,),
236+
self.retry,
237+
)
238+
self.clock.call_later((2 ** self.backoff_counter), _retry)
227239

228240
def _backoff(self):
229241
# cap the backoff to be around 8.5min => (2^9) = 512 secs

0 commit comments

Comments
 (0)