Skip to content

Commit 174f9dc

Browse files
Merge pull request #478 from Breeding-Insight/bug/BI-2269-2
BI-2269 - Two experiments with the same title loaded to rel-test: Concurency
2 parents be92ef7 + fd7da0c commit 174f9dc

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

src/main/java/org/breedinginsight/brapps/importer/services/processors/experiment/create/workflow/steps/CommitPendingImportObjectsStep.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.breedinginsight.services.OntologyService;
4949
import org.breedinginsight.services.ProgramLocationService;
5050
import org.breedinginsight.services.exceptions.DoesNotExistException;
51+
import org.breedinginsight.services.exceptions.UnprocessableEntityException;
5152
import org.breedinginsight.utilities.Utilities;
5253

5354
import javax.inject.Inject;
@@ -58,6 +59,8 @@
5859
import java.util.Objects;
5960
import java.util.stream.Collectors;
6061

62+
import static org.breedinginsight.brapps.importer.services.processors.experiment.ExperimentUtilities.PREEXISTING_EXPERIMENT_TITLE;
63+
6164
@Singleton
6265
@Slf4j
6366
public class CommitPendingImportObjectsStep {
@@ -88,7 +91,7 @@ public CommitPendingImportObjectsStep(BrAPIListDAO brAPIListDAO,
8891
}
8992

9093
// TODO: some common code between workflows here that could be broken out, removed append/update specific code
91-
public void process(ProcessContext processContext, ProcessedData processedData) {
94+
public void process(ProcessContext processContext, ProcessedData processedData) throws UnprocessableEntityException {
9295

9396
PendingData pendingData = processContext.getPendingData();
9497
ImportContext importContext = processContext.getImportContext();
@@ -138,6 +141,24 @@ public void process(ProcessContext processContext, ProcessedData processedData)
138141

139142
AuthenticatedUser actingUser = new AuthenticatedUser(upload.getUpdatedByUser().getName(), new ArrayList<>(), upload.getUpdatedByUser().getId(), new ArrayList<>());
140143

144+
// TODO: Implement more robust solution either brapi server side or possibly redis SETNX client side
145+
// Do this check here, directly before creating new trials instead of in earlier step to minimize time window of race condition
146+
if (!newTrials.isEmpty()) {
147+
try {
148+
List<BrAPITrial> cachedTrials = brapiTrialDAO.getTrials(program.getId());
149+
List<String> existingTrialNames = cachedTrials.stream().map(BrAPITrial::getTrialName).collect(Collectors.toList());
150+
List<String> newTrialNames = newTrials.stream().map(t -> Utilities.removeProgramKey(t.getTrialName(), program.getKey())).collect(Collectors.toList());
151+
log.debug("** Trials Duplicate Check: {} -> {}", existingTrialNames, newTrialNames);
152+
if (newTrialNames.stream().anyMatch(existingTrialNames::contains)) {
153+
log.debug("** New matches existing");
154+
throw new UnprocessableEntityException(PREEXISTING_EXPERIMENT_TITLE);
155+
}
156+
} catch (ApiException e) {
157+
log.error("Error getting trials for duplicate name check", e);
158+
throw new InternalServerException(e.getMessage(), e);
159+
}
160+
}
161+
141162
try {
142163
List<BrAPIListSummary> createdDatasets = new ArrayList<>(brAPIListDAO.createBrAPILists(newDatasetRequests, program.getId(), upload));
143164
createdDatasets.forEach(summary -> obsVarDatasetByName.get(summary.getListName()).getBrAPIObject().setListDbId(summary.getListDbId()));

0 commit comments

Comments
 (0)