feat: Implement background scheduler initialization to prevent race conditions in multi-worker deployments
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
"""
|
||||
Gunicorn configuration for Inventarsystem.
|
||||
|
||||
This configuration ensures that:
|
||||
1. The BackgroundScheduler runs reliably in only one worker process
|
||||
2. Appointment status updates and reminders work correctly
|
||||
3. Multi-worker deployments don't cause race conditions
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Get project root
|
||||
PROJECT_ROOT = Path(__file__).parent
|
||||
|
||||
# Basic configuration
|
||||
bind = "unix:/tmp/inventarsystem.sock"
|
||||
workers = 1 # CRITICAL: Only 1 worker to prevent BackgroundScheduler race conditions
|
||||
worker_class = "sync"
|
||||
timeout = 60
|
||||
graceful_timeout = 20
|
||||
max_requests = 1000
|
||||
max_requests_jitter = 100
|
||||
|
||||
# Logging
|
||||
accesslog = str(PROJECT_ROOT / "logs" / "access.log")
|
||||
errorlog = str(PROJECT_ROOT / "logs" / "error.log")
|
||||
log_level = "info"
|
||||
capture_output = True
|
||||
|
||||
# Worker initialization hook to ensure scheduler starts only once
|
||||
def on_starting(server):
|
||||
"""Called just before the master process is initialized."""
|
||||
print("[GUNICORN] Starting Inventarsystem with scheduler support (1 worker only)")
|
||||
|
||||
def when_ready(server):
|
||||
"""Called just after the server is started."""
|
||||
print("[GUNICORN] Server is ready. Scheduler should be active in the single worker process.")
|
||||
|
||||
# Ensure the logs directory exists
|
||||
os.makedirs(PROJECT_ROOT / "logs", exist_ok=True)
|
||||
Reference in New Issue
Block a user