diff --git a/modules/dataverse-parent/pom.xml b/modules/dataverse-parent/pom.xml
index fad20be352c..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.33.0
+ 2.41.10
26.30.0
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..f6058f4000f 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;
@@ -1014,8 +1012,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 +1068,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 +1128,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);
@@ -1566,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();
+ }
+}