From 00810c2d1c9d252f49312ff1d91c968c13e089be Mon Sep 17 00:00:00 2001 From: Guangxu Cheng Date: Tue, 30 May 2017 22:28:29 +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 | 13 ++++++++++++- hbase-shell/src/test/ruby/hbase/admin_test.rb | 17 +++++++++++++++++ 2 files changed, 29 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..63c0d52 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -482,8 +482,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 +495,10 @@ module Hbase begin yield 'Truncating table...' if block_given? + #just for test + unless conf.getBoolean("hbase.client.truncatetable.support", true) + raise UnSupportMethodException + 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 +517,12 @@ module Hbase end end + class UnSupportMethodException < StandardError + def cause + return org.apache.hadoop.hbase.DoNotRetryIOException.new("truncateTable 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..5d8364f 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, $TEST_CLUSTER.getConfiguration) + 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