@@ -2,8 +2,6 @@ package ring
2
2
3
3
import (
4
4
"context"
5
- "encoding/binary"
6
- "errors"
7
5
"flag"
8
6
"fmt"
9
7
"io/ioutil"
@@ -133,7 +131,7 @@ type Lifecycler struct {
133
131
// back empty. And it changes during lifecycle of ingester.
134
132
stateMtx sync.Mutex
135
133
state IngesterState
136
- tokens [] uint32
134
+ tokens Tokens
137
135
138
136
// Controls the ready-reporting
139
137
readyLock sync.Mutex
@@ -207,7 +205,7 @@ func (i *Lifecycler) CheckReady(ctx context.Context) error {
207
205
return fmt .Errorf ("error talking to consul: %s" , err )
208
206
}
209
207
210
- if len ( i .getTokens ()) == 0 {
208
+ if i .getTokens (). Len ( ) == 0 {
211
209
return fmt .Errorf ("this ingester owns no tokens" )
212
210
}
213
211
@@ -246,9 +244,14 @@ func (i *Lifecycler) ChangeState(ctx context.Context, state IngesterState) error
246
244
return <- err
247
245
}
248
246
249
- func (i * Lifecycler ) getTokens () []uint32 {
247
+ var emptyTokens Tokens = & SimpleListTokens {}
248
+
249
+ func (i * Lifecycler ) getTokens () Tokens {
250
250
i .stateMtx .Lock ()
251
251
defer i .stateMtx .Unlock ()
252
+ if i .tokens == nil {
253
+ return emptyTokens
254
+ }
252
255
return i .tokens
253
256
}
254
257
@@ -263,18 +266,14 @@ func (i *Lifecycler) flushTokensToFile() {
263
266
return
264
267
}
265
268
266
- b := make ([]byte , 4 * len (i .tokens ))
267
- for idx , token := range i .tokens {
268
- binary .BigEndian .PutUint32 (b [idx * 4 :], token )
269
- }
270
-
269
+ b := i .tokens .Marshal (nil )
271
270
if _ , err = f .Write (b ); err != nil {
272
271
level .Error (util .Logger ).Log ("msg" , "error in writing token file" , "err" , err )
273
272
return
274
273
}
275
274
}
276
275
277
- func (i * Lifecycler ) getTokensFromFile () ([] uint32 , error ) {
276
+ func (i * Lifecycler ) getTokensFromFile () (Tokens , error ) {
278
277
tokenFilePath := path .Join (i .cfg .TokensFileDir , tokensFileName )
279
278
b , err := ioutil .ReadFile (tokenFilePath )
280
279
if err != nil {
@@ -283,23 +282,12 @@ func (i *Lifecycler) getTokensFromFile() ([]uint32, error) {
283
282
}
284
283
return nil , err
285
284
}
286
- if len (b ) == 0 {
287
- return nil , nil
288
- } else if len (b )% 4 != 0 {
289
- return nil , errors .New ("token data is not 4 byte aligned" )
290
- }
291
-
292
- numTokens := len (b ) >> 2
293
- tokens := make ([]uint32 , 0 , numTokens )
294
- for i := 0 ; i < numTokens ; i ++ {
295
- tokens = append (tokens , binary .BigEndian .Uint32 (b [i << 2 :]))
296
- }
297
285
298
- return tokens , nil
286
+ return UnmarshalTokens ( b )
299
287
}
300
288
301
- func (i * Lifecycler ) setTokens (tokens [] uint32 ) {
302
- tokensOwned .WithLabelValues (i .RingName ).Set (float64 (len ( tokens )))
289
+ func (i * Lifecycler ) setTokens (tokens Tokens ) {
290
+ tokensOwned .WithLabelValues (i .RingName ).Set (float64 (tokens . Len ( )))
303
291
304
292
i .stateMtx .Lock ()
305
293
i .tokens = tokens
@@ -313,7 +301,7 @@ func (i *Lifecycler) ClaimTokensFor(ctx context.Context, ingesterID string) erro
313
301
err := make (chan error )
314
302
315
303
i .actorChan <- func () {
316
- var tokens [] uint32
304
+ var tokens Tokens
317
305
318
306
claimTokens := func (in interface {}) (out interface {}, retry bool , err error ) {
319
307
ringDesc , ok := in .(* Desc )
@@ -451,12 +439,12 @@ func (i *Lifecycler) initRing(ctx context.Context) error {
451
439
tokens , err := i .getTokensFromFile ()
452
440
if err != nil {
453
441
level .Error (util .Logger ).Log ("msg" , "error in getting tokens from file" , "err" , err )
454
- } else if len ( tokens ) > 0 {
455
- level .Info (util .Logger ).Log ("msg" , "adding tokens from file" , "num_tokens" , len ( tokens ))
456
- if len ( tokens ) == i .cfg .NumTokens {
442
+ } else if tokens != nil && tokens . Len ( ) > 0 {
443
+ level .Info (util .Logger ).Log ("msg" , "adding tokens from file" , "num_tokens" , tokens . Len ( ))
444
+ if tokens . Len ( ) == i .cfg .NumTokens {
457
445
i .setState (ACTIVE )
458
446
}
459
- ringDesc .AddIngester (i .ID , i .Addr , tokens , i .GetState (), i .cfg .NormaliseTokens )
447
+ ringDesc .AddIngester (i .ID , i .Addr , tokens . Tokens () , i .GetState (), i .cfg .NormaliseTokens )
460
448
i .setTokens (tokens )
461
449
return ringDesc , true , nil
462
450
}
@@ -472,7 +460,7 @@ func (i *Lifecycler) initRing(ctx context.Context) error {
472
460
tokens , _ := ringDesc .TokensFor (i .ID )
473
461
i .setTokens (tokens )
474
462
475
- level .Info (util .Logger ).Log ("msg" , "existing entry found in ring" , "state" , i .GetState (), "tokens" , len ( tokens ))
463
+ level .Info (util .Logger ).Log ("msg" , "existing entry found in ring" , "state" , i .GetState (), "tokens" , tokens . Len ( ))
476
464
return ringDesc , true , nil
477
465
})
478
466
}
@@ -489,17 +477,17 @@ func (i *Lifecycler) autoJoin(ctx context.Context) error {
489
477
490
478
// At this point, we should not have any tokens, and we should be in PENDING state.
491
479
myTokens , takenTokens := ringDesc .TokensFor (i .ID )
492
- if len ( myTokens ) > 0 {
493
- level .Error (util .Logger ).Log ("msg" , "tokens already exist for this ingester - wasn't expecting any!" , "num_tokens" , len ( myTokens ))
480
+ if myTokens . Len ( ) > 0 {
481
+ level .Error (util .Logger ).Log ("msg" , "tokens already exist for this ingester - wasn't expecting any!" , "num_tokens" , myTokens . Len ( ))
494
482
}
495
483
496
- newTokens := GenerateTokens (i .cfg .NumTokens - len ( myTokens ), takenTokens )
484
+ newTokens := GenerateTokens (i .cfg .NumTokens - myTokens . Len ( ), takenTokens . Tokens () )
497
485
i .setState (ACTIVE )
498
486
ringDesc .AddIngester (i .ID , i .Addr , newTokens , i .GetState (), i .cfg .NormaliseTokens )
499
487
500
- tokens := append ( myTokens , newTokens ... )
501
- sort .Sort (sortableUint32 (tokens ))
502
- i .setTokens (tokens )
488
+ myTokens . Add ( newTokens ... )
489
+ sort .Sort (sortableUint32 (myTokens . Tokens () ))
490
+ i .setTokens (myTokens )
503
491
504
492
return ringDesc , true , nil
505
493
})
@@ -520,7 +508,7 @@ func (i *Lifecycler) updateConsul(ctx context.Context) error {
520
508
if ! ok {
521
509
// consul must have restarted
522
510
level .Info (util .Logger ).Log ("msg" , "found empty ring, inserting tokens" )
523
- ringDesc .AddIngester (i .ID , i .Addr , i .getTokens (), i .GetState (), i .cfg .NormaliseTokens )
511
+ ringDesc .AddIngester (i .ID , i .Addr , i .getTokens (). Tokens () , i .GetState (), i .cfg .NormaliseTokens )
524
512
} else {
525
513
ingesterDesc .Timestamp = time .Now ().Unix ()
526
514
ingesterDesc .State = i .GetState ()
0 commit comments