@@ -3,6 +3,7 @@ package ingester
3
3
import (
4
4
"flag"
5
5
"fmt"
6
+ "hash/fnv"
6
7
"net/http"
7
8
"sync"
8
9
"time"
@@ -439,7 +440,9 @@ func (i *Ingester) sweepUsers(immediate bool) {
439
440
for id , state := range i .userStates .cp () {
440
441
for pair := range state .fpToSeries .iter () {
441
442
state .fpLocker .Lock (pair .fp )
442
- i .sweepSeries (id , pair .fp , pair .series , immediate )
443
+ if err := i .sweepSeries (id , pair .fp , pair .series , immediate ); err != nil {
444
+ log .Errorf ("Error sweeping series: %v" , err )
445
+ }
443
446
state .fpLocker .Unlock (pair .fp )
444
447
}
445
448
}
@@ -449,18 +452,33 @@ func (i *Ingester) sweepUsers(immediate bool) {
449
452
//
450
453
// NB we don't close the head chunk here, as the series could wait in the queue
451
454
// for some time, and we want to encourage chunks to be as full as possible.
452
- func (i * Ingester ) sweepSeries (userID string , fp model.Fingerprint , series * memorySeries , immediate bool ) {
453
- if len (series .chunkDescs ) <= 0 {
454
- return
455
+ func (i * Ingester ) sweepSeries (userID string , fp model.Fingerprint , series * memorySeries , immediate bool ) error {
456
+ flush := i .shouldFlushSeries (series , immediate )
457
+ if ! flush {
458
+ return nil
455
459
}
456
460
457
- firstTime := series . firstTime ( )
458
- flush := i . shouldFlushSeries ( series , immediate )
461
+ return i . enqueueSeriesForFlushing ( userID , fp , series , immediate )
462
+ }
459
463
460
- if flush {
461
- flushQueueIndex := int (uint64 (fp ) % uint64 (i .cfg .ConcurrentFlushes ))
462
- i .flushQueues [flushQueueIndex ].Enqueue (& flushOp {firstTime , userID , fp , immediate })
464
+ func (i * Ingester ) enqueueSeriesForFlushing (userID string , fp model.Fingerprint , series * memorySeries , immediate bool ) error {
465
+ metricName , err := util .ExtractMetricNameFromMetric (series .metric )
466
+ if err != nil {
467
+ return err
463
468
}
469
+
470
+ h := fnv .New32 ()
471
+ if _ , err := h .Write ([]byte (userID )); err != nil {
472
+ return err
473
+ }
474
+ if _ , err := h .Write ([]byte (metricName )); err != nil {
475
+ return err
476
+ }
477
+
478
+ flushQueueIndex := int (h .Sum32 () % uint32 (i .cfg .ConcurrentFlushes ))
479
+ firstTime := series .firstTime ()
480
+ i .flushQueues [flushQueueIndex ].Enqueue (& flushOp {firstTime , userID , fp , immediate })
481
+ return nil
464
482
}
465
483
466
484
func (i * Ingester ) shouldFlushSeries (series * memorySeries , immediate bool ) bool {
0 commit comments