windmill-labs/windmill · error
Parquet feature is not enabled. Cannot convert JSON line str
Error message
Parquet feature is not enabled. Cannot convert JSON line stream.
What it means
When the windmill-object-store crate is compiled without the 'parquet' feature, the JSON-lines-to-Parquet conversion stub yields a single error instead of a stream: the Parquet conversion capability simply does not exist in the current build.
Source
Thrown at backend/windmill-object-store/src/lib.rs:1364
pub first_row_latency: Option<std::time::Duration>,
}
#[cfg(not(feature = "parquet"))]
pub async fn convert_json_line_stream<V, E>(
mut _stream: impl futures::TryStreamExt<Item = Result<V, E>> + Unpin,
_output_format: S3ModeFormat,
_progress: Option<tokio::sync::mpsc::Sender<IngestStats>>,
) -> anyhow::Result<(
futures::stream::BoxStream<'static, anyhow::Result<bytes::Bytes>>,
IngestStats,
)>
where
V: serde::Serialize,
E: Into<anyhow::Error>,
{
use futures::StreamExt;
let stream = async_stream::stream! {
yield Err(anyhow::anyhow!("Parquet feature is not enabled. Cannot convert JSON line stream."));
};
Ok((stream.boxed(), IngestStats::default()))
}
#[cfg(feature = "parquet")]
#[derive(Debug, Clone, Copy)]
pub struct IngestStats {
pub rows: u64,
pub bytes: u64,
pub elapsed: std::time::Duration,
pub fetch_wait: std::time::Duration,
pub write_time: std::time::Duration,
pub first_row_latency: Option<std::time::Duration>,
}
#[cfg(feature = "parquet")]
pub async fn convert_json_line_stream<V, E>(
mut stream: impl TryStreamExt<Item = Result<V, E>> + Unpin,View on GitHub (pinned to e474e8803c)
Solutions
- Rebuild the backend with the parquet feature enabled (cargo build --features parquet, or use the official Windmill Docker image which includes it)
- If you control the deployment, switch to an image/build that includes Parquet support
- Until rebuilt, store results as JSON lines instead of Parquet
Example fix
// before (custom build) cargo build --release // after cargo build --release --features parquet # or use the official windmill docker image
Defensive patterns
Strategy: fallback
Validate before calling
// Detect a parquet-less build before requesting conversion
fn parquet_supported() -> bool { cfg!(feature = "parquet") } Try / catch
match convert_jsonl_to_parquet(stream).await {
Ok((s, stats)) => use_parquet(s, stats),
Err(e) if e.to_string().contains("Parquet feature is not enabled") => {
// fall back to JSON lines storage
store_as_json_lines(stream).await
}
Err(e) => return Err(e),
} Prevention
- Build Windmill with --features parquet if you need Parquet storage
- Prefer the official Docker images which ship with Parquet enabled
- Check feature flags in CI so Parquet-dependent paths are not deployed from feature-less builds
When it happens
Trigger: Calling json line-stream-to-Parquet conversion (the non-parquet fallback of the stream conversion function) against a Windmill backend built without --features parquet.
Common situations: Custom/self-compiled Windmill binary missing the parquet cargo feature while a script or flow requests Parquet storage of S3/large-result data; official images include the feature, so this mainly hits custom builds.
Related errors
- Parquet S3 input requires the `parquet` feature to be enable
- Failed to load S3 file: ${response.status} ${response.status
- deleteS3File: s3 key is required
- Invalid s3 object URI ${JSON.stringify(s3Object)}: expected
- Invalid s3 object ${JSON.stringify(s3Object)}: expected an s
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/c0d490200c9ef62b.
Report an issue: GitHub.