diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java index 1e8b98a..5afe172 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/NodesListManager.java @@ -29,6 +29,9 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.Map; import java.util.Iterator; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; +import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -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 Set unusableRMNodesConcurrentSet = Collections @@ -75,6 +80,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 @@ -141,7 +149,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(); } @@ -159,6 +168,8 @@ private void refreshHostsReader(Configuration yarnConf) throws IOException, : this.rmContext.getConfigurationProvider() .getConfigurationInputStream(this.conf, excludesFile)); printConfiguredHosts(); + } finally { + this.hostsWriteLock.unlock(); } } @@ -281,12 +292,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(); } }