From: Sébastien Lesaint Date: Fri, 9 Feb 2018 10:38:23 +0000 (+0100) Subject: SONAR-10301 delete from CE_TASK_CHARACTERISTICS when deleting project X-Git-Tag: 7.5~1660 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=fe5e696eeb8af5ca512b76a91db3c718068e3f6b;p=sonarqube.git SONAR-10301 delete from CE_TASK_CHARACTERISTICS when deleting project --- 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 51115390b5d..4f3fc10738b 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 @@ -251,6 +251,10 @@ class PurgeCommands { purgeMapper.deleteCeScannerContextOfCeActivityByProjectUuid(rootUuid); session.commit(); profiler.stop(); + profiler.start("deleteCeActivity (ce_task_characteristics)"); + purgeMapper.deleteCeTaskCharacteristicsOfCeActivityByProjectUuid(rootUuid); + session.commit(); + profiler.stop(); profiler.start("deleteCeActivity (ce_activity)"); purgeMapper.deleteCeActivityByProjectUuid(rootUuid); session.commit(); @@ -262,6 +266,10 @@ class PurgeCommands { purgeMapper.deleteCeScannerContextOfCeQueueByProjectUuid(rootUuid); session.commit(); profiler.stop(); + profiler.start("deleteCeQueue (ce_task_characteristics)"); + purgeMapper.deleteCeTaskCharacteristicsOfCeQueueByProjectUuid(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 c7626d02971..68416043417 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 @@ -90,12 +90,16 @@ public interface PurgeMapper { void deleteFileSourcesByFileUuid(@Param("fileUuids") List fileUuids); + void deleteCeTaskCharacteristicsOfCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeScannerContextOfCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); void deleteCeActivityByProjectUuid(@Param("projectUuid") String projectUuid); void deleteCeScannerContextOfCeQueueByProjectUuid(@Param("projectUuid") String projectUuid); + void deleteCeTaskCharacteristicsOfCeQueueByProjectUuid(@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 f12fd5007d9..eb599b6b61b 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 @@ -318,6 +318,12 @@ task_uuid in (select uuid from ce_activity where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_task_characteristics + 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} @@ -328,6 +334,12 @@ task_uuid in (select uuid from ce_queue where component_uuid=#{projectUuid,jdbcType=VARCHAR}) + + delete from ce_task_characteristics + 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 d05790e8b3d..02d5b5cc797 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 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Optional; import java.util.Random; import java.util.stream.Collectors; +import java.util.stream.IntStream; import java.util.stream.Stream; import org.apache.commons.lang.math.RandomUtils; import org.apache.commons.lang.time.DateUtils; @@ -46,6 +47,7 @@ import org.sonar.db.DbTester; import org.sonar.db.ce.CeActivityDto; import org.sonar.db.ce.CeQueueDto; import org.sonar.db.ce.CeQueueDto.Status; +import org.sonar.db.ce.CeTaskCharacteristicDto; import org.sonar.db.component.BranchType; import org.sonar.db.component.ComponentDbTester; import org.sonar.db.component.ComponentDto; @@ -248,6 +250,31 @@ public class PurgeDaoTest { .containsOnly(toNotDelete.getUuid(), "non existing task"); } + @Test + public void delete_row_in_ce_task_characteristics_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); + insertCeTaskCharacteristics(toBeDeleted.getUuid(), 3); + CeActivityDto toNotDelete = insertCeActivity(anotherLivingProject); + insertCeTaskCharacteristics(toNotDelete.getUuid(), 2); + insertCeTaskCharacteristics("non existing task", 5); + 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_characteristics")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid(), "non existing task"); + } + @Test public void delete_tasks_in_ce_queue_when_deleting_project() { ComponentDto projectToBeDeleted = dbTester.components().insertPrivateProject(); @@ -292,6 +319,31 @@ public class PurgeDaoTest { .containsOnly(toNotDelete.getUuid(), "non existing task"); } + @Test + public void delete_row_in_ce_task_characteristics_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); + insertCeTaskCharacteristics(toBeDeleted.getUuid(), 3); + CeQueueDto toNotDelete = insertCeQueue(anotherLivingProject); + insertCeTaskCharacteristics(toNotDelete.getUuid(), 2); + insertCeTaskCharacteristics("non existing task", 5); + 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_characteristics")) + .extracting(row -> (String) row.get("UUID")) + .containsOnly(toNotDelete.getUuid(), "non existing task"); + } + private ComponentDto insertProjectWithBranchAndRelatedData() { RuleDefinitionDto rule = dbTester.rules().insert(); ComponentDto project = dbTester.components().insertMainBranch(); @@ -712,6 +764,18 @@ public class PurgeDaoTest { dbSession.commit(); } + private void insertCeTaskCharacteristics(String uuid, int count) { + List dtos = IntStream.range(0, count) + .mapToObj(i -> new CeTaskCharacteristicDto() + .setUuid(UuidFactoryFast.getInstance().create()) + .setTaskUuid(uuid) + .setKey("key_" + uuid.hashCode() + i) + .setValue("value_" + uuid.hashCode() + i)) + .collect(Collectors.toList()); + dbClient.ceTaskCharacteristicsDao().insert(dbSession, dtos); + dbSession.commit(); + } + private static PurgeableAnalysisDto getById(List snapshots, String uuid) { return snapshots.stream() .filter(snapshot -> uuid.equals(snapshot.getAnalysisUuid()))