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

  1. Rebuild the backend with the parquet feature enabled (cargo build --features parquet, or use the official Windmill Docker image which includes it)
  2. If you control the deployment, switch to an image/build that includes Parquet support
  3. 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

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


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/c0d490200c9ef62b. Report an issue: GitHub.