You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Sean Busbey (Jira)" <ji...@apache.org> on 2021/11/19 07:09:00 UTC
[jira] [Updated] (HBASE-26469) HBase shell has changed exit behavior
[ https://issues.apache.org/jira/browse/HBASE-26469?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sean Busbey updated HBASE-26469:
--------------------------------
Attachment: hbase-2.3.7-exit-behavior.log
hbase-2.2.7-exit-behavior.log
hbase-2.1.9-exit-behavior.log
hbase-2.0.6-exit-behavior.log
hbase-1.4.14-exit-behavior.log
hbase-1.7.1-exit-behavior.log
hbase-3.0.0-alpha-2-exit-behavior.log
hbase-2.4.8-exit-behavior.log
> HBase shell has changed exit behavior
> -------------------------------------
>
> Key: HBASE-26469
> URL: https://issues.apache.org/jira/browse/HBASE-26469
> Project: HBase
> Issue Type: Bug
> Components: shell
> Affects Versions: 2.5.0, 3.0.0-alpha-2, 2.4.8
> Reporter: Sean Busbey
> Priority: Critical
> Attachments: hbase-1.4.14-exit-behavior.log, hbase-1.7.1-exit-behavior.log, hbase-2.0.6-exit-behavior.log, hbase-2.1.9-exit-behavior.log, hbase-2.2.7-exit-behavior.log, hbase-2.3.7-exit-behavior.log, hbase-2.4.8-exit-behavior.log, hbase-3.0.0-alpha-2-exit-behavior.log
>
>
> The HBase shell has changed behavior in a way that breaks being able to exit properly.
> Two example scripts to act as stand ins for hbase shell scripts to "do something simple then exit":
> {code}
> tmp % echo "list\nexit" > clean_exit.rb
> tmp % echo "list\nexit 1" > error_exit.rb
> {code}
> Giving these two scripts is possible:
> * passed as a cli argument
> * via redirected stdin
> Additionally the shell invocation can be:
> * in the default compatibility mode
> * with the "non interactive" flag that gives an exit code that reflects runtime errors
> I'll post logs of the details as attachments but here are some tables of the exit codes.
> The {{clean_exit.rb}} invocations ought to exit with success, exit code 0.
> || || 1.4.14 || 1.7.1 || 2.0.6 || 2.1.9 || 2.2.7 || 2.3.7 || 2.4.8 || master ||
> | cli, default | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1* |
> | cli, -n | 0 | 0 | 0 | 0 | 0 | 0 | 1 | hang |
> | stdin, default | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
> | stdin, -n | 1 | 1 | 1 | 1 | 1 | 1 | 1* | 1* |
> The {{error_exit.rb}} invocation should return a non-zero exit code, unless we're specifically trying to match a normal hbase shell session.
> || || 1.4.14 || 1.7.1 || 2.0.6 || 2.1.9 || 2.2.7 || 2.3.7 || 2.4.8 || master ||
> | cli, default | 1 | 1 | 1 | 1 | 1 | 1 | 1* | 1* |
> | cli, -n | 1 | 1 | 1 | 1 | 1 | 1 | 1* | hang |
> | stdin, default | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
> | stdin, -n | 1 | 1 | 1 | 1 | 1 | 1 | 1* | 1* |
> In cases marked with * the error details are different.
> The biggest concern are the new-to-2.4 non-zero exit code when we should have a success and the hanging.
> The former looks like this:
> {code}
> ERROR NoMethodError: private method `exit' called for nil:NilClass
> {code}
> The change in error details for the error exit script also shows this same detail.
> This behavior appears to be a side effect of HBASE-11686. As far as I can tell, the IRB handling of 'exit' calls fail because we implement our own handling of sessoins rather than rely on the intended session interface. We never set a current session, and IRB's exit implementation presumes there will be one.
> Running in debug shows this in a stacktrace:
> {code}
> Took 0.4563 seconds
> ERROR NoMethodError: private method `exit' called for nil:NilClass
> NoMethodError: private method `exit' called for nil:NilClass
> irb_exit at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/irb/extend-command.rb:30
> evaluate at stdin:2
> eval at org/jruby/RubyKernel.java:1048
> evaluate at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/irb/workspace.rb:85
> eval_io at uri:classloader:/shell.rb:327
> each_top_level_statement at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/irb/ruby-lex.rb:246
> loop at org/jruby/RubyKernel.java:1442
> each_top_level_statement at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/irb/ruby-lex.rb:232
> catch at org/jruby/RubyKernel.java:1189
> each_top_level_statement at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/irb/ruby-lex.rb:231
> eval_io at uri:classloader:/shell.rb:326
> classpath:/jar-bootstrap.rb at classpath:/jar-bootstrap.rb:194
> exception_handler at uri:classloader:/shell.rb:339
> <main> at classpath:/jar-bootstrap.rb:194
> {code}
> And in our version of IRB (0.9.6) [line 30 for extend-commands|https://github.com/ruby/irb/blob/v0.9.6/lib/irb/extend-command.rb#L30] corresponds to this code:
> {code}
> # Quits the current irb context
> #
> # +ret+ is the optional signal or message to send to Context#exit
> #
> # Same as <code>IRB.CurrentContext.exit</code>.
> def irb_exit(ret = 0)
> irb_context.exit(ret)
> end
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)