adding quit for tokenManager goroutine
diff --git a/apigee_sync_test.go b/apigee_sync_test.go index f705495..96a780a 100644 --- a/apigee_sync_test.go +++ b/apigee_sync_test.go
@@ -109,8 +109,6 @@ Expect(seq).To(Equal(cl.LastSequence)) tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) close(done) }) } @@ -146,8 +144,6 @@ Expect(s.Tables).To(BeNil()) tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) close(done) } })
diff --git a/token.go b/token.go index a1a1263..e461e70 100644 --- a/token.go +++ b/token.go
@@ -14,6 +14,7 @@ var ( refreshFloatTime = time.Minute getTokenLock sync.Mutex + quitPollingForToken chan bool = make(chan bool) ) /* @@ -28,6 +29,7 @@ func createTokenManager() *tokenMan { t := &tokenMan{} t.doRefresh = make(chan bool, 1) + t.continueMaintenance = true t.maintainToken() return t } @@ -35,6 +37,7 @@ type tokenMan struct { token *oauthToken doRefresh chan bool + continueMaintenance bool } func (t *tokenMan) getBearerToken() string { @@ -43,13 +46,12 @@ func (t *tokenMan) maintainToken() { go func() { + t.getToken() for { - if t.token.needsRefresh() { - getTokenLock.Lock() - t.retrieveNewToken() - getTokenLock.Unlock() - } select { + case <- quitPollingForToken: + log.Info("Signal to quit maintenance of token recieved") + return case _, ok := <-t.doRefresh: if !ok { log.Debug("closed tokenMan") @@ -59,6 +61,12 @@ case <-time.After(t.token.refreshIn()): log.Debug("auto refresh token") } + + if t.token.needsRefresh() && t.continueMaintenance{ + getTokenLock.Lock() + t.retrieveNewToken() + getTokenLock.Unlock() + } } }() } @@ -85,8 +93,9 @@ func (t *tokenMan) close() { log.Debug("close token manager") + quitPollingForToken <- true close(t.doRefresh) - + t.continueMaintenance = false } // don't call externally. will block until success. @@ -100,7 +109,7 @@ } uri.Path = path.Join(uri.Path, "/accesstoken") - pollWithBackoff(nil, t.getRetrieveNewTokenClosure(uri), func(err error) {log.Errorf("Error getting new token : ", err)}) + pollWithBackoff(quitPollingForToken, t.getRetrieveNewTokenClosure(uri), func(err error) {log.Errorf("Error getting new token : ", err)}) } func (t *tokenMan) getRetrieveNewTokenClosure(uri *url.URL) func(chan bool) error {
diff --git a/token_test.go b/token_test.go index d4d5e07..4fbd0b0 100644 --- a/token_test.go +++ b/token_test.go
@@ -65,7 +65,7 @@ Context("tokenMan", func() { It("should get a valid token", func() { - +log.Info("\n\n\n\nHERE\n\n") tokenManager = createTokenManager() token := tokenManager.getToken() @@ -76,14 +76,11 @@ bToken := tokenManager.getBearerToken() Expect(bToken).To(Equal(token.AccessToken)) tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) }, 2) It("should refresh when forced to", func() { tokenManager = createTokenManager() - token := tokenManager.getToken() Expect(token.AccessToken).ToNot(BeEmpty()) @@ -93,8 +90,6 @@ Expect(token).ToNot(Equal(token2)) Expect(token.AccessToken).ToNot(Equal(token2.AccessToken)) tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) }, 2) It("should refresh in refresh interval", func(done Done) { @@ -130,8 +125,6 @@ <-finished tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) ts.Close() close(done) @@ -173,8 +166,6 @@ tokenManager.getToken() <-finished tokenManager.close() - //sleep to ensure tokenManager has closed. t.close() is non blocking - time.Sleep(1500 * time.Millisecond) ts.Close() close(done) }, 2)