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 15:02:13 UTC
[hbase] branch master 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 master
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/master by this push:
new 55ea2ef HBASE-26673 Implement a shell command for change SFT implementation (#4113)
55ea2ef is described below
commit 55ea2ef3aa2b844399f3fb125a4f4a3d13624737
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 | 12 +++++
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, 231 insertions(+)
diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb
index 9604cd8..84c9d7d 100644
--- a/hbase-shell/src/main/ruby/hbase/admin.rb
+++ b/hbase-shell/src/main/ruby/hbase/admin.rb
@@ -1858,6 +1858,18 @@ module Hbase
java.util.Arrays.asList(server_names)
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 ba7481e..2c553d2 100644
--- a/hbase-shell/src/main/ruby/shell.rb
+++ b/hbase-shell/src/main/ruby/shell.rb
@@ -625,3 +625,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