windmill-labs/windmill · critical
unreachable, language is not supported: {language:#?}
Error message
unreachable, language is not supported: {language:#?} What it means
This panic is the terminal catch-all arm of the language dispatch in the Windmill worker's script executor. When the job's language enum carries a variant that the match does not handle (the match arms are kept in sync via the ADD_NEW_LANG comment convention), the worker aborts the job immediately because executing an unsupported language would produce wrong results silently.
Source
Thrown at backend/windmill-worker/src/worker.rs:6880
lock.as_ref(),
job_dir,
worker_name,
job,
mem_peak,
canceled_by,
conn,
client,
&code,
envs,
occupancy_metrics,
// The project's identity is derived from these, so the dbt
// executor needs them even though they are already on disk.
modules.as_ref(),
))
.await
}
// for related places search: ADD_NEW_LANG
_ => panic!("unreachable, language is not supported: {language:#?}"),
};
// Volume sync-back and lease release
#[cfg(feature = "parquet")]
if !volume_setup.states.is_empty() {
// Stop lease renewal before sync-back
volume_setup.lease_renewal.0.take().map(|h| h.abort());
if let Some(ref vol_client) = volume_setup.client {
if let Connection::Sql(db) = conn {
crate::volume_oss::sync_volumes_sql_worker(
&volume_setup.states,
&volume_setup.writable,
vol_client,
db,
&job.workspace_id,
job.id,
worker_name,
conn,View on GitHub (pinned to e474e8803c)
Solutions
- Check the job's `language` column value and confirm the worker binary version matches the server version (upgrade the worker to the same release).
- Search the codebase for ADD_NEW_LANG and add a match arm implementing the missing language in backend/windmill-worker/src/worker.rs.
- If the language is only supported in EE, route those jobs to workers built with the required cargo features or change the script's language to a supported one.
- Report the exact `{language:#?}` payload from the panic message if it comes from a stock build — it indicates an unhandled enum variant.
Example fix
// before (worker.rs dispatch)
_ => panic!("unreachable, language is not supported: {language:#?}"),
// after (add the missing arm near other ADD_NEW_LANG sites)
Language::MyNewLang => { /* execute my-new-lang payload */ } Defensive patterns
Strategy: validation
Validate before calling
// before creating/scheduling a job, check the worker build supports the language
const SUPPORTED = ["python3", "deno", "bun", "go", "bash", "powershell", "nu", "php", "rust", "ansible"];
if (!SUPPORTED.includes(job.language)) {
throw new Error(`language ${job.language} not supported by this worker build`);
} Type guard
function isSupportedLanguage(lang: string): lang is typeof SUPPORTED[number] {
return (SUPPORTED as readonly string[]).includes(lang);
} Prevention
- Keep worker and server versions identical in every deployment; upgrade workers before dispatching jobs with new languages.
- When adding a Language variant, grep for ADD_NEW_LANG and update every dispatch site including worker.rs.
- Pin workers that only support a language subset to queues that never receive unsupported jobs.
When it happens
Trigger: A job row reaches the worker with a `language` value not covered by the match arms — typically a newly added Language enum variant in windmill-common that the worker executor was not updated for, or a script/flow step persisted with a language only supported by EE builds or other executors (e.g. bun/ deno variants) running on a worker built without that support.
Common situations: Running a worker binary older than the server that accepted a newer language kind; mixed-version clusters during rolling upgrades; custom forks adding a language and forgetting the `// for related places search: ADD_NEW_LANG` update sites; hub scripts using niche languages dispatched to a worker that cannot handle them.
Related errors
- could not create dir '{directory_path}': {e}
- failed to execute replace_ephemeral command: {}
- ENABLE_UNSHARE_PID is set but unshare test failed. Error: {}
- ENABLE_UNSHARE_PID is set but unshare binary not found. Inst
- ENABLE_UNSHARE_PID is set but failed to test unshare: {}
AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03).
Data as JSON: /api/errors/3726de4799c93003.
Report an issue: GitHub.