{"record":{"id":"a88396a2a7f8b2d2","repo":"apache/seatunnel","slug":"commonerrorcodedeprecated-unsupported-operation-a88396","errorCode":"CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION","errorMessage":"No consumer metadata found for table path '%s'","messagePattern":"No consumer metadata found for table path '(.+?)'","errorType":"error_code","errorClass":"PulsarConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-pulsar/src/main/java/org/apache/seatunnel/connectors/seatunnel/pulsar/source/enumerator/PulsarSplitEnumerator.java","lineNumber":187,"sourceCode":"            LOG.debug(\"Partition discovery is disabled.\");\n            noMoreNewPartitionSplits = true;\n        }\n        if (newPartitions.isEmpty()) {\n            return;\n        }\n        List<PulsarPartitionSplit> newSplits =\n                newPartitions.stream()\n                        .map(this::createPulsarPartitionSplit)\n                        .collect(Collectors.toList());\n        addPartitionSplitChangeToPendingAssignments(newSplits);\n        assignPendingPartitionSplits(context.registeredReaders());\n    }\n\n    private PulsarPartitionSplit createPulsarPartitionSplit(TopicPartition partition) {\n        TablePath tablePath = resolveTablePath(partition);\n        PulsarConsumerMetadata consumerMetadata = consumerMetadataMap.get(tablePath);\n        if (consumerMetadata == null) {\n            throw new PulsarConnectorException(\n                    CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,\n                    String.format(\"No consumer metadata found for table path '%s'\", tablePath));\n        }\n        StopCursor partitionStopCursor = consumerMetadata.getStopCursor().copy();\n        PulsarPartitionSplit split =\n                new PulsarPartitionSplit(partition, partitionStopCursor, null, tablePath);\n        if (partitionStopCursor instanceof LatestMessageStopCursor) {\n            ((LatestMessageStopCursor) partitionStopCursor).prepare(pulsarAdmin, partition);\n        }\n        if (consumerMetadata.getStartCursor() instanceof SubscriptionStartCursor) {\n            ((SubscriptionStartCursor) consumerMetadata.getStartCursor())\n                    .ensureSubscription(\n                            consumerMetadata.getConsumerConfig().getSubscriptionName(),\n                            partition,\n                            pulsarAdmin);\n        }\n        return split;\n    }","sourceCodeStart":169,"sourceCodeEnd":205,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-pulsar/src/main/java/org/apache/seatunnel/connectors/seatunnel/pulsar/source/enumerator/PulsarSplitEnumerator.java#L169-L205","documentation":"PulsarSplitEnumerator.createPulsarPartitionSplit looks up the PulsarConsumerMetadata for the table that owns a TopicPartition when materializing splits. If no metadata is registered for the resolved TablePath, it throws UNSUPPORTED_OPERATION with this message. It indicates internal state inconsistency: the enumerator is assigning splits for a topic whose table was never initialized.","triggerScenarios":"A TopicPartition arrives (e.g. from topic discovery or addSplitsBack) whose resolved TablePath is absent from consumerMetadataMap — e.g. topics discovered by pattern that were not registered during startup, or state deserialized from a checkpoint that predates a table's metadata.","commonSituations":"Topic-pattern discovery picking up new topics at runtime after metadata was built; restoring a job from an old checkpoint after changing the config's topic list; multi-table configs where a discovered topic maps to no configured table.","solutions":["Ensure every topic matched by topic-pattern is covered by a configured table entry with consumer metadata.","Restrict topic-pattern so newly created topics are not picked up by the enumerator (or recreate the job so metadata includes them).","Discard stale checkpoints/savepoints taken with a different topic/table configuration and restart the job fresh.","Report as a bug if it occurs with a stable single-table config — this path normally indicates an internal invariant violation."],"exampleFix":"// before\ntopic-pattern = \"persistent://public/default/.+\"\n// after (narrow the pattern so only configured topics match)\ntopic-pattern = \"persistent://public/default/my-topic.*\"","handlingStrategy":"try-catch","validationCode":"if (cfg.getOptional(\"topic-pattern\").isPresent())\n    verifyPatternOnlyMatchesConfiguredTables(cfg.getString(\"topic-pattern\"), cfg.getOptional(\"topic\"));","typeGuard":null,"tryCatchPattern":"try {\n    enumerator.assignSplits();\n} catch (PulsarConnectorException e) {\n    if (String.valueOf(e.getMessage()).contains(\"No consumer metadata found\")) {\n        // rescale/restart with a config covering the discovered topic, or drop stale checkpoints\n    }\n    throw e;\n}","preventionTips":["Keep topic-pattern narrow so discovered topics always map to configured tables.","Avoid restoring from checkpoints taken with a different topic/table configuration.","Monitor pattern-discovered topics and add table entries before they are read."],"tags":["pulsar","split-enumerator","internal-state","metadata"],"backgroundTag":"resource-not-found","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}