Пример #1
0
// handles message received with type `mtGubleMessage`
func (cluster *Cluster) handleGubleMessage(cmsg *message) {
	if cluster.Router == nil {
		return
	}
	message, err := protocol.ParseMessage(cmsg.Body)
	if err != nil {
		logger.WithField("err", err).Error("Parsing of guble-message contained in cluster-message failed")
		return
	}
	cluster.Router.HandleMessage(message)
}
Пример #2
0
// NotifyMsg is invoked each time a message is received by this node of the cluster; it decodes and dispatches the messages.
func (cluster *Cluster) NotifyMsg(msg []byte) {
	logger.WithField("msgAsBytes", msg).Debug("NotifyMsg")

	cmsg, err := decode(msg)
	if err != nil {
		logger.WithField("err", err).Error("Decoding of cluster message failed")
		return
	}
	logger.WithFields(log.Fields{
		"senderNodeID": cmsg.NodeID,
		"type":         cmsg.Type,
		"body":         string(cmsg.Body),
	}).Debug("NotifyMsg: Received cluster message")

	if cluster.MessageHandler != nil && cmsg.Type == gubleMessage {
		pMessage, err := protocol.ParseMessage(cmsg.Body)
		if err != nil {
			logger.WithField("err", err).Error("Parsing of guble-message contained in cluster-message failed")
			return
		}
		cluster.MessageHandler.HandleMessage(pMessage)
	}
}
Пример #3
0
func (r *Route) handleFetch(router Router) error {
	if r.isInvalid() {
		return ErrInvalidRoute
	}

	r.FetchRequest.Partition = r.Path.Partition()
	ms, err := router.MessageStore()
	if err != nil {
		return err
	}

	var (
		lastID   uint64
		received int
	)

REFETCH:
	// check if we need to continue fetching
	maxID, err := ms.MaxMessageID(r.FetchRequest.Partition)
	if err != nil {
		return err
	}

	if r.FetchRequest.StartID > maxID && r.FetchRequest.Direction == store.DirectionForward {
		return nil
	}

	if received >= r.FetchRequest.Count || lastID >= maxID ||
		(r.FetchRequest.EndID > 0 && r.FetchRequest.EndID <= lastID) {
		return nil
	}
	r.FetchRequest.Init()

	if err := router.Fetch(r.FetchRequest); err != nil {
		return err
	}
	count := r.FetchRequest.Ready()
	r.logger.WithField("count", count).Debug("Receiving messages")

	for {
		select {
		case fetchedMessage, open := <-r.FetchRequest.Messages():
			if !open {
				r.logger.Debug("Fetch channel closed.")
				goto REFETCH
			}

			r.logger.WithField("fetchedMessageID", fetchedMessage.ID).Debug("Fetched message")
			message, err := protocol.ParseMessage(fetchedMessage.Message)
			if err != nil {
				return err
			}

			r.logger.WithField("messageID", message.ID).Debug("Sending fetched message in channel")
			if err := r.Deliver(message); err != nil {
				return err
			}
			lastID = message.ID
			received++
		case err := <-r.FetchRequest.Errors():
			return err
		case <-router.Done():
			r.logger.Debug("Stopping fetch because the router is shutting down")
			return nil
		}
	}
}