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;