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
Bulk-ingest resilience: stop retrying deterministic failures; stabilize local storage root (HAL-321) (#48)
* queue: add PermanentError so deterministic failures stop retrying
A handler can now return queue.Permanent(err) to mark a failure as
non-retryable. The River backend translates it to river.JobCancel, which
dead-letters the job immediately instead of burning the full retry budget on
an input that can never succeed. Transient failures stay ordinary errors and
keep retrying. Fixes the HAL-321 symptom where an encrypted/malformed PDF was
retried 5x, interleaving confusing 'object not found' errors into its history.
* ingest: classify deterministic parse failures as permanent
parse() now splits failures: a not-yet-visible source and a parse timeout stay
transient (retry can recover them under load); an encrypted/malformed/no-text
document is wrapped queue.Permanent so the queue cancels it. fail() marks a
permanent failure as terminal immediately, regardless of attempt number, so a
cancelled doc no longer wedges in 'parsing' forever.
* storage: pin local root to absolute + self-diagnosing not-found
NewLocal resolves its root with filepath.Abs so a relative default
(./data/documents) can't resolve against a different working directory after an
engine restart while River still holds jobs for earlier uploads — the path
drift that made a source 'not found' though it was on disk. Get's not-found
error now carries the resolved path, and the engine logs the absolute root at
boot (also where to point a Defender exclusion).
0 commit comments