From fc37d5310d47c9ac50cfec06227df91e69f712fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Fri, 9 Feb 2018 11:57:49 +0100 Subject: [PATCH] SONAR-10301 delete from CE_TASK_INPUT when deleting a project --- .../org/sonar/db/purge/PurgeCommands.java | 8 +++ .../java/org/sonar/db/purge/PurgeMapper.java | 4 ++ .../org/sonar/db/purge/PurgeMapper.xml | 12 ++++ .../java/org/sonar/db/purge/PurgeDaoTest.java | 56 +++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java index 4f3fc10738b..edbe6931d79 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeCommands.java @@ -255,6 +255,10 @@ class PurgeCommands { purgeMapper.deleteCeTaskCharacteristicsOfCeActivityByProjectUuid(rootUuid); session.commit(); profiler.stop(); + profiler.start("deleteCeActivity (ce_task_input)"); + purgeMapper.deleteCeTaskInputOfCeActivityByProjectUuid(rootUuid); + session.commit(); + profiler.stop(); profiler.start("deleteCeActivity (ce_activity)"); purgeMapper.deleteCeActivityByProjectUuid(rootUuid); session.commit(); @@ -270,6 +274,10 @@ class PurgeCommands { purgeMapper.deleteCeTaskCharacteristicsOfCeQueueByProjectUuid(rootUuid); session.commit(); profiler.stop(); + profiler.start("deleteCeQueue (ce_task_input)"); + purgeMapper.deleteCeTaskInputOfCeQueueByProjectUuid(rootUuid); + session.commit(); + profiler.stop(); profiler.start("deleteCeQueue (ce_queue)"); purgeMapper.deleteCeQueueByProjectUuid(rootUuid); session.commit(); diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java index 68416043417..2db61704c6d 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/purge/PurgeMapper.java @@ -92,6 +92,8 @@ public interface PurgeMapper { void deleteCeTaskCharacteristicsOfCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeTaskInputOfCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeScannerContextOfCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); void deleteCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); @@ -100,6 +102,8 @@ public interface PurgeMapper { void deleteCeTaskCharacteristicsOfCeQueueByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeTaskInputOfCeQueueByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeQueueByProjectUuid(@Param("projectUuid") String projectUuid); void deleteWebhookDeliveriesByProjectUuid(@Param("projectUuid") String projectUuid); diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml index eb599b6b61b..4f652c7cdc8 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/purge/PurgeMapper.xml @@ -324,6 +324,12 @@ task_uuid in (select uuid from ce_activity where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_task_input + where + task_uuid in (select uuid from ce_activity where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_activity where component_uuid=#{projectUuid,jdbcType=VARCHAR} @@ -340,6 +346,12 @@ task_uuid in (select uuid from ce_queue where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_task_input + where + task_uuid in (select uuid from ce_queue where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_queue where component_uuid=#{projectUuid,jdbcType=VARCHAR} diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java index 02d5b5cc797..93b97c13772 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/purge/PurgeDaoTest.java @@ -20,6 +20,7 @@ package org.sonar.db.purge; import com.google.common.collect.ImmutableList; +import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -225,6 +226,31 @@ public class PurgeDaoTest { assertThat(dbTester.countRowsOfTable("ce_activity")).isEqualTo(1); } + @Test + public void delete_row_in_ce_task_input_referring_to_a_row_in_ce_activity_when_deleting_project() { + ComponentDto projectToBeDeleted = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); + ComponentDto anotherLivingProject = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); + dbClient.componentDao().insert(dbSession, projectToBeDeleted, anotherLivingProject); + + // Insert 2 rows in CE_ACTIVITY : one for the project that will be deleted, and one on another project + CeActivityDto toBeDeleted = insertCeActivity(projectToBeDeleted); + insertCeTaskInput(toBeDeleted.getUuid()); + CeActivityDto toNotDelete = insertCeActivity(anotherLivingProject); + insertCeTaskInput(toNotDelete.getUuid()); + insertCeTaskInput("non existing task"); + dbSession.commit(); + + underTest.deleteProject(dbSession, projectToBeDeleted.uuid()); + dbSession.commit(); + + assertThat(dbTester.select("select uuid as \"UUID\" from ce_activity")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid()); + assertThat(dbTester.select("select task_uuid as \"UUID\" from ce_task_input")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid(), "non existing task"); + } + @Test public void delete_row_in_ce_scanner_context_referring_to_a_row_in_ce_activity_when_deleting_project() { ComponentDto projectToBeDeleted = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); @@ -294,6 +320,31 @@ public class PurgeDaoTest { assertThat(dbTester.countSql("select count(*) from ce_queue where component_uuid='" + projectToBeDeleted.uuid() + "'")).isEqualTo(0); } + @Test + public void delete_row_in_ce_task_input_referring_to_a_row_in_ce_queue_when_deleting_project() { + ComponentDto projectToBeDeleted = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); + ComponentDto anotherLivingProject = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); + dbClient.componentDao().insert(dbSession, projectToBeDeleted, anotherLivingProject); + + // Insert 2 rows in CE_ACTIVITY : one for the project that will be deleted, and one on another project + CeQueueDto toBeDeleted = insertCeQueue(projectToBeDeleted); + insertCeTaskInput(toBeDeleted.getUuid()); + CeQueueDto toNotDelete = insertCeQueue(anotherLivingProject); + insertCeTaskInput(toNotDelete.getUuid()); + insertCeTaskInput("non existing task"); + dbSession.commit(); + + underTest.deleteProject(dbSession, projectToBeDeleted.uuid()); + dbSession.commit(); + + assertThat(dbTester.select("select uuid as \"UUID\" from ce_queue")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid()); + assertThat(dbTester.select("select task_uuid as \"UUID\" from ce_task_input")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid(), "non existing task"); + } + @Test public void delete_row_in_ce_scanner_context_referring_to_a_row_in_ce_queue_when_deleting_project() { ComponentDto projectToBeDeleted = ComponentTesting.newPrivateProjectDto(dbTester.getDefaultOrganization()); @@ -776,6 +827,11 @@ public class PurgeDaoTest { dbSession.commit(); } + private void insertCeTaskInput(String uuid) { + dbClient.ceTaskInputDao().insert(dbSession, uuid, new ByteArrayInputStream("some content man!".getBytes())); + dbSession.commit(); + } + private static PurgeableAnalysisDto getById(List snapshots, String uuid) { return snapshots.stream() .filter(snapshot -> uuid.equals(snapshot.getAnalysisUuid())) -- 2.39.5