| 118 | var _ = oauth2.TokenSource(&cachingTokenSource{}) |
| 119 | |
| 120 | func (ts *cachingTokenSource) Token() (*oauth2.Token, error) { |
| 121 | now := ts.now() |
| 122 | // fast path |
| 123 | ts.RLock() |
| 124 | tok := ts.tok |
| 125 | ts.RUnlock() |
| 126 | |
| 127 | if tok != nil && tok.Expiry.Add(-1*ts.leeway).After(now) { |
| 128 | return tok, nil |
| 129 | } |
| 130 | |
| 131 | // slow path |
| 132 | ts.Lock() |
| 133 | defer ts.Unlock() |
| 134 | if tok := ts.tok; tok != nil && tok.Expiry.Add(-1*ts.leeway).After(now) { |
| 135 | return tok, nil |
| 136 | } |
| 137 | |
| 138 | tok, err := ts.base.Token() |
| 139 | if err != nil { |
| 140 | if ts.tok == nil { |
| 141 | return nil, err |
| 142 | } |
| 143 | klog.Errorf("Unable to rotate token: %v", err) |
| 144 | return ts.tok, nil |
| 145 | } |
| 146 | |
| 147 | ts.tok = tok |
| 148 | return tok, nil |
| 149 | } |