[Bug] A malformed receipt handle is reported as INTERNAL_SERVER_ERROR, so official clients retry the ack forever
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- grpc, java
- Ambito
- backend-api-design
Direzione di ricerca
Read ReceiptHandle.decode, ResponseBuilder#buildStatus(Throwable), and the receipt handle call sites in AckMessageActivity, ChangeInvisibleDurationActivity, and ForwardMessageToDeadLetterQueue. Trace how parse errors become response statuses, then check the single and batch ack behavior. Done means malformed handles report INVALID_RECEIPT_HANDLE consistently and valid entries in a mixed batch can still be acknowledged.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Before Creating the Bug Report
- I found a bug, not just asking a question, which should be created in GitHub Discussions.
- I have searched the GitHub Issues and GitHub Discussions of this repository and believe that this is not a duplicate.
- I have confirmed that this bug belongs to the current repository, not other repositories of RocketMQ.
Runtime platform environment
OS: any (proxy module, gRPC v2 consumer path)
RocketMQ version
branch: develop
Git commit id: 9ea2ccdc2b41445aee5e177e14e501d606f5a1ed (2026-10-08)
JDK Version
Compiler: Temurin 1.8.0_504 (target 1.8, same as CI)
Description
A receipt handle that cannot be parsed is reported as INTERNAL_SERVER_ERROR, not as INVALID_RECEIPT_HANDLE.
ReceiptHandle.decode throws IllegalArgumentException for a handle that does not parse (and NumberFormatException, also
an IllegalArgumentException, for non-numeric fields). In the gRPC v2 consumer path that exception reaches
ResponseBuilder#buildStatus(Throwable), which only maps ProxyException / GrpcProxyException, topic-not-found,
MQBrokerException, MQClientException, RemotingTimeoutException and the auth exceptions:
log.error("internal server error", t);
return buildStatus(Code.INTERNAL_SERVER_ERROR, ExceptionUtils.getErrorDetailMessage(t));
For an expired handle the code already reports the right thing — AbstractProcessor#validateReceiptHandle throws
ProxyException(ProxyExceptionCode.INVALID_RECEIPT_HANDLE) and the mapping table turns that into
Code.INVALID_RECEIPT_HANDLE — but a malformed handle takes the parse-error path instead. Concretely:
AckMessageActivity#processAckMessagecatches the parse failure and completes the entry with
INTERNAL_SERVER_ERROR;AckMessageActivity#ackMessageInBatchdecodes every entry before calling the processor, so one unparseable handle fails
the whole batch request;ChangeInvisibleDurationActivityandForwardMessageToDeadLetterQueuedecode the same way.
This matters to the official clients: rocketmq-clients ProcessQueueImpl#ackMessage gives up on a message only for
INVALID_RECEIPT_HANDLE ("forgive to retry") and otherwise calls ackMessageLater(...), retrying the ack every second
indefinitely. So a malformed handle produces an endless ack retry loop plus internal server error logs and server-error
alerts instead of a single, actionable client error — and in the batch case it also fails the valid entries of the same
request.
service.proto documents the expectation for AckMessage: "If the given receipt_handle is illegal or out of date, returns
INVALID_ARGUMENT", and definition.proto defines the dedicated INVALID_RECEIPT_HANDLE = 40013.
Steps to Reproduce
- Run a proxy and send
AckMessagewithreceipt_handle = "not-a-receipt-handle"(one entry, or mixed with a valid entry
in a batch). - The entry/request status is
INTERNAL_SERVER_ERRORinstead ofINVALID_RECEIPT_HANDLE; withenableBatchAck=truethe
whole request fails and the valid entries are not acknowledged either.
Expected behavior
An unparseable receipt handle is reported as INVALID_RECEIPT_HANDLE, exactly like an expired one, so clients drop the
message instead of retrying forever.
Actual behavior
INTERNAL_SERVER_ERROR (and, in the batch path, a request-scoped failure that hides the graded reason).
Additional context
Fix: decode receipt handles through a helper that turns the parse failure into
ProxyException(ProxyExceptionCode.INVALID_RECEIPT_HANDLE, …), and use it at the ack (single + batch),
change-invisible-time and forward-to-DLQ call sites.
- Lingua principale
- Java
- Stelle
- 22.7k
- Fork
- 12k
- Merge medio
- 4g 20h
- PR unite (30g)
- 11
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/rocketmq
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configurationForse già presa @amalsaidov l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
CompressionType.of fails under the Turkish localeForse già presa @sharanggupta l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
[rocketmq-client-python] TransactionMQProducer allocates an unused producer during initializationAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug] notifyMasterOnline aborts the long-polling wake-up with a NullPointerException when an arrival drains a bucket firstForse già presa @iloveeyjafjalla l’ha presa 29 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/rocketmq#11441 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[Enhancement] FilterFactory duplicate-registration and unregister semantics lack testsForse già presa @chennaji9 l’ha presa 34 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
apache/rocketmq#11340 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/rocketmq
Issue simili
-
bug emitter:client:csharp
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
microsoft/typespec#12572 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
I maintainer di solito rispondono entro 1 giorno
-
needs-area-label
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 2 giorni
-
area/ai area/backend component/zeebe kind/task
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
spAnser/reacharound#38 ·