RockteMQ-AI commented on issue #10668: URL: https://github.com/apache/rocketmq/issues/10668#issuecomment-5102760569
**Issue Evaluation** Category: `type/bug` | Status: **Confirmed** The reported issue has been verified against the current codebase (develop branch). **Root Cause:** `DefaultMessageStore.truncateDirtyFiles()` truncates CommitLog and consume queues but never cleans up `TimerLog` or `TimerWheel`. After truncation, stale TimerLog entries still reference offsets that may be overwritten by unrelated messages during re-replication. **Verified code path:** 1. `truncateDirtyFiles()` (DefaultMessageStore.java:785-818) only truncates consume queues and CommitLog — no Timer cleanup 2. `StoreUtil.getMessage()` (StoreUtil.java:82-98) blindly decodes whatever bytes are at the stale offset 3. `convertMessage()` (TimerMessageStore.java:1266) calls `Integer.parseInt(null)` when `PROPERTY_REAL_QUEUE_ID` is missing → `NumberFormatException` 4. `TimerDequeuePutMessageService.run()` (TimerMessageStore.java:1622-1681) catches the exception, and with `timerSkipUnknownError=false` (default), retries the same `TimerRequest` indefinitely via `holdMomentForUnknownError()` (50ms sleep + loop) **Impact:** Timer dequeue progress stalls completely. All subsequent scheduled messages and POP revive retry delivery remain blocked. **Severity:** High — single stale reference can permanently block the Timer slot. An automated fix proposal will be generated. Reply `/approve` to proceed with PR generation. --- *Automated evaluation by github-manager-bot* -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
