Odoo Poller Robustheit: Race Conditions, Datenverlust und Performance #74
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beschreibung
Der Odoo Poller hat mehrere Robustheitsprobleme: Race Conditions bei der
Duplicate Detection, Datenverlust wenn Tag-Resolution fehlschlägt,
Performance-Probleme durch fehlendes inkrementelles Polling und
unkontrollierte Image-Downloads.
Hintergrund
Bei hohem Ticket-Aufkommen oder instabiler Odoo-Verbindung können Tickets
verloren gehen, doppelt angelegt werden oder der gesamte Polling-Zyklus
blockiert werden. Diese Probleme verschärfen sich mit Multi-Tenant (#63).
Findings
1. Race Condition bei Duplicate Detection (CRITICAL)
Datei:
backend/services/odoo_poller.pyZeile 364-394INSERT ... ON CONFLICT DO UPDATE(upsert) verwenden2. Tag-Resolution bricht gesamten Poll ab (CRITICAL)
Datei:
backend/services/odoo_poller.pyZeile 305-328_resolve_tag_names()fehlschlägt (Odoo unter Last), werden ALLETickets des Zyklus verworfen
3. Image-Download ohne Concurrency-Limit (MEDIUM)
Datei:
backend/services/odoo_poller.pyZeile 161-215asyncio.Semaphore(3)+max_images=10Limit4. httpx.AsyncClient wird nie geschlossen (MEDIUM)
Datei:
backend/services/odoo_poller.pyZeile 284-290OdooClient._clientwird bei App-Start erstellt,close()nie aufgerufenawait poller.close()aufrufen5. Kein inkrementelles Polling (MEDIUM)
Datei:
backend/services/odoo_poller.py["write_date", ">=", last_poll_time]zum Domain-Filter hinzufügen6. Kein Poll-Lock bei Überlappung (MEDIUM)
Datei:
backend/main.py(Scheduler)asyncio.Lock()im Scheduler, Skip wenn bereits laufend7. Weitere kleinere Findings
IMAGES_DIRnicht konfigurierbar (Zeile 18)Akzeptanzkriterien
ON CONFLICT DO UPDATEstatt check-then-insertwrite_date >= last_poll_timeodoo_idTechnische Hinweise
backend/services/odoo_poller.py(Hauptänderungen: upsert, tag-fallback, image-limits)backend/main.py(Poll-Lock, Lifespan close)backend/config.py(ggf.images_dir,max_images_per_ticketSettings)Aufwand: M
Hinweis: #44 (Stuck Tickets Cleanup) und #77 (Fehlerbehandlung Pipeline) wurden in dieses Issue konsolidiert. Alle relevanten Findings sind hier abgedeckt.