diff --git a/api/src/org/labkey/api/exp/property/Domain.java b/api/src/org/labkey/api/exp/property/Domain.java index 3c0d7b1c1c6..34e2640a650 100644 --- a/api/src/org/labkey/api/exp/property/Domain.java +++ b/api/src/org/labkey/api/exp/property/Domain.java @@ -88,7 +88,7 @@ public interface Domain extends IPropertyType * This pattern effectively forces all callers who are trying to manipulate this domain to queue up. */ Lock getDatabaseLock(); - void lockForDelete(DbSchema expSchema); + void lockForUpdateDelete(DbSchema lockSchema); void delete(@Nullable User user) throws DomainNotFoundException; default void delete(@Nullable User user, @Nullable String auditUserComment) throws DomainNotFoundException diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index cf9f540bf25..5e0adbdc882 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -55,6 +55,7 @@ import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.PropertyType; import org.labkey.api.exp.TemplateInfo; +import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.api.SampleTypeDomainKind; import org.labkey.api.exp.api.StorageProvisioner; import org.labkey.api.gwt.client.AuditBehaviorType; @@ -799,6 +800,10 @@ public static ValidationException updateDomainDescriptor(GWTDomain kind = d.getDomainKind(); ValidationException validationException = validateProperties(d, update, kind, orig, user); diff --git a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java index 367d743da66..6413d6df193 100644 --- a/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExperimentServiceImpl.java @@ -4627,7 +4627,7 @@ private static void _lockDomainsAndProvisionedTables(AssayService assayService, { for (var domain : provider.getDomains(expProtocol)) { - domain.lockForDelete(expSchema); + domain.lockForUpdateDelete(expSchema); } } } @@ -8046,7 +8046,7 @@ public ValidationException updateDataClass(@NotNull Container c, @NotNull User u if (!errors.hasErrors()) { transaction.addCommitTask(() -> clearDataClassCache(c), DbScope.CommitTaskOption.IMMEDIATE, POSTCOMMIT, POSTROLLBACK); - transaction.addCommitTask(() -> indexDataClass(getDataClass(c, dataClass.getName()), SearchService.get().defaultTask().getQueue(c, SearchService.PRIORITY.modified)), POSTCOMMIT); + transaction.addCommitTask(() -> indexDataClass(dataClass, SearchService.get().defaultTask().getQueue(c, SearchService.PRIORITY.modified)), POSTCOMMIT); transaction.commit(); } } diff --git a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java index 62390100c31..2f7186ce200 100644 --- a/experiment/src/org/labkey/experiment/api/property/DomainImpl.java +++ b/experiment/src/org/labkey/experiment/api/property/DomainImpl.java @@ -405,7 +405,7 @@ public void delete(@Nullable User user, @Nullable String auditUserComment) throw ExperimentService exp = ExperimentService.get(); try (DbScope.Transaction transaction = exp.getSchema().getScope().ensureTransaction()) { - lockForDelete(exp.getSchema()); + lockForUpdateDelete(exp.getSchema()); DefaultValueService.get().clearDefaultValues(getContainer(), this); OntologyManager.deleteDomain(getTypeURI(), getContainer()); StorageProvisioner.get().drop(this); @@ -434,19 +434,19 @@ public Lock getDatabaseLock() } @Override - public void lockForDelete(DbSchema expSchema) + public void lockForUpdateDelete(DbSchema lockSchema) { // NOTE code relies on the lock returned from Domain.getLock() does not require unlock(). var lock = getDatabaseLock(); assert lock instanceof DbScope.ServerLock; - assert ExperimentService.get().getSchema().getScope().isTransactionActive(); + assert lockSchema.getScope().isTransactionActive(); lock.lock(); // CONSIDER verify table exists: SELECT 1 FROM pg_tables WHERE schemaname = ? AND tablename = ? - if (null != getStorageTableName() && expSchema.getSqlDialect().isPostgreSQL()) + if (null != getStorageTableName() && lockSchema.getSqlDialect().isPostgreSQL()) { - SQLFragment lockSQL = new SQLFragment().append("LOCK TABLE ").appendDottedIdentifiers(getDomainKind().getStorageSchemaName(), getStorageTableName()).append(" IN EXCLUSIVE MODE").appendEOS().append("\n"); - new SqlExecutor(expSchema).execute(lockSQL); + SQLFragment lockSQL = new SQLFragment().append("LOCK TABLE ").appendDottedIdentifiers(getDomainKind().getStorageSchemaName(), getStorageTableName()).append(" IN ACCESS EXCLUSIVE MODE").appendEOS().append("\n"); + new SqlExecutor(lockSchema).execute(lockSQL); } }