func (sender *Sender) sendStartMessage(startMessage models.PendingStartMessage) { messageToSend, shouldSend := sender.startMessageToSend(startMessage) if shouldSend { if sender.numberOfStartMessagesSent < sender.conf.SenderMessageLimit { sender.logger.Info("Sending message", startMessage.LogDescription()) err := sender.messageBus.Publish(sender.conf.SenderNatsStartSubject, messageToSend.ToJSON()) if err != nil { sender.logger.Error("Failed to send start message", err, startMessage.LogDescription()) sender.didSucceed = false return } sender.sentStartMessages = append(sender.sentStartMessages, startMessage) if startMessage.KeepAlive == 0 { sender.queueStartMessageForDeletion(startMessage, "a sent start message with no keep alive") } else { sender.markStartMessageSent(startMessage) } sender.numberOfStartMessagesSent += 1 } } else { sender.queueStartMessageForDeletion(startMessage, "start message that will not be sent") } }
func (a *appAnalyzer) appendStartMessageIfNotDuplicate(message models.PendingStartMessage, loggingMessage string, additionalDetails map[string]string) (didAppend bool) { existingMessage, alreadyQueued := a.existingPendingStartMessages[message.StoreKey()] if !alreadyQueued { a.logger.Info(fmt.Sprintf("Enqueuing Start Message: %s", loggingMessage), message.LogDescription(), additionalDetails) a.startMessages[message.StoreKey()] = message return true } else { a.logger.Info(fmt.Sprintf("Skipping Already Enqueued Start Message: %s", loggingMessage), existingMessage.LogDescription(), additionalDetails) return false } }
func (sender *Sender) startMessageToSend(message models.PendingStartMessage) (models.StartMessage, bool) { messageToSend := models.StartMessage{ MessageId: message.MessageId, AppGuid: message.AppGuid, AppVersion: message.AppVersion, InstanceIndex: message.IndexToStart, } if message.SkipVerification { sender.logger.Info("Sending start message: message is marked with SkipVerification", message.LogDescription()) return messageToSend, true } appKey := sender.store.AppKey(message.AppGuid, message.AppVersion) app, found := sender.apps[appKey] if !found { sender.logger.Info("Skipping sending start message: app is no longer desired", message.LogDescription()) return models.StartMessage{}, false } if !app.IsDesired() { sender.logger.Info("Skipping sending start message: app is no longer desired", message.LogDescription(), app.LogDescription()) return models.StartMessage{}, false } if !app.IsIndexDesired(message.IndexToStart) { sender.logger.Info("Skipping sending start message: instance index is beyond the desired # of instances", message.LogDescription(), app.LogDescription()) return models.StartMessage{}, false } if app.HasStartingOrRunningInstanceAtIndex(message.IndexToStart) { sender.logger.Info("Skipping sending start message: instance is already running", message.LogDescription(), app.LogDescription()) return models.StartMessage{}, false } sender.logger.Info("Sending start message: instance is not running at desired index", message.LogDescription(), app.LogDescription()) return messageToSend, true }
func (sender *Sender) queueStartMessageForDeletion(startMessage models.PendingStartMessage, reason string) { sender.logger.Info(fmt.Sprintf("Deleting %s", reason), startMessage.LogDescription()) sender.startMessagesToDelete = append(sender.startMessagesToDelete, startMessage) }