You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ps...@apache.org on 2022/02/10 11:15:50 UTC
[hbase] branch master updated: HBASE-26741 Incorrect exception handling in shell (#4101)
This is an automated email from the ASF dual-hosted git repository.
psomogyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 85fadfd HBASE-26741 Incorrect exception handling in shell (#4101)
85fadfd is described below
commit 85fadfde26b9b79c520d771df15310ad8c1e2ac9
Author: Peter Somogyi <ps...@apache.org>
AuthorDate: Thu Feb 10 12:14:46 2022 +0100
HBASE-26741 Incorrect exception handling in shell (#4101)
Override eval_input in HIRB to modify exception handling logic.
Signed-off-by: Josh Elser <el...@apache.org>
---
LICENSE.txt | 29 +++++++++-
NOTICE.txt | 2 +-
hbase-shell/src/main/ruby/irb/hirb.rb | 104 ++++++++++++++++++++++++++++++++++
3 files changed, 133 insertions(+), 2 deletions(-)
diff --git a/LICENSE.txt b/LICENSE.txt
index a49fc5e..c30fe2b 100755
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -252,7 +252,7 @@ under the terms of the MIT license.
THE SOFTWARE.
----
-This project incorporates portions of the 'Protocol Buffers' project avaialble
+This project incorporates portions of the 'Protocol Buffers' project available
under a '3-clause BSD' license.
Copyright 2008, Google Inc.
@@ -612,3 +612,30 @@ available under the Creative Commons By Attribution 3.0 License.
this trademark restriction does not form part of this License.
Creative Commons may be contacted at https://creativecommons.org/.
+
+----
+This project incorporates portions of the 'Ruby' project available
+under a '2-clause BSD' license.
+
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
diff --git a/NOTICE.txt b/NOTICE.txt
index 8c97c34..41ed32c 100755
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,5 +1,5 @@
Apache HBase
-Copyright 2007-2020 The Apache Software Foundation
+Copyright 2007-2022 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
diff --git a/hbase-shell/src/main/ruby/irb/hirb.rb b/hbase-shell/src/main/ruby/irb/hirb.rb
index 33419b9..28f311c 100644
--- a/hbase-shell/src/main/ruby/irb/hirb.rb
+++ b/hbase-shell/src/main/ruby/irb/hirb.rb
@@ -56,6 +56,110 @@ module IRB
# after all output.
super unless @context.last_value.nil?
end
+
+ # Copied from irb.rb and overrides the rescue Exception block so the
+ # Shell::exception_handler can deal with the exceptions.
+ def eval_input
+ @scanner.set_prompt do
+ |ltype, indent, continue, line_no|
+ if ltype
+ f = @context.prompt_s
+ elsif continue
+ f = @context.prompt_c
+ elsif indent > 0
+ f = @context.prompt_n
+ else
+ f = @context.prompt_i
+ end
+ f = "" unless f
+ if @context.prompting?
+ @context.io.prompt = p = prompt(f, ltype, indent, line_no)
+ else
+ @context.io.prompt = p = ""
+ end
+ if @context.auto_indent_mode
+ unless ltype
+ ind = prompt(@context.prompt_i, ltype, indent, line_no)[/.*\z/].size +
+ indent * 2 - p.size
+ ind += 2 if continue
+ @context.io.prompt = p + " " * ind if ind > 0
+ end
+ end
+ end
+
+ @scanner.set_input(@context.io) do
+ signal_status(:IN_INPUT) do
+ if l = @context.io.gets
+ print l if @context.verbose?
+ else
+ if @context.ignore_eof? and @context.io.readable_after_eof?
+ l = "\n"
+ if @context.verbose?
+ printf "Use \"exit\" to leave %s\n", @context.ap_name
+ end
+ else
+ print "\n"
+ end
+ end
+ l
+ end
+ end
+
+ @scanner.each_top_level_statement do |line, line_no|
+ signal_status(:IN_EVAL) do
+ begin
+ line.untaint
+ @context.evaluate(line, line_no)
+ output_value if @context.echo?
+ exc = nil
+ rescue Interrupt => exc
+ rescue SystemExit, SignalException
+ raise
+ rescue Exception
+ # HBASE-26741: Raise exception so Shell::exception_handler can catch it.
+ # This modifies this copied method from JRuby so that the HBase shell can
+ # manage the exception and set a proper exit code on the process.
+ raise
+ end
+ if exc
+ if exc.backtrace && exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
+ !(SyntaxError === exc)
+ irb_bug = true
+ else
+ irb_bug = false
+ end
+
+ messages = []
+ lasts = []
+ levels = 0
+ if exc.backtrace
+ count = 0
+ exc.backtrace.each do |m|
+ m = @context.workspace.filter_backtrace(m) or next unless irb_bug
+ m = sprintf("%9d: from %s", (count += 1), m)
+ if messages.size < @context.back_trace_limit
+ messages.push(m)
+ elsif lasts.size < @context.back_trace_limit
+ lasts.push(m).shift
+ levels += 1
+ end
+ end
+ end
+ attr = STDOUT.tty? ? ATTR_TTY : ATTR_PLAIN
+ print "#{attr[1]}Traceback#{attr[]} (most recent call last):\n"
+ unless lasts.empty?
+ puts lasts.reverse
+ printf "... %d levels...\n", levels if levels > 0
+ end
+ puts messages.reverse
+ messages = exc.to_s.split(/\n/)
+ print "#{attr[1]}#{exc.class} (#{attr[4]}#{messages.shift}#{attr[0, 1]})#{attr[]}\n"
+ puts messages.map {|s| "#{attr[1]}#{s}#{attr[]}\n"}
+ print "Maybe IRB bug!\n" if irb_bug
+ end
+ end
+ end
+ end
end
##