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 }