[ 
https://issues.apache.org/jira/browse/HBASE-30370?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Junegunn Choi resolved HBASE-30370.
-----------------------------------
    Fix Version/s: 4.0.0-alpha-1
                   2.7.0
                   3.1.0
                   3.0.1
                   2.6.8
                   2.5.17
       Resolution: Fixed

Pushed to master, branch-3, branch-3.0, branch-2, branch-2.6 and branch-2.5.

Thanks [~lupeng] for the review!


> Shell exits on errors other than NameError and SyntaxError
> ----------------------------------------------------------
>
>                 Key: HBASE-30370
>                 URL: https://issues.apache.org/jira/browse/HBASE-30370
>             Project: HBase
>          Issue Type: Bug
>          Components: shell
>    Affects Versions: 2.4.18, 3.0.0, 2.5.16, 2.6.7
>            Reporter: Junegunn Choi
>            Assignee: Junegunn Choi
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 4.0.0-alpha-1, 2.7.0, 3.1.0, 3.0.1, 2.6.8, 2.5.17
>
>
> h2. Problem
> A mistyped command returns to the prompt, but any other error kills the 
> session, losing any local variables built up in it.
> {noformat}
> hbase:001:0> foot 'record'
> undefined method `foot' ... (NoMethodError)
> hbase:002:0> 1 + '2'
> TypeError: String can't be coerced into Integer
>    ... full JRuby backtrace, shell exits ...
> {noformat}
> HBase 1 printed the error and continued. The custom rescue block did not 
> exist. HBASE-26741 changed that for all exceptions in 2.4.10, 2.5.0 and 
> 3.0.0-alpha-3. HBASE-26880 and HBASE-27726 then restored the old behavior for 
> one exception class each.
> {{hirb.rb}} rescues by class:
>  - {{SyntaxError}} (HBASE-27726) and {{NameError}} (HBASE-26880) fall through 
> to {{handle_exception}} and continue.
>  - Everything else hits the generic {{rescue Exception}} added by HBASE-26741 
> and is re-raised.
>  - {{NoMethodError}} survives only because it extends {{{}NameError{}}}.
> The generic re-raise exists so that {{hbase shell script.rb}} sets a non-zero 
> exit code. That applies to the script path only. An interactive session is 
> not wrapped in {{{}Shell.exception_handler{}}}, and {{jar-bootstrap.rb}} 
> skips the exit code when interactive. So interactively the exception is not 
> caught anywhere, escapes to JRuby's default handler, and takes the session 
> with it.
> h2. Fix
> Re-raise only when something consumes the exit code, which is a script run or 
> {{{}-n{}}}. Otherwise the error goes to {{handle_exception}} and the prompt 
> continues, as it did before HBASE-26741. The {{SyntaxError}} and 
> {{NameError}} clauses become redundant and are removed.
> Gating on {{@interactive}} alone is not enough. {{interactive}} is only 
> cleared by {{{}-n{}}}, so {{hbase shell script.rb}} would stop exiting 
> non-zero and would fall through to a prompt. A script run is instead 
> identified by the {{IRB::FileInputMethod}} that {{HBaseLoader.file_for_load}} 
> returns.
> {{SystemExit}} and {{SignalException}} still re-raise unconditionally, so 
> {{exit}} and signals are unaffected.
> h2. Behavior
> With {{{}script.rb{}}}:
> {code:java|title=script.rb}
> 1 + '2'
> puts 'hello'
> {code}
> ||case||before||after||
> |interactive, {{NameError}} or {{SyntaxError}}|prompt continues|prompt 
> continues|
> |interactive, any other error|session exits|prompt continues|
> |{{hbase shell script.rb}}|exit 1|exit 1|
> |{{hbase shell -n script.rb}}|exit 1|exit 1|
> |either form, error-free script|exit 0|exit 0|



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to