@@ -158,11 +158,15 @@ func (c *defaultCredential) start() error {
158158 }
159159 err = c .ensureCredentialWatcher ()
160160 if err != nil {
161- c .logger .Debug ("start credential watcher for " , c .tag , ": " , err )
161+ c .logger .Error ("start credential watcher for " , c .tag , ": " , err )
162162 }
163163 err = c .reloadCredentials (true )
164164 if err != nil {
165- c .logger .Warn ("initial credential load for " , c .tag , ": " , err )
165+ c .logger .Error ("initial credential load for " , c .tag , ": " , err )
166+ }
167+ if c .credentials != nil && c .credentials .needsRefresh () &&
168+ slices .Contains (c .credentials .Scopes , "user:inference" ) {
169+ c .tryRefreshCredentials (false )
166170 }
167171 if c .usageTracker != nil {
168172 err = c .usageTracker .Load ()
@@ -240,7 +244,10 @@ func (c *defaultCredential) getAccessToken() (string, error) {
240244 if ! currentCredentials .needsRefresh () || ! slices .Contains (currentCredentials .Scopes , "user:inference" ) {
241245 return currentCredentials .AccessToken , nil
242246 }
243- c .tryRefreshCredentials (false )
247+ refreshErr := c .tryRefreshCredentials (false )
248+ if refreshErr != nil {
249+ return "" , refreshErr
250+ }
244251 c .access .RLock ()
245252 defer c .access .RUnlock ()
246253 if c .credentials != nil && c .credentials .AccessToken != "" {
@@ -354,23 +361,25 @@ func (c *defaultCredential) shouldAttemptRefresh(credentials *oauthCredentials,
354361 return credentials .needsRefresh ()
355362}
356363
357- func (c * defaultCredential ) tryRefreshCredentials (force bool ) bool {
364+ func (c * defaultCredential ) tryRefreshCredentials (force bool ) error {
358365 latestCredentials , err := platformReadCredentials (c .credentialPath )
359366 if err == nil && latestCredentials != nil {
360367 c .absorbCredentials (latestCredentials )
361368 }
362369 currentCredentials := c .currentCredentials ()
363370 if ! c .shouldAttemptRefresh (currentCredentials , force ) {
364- return false
371+ return nil
365372 }
366373 acquireLock := c .acquireLock
367374 if acquireLock == nil {
368375 acquireLock = acquireCredentialLock
369376 }
370377 release , err := acquireLock (c .configDir )
371378 if err != nil {
372- c .logger .Debug ("acquire credential lock for " , c .tag , ": " , err )
373- return false
379+ lockErr := E .Cause (err , "acquire credential lock for " , c .tag )
380+ c .logger .Error (lockErr )
381+ c .markCredentialsUnavailable (lockErr )
382+ return lockErr
374383 }
375384 defer release ()
376385
@@ -382,30 +391,35 @@ func (c *defaultCredential) tryRefreshCredentials(force bool) bool {
382391 currentCredentials = c .currentCredentials ()
383392 }
384393 if ! c .shouldAttemptRefresh (currentCredentials , force ) {
385- return false
394+ return nil
386395 }
387- if err := platformCanWriteCredentials (c .credentialPath ); err != nil {
388- c .logger .Debug ("credential file not writable for " , c .tag , ": " , err )
389- return false
396+ err = platformCanWriteCredentials (c .credentialPath )
397+ if err != nil {
398+ writeErr := E .Cause (err , "credential file not writable for " , c .tag )
399+ c .logger .Error (writeErr )
400+ c .markCredentialsUnavailable (writeErr )
401+ return writeErr
390402 }
391403
392404 baseCredentials := cloneCredentials (currentCredentials )
393405 refreshResult , retryDelay , err := refreshToken (c .serviceContext , c .forwardHTTPClient , currentCredentials )
394406 if err != nil {
395407 if retryDelay != 0 {
396- c .logger .Debug ("refresh token for " , c .tag , ": retry delay=" , retryDelay , ", error=" , err )
408+ c .logger .Error ("refresh token for " , c .tag , ": retry delay=" , retryDelay , ", error=" , err )
397409 } else {
398- c .logger .Debug ("refresh token for " , c .tag , ": " , err )
410+ c .logger .Error ("refresh token for " , c .tag , ": " , err )
399411 }
400412 latestCredentials , readErr := platformReadCredentials (c .credentialPath )
401413 if readErr == nil && latestCredentials != nil {
402414 c .absorbCredentials (latestCredentials )
403- return latestCredentials .AccessToken != "" && (latestCredentials .AccessToken != baseCredentials .AccessToken || ! latestCredentials .needsRefresh ())
415+ if latestCredentials .AccessToken != "" && (latestCredentials .AccessToken != baseCredentials .AccessToken || ! latestCredentials .needsRefresh ()) {
416+ return nil
417+ }
404418 }
405- return false
419+ return E . Cause ( err , "refresh token for " , c . tag )
406420 }
407421 if refreshResult == nil || refreshResult .Credentials == nil {
408- return false
422+ return E . New ( "refresh token for " , c . tag , ": empty result" )
409423 }
410424
411425 refreshedCredentials := cloneCredentials (refreshResult .Credentials )
@@ -419,7 +433,7 @@ func (c *defaultCredential) tryRefreshCredentials(force bool) bool {
419433 if c .needsProfileHydration () {
420434 profileSnapshot , profileErr := c .fetchProfileSnapshot (c .forwardHTTPClient , refreshedCredentials .AccessToken )
421435 if profileErr != nil {
422- c .logger .Debug ("fetch profile for " , c .tag , ": " , profileErr )
436+ c .logger .Error ("fetch profile for " , c .tag , ": " , profileErr )
423437 } else if profileSnapshot != nil {
424438 credentialsChanged := c .applyProfileSnapshot (profileSnapshot )
425439 c .persistOAuthAccount ()
@@ -428,7 +442,7 @@ func (c *defaultCredential) tryRefreshCredentials(force bool) bool {
428442 }
429443 }
430444 }
431- return true
445+ return nil
432446}
433447
434448func (c * defaultCredential ) recoverAuthFailure (failedAccessToken string ) bool {
@@ -439,7 +453,10 @@ func (c *defaultCredential) recoverAuthFailure(failedAccessToken string) bool {
439453 return true
440454 }
441455 }
442- c .tryRefreshCredentials (true )
456+ err = c .tryRefreshCredentials (true )
457+ if err != nil {
458+ return false
459+ }
443460 currentCredentials := c .currentCredentials ()
444461 return currentCredentials != nil && currentCredentials .AccessToken != "" && currentCredentials .AccessToken != failedAccessToken
445462}
@@ -924,7 +941,16 @@ func (c *defaultCredential) pollUsage() {
924941 return
925942 }
926943 body , _ := io .ReadAll (response .Body )
927- c .logger .Debug ("poll usage for " , c .tag , ": status " , response .StatusCode , " " , string (body ))
944+ if response .StatusCode == http .StatusUnauthorized {
945+ c .logger .Error ("poll usage for " , c .tag , ": status " , response .StatusCode , " " , string (body ))
946+ if ! c .recoverAuthFailure (accessToken ) {
947+ c .markCredentialsUnavailable (E .New ("poll usage unauthorized for " , c .tag ))
948+ }
949+ return
950+ }
951+ if ! c .isPollBackoffAtCap () {
952+ c .logger .Error ("poll usage for " , c .tag , ": status " , response .StatusCode , " " , string (body ))
953+ }
928954 c .incrementPollFailures ()
929955 return
930956 }
@@ -941,7 +967,9 @@ func (c *defaultCredential) pollUsage() {
941967 }
942968 err = json .NewDecoder (response .Body ).Decode (& usageResponse )
943969 if err != nil {
944- c .logger .Debug ("poll usage for " , c .tag , ": decode: " , err )
970+ if ! c .isPollBackoffAtCap () {
971+ c .logger .Error ("poll usage for " , c .tag , ": decode: " , err )
972+ }
945973 c .incrementPollFailures ()
946974 return
947975 }
@@ -982,7 +1010,7 @@ func (c *defaultCredential) pollUsage() {
9821010 if needsProfileFetch {
9831011 profileSnapshot , err := c .fetchProfileSnapshot (httpClient , accessToken )
9841012 if err != nil {
985- c .logger .Debug ("fetch profile for " , c .tag , ": " , err )
1013+ c .logger .Error ("fetch profile for " , c .tag , ": " , err )
9861014 return
9871015 }
9881016 if profileSnapshot != nil {
0 commit comments