From b16130b515a313e4deb40f189a4d254116a8076b Mon Sep 17 00:00:00 2001 From: Rajdeep Singh Date: Mon, 6 Apr 2026 05:04:39 +0530 Subject: [PATCH] Fix TestCaseRepository deleteChildren N-squared nested loop and double-delete in deleteAllTestCaseResults --- .../service/jdbi3/TestCaseRepository.java | 31 ++++--------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java index 0f3057a29475..edf422ac0677 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java @@ -40,8 +40,6 @@ import java.util.Map; import java.util.Set; import java.util.UUID; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.function.Function; import java.util.stream.Collectors; import lombok.SneakyThrows; @@ -120,9 +118,6 @@ public class TestCaseRepository extends EntityRepository { private static final String PATCH_FIELDS = "owners,entityLink,testSuite,testSuites,testDefinition,computePassedFailedRowCount,useDynamicAssertion,dimensionColumns,topDimensions"; public static final String FAILED_ROWS_SAMPLE_EXTENSION = "testCase.failedRowsSample"; - private final ExecutorService asyncExecutor = - Executors.newFixedThreadPool( - 1, java.lang.Thread.ofPlatform().name("om-test-case-async").factory()); public TestCaseRepository() { super( @@ -896,18 +891,12 @@ private void updateLogicalTestSuite(UUID testSuiteId) { protected void deleteChildren( List children, boolean hardDelete, String updatedBy) { if (hardDelete) { - for (CollectionDAO.EntityRelationshipRecord entityRelationshipRecord : children) { - LOG.info( - "Recursively {} deleting {} {}", - hardDelete ? "hard" : "soft", - entityRelationshipRecord.getType(), - entityRelationshipRecord.getId()); - TestCaseResolutionStatusRepository testCaseResolutionStatusRepository = - (TestCaseResolutionStatusRepository) - Entity.getEntityTimeSeriesRepository(Entity.TEST_CASE_RESOLUTION_STATUS); - for (CollectionDAO.EntityRelationshipRecord child : children) { - testCaseResolutionStatusRepository.deleteById(child.getId(), hardDelete); - } + TestCaseResolutionStatusRepository testCaseResolutionStatusRepository = + (TestCaseResolutionStatusRepository) + Entity.getEntityTimeSeriesRepository(Entity.TEST_CASE_RESOLUTION_STATUS); + for (CollectionDAO.EntityRelationshipRecord child : children) { + LOG.info("Hard deleting {} {}", child.getType(), child.getId()); + testCaseResolutionStatusRepository.deleteById(child.getId(), hardDelete); } } } @@ -921,14 +910,6 @@ private void deleteAllTestCaseResults(String fqn) { TestCaseResultRepository testCaseResultRepository = (TestCaseResultRepository) Entity.getEntityTimeSeriesRepository(TEST_CASE_RESULT); testCaseResultRepository.deleteAllTestCaseResults(fqn); - asyncExecutor.submit( - () -> { - try { - testCaseResultRepository.deleteAllTestCaseResults(fqn); - } catch (Exception e) { - LOG.error("Error deleting test case results for test case {}", fqn, e); - } - }); } @SneakyThrows