diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java index ec2708e..067ba86 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java @@ -25,6 +25,9 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import java.util.Map; import java.util.Iterator; @@ -60,6 +63,8 @@ private static final Log LOG = LogFactory.getLog(NodesListManager.class); + private WriteLock hostsWriteLock; + private ReadLock hostsReadLock; private HostsFileReader hostsReader; private Configuration conf; private final RMContext rmContext; @@ -72,6 +77,9 @@ public NodesListManager(RMContext rmContext) { super(NodesListManager.class.getName()); this.rmContext = rmContext; + ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); + this.hostsWriteLock = rwLock.writeLock(); + this.hostsReadLock = rwLock.readLock(); } @Override @@ -139,7 +147,8 @@ public void refreshNodes(Configuration yarnConf) throws IOException, private void refreshHostsReader(Configuration yarnConf) throws IOException, YarnException { - synchronized (hostsReader) { + this.hostsWriteLock.lock(); + try { if (null == yarnConf) { yarnConf = new YarnConfiguration(); } @@ -157,6 +166,8 @@ private void refreshHostsReader(Configuration yarnConf) throws IOException, : this.rmContext.getConfigurationProvider() .getConfigurationInputStream(this.conf, excludesFile)); printConfiguredHosts(); + } finally { + this.hostsWriteLock.unlock(); } } @@ -285,12 +296,15 @@ public void run() { public boolean isValidNode(String hostName) { String ip = resolver.resolve(hostName); - synchronized (hostsReader) { + this.hostsReadLock.lock(); + try { Set hostsList = hostsReader.getHosts(); Set excludeList = hostsReader.getExcludedHosts(); return (hostsList.isEmpty() || hostsList.contains(hostName) || hostsList .contains(ip)) && !(excludeList.contains(hostName) || excludeList.contains(ip)); + } finally { + this.hostsReadLock.unlock(); } }