Dooratre commited on
Commit
6fa9cb3
Β·
verified Β·
1 Parent(s): 48009ec

Update gunicorn_config.py

Browse files
Files changed (1) hide show
  1. gunicorn_config.py +43 -4
gunicorn_config.py CHANGED
@@ -2,6 +2,9 @@
2
  Gunicorn configuration for Main DB Server.
3
  Optimized for 50+ servers making constant requests.
4
  Must handle 1000+ requests per minute reliably.
 
 
 
5
  """
6
 
7
  import os
@@ -47,8 +50,11 @@ graceful_timeout = 30
47
  max_requests = 0
48
  max_requests_jitter = 0
49
 
50
- # Preload app for faster worker startup and shared memory
51
- preload_app = True
 
 
 
52
 
53
  # Use /dev/shm for temp files (RAM-based, faster than disk)
54
  worker_tmp_dir = "/dev/shm"
@@ -80,15 +86,38 @@ loglevel = os.environ.get("LOG_LEVEL", "info")
80
  # ═══════════════════════════════════════════════════════════════
81
 
82
  def on_starting(server):
 
 
 
 
 
83
  print("\n" + "═" * 60)
84
  print(" πŸ—„οΈ Main DB Registry - Starting Production Server")
85
  print(" ⚑ 2 Workers + Gevent + 4000 Total Connections")
86
  print(" πŸ”Œ Keep-Alive: 65 seconds")
87
- print(" πŸ“Š Designed for 50+ servers, 1000+ req/min")
 
 
88
  print("═" * 60 + "\n")
89
 
90
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  def on_exit(server):
 
92
  print("\n πŸ›‘ Main DB Registry shutting down...")
93
  try:
94
  from memory import get_db
@@ -99,4 +128,14 @@ def on_exit(server):
99
  else:
100
  print(f" ❌ Final backup failed: {errors}")
101
  except Exception as e:
102
- print(f" ⚠️ Shutdown backup error: {e}")
 
 
 
 
 
 
 
 
 
 
 
2
  Gunicorn configuration for Main DB Server.
3
  Optimized for 50+ servers making constant requests.
4
  Must handle 1000+ requests per minute reliably.
5
+
6
+ IMPORTANT: preload_app is False so each worker initializes
7
+ its own MainMemoryDB instance. Workers sync via /dev/shm shared files.
8
  """
9
 
10
  import os
 
50
  max_requests = 0
51
  max_requests_jitter = 0
52
 
53
+ # DO NOT preload app - each worker must initialize its own DB instance
54
+ # Workers sync data via shared memory files in /dev/shm/maindb/
55
+ # If preload_app = True, forked workers get separate RAM copies
56
+ # that never sync with each other = DATA INCONSISTENCY BUG
57
+ preload_app = False
58
 
59
  # Use /dev/shm for temp files (RAM-based, faster than disk)
60
  worker_tmp_dir = "/dev/shm"
 
86
  # ═══════════════════════════════════════════════════════════════
87
 
88
  def on_starting(server):
89
+ """Called just before the master process is initialized."""
90
+ # Create shared memory directory before workers start
91
+ shared_dir = os.environ.get("SHARED_DATA_DIR", "/dev/shm/maindb")
92
+ os.makedirs(shared_dir, exist_ok=True)
93
+
94
  print("\n" + "═" * 60)
95
  print(" πŸ—„οΈ Main DB Registry - Starting Production Server")
96
  print(" ⚑ 2 Workers + Gevent + 4000 Total Connections")
97
  print(" πŸ”Œ Keep-Alive: 65 seconds")
98
+ print(" πŸ”Š Designed for 50+ servers, 1000+ req/min")
99
+ print(" πŸ”„ Workers sync via /dev/shm/maindb/ shared files")
100
+ print(" ⚠️ preload_app = False (each worker inits own DB)")
101
  print("═" * 60 + "\n")
102
 
103
 
104
+ def post_fork(server, worker):
105
+ """Called after each worker is forked."""
106
+ print(f" πŸ”„ Worker PID {worker.pid} forked - will init DB on first request")
107
+
108
+
109
+ def worker_int(worker):
110
+ """Called when a worker receives SIGINT."""
111
+ print(f" ⚠️ Worker PID {worker.pid} received SIGINT")
112
+
113
+
114
+ def worker_abort(worker):
115
+ """Called when a worker receives SIGABRT (timeout)."""
116
+ print(f" ❌ Worker PID {worker.pid} aborted (timeout?)")
117
+
118
+
119
  def on_exit(server):
120
+ """Called just before exiting Gunicorn."""
121
  print("\n πŸ›‘ Main DB Registry shutting down...")
122
  try:
123
  from memory import get_db
 
128
  else:
129
  print(f" ❌ Final backup failed: {errors}")
130
  except Exception as e:
131
+ print(f" ⚠️ Shutdown backup error: {e}")
132
+
133
+ # Clean up shared memory files
134
+ try:
135
+ shared_dir = os.environ.get("SHARED_DATA_DIR", "/dev/shm/maindb")
136
+ if os.path.exists(shared_dir):
137
+ import shutil
138
+ shutil.rmtree(shared_dir, ignore_errors=True)
139
+ print(" 🧹 Cleaned up shared memory files")
140
+ except Exception as e:
141
+ print(f" ⚠️ Cleanup error: {e}")