fix: add try/finally safety net for lock release in beteiligte_sync handler – guarantees Redis key cleanup on any exit path
This commit is contained in:
@@ -88,7 +88,7 @@ async def handler(event_data: Dict[str, Any], ctx: FlowContext[Any]) -> None:
|
|||||||
ctx.logger.warn(f"⏸️ Sync bereits aktiv für {entity_id}, überspringe")
|
ctx.logger.warn(f"⏸️ Sync bereits aktiv für {entity_id}, überspringe")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Lock erfolgreich acquired - MUSS im finally block released werden!
|
# Lock erfolgreich acquired
|
||||||
try:
|
try:
|
||||||
# 2. FETCH ENTITY VON ESPOCRM
|
# 2. FETCH ENTITY VON ESPOCRM
|
||||||
try:
|
try:
|
||||||
@@ -144,7 +144,7 @@ async def handler(event_data: Dict[str, Any], ctx: FlowContext[Any]) -> None:
|
|||||||
await sync_utils.release_sync_lock(entity_id, 'failed', f'Unbekannte Aktion: {action}')
|
await sync_utils.release_sync_lock(entity_id, 'failed', f'Unbekannte Aktion: {action}')
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Unerwarteter Fehler während Sync - GARANTIERE Lock-Release
|
# Unerwarteter Fehler während Sync - Lock-Release via finally
|
||||||
ctx.logger.error(f"❌ Unerwarteter Fehler im Sync-Handler: {e}")
|
ctx.logger.error(f"❌ Unerwarteter Fehler im Sync-Handler: {e}")
|
||||||
import traceback
|
import traceback
|
||||||
ctx.logger.error(traceback.format_exc())
|
ctx.logger.error(traceback.format_exc())
|
||||||
@@ -157,15 +157,16 @@ async def handler(event_data: Dict[str, Any], ctx: FlowContext[Any]) -> None:
|
|||||||
increment_retry=True
|
increment_retry=True
|
||||||
)
|
)
|
||||||
except Exception as release_error:
|
except Exception as release_error:
|
||||||
# Selbst Lock-Release failed - logge kritischen Fehler
|
ctx.logger.critical(f"🚨 CRITICAL: release_sync_lock failed für {entity_id}: {release_error}")
|
||||||
ctx.logger.critical(f"🚨 CRITICAL: Lock-Release failed für {entity_id}: {release_error}")
|
raise
|
||||||
# Force Redis lock release
|
|
||||||
|
finally:
|
||||||
|
# Safety net: force Redis lock release regardless of outcome
|
||||||
try:
|
try:
|
||||||
lock_key = f"sync_lock:cbeteiligte:{entity_id}"
|
force_lock_key = f"sync_lock:cbeteiligte:{entity_id}"
|
||||||
redis_client.delete(lock_key)
|
redis_client.delete(force_lock_key)
|
||||||
ctx.logger.info(f"✅ Redis lock manuell released: {lock_key}")
|
except Exception as cleanup_err:
|
||||||
except:
|
ctx.logger.error(f"❌ Force Lock-Release fehlgeschlagen: {cleanup_err}")
|
||||||
pass
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Fehler VOR Lock-Acquire - kein Lock-Release nötig
|
# Fehler VOR Lock-Acquire - kein Lock-Release nötig
|
||||||
|
|||||||
Reference in New Issue
Block a user