diff --git a/src/main/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPlugin.java b/src/main/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPlugin.java index 77e61bb..6586e11 100644 --- a/src/main/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPlugin.java +++ b/src/main/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPlugin.java @@ -72,9 +72,6 @@ String userAgent() { return this.userAgent; } - ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() - .putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_PREFIX, userAgent()).build(); - /** * Change the configuration on the S3Clients to use S3 Access Grants specific AuthScheme and identityProviders. * @param config the existing configuration on the clients. Passed by the SDK on request path. @@ -103,6 +100,9 @@ public void configureClient(SdkServiceClientConfiguration.Builder config) { S3ControlAsyncClientBuilder s3ControlAsyncClientBuilder = S3ControlAsyncClient.builder() .credentialsProvider(serviceClientConfiguration.credentialsProvider()); + ClientOverrideConfiguration overrideConfig = ClientOverrideConfiguration.builder() + .putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_PREFIX, userAgent()).build(); + S3Client s3Client = S3Client .builder() .crossRegionAccessEnabled(true) diff --git a/src/test/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPluginTests.java b/src/test/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPluginTests.java index 933d11f..9e170cb 100644 --- a/src/test/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPluginTests.java +++ b/src/test/java/software/amazon/awssdk/s3accessgrants/plugin/S3AccessGrantsPluginTests.java @@ -18,15 +18,24 @@ import org.junit.BeforeClass; import org.junit.Test; import org.assertj.core.api.Assertions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import software.amazon.awssdk.core.SdkServiceClientConfiguration; import software.amazon.awssdk.core.exception.SdkClientException; import software.amazon.awssdk.services.s3.S3ServiceClientConfiguration; import software.amazon.awssdk.services.s3.auth.scheme.S3AuthSchemeProvider; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.regions.Region; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class S3AccessGrantsPluginTests { + private static final Logger logger = LoggerFactory.getLogger(S3AccessGrantsPluginTests.class); + @BeforeClass public static void setUp() { System.setProperty("aws.region", "us-east-2"); @@ -156,4 +165,39 @@ public void create_access_grants_plugin_without_userAgent_specified() { public void create_access_grants_plugin_with_not_permitted_userAgent_name() { Assertions.assertThatThrownBy(() -> S3AccessGrantsPlugin.builder().userAgent("testUserAgent/").build()).isInstanceOf(IllegalArgumentException.class); } + + @Test + public void configureClient_concurrent_access_should_not_throw_null_pointer_exception() throws InterruptedException { + S3AccessGrantsPlugin accessGrantsPlugin = S3AccessGrantsPlugin.builder().build(); + int threadCount = 10; + ExecutorService executor = Executors.newFixedThreadPool(threadCount); + CountDownLatch latch = new CountDownLatch(threadCount); + AtomicInteger successCount = new AtomicInteger(0); + AtomicInteger exceptionCount = new AtomicInteger(0); + + for (int i = 0; i < threadCount; i++) { + executor.submit(() -> { + try { + SdkServiceClientConfiguration.Builder config = S3ServiceClientConfiguration.builder() + .authSchemeProvider(S3AuthSchemeProvider.defaultProvider()) + .credentialsProvider(DefaultCredentialsProvider.create()) + .region(Region.US_EAST_2); + + accessGrantsPlugin.configureClient(config); + successCount.incrementAndGet(); + } catch (Exception e) { + exceptionCount.incrementAndGet(); + logger.error("An error occurred: ", e); + } finally { + latch.countDown(); + } + }); + } + + latch.await(10, TimeUnit.SECONDS); + executor.shutdown(); + + Assertions.assertThat(successCount.get()).isEqualTo(threadCount); + Assertions.assertThat(exceptionCount.get()).isEqualTo(0); + } }