iloveeyjafjalla opened a new issue, #11381:
URL: https://github.com/apache/rocketmq/issues/11381

   ### Before Creating the Bug Report
   
   - [x] I found a bug, not just asking a question, which should be created in 
[GitHub Discussions](https://github.com/apache/rocketmq/discussions).
   - [x] I have searched the [GitHub 
Issues](https://github.com/apache/rocketmq/issues) and [GitHub 
Discussions](https://github.com/apache/rocketmq/discussions) of this repository 
and believe that this is not a duplicate.
   - [x] 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:
   
   ```java
   // 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.
   


-- 
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]

Reply via email to