Browse Source

Merge pull request #7744 from heyitsanthony/fix-auth-stop-race

auth: fix race on stopping simple token keeper
Anthony Romano 8 years ago
parent
commit
e2d0db95eb
1 changed files with 19 additions and 14 deletions
  1. 19 14
      auth/simple_token.go

+ 19 - 14
auth/simple_token.go

@@ -42,16 +42,18 @@ var (
 
 
 type simpleTokenTTLKeeper struct {
 type simpleTokenTTLKeeper struct {
 	tokens          map[string]time.Time
 	tokens          map[string]time.Time
-	stopCh          chan chan struct{}
+	donec           chan struct{}
+	stopc           chan struct{}
 	deleteTokenFunc func(string)
 	deleteTokenFunc func(string)
 	mu              *sync.Mutex
 	mu              *sync.Mutex
 }
 }
 
 
 func (tm *simpleTokenTTLKeeper) stop() {
 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) {
 func (tm *simpleTokenTTLKeeper) addSimpleToken(token string) {
@@ -70,7 +72,10 @@ func (tm *simpleTokenTTLKeeper) deleteSimpleToken(token string) {
 
 
 func (tm *simpleTokenTTLKeeper) run() {
 func (tm *simpleTokenTTLKeeper) run() {
 	tokenTicker := time.NewTicker(simpleTokenTTLResolution)
 	tokenTicker := time.NewTicker(simpleTokenTTLResolution)
-	defer tokenTicker.Stop()
+	defer func() {
+		tokenTicker.Stop()
+		close(tm.donec)
+	}()
 	for {
 	for {
 		select {
 		select {
 		case <-tokenTicker.C:
 		case <-tokenTicker.C:
@@ -83,9 +88,7 @@ func (tm *simpleTokenTTLKeeper) run() {
 				}
 				}
 			}
 			}
 			tm.mu.Unlock()
 			tm.mu.Unlock()
-		case waitCh := <-tm.stopCh:
-			tm.tokens = make(map[string]time.Time)
-			waitCh <- struct{}{}
+		case <-tm.stopc:
 			return
 			return
 		}
 		}
 	}
 	}
@@ -148,7 +151,8 @@ func (t *tokenSimple) enable() {
 	}
 	}
 	t.simpleTokenKeeper = &simpleTokenTTLKeeper{
 	t.simpleTokenKeeper = &simpleTokenTTLKeeper{
 		tokens:          make(map[string]time.Time),
 		tokens:          make(map[string]time.Time),
-		stopCh:          make(chan chan struct{}),
+		donec:           make(chan struct{}),
+		stopc:           make(chan struct{}),
 		deleteTokenFunc: delf,
 		deleteTokenFunc: delf,
 		mu:              &t.simpleTokensMu,
 		mu:              &t.simpleTokensMu,
 	}
 	}
@@ -156,13 +160,14 @@ func (t *tokenSimple) enable() {
 }
 }
 
 
 func (t *tokenSimple) disable() {
 func (t *tokenSimple) disable() {
-	if t.simpleTokenKeeper != nil {
-		t.simpleTokenKeeper.stop()
-		t.simpleTokenKeeper = nil
-	}
 	t.simpleTokensMu.Lock()
 	t.simpleTokensMu.Lock()
+	tk := t.simpleTokenKeeper
+	t.simpleTokenKeeper = nil
 	t.simpleTokens = make(map[string]string) // invalidate all tokens
 	t.simpleTokens = make(map[string]string) // invalidate all tokens
 	t.simpleTokensMu.Unlock()
 	t.simpleTokensMu.Unlock()
+	if tk != nil {
+		tk.stop()
+	}
 }
 }
 
 
 func (t *tokenSimple) info(ctx context.Context, token string, revision uint64) (*AuthInfo, bool) {
 func (t *tokenSimple) info(ctx context.Context, token string, revision uint64) (*AuthInfo, bool) {