You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rn...@apache.org on 2015/08/14 00:28:34 UTC

ambari git commit: AMBARI-12720. Blueprint Logical Request stuck in waiting mode during large cluster deployments. (rnettleton)

Repository: ambari
Updated Branches:
  refs/heads/branch-2.1 18cb5c7a8 -> 28ca38a0f


AMBARI-12720. Blueprint Logical Request stuck in waiting mode during large cluster deployments. (rnettleton)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/28ca38a0
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/28ca38a0
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/28ca38a0

Branch: refs/heads/branch-2.1
Commit: 28ca38a0fab7ce0583f8671829f70f3b9ee8765a
Parents: 18cb5c7
Author: Bob Nettleton <rn...@hortonworks.com>
Authored: Thu Aug 13 18:27:40 2015 -0400
Committer: Bob Nettleton <rn...@hortonworks.com>
Committed: Thu Aug 13 18:27:40 2015 -0400

----------------------------------------------------------------------
 .../ambari/server/topology/TopologyManager.java | 77 +++++++++++---------
 1 file changed, 42 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/28ca38a0/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
index 8e7fb7f..5f3bb9d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/topology/TopologyManager.java
@@ -150,47 +150,49 @@ public class TopologyManager {
 
     boolean matchedToRequest = false;
     String hostName = host.getHostName();
-    synchronized(reservedHosts) {
-      if (reservedHosts.containsKey(hostName)) {
-        LogicalRequest request = reservedHosts.remove(hostName);
-        HostOfferResponse response = request.offer(host);
-        if (response.getAnswer() != HostOfferResponse.Answer.ACCEPTED) {
-          throw new RuntimeException("LogicalRequest declined host offer of explicitly requested host: " + hostName);
-        }
+    // The lock ordering in this method must always be the same ordering as TopologyManager.processRequest
+    // TODO: Locking strategies for TopologyManager should be reviewed and possibly rewritten in a future release
+    synchronized (availableHosts) {
+      synchronized(reservedHosts) {
+        if (reservedHosts.containsKey(hostName)) {
+          LogicalRequest request = reservedHosts.remove(hostName);
+          HostOfferResponse response = request.offer(host);
+          if (response.getAnswer() != HostOfferResponse.Answer.ACCEPTED) {
+            throw new RuntimeException("LogicalRequest declined host offer of explicitly requested host: " + hostName);
+          }
 
-        LOG.info("TopologyManager.onHostRegistered: processing accepted host offer for reserved host = {}", hostName);
-        processAcceptedHostOffer(getClusterTopology(request.getClusterName()), response, host);
-        matchedToRequest = true;
+          LOG.info("TopologyManager.onHostRegistered: processing accepted host offer for reserved host = {}", hostName);
+          processAcceptedHostOffer(getClusterTopology(request.getClusterName()), response, host);
+          matchedToRequest = true;
+        }
       }
-    }
 
-    // can be true if host was reserved
-    if (! matchedToRequest) {
-      synchronized (outstandingRequests) {
-        Iterator<LogicalRequest> outstandingRequestIterator = outstandingRequests.iterator();
-        while (! matchedToRequest && outstandingRequestIterator.hasNext()) {
-          LogicalRequest request = outstandingRequestIterator.next();
-          HostOfferResponse hostOfferResponse = request.offer(host);
-          switch (hostOfferResponse.getAnswer()) {
-            case ACCEPTED:
-              matchedToRequest = true;
-              LOG.info("TopologyManager.onHostRegistered: processing accepted host offer for matched host = {}", hostName);
-              processAcceptedHostOffer(getClusterTopology(request.getClusterName()), hostOfferResponse, host);
-              break;
-            case DECLINED_DONE:
-              LOG.info("TopologyManager.onHostRegistered: DECLINED_DONE received for host = {}", hostName);
-              outstandingRequestIterator.remove();
-              break;
-            case DECLINED_PREDICATE:
-              LOG.info("TopologyManager.onHostRegistered: DECLINED_PREDICATE received for host = {}", hostName);
-              break;
+      // can be true if host was reserved
+      if (!matchedToRequest) {
+        synchronized (outstandingRequests) {
+          Iterator<LogicalRequest> outstandingRequestIterator = outstandingRequests.iterator();
+          while (!matchedToRequest && outstandingRequestIterator.hasNext()) {
+            LogicalRequest request = outstandingRequestIterator.next();
+            HostOfferResponse hostOfferResponse = request.offer(host);
+            switch (hostOfferResponse.getAnswer()) {
+              case ACCEPTED:
+                matchedToRequest = true;
+                LOG.info("TopologyManager.onHostRegistered: processing accepted host offer for matched host = {}", hostName);
+                processAcceptedHostOffer(getClusterTopology(request.getClusterName()), hostOfferResponse, host);
+                break;
+              case DECLINED_DONE:
+                LOG.info("TopologyManager.onHostRegistered: DECLINED_DONE received for host = {}", hostName);
+                outstandingRequestIterator.remove();
+                break;
+              case DECLINED_PREDICATE:
+                LOG.info("TopologyManager.onHostRegistered: DECLINED_PREDICATE received for host = {}", hostName);
+                break;
+            }
           }
         }
       }
-    }
 
-    if (!matchedToRequest) {
-      synchronized (availableHosts) {
+      if (!matchedToRequest) {
         boolean addToAvailableList = true;
         for (HostImpl registered : availableHosts) {
           if (registered.getHostId() == host.getHostId()) {
@@ -316,6 +318,9 @@ public class TopologyManager {
 
     boolean requestHostComplete = false;
     //todo: overall synchronization. Currently we have nested synchronization here
+
+    // The lock ordering in this method must always be the same ordering as TopologyManager.onHostRegistered
+    // TODO: Locking strategies for TopologyManager should be reviewed and possibly rewritten in a future release
     synchronized(availableHosts) {
       Iterator<HostImpl> hostIterator = availableHosts.iterator();
       while (! requestHostComplete && hostIterator.hasNext()) {
@@ -368,7 +373,9 @@ public class TopologyManager {
         // not all required hosts have been matched (see earlier comment regarding outstanding logical requests)
         LOG.info("TopologyManager.processRequest: not all required hosts have been matched, so adding LogicalRequest ID = {} to outstanding requests",
           logicalRequest.getRequestId());
-        outstandingRequests.add(logicalRequest);
+        synchronized (outstandingRequests) {
+          outstandingRequests.add(logicalRequest);
+        }
       }
     }
     return logicalRequest;