mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-15 18:00:52 +03:00
Gracefully handle transiently failing exists calls (#23172)
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
I have a very repeatable reproduction of an issue where most of my cameras show a "No frames have been received, check error logs" image in the UI, but restreaming in HomeAssistant is working flawlessly. The only errors in the logs I saw were some like this: `OSError: [Errno 121] Remote I/O error`. Doing a bit more debugging, it looked like Frigate was failing to create the thumbnail directory for a camera because it already existed. This error was a clue as to the class of error. I was surprised to learn that `os.path.exists` [silently suppresses errors from os.stat and returns False](https://github.com/python/cpython/blob/main/Lib/genericpath.py#L22). This makes for a plausible series of events: a transient stat call fails, so Frigate takes the creation path, which gets upset that the directory already exists. I found a few other possible cases to fix but did not make an exhaustive search. It seems that this `exist_ok` flag is used elsewhere within Frigate so I thought it would be a good solution. AI disclosure: I used AI to diagnose my issue and asked it to translate its init-time patches to the container source into this repo. I verified that its patches solved the problem I was facing. Its theory fits the facts - I am using a distributed file system and I saw the error in my logs. I checked the upstream Python code to verify the error suppression behavior, and read the corresponding Frigate code. I did not use AI to author this commit message/PR description; all diction and typos here are my own.
This commit is contained in:
parent
4e90d254ed
commit
f1e2240945
@ -144,7 +144,7 @@ class FrigateApp:
|
|||||||
for d in dirs:
|
for d in dirs:
|
||||||
if not os.path.exists(d) and not os.path.islink(d):
|
if not os.path.exists(d) and not os.path.islink(d):
|
||||||
logger.info(f"Creating directory: {d}")
|
logger.info(f"Creating directory: {d}")
|
||||||
os.makedirs(d)
|
os.makedirs(d, exist_ok=True)
|
||||||
else:
|
else:
|
||||||
logger.debug(f"Skipping directory: {d}")
|
logger.debug(f"Skipping directory: {d}")
|
||||||
|
|
||||||
|
|||||||
@ -610,8 +610,7 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
camera,
|
camera,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not os.path.exists(directory):
|
os.makedirs(directory, exist_ok=True)
|
||||||
os.makedirs(directory)
|
|
||||||
|
|
||||||
# file will be in utc due to start_time being in utc
|
# file will be in utc due to start_time being in utc
|
||||||
file_name = f"{start_time.strftime('%M.%S.mp4')}"
|
file_name = f"{start_time.strftime('%M.%S.mp4')}"
|
||||||
|
|||||||
@ -531,8 +531,7 @@ class TrackedObject:
|
|||||||
|
|
||||||
directory = os.path.join(THUMB_DIR, self.camera_config.name)
|
directory = os.path.join(THUMB_DIR, self.camera_config.name)
|
||||||
|
|
||||||
if not os.path.exists(directory):
|
os.makedirs(directory, exist_ok=True)
|
||||||
os.makedirs(directory)
|
|
||||||
|
|
||||||
thumb_bytes = self.get_thumbnail("webp")
|
thumb_bytes = self.get_thumbnail("webp")
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user