[
https://issues.apache.org/jira/browse/HBASE-27246?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Yutong Xiao updated HBASE-27246:
--------------------------------
Description:
We are using version 1.4.12 and met a problem in table creation phase some
time. The error message is:
{code:java}
2022-07-26 19:26:20.122 [http-nio-8078-exec-24,d2ad4b13b542b6fb] ERROR
HBaseServiceImpl - hbase create table: xxx:xxxx failed.
(HBaseServiceImpl.java:116)
java.lang.RuntimeException:
org.apache.hadoop.hbase.constraint.ConstraintException:
org.apache.hadoop.hbase.constraint.ConstraintException: Default RSGroup (default
default) for this table's namespace does not exist.
{code}
The rsgroup here should be one 'default' but not two consecutive 'default'.
The code to get RSGroup from a mapping script is:
{code:java}
String getRSGroup(String namespace, String tablename) {
if (rsgroupMappingScript == null) {
return null;
}
String[] exec = rsgroupMappingScript.getExecString();
exec[1] = namespace;
exec[2] = tablename;
try {
rsgroupMappingScript.execute();
} catch (IOException e) {
// This exception may happen, like process doesn't have permission to
run this script.
LOG.error("{}, placing {} back to default rsgroup", e.getMessage(),
TableName.valueOf(namespace, tablename));
return RSGroupInfo.DEFAULT_GROUP;
}
return rsgroupMappingScript.getOutput().trim();
}
{code}
here the rsgourpMappingScript could be executed by multi-threads.
To test it is a multi-thread issue, I ran a piece of code locally and found
that the hadoop ShellCommandExecutor is not thread-safe (I run the code with
hadoop 2.10.0 and 3.3.2). So that we should make this method synchronized.
The test code is attached and my rsgroup mapping script is very simple:
{code:java}
#!/bin/bash
namespace=$1
tablename=$2
echo default
{code}
The reproduced screenshot is also attached.
was:
We are using version 1.4.12 and met a problem in table creation phase some
time. The error message is:
{code:java}
2022-07-26 19:26:20.122 [http-nio-8078-exec-24,d2ad4b13b542b6fb] ERROR
HBaseServiceImpl - hbase create table: xxx:xxxx failed.
(HBaseServiceImpl.java:116)
java.lang.RuntimeException:
org.apache.hadoop.hbase.constraint.ConstraintException:
org.apache.hadoop.hbase.constraint.ConstraintException: Default RSGroup (default
default) for this table's namespace does not exist.
{code}
The rsgroup here should be one 'default' but not two consecutive 'default'.
The code to get RSGroup from a mapping script is:
{code:java}
String getRSGroup(String namespace, String tablename) {
if (rsgroupMappingScript == null) {
return null;
}
String[] exec = rsgroupMappingScript.getExecString();
exec[1] = namespace;
exec[2] = tablename;
try {
rsgroupMappingScript.execute();
} catch (IOException e) {
// This exception may happen, like process doesn't have permission to
run this script.
LOG.error("{}, placing {} back to default rsgroup", e.getMessage(),
TableName.valueOf(namespace, tablename));
return RSGroupInfo.DEFAULT_GROUP;
}
return rsgroupMappingScript.getOutput().trim();
}
{code}
here the rsgourpMappingScript could be executed by multi-threads.
To test it is a multi-thread issue, I ran a piece of code locally and found
that the hadoop ShellCommandExecutor is not thread-safe (I run the code with
hadoop 2.10.0 and 3.3.2). So that we should make this method synchronized.
> RSGroupMappingScript#getRSGroup should be synchronised
> ------------------------------------------------------
>
> Key: HBASE-27246
> URL: https://issues.apache.org/jira/browse/HBASE-27246
> Project: HBase
> Issue Type: Bug
> Reporter: Yutong Xiao
> Assignee: Yutong Xiao
> Priority: Major
> Attachments: Test.java, result.png
>
>
> We are using version 1.4.12 and met a problem in table creation phase some
> time. The error message is:
> {code:java}
> 2022-07-26 19:26:20.122 [http-nio-8078-exec-24,d2ad4b13b542b6fb] ERROR
> HBaseServiceImpl - hbase create table: xxx:xxxx failed.
> (HBaseServiceImpl.java:116)
> java.lang.RuntimeException:
> org.apache.hadoop.hbase.constraint.ConstraintException:
> org.apache.hadoop.hbase.constraint.ConstraintException: Default RSGroup
> (default
> default) for this table's namespace does not exist.
> {code}
> The rsgroup here should be one 'default' but not two consecutive 'default'.
> The code to get RSGroup from a mapping script is:
> {code:java}
> String getRSGroup(String namespace, String tablename) {
> if (rsgroupMappingScript == null) {
> return null;
> }
> String[] exec = rsgroupMappingScript.getExecString();
> exec[1] = namespace;
> exec[2] = tablename;
> try {
> rsgroupMappingScript.execute();
> } catch (IOException e) {
> // This exception may happen, like process doesn't have permission to
> run this script.
> LOG.error("{}, placing {} back to default rsgroup", e.getMessage(),
> TableName.valueOf(namespace, tablename));
> return RSGroupInfo.DEFAULT_GROUP;
> }
> return rsgroupMappingScript.getOutput().trim();
> }
> {code}
> here the rsgourpMappingScript could be executed by multi-threads.
> To test it is a multi-thread issue, I ran a piece of code locally and found
> that the hadoop ShellCommandExecutor is not thread-safe (I run the code with
> hadoop 2.10.0 and 3.3.2). So that we should make this method synchronized.
> The test code is attached and my rsgroup mapping script is very simple:
> {code:java}
> #!/bin/bash
> namespace=$1
> tablename=$2
> echo default
> {code}
> The reproduced screenshot is also attached.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)