Changeset 704682
- Timestamp:
- 01/21/2024 02:16:22 PM (18 months ago)
- Branches:
- develop, master
- Children:
- b7450b
- Parents:
- fa8d19
- git-author:
- Calum Lind <calumlind+deluge@gmail.com> (12/03/2023 07:47:11 PM)
- git-committer:
- Calum Lind <calumlind+deluge@gmail.com> (01/21/2024 02:16:22 PM)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
deluge/core/alertmanager.py
rfa8d19 r704682 18 18 import logging 19 19 import threading 20 import time 20 21 from collections import defaultdict 22 from functools import partial 21 23 from typing import Any, Callable 22 24 23 from twisted.internet import reactor, t hreads25 from twisted.internet import reactor, task, threads 24 26 25 27 import deluge.component as component … … 57 59 # handlers is a dictionary of lists {"alert_type": [handler1,h2,..]} 58 60 self.handlers = defaultdict(list) 59 self.handlers_retry_timeout = 0.3 60 self.handlers_retry_count = 6 61 self.handlers_timeout_secs = 2 61 62 self.delayed_calls = [] 62 63 self._event = threading.Event() … … 83 84 def wait_for_alert_in_thread(self): 84 85 while self._component_state not in ('Stopping', 'Stopped'): 86 if self.check_delayed_calls(): 87 time.sleep(0.05) 88 continue 89 85 90 if self.session.wait_for_alert(1000) is None: 86 91 continue … … 88 93 threads.blockingCallFromThread(reactor, self.maybe_handle_alerts) 89 94 95 def on_delayed_call_timeout(self, result, timeout, **kwargs): 96 log.warning('Alert handler was timed-out before being called %s', kwargs) 97 90 98 def cancel_delayed_calls(self): 91 99 """Cancel all delayed handlers.""" 92 100 for delayed_call in self.delayed_calls: 93 if delayed_call.active(): 94 delayed_call.cancel() 101 delayed_call.cancel() 95 102 self.delayed_calls = [] 96 103 97 def check_delayed_calls(self, retries: int = 0) -> bool: 98 """Returns True if any handler calls are delayed (upto retry limit).""" 99 self.delayed_calls = [dc for dc in self.delayed_calls if dc.active()] 100 if not self.delayed_calls: 101 return False 104 def check_delayed_calls(self) -> bool: 105 """Returns True if any handler calls are delayed.""" 106 self.delayed_calls = [dc for dc in self.delayed_calls if not dc.called] 107 return len(self.delayed_calls) > 0 102 108 103 if retries > self.handlers_retry_count: 104 log.warning( 105 'Alert handlers timeout reached, cancelling: %s', self.delayed_calls 106 ) 107 self.cancel_delayed_calls() 108 return False 109 110 return True 111 112 def maybe_handle_alerts(self, retries: int = 0) -> None: 109 def maybe_handle_alerts(self) -> None: 113 110 if self._component_state != 'Started': 114 return115 116 if self.check_delayed_calls(retries):117 log.debug('Waiting for delayed alerts: %s', self.delayed_calls)118 retries += 1119 reactor.callLater(120 self.handlers_retry_timeout, self.maybe_handle_alerts, retries121 )122 111 return 123 112 … … 183 172 if log.isEnabledFor(logging.DEBUG): 184 173 log.debug('Handling alert: %s', alert_type) 185 186 self.delayed_calls.append(reactor.callLater(0, handler, alert)) 174 d = task.deferLater(reactor, 0, handler, alert) 175 on_handler_timeout = partial( 176 self.on_delayed_call_timeout, 177 handler=handler.__qualname__, 178 alert_type=alert_type, 179 ) 180 d.addTimeout( 181 self.handlers_timeout_secs, 182 reactor, 183 onTimeoutCancel=on_handler_timeout, 184 ) 185 self.delayed_calls.append(d) 187 186 188 187 def set_alert_queue_size(self, queue_size):
Note:
See TracChangeset
for help on using the changeset viewer.