From 373cdf2e88201f4262bdb3c933a0f84a4160bf72 Mon Sep 17 00:00:00 2001 From: danielhanrahan Date: Sun, 26 Feb 2023 14:27:06 +0000 Subject: Skip deleting list xpaths that are list elements List elements cannot be lists. Filtering list elements before trying to delete lists by xpaths doubles performance when deleting list elements (which doubles performance of CM handle de-registration). Issue-ID: CPS-1511 Signed-off-by: danielhanrahan Change-Id: Ieb6002212d006396d468f27f853708b5aa1e31f2 --- .../onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java | 14 ++++++++++---- .../CpsDataPersistenceServiceDeletePerfTest.groovy | 7 ++----- 2 files changed, 12 insertions(+), 9 deletions(-) (limited to 'cps-ri/src') diff --git a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java index dd2d3652ea..2159ceae8a 100644 --- a/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java +++ b/cps-ri/src/main/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceImpl.java @@ -621,17 +621,23 @@ public class CpsDataPersistenceServiceImpl implements CpsDataPersistenceService final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName); final AnchorEntity anchorEntity = anchorRepository.getByDataspaceAndName(dataspaceEntity, anchorName); - final Collection normalizedXpaths = new ArrayList<>(xpathsToDelete.size()); + final Collection normalizedXPathsToDelete = new ArrayList<>(xpathsToDelete.size()); + final Collection normalizedXpathsToPotentialLists = new ArrayList<>(); for (final String xpath : xpathsToDelete) { try { - normalizedXpaths.add(CpsPathUtil.getNormalizedXpath(xpath)); + final CpsPathQuery cpsPathQuery = CpsPathUtil.getCpsPathQuery(xpath); + final String normalizedXpath = cpsPathQuery.getNormalizedXpath(); + normalizedXPathsToDelete.add(normalizedXpath); + if (!cpsPathQuery.isPathToListElement()) { + normalizedXpathsToPotentialLists.add(normalizedXpath); + } } catch (final PathParsingException e) { log.debug("Error parsing xpath \"{}\": {}", xpath, e.getMessage()); } } - fragmentRepository.deleteByAnchorIdAndXpaths(anchorEntity.getId(), normalizedXpaths); - fragmentRepository.deleteListsByAnchorIdAndXpaths(anchorEntity.getId(), normalizedXpaths); + fragmentRepository.deleteByAnchorIdAndXpaths(anchorEntity.getId(), normalizedXPathsToDelete); + fragmentRepository.deleteListsByAnchorIdAndXpaths(anchorEntity.getId(), normalizedXpathsToPotentialLists); } @Override diff --git a/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServiceDeletePerfTest.groovy b/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServiceDeletePerfTest.groovy index 8e74b62228..a08d8c66d2 100644 --- a/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServiceDeletePerfTest.groovy +++ b/cps-ri/src/test/groovy/org/onap/cps/spi/performance/CpsDataPersistenceServiceDeletePerfTest.groovy @@ -24,15 +24,12 @@ import org.onap.cps.spi.CpsDataPersistenceService import org.onap.cps.spi.impl.CpsPersistencePerfSpecBase import org.springframework.beans.factory.annotation.Autowired import org.springframework.test.context.jdbc.Sql -import org.springframework.util.StopWatch class CpsDataPersistenceServiceDeletePerfTest extends CpsPersistencePerfSpecBase { @Autowired CpsDataPersistenceService objectUnderTest - def stopWatch = new StopWatch() - @Sql([CLEAR_DATA, PERF_TEST_DATA]) def 'Create a node with many descendants (please note, subsequent tests depend on this running first).'() { when: 'a node with a large number of descendants is created' @@ -165,8 +162,8 @@ class CpsDataPersistenceServiceDeletePerfTest extends CpsPersistencePerfSpecBase objectUnderTest.deleteDataNodes(PERF_DATASPACE, PERF_ANCHOR, xpathsToDelete) stopWatch.stop() def deleteDurationInMillis = stopWatch.getTotalTimeMillis() - then: 'delete duration is under 125 milliseconds' - recordAndAssertPerformance('Batch delete 500 lists elements', 125, deleteDurationInMillis) + then: 'delete duration is under 60 milliseconds' + recordAndAssertPerformance('Batch delete 500 lists elements', 60, deleteDurationInMillis) } @Sql([CLEAR_DATA, PERF_TEST_DATA]) -- cgit 1.2.3-korg