in modules/mesos-ext/src/main/java/org/apache/ignite/mesos/IgniteScheduler.java [228:299]
private IgniteTask checkOffer(Protos.Offer offer) {
// Check limit on running nodes.
if (clusterProps.instances() <= tasks.size())
return null;
double cpus = -1;
double mem = -1;
double disk = -1;
// Check host name
if (clusterProps.hostnameConstraint() != null
&& clusterProps.hostnameConstraint().matcher(offer.getHostname()).matches())
return null;
// Collect resource on slave.
for (Protos.Resource resource : offer.getResourcesList()) {
if (resource.getName().equals(CPU)) {
if (resource.getType().equals(Protos.Value.Type.SCALAR))
cpus = resource.getScalar().getValue();
else
log.log(Level.FINE, "Cpus resource was not a scalar: {0}" + resource.getType());
}
else if (resource.getName().equals(MEM)) {
if (resource.getType().equals(Protos.Value.Type.SCALAR))
mem = resource.getScalar().getValue();
else
log.log(Level.FINE, "Mem resource was not a scalar: {0}", resource.getType());
}
else if (resource.getName().equals(DISK))
if (resource.getType().equals(Protos.Value.Type.SCALAR))
disk = resource.getScalar().getValue();
else
log.log(Level.FINE, "Disk resource was not a scalar: {0}", resource.getType());
}
// Check that slave satisfies min requirements.
if (cpus < clusterProps.minCpuPerNode() || mem < clusterProps.minMemoryPerNode()) {
log.log(Level.FINE, "Offer not sufficient for slave request: {0}", offer.getResourcesList());
return null;
}
double totalCpus = 0;
double totalMem = 0;
double totalDisk = 0;
// Collect occupied resources.
for (IgniteTask task : tasks.values()) {
totalCpus += task.cpuCores();
totalMem += task.mem();
totalDisk += task.disk();
}
cpus = Math.min(clusterProps.cpus() - totalCpus, Math.min(cpus, clusterProps.cpusPerNode()));
mem = Math.min(clusterProps.memory() - totalMem, Math.min(mem, clusterProps.memoryPerNode()));
disk = Math.min(clusterProps.disk() - totalDisk, Math.min(disk, clusterProps.diskPerNode()));
if ((clusterProps.cpusPerNode() != ClusterProperties.UNLIMITED && clusterProps.cpusPerNode() != cpus)
|| (clusterProps.memoryPerNode() != ClusterProperties.UNLIMITED && clusterProps.memoryPerNode() != mem)) {
log.log(Level.FINE, "Offer not sufficient for slave request: {0}", offer.getResourcesList());
return null;
}
if (cpus > 0 && mem > 0)
return new IgniteTask(offer.getHostname(), cpus, mem, disk);
else {
log.log(Level.FINE, "Offer not sufficient for slave request: {0}", offer.getResourcesList());
return null;
}
}