@@ -10,6 +10,7 @@ import com.intellij.openapi.extensions.ExtensionPointName
1010import com.intellij.openapi.progress.ProcessCanceledException
1111import com.intellij.openapi.project.Project
1212import migration.software.aws.toolkits.jetbrains.services.telemetry.TelemetryService
13+ import org.jetbrains.annotations.VisibleForTesting
1314import software.amazon.awssdk.services.ssooidc.model.SsoOidcException
1415import software.aws.toolkits.core.ClientConnectionSettings
1516import software.aws.toolkits.core.ConnectionSettings
@@ -36,6 +37,7 @@ import software.aws.toolkits.telemetry.CredentialType
3637import software.aws.toolkits.telemetry.Result
3738import java.net.UnknownHostException
3839import java.time.Instant
40+ import java.util.concurrent.atomic.AtomicBoolean
3941
4042sealed interface ToolkitConnection {
4143 val id: String
@@ -276,7 +278,7 @@ fun reauthConnectionIfNeeded(
276278 source = source,
277279 )
278280 }
279- hasSeenFirstNetworkError = false
281+ hasSeenFirstNetworkError.set( false )
280282 } catch (e: Exception ) {
281283 if (isReAuth) {
282284 val result = if (e is ProcessCanceledException ) Result .Cancelled else Result .Failed
@@ -328,7 +330,7 @@ fun maybeReauthProviderIfNeeded(
328330 return runUnderProgressIfNeeded(project, AwsCoreBundle .message(" credentials.refreshing" ), true ) {
329331 tokenProvider.resolveToken()
330332 BearerTokenProviderListener .notifyCredUpdate(tokenProvider.id)
331- hasSeenFirstNetworkError = false
333+ hasSeenFirstNetworkError.set( false )
332334 return @runUnderProgressIfNeeded false
333335 }
334336 } catch (e: Exception ) {
@@ -339,17 +341,14 @@ fun maybeReauthProviderIfNeeded(
339341 onReauthRequired(e)
340342 return true
341343 }
342- e is UnknownHostException || e.message?.contains( " Unable to execute HTTP request " ) == true -> {
344+ e is UnknownHostException || e is RuntimeException -> {
343345 getLogger<ToolkitAuthManager >().warn(e) { " Failed to refresh token" }
344- synchronized(networkErrorLock) {
345- if (! hasSeenFirstNetworkError) {
346- hasSeenFirstNetworkError = true
347- notifyInfo(
348- message(" general.auth.network.error" ),
349- message(" general.auth.network.error.message" ),
350- project
351- )
352- }
346+ if (hasSeenFirstNetworkError.compareAndSet(false , true )) {
347+ notifyInfo(
348+ message(" general.auth.network.error" ),
349+ message(" general.auth.network.error.message" ),
350+ project
351+ )
353352 }
354353 return false
355354 }
@@ -435,8 +434,12 @@ private fun recordAddConnection(
435434 }
436435}
437436
438- private var hasSeenFirstNetworkError = false
439- private val networkErrorLock = Object ()
437+ private var hasSeenFirstNetworkError: AtomicBoolean = AtomicBoolean (false )
438+
439+ @VisibleForTesting
440+ internal fun resetNetworkErrorState () {
441+ hasSeenFirstNetworkError.set(false )
442+ }
440443
441444data class ConnectionMetadata (
442445 val sourceId : String? = null ,
0 commit comments