You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2017/05/31 09:31:36 UTC

hbase git commit: HBASE-18129 truncate_preserve fails when the truncate method doesn't exist on the master

Repository: hbase
Updated Branches:
  refs/heads/master c945d2b2d -> dda9ae029


HBASE-18129 truncate_preserve fails when the truncate method doesn't exist on the master

Signed-off-by: tedyu <yu...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/dda9ae02
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/dda9ae02
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/dda9ae02

Branch: refs/heads/master
Commit: dda9ae02959a9c27bb805e83749adf4a2d3d38bd
Parents: c945d2b
Author: Guangxu Cheng <gu...@gmail.com>
Authored: Wed May 31 13:30:07 2017 +0800
Committer: tedyu <yu...@gmail.com>
Committed: Wed May 31 02:31:29 2017 -0700

----------------------------------------------------------------------
 hbase-shell/src/main/ruby/hbase/admin.rb      | 20 ++++++++++++++++++--
 hbase-shell/src/test/ruby/hbase/admin_test.rb | 17 +++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/dda9ae02/hbase-shell/src/main/ruby/hbase/admin.rb
----------------------------------------------------------------------
diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb
index 749b2e8..6a9458b 100644
--- a/hbase-shell/src/main/ruby/hbase/admin.rb
+++ b/hbase-shell/src/main/ruby/hbase/admin.rb
@@ -35,6 +35,7 @@ module Hbase
       @connection = connection
       # Java Admin instance
       @admin = @connection.getAdmin
+      @conf = @connection.getConfiguration
     end
 
     def close
@@ -515,14 +516,15 @@ module Hbase
 
     #----------------------------------------------------------------------------------------------
     # Truncates table while maintaing region boundaries (deletes all records by recreating the table)
-    def truncate_preserve(table_name_str)
+    def truncate_preserve(table_name_str, conf = @conf)
       puts "Truncating '#{table_name_str}' table (it may take a while):"
       table_name = TableName.valueOf(table_name_str)
       locator = @connection.getRegionLocator(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
@@ -533,6 +535,10 @@ module Hbase
 
       begin
         puts 'Truncating table...'
+        #just for test
+        unless conf.getBoolean("hbase.client.truncatetable.support", true)
+          raise UnsupportedMethodException.new('truncateTable')
+        end
         @admin.truncateTable(table_name, true)
       rescue => e
         # Handle the compatibility case, where the truncate method doesn't exists on the Master
@@ -551,6 +557,16 @@ 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)

http://git-wip-us.apache.org/repos/asf/hbase/blob/dda9ae02/hbase-shell/src/test/ruby/hbase/admin_test.rb
----------------------------------------------------------------------
diff --git a/hbase-shell/src/test/ruby/hbase/admin_test.rb b/hbase-shell/src/test/ruby/hbase/admin_test.rb
index de2891b..1884217 100644
--- a/hbase-shell/src/test/ruby/hbase/admin_test.rb
+++ b/hbase-shell/src/test/ruby/hbase/admin_test.rb
@@ -272,6 +272,23 @@ module Hbase
       output = capture_stdout { command(:truncate, @test_name) }
       assert(!output.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()
+      command(: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