| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | 
							- import math
 - import time
 - 
 - import click
 - 
 - import app
 - from extensions.ext_database import db
 - from models.account import TenantPluginAutoUpgradeStrategy
 - from tasks import process_tenant_plugin_autoupgrade_check_task as check_task
 - 
 - AUTO_UPGRADE_MINIMAL_CHECKING_INTERVAL = 15 * 60  # 15 minutes
 - MAX_CONCURRENT_CHECK_TASKS = 20
 - 
 - 
 - @app.celery.task(queue="plugin")
 - def check_upgradable_plugin_task():
 -     click.echo(click.style("Start check upgradable plugin.", fg="green"))
 -     start_at = time.perf_counter()
 - 
 -     now_seconds_of_day = time.time() % 86400 - 30  # we assume the tz is UTC
 -     click.echo(click.style(f"Now seconds of day: {now_seconds_of_day}", fg="green"))
 - 
 -     strategies = (
 -         db.session.query(TenantPluginAutoUpgradeStrategy)
 -         .where(
 -             TenantPluginAutoUpgradeStrategy.upgrade_time_of_day >= now_seconds_of_day,
 -             TenantPluginAutoUpgradeStrategy.upgrade_time_of_day
 -             < now_seconds_of_day + AUTO_UPGRADE_MINIMAL_CHECKING_INTERVAL,
 -             TenantPluginAutoUpgradeStrategy.strategy_setting
 -             != TenantPluginAutoUpgradeStrategy.StrategySetting.DISABLED,
 -         )
 -         .all()
 -     )
 - 
 -     total_strategies = len(strategies)
 -     click.echo(click.style(f"Total strategies: {total_strategies}", fg="green"))
 - 
 -     batch_chunk_count = math.ceil(
 -         total_strategies / MAX_CONCURRENT_CHECK_TASKS
 -     )  # make sure all strategies are checked in this interval
 -     batch_interval_time = (AUTO_UPGRADE_MINIMAL_CHECKING_INTERVAL / batch_chunk_count) if batch_chunk_count > 0 else 0
 - 
 -     for i in range(0, total_strategies, MAX_CONCURRENT_CHECK_TASKS):
 -         batch_strategies = strategies[i : i + MAX_CONCURRENT_CHECK_TASKS]
 -         for strategy in batch_strategies:
 -             check_task.process_tenant_plugin_autoupgrade_check_task.delay(
 -                 strategy.tenant_id,
 -                 strategy.strategy_setting,
 -                 strategy.upgrade_time_of_day,
 -                 strategy.upgrade_mode,
 -                 strategy.exclude_plugins,
 -                 strategy.include_plugins,
 -             )
 - 
 -         if batch_interval_time > 0.0001:  # if lower than 1ms, skip
 -             time.sleep(batch_interval_time)
 - 
 -     end_at = time.perf_counter()
 -     click.echo(
 -         click.style(
 -             f"Checked upgradable plugin success latency: {end_at - start_at}",
 -             fg="green",
 -         )
 -     )
 
 
  |