quickwit-oss/quickwit · error · anyhow::Error
listen address ` ` is unspecified and advertise address is…
Error message
listen address `{listen_ip}` is unspecified and advertise address is not set What it means
While computing the default advertise host, the configured listen address is unspecified (0.0.0.0 or ::), meaning it binds to all interfaces and carries no routable identity. Quickwit tried to sniff a private IP via `find_private_ip` to use as advertise address and failed (no suitable interface found), so no address can be advertised to cluster peers.
Solutions
- Set an explicit advertise address in the config (e.g. `advertise_address: 10.0.0.5`)
- Bind to a specific, non-wildcard listen address instead of 0.0.0.0
- Ensure the node has a network interface with a private IP that can be sniffed
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at quickwit/quickwit-config/src/node_config/serialize.rs:122 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08).
Data as JSON: /api/errors/db048ad2759611a8.
Report an issue: GitHub.
Appendix: source
Thrown at quickwit/quickwit-config/src/node_config/serialize.rs:122
ConfigValue::with_default(Host::default().to_string())
}
fn default_rest_listen_port() -> u16 {
7280
}
fn default_data_dir_uri() -> ConfigValue<Uri, QW_DATA_DIR> {
ConfigValue::with_default(Uri::from_str(DEFAULT_DATA_DIR_PATH).unwrap())
}
/// Returns the default advertise host.
fn default_advertise_host(listen_ip: &IpAddr) -> anyhow::Result<Host> {
if listen_ip.is_unspecified() {
if let Some((interface_name, private_ip)) = find_private_ip() {
info!(advertise_address=%private_ip, interface_name=%interface_name, "using sniffed advertise address `{private_ip}`");
return Ok(Host::from(private_ip));
}
bail!("listen address `{listen_ip}` is unspecified and advertise address is not set");
}
info!(advertise_address=%listen_ip, "using listen address `{listen_ip}` as advertise address");
Ok(Host::from(*listen_ip))
}
// Surprisingly, the default metastore and the index root uri are the same (if you exclude the
// polling_interval parameter). Indeed, this is a convenient setting for testing with a file backed
// metastore and indexes splits stored locally too.
// For a given index `index-id`, it means that we have the metastore file
// in `./qwdata/indexes/{index-id}/metastore.json` and splits in
// dir `./qwdata/indexes/{index-id}/splits`.
fn default_metastore_uri(data_dir_uri: &Uri) -> Uri {
data_dir_uri.join("indexes#polling_interval=30s").expect("Failed to create default metastore URI. This should never happen! Please, report on https://github.com/quickwit-oss/quickwit/issues.")
}
fn default_metastore_read_replica_uri() -> ConfigValue<Uri, QW_METASTORE_READ_REPLICA_URI> {
ConfigValue::none()
}View on GitHub (pinned to a39730c5cd)