{"record":{"id":"a5869dd687d19167","repo":"apache/rocketmq","slug":"failed-to-get-max-consume-offset","errorCode":null,"errorMessage":"Failed to get max consume offset","messagePattern":"Failed to get max consume offset","errorType":"exception","errorClass":"RemotingCommandException","httpStatus":null,"severity":"error","filePath":"broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java","lineNumber":134,"sourceCode":"            String errorInfo = String.format(\"queueId[%d] is illegal, topic:[%s] topicConfig.readQueueNums:[%d] consumer:[%s]\",\n                requestHeader.getQueueId(), requestHeader.getTopic(), topicConfig.getReadQueueNums(), channel.remoteAddress());\n            POP_LOGGER.warn(errorInfo);\n            response.setCode(ResponseCode.MESSAGE_ILLEGAL);\n            response.setRemark(errorInfo);\n            return CompletableFuture.completedFuture(response);\n        }\n\n        CompletableFuture<RemotingCommand> future = processChangeInvisibleTimeForLite(requestHeader, response, responseHeader);\n        if (future != null) {\n            return future;\n        }\n\n        long minOffset = this.brokerController.getMessageStore().getMinOffsetInQueue(requestHeader.getTopic(), requestHeader.getQueueId());\n        long maxOffset;\n        try {\n            maxOffset = this.brokerController.getMessageStore().getMaxOffsetInQueue(requestHeader.getTopic(), requestHeader.getQueueId());\n        } catch (ConsumeQueueException e) {\n            throw new RemotingCommandException(\"Failed to get max consume offset\", e);\n        }\n        if (requestHeader.getOffset() < minOffset || requestHeader.getOffset() >= maxOffset) {\n            response.setCode(ResponseCode.NO_MESSAGE);\n            return CompletableFuture.completedFuture(response);\n        }\n\n        String[] extraInfo = ExtraInfoUtil.split(requestHeader.getExtraInfo());\n        if (brokerController.getBrokerConfig().isPopConsumerKVServiceEnable()) {\n            if (ExtraInfoUtil.isOrder(extraInfo)) {\n                return this.processChangeInvisibleTimeForOrderNew(\n                    requestHeader, extraInfo, response, responseHeader);\n            }\n            try {\n                long current = System.currentTimeMillis();\n                brokerController.getPopConsumerService().changeInvisibilityDuration(\n                    ExtraInfoUtil.getPopTime(extraInfo), ExtraInfoUtil.getInvisibleTime(extraInfo), current,\n                    requestHeader.getInvisibleTime(), requestHeader.getConsumerGroup(), requestHeader.getTopic(),\n                    requestHeader.getQueueId(), requestHeader.getOffset(), requestHeader.isSuspend());","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/apache/rocketmq/blob/293f5885719fc4aa3619446a1900f58ccfcfdd29/broker/src/main/java/org/apache/rocketmq/broker/processor/ChangeInvisibleTimeProcessor.java#L116-L152","documentation":"ChangeInvisibleTimeProcessor (pop consumer ack-delay extension) validates the pop offset: it reads MessageStore.getMaxOffsetInQueue for the topic/queue and wraps any ConsumeQueueException in RemotingCommandException, failing the CHANGE_INVISIBLE_TIME request.","triggerScenarios":"Pop consumer calls ChangeInvisibleTime for a message whose consume queue cannot be read — corrupt queue files, store still loading, RocksDB consume queue failure, or topic deleted while pop requests are in flight.","commonSituations":"Long pop-invisible-time messages being extended after the topic was deleted/recreated; broker recovered with damaged consume queues; store not fully initialized at request time.","solutions":["Check broker.log for the underlying ConsumeQueueException and failing topic/queueId.","Ensure the topic still exists and its consume queues are healthy (mqAdmin topicStatus).","Retry after the broker finishes loading; if queues are corrupt, restore/rebuild them.","Avoid issuing changeInvisibleTime for messages whose topic has been deleted."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"catch (RemotingCommandException e) { if (e.getCause() instanceof ConsumeQueueException) { scheduleChangeInvisibleTimeRetryWithBackoff(); return; } throw e; }","preventionTips":["Skip changeInvisibleTime for topics being deleted.","Keep pop retry topics' consume queues healthy; alert on ConsumeQueueException in broker logs."],"tags":["rocketmq","broker","pop-consumer","consume-queue","retry","storage"],"backgroundTag":null,"analyzedSha":"293f5885719fc4aa3619446a1900f58ccfcfdd29","analyzedAt":"2026-08-14T11:50:13.822Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}