Michael Noll created STORM-488:
----------------------------------
Summary: storm CLI tool reports zero exit code on error scenario
Key: STORM-488
URL: https://issues.apache.org/jira/browse/STORM-488
Project: Apache Storm (Incubating)
Issue Type: Bug
Reporter: Michael Noll
Assignee: Michael Noll
Priority: Minor
The {{storm}} CLI tool incorrectly reports a zero exit code ("success") when it
should report a non-zero exit code ("error") under the following condition.
h3. How to reproduce
{code}
$STORM_HOME/bin/storm unsupportedCommand
{code}
h3. Actual result (incorrect)
The command above prints the usage help of the {{storm}} CLI tool, which is ok.
However, the exit code is 0, indicating success.
{code}
$ /opt/storm/bin/storm unsupportedCommand
Unknown command: [storm unsupportedCommand]
Commands:
activate
classpath
deactivate
dev-zookeeper
drpc
help
jar
kill
list
localconfvalue
logviewer
nimbus
rebalance
remoteconfvalue
repl
shell
supervisor
ui
version
Help:
help
help <command>
Documentation for the storm client can be found at
http://storm.incubator.apache.org/documentation/Command-line-client.html
Configs can be overridden using one or more -c flags, e.g. "storm list -c
nimbus.host=nimbus.mycompany.com"
$ echo $?
0 << zero exit code, should be non-zero
{code}
The problem of the current behavior is that automated deployment tools such as
Puppet or Ansible fail to work correctly because they assume a zero exit code
to indicate success.
As a concrete example, imagine you mistype the command to submit a topology jar
file to a Storm cluster:
{code}
# Doh, forgot to put the "jar" command between `storm` and `mytopology.jar`!
$ /opt/storm/bin/storm mytopology.jar my.Class
# Correct would be:
# $ /opt/storm/bin/storm jar mytopology.jar my.Class
{code}
In this example, even though the user mistyped the submit command in e.g. an
Ansible script, the script would not be able to tell -- the storm CLI tool
incorrectly reports that the (wrong) command completed successfully.
h3. Expected result (correct)
Running the storm CLI tool with an unsupported command should return a non-zero
exit code to clearly indicate an error condition.
The only remaining question would be: What would be the actual, non-zero exit
code?
For example, running the storm CLI tool without any argument returns an exit
code of 255:
{code}
$ /opt/storm/bin/storm
...snip...
$ echo $?
255
{code}
Unfortunately, my understanding is that we haven't defined the semantics of
non-zero exit codes. Their values are IMHO not deliberately chosen.
For instance, if you run the "storm jar" command these are (some of) its
possible exit codes:
{code}
0: success
1:
- topology of same name already exists
`Exception in thread "main" java.lang.RuntimeException: Topology with name
`mytopology` already exists on cluster`
- class cannot be found (`storm jar storm-starter.jar
storm.starter.IDoNotExistAtAll`)
`Exception in thread "main" java.lang.NoClassDefFoundError:
storm/starter/IDoNotExistAtAll` (<<< logged to STDERR)
- incorrect use of command line, e.g. wrong number of command line arguments
{code}
As you can see, we return an exit code of 1 for a variety of error conditions.
On the positive side, at least it's clear that there was an error. On the
negative side, we cannot tell different error conditions apart because the same
exit code is used.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)