Repository navigation
v0.9.5
Two fixes, both reported from outside the project, plus the move to the Rust 2024 edition.
Fixed
Full-text and hybrid queries return 400, not 500, when the namespace has no BM25 index.
Firn sends the query text to LanceDB without naming a column, so LanceDB resolves the target from the set of indexed text columns. With no index that set is empty and the query cannot be planned. The failure reached callers as a generic internal error, which is indistinguishable from a storage or IO failure, so a client could not tell whether retrying was sensible. It was not: no retry succeeds until an index exists. The error now names the missing index and the endpoint that builds it.
Hybrid requests fail rather than quietly falling back to vector-only ranking, so a missing index cannot show up as an unexplained change in result quality. A namespace that has never been written still answers every query shape with an empty 200, which is why a new deployment looks healthy until the first document lands.
This also settles an inconsistency where the same fault answered 400 or 500 depending on whether the request happened to carry an unrelated filter, and named the filter as the cause when it did.
Closes #103.
Startup failures on the cache directory name the directory and the variable.
A container that cannot write to its result cache directory refused to start with a bare IO error. Under a read-only root filesystem that read as Read-only file system (os error 30) and nothing else: no path, no variable, and with two local cache directories in play, no way to tell which one was at fault. The obvious next move is to relax the container's security context until the server starts, which works and leaves a worse deployment behind for no reason.
The image pre-creates its default cache directory, so the directory check during startup succeeds and never reports anything; the first real failure comes from the cache itself, and that error carried no path. Both sites now name the directory and the variable that selected it. The object cache directory check gets the same treatment.
If you run under a restricted pod security context, note that two directories need to be writable, not one. FIRNFLOW_CACHE_NVME_PATH is always in use, and the image points it at /var/lib/firnflow/cache rather than the binary's own /tmp/firnflow-cache default. FIRNFLOW_OBJECT_CACHE_DIR matters only when the object cache is enabled. The deployment guide now lists both with a volume example.
Closes #104.
Changed
The workspace builds on the Rust 2024 edition, and the declared minimum toolchain moves from 1.85 to 1.91. The 1.85 floor was already wrong, since the exact-pinned lance 6.0.0 and lancedb 0.29.0 line needs 1.91 to compile. This is a build-level change: the REST API, the wire formats, and the Python API behave exactly as before.
Python package
firn on PyPI stays at 0.2.1. The package compiles firnflow-core, but neither fix reaches it: the binding builds the BM25 index itself before any text or hybrid query, so the missing-index error is unreachable from Python, and the cache directory fix is in firnflow-api, which the package does not compile.
Docker: ghcr.io/gordonmurray/firnflow:0.9.5
Full changelog: v0.9.4...v0.9.5