Esempio n. 1
0
func (frc *FrameworkRiakCluster) ApplyOffer(offerHelper *common.OfferHelper, sc *SchedulerCore) bool {
	stateDirty := false
	clusterNeedsReconciliation := false
	for _, riakNode := range frc.Nodes {
		if riakNode.NeedsToBeReconciled() {
			clusterNeedsReconciliation = true
			continue
		}

		// Try to lanch, compatibilityMode is true
		if riakNode.CanBeScheduled() && sc.compatibilityMode {
			log.Infof("Adding Riak node for scheduling (compatibilityMode): %+v", riakNode.CurrentID())
			if riakNode.ApplyReservedOffer(offerHelper, sc) {
				stateDirty = true
			}
			continue
		}

		// Reserved node, if the persistenceID matches, go ahead and launch!
		if riakNode.CanBeScheduled() && riakNode.HasRequestedReservation() &&
			offerHelper.HasPersistenceId(riakNode.PersistenceID()) {
			log.Infof("Adding Riak node for scheduling (HasRequestedReservation, persistenceId match): %+v", riakNode.CurrentID())
			if riakNode.ApplyReservedOffer(offerHelper, sc) {
				stateDirty = true
			} else {
				clusterNeedsReconciliation = true
			}
			continue
		}

		// Reserved node, if the slaveID / hostname matches but the apply fails, we need to unreserve the node
		if riakNode.CanBeScheduled() && riakNode.HasRequestedReservation() &&
			(riakNode.SlaveID.GetValue() == offerHelper.MesosOffer.SlaveId.GetValue() ||
				riakNode.Hostname == offerHelper.MesosOffer.GetHostname()) {
			log.Infof("Adding Riak node for scheduling (HasRequestedReservation, slaveId/hostname match): %+v", riakNode.CurrentID())
			if !riakNode.ApplyReservedOffer(offerHelper, sc) {
				log.Infof("Riak node has reservation, but slave no longer has it's reservation, unreserving node: %+v", riakNode.CurrentID())
				riakNode.Unreserve()
			}
			stateDirty = true
			continue
		}

		// New node, needs reservation
		if riakNode.CanBeScheduled() && !riakNode.HasRequestedReservation() && !sc.compatibilityMode {
			log.Infof("Adding Riak node for scheduling (no reservations): %+v", riakNode.CurrentID())
			if riakNode.ApplyUnreservedOffer(offerHelper) {
				stateDirty = true
			}
		}
	}

	if stateDirty {
		sc.schedulerState.Persist()
	}

	return clusterNeedsReconciliation
}