aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-dao/src
diff options
context:
space:
mode:
authorSteve Marion <steve.marion@sonarsource.com>2025-01-09 14:41:14 +0100
committersonartech <sonartech@sonarsource.com>2025-01-10 20:03:28 +0000
commit7df33eb6a4d41d5071999f3296125e5666232dde (patch)
tree5d2394eb77c593b5c497d8089e053773dcd74825 /server/sonar-db-dao/src
parentaca3703d4bc4528aa579ad42c46d3641d51f0752 (diff)
downloadsonarqube-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')
-rw-r--r--server/sonar-db-dao/src/it/java/org/sonar/db/ce/CeActivityDaoIT.java54
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityDao.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/ce/CeActivityMapper.java2
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/ce/CeActivityMapper.xml15
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