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
- Set pinot.controller-urls=http://<controller-host>:9000 in the catalog properties file
- Check for typos in the property key and confirm the file is on the coordinator's catalog directory
- Verify the templated config actually rendered non-empty values (CI/CD env vars)
- 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
- Always set pinot.controller-urls in the catalog properties file
- Add config linting to CI to verify required connector properties exist
- Double-check property key spelling and deployment to the coordinator's catalog dir
- Test catalog startup (listTables) after every configuration change
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
- JDBC driver class not found: {config.getJdbcDriverName()}
- Unknown file system type:
- EMR File System class not found:
- Unable to query ranger service
- Could not create hudi connector for catalog
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/16059759644ff486.
Report an issue: GitHub.