17
17
18
18
import java .util .Objects ;
19
19
import java .util .Optional ;
20
+ import java .util .concurrent .atomic .AtomicReference ;
20
21
import java .util .function .Consumer ;
21
22
import java .util .function .Supplier ;
22
23
import software .amazon .awssdk .annotations .SdkPublicApi ;
@@ -49,10 +50,10 @@ public final class ProfileCredentialsProvider
49
50
SdkAutoCloseable ,
50
51
ToCopyableBuilder <ProfileCredentialsProvider .Builder , ProfileCredentialsProvider > {
51
52
52
- private AwsCredentialsProvider credentialsProvider ;
53
+ private final AtomicReference < AwsCredentialsProvider > credentialsProvider = new AtomicReference <>() ;
53
54
private final RuntimeException loadException ;
54
55
private final Supplier <ProfileFile > profileFile ;
55
- private volatile ProfileFile currentProfileFile ;
56
+ private final AtomicReference < ProfileFile > currentProfileFile = new AtomicReference <>() ;
56
57
private final String profileName ;
57
58
private final Supplier <ProfileFile > defaultProfileFileLoader ;
58
59
@@ -116,32 +117,21 @@ public AwsCredentials resolveCredentials() {
116
117
throw loadException ;
117
118
}
118
119
120
+ ProfileFile current = currentProfileFile .get ();
119
121
ProfileFile cachedOrRefreshedProfileFile = refreshProfileFile ();
120
- if (isNewProfileFile ( cachedOrRefreshedProfileFile )) {
121
- currentProfileFile = cachedOrRefreshedProfileFile ;
122
+ if (! Objects . equals ( current , cachedOrRefreshedProfileFile )
123
+ && currentProfileFile . compareAndSet ( current , cachedOrRefreshedProfileFile )) {
122
124
handleProfileFileReload (cachedOrRefreshedProfileFile );
123
125
}
124
126
125
- return credentialsProvider .resolveCredentials ();
126
- }
127
-
128
- private void handleProfileFileReload (ProfileFile profileFile ) {
129
- credentialsProvider = createCredentialsProvider (profileFile , profileName );
130
- }
131
-
132
- private ProfileFile refreshProfileFile () {
133
- return profileFile .get ();
134
- }
135
-
136
- private boolean isNewProfileFile (ProfileFile profileFile ) {
137
- return !Objects .equals (currentProfileFile , profileFile );
127
+ return credentialsProvider .get ().resolveCredentials ();
138
128
}
139
129
140
130
@ Override
141
131
public String toString () {
142
132
return ToString .builder ("ProfileCredentialsProvider" )
143
133
.add ("profileName" , profileName )
144
- .add ("profileFile" , currentProfileFile )
134
+ .add ("profileFile" , currentProfileFile . get () )
145
135
.build ();
146
136
}
147
137
@@ -155,6 +145,14 @@ public void close() {
155
145
IoUtils .closeIfCloseable (credentialsProvider , null );
156
146
}
157
147
148
+ private void handleProfileFileReload (ProfileFile profileFile ) {
149
+ credentialsProvider .set (createCredentialsProvider (profileFile , profileName ));
150
+ }
151
+
152
+ private ProfileFile refreshProfileFile () {
153
+ return profileFile .get ();
154
+ }
155
+
158
156
@ Override
159
157
public Builder toBuilder () {
160
158
return new BuilderImpl (this );
0 commit comments