Skip to content

Commit

Permalink
Merge pull request #7744 from heyitsanthony/fix-auth-stop-race
Browse files Browse the repository at this point in the history
auth: fix race on stopping simple token keeper
  • Loading branch information
Anthony Romano authored Apr 14, 2017
2 parents 2951e7f + fdf7798 commit e2d0db9
Showing 1 changed file with 19 additions and 14 deletions.
33 changes: 19 additions & 14 deletions auth/simple_token.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,18 @@ var (

type simpleTokenTTLKeeper struct {
tokens map[string]time.Time
stopCh chan chan struct{}
donec chan struct{}
stopc chan struct{}
deleteTokenFunc func(string)
mu *sync.Mutex
}

func (tm *simpleTokenTTLKeeper) stop() {
waitCh := make(chan struct{})
tm.stopCh <- waitCh
<-waitCh
close(tm.stopCh)
select {
case tm.stopc <- struct{}{}:
case <-tm.donec:
}
<-tm.donec
}

func (tm *simpleTokenTTLKeeper) addSimpleToken(token string) {
Expand All @@ -70,7 +72,10 @@ func (tm *simpleTokenTTLKeeper) deleteSimpleToken(token string) {

func (tm *simpleTokenTTLKeeper) run() {
tokenTicker := time.NewTicker(simpleTokenTTLResolution)
defer tokenTicker.Stop()
defer func() {
tokenTicker.Stop()
close(tm.donec)
}()
for {
select {
case <-tokenTicker.C:
Expand All @@ -83,9 +88,7 @@ func (tm *simpleTokenTTLKeeper) run() {
}
}
tm.mu.Unlock()
case waitCh := <-tm.stopCh:
tm.tokens = make(map[string]time.Time)
waitCh <- struct{}{}
case <-tm.stopc:
return
}
}
Expand Down Expand Up @@ -148,21 +151,23 @@ func (t *tokenSimple) enable() {
}
t.simpleTokenKeeper = &simpleTokenTTLKeeper{
tokens: make(map[string]time.Time),
stopCh: make(chan chan struct{}),
donec: make(chan struct{}),
stopc: make(chan struct{}),
deleteTokenFunc: delf,
mu: &t.simpleTokensMu,
}
go t.simpleTokenKeeper.run()
}

func (t *tokenSimple) disable() {
if t.simpleTokenKeeper != nil {
t.simpleTokenKeeper.stop()
t.simpleTokenKeeper = nil
}
t.simpleTokensMu.Lock()
tk := t.simpleTokenKeeper
t.simpleTokenKeeper = nil
t.simpleTokens = make(map[string]string) // invalidate all tokens
t.simpleTokensMu.Unlock()
if tk != nil {
tk.stop()
}
}

func (t *tokenSimple) info(ctx context.Context, token string, revision uint64) (*AuthInfo, bool) {
Expand Down

0 comments on commit e2d0db9

Please sign in to comment.