From 4772a4ebddaf97c394344420ad48d014da7c67b6 Mon Sep 17 00:00:00 2001 From: Sean Busbey Date: Wed, 4 Apr 2018 09:37:27 -0500 Subject: [PATCH] HBASE-20276 restore original shell REPL functionality where commands can return results * makes commands always pass any results back to hirb * print warning if hirb is given the --return-values flag * add some docs on how to avoid the console clutter that HBASE-15965 sought to address * add an upgrade section note about this change. * cleanup where the get_splits command does its printing so there's a building block that doesn't print * some rubocop suggested tweaks and opt-out for classlength check on table and shell classes. Signed-off-by: Mike Drob Conflicts: src/main/asciidoc/_chapters/upgrading.adoc * backport leaves off refguide change about upgrading. --- bin/hirb.rb | 8 +++----- hbase-shell/src/main/ruby/hbase/table.rb | 13 ++++++++----- hbase-shell/src/main/ruby/shell.rb | 14 ++++---------- .../src/main/ruby/shell/commands/get_splits.rb | 6 +++++- .../src/test/ruby/shell/noninteractive_test.rb | 2 +- hbase-shell/src/test/ruby/test_helper.rb | 2 +- src/main/asciidoc/_chapters/shell.adoc | 8 ++++++++ 7 files changed, 30 insertions(+), 23 deletions(-) diff --git a/bin/hirb.rb b/bin/hirb.rb index 6e92d51eb99..790ecdc276c 100644 --- a/bin/hirb.rb +++ b/bin/hirb.rb @@ -59,15 +59,12 @@ Usage: shell [OPTIONS] [SCRIPTFILE [ARGUMENTS]] -n | --noninteractive Do not run within an IRB session and exit with non-zero status on first error. - -r | --return-values Include return values from commands - executed in the shell. HERE found = [] script2run = nil log_level = org.apache.log4j.Level::ERROR @shell_debug = false interactive = true -return_values = false for arg in ARGV if arg == '-h' || arg == '--help' puts cmdline_help @@ -82,7 +79,8 @@ for arg in ARGV interactive = false found.push(arg) elsif arg == '-r' || arg == '--return-values' - return_values = true + warn '[INFO] the -r | --return-values option is ignored. we always behave '\ + 'as though it was given.' found.push(arg) else # Presume it a script. Save it off for running later below @@ -116,7 +114,7 @@ require 'shell/formatter' @hbase = Hbase::Hbase.new # Setup console -@shell = Shell::Shell.new(@hbase, interactive, return_values) +@shell = Shell::Shell.new(@hbase, interactive) @shell.debug = @shell_debug # Add commands to this namespace diff --git a/hbase-shell/src/main/ruby/hbase/table.rb b/hbase-shell/src/main/ruby/hbase/table.rb index 07c74d81906..6af6cfaec85 100644 --- a/hbase-shell/src/main/ruby/hbase/table.rb +++ b/hbase-shell/src/main/ruby/hbase/table.rb @@ -19,9 +19,12 @@ include Java +java_import org.apache.hadoop.hbase.util.Bytes + # Wrapper for org.apache.hadoop.hbase.client.Table module Hbase + # rubocop:disable Metrics/ClassLength class Table include HBaseConstants @@thread_pool = nil @@ -804,12 +807,12 @@ EOF # Get the split points for the table def _get_splits_internal locator = @table.getRegionLocator - splits = locator.getAllRegionLocations - .map { |i| Bytes.toStringBinary(i.getRegionInfo.getStartKey) }.delete_if { |k| k == '' } + locator.getAllRegionLocations + .map { |i| Bytes.toStringBinary(i.getRegionInfo.getStartKey) } + .delete_if { |k| k == '' } + ensure locator.close - puts(format('Total number of splits = %s', splits.size + 1)) - puts splits - splits end end + # rubocop:enable Metrics/ClassLength end diff --git a/hbase-shell/src/main/ruby/shell.rb b/hbase-shell/src/main/ruby/shell.rb index 507c0a92607..3efe7e9d2f5 100644 --- a/hbase-shell/src/main/ruby/shell.rb +++ b/hbase-shell/src/main/ruby/shell.rb @@ -68,22 +68,18 @@ module Shell end #---------------------------------------------------------------------- + # rubocop:disable Metrics/ClassLength class Shell attr_accessor :hbase attr_accessor :interactive - attr_accessor :return_values alias interactive? interactive - alias return_values? return_values @debug = false attr_accessor :debug - def initialize(hbase, interactive = true, return_values = !interactive) + def initialize(hbase, interactive = true) self.hbase = hbase self.interactive = interactive - self.return_values = return_values - # If we're in non-interactive mode, force return_values - self.return_values = true unless self.interactive end # Returns Admin class from admin.rb @@ -140,11 +136,8 @@ module Shell end # call the method 'command' on the specified command - # If return_values is false, then we suppress the return value. The command - # should have printed relevant output. def command(command, *args) - ret = internal_command(command, :command, *args) - ret if return_values + internal_command(command, :command, *args) end # call a specific internal method in the command instance @@ -245,6 +238,7 @@ For more on the HBase Shell, see http://hbase.apache.org/book.html HERE end end + # rubocop:enable Metrics/ClassLength end # Load commands base class diff --git a/hbase-shell/src/main/ruby/shell/commands/get_splits.rb b/hbase-shell/src/main/ruby/shell/commands/get_splits.rb index 91307c2026f..49a7debaab9 100644 --- a/hbase-shell/src/main/ruby/shell/commands/get_splits.rb +++ b/hbase-shell/src/main/ruby/shell/commands/get_splits.rb @@ -37,7 +37,11 @@ EOF end def get_splits(table) - table._get_splits_internal + splits = table._get_splits_internal + puts(format('Total number of splits = %d', + numsplits: (splits.size + 1))) + puts splits + splits end end end diff --git a/hbase-shell/src/test/ruby/shell/noninteractive_test.rb b/hbase-shell/src/test/ruby/shell/noninteractive_test.rb index 75a2c7dd219..0fae4cbb79a 100644 --- a/hbase-shell/src/test/ruby/shell/noninteractive_test.rb +++ b/hbase-shell/src/test/ruby/shell/noninteractive_test.rb @@ -20,7 +20,7 @@ require 'shell' class NonInteractiveTest < Test::Unit::TestCase def setup @hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration) - @shell = Shell::Shell.new(@hbase, false, true) + @shell = Shell::Shell.new(@hbase, false) end define_test "Shell::Shell noninteractive mode should throw" do diff --git a/hbase-shell/src/test/ruby/test_helper.rb b/hbase-shell/src/test/ruby/test_helper.rb index 874b5549aed..ec6bb6a55da 100644 --- a/hbase-shell/src/test/ruby/test_helper.rb +++ b/hbase-shell/src/test/ruby/test_helper.rb @@ -43,7 +43,7 @@ module Hbase def setup_hbase hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration) - @shell = ::Shell::Shell.new(hbase, interactive = false, return_values = true) + @shell = ::Shell::Shell.new(hbase, interactive = false) end def shutdown diff --git a/src/main/asciidoc/_chapters/shell.adoc b/src/main/asciidoc/_chapters/shell.adoc index 522f482fc0b..13b8dd1b808 100644 --- a/src/main/asciidoc/_chapters/shell.adoc +++ b/src/main/asciidoc/_chapters/shell.adoc @@ -318,6 +318,7 @@ hbase(main):017:0> tables.map { |t| disable t ; drop t} hbase(main):018:0> ---- +[[irbrc]] === _irbrc_ Create an _.irbrc_ file for yourself in your home directory. @@ -331,6 +332,13 @@ IRB.conf[:SAVE_HISTORY] = 100 IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history" ---- +If you'd like to avoid printing the result of evaluting each expression to stderr, for example the array of tables returned from the "list" command: + +[source,bash] +---- +$ echo "IRB.conf[:ECHO] = false" >>~/.irbrc +---- + See the `ruby` documentation of _.irbrc_ to learn about other possible configurations. === LOG data to timestamp