in hbase-hbck2/src/main/java/org/apache/hbase/hbck1/HBaseFsck.java [4046:4138]
boolean loadMetaEntries() throws IOException {
List<RegionInfo> result = null;
Function<Result, RegionInfo> visitor = new Function<Result, RegionInfo>() {
int countRecord = 1;
// comparator to sort KeyValues with latest modtime
final Comparator<Cell> comp = new Comparator<Cell>() {
@Override
public int compare(Cell k1, Cell k2) {
return Long.compare(k1.getTimestamp(), k2.getTimestamp());
}
};
@Override
public RegionInfo apply(Result result) {
try {
// record the latest modification of this META record
long ts = Collections.max(result.listCells(), comp).getTimestamp();
RegionLocations rl = HBCKMetaTableAccessor.getRegionLocations(result);
if (rl == null) {
emptyRegionInfoQualifiers.add(result);
errors.reportError(ErrorReporter.ERROR_CODE.EMPTY_META_CELL,
"Empty REGIONINFO_QUALIFIER found in hbase:meta");
return null;
}
ServerName sn = null;
if (rl.getRegionLocation(RegionInfo.DEFAULT_REPLICA_ID) == null ||
rl.getRegionLocation(RegionInfo.DEFAULT_REPLICA_ID).getRegion() == null) {
emptyRegionInfoQualifiers.add(result);
errors.reportError(ErrorReporter.ERROR_CODE.EMPTY_META_CELL,
"Empty REGIONINFO_QUALIFIER found in hbase:meta");
return null;
}
RegionInfo hri = rl.getRegionLocation(RegionInfo.DEFAULT_REPLICA_ID).getRegion();
if (!(isTableIncluded(hri.getTable())
|| hri.isMetaRegion())) {
return hri;
}
PairOfSameType<RegionInfo> daughters = HBCKMetaTableAccessor.getDaughterRegions(result);
for (HRegionLocation h : rl.getRegionLocations()) {
if (h == null || h.getRegion() == null) {
continue;
}
sn = h.getServerName();
hri = h.getRegion();
MetaEntry m = null;
if (hri.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {
m = new MetaEntry(hri, sn, ts, daughters.getFirst(), daughters.getSecond());
} else {
m = new MetaEntry(hri, sn, ts, null, null);
}
HbckInfo previous = regionInfoMap.get(hri.getEncodedName());
if (previous == null) {
regionInfoMap.put(hri.getEncodedName(), new HbckInfo(m));
} else if (previous.metaEntry == null) {
previous.metaEntry = m;
} else {
LOG.error("Two entries in hbase:meta are same " + previous);
}
}
List<RegionInfo> mergeParents = HBCKMetaTableAccessor.getMergeRegions(result.rawCells());
if (mergeParents != null) {
for (RegionInfo mergeRegion : mergeParents) {
if (mergeRegion != null) {
// This region is already being merged
HbckInfo hbInfo = getOrCreateInfo(mergeRegion.getEncodedName());
hbInfo.setMerged(true);
}
}
}
// show proof of progress to the user, once for every 100 records.
if (countRecord % 100 == 0) {
errors.progress();
}
countRecord++;
return hri;
} catch (RuntimeException e) {
LOG.error("Result=" + result);
throw e;
}
}
};
if (!checkMetaOnly) {
// Scan hbase:meta to pick up user regions
final HBCKMetaTableAccessor.MetaScanner<RegionInfo> scanner =
new HBCKMetaTableAccessor.MetaScanner<>();
result = scanner.scanMeta(connection,
scan -> {},
visitor);
}
return !result.isEmpty();
}