From f75fb358d0c2968f2a5c1685813da0efd551a798 Mon Sep 17 00:00:00 2001 From: Joaquin Madrid Belando Date: Sat, 14 Mar 2026 17:51:17 +0100 Subject: [PATCH] Move rule_timer_loop, statTrimmer, kaReporting to background threads to prevent reactor blocking during voice broadcasts - all logs preserved --- bridge_master.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/bridge_master.py b/bridge_master.py index 2fbaccf..075d683 100644 --- a/bridge_master.py +++ b/bridge_master.py @@ -363,6 +363,7 @@ def deactivate_all_dynamic_bridges(system_name): ### MODIFIED: Core logic updated to handle special TGIDs (9990-9999) correctly with SINGLE_MODE def rule_timer_loop(): + logger.debug('(ROUTER) routerHBP Rule timer loop started') _now = time() _remove_bridges = deque() @@ -401,9 +402,9 @@ def rule_timer_loop(): if _system['SYSTEM'] not in _active_dynamic_bridges: _active_dynamic_bridges[_system['SYSTEM']] = [] _active_dynamic_bridges[_system['SYSTEM']].append((_bridge, _system)) - pass + logger.debug('(ROUTER) Conference Bridge ACTIVE (INFINITE TIMER): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) else: - pass + logger.debug('(ROUTER) Conference Bridge INACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) elif _system['TO_TYPE'] == 'OFF': if _system['ACTIVE'] == False: # Activar inmediatamente sin timer @@ -412,6 +413,7 @@ def rule_timer_loop(): logger.info('(ROUTER) Conference Bridge ACTIVATED (NO TIMEOUT): System: %s, Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) else: _bridge_used = True + logger.debug('(ROUTER) Conference Bridge ACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) else: # COMPORTAMIENTO ORIGINAL (SINGLE MODE ACTIVADO o bridges estáticos o TGIDs especiales) if _system['TO_TYPE'] == 'ON': @@ -427,7 +429,7 @@ def rule_timer_loop(): _bridge_used = True logger.info('(ROUTER) Conference Bridge ACTIVE (ON timer running): System: %s Bridge: %s, TS: %s, TGID: %s, Timeout in: %.2fs,', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID']), timeout_in) elif _system['ACTIVE'] == False: - pass + logger.debug('(ROUTER) Conference Bridge INACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) elif _system['TO_TYPE'] == 'OFF': if _system['ACTIVE'] == False: if _system['TIMER'] < _now: @@ -440,11 +442,13 @@ def rule_timer_loop(): logger.info('(ROUTER) Conference Bridge INACTIVE (OFF timer running): System: %s Bridge: %s, TS: %s, TGID: %s, Timeout in: %.2fs,', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID']), timeout_in) elif _system['ACTIVE'] == True: _bridge_used = True + logger.debug('(ROUTER) Conference Bridge ACTIVE (no change): System: %s Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) else: if _system['SYSTEM'][0:3] != 'OBP': _bridge_used = True elif _system['SYSTEM'][0:3] == 'OBP' and _system['TO_TYPE'] == 'STAT': _bridge_used = True + logger.debug('(ROUTER) Conference Bridge NO ACTION: System: %s, Bridge: %s, TS: %s, TGID: %s', _system['SYSTEM'], _bridge, _system['TS'], int_id(_system['TGID'])) if _bridge_used == False: _remove_bridges.append(_bridge) @@ -454,12 +458,12 @@ def rule_timer_loop(): logger.debug('(ROUTER) Unused conference bridge %s removed',_bridgerem) if CONFIG['REPORTS']['REPORT']: - report_server.send_clients(b'bridge updated') + reactor.callFromThread(report_server.send_clients, b'bridge updated') ### END MODIFIED ### def statTrimmer(): - pass + logger.debug('(ROUTER) STAT trimmer loop started') _remove_bridges = deque() for _bridge in BRIDGES: _bridge_stat = False @@ -539,7 +543,7 @@ def bridgeDebug(): logger.info('(BRIDGEDEBUG) The server currently has %s STATic bridges',statroll) def kaReporting(): - pass + logger.debug('(ROUTER) KeepAlive reporting loop started') for system in systems: if CONFIG['SYSTEMS'][system]['MODE'] == 'OPENBRIDGE': if CONFIG['SYSTEMS'][system]['ENHANCED_OBP']: @@ -3706,7 +3710,9 @@ if __name__ == '__main__': # logger.info('(API) API not started') # Initialize the rule timer -- this if for user activated stuff - rule_timer_task = task.LoopingCall(rule_timer_loop) + def _rule_timer_in_thread(): + return threads.deferToThread(rule_timer_loop) + rule_timer_task = task.LoopingCall(_rule_timer_in_thread) rule_timer = rule_timer_task.start(52) rule_timer.addErrback(loopingErrHandle) @@ -3739,12 +3745,16 @@ if __name__ == '__main__': #STAT trimmer - once every 5 mins (roughly - shifted so all timed tasks don't run at once if CONFIG['GLOBAL']['GEN_STAT_BRIDGES']: - stat_trimmer_task = task.LoopingCall(statTrimmer) + def _stat_trimmer_in_thread(): + return threads.deferToThread(statTrimmer) + stat_trimmer_task = task.LoopingCall(_stat_trimmer_in_thread) stat_trimmer = stat_trimmer_task.start(303)#3600 stat_trimmer.addErrback(loopingErrHandle) #KA Reporting - ka_task = task.LoopingCall(kaReporting) + def _ka_reporting_in_thread(): + return threads.deferToThread(kaReporting) + ka_task = task.LoopingCall(_ka_reporting_in_thread) ka = ka_task.start(60) ka.addErrback(loopingErrHandle)