{"record":{"id":"53af8368e2c1700e","repo":"apache/seatunnel","slug":"table-s-s-not-found-in-table-list-of-job-configu","errorCode":null,"errorMessage":"Table %s.%s not found in table list of job configuration.","messagePattern":"Table (.+?)\\.(.+?) not found in table list of job configuration\\.","errorType":"exception","errorClass":"ClickhouseConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceReader.java","lineNumber":80,"sourceCode":"\n    @Override\n    public void close() throws IOException {\n        if (client != null) {\n            client.close();\n        }\n    }\n\n    @Override\n    public void pollNext(Collector<SeaTunnelRow> output) throws Exception {\n        synchronized (output.getCheckpointLock()) {\n            ClickhouseSourceSplit split = splitQueue.poll();\n            if (split != null) {\n                ClickhouseValueReader clickhouseValueReader = null;\n                try {\n                    ClickhouseSourceTable clickhouseSourceTable =\n                            tables.get(split.getConfigTablePath());\n                    if (clickhouseSourceTable == null) {\n                        throw new ClickhouseConnectorException(\n                                ClickhouseConnectorErrorCode.TABLE_NOT_FOUND_ERROR,\n                                String.format(\n                                        \"Table %s.%s not found in table list of job configuration.\",\n                                        split.getConfigTablePath().getDatabaseName(),\n                                        split.getConfigTablePath().getTableName()));\n                    }\n\n                    CatalogTable catalogTable = clickhouseSourceTable.getCatalogTable();\n\n                    clickhouseValueReader =\n                            new ClickhouseValueReader(\n                                    split,\n                                    catalogTable.getSeaTunnelRowType(),\n                                    clickhouseSourceTable);\n                    while (clickhouseValueReader.hasNext()) {\n                        List<SeaTunnelRow> next = clickhouseValueReader.next();\n                        next.forEach(output::collect);\n                    }","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-clickhouse/src/main/java/org/apache/seatunnel/connectors/seatunnel/clickhouse/source/ClickhouseSourceReader.java#L62-L98","documentation":"ClickhouseSourceReader.pollNext() looks up the ClickhouseSourceTable for a split's configTablePath in its local tables map and throws TABLE_NOT_FOUND_ERROR when absent. The reader received a split for a table that was not part of its initialized table list, meaning reader state and split enumeration are inconsistent.","triggerScenarios":"A SourceSplit arrives whose configTablePath is not a key in the reader's `tables` map — typically after a job config change with restored/compatible checkpoint state, or a split enumerated for a table removed from the new config.","commonSituations":"Restarting/resuming a job from a checkpoint/savepoint after the table list in the config was edited, running with an incompatible connector version whose split serialization changed, or master/reader table-map initialization mismatch.","solutions":["Restart the job from scratch (no savepoint/checkpoint) so splits are re-enumerated from the current config","Ensure the table list in the job config still contains the table named in the error","If resuming after a config change is intended, change tablePath/config carefully or use a new job name","Verify all SeaTunnel nodes run the same connector version"],"exampleFix":"// before: resuming modified job from old savepoint\nsh bin/seatunnel.sh --config job.conf -s old.savepoint\n// after: start fresh so splits match current config\nsh bin/seatunnel.sh --config job.conf -e local","handlingStrategy":"fallback","validationCode":"// before resuming from a savepoint, confirm all configured tables are still present in the new config\nList<String> configured = config.getTablePaths();\nassert configured.contains(split.getConfigTablePath()) : \"split table missing from new config; start job fresh\";","typeGuard":null,"tryCatchPattern":"try {\n    reader.pollNext(...);\n} catch (ClickhouseConnectorException e) {\n    if (e.getErrorCode() == ClickhouseConnectorErrorCode.TABLE_NOT_FOUND_ERROR) {\n        // drop stale savepoint/checkpoint and restart the job so splits match the current config\n        log.error(\"Stale split for removed table; restart job without savepoint\", e);\n    }\n    throw e;\n}","preventionTips":["Never resume from savepoints/checkpoints after changing the table list in the config","Keep the same connector version across all nodes to avoid split-state incompatibility","When editing table config, start the job fresh or with a new job name","Log the reader's table map contents at startup to catch init mismatches early"],"tags":["table-not-found","state-mismatch","checkpoint","clickhouse","reader"],"backgroundTag":"record-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}