Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/PlacementConstraintManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/PlacementConstraintManager.java (date 1513986680000) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/PlacementConstraintManager.java (revision ) @@ -26,6 +26,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.yarn.api.records.ApplicationId; +import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.resource.PlacementConstraint; /** @@ -148,4 +149,21 @@ return true; } + /** + * Returns true if a specific Node is **currently** a valid placement + * for a Set of allocationTags. + * To do so the method should retrieves and goes through application constraint + * expressions and checks if the specific allocation is between the allowed + * min-max cardinality values + * @param applicationId + * @param allocationTags + * @param nodeId + * @param tagsManager + * @return + * @throws InvalidAllocationTagsQueryException + */ + boolean canAssign(ApplicationId applicationId, Set allocationTags, + NodeId nodeId, AllocationTagsManager tagsManager) + throws InvalidAllocationTagsQueryException; + } Index: hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/MemoryPlacementConstraintManager.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/MemoryPlacementConstraintManager.java (date 1513986680000) +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/constraint/MemoryPlacementConstraintManager.java (revision ) @@ -32,7 +32,9 @@ import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.api.records.ApplicationId; +import org.apache.hadoop.yarn.api.records.NodeId; import org.apache.hadoop.yarn.api.resource.PlacementConstraint; +import org.apache.hadoop.yarn.api.resource.PlacementConstraintTransformations; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -279,4 +281,40 @@ readLock.unlock(); } } + + @Override + public boolean canAssign(ApplicationId applicationId, + Set allocationTags, NodeId nodeId, + AllocationTagsManager tagsManager) + throws InvalidAllocationTagsQueryException { + PlacementConstraint constraint = + this.getConstraint(applicationId, allocationTags); + if (constraint == null) { + return true; + } + // TODO: proper transformations + // Currently works only for simple anti-affinity + // NODE scope target expressions + PlacementConstraintTransformations.SpecializedConstraintTransformer transformer = + new PlacementConstraintTransformations.SpecializedConstraintTransformer( + constraint); + PlacementConstraint transform = transformer.transform(); + PlacementConstraint.TargetConstraint targetConstraint = + (PlacementConstraint.TargetConstraint) transform.getConstraintExpr(); + // Assume a single target expression tag; + // The Sample Algorithm assumes a constraint will always be a simple + // Target Constraint with a single entry in the target set. + // As mentioned in the class javadoc - This algorithm should be + // used mostly for testing and validating end-2-end workflow. + String targetTag = targetConstraint.getTargetExpressions().iterator().next() + .getTargetValues().iterator().next(); + // TODO: Assuming anti-affinity constraint + long nodeCardinality = + tagsManager.getNodeCardinality(nodeId, applicationId, targetTag); + if (nodeCardinality != 0) { + return false; + } + // return true if it is a valid placement + return true; + } }