apache/hadoop · error · IllegalArgumentException

"Invalid argument: " + cmd

Error message

"Invalid argument: " + cmd

What it means

The dfsrouteradmin -safemode subcommand accepts exactly three verbs: enter, leave, get (see the usage string '[-safemode enter | leave | get]'). Any other token reaches the else branch and throws IllegalArgumentException('Invalid argument: ' + cmd). Note there is no 'wait' here, unlike hdfs dfsadmin -safemode.

Source

Thrown at hadoop-hdfs-project/hadoop-hdfs-rbf/src/main/java/org/apache/hadoop/hdfs/tools/federation/RouterAdmin.java:1215

  /**
   * Manager the safe mode state.
   * @param cmd Input command, enter or leave safe mode.
   * @throws IOException
   */
  private void manageSafeMode(String cmd) throws IOException {
    if (cmd.equals("enter")) {
      if (enterSafeMode()) {
        System.out.println("Successfully enter safe mode.");
      }
    } else if (cmd.equals("leave")) {
      if (leaveSafeMode()) {
        System.out.println("Successfully leave safe mode.");
      }
    } else if (cmd.equals("get")) {
      boolean result = getSafeMode();
      System.out.println("Safe Mode: " + result);
    } else {
      throw new IllegalArgumentException("Invalid argument: " + cmd);
    }
  }

  /**
   * Request the Router entering safemode state.
   * @return Return true if entering safemode successfully.
   * @throws IOException
   */
  private boolean enterSafeMode() throws IOException {
    RouterStateManager stateManager = client.getRouterStateManager();
    EnterSafeModeResponse response = stateManager.enterSafeMode(
        EnterSafeModeRequest.newInstance());
    return response.getStatus();
  }

  /**
   * Request the Router leaving safemode state.
   * @return Return true if leaving safemode successfully.

View on GitHub (pinned to 2add963021)

Solutions

  1. Use one of the three verbs: hdfs dfsrouteradmin -safemode enter | leave | get
  2. Check the usage: hdfs dfsrouteradmin -help safemode
  3. Validate the verb in wrappers: case "$verb" in enter|leave|get) ;; *) exit 2;; esac

Example fix

# before
hdfs dfsrouteradmin -safemode on
# after
hdfs dfsrouteradmin -safemode enter
Defensive patterns

Strategy: validation

Validate before calling

case "$VERB" in enter|leave|get) ;; *) echo "-safemode accepts enter|leave|get only" >&2; exit 2;; esac
hdfs dfsrouteradmin -safemode "$VERB"

Prevention

When it happens

Trigger: hdfs dfsrouteradmin -safemode on (or off / true / wait / status) carried over from other tools' vocabularies; a script variable expanding to an empty or misspelled verb.

Common situations: Operators used to NameNode safemode vocabulary ('wait', 'get') or generic on/off toggles; automation written against a different Hadoop CLI.

Related errors


AI-assisted analysis of apache/hadoop@2add963021 (2026-08-22). Data as JSON: /api/errors/800c5f0c5a64dc7c. Report an issue: GitHub.