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

  1. Set an explicit advertise address in the config (e.g. `advertise_address: 10.0.0.5`)
  2. Bind to a specific, non-wildcard listen address instead of 0.0.0.0
  3. 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)