Пример #1
0
func (isrv *indexerServer) IndexMessage(ctx context.Context, msg *pb.Message) (*pb.Response, error) {
	statIncrementCnt(&stat.msgCnt)

	tags := msg.Header.GetTags()
	if len(tags) > maxTagsInMessage {
		return nil, fmt.Errorf("too many tags in message %d", len(tags))
	}

	for _, tag := range tags {
		if len(tag) > maxTagLength {
			return nil, fmt.Errorf("too long tag name %d", len(tag))
		}
	}

	frames := msg.GetFrames()
	for i := 0; i < len(frames)-1; i++ {
		if frames[i].GetName() > frames[i+1].GetName() {
			return nil, fmt.Errorf("frames must be sorted")
		}
	}

	start := time.Now()
	value, err := msg.Marshal()
	statIncrementTook(&stat.msgSerializeTook, start)
	statIncrementSize(&stat.msgSendToKafkaSize, len(value))

	if err != nil {
		return nil, fmt.Errorf("failed to marshal message: %v", err)
	}

	start = time.Now()
	// partition, offset := int32(0), int64(0)
	partition, offset, err := isrv.producer.SendMessage(&sarama.ProducerMessage{
		Topic: persistedTopic,
		Value: sarama.ByteEncoder(value),
	})

	statIncrementTook(&stat.msgSendToKafkaTook, start)

	if err != nil {
		return nil, fmt.Errorf("failed to store message: %v", err)
	}

	start = time.Now()
	isrv.appendIndexCh <- &indexBuilderMessage{
		tags:      tags,
		partition: partition,
		offset:    offset,
	}

	statIncrementTook(&stat.msgSendToChTook, start)
	return &pb.Response{}, nil
}