async def _sampler(self) -> None: median = statistics.median prev_message_total = self.messages_received_total prev_event_total = self.events_total await self.sleep(1.0) for sleep_time in timer_intervals(1.0, name='Monitor.sampler'): if self.should_stop: break # Update average event runtime. if self.events_runtime: self.events_runtime_avg = median(self.events_runtime) # Update events/s self.events_s, prev_event_total = ( self.events_total - prev_event_total, self.events_total, ) # Update messages/s self.messages_s, prev_message_total = ( self.messages_received_total - prev_message_total, self.messages_received_total) # Cleanup self._cleanup() await self.sleep(sleep_time) if self.should_stop: break
async def test_timer_intervals(): i = 0 for sleep_time in timer_intervals(0.1): assert sleep_time == pytest.approx(0.1, 2e-1) await asyncio.sleep(sleep_time) if i > 10: break i += 1
async def _wrapped(*args, **kwargs): await self.sleep(interval) for sleep_time in timer_intervals(interval, name=timer_name, max_drift_correction=0.1): if self.should_stop: break await func(*args, **kwargs) await self.sleep(sleep_time) if self.should_stop: break
async def _clean_data(self) -> None: interval = self.app.conf.table_cleanup_interval if self._should_expire_keys(): await self.sleep(interval) for sleep_time in timer_intervals(interval, name='table_cleanup'): if self.should_stop: break self._del_old_keys() await self.sleep(sleep_time) if self.should_stop: break
async def _commit_handler(self) -> None: interval = self.commit_interval await self.sleep(interval) for sleep_time in timer_intervals(interval, name='commit'): if self.should_stop: break await self.commit() await self.sleep(sleep_time) if self.should_stop: break
async def _publish_stats(self) -> None: interval = self.stats_interval await self.sleep(interval) for sleep_time in timer_intervals(interval, name='Recovery.stats'): if self.should_stop: break if self.in_recovery: stats = self.active_stats() if stats: self.log.info('Still fetching. Remaining: %s', stats) await self.sleep(sleep_time) if self.should_stop: break
async def test_timer_intervals__too_early(): clock = Mock() clock.return_value = 9.0 clock_values = iter([ 10.0, 11.0, 12.0, 13.0, 13.1, 14.1, 15.0, 16.0, 17.0]) # ^- too fast with patch('mode.timers.logger') as logger: i = 0 for sleep_time in timer_intervals(1.0, clock=clock): clock.return_value = next(clock_values) assert sleep_time == (1.1 if i == 5 else 1.0) if i >= 6: break i += 1 logger.info.assert_called_once()
async def test_timer_intervals__too_late(): clock = Mock() clock.return_value = 9.0 clock_values = iter([ 10.0, 11.0, 12.0, 13.0, 16.0, 17.0, 18.0, 19.0, 20.0]) # ^- skips with patch('mode.timers.logger') as logger: i = 0 for sleep_time in timer_intervals(1.0, clock=clock): clock.return_value = next(clock_values) assert sleep_time == (0.9 if i == 5 else 1.0) if i >= 8: break i += 1 logger.info.assert_called_once()
async def _commit_livelock_detector(self) -> None: # pragma: no cover soft_timeout = self.commit_livelock_soft_timeout interval: float = self.commit_interval * 2.5 await self.sleep(interval) for sleep_time in timer_intervals(interval, name='livelock'): if self.should_stop: break if self._last_batch is not None: s_since_batch = monotonic() - self._last_batch if s_since_batch > soft_timeout: self.log.warning( 'Possible livelock: COMMIT OFFSET NOT ADVANCING') await self.sleep(sleep_time) if self.should_stop: break