From 42c339824bfbb5b04e27785a9f978c71e2550c92 Mon Sep 17 00:00:00 2001
From: David Schmitz <schmitz@lrz.de>
Date: Thu, 27 Jul 2023 12:31:46 +0000
Subject: [PATCH] celery lock file cleanup actions at startup: move these
 actions to own python file to be explicitly run before starting celery (in
 systemd service file), as otherwise the code is not only executed on startup
 of celery, but just by loading flowspy.celery which happens, e.g., in each
 gunicorn worker process

---
 flowspy/celery.py                | 26 +++++++++++++-------------
 flowspy/celery_preactions.py     | 30 ++++++++++++++++++++++++++++++
 flowspy/run_celery_preactions    |  8 ++++++++
 flowspy/wsgi.py                  |  3 +++
 systemd/fod-celeryd.service.dist |  1 +
 5 files changed, 55 insertions(+), 13 deletions(-)
 create mode 100644 flowspy/celery_preactions.py
 create mode 100755 flowspy/run_celery_preactions

diff --git a/flowspy/celery.py b/flowspy/celery.py
index 72e92f7c..6fc0d9d7 100644
--- a/flowspy/celery.py
+++ b/flowspy/celery.py
@@ -6,7 +6,7 @@ import sys
 
 ##
 
-print("celery app start", file=sys.stderr)
+print("loading flowspy.celery", file=sys.stderr)
 
 ##
 
@@ -23,18 +23,18 @@ app.config_from_object('django.conf:settings', namespace='CELERY')
 
 ##
 
-if hasattr(settings, 'SNMP_POLL_LOCK'):
-    SNMP_POLL_LOCK=settings.SNMP_POLL_LOCK
-    #print("SNMP_POLL_LOCK="+str(SNMP_POLL_LOCK), file=sys.stderr)
-    if SNMP_POLL_LOCK!='' and os.path.exists(SNMP_POLL_LOCK):
-      print("trying to remove "+str(SNMP_POLL_LOCK), file=sys.stderr)
-      os.rmdir(SNMP_POLL_LOCK)
-
-    SNMP_TEMP_FILE=settings.SNMP_TEMP_FILE
-    #print("SNMP_TEMP_FILE="+str(SNMP_TEMP_FILE), file=sys.stderr)
-    if SNMP_TEMP_FILE!='' and os.path.exists(SNMP_TEMP_FILE+'.lock'):
-      print("trying to remove "+str(SNMP_TEMP_FILE+'.lock'), file=sys.stderr)
-      os.rmdir(settings.SNMP_TEMP_FILE+'.lock')
+#if hasattr(settings, 'SNMP_POLL_LOCK'):
+#    SNMP_POLL_LOCK=settings.SNMP_POLL_LOCK
+#    #print("SNMP_POLL_LOCK="+str(SNMP_POLL_LOCK), file=sys.stderr)
+#    if SNMP_POLL_LOCK!='' and os.path.exists(SNMP_POLL_LOCK):
+#      print("trying to remove "+str(SNMP_POLL_LOCK), file=sys.stderr)
+#      os.rmdir(SNMP_POLL_LOCK)
+#
+#    SNMP_TEMP_FILE=settings.SNMP_TEMP_FILE
+#    #print("SNMP_TEMP_FILE="+str(SNMP_TEMP_FILE), file=sys.stderr)
+#    if SNMP_TEMP_FILE!='' and os.path.exists(SNMP_TEMP_FILE+'.lock'):
+#      print("trying to remove "+str(SNMP_TEMP_FILE+'.lock'), file=sys.stderr)
+#      os.rmdir(settings.SNMP_TEMP_FILE+'.lock')
 
 ##
 
diff --git a/flowspy/celery_preactions.py b/flowspy/celery_preactions.py
new file mode 100644
index 00000000..d6b4b23e
--- /dev/null
+++ b/flowspy/celery_preactions.py
@@ -0,0 +1,30 @@
+from __future__ import absolute_import, unicode_literals
+import os
+#from celery import Celery
+from flowspy import settings
+import sys
+
+##
+
+print("loading flowspy.celery_preactions", file=sys.stderr)
+
+# set the default Django settings module for the 'celery' program.
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'flowspy.settings')
+
+##
+
+print("performing flowspy.celery_preactions", file=sys.stderr)
+
+if hasattr(settings, 'SNMP_POLL_LOCK'):
+    SNMP_POLL_LOCK=settings.SNMP_POLL_LOCK
+    #print("SNMP_POLL_LOCK="+str(SNMP_POLL_LOCK), file=sys.stderr)
+    if SNMP_POLL_LOCK!='' and os.path.exists(SNMP_POLL_LOCK):
+      print("trying to remove "+str(SNMP_POLL_LOCK), file=sys.stderr)
+      os.rmdir(SNMP_POLL_LOCK)
+
+    SNMP_TEMP_FILE=settings.SNMP_TEMP_FILE
+    #print("SNMP_TEMP_FILE="+str(SNMP_TEMP_FILE), file=sys.stderr)
+    if SNMP_TEMP_FILE!='' and os.path.exists(SNMP_TEMP_FILE+'.lock'):
+      print("trying to remove "+str(SNMP_TEMP_FILE+'.lock'), file=sys.stderr)
+      os.rmdir(settings.SNMP_TEMP_FILE+'.lock')
+
diff --git a/flowspy/run_celery_preactions b/flowspy/run_celery_preactions
new file mode 100755
index 00000000..4c32a4e8
--- /dev/null
+++ b/flowspy/run_celery_preactions
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# run from FoD main dir
+
+# ./flowspy/celery.py
+# ./flowspy/celery_preactions.py
+python3 -c 'import flowspy.celery_preactions'
+
diff --git a/flowspy/wsgi.py b/flowspy/wsgi.py
index 8d533f30..64ba8ab8 100644
--- a/flowspy/wsgi.py
+++ b/flowspy/wsgi.py
@@ -19,6 +19,9 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "flowspy.settings")
 os.environ['HTTPS'] = "on"
 os.environ['wsgi.url_scheme'] = 'https'
 
+import sys
+print ("loading flowspy.gunicorn", file=sys.stderr)
+
 # This application object is used by any WSGI server configured to use this
 # file. This includes Django's development server, if the WSGI_APPLICATION
 # setting points here.
diff --git a/systemd/fod-celeryd.service.dist b/systemd/fod-celeryd.service.dist
index 1dc0973d..3fcc0dde 100644
--- a/systemd/fod-celeryd.service.dist
+++ b/systemd/fod-celeryd.service.dist
@@ -21,6 +21,7 @@ ExecStartPre=-/bin/mkdir -p /var/run/fod/
 ExecStartPre=-/bin/chown fod: /var/run/fod/
 ExecStartPre=-/bin/rm -f -r /var/run/fod/snmppoll.lock
 ExecStartPre=-/bin/rm -f /srv/flowspy/snmp_temp_data.lock
+ExecStartPre=-/srv/flowspy/flowspy/run_celery_preactions
 #ExecStart=/srv/flowspy/pythonenv celery -A flowspy worker -B --concurrency=2 -l debug -f /srv/flowspy/log/celery.log
 ExecStart=/srv/flowspy/pythonenv celery -A flowspy worker -B --concurrency=2 -l info -f /srv/flowspy/log/celery.log
 #PIDFile=/tmp/yourservice.pid
-- 
GitLab