[Bug] The static-topic commands ignore -mf/--mapFile and silently recompute the mapping instead

オープン
#11,381 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

@iloveeyjafjalla がすでに取り組んでいます。

2026年10月12日 から。

  • #11382 @iloveeyjafjalla による — オープン
  • #11411 @iloveeyjafjalla による — オープン

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
35/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
停滞
技術スタック
java
領域
cli

調査の方向性

Start with UpdateStaticTopicSubCommand and RemappingStaticTopicSubCommand, focusing on buildCommandlineOptions, execute, and executeFromFile; compare the registered map-file option with the key read by each command. Trace how required options are checked for file and recompute modes, then inspect the force argument passed to updateTopicConfigMappingAll. Done means both commands apply the supplied mapping, file mode accepts its documented options, and updateStaticTopic honors -fr; linked PR #11382 is already open.

索引モデルが issue の本文から書いたものです。

説明

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 (mqadmin, tools module)

RocketMQ version

branch: develop
Git commit id: 9ea2ccdc2b41445aee5e177e14e501d606f5a1ed (verified against this base; the files are unchanged on develop@b76420599)

JDK Version

Compiler: Temurin 1.8.0_504 (target 1.8, same as CI)

Describe the Bug

The map-file mode of the two static-topic commands is unreachable, and the documented invocation silently does something else.

Both commands register the option under the key mf and then read a different key:

// UpdateStaticTopicSubCommand / RemappingStaticTopicSubCommand, buildCommandlineOptions
opt = new Option("mf", "mapFile", true, "The mapping data file name");
...
// execute(...)
if (commandLine.hasOption("f")) {              // "f" is registered nowhere
    executeFromFile(commandLine, options, rpcHook);
    return;
}
...
// executeFromFile(...)
String mapFileName = commandLine.getOptionValue('f').trim();   // null -> NPE if ever reached

So mqadmin updateStaticTopic -t T -b brokerA -qn 8 -mf plan.json parses (the help text advertises
-mf,--mapFile <arg>), never reads plan.json, and takes the recompute path instead — the command rewrites the static
topic mapping computed from the cluster's current state rather than applying the mapping the operator supplied. The only
way to reach the file mode is to pass -f, which the parser rejects with Unrecognized option: -f.

In addition, the file mode cannot even be invoked the way it is meant to be, because the parser demands options that mode
does not use:

  • OptionGroup("-b", "-c") is setRequired(true);
  • UpdateStaticTopicSubCommand also marks -qn/--totalQueueNum required;

so mqadmin updateStaticTopic -t T -mf plan.json (the target brokers and the queue count come from the file) fails to
parse; ServerUtil.parseCmdLine then prints the help and calls System.exit(1). Both recompute paths already validate
these options themselves (if (!hasOption("b") && !hasOption("c") || !hasOption("qn")) { printCommandLineHelp(...); return; }).

Finally, once the file mode is reachable, UpdateStaticTopicSubCommand ignores -fr/--forceReplace:
force is parsed and then MQAdminUtils.updateTopicConfigMappingAll(..., false) is called with a literal.

Steps to Reproduce
  1. mqadmin updateStaticTopic -t T -b brokerA -qn 8 -mf plan.json with a plan file whose mapping differs from the current
    cluster state → the file is not read; a recomputed mapping is written instead.
  2. mqadmin updateStaticTopic -t T -mf plan.json → Missing required option, help, exit code 1.
  3. mqadmin remappingStaticTopic -t T -mf plan.json → same as 2 (-b|-c required).
Expected behavior

The documented -mf/--mapFile invocation reads the mapping from the named file and applies it (honoring -fr), and the
from-file mode does not require the target brokers or the queue count, which the file carries.

Actual behavior

The map file is ignored and the mapping is recomputed; without -b|-c (and -qn) the invocation does not even parse; -fr
is discarded in updateStaticTopic.

Additional context

Fix: read the option key the commands register, stop requiring -b|-c|-qn in the from-file mode (the recompute mode still
validates them), and pass the parsed force through.

主要言語
Java
スター
22.7k
フォーク
12k
平均マージ
3日 18時間
マージ済み PR(30日)
17

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

apache/rocketmq のほかの issue

apache/rocketmq の issue をすべて見る

似ている issue

Java の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。