HBASE-22236 AsyncNonMetaRegionLocator should not cache HRegionLocation with null location

This commit is contained in:
zhangduo 2019-04-20 07:55:34 +08:00
parent 5b01e613fb
commit 353f9226c3
3 changed files with 22 additions and 2 deletions

View File

@ -19,7 +19,6 @@
package org.apache.hadoop.hbase; package org.apache.hadoop.hbase;
import java.util.Collection; import java.util.Collection;
import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.client.RegionReplicaUtil;
import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Bytes;
@ -185,6 +184,22 @@ public class RegionLocations {
return new RegionLocations(newLocations); return new RegionLocations(newLocations);
} }
/**
* Set the element to null if its getServerName method returns null. Returns null if all the
* elements are removed.
*/
public RegionLocations removeElementsWithNullLocation() {
HRegionLocation[] newLocations = new HRegionLocation[locations.length];
boolean hasNonNullElement = false;
for (int i = 0; i < locations.length; i++) {
if (locations[i] != null && locations[i].getServerName() != null) {
hasNonNullElement = true;
newLocations[i] = locations[i];
}
}
return hasNonNullElement ? new RegionLocations(newLocations) : null;
}
/** /**
* Merges this RegionLocations list with the given list assuming * Merges this RegionLocations list with the given list assuming
* same range, and keeping the most up to date version of the * same range, and keeping the most up to date version of the

View File

@ -314,6 +314,10 @@ class AsyncNonMetaRegionLocator {
LOG.debug("The fetched location of '{}', row='{}', locateType={} is {}", tableName, LOG.debug("The fetched location of '{}', row='{}', locateType={} is {}", tableName,
Bytes.toStringBinary(req.row), req.locateType, locs); Bytes.toStringBinary(req.row), req.locateType, locs);
} }
// remove HRegionLocation with null location, i.e, getServerName returns null.
if (locs != null) {
locs = locs.removeElementsWithNullLocation();
}
// the default region location should always be presented when fetching from meta, otherwise // the default region location should always be presented when fetching from meta, otherwise
// let's fail the request. // let's fail the request.

View File

@ -76,7 +76,8 @@ final class AsyncRegionLocatorHelper {
RegionMovedException rme = (RegionMovedException) cause; RegionMovedException rme = (RegionMovedException) cause;
HRegionLocation newLoc = HRegionLocation newLoc =
new HRegionLocation(loc.getRegion(), rme.getServerName(), rme.getLocationSeqNum()); new HRegionLocation(loc.getRegion(), rme.getServerName(), rme.getLocationSeqNum());
LOG.debug("Try updating {} with the new location {} constructed by {}", loc, newLoc, rme); LOG.debug("Try updating {} with the new location {} constructed by {}", loc, newLoc,
rme.toString());
addToCache.accept(newLoc); addToCache.accept(newLoc);
} else { } else {
LOG.debug("Try removing {} from cache", loc); LOG.debug("Try removing {} from cache", loc);