diff options
author | Steve Marion <steve.marion@sonarsource.com> | 2025-01-09 14:41:14 +0100 |
---|---|---|
committer | sonartech <sonartech@sonarsource.com> | 2025-01-10 20:03:28 +0000 |
commit | 7df33eb6a4d41d5071999f3296125e5666232dde (patch) | |
tree | 5d2394eb77c593b5c497d8089e053773dcd74825 /server/sonar-db-dao/src | |
parent | aca3703d4bc4528aa579ad42c46d3641d51f0752 (diff) | |
download | sonarqube-7df33eb6a4d41d5071999f3296125e5666232dde.tar.gz sonarqube-7df33eb6a4d41d5071999f3296125e5666232dde.zip |
SONAR-23122 Add telemetry to async issue index creation at startup.
Diffstat (limited to 'server/sonar-db-dao/src')
4 files changed, 75 insertions, 0 deletions
diff --git a/server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeActivityDaoIT.java b/server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeActivityDaoIT.java index 9e2b3a21bfa..4fc7a76e0fb 100644 --- a/server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeActivityDaoIT.java +++ b/server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeActivityDaoIT.java @@ -850,6 +850,60 @@ class CeActivityDaoIT { assertThat(underTest.hasAnyFailedOrCancelledIssueSyncTask(db.getSession())).isFalse(); } + @Test + void countFailedOrCancelledIssueSyncTasks() { + assertThat(underTest.countFailedOrCancelledIssueSyncTasks(db.getSession())).isZero(); + + insert("TASK_1", REPORT, ENTITY_1, SUCCESS); + insert("TASK_2", REPORT, ENTITY_1, FAILED); + + ProjectDto projectDto1 = db.components().insertPrivateProject( + branchDto -> branchDto.setNeedIssueSync(false), c -> { + }, p -> { + }).getProjectDto(); + insert("TASK_3", CeTaskTypes.BRANCH_ISSUE_SYNC, projectDto1.getUuid(), projectDto1.getUuid(), SUCCESS); + + ProjectDto projectDto2 = db.components().insertPrivateProject(branchDto -> branchDto.setNeedIssueSync(false), c -> { + }, p -> { + }).getProjectDto(); + insert("TASK_4", CeTaskTypes.BRANCH_ISSUE_SYNC, projectDto2.getUuid(), projectDto2.getUuid(), SUCCESS); + + assertThat(underTest.countFailedOrCancelledIssueSyncTasks(db.getSession())).isZero(); + + ProjectDto projectDto3 = db.components().insertPrivateProject(branchDto -> branchDto.setNeedIssueSync(false), c -> { + }, p -> { + }).getProjectDto(); + insert("TASK_5", CeTaskTypes.BRANCH_ISSUE_SYNC, projectDto3.getUuid(), projectDto3.getUuid(), SUCCESS); + + BranchDto projectBranch1 = db.components() + .insertProjectBranch(projectDto3, branchDto -> branchDto.setNeedIssueSync(true)); + + insert("TASK_6", CeTaskTypes.BRANCH_ISSUE_SYNC, projectBranch1.getUuid(), projectDto3.getUuid(), FAILED); + + BranchDto projectBranch2 = db.components() + .insertProjectBranch(projectDto3, branchDto -> branchDto.setNeedIssueSync(true)); + + insert("TASK_7", CeTaskTypes.BRANCH_ISSUE_SYNC, projectBranch2.getUuid(), projectDto3.getUuid(), CANCELED); + + // failed task and project branch still exists and need sync + assertThat(underTest.countFailedOrCancelledIssueSyncTasks(db.getSession())).isEqualTo(2); + + // assume branch has been re-analysed + db.getDbClient().branchDao().updateNeedIssueSync(db.getSession(), projectBranch1.getUuid(), false); + + // assume branch has been re-analysed + db.getDbClient().branchDao().updateNeedIssueSync(db.getSession(), projectBranch2.getUuid(), false); + + assertThat(underTest.countFailedOrCancelledIssueSyncTasks(db.getSession())).isZero(); + + // assume branch has been deleted + db.getDbClient().purgeDao().deleteBranch(db.getSession(), projectBranch1.getUuid()); + db.getDbClient().purgeDao().deleteBranch(db.getSession(), projectBranch2.getUuid()); + + // associated branch does not exist, so there is no failures - either it has been deleted or purged or reanalysed + assertThat(underTest.countFailedOrCancelledIssueSyncTasks(db.getSession())).isZero(); + } + private CeActivityDto insert(String uuid, String type, @Nullable String mainComponentUuid, CeActivityDto.Status status) { return insert(uuid, type, mainComponentUuid, mainComponentUuid, status); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityDao.java index 2cef1f2de30..f4a3c69f510 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityDao.java @@ -100,6 +100,10 @@ public class CeActivityDao implements Dao { return mapper(dbSession).hasAnyFailedOrCancelledIssueSyncTask() > 0; } + public int countFailedOrCancelledIssueSyncTasks(DbSession dbSession) { + return mapper(dbSession).countFailedOrCancelledIssueSyncTasks(); + } + private static CeActivityMapper mapper(DbSession dbSession) { return dbSession.getMapper(CeActivityMapper.class); } diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityMapper.java index 4c653a18c80..bab6f01f014 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityMapper.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityMapper.java @@ -53,5 +53,7 @@ public interface CeActivityMapper { short hasAnyFailedOrCancelledIssueSyncTask(); + int countFailedOrCancelledIssueSyncTasks(); + List<CeActivityDto> selectByTaskType(@Param("taskType") String taskType); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml index 23d732adbf3..fced3c4a6d5 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml @@ -255,6 +255,21 @@ and ca.is_last = ${_true} </select> + <select id="countFailedOrCancelledIssueSyncTasks" parameterType="map" resultType="int"> + select + count(1) + from + ce_activity ca + inner join + project_branches pb + on + ca.component_uuid = pb.uuid + where + ca.task_type = 'ISSUE_SYNC' + and ca.status in ('FAILED', 'CANCELED') + and pb.need_issue_sync = ${_true} + </select> + <sql id="hasAnyFailedOrCancelledIssueSyncTaskSql"> select case when exists |