prestodb/presto · critical · PinotException

PINOT_INVALID_CONFIGURATION

PINOT_INVALID_CONFIGURATION

Error message

No pinot controllers specified

What it means

PinotConfig.getControllerUrl throws PINOT_INVALID_CONFIGURATION when no Pinot controller URLs are configured. Without a controller the connector cannot discover tables, brokers, or instance configs, so startup is refused.

Source

Thrown at presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java:654

    @Config("pinot.broker-authentication-password")
    @ConfigSecuritySensitive
    public PinotConfig setBrokerAuthenticationPassword(String brokerAuthenticationPassword)
    {
        this.brokerAuthenticationPassword = brokerAuthenticationPassword;
        return this;
    }

    /**
     * Randomly select one controller from the property in pinot controller list.
     *
     * @return one URL string of pinot controller
     */
    public String getControllerUrl()
    {
        List<String> controllerUrls = getControllerUrls();
        if (controllerUrls.isEmpty()) {
            throw new PinotException(PINOT_INVALID_CONFIGURATION, Optional.empty(), "No pinot controllers specified");
        }
        return controllerUrls.get(ThreadLocalRandom.current().nextInt(controllerUrls.size()));
    }

    public String getQueryOptions()
    {
        return queryOptions;
    }

    @Config("pinot.query-options")
    public PinotConfig setQueryOptions(String options)
    {
        queryOptions = options;
        return this;
    }

    public boolean isCaseSensitiveNameMatchingEnabled()
    {

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Set pinot.controller-urls=http://<controller-host>:9000 in the catalog properties file
  2. Check for typos in the property key and confirm the file is on the coordinator's catalog directory
  3. Verify the templated config actually rendered non-empty values (CI/CD env vars)
  4. Restart Presto to reload the catalog after fixing the properties

Example fix

// before (pinot.properties)
pinot.table-names=mytable
// after
pinot.controller-urls=http://pinot-controller:9000
pinot.table-names=mytable
Defensive patterns

Strategy: validation

Validate before calling

// Startup check before deploying the catalog
Properties props = loadCatalogProps("pinot.properties");
if (!props.containsKey("pinot.controller-urls") || props.getProperty("pinot.controller-urls").isEmpty()) {
    throw new IllegalStateException("pinot.controller-urls must be set");
}

Try / catch

try {
    connector.listTables(session);
} catch (PinotException e) {
    if (e.getMessage().equals("No pinot controllers specified")) {
        // fix catalog properties; this is fatal configuration, do not retry
    }
    throw e;
}

Prevention

When it happens

Trigger: Any connector config load where pinot.controller-urls (or legacy controller-url property) is absent or an empty list, followed by any call to getControllerUrl().

Common situations: Forgot to set pinot.controller-urls in the catalog properties file; property name typo so it's never read; property file not deployed to the coordinator; empty value after config templating failed.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/16059759644ff486. Report an issue: GitHub.