Skip to content

Commit 5c33c1c

Browse files
committed
Remove Tokens interface
Signed-off-by: Ganesh Vernekar <[email protected]>
1 parent c59cf80 commit 5c33c1c

File tree

5 files changed

+82
-142
lines changed

5 files changed

+82
-142
lines changed

pkg/ring/lifecycler.go

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package ring
22

33
import (
44
"context"
5+
"encoding/json"
6+
"errors"
57
"flag"
68
"fmt"
79
"io/ioutil"
@@ -254,17 +256,17 @@ func (i *Lifecycler) ChangeState(ctx context.Context, state IngesterState) error
254256
return <-err
255257
}
256258

257-
func (i *Lifecycler) getTokens() []uint32 {
259+
func (i *Lifecycler) getTokens() Tokens {
258260
i.stateMtx.Lock()
259261
defer i.stateMtx.Unlock()
260262
if i.tokens == nil {
261263
return nil
262264
}
263-
return i.tokens.Tokens()
265+
return i.tokens
264266
}
265267

266268
func (i *Lifecycler) flushTokensToFile() {
267-
if i.cfg.TokensFileDir == "" || i.tokens == nil || i.tokens.Len() == 0 {
269+
if i.cfg.TokensFileDir == "" || i.tokens == nil || len(i.tokens) == 0 {
268270
return
269271
}
270272
tokenFilePath := path.Join(i.cfg.TokensFileDir, tokensFileName)
@@ -274,7 +276,11 @@ func (i *Lifecycler) flushTokensToFile() {
274276
return
275277
}
276278

277-
b := i.tokens.Marshal(nil)
279+
b, err := MarshalTokens(i.tokens)
280+
if err != nil {
281+
level.Error(util.Logger).Log("msg", "error in marshalling tokens", "err", err)
282+
return
283+
}
278284
if _, err = f.Write(b); err != nil {
279285
level.Error(util.Logger).Log("msg", "error in writing token file", "err", err)
280286
return
@@ -295,7 +301,7 @@ func (i *Lifecycler) getTokensFromFile() (Tokens, error) {
295301
}
296302

297303
func (i *Lifecycler) setTokens(tokens Tokens) {
298-
tokensOwned.WithLabelValues(i.RingName).Set(float64(tokens.Len()))
304+
tokensOwned.WithLabelValues(i.RingName).Set(float64(len(tokens)))
299305

300306
i.stateMtx.Lock()
301307
i.tokens = tokens
@@ -504,12 +510,12 @@ func (i *Lifecycler) initRing(ctx context.Context) error {
504510
tokens, err := i.getTokensFromFile()
505511
if err != nil {
506512
level.Error(util.Logger).Log("msg", "error in getting tokens from file", "err", err)
507-
} else if tokens != nil && tokens.Len() > 0 {
508-
level.Info(util.Logger).Log("msg", "adding tokens from file", "num_tokens", tokens.Len())
509-
if tokens.Len() == i.cfg.NumTokens {
513+
} else if tokens != nil && len(tokens) > 0 {
514+
level.Info(util.Logger).Log("msg", "adding tokens from file", "num_tokens", len(tokens))
515+
if len(tokens) == i.cfg.NumTokens {
510516
i.setState(ACTIVE)
511517
}
512-
ringDesc.AddIngester(i.ID, i.Addr, tokens.Tokens(), i.GetState(), i.cfg.NormaliseTokens)
518+
ringDesc.AddIngester(i.ID, i.Addr, tokens, i.GetState(), i.cfg.NormaliseTokens)
513519
i.setTokens(tokens)
514520
return ringDesc, true, nil
515521
}
@@ -525,7 +531,7 @@ func (i *Lifecycler) initRing(ctx context.Context) error {
525531
tokens, _ := ringDesc.TokensFor(i.ID)
526532
i.setTokens(tokens)
527533

528-
level.Info(util.Logger).Log("msg", "existing entry found in ring", "state", i.GetState(), "tokens", tokens.Len())
534+
level.Info(util.Logger).Log("msg", "existing entry found in ring", "state", i.GetState(), "tokens", len(tokens))
529535
// we haven't modified the ring, don't try to store it.
530536
return nil, true, nil
531537
})
@@ -557,15 +563,15 @@ func (i *Lifecycler) verifyTokens(ctx context.Context) bool {
557563

558564
if !i.compareTokens(ringTokens) {
559565
// uh, oh... our tokens are not our anymore. Let's try new ones.
560-
needTokens := i.cfg.NumTokens - ringTokens.Len()
566+
needTokens := i.cfg.NumTokens - len(ringTokens)
561567

562568
level.Info(util.Logger).Log("msg", "generating new tokens", "count", needTokens)
563-
newTokens := GenerateTokens(needTokens, takenTokens.Tokens())
569+
newTokens := GenerateTokens(needTokens, takenTokens)
564570

565-
ringTokens.Add(newTokens...)
566-
sort.Sort(sortableUint32(ringTokens.Tokens()))
571+
ringTokens = append(ringTokens, newTokens...)
572+
sort.Sort(sortableUint32(ringTokens))
567573

568-
ringDesc.AddIngester(i.ID, i.Addr, ringTokens.Tokens(), i.GetState(), i.cfg.NormaliseTokens)
574+
ringDesc.AddIngester(i.ID, i.Addr, ringTokens, i.GetState(), i.cfg.NormaliseTokens)
569575

570576
i.setTokens(ringTokens)
571577

@@ -586,18 +592,17 @@ func (i *Lifecycler) verifyTokens(ctx context.Context) bool {
586592
}
587593

588594
func (i *Lifecycler) compareTokens(fromRing Tokens) bool {
589-
sort.Sort(sortableUint32(fromRing.Tokens()))
595+
sort.Sort(sortableUint32(fromRing))
590596

591597
tokens := i.getTokens()
592598
sort.Sort(sortableUint32(tokens))
593599

594-
if len(tokens) != fromRing.Len() {
600+
if len(tokens) != len(fromRing) {
595601
return false
596602
}
597603

598-
tokensFromRing := fromRing.Tokens()
599604
for i := 0; i < len(tokens); i++ {
600-
if tokens[i] != tokensFromRing[i] {
605+
if tokens[i] != fromRing[i] {
601606
return false
602607
}
603608
}
@@ -617,17 +622,17 @@ func (i *Lifecycler) autoJoin(ctx context.Context, targetState IngesterState) er
617622

618623
// At this point, we should not have any tokens, and we should be in PENDING state.
619624
myTokens, takenTokens := ringDesc.TokensFor(i.ID)
620-
if myTokens.Len() > 0 {
621-
level.Error(util.Logger).Log("msg", "tokens already exist for this ingester - wasn't expecting any!", "num_tokens", myTokens.Len())
625+
if len(myTokens) > 0 {
626+
level.Error(util.Logger).Log("msg", "tokens already exist for this ingester - wasn't expecting any!", "num_tokens", len(myTokens))
622627
}
623628

624-
newTokens := GenerateTokens(i.cfg.NumTokens-myTokens.Len(), takenTokens.Tokens())
629+
newTokens := GenerateTokens(i.cfg.NumTokens-len(myTokens), takenTokens)
625630
i.setState(targetState)
626631

627632
ringDesc.AddIngester(i.ID, i.Addr, newTokens, i.GetState(), i.cfg.NormaliseTokens)
628633

629-
myTokens.Add(newTokens...)
630-
sort.Sort(sortableUint32(myTokens.Tokens()))
634+
myTokens = append(myTokens, newTokens...)
635+
sort.Sort(sortableUint32(myTokens))
631636
i.setTokens(myTokens)
632637

633638
return ringDesc, true, nil
@@ -747,3 +752,38 @@ func (i *Lifecycler) unregister(ctx context.Context) error {
747752
return ringDesc, true, nil
748753
})
749754
}
755+
756+
// TokenVersion1 is the version is a simple list of tokens.
757+
const TokenVersion1 = 1
758+
759+
// Tokens is a simple list of tokens.
760+
type Tokens []uint32
761+
762+
// MarshalTokens encodes given tokens into JSON.
763+
func MarshalTokens(tokens Tokens) ([]byte, error) {
764+
data := tokensJSON{
765+
Version: TokenVersion1,
766+
Tokens: tokens,
767+
}
768+
return json.Marshal(data)
769+
}
770+
771+
// UnmarshalTokens converts the JSON byte stream into Tokens.
772+
func UnmarshalTokens(b []byte) (Tokens, error) {
773+
tj := tokensJSON{}
774+
if err := json.Unmarshal(b, &tj); err != nil {
775+
return nil, err
776+
}
777+
switch tj.Version {
778+
case TokenVersion1:
779+
tokens := Tokens(tj.Tokens)
780+
return tokens, nil
781+
default:
782+
return nil, errors.New("invalid token type")
783+
}
784+
}
785+
786+
type tokensJSON struct {
787+
Version int `json:"version"`
788+
Tokens []uint32 `json:"tokens"`
789+
}

pkg/ring/lifecycler_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func TestRingNormaliseMigration(t *testing.T) {
8787
return checkDenormalised(d, "ing1")
8888
})
8989

90-
token := l1.tokens.Tokens()[0]
90+
token := l1.tokens[0]
9191

9292
// Add a second ingester with normalised tokens.
9393
var lifecyclerConfig2 = testLifecyclerConfig(t, ringConfig, "ing2")
@@ -190,7 +190,7 @@ func TestRingRestart(t *testing.T) {
190190
return checkNormalised(d, "ing1")
191191
})
192192

193-
token := l1.tokens.Tokens()[0]
193+
token := l1.tokens[0]
194194

195195
// Add a second ingester with the same settings, so it will think it has restarted
196196
l2, err := NewLifecycler(lifecyclerConfig1, &nopFlushTransferer{}, "ingester")
@@ -253,14 +253,14 @@ func TestCheckReady(t *testing.T) {
253253
flagext.DefaultValues(&ringConfig)
254254
ringConfig.KVStore.Mock = &MockClient{}
255255

256-
tokens := SimpleListTokens([]uint32{1})
256+
tokens := Tokens([]uint32{1})
257257
r, err := New(ringConfig, "ingester")
258258
require.NoError(t, err)
259259
defer r.Stop()
260260
cfg := testLifecyclerConfig(t, ringConfig, "ring1")
261261
cfg.MinReadyDuration = 1 * time.Nanosecond
262262
l1, err := NewLifecycler(cfg, &nopFlushTransferer{}, "ingester")
263-
l1.setTokens(&tokens)
263+
l1.setTokens(tokens)
264264
l1.Start()
265265
require.NoError(t, err)
266266

pkg/ring/model.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ func (d *Desc) RemoveIngester(id string) {
8080
// and 'to' ingester uses either normalised or non-normalised tokens, but not both. Tokens list must
8181
// be sorted properly. If all of this is true, everything will be fine.
8282
func (d *Desc) ClaimTokens(from, to string, normaliseTokens bool) Tokens {
83-
result := &SimpleListTokens{}
83+
result := Tokens{}
8484

8585
if normaliseTokens {
8686

8787
// If the ingester we are claiming from is normalising, get its tokens then erase them from the ring.
8888
if fromDesc, found := d.Ingesters[from]; found {
89-
result.Add(fromDesc.Tokens...)
89+
result = append(result, fromDesc.Tokens...)
9090
fromDesc.Tokens = nil
9191
d.Ingesters[from] = fromDesc
9292
}
@@ -97,25 +97,25 @@ func (d *Desc) ClaimTokens(from, to string, normaliseTokens bool) Tokens {
9797
// When all ingesters are in normalised mode, d.Tokens is empty here
9898
for i := 0; i < len(d.Tokens); {
9999
if d.Tokens[i].Ingester == from {
100-
result.Add(d.Tokens[i].Token)
100+
result = append(result, d.Tokens[i].Token)
101101
d.Tokens = append(d.Tokens[:i], d.Tokens[i+1:]...)
102102
continue
103103
}
104104
i++
105105
}
106106

107107
ing := d.Ingesters[to]
108-
ing.Tokens = result.Tokens()
108+
ing.Tokens = result
109109
d.Ingesters[to] = ing
110110

111111
} else {
112112
// If source ingester is normalising, copy its tokens to d.Tokens, and set new owner
113113
if fromDesc, found := d.Ingesters[from]; found {
114-
result.Add(fromDesc.Tokens...)
114+
result = append(result, fromDesc.Tokens...)
115115
fromDesc.Tokens = nil
116116
d.Ingesters[from] = fromDesc
117117

118-
for _, t := range result.Tokens() {
118+
for _, t := range result {
119119
d.Tokens = append(d.Tokens, TokenDesc{Ingester: to, Token: t})
120120
}
121121

@@ -126,7 +126,7 @@ func (d *Desc) ClaimTokens(from, to string, normaliseTokens bool) Tokens {
126126
for i := 0; i < len(d.Tokens); i++ {
127127
if d.Tokens[i].Ingester == from {
128128
d.Tokens[i].Ingester = to
129-
result.Add(d.Tokens[i].Token)
129+
result = append(result, d.Tokens[i].Token)
130130
}
131131
}
132132
}
@@ -170,11 +170,11 @@ func (d *Desc) Ready(now time.Time, heartbeatTimeout time.Duration) error {
170170

171171
// TokensFor partitions the tokens into those for the given ID, and those for others.
172172
func (d *Desc) TokensFor(id string) (tokens, other Tokens) {
173-
takenTokens, myTokens := &SimpleListTokens{}, &SimpleListTokens{}
173+
takenTokens, myTokens := Tokens{}, Tokens{}
174174
for _, token := range migrateRing(d) {
175-
takenTokens.Add(token.Token)
175+
takenTokens = append(takenTokens, token.Token)
176176
if token.Ingester == id {
177-
myTokens.Add(token.Token)
177+
myTokens = append(myTokens, token.Token)
178178
}
179179
}
180180
return myTokens, takenTokens

pkg/ring/model_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,23 @@ func TestClaimTokensFromNormalizedToNormalized(t *testing.T) {
104104
r := normalizedSource()
105105
result := r.ClaimTokens("first", "second", true)
106106

107-
assert.Equal(t, []uint32{100, 200, 300}, result.Tokens())
107+
assert.Equal(t, []uint32{100, 200, 300}, []uint32(result))
108108
assert.Equal(t, normalizedOutput(), r)
109109
}
110110

111111
func TestClaimTokensFromNormalizedToUnnormalized(t *testing.T) {
112112
r := normalizedSource()
113113
result := r.ClaimTokens("first", "second", false)
114114

115-
assert.Equal(t, []uint32{100, 200, 300}, result.Tokens())
115+
assert.Equal(t, []uint32{100, 200, 300}, []uint32(result))
116116
assert.Equal(t, unnormalizedOutput(), r)
117117
}
118118

119119
func TestClaimTokensFromUnnormalizedToUnnormalized(t *testing.T) {
120120
r := unnormalizedSource()
121121
result := r.ClaimTokens("first", "second", false)
122122

123-
assert.Equal(t, []uint32{100, 200, 300}, result.Tokens())
123+
assert.Equal(t, []uint32{100, 200, 300}, []uint32(result))
124124
assert.Equal(t, unnormalizedOutput(), r)
125125
}
126126

@@ -129,7 +129,7 @@ func TestClaimTokensFromUnnormalizedToNormalized(t *testing.T) {
129129

130130
result := r.ClaimTokens("first", "second", true)
131131

132-
assert.Equal(t, []uint32{100, 200, 300}, result.Tokens())
132+
assert.Equal(t, []uint32{100, 200, 300}, []uint32(result))
133133
assert.Equal(t, normalizedOutput(), r)
134134
}
135135

0 commit comments

Comments
 (0)