You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Follow-ups deliberately deferred when #1369 merged. All are real but narrow — Windows file-lock and clock-skew scenarios, or additional id-keyed cache families — and none affects the core fix (a new photo row purging derivatives left by a previous owner of its recycled rowid).
Context: photos.id is INTEGER PRIMARY KEYwithoutAUTOINCREMENT, so SQLite hands the next insert max(rowid) + 1 and freed ids come straight back. Everything under ~/.vireo keyed by bare photo id is therefore inheritable. #1369 covered thumbnails, previews, working copies, masks, prepared renders, external-DNG, external-edits, and offline originals.
serve_mask now requires a photo_masks / photos.mask_path row rather than serving any file that exists. On the live library 915 of 916 unreferenced bare masks belonged to dead photo ids; 1 belonged to a live photo.
The <id>_regen.jpg sidecar in serve_thumbnail (serves a fresh render when the stale thumbnail is locked, rather than 404ing). It is the most intricate part of that diff and generated five follow-up findings of its own; the simpler alternative is to 404.
Follow-ups deliberately deferred when #1369 merged. All are real but narrow — Windows file-lock and clock-skew scenarios, or additional id-keyed cache families — and none affects the core fix (a new photo row purging derivatives left by a previous owner of its recycled rowid).
Context:
photos.idisINTEGER PRIMARY KEYwithoutAUTOINCREMENT, so SQLite hands the next insertmax(rowid) + 1and freed ids come straight back. Everything under~/.vireokeyed by bare photo id is therefore inheritable. #1369 covered thumbnails, previews, working copies, masks, prepared renders, external-DNG, external-edits, and offline originals.Open findings- ** Purge recycled iNaturalist upload renders** —
vireo/preview_cache.py:315(thread)vireo/scanner.py:622(thread)vireo/app.py:24941(thread)vireo/preview_cache.py:460(thread)vireo/app.py:30542(thread)vireo/preview_cache.py:395(thread)Notes
edit-masks/is deliberately excluded from the id-keyed purge — those snapshots are content-addressed andlocal_masks.gc_edit_masksowns them by ref. Purging them by id destroyed data (see Stop recycled photo rowids from inheriting the old photo's cached images #1369 discussion).serve_masknow requires aphoto_masks/photos.mask_pathrow rather than serving any file that exists. On the live library 915 of 916 unreferenced bare masks belonged to dead photo ids; 1 belonged to a live photo.<id>_regen.jpgsidecar inserve_thumbnail(serves a fresh render when the stale thumbnail is locked, rather than 404ing). It is the most intricate part of that diff and generated five follow-up findings of its own; the simpler alternative is to 404.🤖 Generated with Claude Code