Example #1
0
// Periodically flushes messages to bleve index
func (b *Bleve) PeriodicFlush(die chan bool) {
	var (
		bvBatchIndex  *bv.Batch
		err           error
		nbMessages    int
		sleepDuration time.Duration = 3 * time.Second
	)

	// Run periodic cleanup task
	go b.periodicCleanup(die)

	for {
		select {
		case <-die:
			return
		default:
		}

		nbMessages = len(b.messages)

		if nbMessages > 0 && (nbMessages >= b.batchSize || time.Now().Sub(b.lastFlush) > b.intervalFlush) {
			b.mutexFlushMessages.Lock()

			bvBatchIndex = b.index.NewBatch()

			for _, message := range b.messages {
				err = bvBatchIndex.Index(uuid.NewV4().String(), message)
				if err != nil {
					logger.Instance().
						WithError(err).
						Warning("Unable to add message to batch")
				}
			}

			if bvBatchIndex.Size() > 0 {
				err = b.index.Batch(bvBatchIndex)

				if err != nil {
					logger.Instance().
						WithError(err).
						Warning("Unable to batch index messages")
				} else {
					logger.Instance().
						WithField("nb_messages", bvBatchIndex.Size()).
						Info("Messages successfully indexed")

					b.lastFlush = time.Now()
					b.messages = []*storage.Message{}
				}
			}

			b.mutexFlushMessages.Unlock()
		}

		time.Sleep(sleepDuration)
	}
}