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(); + } +}