{"record":{"id":"16059759644ff486","repo":"prestodb/presto","slug":"pinot-invalid-configuration","errorCode":"PINOT_INVALID_CONFIGURATION","errorMessage":"No pinot controllers specified","messagePattern":"No pinot controllers specified","errorType":"error_code","errorClass":"PinotException","httpStatus":null,"severity":"critical","filePath":"presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java","lineNumber":654,"sourceCode":"\n    @Config(\"pinot.broker-authentication-password\")\n    @ConfigSecuritySensitive\n    public PinotConfig setBrokerAuthenticationPassword(String brokerAuthenticationPassword)\n    {\n        this.brokerAuthenticationPassword = brokerAuthenticationPassword;\n        return this;\n    }\n\n    /**\n     * Randomly select one controller from the property in pinot controller list.\n     *\n     * @return one URL string of pinot controller\n     */\n    public String getControllerUrl()\n    {\n        List<String> controllerUrls = getControllerUrls();\n        if (controllerUrls.isEmpty()) {\n            throw new PinotException(PINOT_INVALID_CONFIGURATION, Optional.empty(), \"No pinot controllers specified\");\n        }\n        return controllerUrls.get(ThreadLocalRandom.current().nextInt(controllerUrls.size()));\n    }\n\n    public String getQueryOptions()\n    {\n        return queryOptions;\n    }\n\n    @Config(\"pinot.query-options\")\n    public PinotConfig setQueryOptions(String options)\n    {\n        queryOptions = options;\n        return this;\n    }\n\n    public boolean isCaseSensitiveNameMatchingEnabled()\n    {","sourceCodeStart":636,"sourceCodeEnd":672,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConfig.java#L636-L672","documentation":"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.","triggerScenarios":"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().","commonSituations":"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.","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"],"exampleFix":"// before (pinot.properties)\npinot.table-names=mytable\n// after\npinot.controller-urls=http://pinot-controller:9000\npinot.table-names=mytable","handlingStrategy":"validation","validationCode":"// Startup check before deploying the catalog\nProperties props = loadCatalogProps(\"pinot.properties\");\nif (!props.containsKey(\"pinot.controller-urls\") || props.getProperty(\"pinot.controller-urls\").isEmpty()) {\n    throw new IllegalStateException(\"pinot.controller-urls must be set\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    connector.listTables(session);\n} catch (PinotException e) {\n    if (e.getMessage().equals(\"No pinot controllers specified\")) {\n        // fix catalog properties; this is fatal configuration, do not retry\n    }\n    throw e;\n}","preventionTips":["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"],"tags":["configuration","pinot","startup"],"backgroundTag":"missing-config-property","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}