{"record":{"id":"8813ae1f2b984de5","repo":"apache/pulsar","slug":"skip-messages-on-a-partitioned-topic-is-not-allowe","errorCode":null,"errorMessage":"Skip messages on a partitioned topic is not allowed","messagePattern":"Skip messages on a partitioned topic is not allowed","errorType":"http","errorClass":"RestException","httpStatus":405,"severity":"error","filePath":"pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java","lineNumber":2021,"sourceCode":"                    return null;\n                });\n    }\n\n    protected void internalSkipMessages(AsyncResponse asyncResponse, String subName, int numMessages,\n                                        boolean authoritative) {\n        validateTopicOperationAsync(topicName, TopicOperation.SKIP, subName)\n        .thenCompose(__ -> validateGlobalNamespaceOwnershipAsync(namespaceName))\n        .thenCompose(__ -> validateTopicOwnershipAsync(topicName, authoritative))\n        .thenCompose(__ -> getPartitionedTopicMetadataAsync(topicName, authoritative, false))\n        .thenCompose(partitionMetadata -> {\n             if (partitionMetadata.partitions > 0) {\n                 String msg = \"Skip messages on a partitioned topic is not allowed\";\n                 log.warn()\n                         .attr(\"msg\", msg)\n                         .attr(\"topic\", topicName)\n                         .attr(\"subscription\", subName)\n                         .log(\"\");\n                 throw new  RestException(Status.METHOD_NOT_ALLOWED, msg);\n             }\n             return getTopicReferenceAsync(topicName).thenCompose(t -> {\n                 PersistentTopic topic = (PersistentTopic) t;\n                 if (topic == null) {\n                     throw new RestException(new RestException(Status.NOT_FOUND,\n                             getTopicNotFoundErrorMessage(topicName.toString())));\n                 }\n                 if (subName.startsWith(topic.getReplicatorPrefix())) {\n                     String remoteCluster = PersistentReplicator.getRemoteCluster(subName);\n                     PersistentReplicator repl =\n                             (PersistentReplicator) topic.getPersistentReplicator(remoteCluster);\n                     if (repl == null) {\n                         return FutureUtil.failedFuture(\n                                 new RestException(Status.NOT_FOUND, \"Replicator not found\"));\n                     }\n                     return repl.skipMessages(numMessages).thenAccept(unused -> {\n                         log.info()\n                                 .attr(\"skipped\", numMessages)","sourceCodeStart":2003,"sourceCodeEnd":2039,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java#L2003-L2039","documentation":"internalSkipMessages validates the topic type after fetching partition metadata: skipping messages is only supported on a single (non-partitioned) topic partition, so the request against a partitioned topic is rejected with 405 Method Not Allowed.","triggerScenarios":"Thrown at pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java:2021 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Run skip on a specific partition (topic-partition-N)","Use reset-cursor or clear-backlog on the partitioned topic for whole-subscription operations"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}