windmill-labs/windmill · error
CSV S3 input requires the `parquet` feature to be enabled on
Error message
CSV S3 input requires the `parquet` feature to be enabled on this build
What it means
Like the Parquet decoder, the CSV-to-JSON-array decoder for S3 file inputs lives behind the `parquet` cargo feature (it shares the blocking-thread decode infrastructure). Builds without the feature stub it out and bail with this message.
Source
Thrown at backend/windmill-object-store/src/lib.rs:1652
.map_err(to_anyhow)?;
let mut out: Vec<u8> = Vec::new();
let mut writer = json::Writer::<_, JsonArray>::new(&mut out);
for batch in reader {
let batch = batch.map_err(to_anyhow)?;
writer.write(&batch).map_err(to_anyhow)?;
}
writer.finish().map_err(to_anyhow)?;
drop(writer);
String::from_utf8(out).map_err(to_anyhow)
})
.await
.map_err(to_anyhow)?
}
#[cfg(not(feature = "parquet"))]
pub async fn decode_csv_bytes_to_json_array(_bytes: bytes::Bytes) -> anyhow::Result<String> {
anyhow::bail!("CSV S3 input requires the `parquet` feature to be enabled on this build")
}
lazy_static::lazy_static! {
pub static ref S3_PROXY_LAST_ERRORS_CACHE: Cache<String, String> = Cache::new(4);
}
#[cfg(feature = "parquet")]
pub async fn get_logs_from_store(
log_offset: i32,
logs: &str,
log_file_index: &Option<Vec<String>>,
) -> Option<impl futures::Stream<Item = Result<bytes::Bytes, object_store::Error>>> {
if log_offset > 0 {
if let Some(file_index) = log_file_index.clone() {
if file_index.iter().any(|p| !is_safe_log_file_path(p)) {
return None;
}
if let Some(os) = get_object_store().await {View on GitHub (pinned to e474e8803c)
Solutions
- Rebuild the backend with the parquet feature enabled
- Use the official Windmill image with the feature included
- Fetch and parse the CSV inside the script (e.g. via HTTP/S3 client) instead of using S3 file inputs
Example fix
// before cargo build // after cargo build --features parquet
Defensive patterns
Strategy: validation
Validate before calling
// guard CSV S3 inputs on feature-less builds
if file_extension == "csv" && !cfg!(feature = "parquet") {
return Err(anyhow!("csv s3 input needs the parquet feature in this build"));
} Try / catch
match decode_csv_bytes_to_json_array(bytes).await {
Err(e) if e.to_string().contains("CSV S3 input") =>
eprintln!("rebuild with --features parquet or parse CSV in-script"),
Err(e) => return Err(e.into()),
Ok(json) => json,
} Prevention
- Remember CSV S3 decoding rides on the parquet feature
- Enable the feature in all environments consuming S3 CSV inputs
- Keep a CSV parse fallback inside the script
When it happens
Trigger: Processing an S3 input CSV file via decode_csv_bytes_to_json_array on a backend built without the `parquet` feature.
Common situations: Source-compiled backends handling S3 CSV inputs; the CSV path is gated together with parquet, which surprises users who expect plain CSV support.
Related errors
- Parquet S3 input requires the `parquet` feature to be enable
- writer close task panicked: {e}
- An error occurred when generating CSV:
- Failed to load S3 file: ${response.status} ${response.status
- deleteS3File: s3 key is required
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/308f7ea8132ae9c7.
Report an issue: GitHub.