You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/01/10 15:19:56 UTC

[ignite-teamcity-bot] branch ignite-gg-14609 updated: IGNITE-GG-14609: For case build types were not synced, loading all projects and all types

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch ignite-gg-14609
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git


The following commit(s) were added to refs/heads/ignite-gg-14609 by this push:
     new 4c898a9  IGNITE-GG-14609: For case build types were not synced, loading all projects and all types
4c898a9 is described below

commit 4c898a9bc60a857facd2eb9fbbec1e50a8e47645
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Thu Jan 10 18:19:52 2019 +0300

    IGNITE-GG-14609: For case build types were not synced, loading all projects and all types
---
 .../main/java/org/apache/ignite/ci/ITeamcity.java  | 12 -----
 .../apache/ignite/ci/IgnitePersistentTeamcity.java | 51 ++++++++++++---------
 .../apache/ignite/ci/IgniteTeamcityConnection.java | 11 +++--
 .../ignite/ci/runners/GenerateStatusHtml.java      |  4 +-
 .../runners/IgniteTeamcityHelperRunnerExample.java |  6 +--
 .../tcbot/visa/TcBotTriggerAndSignOffService.java  | 21 +++++++--
 .../org/apache/ignite/ci/tcmodel/conf/Project.java | 13 ++++--
 .../conf/{Project.java => ProjectsList.java}       | 52 ++++++++--------------
 .../ci/teamcity/ignited/ITeamcityIgnited.java      |  2 +
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   | 10 +++--
 .../teamcity/ignited/buildtype/BuildTypeSync.java  |  9 ++--
 .../ignite/ci/teamcity/pure/ITeamcityConn.java     |  6 +++
 12 files changed, 108 insertions(+), 89 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
index 4a62cb7..fa1f3a7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/ITeamcity.java
@@ -52,18 +52,6 @@ public interface ITeamcity extends ITeamcityConn {
     /** Temporary feature toggle: Use New run stat in PR analysis, issue detection. */
     boolean NEW_RUN_STAT = true;
 
-    /** {@inheritDoc} */
-    @Override default List<BuildType> getBuildTypes(String projectId) {
-        return FutureUtil.getResult(getProjectSuites(projectId));
-    }
-
-    /**
-     * List of project suites.
-     *
-     * @param projectId Project id.
-     */
-    CompletableFuture<List<BuildType>> getProjectSuites(String projectId);
-
     /**   */
     @Deprecated
     CompletableFuture<List<BuildRef>> getQueuedBuilds(@Nullable String branch);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index 61ec4fc..76db429 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -19,10 +19,30 @@ package org.apache.ignite.ci;
 
 import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
 import java.util.SortedSet;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
+import javax.annotation.Nullable;
+import javax.inject.Inject;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.ci.analysis.*;
+import org.apache.ignite.ci.analysis.Expirable;
+import org.apache.ignite.ci.analysis.IVersionedEntity;
+import org.apache.ignite.ci.analysis.LogCheckResult;
+import org.apache.ignite.ci.analysis.RunStat;
+import org.apache.ignite.ci.analysis.SingleBuildRunCtx;
+import org.apache.ignite.ci.analysis.SuiteInBranch;
+import org.apache.ignite.ci.analysis.TestInBranch;
 import org.apache.ignite.ci.db.DbMigrations;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.AutoProfiling;
@@ -31,36 +51,19 @@ import org.apache.ignite.ci.tcmodel.agent.Agent;
 import org.apache.ignite.ci.tcmodel.changes.Change;
 import org.apache.ignite.ci.tcmodel.changes.ChangesList;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.conf.Project;
 import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
 import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
 import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
-import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrence;
 import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
 import org.apache.ignite.ci.tcmodel.user.User;
-import org.apache.ignite.ci.teamcity.ignited.IRunStat;
-import org.apache.ignite.ci.util.CollectionUtil;
 import org.apache.ignite.ci.util.ObjectInterner;
 import org.apache.ignite.ci.web.model.hist.VisasHistoryStorage;
 import org.jetbrains.annotations.NotNull;
 
-import javax.annotation.Nullable;
-import javax.cache.Cache;
-import javax.inject.Inject;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
 import static org.apache.ignite.ci.teamcity.ignited.runhist.RunHistSync.normalizeBranch;
 
 /**
@@ -160,8 +163,8 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
 
     /** {@inheritDoc} */
     @AutoProfiling
-    @Override public CompletableFuture<List<BuildType>> getProjectSuites(String projectId) {
-        return teamcity.getProjectSuites(projectId);
+    @Override public List<BuildType> getBuildTypes(String projectId) {
+        return teamcity.getBuildTypes(projectId);
     }
 
     /** {@inheritDoc} */
@@ -489,6 +492,7 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
         return teamcity.triggerBuild(buildTypeId, branchName, cleanRebuild, queueAtTop);
     }
 
+    /** {@inheritDoc} */
     @Override public ProblemOccurrences getProblems(int buildId) {
         return teamcity.getProblems(buildId);
     }
@@ -503,6 +507,11 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
         return problems;
     }
 
