You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2022/02/19 17:01:55 UTC

[hbase] branch branch-2 updated: HBASE-26673 Implement a shell command for change SFT implementation (#4113)

This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new b265fe5  HBASE-26673 Implement a shell command for change SFT implementation (#4113)
b265fe5 is described below

commit b265fe55be7239f5110b2cc66fe282765d83bf51
Author: LiangJun He <20...@163.com>
AuthorDate: Sat Feb 19 23:00:04 2022 +0800

    HBASE-26673 Implement a shell command for change SFT implementation (#4113)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
---
 hbase-shell/src/main/ruby/hbase/admin.rb           | 11 ++++
 hbase-shell/src/main/ruby/shell.rb                 |  9 ++++
 .../src/main/ruby/shell/commands/change_sft.rb     | 50 +++++++++++++++++++
 .../src/main/ruby/shell/commands/change_sft_all.rb | 58 ++++++++++++++++++++++
 .../hadoop/hbase/client/TestChangeSftShell.java    | 46 +++++++++++++++++
 .../src/test/ruby/shell/sftchange_shell_test.rb    | 56 +++++++++++++++++++++
 6 files changed, 230 insertions(+)

diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb
index 25f0799..eab4492 100644
--- a/hbase-shell/src/main/ruby/hbase/admin.rb
+++ b/hbase-shell/src/main/ruby/hbase/admin.rb
@@ -1789,6 +1789,17 @@ module Hbase
       end
     end
 
+    #----------------------------------------------------------------------------------------------
+    # Change table's sft
+    def modify_table_sft(tableName, sft)
+      @admin.modifyTableStoreFileTracker(tableName, sft)
+    end
+
+     #----------------------------------------------------------------------------------------------
+    # Change table column family's sft
+    def modify_table_family_sft(tableName, family_bytes, sft)
+      @admin.modifyColumnFamilyStoreFileTracker(tableName, family_bytes, sft)
+    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 a4bf490..8b6c4f6 100644
--- a/hbase-shell/src/main/ruby/shell.rb
+++ b/hbase-shell/src/main/ruby/shell.rb
@@ -624,3 +624,12 @@ Shell.load_command_group(
     get_namespace_rsgroup
   ]
 )
+
+Shell.load_command_group(
+  'storefiletracker',
+  full_name: 'StoreFileTracker',
+  commands: %w[
+    change_sft
+    change_sft_all
+  ]
+)
diff --git a/hbase-shell/src/main/ruby/shell/commands/change_sft.rb b/hbase-shell/src/main/ruby/shell/commands/change_sft.rb
new file mode 100644
index 0000000..eb96f42
--- /dev/null
+++ b/hbase-shell/src/main/ruby/shell/commands/change_sft.rb
@@ -0,0 +1,50 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+module Shell
+  module Commands
+    class ChangeSft < Command
+      def help
+        <<-EOF
+Change table's or table column family's sft. Examples:
+
+  hbase> change_sft 't1','FILE'
+  hbase> change_sft 't2','cf1','FILE'
+EOF
+      end
+
+      def command(*args)
+        arg_length = args.length
+        if arg_length == 2
+          tableName = TableName.valueOf(args[0])
+          sft = args[1]
+          admin.modify_table_sft(tableName, sft)
+        elsif arg_length == 3
+          tableName = TableName.valueOf(args[0])
+          family = args[1]
+          family_bytes = family.to_java_bytes
+          sft = args[2]
+          admin.modify_table_family_sft(tableName, family_bytes, sft)
+        else
+          raise(ArgumentError, 'Argument length should be two or three.')
+        end
+      end
+    end
+  end
+end
diff --git a/hbase-shell/src/main/ruby/shell/commands/change_sft_all.rb b/hbase-shell/src/main/ruby/shell/commands/change_sft_all.rb
new file mode 100644
index 0000000..6e34819
--- /dev/null
+++ b/hbase-shell/src/main/ruby/shell/commands/change_sft_all.rb
@@ -0,0 +1,58 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+module Shell
+  module Commands
+    class ChangeSftAll < Command
+      def help
+        <<-EOF
+Change all of the tables's sft matching the given regex:
+
+  hbase> change_sft_all 't.*','FILE'
+  hbase> change_sft_all 'ns:.*','FILE'
+  hbase> change_sft_all 'ns:t.*','FILE'
+EOF
+      end
+
+      def command(*args)
+        arg_length = args.length
+        if arg_length == 2
+          tableRegex = args[0]
+          tableList = admin.list(tableRegex)
+          count = tableList.size
+          sft = args[1]
+          tableList.each do |table|
+            formatter.row([table])
+          end
+          puts "\nChange the above #{count} tables's sft (y/n)?" unless count == 0
+          answer = 'n'
+          answer = gets.chomp unless count == 0
+          puts "No tables matched the regex #{tableRegex}" if count == 0
+          return unless answer =~ /y.*/i
+          tableList.each do |table|
+            tableName = TableName.valueOf(table)
+            admin.modify_table_sft(tableName, sft)
+          end
+        else
+          raise(ArgumentError, 'Argument length should be two.')
+        end
+      end
+    end
+  end
+end
diff --git a/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestChangeSftShell.java b/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestChangeSftShell.java
new file mode 100644
index 0000000..5e96e27
--- /dev/null
+++ b/hbase-shell/src/test/java/org/apache/hadoop/hbase/client/TestChangeSftShell.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.client;
+
+import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.testclassification.ClientTests;
+import org.apache.hadoop.hbase.testclassification.LargeTests;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.experimental.categories.Category;
+
+@Category({ ClientTests.class, LargeTests.class })
+public class TestChangeSftShell extends AbstractTestShell {
+  @ClassRule
+  public static final HBaseClassTestRule CLASS_RULE =
+    HBaseClassTestRule.forClass(TestChangeSftShell.class);
+
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+    setUpConfig();
+
+    TEST_UTIL.startMiniCluster(3);
+
+    setUpJRubyRuntime();
+  }
+
+  @Override
+  protected String getIncludeList() {
+    return "sftchange_shell_test.rb";
+  }
+}
diff --git a/hbase-shell/src/test/ruby/shell/sftchange_shell_test.rb b/hbase-shell/src/test/ruby/shell/sftchange_shell_test.rb
new file mode 100644
index 0000000..220b624
--- /dev/null
+++ b/hbase-shell/src/test/ruby/shell/sftchange_shell_test.rb
@@ -0,0 +1,56 @@
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'hbase_constants'
+require 'hbase_shell'
+
+class SftChangeTest < Test::Unit::TestCase
+  def setup
+    @hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration)
+    @shell = Shell::Shell.new(@hbase)
+    connection = $TEST_CLUSTER.getConnection
+    @admin = connection.getAdmin
+  end
+
+  define_test "Change table's sft" do
+    table = 'test_table1'
+    family = 'f1'
+    change_sft = 'FILE'
+    @shell.command('create', table, family)
+    @shell.command('change_sft', table, change_sft)
+    table_sft =  @admin.getDescriptor(TableName.valueOf(table)).getValue('hbase.store.file-tracker.impl')
+    assert_equal(change_sft, table_sft)
+    @shell.command(:disable, table)
+    @shell.command(:drop, table)
+  end
+
+  define_test "Change table column family's sft" do
+    table = 'test_table2'
+    family = 'f1'
+    change_sft = 'FILE'
+    @shell.command('create', table, family)
+    @shell.command('change_sft', table, family, change_sft)
+    family_bytes = family.to_java_bytes
+    cfd =  @admin.getDescriptor(TableName.valueOf(table)).getColumnFamily(family_bytes)
+    table_family_sft = cfd.getConfigurationValue('hbase.store.file-tracker.impl')
+    assert_equal(change_sft, table_family_sft)
+    @shell.command(:disable, table)
+    @shell.command(:drop, table)
+  end
+end