{"record":{"id":"8951870583d9ffbd","repo":"prestodb/presto","slug":"pinot-unclassified-error","errorCode":"PINOT_UNCLASSIFIED_ERROR","errorMessage":"Cannot fetch from cache %s","messagePattern":"Cannot fetch from cache (.+?)","errorType":"error_code","errorClass":"PinotException","httpStatus":null,"severity":"error","filePath":"presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConnection.java","lineNumber":87,"sourceCode":"                                        nullHandlingEnabled,\n                                        pinotConfig.isCaseSensitiveNameMatchingEnabled());\n                            }\n                        }, executor));\n\n        executor.execute(() -> this.allTablesCache.refresh(ALL_TABLES_CACHE_KEY));\n    }\n\n    private static <K, V> V getFromCache(LoadingCache<K, V> cache, K key)\n    {\n        V value = cache.getIfPresent(key);\n        if (value != null) {\n            return value;\n        }\n        try {\n            return cache.get(key);\n        }\n        catch (ExecutionException e) {\n            throw new PinotException(PINOT_UNCLASSIFIED_ERROR, Optional.empty(), \"Cannot fetch from cache \" + key, e.getCause());\n        }\n    }\n\n    public List<String> getTableNames()\n    {\n        return getFromCache(allTablesCache, ALL_TABLES_CACHE_KEY);\n    }\n\n    public PinotTable getTable(String tableName)\n    {\n        List<PinotColumn> columns = getPinotColumnsForTable(tableName);\n        return new PinotTable(tableName, columns);\n    }\n\n    private List<PinotColumn> getPinotColumnsForTable(String tableName)\n    {\n        return getFromCache(pinotTableColumnCache, tableName);\n    }","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-pinot-toolkit/src/main/java/com/facebook/presto/pinot/PinotConnection.java#L69-L105","documentation":"PinotConnection.getFromCache wraps any ExecutionException from a Guava loading cache (all-tables or per-table columns) into PINOT_UNCLASSIFIED_ERROR. The real failure is whatever caused the underlying cache load to fail, attached as the cause.","triggerScenarios":"getTableNames() or getPinotColumnsForTable() triggers a cache load that throws a non-PinotException — usually a controller HTTP error or JSON parse failure while listing tables or fetching schema.","commonSituations":"Controller temporarily unreachable while metadata is being read; controller returns malformed schema JSON after an upgrade; concurrent cache loads hitting controller rate limits.","solutions":["Look at the cause (e.getCause()) logged with this exception to find the real failure","Verify Pinot controller connectivity with curl and restore connectivity if down","Retry after the controller recovers; the cache load is not permanently poisoned","Pin/validate controller and connector versions if the cause is a JSON parse error"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Preflight controller check before metadata reads\ncurl -sf http://<controller>:9000/tables || echo 'controller failing'","typeGuard":null,"tryCatchPattern":"try {\n    List<String> tables = connection.getTableNames();\n} catch (PinotException e) {\n    if (e.getMessage().startsWith(\"Cannot fetch from cache\")) {\n        // inspect e.getCause(); usually controller/network - retry after recovery\n    }\n    throw e;\n}","preventionTips":["Always log e.getCause() for PINOT_UNCLASSIFIED_ERROR — it carries the real failure","Monitor controller availability from Presto nodes","Align controller/connector versions to avoid schema JSON parse breaks","Add modest cache refresh throttling to avoid controller hammering"],"tags":["pinot","cache","controller"],"backgroundTag":"cache-load-failure","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"}