Skip to content

Commit 504829d

Browse files
author
Slimane AMAR
committed
Do not abort transaction when remote data deleting
1 parent ee669ca commit 504829d

File tree

5 files changed

+71
-69
lines changed

5 files changed

+71
-69
lines changed

src/main/java/org/gridsuite/study/server/dto/DeleteNodeInfos.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
@Getter
2121
@Setter
2222
public class DeleteNodeInfos {
23+
private List<UUID> removedNodeUuids = new ArrayList<>();
24+
2325
private List<UUID> modificationGroupUuids = new ArrayList<>();
2426

2527
private List<UUID> reportUuids = new ArrayList<>();
@@ -46,6 +48,10 @@ public class DeleteNodeInfos {
4648

4749
private List<UUID> stateEstimationResultUuids = new ArrayList<>();
4850

51+
public void addRemovedNodeUuid(UUID removedNodeUuid) {
52+
removedNodeUuids.add(removedNodeUuid);
53+
}
54+
4955
public void addModificationGroupUuid(UUID modificationGroupUuid) {
5056
modificationGroupUuids.add(modificationGroupUuid);
5157
}

src/main/java/org/gridsuite/study/server/service/LoadFlowService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,6 @@ public void deleteLoadFlowResults(List<UUID> resultsUuids) {
106106
deleteCalculationResults(resultsUuids, DELIMITER + LOADFLOW_API_VERSION + "/results", restTemplate, loadFlowServerBaseUri);
107107
}
108108

109-
public void deleteAllLoadFlowResults() {
110-
deleteLoadFlowResults(null);
111-
}
112-
113109
public Integer getLoadFlowResultsCount() {
114110
String path = UriComponentsBuilder
115111
.fromPath(DELIMITER + LOADFLOW_API_VERSION + "/supervision/results-count").toUriString();

src/main/java/org/gridsuite/study/server/service/NetworkModificationTreeService.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,12 +271,10 @@ public void moveStudySubtree(UUID parentNodeToMoveUuid, UUID anchorNodeUuid) {
271271

272272
@Transactional
273273
// TODO test if studyUuid exist and have a node <nodeId>
274-
public List<UUID> doDeleteNode(UUID nodeId, boolean deleteChildren, DeleteNodeInfos deleteNodeInfos) {
275-
List<UUID> removedNodes = new ArrayList<>();
274+
public void doDeleteNode(UUID nodeId, boolean deleteChildren, DeleteNodeInfos deleteNodeInfos) {
276275
UUID studyId = self.getStudyUuidForNodeId(nodeId);
277-
deleteNodes(nodeId, deleteChildren, false, removedNodes, deleteNodeInfos);
278-
notificationService.emitNodesDeleted(studyId, removedNodes, deleteChildren);
279-
return removedNodes;
276+
deleteNodes(nodeId, deleteChildren, false, deleteNodeInfos);
277+
notificationService.emitNodesDeleted(studyId, deleteNodeInfos.getRemovedNodeUuids(), deleteChildren);
280278
}
281279

282280
@Transactional
@@ -314,7 +312,7 @@ private void stashNodes(UUID id, boolean stashChildren, List<UUID> stashedNodes,
314312
});
315313
}
316314

317-
private void deleteNodes(UUID id, boolean deleteChildren, boolean allowDeleteRoot, List<UUID> removedNodes, DeleteNodeInfos deleteNodeInfos) {
315+
private void deleteNodes(UUID id, boolean deleteChildren, boolean allowDeleteRoot, DeleteNodeInfos deleteNodeInfos) {
318316
Optional<NodeEntity> optNodeToDelete = nodesRepository.findById(id);
319317
optNodeToDelete.ifPresent(nodeToDelete -> {
320318
/* root cannot be deleted by accident */
@@ -332,9 +330,9 @@ private void deleteNodes(UUID id, boolean deleteChildren, boolean allowDeleteRoo
332330
getChildren(id).forEach(node -> node.setParentNode(nodeToDelete.getParentNode()));
333331
} else {
334332
getChildren(id)
335-
.forEach(child -> deleteNodes(child.getIdNode(), true, false, removedNodes, deleteNodeInfos));
333+
.forEach(child -> deleteNodes(child.getIdNode(), true, false, deleteNodeInfos));
336334
}
337-
removedNodes.add(id);
335+
deleteNodeInfos.addRemovedNodeUuid(id);
338336
if (nodeToDelete.getType() == NodeType.ROOT) {
339337
rootNodeInfoRepository.deleteById(id);
340338
} else {

src/main/java/org/gridsuite/study/server/service/StudyServerExecutionService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import jakarta.annotation.PostConstruct;
1111
import jakarta.annotation.PreDestroy;
12+
import org.slf4j.Logger;
13+
import org.slf4j.LoggerFactory;
1214
import org.springframework.stereotype.Service;
1315

1416
import java.util.concurrent.CompletableFuture;
@@ -18,6 +20,8 @@
1820
@Service
1921
public class StudyServerExecutionService {
2022

23+
private static final Logger LOGGER = LoggerFactory.getLogger(StudyServerExecutionService.class);
24+
2125
private ExecutorService executorService;
2226

2327
@PostConstruct
@@ -33,4 +37,14 @@ private void preDestroy() {
3337
public CompletableFuture<Void> runAsync(Runnable runnable) {
3438
return CompletableFuture.runAsync(runnable, executorService);
3539
}
40+
41+
public CompletableFuture<Void> runAsyncAndComplete(Runnable runnable) {
42+
return CompletableFuture.runAsync(runnable, executorService).whenCompleteAsync((r, t) -> logAsyncError(t));
43+
}
44+
45+
private void logAsyncError(Throwable e) {
46+
if (e != null) {
47+
LOGGER.error(e.toString(), e);
48+
}
49+
}
3650
}

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 45 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,33 +1975,6 @@ public void invalidateBlockedBuildNodeTree(UUID studyUuid, UUID nodeUuid) {
19751975
);
19761976
}
19771977

1978-
private void deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) {
1979-
CompletableFuture<Void> executeInParallel = CompletableFuture.allOf(
1980-
studyServerExecutionService.runAsync(() -> networkModificationService.deleteIndexedModifications(invalidateNodeInfos.getGroupUuids(), invalidateNodeInfos.getNetworkUuid())),
1981-
studyServerExecutionService.runAsync(() -> networkStoreService.deleteVariants(invalidateNodeInfos.getNetworkUuid(), invalidateNodeInfos.getVariantIds())),
1982-
studyServerExecutionService.runAsync(() -> reportService.deleteReports(invalidateNodeInfos.getReportUuids())),
1983-
studyServerExecutionService.runAsync(() -> loadflowService.deleteLoadFlowResults(invalidateNodeInfos.getLoadFlowResultUuids())),
1984-
studyServerExecutionService.runAsync(() -> securityAnalysisService.deleteSecurityAnalysisResults(invalidateNodeInfos.getSecurityAnalysisResultUuids())),
1985-
studyServerExecutionService.runAsync(() -> sensitivityAnalysisService.deleteSensitivityAnalysisResults(invalidateNodeInfos.getSensitivityAnalysisResultUuids())),
1986-
studyServerExecutionService.runAsync(() -> nonEvacuatedEnergyService.deleteNonEvacuatedEnergyResults(invalidateNodeInfos.getNonEvacuatedEnergyResultUuids())),
1987-
studyServerExecutionService.runAsync(() -> shortCircuitService.deleteShortCircuitAnalysisResults(invalidateNodeInfos.getShortCircuitAnalysisResultUuids())),
1988-
studyServerExecutionService.runAsync(() -> shortCircuitService.deleteShortCircuitAnalysisResults(invalidateNodeInfos.getOneBusShortCircuitAnalysisResultUuids())),
1989-
studyServerExecutionService.runAsync(() -> voltageInitService.deleteVoltageInitResults(invalidateNodeInfos.getVoltageInitResultUuids())),
1990-
studyServerExecutionService.runAsync(() -> dynamicSimulationService.deleteResults(invalidateNodeInfos.getDynamicSimulationResultUuids())),
1991-
studyServerExecutionService.runAsync(() -> dynamicSecurityAnalysisService.deleteResults(invalidateNodeInfos.getDynamicSecurityAnalysisResultUuids())),
1992-
studyServerExecutionService.runAsync(() -> stateEstimationService.deleteStateEstimationResults(invalidateNodeInfos.getStateEstimationResultUuids()))
1993-
);
1994-
try {
1995-
executeInParallel.get();
1996-
} catch (InterruptedException e) {
1997-
Thread.currentThread().interrupt();
1998-
throw new StudyException(INVALIDATE_BUILD_FAILED, e.getMessage());
1999-
} catch (Exception e) {
2000-
throw new StudyException(INVALIDATE_BUILD_FAILED, e.getMessage());
2001-
}
2002-
2003-
}
2004-
20051978
@Transactional
20061979
public void deleteNetworkModifications(UUID studyUuid, UUID nodeUuid, List<UUID> modificationsUuids, String userId) {
20071980
List<UUID> childrenUuids = networkModificationTreeService.getChildrenUuids(nodeUuid);
@@ -2115,47 +2088,62 @@ public void deleteNodes(UUID studyUuid, List<UUID> nodeIds, boolean deleteChildr
21152088

21162089
boolean invalidateChildrenBuild = !deleteChildren && networkModificationTreeService.hasModifications(nodeId, false);
21172090
List<NodeEntity> childrenNodes = networkModificationTreeService.getChildren(nodeId);
2118-
List<UUID> removedNodes = networkModificationTreeService.doDeleteNode(nodeId, deleteChildren, deleteNodeInfos);
2119-
2120-
CompletableFuture<Void> executeInParallel = CompletableFuture.allOf(
2121-
studyServerExecutionService.runAsync(() -> deleteNodeInfos.getModificationGroupUuids().forEach(networkModificationService::deleteModifications)),
2122-
studyServerExecutionService.runAsync(() -> reportService.deleteReports(deleteNodeInfos.getReportUuids())),
2123-
studyServerExecutionService.runAsync(() -> loadflowService.deleteLoadFlowResults(deleteNodeInfos.getLoadFlowResultUuids())),
2124-
studyServerExecutionService.runAsync(() -> securityAnalysisService.deleteSecurityAnalysisResults(deleteNodeInfos.getSecurityAnalysisResultUuids())),
2125-
studyServerExecutionService.runAsync(() -> sensitivityAnalysisService.deleteSensitivityAnalysisResults(deleteNodeInfos.getSensitivityAnalysisResultUuids())),
2126-
studyServerExecutionService.runAsync(() -> nonEvacuatedEnergyService.deleteNonEvacuatedEnergyResults(deleteNodeInfos.getNonEvacuatedEnergyResultUuids())),
2127-
studyServerExecutionService.runAsync(() -> shortCircuitService.deleteShortCircuitAnalysisResults(deleteNodeInfos.getShortCircuitAnalysisResultUuids())),
2128-
studyServerExecutionService.runAsync(() -> shortCircuitService.deleteShortCircuitAnalysisResults(deleteNodeInfos.getOneBusShortCircuitAnalysisResultUuids())),
2129-
studyServerExecutionService.runAsync(() -> voltageInitService.deleteVoltageInitResults(deleteNodeInfos.getVoltageInitResultUuids())),
2130-
studyServerExecutionService.runAsync(() -> dynamicSimulationService.deleteResults(deleteNodeInfos.getDynamicSimulationResultUuids())),
2131-
studyServerExecutionService.runAsync(() -> dynamicSecurityAnalysisService.deleteResults(deleteNodeInfos.getDynamicSecurityAnalysisResultUuids())),
2132-
studyServerExecutionService.runAsync(() -> stateEstimationService.deleteStateEstimationResults(deleteNodeInfos.getStateEstimationResultUuids())),
2133-
studyServerExecutionService.runAsync(() -> deleteNodeInfos.getVariantIds().forEach(networkStoreService::deleteVariants)),
2134-
studyServerExecutionService.runAsync(() -> removedNodes.forEach(dynamicSimulationEventService::deleteEventsByNodeId))
2135-
);
2091+
networkModificationTreeService.doDeleteNode(nodeId, deleteChildren, deleteNodeInfos);
21362092

2137-
try {
2138-
executeInParallel.get();
2139-
} catch (InterruptedException e) {
2140-
Thread.currentThread().interrupt();
2141-
throw new StudyException(DELETE_NODE_FAILED, e.getMessage());
2142-
} catch (Exception e) {
2143-
throw new StudyException(DELETE_NODE_FAILED, e.getMessage());
2093+
if (invalidateChildrenBuild) {
2094+
childrenNodes.forEach(nodeEntity -> invalidateNodeTree(studyUuid, nodeEntity.getIdNode()));
21442095
}
21452096

21462097
if (startTime.get() != null && LOGGER.isTraceEnabled()) {
21472098
LOGGER.trace("Delete node '{}' of study '{}' : {} seconds", nodeId.toString().replaceAll("[\n\r]", "_"), studyUuid,
2148-
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
2149-
}
2150-
2151-
if (invalidateChildrenBuild) {
2152-
childrenNodes.forEach(nodeEntity -> invalidateNodeTree(studyUuid, nodeEntity.getIdNode()));
2099+
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
21532100
}
21542101
}
21552102

2103+
deleteNodesInfos(deleteNodeInfos);
2104+
21562105
notificationService.emitElementUpdated(studyUuid, userId);
21572106
}
21582107

2108+
// /!\ Do not wait completion and do not throw exception
2109+
private void deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) {
2110+
CompletableFuture.allOf(
2111+
studyServerExecutionService.runAsyncAndComplete(() -> networkStoreService.deleteVariants(invalidateNodeInfos.getNetworkUuid(), invalidateNodeInfos.getVariantIds())),
2112+
studyServerExecutionService.runAsyncAndComplete(() -> networkModificationService.deleteIndexedModifications(invalidateNodeInfos.getGroupUuids(), invalidateNodeInfos.getNetworkUuid())),
2113+
studyServerExecutionService.runAsyncAndComplete(() -> reportService.deleteReports(invalidateNodeInfos.getReportUuids())),
2114+
studyServerExecutionService.runAsyncAndComplete(() -> loadflowService.deleteLoadFlowResults(invalidateNodeInfos.getLoadFlowResultUuids())),
2115+
studyServerExecutionService.runAsyncAndComplete(() -> securityAnalysisService.deleteSecurityAnalysisResults(invalidateNodeInfos.getSecurityAnalysisResultUuids())),
2116+
studyServerExecutionService.runAsyncAndComplete(() -> sensitivityAnalysisService.deleteSensitivityAnalysisResults(invalidateNodeInfos.getSensitivityAnalysisResultUuids())),
2117+
studyServerExecutionService.runAsyncAndComplete(() -> nonEvacuatedEnergyService.deleteNonEvacuatedEnergyResults(invalidateNodeInfos.getNonEvacuatedEnergyResultUuids())),
2118+
studyServerExecutionService.runAsyncAndComplete(() -> shortCircuitService.deleteShortCircuitAnalysisResults(invalidateNodeInfos.getShortCircuitAnalysisResultUuids())),
2119+
studyServerExecutionService.runAsyncAndComplete(() -> shortCircuitService.deleteShortCircuitAnalysisResults(invalidateNodeInfos.getOneBusShortCircuitAnalysisResultUuids())),
2120+
studyServerExecutionService.runAsyncAndComplete(() -> voltageInitService.deleteVoltageInitResults(invalidateNodeInfos.getVoltageInitResultUuids())),
2121+
studyServerExecutionService.runAsyncAndComplete(() -> dynamicSimulationService.deleteResults(invalidateNodeInfos.getDynamicSimulationResultUuids())),
2122+
studyServerExecutionService.runAsyncAndComplete(() -> dynamicSecurityAnalysisService.deleteResults(invalidateNodeInfos.getDynamicSecurityAnalysisResultUuids())),
2123+
studyServerExecutionService.runAsyncAndComplete(() -> stateEstimationService.deleteStateEstimationResults(invalidateNodeInfos.getStateEstimationResultUuids()))
2124+
);
2125+
}
2126+
2127+
// /!\ Do not wait completion and do not throw exception
2128+
private void deleteNodesInfos(DeleteNodeInfos deleteNodeInfos) {
2129+
CompletableFuture.allOf(
2130+
studyServerExecutionService.runAsyncAndComplete(() -> deleteNodeInfos.getVariantIds().forEach(networkStoreService::deleteVariants)),
2131+
studyServerExecutionService.runAsyncAndComplete(() -> deleteNodeInfos.getModificationGroupUuids().forEach(networkModificationService::deleteModifications)),
2132+
studyServerExecutionService.runAsyncAndComplete(() -> deleteNodeInfos.getRemovedNodeUuids().forEach(dynamicSimulationEventService::deleteEventsByNodeId)),
2133+
studyServerExecutionService.runAsyncAndComplete(() -> reportService.deleteReports(deleteNodeInfos.getReportUuids())),
2134+
studyServerExecutionService.runAsyncAndComplete(() -> loadflowService.deleteLoadFlowResults(deleteNodeInfos.getLoadFlowResultUuids())),
2135+
studyServerExecutionService.runAsyncAndComplete(() -> securityAnalysisService.deleteSecurityAnalysisResults(deleteNodeInfos.getSecurityAnalysisResultUuids())),
2136+
studyServerExecutionService.runAsyncAndComplete(() -> sensitivityAnalysisService.deleteSensitivityAnalysisResults(deleteNodeInfos.getSensitivityAnalysisResultUuids())),
2137+
studyServerExecutionService.runAsyncAndComplete(() -> nonEvacuatedEnergyService.deleteNonEvacuatedEnergyResults(deleteNodeInfos.getNonEvacuatedEnergyResultUuids())),
2138+
studyServerExecutionService.runAsyncAndComplete(() -> shortCircuitService.deleteShortCircuitAnalysisResults(deleteNodeInfos.getShortCircuitAnalysisResultUuids())),
2139+
studyServerExecutionService.runAsyncAndComplete(() -> shortCircuitService.deleteShortCircuitAnalysisResults(deleteNodeInfos.getOneBusShortCircuitAnalysisResultUuids())),
2140+
studyServerExecutionService.runAsyncAndComplete(() -> voltageInitService.deleteVoltageInitResults(deleteNodeInfos.getVoltageInitResultUuids())),
2141+
studyServerExecutionService.runAsyncAndComplete(() -> dynamicSimulationService.deleteResults(deleteNodeInfos.getDynamicSimulationResultUuids())),
2142+
studyServerExecutionService.runAsyncAndComplete(() -> dynamicSecurityAnalysisService.deleteResults(deleteNodeInfos.getDynamicSecurityAnalysisResultUuids())),
2143+
studyServerExecutionService.runAsyncAndComplete(() -> stateEstimationService.deleteStateEstimationResults(deleteNodeInfos.getStateEstimationResultUuids()))
2144+
);
2145+
}
2146+
21592147
@Transactional
21602148
public void stashNode(UUID studyUuid, UUID nodeId, boolean stashChildren, String userId) {
21612149
removeNodesFromAliases(studyUuid, List.of(nodeId), stashChildren);

0 commit comments

Comments
 (0)