HBASE-25147 : Serialize regionNames in ReopenTableRegionsProcedure

Closes #2494

Signed-off-by: Duo Zhang <zhangduo@apache.org>
This commit is contained in:
Viraj Jasani 2020-10-05 15:37:34 +05:30
parent a04baf5a64
commit 283bb52f7e
No known key found for this signature in database
GPG Key ID: B3D6C0B41C8ADFD5
2 changed files with 22 additions and 3 deletions

View File

@ -465,6 +465,7 @@ enum ReopenTableRegionsState {
message ReopenTableRegionsStateData { message ReopenTableRegionsStateData {
required TableName table_name = 1; required TableName table_name = 1;
repeated RegionLocation region = 2; repeated RegionLocation region = 2;
repeated bytes region_names = 3;
} }
enum InitMetaState { enum InitMetaState {

View File

@ -36,6 +36,7 @@ import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.apache.hbase.thirdparty.com.google.protobuf.ByteString;
import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils; import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils;
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
@ -56,19 +57,19 @@ public class ReopenTableRegionsProcedure
// Specify specific regions of a table to reopen. // Specify specific regions of a table to reopen.
// if specified null, all regions of the table will be reopened. // if specified null, all regions of the table will be reopened.
private final List<byte[]> regionNames; private List<byte[]> regionNames;
private List<HRegionLocation> regions = Collections.emptyList(); private List<HRegionLocation> regions = Collections.emptyList();
private RetryCounter retryCounter; private RetryCounter retryCounter;
public ReopenTableRegionsProcedure() { public ReopenTableRegionsProcedure() {
regionNames = null; regionNames = Collections.emptyList();
} }
public ReopenTableRegionsProcedure(TableName tableName) { public ReopenTableRegionsProcedure(TableName tableName) {
this.tableName = tableName; this.tableName = tableName;
this.regionNames = null; this.regionNames = Collections.emptyList();
} }
public ReopenTableRegionsProcedure(final TableName tableName, public ReopenTableRegionsProcedure(final TableName tableName,
@ -223,6 +224,17 @@ public class ReopenTableRegionsProcedure
ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder() ReopenTableRegionsStateData.Builder builder = ReopenTableRegionsStateData.newBuilder()
.setTableName(ProtobufUtil.toProtoTableName(tableName)); .setTableName(ProtobufUtil.toProtoTableName(tableName));
regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion); regions.stream().map(ProtobufUtil::toRegionLocation).forEachOrdered(builder::addRegion);
if (CollectionUtils.isNotEmpty(regionNames)) {
// As of this writing, wrapping this statement withing if condition is only required
// for backward compatibility as we used to have 'regionNames' as null for cases
// where all regions of given table should be reopened. Now, we have kept emptyList()
// for 'regionNames' to indicate all regions of given table should be reopened unless
// 'regionNames' contains at least one specific region, in which case only list of regions
// that 'regionNames' contain should be reopened, not all regions of given table.
// Now, we don't need this check since we are not dealing with null 'regionNames' and hence,
// guarding by this if condition can be removed in HBase 4.0.0.
regionNames.stream().map(ByteString::copyFrom).forEachOrdered(builder::addRegionNames);
}
serializer.serialize(builder.build()); serializer.serialize(builder.build());
} }
@ -233,5 +245,11 @@ public class ReopenTableRegionsProcedure
tableName = ProtobufUtil.toTableName(data.getTableName()); tableName = ProtobufUtil.toTableName(data.getTableName());
regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation) regions = data.getRegionList().stream().map(ProtobufUtil::toRegionLocation)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(data.getRegionNamesList())) {
regionNames = data.getRegionNamesList().stream().map(ByteString::toByteArray)
.collect(Collectors.toList());
} else {
regionNames = Collections.emptyList();
}
} }
} }