From 69198c5ad0096eed2f959f299b378d4f4dad30dd Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 4 Nov 2025 12:38:29 -0500 Subject: [PATCH 1/2] With this patch Globus uploads are no longer locking datasets for edits and/or further uploads (when the async. task management mode is enabled). --- .../edu/harvard/iq/dataverse/DatasetPage.java | 24 +++++++++++++------ .../iq/dataverse/PermissionServiceBean.java | 20 +++++++++++++--- .../dataverse/globus/GlobusServiceBean.java | 20 ++++++++++++++++ src/main/java/propertyFiles/Bundle.properties | 1 + src/main/webapp/dataset.xhtml | 15 ++++++++---- 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index b41e8d4ac35..c2f41beb393 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -157,6 +157,7 @@ import edu.harvard.iq.dataverse.search.SearchFields; import edu.harvard.iq.dataverse.search.SearchUtil; import edu.harvard.iq.dataverse.search.SolrClientService; +import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.settings.JvmSettings; import edu.harvard.iq.dataverse.util.SignpostingResources; import edu.harvard.iq.dataverse.util.FileMetadataUtil; @@ -2367,7 +2368,8 @@ public boolean isValidOrCanReviewIncomplete() { private void displayLockInfo(Dataset dataset) { // Various info messages, when the dataset is locked (for various reasons): - if (dataset.isLocked() && canUpdateDataset()) { + boolean globusUploadInProgress = globusService.isUploadTaskInProgressForDataset(dataset.getId()); + if ((dataset.isLocked() || globusUploadInProgress) && canUpdateDataset()) { if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) { JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("dataset.locked.message"), BundleUtil.getStringFromBundle("dataset.locked.message.details")); @@ -2381,9 +2383,17 @@ private void displayLockInfo(Dataset dataset) { BundleUtil.getStringFromBundle("file.rsyncUpload.inProgressMessage.details")); lockedDueToDcmUpload = true; } - if (dataset.isLockedFor(DatasetLock.Reason.GlobusUpload)) { - JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessage.summary"), - BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessage.details")); + if (dataset.isLockedFor(DatasetLock.Reason.GlobusUpload) + || globusUploadInProgress) { + // (prod. patch 6.8) fall back to the old-style Globus lock message unless + // the new, async task mgmt model is used. + if (FeatureFlags.GLOBUS_USE_EXPERIMENTAL_ASYNC_FRAMEWORK.enabled()) { + JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessage.summary"), + BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessageAsync.details")); + } else { + JH.addMessage(FacesMessage.SEVERITY_WARN, BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessage.summary"), + BundleUtil.getStringFromBundle("file.globusUpload.inProgressMessage.details")); + } } //This is a hack to remove dataset locks for File PID registration if //the dataset is released @@ -4357,10 +4367,10 @@ public boolean isStillLockedForAnyReason() { if (dataset.getId() != null) { Dataset testDataset = datasetService.find(dataset.getId()); if (testDataset != null && testDataset.getId() != null) { + // Refresh the info messages, in case the dataset has been + // re-locked with a different lock type (or a Globus upload task is in progress): + displayLockInfo(testDataset); if (testDataset.getLocks().size() > 0) { - // Refresh the info messages, in case the dataset has been - // re-locked with a different lock type: - displayLockInfo(testDataset); return true; } } diff --git a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java index d492991bb62..f106a218d81 100644 --- a/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/PermissionServiceBean.java @@ -27,6 +27,8 @@ import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException; import edu.harvard.iq.dataverse.engine.command.impl.PublishDatasetCommand; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand; +import edu.harvard.iq.dataverse.globus.GlobusServiceBean; +import edu.harvard.iq.dataverse.settings.FeatureFlags; import edu.harvard.iq.dataverse.util.BundleUtil; import edu.harvard.iq.dataverse.workflow.PendingWorkflowInvocation; import edu.harvard.iq.dataverse.workflow.WorkflowServiceBean; @@ -85,6 +87,9 @@ public class PermissionServiceBean { @EJB GroupServiceBean groupService; + + @EJB + GlobusServiceBean globusService; @Inject DataverseSession session; @@ -779,8 +784,14 @@ else if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) { else if (dataset.isLockedFor(DatasetLock.Reason.DcmUpload)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); } + /** + * prod. patch 6.8: as an experiment, not locking datasets for edits while Globus uploads in progress: + */ else if (dataset.isLockedFor(DatasetLock.Reason.GlobusUpload)) { - throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + // ... but we'll keep it locked for edits unless the new, async task mgmt. is in use + if (!FeatureFlags.GLOBUS_USE_EXPERIMENTAL_ASYNC_FRAMEWORK.enabled()) { + throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); + } } else if (dataset.isLockedFor(DatasetLock.Reason.EditInProgress)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.editNotAllowed"), command); @@ -806,7 +817,9 @@ public void checkUpdateDatasetVersionLock(Dataset dataset, DataverseRequest data } public void checkPublishDatasetLock(Dataset dataset, DataverseRequest dataverseRequest, Command command) throws IllegalCommandException { - if (dataset.isLocked()) { + // prod. patch 6.8: + boolean globusUploadInProgress = globusService.isUploadTaskInProgressForDataset(dataset.getId()); + if (dataset.isLocked() || globusUploadInProgress) { if (dataset.isLockedFor(DatasetLock.Reason.Ingest)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } @@ -825,7 +838,8 @@ else if (dataset.isLockedFor(DatasetLock.Reason.Workflow)) { else if (dataset.isLockedFor(DatasetLock.Reason.DcmUpload)) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } - else if (dataset.isLockedFor(DatasetLock.Reason.GlobusUpload)) { + else if (dataset.isLockedFor(DatasetLock.Reason.GlobusUpload) + || globusUploadInProgress) { throw new IllegalCommandException(BundleUtil.getStringFromBundle("dataset.message.locked.publishNotAllowed"), command); } else if (dataset.isLockedFor(DatasetLock.Reason.EditInProgress)) { diff --git a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java index 789e0883a7c..0aea1b29425 100644 --- a/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/globus/GlobusServiceBean.java @@ -51,6 +51,7 @@ import org.primefaces.PrimeFaces; import com.google.gson.Gson; +import com.rometools.utils.Lists; import edu.harvard.iq.dataverse.api.ApiConstants; import edu.harvard.iq.dataverse.authorization.AuthenticationServiceBean; import edu.harvard.iq.dataverse.authorization.users.ApiToken; @@ -1700,6 +1701,25 @@ public List findAllOngoingTasks(GlobusTaskInProgress.TaskT return em.createQuery("select object(o) from GlobusTaskInProgress as o where o.taskType=:taskType order by o.startTime", GlobusTaskInProgress.class).setParameter("taskType", taskType).getResultList(); } + public List findAllOngoingTasksForDataset(GlobusTaskInProgress.TaskType taskType, Long datasetId) { + return em.createQuery("select object(o) from GlobusTaskInProgress as o where o.taskType=:taskType and o.dataset.id=:datasetId order by o.startTime", GlobusTaskInProgress.class) + .setParameter("taskType", taskType) + .setParameter("datasetId", datasetId) + .getResultList(); + } + + /** + * (prod. patch 6.8) + * @param datasetId + * @return + */ + public boolean isUploadTaskInProgressForDataset(Long datasetId) { + if (!FeatureFlags.GLOBUS_USE_EXPERIMENTAL_ASYNC_FRAMEWORK.enabled()) { + return false; + } + return Lists.isNotEmpty(findAllOngoingTasksForDataset(GlobusTaskInProgress.TaskType.UPLOAD, datasetId)); + } + public boolean isRuleInUseByOtherTasks(String ruleId) { Long numTask = em.createQuery("select count(o) from GlobusTaskInProgress as o where o.ruleId=:ruleId", Long.class).setParameter("ruleId", ruleId).getSingleResult(); return numTask > 1; diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index f6ca8a9d4f0..551339d46fb 100644 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -1956,6 +1956,7 @@ file.rsyncUpload.rsyncUploadDisabledDueFileUploadedViaHttp=Upload with rsync + S file.rsyncUpload.rsyncUploadDisabledDueFileUploadedViaHttpAndPublished=Upload with rsync + SSH is disabled for this dataset because you have already uploaded files via HTTP and published the dataset. file.globusUpload.inProgressMessage.summary=Globus Transfer in Progress file.globusUpload.inProgressMessage.details=This dataset is locked while the data files are being transferred and verified. Large transfers may take significant time. You can check transfer status at https://app.globus.org/activity. +file.globusUpload.inProgressMessageAsync.details=This dataset cannot be published while Globus transfers are in progress. Large transfers may take significant time. You can check transfer status at https://app.globus.org/activity. file.metaData.checksum.copy=Click to copy file.metaData.dataFile.dataTab.unf=UNF file.metaData.dataFile.dataTab.variables=Variables diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 7729b6da442..bd2f21e7c02 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -360,16 +360,23 @@
- - + + - - + + + + + + + + + #{showPublishLink ? bundle['dataset.publishBtn'] : (latestVersionInReview ? bundle['dataset.disabledSubmittedBtn'] : bundle['dataset.submitBtn'])} From 93478fa57dc6ec3171cb1ba403b15a9f0508e09d Mon Sep 17 00:00:00 2001 From: Leonid Andreev Date: Tue, 18 Nov 2025 11:00:27 -0500 Subject: [PATCH 2/2] Unused commented-out code removed. --- src/main/webapp/dataset.xhtml | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/webapp/dataset.xhtml b/src/main/webapp/dataset.xhtml index 031d987dea5..9c94dbe130a 100644 --- a/src/main/webapp/dataset.xhtml +++ b/src/main/webapp/dataset.xhtml @@ -374,9 +374,6 @@ - - - #{showPublishLink ? bundle['dataset.publishBtn'] : (latestVersionInReview ? bundle['dataset.disabledSubmittedBtn'] : bundle['dataset.submitBtn'])}