+    /** {@inheritDoc} */
+    @Override public List<Project> getProjects() {
+        return teamcity.getProjects();
+    }
+
     @Override public Statistics getStatistics(int buildId) {
         return teamcity.getStatistics(buildId);
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
index cd88aea..50c707f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgniteTeamcityConnection.java
@@ -33,6 +33,7 @@ import org.apache.ignite.ci.tcmodel.changes.Change;
 import org.apache.ignite.ci.tcmodel.changes.ChangesList;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
 import org.apache.ignite.ci.tcmodel.conf.Project;
+import org.apache.ignite.ci.tcmodel.conf.ProjectsList;
 import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.hist.Builds;
@@ -342,9 +343,10 @@ public class IgniteTeamcityConnection implements ITeamcity {
         return getJaxbUsingHref(href, ChangesList.class);
     }
 
+    /** {@inheritDoc} */
     @AutoProfiling
     @Override public Change getChange(int changeId) {
-        String href = "app/rest/latest/changes/id:" + + changeId +"";
+        String href = "app/rest/latest/changes/id:" + +changeId;
 
         return getJaxbUsingHref(href, Change.class);
     }
@@ -370,11 +372,12 @@ public class IgniteTeamcityConnection implements ITeamcity {
     }
 
     /** {@inheritDoc} */
-    @Override public CompletableFuture<List<BuildType>> getProjectSuites(String projectId) {
-        return supplyAsync(() -> getProjectSuitesSync(projectId), executor);
+    @Override public List<Project> getProjects() {
+        return sendGetXmlParseJaxb(host + "app/rest/latest/projects", ProjectsList.class).projects();
     }
 
-    private List<BuildType> getProjectSuitesSync(String projectId) {
+    /** {@inheritDoc} */
+    @Override public List<BuildType> getBuildTypes(String projectId) {
         return sendGetXmlParseJaxb(host + "app/rest/latest/projects/" + projectId, Project.class)
             .getBuildTypesNonNull();
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
index c986665..a987ff1 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/GenerateStatusHtml.java
@@ -277,12 +277,12 @@ public class GenerateStatusHtml {
     private static ProjectStatus getBuildStatuses(
         final String tcId,
         final String projectId,
-        final List<Branch> branchesPriv) throws Exception {
+        final List<Branch> branchesPriv) {
 
         ProjectStatus projStatus = new ProjectStatus();
         final IgniteTeamcityConnection teamcityHelper = TcConnectionStaticLinker.create(tcId);
 
-        List<BuildType> suites = teamcityHelper.getProjectSuites(projectId).get();
+        List<BuildType> suites = teamcityHelper.getBuildTypes(projectId);
 
         for (BuildType buildType : suites) {
             if (!"-> Run All".equals(buildType.getName())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
index 1c4500e..05ff217 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/IgniteTeamcityHelperRunnerExample.java
@@ -49,7 +49,7 @@ public class IgniteTeamcityHelperRunnerExample {
         int k = 0;
         if (k > 0) {
             //branch example: "pull/2335/head"
-            List<BuildType> buildTypes = helper.getProjectSuites("Ignite20Tests").get();
+            List<BuildType> buildTypes = helper.getBuildTypes("Ignite20Tests");
 
         }
 
@@ -70,10 +70,10 @@ public class IgniteTeamcityHelperRunnerExample {
         }
     }
 
-    private static void checkBuildTypes(IgniteTeamcityConnection helper) throws InterruptedException, ExecutionException {
+    private static void checkBuildTypes(IgniteTeamcityConnection helper) {
         Map<String, Set<String>> duplicates = new TreeMap<>();
         Map<String, String> suiteToBt = new TreeMap<>();
-        List<BuildType> buildTypes = helper.getProjectSuites("Ignite20Tests").get();
+        List<BuildType> buildTypes = helper.getBuildTypes("Ignite20Tests");
         for (BuildType bt : buildTypes) {
             final BuildTypeFull type = helper.getBuildType(bt.getId());
             if ("Ignite20Tests_RunAll".equals(type.getId())
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index 009c63f..41f15b2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -429,10 +429,25 @@ public class TcBotTriggerAndSignOffService {
 
         BuildTypeCompacted buildType = buildTypeId.length() > 0 ? teamcity.getBuildType(buildTypeId.toString()) : null;
 
-        String projectId = Objects.nonNull(buildType) ?
-            compactor.getStringFromId(buildType.projectId()) : DEFAULT_PROJECT_ID;
+        List<String> compositeBuildTypeIds;
+        String projectId;
+        if (buildType != null) {
+            projectId = compactor.getStringFromId(buildType.projectId());
+            compositeBuildTypeIds = teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(projectId);
+        }
+        else {
+            //for case build type not found, actualizing all projects resync
+            List<String> projects = teamcity.getAllProjectsIds();
+
+            for (String pId : projects)
+                teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(pId);
+
+            compositeBuildTypeIds = new ArrayList<>();
+
+            if (buildTypeId.length() > 0)
+                compositeBuildTypeIds.add(buildTypeId.toString());
+        }
 
-        List<String> compositeBuildTypeIds = teamcity.getCompositeBuildTypesIdsSortedByBuildNumberCounter(projectId);
 
         for (String btId : compositeBuildTypeIds) {
             List<BuildRefCompacted> forTests = findBuildsForPr(btId, prId, teamcity);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
index 8d9b7da..e27736d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
@@ -29,19 +29,19 @@ import javax.xml.bind.annotation.XmlRootElement;
 /**
  * Content of poject
  */
-@XmlRootElement(name="project")
+@XmlRootElement(name = "project")
 @XmlAccessorType(XmlAccessType.FIELD)
 public class Project {
     /** Id. */
     @XmlAttribute public String id;
 
     /** Name. */
-    @XmlAttribute(name="name")
+    @XmlAttribute(name = "name")
     private String name;
 
     /** Build types. */
-    @XmlElementWrapper(name="buildTypes")
-    @XmlElement(name="buildType")
+    @XmlElementWrapper(name = "buildTypes")
+    @XmlElement(name = "buildType")
     private List<BuildType> buildTypes;
 
     /**
@@ -60,5 +60,10 @@ public class Project {
     public String name() {
         return name;
     }
+
+    /** */
+    public String id() {
+        return id;
+    }
 }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
similarity index 52%
copy from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
index 8d9b7da..1a9594a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/Project.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/ProjectsList.java
@@ -19,46 +19,32 @@ package org.apache.ignite.ci.tcmodel.conf;
 
 import java.util.Collections;
 import java.util.List;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
+import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
+import org.jetbrains.annotations.NotNull;
 
 /**
- * Content of poject
+ * List of Projects available at TC.
  */
-@XmlRootElement(name="project")
-@XmlAccessorType(XmlAccessType.FIELD)
-public class Project {
-    /** Id. */
-    @XmlAttribute public String id;
-
-    /** Name. */
-    @XmlAttribute(name="name")
-    private String name;
-
-    /** Build types. */
-    @XmlElementWrapper(name="buildTypes")
-    @XmlElement(name="buildType")
-    private List<BuildType> buildTypes;
-
-    /**
-     * @return List of project's build types or an empty list if there is no build types presented.
-     */
-    public List<BuildType> getBuildTypesNonNull() {
-        return buildTypes == null ? Collections.emptyList() : buildTypes;
+@XmlRootElement(name = "projects")
+public class ProjectsList extends ChangesListRef {
+    /** Projects. */
+    @XmlElement(name = "project")
+    private List<Project> projects;
+
+    /** Count. */
+    @XmlElement Integer count;
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return "ProjectsList{" +
+            "projects=" + projects +
+            '}';
     }
 
     /** */
-    public void name(String name) {
-        this.name = name;
-    }
-
-    /** */
-    public String name() {
-        return name;
+    @NotNull public List<Project> projects() {
+        return projects == null ? Collections.emptyList() : Collections.unmodifiableList(projects);
     }
 }
-
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
index ead6dd7..16f44e0 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/ITeamcityIgnited.java
@@ -177,4 +177,6 @@ public interface ITeamcityIgnited {
      * @return run statistics of recent runls on all branches.
      */
     @Nullable public IRunStat getSuiteRunStatAllBranches(String suiteBuildTypeId);
+
+    List<String> getAllProjectsIds();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index 077bb42..65930eb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -31,6 +31,7 @@ import org.apache.ignite.ci.jira.ignited.JiraTicketDao;
 import org.apache.ignite.ci.jira.ignited.JiraTicketSync;
 import org.apache.ignite.ci.jira.Ticket;
 import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
+import org.apache.ignite.ci.tcmodel.conf.Project;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
 import org.apache.ignite.ci.teamcity.ignited.mute.MuteDao;
 import org.apache.ignite.ci.teamcity.ignited.mute.MuteSync;
@@ -427,9 +428,11 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
         return runHistCompactedDao.getSuiteRunStatAllBranches(srvIdMaskHigh, suiteBuildTypeId);
     }
 
-    /**
-     * @param branchName Branch name.
-     */
+    /** {@inheritDoc} */
+    @Override public List<String> getAllProjectsIds() {
+        return conn.getProjects().stream().map(Project::id).collect(Collectors.toList());
+    }
+
     /** {@inheritDoc} */
     @Override public List<String> getCompositeBuildTypesIdsSortedByBuildNumberCounter(String projectId) {
         return buildTypeSync.getCompositeBuildTypesIdsSortedByBuildNumberCounter(srvIdMaskHigh, projectId, conn);
@@ -447,6 +450,7 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
 
     /** {@inheritDoc} */
     @Override public BuildTypeCompacted getBuildType(String buildTypeId) {
+
         return buildTypeDao.getFatBuildType(srvIdMaskHigh, buildTypeId);
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
index eb5fba5..997429a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildtype/BuildTypeSync.java
@@ -107,7 +107,7 @@ public class BuildTypeSync {
      * @param conn Pure HTTP Connection API.
      */
     private void ensureActualizeBuildTypeRefsRequested(int srvIdMaskHigh, String projectId, ITeamcityConn conn) {
-        scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", conn.serverId()),
+        scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", conn.serverId(), projectId),
             () -> reindexBuildTypeRefs(srvIdMaskHigh, projectId, conn), 4, TimeUnit.HOURS);
     }
 
@@ -119,7 +119,7 @@ public class BuildTypeSync {
      * @param conn Pure HTTP Connection API.
      */
     private void ensureActualizeBuildTypesRequested(int srvIdMaskHigh, String projectId, ITeamcityConn conn) {
-        scheduler.sheduleNamed(taskName("actualizeAllBuildTypes", conn.serverId()),
+        scheduler.sheduleNamed(taskName("actualizeAllBuildTypeRefs", "actualizeAllBuildTypes", conn.serverId()),
             () -> reindexBuildTypes(srvIdMaskHigh, projectId, conn), 24, TimeUnit.HOURS);
     }
 
@@ -241,9 +241,10 @@ public class BuildTypeSync {
     /**
      * @param taskName Task name.
      * @param srvName Server name.
+     * @param prjName Project name.
      */
     @NotNull
-    private String taskName(String taskName, String srvName) {
-        return BuildTypeSync.class.getSimpleName() +"." + taskName + "." + srvName;
+    private String taskName(String taskName, String srvName, String prjName) {
+        return BuildTypeSync.class.getSimpleName() + "." + taskName + "." + srvName + "." + prjName;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
index 9ebecba..4a1bfeb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/pure/ITeamcityConn.java
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
 import org.apache.ignite.ci.tcmodel.changes.Change;
 import org.apache.ignite.ci.tcmodel.changes.ChangesList;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.conf.Project;
 import org.apache.ignite.ci.tcmodel.conf.bt.BuildTypeFull;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.tcmodel.mute.MuteInfo;
@@ -103,4 +104,9 @@ public interface ITeamcityConn {
     /** */
     @Deprecated
     ProblemOccurrences getProblemsAndRegisterCritical(BuildRef build);
+
+    /**
+     * @return List of all project available at Teamcity server.
+     */
+    List<Project> getProjects();
 }