Skip to content

Commit

Permalink
HBASE-23046 Remove compatibility case from truncate command (#638)
Browse files Browse the repository at this point in the history
Signed-off-by: Sean Busbey <busbey@apache.org>
  • Loading branch information
petersomogyi committed Sep 19, 2019
1 parent 91a6134 commit 55b6976
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 85 deletions.
81 changes: 14 additions & 67 deletions hbase-shell/src/main/ruby/hbase/admin.rb
Expand Up @@ -533,83 +533,30 @@ def snapshot_cleanup_enabled?
def truncate(table_name_str)
puts "Truncating '#{table_name_str}' table (it may take a while):"
table_name = TableName.valueOf(table_name_str)
table_description = @admin.getTableDescriptor(table_name)
raise ArgumentError, "Table #{table_name_str} is not enabled. Enable it first." unless
enabled?(table_name_str)
puts 'Disabling table...'
@admin.disableTable(table_name)

begin
puts 'Truncating table...'
@admin.truncateTable(table_name, false)
rescue => e
# Handle the compatibility case, where the truncate method doesn't exists on the Master
raise e unless e.respond_to?(:cause) && !e.cause.nil?
rootCause = e.cause
if rootCause.is_a?(org.apache.hadoop.hbase.DoNotRetryIOException)
# Handle the compatibility case, where the truncate method doesn't exists on the Master
puts 'Dropping table...'
@admin.deleteTable(table_name)

puts 'Creating table...'
@admin.createTable(table_description)
else
raise e
end
if enabled?(table_name_str)
puts 'Disabling table...'
disable(table_name_str)
end

puts 'Truncating table...'
@admin.truncateTable(table_name, false)
end

#----------------------------------------------------------------------------------------------
# Truncates table while maintaing region boundaries (deletes all records by recreating the table)
def truncate_preserve(table_name_str, conf = @conf)
# Truncates table while maintaining region boundaries
# (deletes all records by recreating the table)
def truncate_preserve(table_name_str)
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.toStringBinary(i.getRegionInfo.getStartKey) }
.delete_if { |k| k == '' }.to_java :String
splits = org.apache.hadoop.hbase.util.Bytes.toBinaryByteArrays(splits)
ensure
locator.close
end

table_description = @admin.getTableDescriptor(table_name)
puts 'Disabling table...'
disable(table_name_str)

begin
puts 'Truncating table...'
# just for test
unless conf.getBoolean('hbase.client.truncatetable.support', true)
raise UnsupportedMethodException, 'truncateTable'
end
@admin.truncateTable(table_name, true)
rescue => e
# Handle the compatibility case, where the truncate method doesn't exists on the Master
raise e unless e.respond_to?(:cause) && !e.cause.nil?
rootCause = e.cause
if rootCause.is_a?(org.apache.hadoop.hbase.DoNotRetryIOException)
# Handle the compatibility case, where the truncate method doesn't exists on the Master
puts 'Dropping table...'
@admin.deleteTable(table_name)

puts 'Creating table with region boundaries...'
@admin.createTable(table_description, splits)
else
raise e
end
end
end

class UnsupportedMethodException < StandardError
def initialize(name)
@method_name = name
if enabled?(table_name_str)
puts 'Disabling table...'
disable(table_name_str)
end

def cause
org.apache.hadoop.hbase.DoNotRetryIOException.new("#{@method_name} is not support")
end
puts 'Truncating table...'
@admin.truncateTable(table_name, true)
end

#----------------------------------------------------------------------------------------------
Expand Down
36 changes: 18 additions & 18 deletions hbase-shell/src/test/ruby/hbase/admin_test.rb
Expand Up @@ -350,53 +350,53 @@ def teardown

#-------------------------------------------------------------------------------

define_test "truncate should empty a table" do
table(@test_name).put(1, "x:a", 1)
table(@test_name).put(2, "x:a", 2)
define_test 'truncate should empty a table' do
table(@test_name).put(1, 'x:a', 1)
table(@test_name).put(2, 'x:a', 2)
assert_equal(2, table(@test_name)._count_internal)
# This is hacky. Need to get the configuration into admin instance
command(:truncate, @test_name)
assert_equal(0, table(@test_name)._count_internal)
end

define_test "truncate should yield log records" do
define_test 'truncate should yield log records' do
output = capture_stdout { command(:truncate, @test_name) }
assert(!output.empty?)
end

define_test 'truncate should work on disabled table' do
table(@test_name).put(1, 'x:a', 1)
table(@test_name).put(2, 'x:a', 2)
assert_equal(2, table(@test_name)._count_internal)
command(:disable, @test_name)
command(:truncate, @test_name)
assert_equal(0, table(@test_name)._count_internal)
end

#-------------------------------------------------------------------------------

define_test "truncate_preserve should empty a table" do
table(@test_name).put(1, "x:a", 1)
table(@test_name).put(2, "x:a", 2)
define_test 'truncate_preserve should empty a table' do
table(@test_name).put(1, 'x:a', 1)
table(@test_name).put(2, 'x:a', 2)
assert_equal(2, table(@test_name)._count_internal)
# This is hacky. Need to get the configuration into admin instance
command(:truncate_preserve, @test_name)
assert_equal(0, table(@test_name)._count_internal)
end

define_test "truncate_preserve should yield log records" do
define_test 'truncate_preserve should yield log records' do
output = capture_stdout { command(:truncate_preserve, @test_name) }
assert(!output.empty?)
end

define_test "truncate_preserve should maintain the previous region boundaries" do
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

#-------------------------------------------------------------------------------

define_test "list_regions should fail for disabled table" do
Expand Down

0 comments on commit 55b6976

Please sign in to comment.