{"record":{"id":"e1b8de94a8d55b89","repo":"apache/pulsar","slug":"either-timestamp-time-or-messageid-messagei","errorCode":null,"errorMessage":"Either Timestamp (--time) or messageId (--messageId) has to be provided to reset cursor","messagePattern":"Either Timestamp \\(--time\\) or messageId \\(--messageId\\) has to be provided to reset cursor","errorType":"exception","errorClass":"PulsarAdminException","httpStatus":null,"severity":"warning","filePath":"pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdTopics.java","lineNumber":1061,"sourceCode":"                MessageId messageId;\n                if (\"earliest\".equals(resetMessageIdStr)) {\n                    messageId = MessageId.earliest;\n                } else if (\"latest\".equals(resetMessageIdStr)) {\n                    messageId = MessageId.latest;\n                } else {\n                    messageId = validateMessageIdString(resetMessageIdStr);\n                }\n                if (excludeResetPosition) {\n                    getTopics().resetCursor(persistentTopic, subName, messageId, true);\n                } else {\n                    getTopics().resetCursor(persistentTopic, subName, messageId);\n                }\n            } else if (Objects.nonNull(resetTimeInMillis)) {\n                // now - go back time\n                long timestamp = System.currentTimeMillis() - resetTimeInMillis;\n                getTopics().resetCursor(persistentTopic, subName, timestamp);\n            } else {\n                throw new PulsarAdminException(\n                        \"Either Timestamp (--time) or messageId (--messageId) has to be provided to reset cursor\");\n            }\n        }\n    }\n\n    @Command(description = \"Terminate a topic and don't allow any more messages to be published\")\n    private class Terminate extends CliCommand {\n        @Parameters(description = \"persistent://tenant/namespace/topic\", arity = \"1\")\n        private String topicName;\n\n        @Override\n        void run() throws PulsarAdminException {\n            String persistentTopic = validatePersistentTopic(topicName);\n\n            try {\n                MessageId lastMessageId = getTopics().terminateTopicAsync(persistentTopic).get();\n                System.out.println(\"Topic successfully terminated at \" + lastMessageId);\n            } catch (InterruptedException | ExecutionException e) {","sourceCodeStart":1043,"sourceCodeEnd":1079,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdTopics.java#L1043-L1079","documentation":"The reset-cursor command needs a target: either an absolute timestamp (--time), a relative time (--currentTime/-time offset), or a messageId (--messageId). If none is provided, it throws PulsarAdminException since the cursor cannot be reset without a reset point.","triggerScenarios":"Running `pulsar-admin topics reset-cursor <topic> -s <sub>` with no --time, no relative time, and no --messageId.","commonSituations":"Scripts where the timestamp variable is empty; users expecting a default of 'now'; mixing up reset-cursor options in automation.","solutions":["Add --messageId <ledgerId:entryId> to reset to a specific position","Or add --time <timestamp> (epoch millis) for an absolute reset point","Or supply a relative time so resetTimeInMillis is non-null (e.g. reset N ms back)"],"exampleFix":"// before\npulsar-admin topics reset-cursor my-topic -s sub1\n// after\npulsar-admin topics reset-cursor my-topic -s sub1 --messageId 1024:0","handlingStrategy":"validation","validationCode":"if (time == null && messageId == null && relativeTimeMs == null) {\n    throw new IllegalArgumentException(\"Provide --time, --messageId, or a relative time to reset cursor\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    admin.topics().resetCursor(topic, sub, messageIdOrTimestamp);\n} catch (org.apache.pulsar.client.admin.PulsarAdminException e) {\n    log.error(\"reset-cursor requires --time or --messageId\", e);\n}","preventionTips":["Always pass --messageId or --time (or relative time) to reset-cursor","Verify timestamp variables expand to real values in scripts","Prefer --messageId for deterministic reset points"],"tags":["cli","parameter-validation","missing-argument","cursor-reset"],"backgroundTag":"missing-required-argument","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}