Skip to content

Commit f626df5

Browse files
author
Huaxiang Sun
committed
HBASE-27250 MasterRpcService#setRegionStateInMeta does not support replica region encodedNames or region names
1 parent 9ba868d commit f626df5

4 files changed

Lines changed: 40 additions & 16 deletions

File tree

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.concurrent.ThreadLocalRandom;
3333
import java.util.stream.Collectors;
3434
import org.apache.hadoop.conf.Configuration;
35+
import org.apache.hadoop.hbase.CatalogFamilyFormat;
3536
import org.apache.hadoop.hbase.ClusterMetricsBuilder;
3637
import org.apache.hadoop.hbase.DoNotRetryIOException;
3738
import org.apache.hadoop.hbase.HBaseRpcServicesBase;
@@ -49,6 +50,7 @@
4950
import org.apache.hadoop.hbase.client.NormalizeTableFilterParams;
5051
import org.apache.hadoop.hbase.client.Put;
5152
import org.apache.hadoop.hbase.client.RegionInfo;
53+
import org.apache.hadoop.hbase.client.RegionInfoBuilder;
5254
import org.apache.hadoop.hbase.client.Table;
5355
import org.apache.hadoop.hbase.client.TableDescriptor;
5456
import org.apache.hadoop.hbase.client.TableState;
@@ -2479,30 +2481,41 @@ public SetRegionStateInMetaResponse setRegionStateInMeta(RpcController controlle
24792481
for (RegionSpecifierAndState s : request.getStatesList()) {
24802482
RegionSpecifier spec = s.getRegionSpecifier();
24812483
String encodedName;
2484+
RegionInfo info;
2485+
int replicaId;
24822486
if (spec.getType() == RegionSpecifierType.ENCODED_REGION_NAME) {
2483-
encodedName = spec.getValue().toStringUtf8();
2487+
info = this.server.getAssignmentManager().getRegionInfoFromEncodedRegionName(
2488+
spec.getValue().toStringUtf8());
24842489
} else {
24852490
// TODO: actually, a full region name can save a lot on meta scan, improve later.
2486-
encodedName = RegionInfo.encodeRegionName(spec.getValue().toByteArray());
2491+
info = CatalogFamilyFormat.parseRegionInfoFromRegionName(spec.getValue().toByteArray());
24872492
}
2488-
RegionInfo info = this.server.getAssignmentManager().loadRegionFromMeta(encodedName);
2489-
LOG.trace("region info loaded from meta table: {}", info);
2493+
replicaId = info.getReplicaId();
2494+
LOG.trace("region info", info);
24902495
RegionState prevState =
24912496
this.server.getAssignmentManager().getRegionStates().getRegionState(info);
24922497
RegionState.State newState = RegionState.State.convert(s.getState());
24932498
LOG.info("{} set region={} state from {} to {}", server.getClientIdAuditPrefix(), info,
24942499
prevState.getState(), newState);
2495-
Put metaPut =
2496-
MetaTableAccessor.makePutFromRegionInfo(info, EnvironmentEdgeManager.currentTime());
2497-
metaPut.addColumn(HConstants.CATALOG_FAMILY, HConstants.STATE_QUALIFIER,
2498-
Bytes.toBytes(newState.name()));
2499-
List<Put> putList = new ArrayList<>();
2500-
putList.add(metaPut);
2501-
MetaTableAccessor.putsToMetaTable(this.server.getConnection(), putList);
2502-
// Loads from meta again to refresh AM cache with the new region state
2503-
this.server.getAssignmentManager().loadRegionFromMeta(encodedName);
2504-
builder.addStates(RegionSpecifierAndState.newBuilder().setRegionSpecifier(spec)
2505-
.setState(prevState.getState().convert()));
2500+
// If state does not change, no need to set.
2501+
if (prevState.getState() != newState) {
2502+
if (replicaId > RegionInfo.DEFAULT_REPLICA_ID) {
2503+
// If it is a non-primary replica region, use primary region as the key.
2504+
info = RegionInfoBuilder.newBuilder(info).setReplicaId(RegionInfo.DEFAULT_REPLICA_ID).
2505+
build();
2506+
}
2507+
Put metaPut = new Put(info.getRegionName());
2508+
metaPut.addColumn(HConstants.CATALOG_FAMILY,
2509+
CatalogFamilyFormat.getRegionStateColumn(replicaId),
2510+
Bytes.toBytes(newState.name()));
2511+
List<Put> putList = new ArrayList<>();
2512+
putList.add(metaPut);
2513+
MetaTableAccessor.putsToMetaTable(this.server.getConnection(), putList);
2514+
// Loads from meta again to refresh AM cache with the new region state
2515+
this.server.getAssignmentManager().loadRegionFromMeta(info.getEncodedName());
2516+
builder.addStates(RegionSpecifierAndState.newBuilder().setRegionSpecifier(spec).
2517+
setState(prevState.getState().convert()));
2518+
}
25062519
}
25072520
} catch (Exception e) {
25082521
throw new ServiceException(e);

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,12 @@ public RegionInfo getRegionInfo(final byte[] regionName) {
18841884
return regionState != null ? regionState.getRegionInfo() : null;
18851885
}
18861886

1887+
public RegionInfo getRegionInfoFromEncodedRegionName(final String encodedRegionName) {
1888+
final RegionStateNode regionState =
1889+
regionStates.getRegionStateNodeFromEncodedRegionName(encodedRegionName);
1890+
return regionState != null ? regionState.getRegionInfo() : null;
1891+
}
1892+
18871893
// ============================================================================================
18881894
// Expected states on region state transition.
18891895
// Notice that there is expected states for transiting to OPENING state, this is because SCP.

hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStates.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ public RegionStateNode getRegionStateNodeFromName(byte[] regionName) {
144144
return regionsMap.get(regionName);
145145
}
146146

147+
public RegionStateNode getRegionStateNodeFromEncodedRegionName(final String encodedRegionName) {
148+
return encodedRegionsMap.get(encodedRegionName);
149+
}
150+
147151
public RegionStateNode getRegionStateNode(RegionInfo regionInfo) {
148152
return getRegionStateNodeFromName(regionInfo.getRegionName());
149153
}

hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHbck.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ private Hbck getHbck() throws Exception {
117117
@BeforeClass
118118
public static void setUpBeforeClass() throws Exception {
119119
TEST_UTIL.startMiniCluster(3);
120-
TEST_UTIL.createMultiRegionTable(TABLE_NAME, Bytes.toBytes("family1"), 5);
120+
TEST_UTIL.createMultiRegionTable(TABLE_NAME, 3,
121+
new byte[][] {Bytes.toBytes("family1")});
121122
procExec = TEST_UTIL.getMiniHBaseCluster().getMaster().getMasterProcedureExecutor();
122123
ASYNC_CONN = ConnectionFactory.createAsyncConnection(TEST_UTIL.getConfiguration()).get();
123124
TEST_UTIL.getHBaseCluster().getMaster().getMasterCoprocessorHost().load(

0 commit comments

Comments
 (0)