msys2-web/app/fetch/update.py

78 lines
2.1 KiB
Python

# Copyright 2016-2020 Christoph Reiter
# SPDX-License-Identifier: MIT
import asyncio
import functools
import sys
import traceback
from asyncio import Event
from aiolimiter import AsyncLimiter
from ..appconfig import UPDATE_INTERVAL, UPDATE_MIN_INTERVAL, UPDATE_MIN_RATE
from ..appstate import state
from ..utils import logger
from .arch import update_arch_versions
from .buildstatus import update_build_status
from .cygwin import update_cygwin_versions
from .gentoo import update_gentoo_versions
from .source import update_source
from .sourceinfos import update_sourceinfos
from .cdx import update_cdx
_rate_limit = AsyncLimiter(UPDATE_MIN_RATE, UPDATE_MIN_INTERVAL)
@functools.cache
def _get_update_event() -> Event:
return Event()
async def wait_for_update() -> None:
update_event = _get_update_event()
await update_event.wait()
update_event.clear()
def queue_update() -> None:
update_event = _get_update_event()
update_event.set()
async def trigger_loop() -> None:
while True:
logger.info("Sleeping for %d" % UPDATE_INTERVAL)
await asyncio.sleep(UPDATE_INTERVAL)
queue_update()
_background_tasks = set()
async def update_loop() -> None:
task = asyncio.create_task(trigger_loop())
_background_tasks.add(task)
task.add_done_callback(_background_tasks.discard)
while True:
async with _rate_limit:
logger.info("check for updates")
try:
awaitables = [
update_cygwin_versions(),
update_gentoo_versions(),
update_arch_versions(),
update_source(),
update_sourceinfos(),
update_build_status(),
update_cdx(),
]
await asyncio.gather(*awaitables)
state.ready = True
logger.info("done")
except Exception:
traceback.print_exc(file=sys.stdout)
logger.info("Waiting for next update")
await wait_for_update()
# XXX: it seems some updates don't propagate right away, so wait a bit
await asyncio.sleep(5)