databendlabs/databend · error

grpc_api_address MUST not be empty!

Error message

grpc_api_address MUST not be empty!

What it means

The `metaverifier` binary validates meta-service snapshots but first requires a gRPC address to talk to the meta service. If `config.grpc_api_address` is empty it prints this message and bails with the same error before doing any work.

Solutions

  1. Set grpc_api_address in the metaverifier config (e.g. "127.0.0.1:9191") matching the target databend-meta node's advertised gRPC address.
  2. Pass the address on the command line with --grpc-api-address if supported by the binary's config loader.
  3. Verify with `databend-meta --config ... ` or the config file that the meta node is listening on the address you configured.

Example fix

// before (config.toml)
# grpc_api_address = ""
// after (config.toml)
grpc_api_address = "127.0.0.1:9191"
Defensive patterns

Strategy: validation

Validate before calling

// shell pre-flight before running metaverifier
cfg=metaverifier.toml
if ! grep -qE '^grpc_api_address\s*=\s*"[^\"]+"' "$cfg"; then
  echo "grpc_api_address missing or empty in $cfg" >&2; exit 1
fi

Type guard

fn grpc_address_valid(addr: &str) -> bool {
    !addr.is_empty() && addr.rsplit_once(':').map(|(_, p)| p.parse::<u16>().is_ok()).unwrap_or(false)
}

Try / catch

match run_metaverifier(&cfg).await {
    Err(e) if e.to_string().contains("grpc_api_address MUST not be empty") => {
        eprintln!("set grpc_api_address in the config, e.g. 127.0.0.1:9191");
    }
    Err(e) => return Err(e),
    Ok(v) => v,
}

Prevention

When it happens

Trigger: Running the databend-metaverifier binary without setting `grpc_api_address` in its config (or via the corresponding CLI/env override), so the loaded Config has an empty address string.

Common situations: Forgetting to pass --grpc-api-address or omitting the field from the metaverifier config TOML; copying a config template where the field is left blank; pointing the verifier at a meta cluster but not filling in the address section.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of databendlabs/databend@288d84d76e (2026-09-11). Data as JSON: /api/errors/90939b022bd6113c. Report an issue: GitHub.

Appendix: source

Thrown at src/meta/binaries/metaverifier/main.rs:104

            format: LogFormat::Text,
            limit: 48,
            max_size: 4294967296,
        },
        stderr: StderrConfig {
            on: true,
            level: "WARN".to_string(),
            format: LogFormat::Text,
        },
        ..Default::default()
    };

    let guards = init_logging("databend-metaverifier", &log_config, BTreeMap::new());
    Box::new(guards).leak();

    println!("config: {:?}", config);
    if config.grpc_api_address.is_empty() {
        println!("grpc_api_address MUST not be empty!");
        bail!("grpc_api_address MUST not be empty!");
    }

    if config.remove_percent > 100 {
        println!("remove_percent MUST in [0, 100)!");
        bail!("remove_percent MUST in [0, 100)!");
    }

    let start = Instant::now();
    let mut client_num = 0;
    let (tx, rx) = mpsc::channel::<()>();
    let mut handles = Vec::new();

    // write a file as start
    fs::write(VERIFIER_RESULT_FILE, "START")?;

    while client_num < config.client {
        client_num += 1;
        let prefix = config.prefix;

View on GitHub (pinned to 288d84d76e)