From 06d1365056b21e11d88650b55cf33f93df3de560 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Wed, 11 Nov 2026 09:52:58 -0600 Subject: [PATCH] Report ownership scan progress (#24940) * report ownership scan progress The ownership scan printed nothing until it finished, which took 30+ minutes on large recordings volumes and looked stuck. It now logs a running count of checked and mismatched entries every 30 seconds. * check the scan clock on every entry --- docker/main/rootfs/usr/local/bin/fix-ownership | 15 ++++++++++++++- docs/docs/configuration/non_root.md | 3 ++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docker/main/rootfs/usr/local/bin/fix-ownership b/docker/main/rootfs/usr/local/bin/fix-ownership index 495fcb3dc2..7649a208b1 100755 --- a/docker/main/rootfs/usr/local/bin/fix-ownership +++ b/docker/main/rootfs/usr/local/bin/fix-ownership @@ -105,6 +105,8 @@ if [[ -n "$sentinel" ]]; then mismatch_expr+=(-a ! -path "$sentinel") fi +exec 3>&1 + for path in "$@"; do # An absent root is an incomplete sweep, not a finished one: /media/frigate # is not in the image, so a boot before the volume is mounted would @@ -121,7 +123,18 @@ for path in "$@"; do # stale mount. Tolerate it rather than aborting under errexit, but never # read a failed scan as "nothing to do": that would record the sweep as # complete without having looked. - if ! count=$(find "$path" -name lost+found -prune -o "${mismatch_expr[@]}" -printf '.' 2>/dev/null | wc -c); then + # The walk prints nothing until it ends, so report every 30s through fd 3 + # (stdout) while the count itself comes back through the substitution. + if ! count=$(find "$path" -name lost+found -prune -o "(" "${mismatch_expr[@]}" ")" -printf 'm\n' -o -printf '.\n' 2>/dev/null \ + | awk -v path="$path" ' + BEGIN { next_report = systime() + 30 } + $0 == "m" { mismatched++ } + systime() >= next_report { + printf "[INFO] fix-ownership: still scanning %s, %d entries checked, %d need changes\n", path, NR, mismatched > "/dev/fd/3" + fflush("/dev/fd/3") + next_report = systime() + 30 + } + END { print mismatched + 0 }'); then swept_clean=0 echo "[WARN] fix-ownership: could not scan ${path}; will retry on next boot" continue diff --git a/docs/docs/configuration/non_root.md b/docs/docs/configuration/non_root.md index f6e9dd1e08..df8d6393c4 100644 --- a/docs/docs/configuration/non_root.md +++ b/docs/docs/configuration/non_root.md @@ -71,13 +71,14 @@ Both the script and the boot sweep report progress, so you can tell a slow sweep ``` [INFO] fix-ownership: scanning /media/frigate for ownership mismatches; this may take a while on large filesystems +[INFO] fix-ownership: still scanning /media/frigate, 2481000 entries checked, 2390112 need changes [WARN] fix-ownership: adjusting ownership of 4823941 entries under /media/frigate [INFO] fix-ownership: /media/frigate 5% (241197/4823941 entries) [INFO] fix-ownership: /media/frigate 10% (482394/4823941 entries) [INFO] fix-ownership: finished /media/frigate in 12m 4s ``` -The scan has no percentage because the total isn't known until it finishes. Watch the boot sweep with `docker logs -f frigate`. +The scan has no percentage because the total isn't known until it finishes, so it reports a running count every 30 seconds instead. Watch the boot sweep with `docker logs -f frigate`. Once the volumes are aligned, start Frigate normally. A file at `/config/.permissions_version` records what was done, so later boots skip the sweep unless you change `PUID`/`PGID`.