diff --git a/etc/config.py.example b/etc/config.py.example index a93ece2d5805b5bba8c375acd4cd48cb32bfd020..f7db910c8d24c676a30bba7a76e80c983ab6f1db 100644 --- a/etc/config.py.example +++ b/etc/config.py.example @@ -42,8 +42,8 @@ MAX_BATCH_CONTENT_LENGTH = 1000000000 # Adresář, do kterého ukládáme data (pro vývoj relativní, pro instalaci absolutní) DATA_DIR = 'data' -# Jak často se má provádět periodická kontrola dávek [s] -JOB_GC_PERIOD = 60 +# Jak často se má spouštět garbage collector na dávky a tokeny [s] +GC_PERIOD = 60 # Za jak dlouho expiruje dokončená dávka [min] JOB_EXPIRATION = 5 diff --git a/mo/users.py b/mo/users.py index 8a12debf0592feea0a28d3a139dba88057ee794f..7e0c90b3f0adb40d1e7eae5ad6883a9fa9b891bb 100644 --- a/mo/users.py +++ b/mo/users.py @@ -264,3 +264,11 @@ def new_reg_request(type: db.RegReqType, client: str) -> Optional[db.RegRequest] email_token=email_token, client=client, ) + + +def expire_reg_requests(): + sess = db.get_session() + conn = sess.connection() + table = db.RegRequest.__table__ + conn.execute(table.delete().where(table.c.expires_at < mo.now)) + sess.commit() diff --git a/mo/web/__init__.py b/mo/web/__init__.py index 0121788742a13b59bd58ebf83ff33f27e7eb9a0e..1be472cfdbdb70c76c8fd7e03e16dc800b1728fe 100644 --- a/mo/web/__init__.py +++ b/mo/web/__init__.py @@ -171,18 +171,28 @@ app.before_request(init_request) ### UWSGI glue ### +# Čas od času se probudíme a spustíme garbage collector: +# - projdeme joby pro případ, že by se ztratil signál +# - expirujeme zastaralé joby +# - expirujeme zastaralé registrační tokeny +@app.cli.command('gc') +def gc(): + """Run garbage collector.""" + + mo.now = mo.util.get_now() + mo.jobs.process_jobs() + mo.users.expire_reg_requests() + + try: import uwsgi from uwsgidecorators import timer, signal - # Čas od času se probudíme a projdeme joby pro případ, že by se ztratil signál. - # Také při tom expirujeme zastaralé joby. - @timer(config.JOB_GC_PERIOD, target='mule') + @timer(config.GC_PERIOD, target='mule') def mule_timer(signum): # app.logger.debug('Mule: Timer tick') with app.app_context(): - mo.now = mo.util.get_now() - mo.jobs.process_jobs() + garbage_collect() # Obykle při vložení jobu dostaneme signál. @signal(42, target='mule')