1717
1818import java .util .Objects ;
1919import java .util .Optional ;
20+ import java .util .concurrent .atomic .AtomicReference ;
2021import java .util .function .Consumer ;
2122import java .util .function .Supplier ;
2223import software .amazon .awssdk .annotations .SdkPublicApi ;
@@ -49,10 +50,10 @@ public final class ProfileCredentialsProvider
4950 SdkAutoCloseable ,
5051 ToCopyableBuilder <ProfileCredentialsProvider .Builder , ProfileCredentialsProvider > {
5152
52- private AwsCredentialsProvider credentialsProvider ;
53+ private final AtomicReference < AwsCredentialsProvider > credentialsProvider = new AtomicReference <>() ;
5354 private final RuntimeException loadException ;
5455 private final Supplier <ProfileFile > profileFile ;
55- private volatile ProfileFile currentProfileFile ;
56+ private final AtomicReference < ProfileFile > currentProfileFile = new AtomicReference <>() ;
5657 private final String profileName ;
5758 private final Supplier <ProfileFile > defaultProfileFileLoader ;
5859
@@ -116,32 +117,21 @@ public AwsCredentials resolveCredentials() {
116117 throw loadException ;
117118 }
118119
120+ ProfileFile current = currentProfileFile .get ();
119121 ProfileFile cachedOrRefreshedProfileFile = refreshProfileFile ();
120- if (isNewProfileFile ( cachedOrRefreshedProfileFile )) {
121- currentProfileFile = cachedOrRefreshedProfileFile ;
122+ if (! Objects . equals ( current , cachedOrRefreshedProfileFile )
123+ && currentProfileFile . compareAndSet ( current , cachedOrRefreshedProfileFile )) {
122124 handleProfileFileReload (cachedOrRefreshedProfileFile );
123125 }
124126
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 ();
138128 }
139129
140130 @ Override
141131 public String toString () {
142132 return ToString .builder ("ProfileCredentialsProvider" )
143133 .add ("profileName" , profileName )
144- .add ("profileFile" , currentProfileFile )
134+ .add ("profileFile" , currentProfileFile . get () )
145135 .build ();
146136 }
147137
@@ -155,6 +145,14 @@ public void close() {
155145 IoUtils .closeIfCloseable (credentialsProvider , null );
156146 }
157147
148+ private void handleProfileFileReload (ProfileFile profileFile ) {
149+ credentialsProvider .set (createCredentialsProvider (profileFile , profileName ));
150+ }
151+
152+ private ProfileFile refreshProfileFile () {
153+ return profileFile .get ();
154+ }
155+
158156 @ Override
159157 public Builder toBuilder () {
160158 return new BuilderImpl (this );
0 commit comments