From 348d08b955e85553a96996b031ea3c33eb644e4c Mon Sep 17 00:00:00 2001 From: Guangxu Cheng Date: Wed, 31 May 2017 12:51:31 +0800 Subject: [PATCH] HBASE-18129 truncate_preserve fails when the truncate method doesn't exists on the master --- hbase-shell/src/main/ruby/hbase/admin.rb | 17 ++++++++++++++++- hbase-shell/src/test/ruby/hbase/admin_test.rb | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletions(-) diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index 9925df3..3e9c0fc 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -36,6 +36,7 @@ module Hbase @connection = connection # Java Admin instance @admin = @connection.getAdmin + @conf = connection.getConfiguration end def close @@ -482,8 +483,9 @@ module Hbase locator = @connection.getRegionLocator(TableName.valueOf(table_name)) begin splits = locator.getAllRegionLocations(). - map{|i| Bytes.toString(i.getRegionInfo().getStartKey)}. + map{|i| Bytes.toStringBinary(i.getRegionInfo().getStartKey)}. delete_if{|k| k == ""}.to_java :String + splits = org.apache.hadoop.hbase.util.Bytes.toBinaryByteArrays(splits) ensure locator.close() end @@ -494,6 +496,10 @@ module Hbase begin yield 'Truncating table...' if block_given? + #just for test + unless conf.getBoolean("hbase.client.truncatetable.support", true) + raise UnsupportedMethodException.new('truncateTable') + end @admin.truncateTable(org.apache.hadoop.hbase.TableName.valueOf(table_name), true) rescue => e # Handle the compatibility case, where the truncate method doesn't exists on the Master @@ -512,6 +518,15 @@ module Hbase end end + class UnsupportedMethodException < StandardError + def initialize(name) + @method_name = name + end + def cause + return org.apache.hadoop.hbase.DoNotRetryIOException.new("#@method_name is not support") + end + end + #---------------------------------------------------------------------------------------------- # Check the status of alter command (number of regions reopened) def alter_status(table_name) diff --git a/hbase-shell/src/test/ruby/hbase/admin_test.rb b/hbase-shell/src/test/ruby/hbase/admin_test.rb index e53c6be..172aad3 100644 --- a/hbase-shell/src/test/ruby/hbase/admin_test.rb +++ b/hbase-shell/src/test/ruby/hbase/admin_test.rb @@ -271,6 +271,23 @@ module Hbase end assert(!logs.empty?) end + + define_test "truncate_preserve should maintain the previous region boundaries" do + drop_test_table(@create_test_name) + admin.create(@create_test_name, 'a', {NUMREGIONS => 10, SPLITALGO => 'HexStringSplit'}) + splits = table(@create_test_name)._get_splits_internal() + admin.truncate_preserve(@create_test_name) + assert_equal(splits, table(@create_test_name)._get_splits_internal()) + end + + define_test "truncate_preserve should be fine when truncateTable method doesn't support" do + drop_test_table(@create_test_name) + admin.create(@create_test_name, 'a', {NUMREGIONS => 10, SPLITALGO => 'HexStringSplit'}) + splits = table(@create_test_name)._get_splits_internal() + $TEST_CLUSTER.getConfiguration.setBoolean("hbase.client.truncatetable.support", false) + admin.truncate_preserve(@create_test_name, $TEST_CLUSTER.getConfiguration) + assert_equal(splits, table(@create_test_name)._get_splits_internal()) + end end # Simple administration methods tests -- 1.7.1