HBASE-25323 Fix potential NPE when the zookeeper path of RegionServerTracker does not exist when start (#2702)
Signed-off-by: Duo Zhang <zhangduo@apache.org> Signed-off-by: Guanghao Zhang <zghao@apache.org>
This commit is contained in:
parent
31d880b5dd
commit
984d578dd4
|
@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.master;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -35,6 +36,7 @@ import org.apache.hadoop.hbase.zookeeper.ZKListener;
|
||||||
import org.apache.hadoop.hbase.zookeeper.ZKUtil;
|
import org.apache.hadoop.hbase.zookeeper.ZKUtil;
|
||||||
import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
|
import org.apache.hadoop.hbase.zookeeper.ZKWatcher;
|
||||||
import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
|
import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
|
||||||
|
import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.yetus.audience.InterfaceAudience;
|
import org.apache.yetus.audience.InterfaceAudience;
|
||||||
import org.apache.zookeeper.KeeperException;
|
import org.apache.zookeeper.KeeperException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -129,21 +131,24 @@ public class RegionServerTracker extends ZKListener {
|
||||||
splittingServersFromWALDir.stream().filter(s -> !deadServersFromPE.contains(s)).
|
splittingServersFromWALDir.stream().filter(s -> !deadServersFromPE.contains(s)).
|
||||||
forEach(s -> LOG.error("{} has no matching ServerCrashProcedure", s));
|
forEach(s -> LOG.error("{} has no matching ServerCrashProcedure", s));
|
||||||
//create ServerNode for all possible live servers from wal directory
|
//create ServerNode for all possible live servers from wal directory
|
||||||
liveServersFromWALDir.stream()
|
liveServersFromWALDir
|
||||||
.forEach(sn -> server.getAssignmentManager().getRegionStates().getOrCreateServer(sn));
|
.forEach(sn -> server.getAssignmentManager().getRegionStates().getOrCreateServer(sn));
|
||||||
watcher.registerListener(this);
|
watcher.registerListener(this);
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
List<String> servers =
|
List<String> servers =
|
||||||
ZKUtil.listChildrenAndWatchForNewChildren(watcher, watcher.getZNodePaths().rsZNode);
|
ZKUtil.listChildrenAndWatchForNewChildren(watcher, watcher.getZNodePaths().rsZNode);
|
||||||
for (String n : servers) {
|
if (null != servers) {
|
||||||
Pair<ServerName, RegionServerInfo> pair = getServerInfo(n);
|
for (String n : servers) {
|
||||||
ServerName serverName = pair.getFirst();
|
Pair<ServerName, RegionServerInfo> pair = getServerInfo(n);
|
||||||
RegionServerInfo info = pair.getSecond();
|
ServerName serverName = pair.getFirst();
|
||||||
regionServers.add(serverName);
|
RegionServerInfo info = pair.getSecond();
|
||||||
ServerMetrics serverMetrics = info != null ? ServerMetricsBuilder.of(serverName,
|
regionServers.add(serverName);
|
||||||
VersionInfoUtil.getVersionNumber(info.getVersionInfo()),
|
ServerMetrics serverMetrics = info != null ?
|
||||||
info.getVersionInfo().getVersion()) : ServerMetricsBuilder.of(serverName);
|
ServerMetricsBuilder.of(serverName, VersionInfoUtil.getVersionNumber(info.getVersionInfo()),
|
||||||
serverManager.checkAndRecordNewServer(serverName, serverMetrics);
|
info.getVersionInfo().getVersion()) :
|
||||||
|
ServerMetricsBuilder.of(serverName);
|
||||||
|
serverManager.checkAndRecordNewServer(serverName, serverMetrics);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
serverManager.findDeadServersAndProcess(deadServersFromPE, liveServersFromWALDir);
|
serverManager.findDeadServersAndProcess(deadServersFromPE, liveServersFromWALDir);
|
||||||
}
|
}
|
||||||
|
@ -163,8 +168,9 @@ public class RegionServerTracker extends ZKListener {
|
||||||
server.abort("Unexpected zk exception getting RS nodes", e);
|
server.abort("Unexpected zk exception getting RS nodes", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Set<ServerName> servers =
|
Set<ServerName> servers = CollectionUtils.isEmpty(names) ? Collections.emptySet() :
|
||||||
names.stream().map(ServerName::parseServerName).collect(Collectors.toSet());
|
names.stream().map(ServerName::parseServerName).collect(Collectors.toSet());
|
||||||
|
|
||||||
for (Iterator<ServerName> iter = regionServers.iterator(); iter.hasNext();) {
|
for (Iterator<ServerName> iter = regionServers.iterator(); iter.hasNext();) {
|
||||||
ServerName sn = iter.next();
|
ServerName sn = iter.next();
|
||||||
if (!servers.contains(sn)) {
|
if (!servers.contains(sn)) {
|
||||||
|
|
|
@ -297,7 +297,7 @@ public class MasterAddressTracker extends ZKNodeTracker {
|
||||||
public static List<ServerName> getBackupMastersAndRenewWatch(
|
public static List<ServerName> getBackupMastersAndRenewWatch(
|
||||||
ZKWatcher zkw) throws InterruptedIOException {
|
ZKWatcher zkw) throws InterruptedIOException {
|
||||||
// Build Set of backup masters from ZK nodes
|
// Build Set of backup masters from ZK nodes
|
||||||
List<String> backupMasterStrings = Collections.emptyList();
|
List<String> backupMasterStrings = null;
|
||||||
try {
|
try {
|
||||||
backupMasterStrings = ZKUtil.listChildrenAndWatchForNewChildren(zkw,
|
backupMasterStrings = ZKUtil.listChildrenAndWatchForNewChildren(zkw,
|
||||||
zkw.getZNodePaths().backupMasterAddressesZNode);
|
zkw.getZNodePaths().backupMasterAddressesZNode);
|
||||||
|
|
|
@ -445,16 +445,15 @@ public final class ZKUtil {
|
||||||
} catch(KeeperException.NoNodeException ke) {
|
} catch(KeeperException.NoNodeException ke) {
|
||||||
LOG.debug(zkw.prefix("Unable to list children of znode " + znode + " " +
|
LOG.debug(zkw.prefix("Unable to list children of znode " + znode + " " +
|
||||||
"because node does not exist (not an error)"));
|
"because node does not exist (not an error)"));
|
||||||
return null;
|
|
||||||
} catch (KeeperException e) {
|
} catch (KeeperException e) {
|
||||||
LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);
|
LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);
|
||||||
zkw.keeperException(e);
|
zkw.keeperException(e);
|
||||||
return null;
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);
|
LOG.warn(zkw.prefix("Unable to list children of znode " + znode + " "), e);
|
||||||
zkw.interruptedException(e);
|
zkw.interruptedException(e);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue