docs/internals/adr/gaps/007-no-multi-level-caching.md
Status: Open Discovered: 2026-02-19 Context: Cloud-native storage characteristics analysis (metadata caching). Split from original multi-level caching gap; broader caching concerns tracked in GAP-010.
Quickwit does not cache Parquet file footers or column chunk metadata. Every file access pays the full latency-to-first-byte penalty to read the footer from object storage before any column data can be located and fetched.
Parquet footers contain the schema, row group metadata, column chunk offsets, min/max statistics, and encoding information. Column chunk headers contain page-level metadata (data page offsets, dictionary page locations, compression codec). These are small (typically a few KB per file) but are read on every access to every split.
At production scale with thousands of splits per time range, the aggregate cost of repeated footer fetches is significant — both in latency (sequential S3 round-trips) and in dollars (S3 GET request pricing). Storage tiering (e.g., S3 Intelligent Tiering) makes this worse: reading even one byte from a cold file promotes it to hot tier for 30 days at higher cost.
Quickwit's search path (quickwit-search) downloads split data from object storage on each query. There is a split cache for warming (report_splits()), but no dedicated cache for Parquet footers or column chunk metadata. Each query that touches a split must fetch the footer before it can locate and read any column data.
A single S3 GET request has ~50-100ms latency-to-first-byte. For a query spanning 100 splits, footer fetches alone contribute 5-10 seconds of serial latency (or significant parallelism overhead).
spark.sql.parquet.footerCache).(split_id, footer_offset). Footers are immutable (splits are immutable once written), so cache invalidation is trivial — evict on LRU pressure only.All signals equally affected. Parquet footer caching benefits metrics queries directly. For logs/traces using Tantivy, the analogous concern is segment metadata caching — the same pattern applies.
quickwit-search, quickwit-storage