Bug fixes
Lock/Unlockno longer log spurious errors during Caddy shutdown or config reload. Previously, whenCleanup()closed the Redis connection pool while a background lock-refresh goroutine or an in-flightUnlock()was still running, this produced noisyFailed to refresh lock/client is closedwarnings. The refresh goroutine now exits quietly on a canceled context or closed client, andUnlock()treats an already-expired or externally-released lock as success rather than an error.- Errors from storage operations are now wrapped with
%w, enablingerrors.Is/errors.As. Most errors were previously formatted with%v, which discards the underlying error and prevents callers (e.g. CertMagic, Caddy) from inspecting error chains for conditions likecontext.Canceledorfs.ErrNotExist. Load()no longer misreports real Redis errors as "file does not exist". Anilresult from Redis was previously treated asfs.ErrNotExistregardless of the actual error returned (including e.g. a canceled context), silently swallowing legitimate errors.redis repairno longer produces a garbled error when the config has no storage module configured. This case was previously conflated with a JSON parse failure, formatting anilerror with%w.