From bfcb037a8c1ad2f74bb9681230cd01a5a92176fc Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 9 Jan 2026 13:14:35 -0500 Subject: [PATCH 1/5] update aws sdk version to 2.41.4 --- modules/dataverse-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index fad20be352c..8f68f7781fc 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -153,7 +153,7 @@ 42.7.7 9.8.0 16 - 2.33.0 + 2.41.4 26.30.0 From 22493881ed2f366468c8f031efb0de5c456be3a0 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 9 Jan 2026 13:14:16 -0500 Subject: [PATCH 2/5] presigner is cached, shouldn't be closed after one use --- .../edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java index cb5175bd354..c6cd92ee652 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java @@ -1014,8 +1014,6 @@ public String generateTemporaryDownloadUrl(String auxiliaryTag, String auxiliary } catch (S3Exception e) { logger.warning("Exception generating temporary S3 url for " + key + " (" + e.getMessage() + ")"); return null; - } finally { - s3Presigner.close(); } if (presignedRequest != null) { @@ -1072,8 +1070,6 @@ private String generateTemporaryS3UploadUrl(String key, Date expiration) throws } catch (S3Exception e) { logger.warning("Exception generating temporary S3 upload url for " + key + " (" + e.getMessage() + ")"); return null; - } finally { - s3Presigner.close(); } String urlString = presignedRequest.url().toString(); @@ -1134,8 +1130,6 @@ public JsonObjectBuilder generateTemporaryS3UploadUrls(String globalId, String s + "&storageidentifier=" + storageIdentifier); response.add("complete", "/api/datasets/mpupload?globalid=" + globalId + "&uploadid=" + uploadId + "&storageidentifier=" + storageIdentifier); - - s3Presigner.close(); } response.add("partSize", minPartSize); From 030311e17a4aeb6c97666a3a0a72fa6052f550be Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 9 Jan 2026 13:42:59 -0500 Subject: [PATCH 3/5] remove unused credentialsProvider --- .../java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java index c6cd92ee652..55efa0fa8bf 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java @@ -120,7 +120,6 @@ public S3AccessIO(T dvObject, DataAccessRequest req, String driverId) { try { bucketName = getBucketName(driverId); minPartSize = getMinPartSize(driverId); - credentialsProvider = getCredentialsProvider(driverId); s3 = getClient(driverId); tm = getTransferManager(driverId); s3Presigner = getPresigner(driverId); @@ -156,7 +155,6 @@ public S3AccessIO(T dvObject, DataAccessRequest req, @NotNull S3AsyncClient s3cl private S3AsyncClient s3 = null; private S3Presigner s3Presigner = null; - private AwsCredentialsProvider credentialsProvider; private S3TransferManager tm = null; private String bucketName = null; private String key = null; From f866c590c7b48614f2764330f09da1434d367e48 Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Fri, 9 Jan 2026 14:50:07 -0500 Subject: [PATCH 4/5] Close S3 lifecycle leaks of AWS classes --- .../iq/dataverse/dataaccess/S3AccessIO.java | 12 ++++++++++++ .../iq/dataverse/dataaccess/S3LifecycleBean.java | 15 +++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/main/java/edu/harvard/iq/dataverse/dataaccess/S3LifecycleBean.java diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java index 55efa0fa8bf..f6058f4000f 100644 --- a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3AccessIO.java @@ -1558,4 +1558,16 @@ public static String getNewIdentifier(String driverId) { return driverId + DataAccess.SEPARATOR + getConfigParamForDriver(driverId, BUCKET_NAME) + ":" + FileUtil.generateStorageIdentifier(); } + + public static void closeAll() { + logger.info("Closing all S3 clients and transfer managers."); + driverTMMap.values().forEach(S3TransferManager::close); + driverTMMap.clear(); + driverClientMap.values().forEach(S3AsyncClient::close); + driverClientMap.clear(); + driverPresignerMap.values().forEach(S3Presigner::close); + driverPresignerMap.clear(); + // AwsCredentialsProvider does not need to be closed unless it's a specific implementation that requires it. + driverCredentialsProviderMap.clear(); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3LifecycleBean.java b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3LifecycleBean.java new file mode 100644 index 00000000000..e6a8cd816b0 --- /dev/null +++ b/src/main/java/edu/harvard/iq/dataverse/dataaccess/S3LifecycleBean.java @@ -0,0 +1,15 @@ +package edu.harvard.iq.dataverse.dataaccess; + +import jakarta.annotation.PreDestroy; +import jakarta.ejb.Singleton; +import jakarta.ejb.Startup; + +@Singleton +@Startup +public class S3LifecycleBean { + + @PreDestroy + public void cleanup() { + S3AccessIO.closeAll(); + } +} From e0700d058ac32a8be3ca26d966099dd384d8e7bb Mon Sep 17 00:00:00 2001 From: Jim Myers Date: Thu, 22 Jan 2026 15:43:29 -0500 Subject: [PATCH 5/5] latest sdk --- modules/dataverse-parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml index 8f68f7781fc..c42689b1011 100644 --- a/modules/dataverse-parent/pom.xml +++ b/modules/dataverse-parent/pom.xml @@ -153,7 +153,7 @@ 42.7.7 9.8.0 16 - 2.41.4 + 2.41.10 26.30.0