diff --git a/serverAppConfigs-docs/Dankserver/Media Metadata View.md b/serverAppConfigs-docs/Dankserver/Media Metadata View.md index 134ad6d..57691f9 100644 --- a/serverAppConfigs-docs/Dankserver/Media Metadata View.md +++ b/serverAppConfigs-docs/Dankserver/Media Metadata View.md @@ -3,7 +3,7 @@ type: reference title: Media Metadata View description: "The SSD-backed overlay the two media servers read and write: shape, guards, commands, laws, rollback." tags: [dankserver, media-server, jellyfin, plex, storage] -timestamp: 2026-11-01T01:00:00Z +timestamp: 2026-11-02T01:00:00Z --- # Media Metadata View @@ -134,6 +134,19 @@ the defaults are the host values above. upper layer*, not for changes on the array underneath. After any relayout or externally-written metadata, trigger a library refresh — see [[Media Relayout]] for the refresh procedure. +- **`stat` through the view can outlive the file.** Measured 2026-11-02 while a TV + dedupe pass moved folders on the raw path: the merged tree still answered `stat` + at the old coordinates — link count `0`, and `ls` of the same parent no longer + listed the name. Overlayfs keeps a dentry for a lower file that was moved + underneath it, so a script that tests existence with `[ -e ]` against the view can + believe a file its own `readdir` denies. Prove existence by listing the parent. + The media servers walk by `readdir`, so ghosts never reach the library — this bites + a tool, never a user, which is why no server symptom accompanies it. +- **Tools that move or measure media walk the raw array, never the view** — every + relayout, prune and detritus pass, and every journal it writes. The view is for + Jellyfin's writes and Plex's reads only. One deliberate exception: `tvshow.nfo` + sidecars live in the upper layer, so a tool reading show identity points at the + view (`media-tvdupes.py --meta /var/lib/media-meta/view/TVShows`). ## Failure signatures @@ -148,6 +161,7 @@ the defaults are the host values above. | A media server's scan record reads `"Status": "Aborted"` | Its container restarted (a cutover, an image bump, an OOM) and the walk was discarded; systemd's `Restart=always` restarts the *server*, never the scan. Trigger a refresh — see [[Media Relayout]]. | | The Jellyfin API answers 401 to every token header | Almost always the header **form**, not the key: 12.4 authenticates only `Authorization: MediaBrowser Token="…"` and refuses a bare `X-Emby-Token` for every key, valid or not — and one collapsed backslash in the curl config produces the same 401. `[[Jellyfin]]` owns the block that works. Before concluding anything, prove the key against the server's own table: `select count(*) from ApiKeys where AccessToken = ?` on `jellyfin.db` opened `mode=ro&immutable=1`. | | `systemctl status` finds no such unit | Look under the escaped name, `var-lib-media\x2dmeta-view.mount`, not the repo file name. | +| Stale dentry through the view: `stat` succeeds with link count `0` while the parent's `ls` omits the name | The lower file was moved on the raw path after the view cached its dentry. Nothing is lost; existence through the view is proved by the parent listing. | ## Rollback