fix: avoid flushing to monitor logs concurrently (#32552)

This commit is contained in:
Ankush Menat 2025-05-16 17:50:40 +05:30 committed by GitHub
parent 26b279864f
commit a6c73dfdbe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -11,6 +11,7 @@ import rq
import frappe
from frappe.utils.data import cint
from frappe.utils.synchronization import filelock
MONITOR_REDIS_KEY = "monitor-transactions"
MONITOR_MAX_ENTRIES = 1000000
@ -122,15 +123,15 @@ class Monitor:
def flush():
try:
# Fetch all the logs without removing from cache
logs = frappe.cache.lrange(MONITOR_REDIS_KEY, 0, -1)
if logs:
logs = list(map(frappe.safe_decode, logs))
with open(log_file(), "a") as f:
f.write("\n".join(logs))
f.write("\n")
# Remove fetched entries from cache
frappe.cache.ltrim(MONITOR_REDIS_KEY, len(logs) - 1, -1)
except Exception:
traceback.print_exc()
logs = frappe.cache.lrange(MONITOR_REDIS_KEY, 0, -1)
if not logs:
return
logs = list(map(frappe.safe_decode, logs))
with filelock("monitor_flush", is_global=True, timeout=5):
with open(log_file(), "a") as f:
f.write("\n".join(logs))
f.write("\n")
# Remove fetched entries from cache
frappe.cache.ltrim(MONITOR_REDIS_KEY, len(logs) - 1, -1)