HBASE-22328 NPE in RegionReplicaReplicationEndpoint

This commit is contained in:
Duo Zhang 2019-04-30 16:33:58 +08:00 committed by zhangduo
parent 6855d58379
commit a95eb6559d
1 changed files with 8 additions and 6 deletions

View File

@ -151,21 +151,23 @@ public class RegionReplicaReplicationEndpoint extends HBaseReplicationEndpoint {
private void getRegionLocations(CompletableFuture<RegionLocations> future,
TableDescriptor tableDesc, byte[] encodedRegionName, byte[] row, boolean reload) {
FutureUtils.addListener(connection.getRegionLocations(tableDesc.getTableName(), row, reload),
(r, e) -> {
(locs, e) -> {
if (e != null) {
future.completeExceptionally(e);
return;
}
// if we are not loading from cache, just return
if (reload) {
future.complete(r);
future.complete(locs);
return;
}
// check if the number of region replicas is correct, and also the primary region name
// matches
if (r.size() == tableDesc.getRegionReplication() && Bytes.equals(
r.getDefaultRegionLocation().getRegion().getEncodedNameAsBytes(), encodedRegionName)) {
future.complete(r);
// matches, and also there is no null elements in the returned RegionLocations
if (locs.size() == tableDesc.getRegionReplication() &&
locs.size() == locs.numNonNullElements() &&
Bytes.equals(locs.getDefaultRegionLocation().getRegion().getEncodedNameAsBytes(),
encodedRegionName)) {
future.complete(locs);
} else {
// reload again as the information in cache maybe stale
getRegionLocations(future, tableDesc, encodedRegionName, row, true);