Name the sidecar the drain could not deliver

The write path learned to say which file the server refused; the drain path —
the one that runs for work queued while offline — still reported only a count.
That is the path that matters most, because everything it carries was made
with no connection and exists on one device.

With it named, the failure on the tablet is:

    draining PhotosRaw/2026/2026-08-03/_MG_9221.drsc:
    permission denied

on a credential that pushes the catalog to the same library root in the same
pass. So this is not the account and not the app password: one path is
writable and another is not, which points at the server — a read-only share
over that folder, or a file access control rule on the extension — rather than
at anything this side can retry its way out of.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 14:21:00 +02:00
co-authored by Claude Opus 5
parent 6a7ed37aed
commit 09f6cf8c0f
+4 -1
View File
@@ -698,7 +698,10 @@ pub fn spawn_outbox_drain(
match drain_one(&backend, &cache, path_str).await { match drain_one(&backend, &cache, path_str).await {
Ok(()) => report.written += 1, Ok(()) => report.written += 1,
Err(e) => { Err(e) => {
log::debug!("draining {path_str}: {e}"); // Warn, for the reason the write path does: this is
// unsynced work and the path is what makes the failure
// actionable.
log::warn!("draining {path_str}: {e}");
report.last_error = Some(e); report.last_error = Some(e);
report.failed += 1; report.failed += 1;
// Still queued — the marker was never cleared. // Still queued — the marker was never cleared.