From c0b41ed1476a6361a90c9dc1d16aeffc2534bd80 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Thu, 15 Jul 2021 11:35:41 +0200
Subject: [PATCH] =?UTF-8?q?Zaveden=20garbage=20collector=20na=20registra?=
 =?UTF-8?q?=C4=8Dn=C3=AD=20tokeny?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Z periodického procházení jobů jsem udělal obecný garbage collector,
který kromě jobů uklízí i registrační tokeny.

GC se nyní dá spustit ručně pomocí "bin/flask gc".

V configu jsem přejmenoval JOB_GC_PERIOD na GC_PERIOD.
---
 etc/config.py.example |  4 ++--
 mo/users.py           |  8 ++++++++
 mo/web/__init__.py    | 20 +++++++++++++++-----
 3 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/etc/config.py.example b/etc/config.py.example
index a93ece2d..f7db910c 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 8a12debf..7e0c90b3 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 01217887..1be472cf 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')
-- 
GitLab