fix: run Frigate+ API calls in thread pool to prevent event loop blocking

The send_to_plus and set_false_positive handlers are async but call
synchronous PlusApi methods (which use the requests library) directly,
blocking the asyncio event loop for 10-16 seconds during image upload.
This stalls all other HTTP requests to Frigate.

Wrap upload_image, add_annotation, and add_false_positive calls in
asyncio.to_thread() so they run in a thread pool without blocking.

Fixes #16566
This commit is contained in:
Andy Warren 2026-03-13 15:28:31 -05:00
parent 7864c446fc
commit e873cd6837

View File

@ -11,6 +11,7 @@ from functools import reduce
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from urllib.parse import unquote from urllib.parse import unquote
import asyncio
import cv2 import cv2
import numpy as np import numpy as np
@ -1124,7 +1125,7 @@ async def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = N
) )
try: try:
plus_id = request.app.frigate_config.plus_api.upload_image(image, event.camera) plus_id = await asyncio.to_thread(request.app.frigate_config.plus_api.upload_image, image, event.camera)
except Exception as ex: except Exception as ex:
logger.exception(ex) logger.exception(ex)
return JSONResponse( return JSONResponse(
@ -1140,7 +1141,8 @@ async def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = N
box = event.data["box"] box = event.data["box"]
try: try:
request.app.frigate_config.plus_api.add_annotation( await asyncio.to_thread(
request.app.frigate_config.plus_api.add_annotation,
event.plus_id, event.plus_id,
box, box,
event.label, event.label,