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 2018/11/16 16:25:22 UTC

[ignite-teamcity-bot] branch partial-pr-data-display updated: Partial PR data display implemented, special mode to display at least part of data

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

dpavlov pushed a commit to branch partial-pr-data-display
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git


The following commit(s) were added to refs/heads/partial-pr-data-display by this push:
     new 73bc9b1  Partial PR data display implemented, special mode to display at least part of data
73bc9b1 is described below

commit 73bc9b19569903d1dccb6b7aa8763410d5268594
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri Nov 16 19:25:22 2018 +0300

    Partial PR data display implemented, special mode to display at least part of data
---
 .../main/java/org/apache/ignite/ci/TcHelper.java   |  3 +-
 .../ignite/ci/tcbot/chain/BuildChainProcessor.java | 56 ++++++++++++++--------
 .../ignite/ci/tcbot/chain/PrChainsProcessor.java   | 10 +++-
 .../tcbot/chain/TrackedBranchChainsProcessor.java  |  4 +-
 .../ci/teamcity/ignited/ITeamcityIgnited.java      |  5 +-
 .../ignite/ci/teamcity/ignited/SyncMode.java       | 28 +++++++++++
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   | 11 ++++-
 .../ignited/fatbuild/ProactiveFatBuildSync.java    |  8 ++--
 .../org/apache/ignite/ci/web/model/Version.java    |  2 +-
 .../ignite/ci/web/rest/GetChainResultsAsHtml.java  |  5 +-
 .../ci/web/rest/build/GetBuildTestFailures.java    |  5 +-
 .../ignite/ci/web/rest/pr/GetPrTestFailures.java   | 44 +++++++++--------
 ignite-tc-helper-web/src/main/webapp/pr.html       | 20 ++++++++
 13 files changed, 143 insertions(+), 58 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
index cd9db2b..9a0c891 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/TcHelper.java
@@ -37,6 +37,7 @@ import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.user.ICredentialsProv;
@@ -216,7 +217,7 @@ public class TcHelper implements ITcHelper, IJiraIntegration {
 
         TestFailuresSummary summary = prChainsProcessor.getTestFailuresSummary(
             prov, srvId, buildTypeId, branchForTc,
-            FullQueryParams.LATEST, null, null, false);
+            FullQueryParams.LATEST, null, null, false, SyncMode.RELOAD_QUEUED);
 
         if (summary != null) {
             for (ChainAtServerCurrentStatus server : summary.servers) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
index b1616bd..61390e4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/BuildChainProcessor.java
@@ -49,6 +49,7 @@ import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.util.FutureUtil;
 import org.apache.ignite.ci.web.TcUpdatePool;
@@ -86,6 +87,8 @@ public class BuildChainProcessor {
     ) {
         final List<SuiteLRTestsSummary> res = new ArrayList<>();
 
+        SyncMode mode = SyncMode.RELOAD_QUEUED;
+
         if (entryPoints.isEmpty())
             return res;
 
@@ -99,7 +102,7 @@ public class BuildChainProcessor {
         final ExecutorService svc = tcUpdatePool.getService();
 
         final Stream<FatBuildCompacted> depsFirstLevel = entryPointsFatBuilds
-            .map(ref -> svc.submit(() -> dependencies(teamcityIgnited, builds, ref)))
+            .map(ref -> svc.submit(() -> dependencies(teamcityIgnited, builds, mode, ref)))
             .collect(Collectors.toList())
             .stream()
             .flatMap(fut -> FutureUtil.getResult(fut));
@@ -159,6 +162,7 @@ public class BuildChainProcessor {
      * @param procLog Process logger.
      * @param includeScheduledInfo Include scheduled info.
      * @param failRateBranch Fail rate branch.
+     * @param mode
      */
     @AutoProfiling
     public FullChainRunCtx loadFullChainContext(
@@ -168,7 +172,8 @@ public class BuildChainProcessor {
         LatestRebuildMode includeLatestRebuild,
         ProcessLogsMode procLog,
         boolean includeScheduledInfo,
-        @Nullable String failRateBranch) {
+        @Nullable String failRateBranch,
+        SyncMode mode) {
 
         if (entryPoints.isEmpty())
             return new FullChainRunCtx(Build.createFakeStub());
@@ -178,20 +183,22 @@ public class BuildChainProcessor {
         final Stream<FatBuildCompacted> entryPointsFatBuilds = entryPoints.stream()
                 .filter(Objects::nonNull)
                 .filter(id -> !builds.containsKey(id)) //load and propagate only new entry points
-                .map(id -> builds.computeIfAbsent(id, teamcityIgnited::getFatBuild));
+                .map(id -> builds.computeIfAbsent(id, id1 -> {
+                    return teamcityIgnited.getFatBuild(id1, mode);
+                }));
 
         final ExecutorService svc = tcUpdatePool.getService();
 
         final Stream<FatBuildCompacted> depsFirstLevel = entryPointsFatBuilds
-            .flatMap(ref -> dependencies(teamcityIgnited, builds, ref));
+            .flatMap(ref -> dependencies(teamcityIgnited, builds, mode, ref));
 
         Stream<FatBuildCompacted> secondLevelDeps = depsFirstLevel
-            .flatMap(ref -> dependencies(teamcityIgnited, builds, ref));
+            .flatMap(ref -> dependencies(teamcityIgnited, builds, mode, ref));
 
         // builds may became non unique because of race in filtering and acquiring deps
         final List<Future<Stream<FatBuildCompacted>>> phase3Submitted = secondLevelDeps
                 .map((fatBuild) -> svc.submit(
-                        () -> replaceWithRecent(teamcityIgnited, includeLatestRebuild, builds, fatBuild, entryPoints.size())))
+                        () -> replaceWithRecent(teamcityIgnited, includeLatestRebuild, mode, builds, fatBuild, entryPoints.size())))
                 .collect(Collectors.toList());
 
         Map<String, MultBuildRunCtx> buildsCtxMap = new ConcurrentHashMap<>();
@@ -222,7 +229,8 @@ public class BuildChainProcessor {
         };
 
         Integer someEntryPnt = entryPoints.iterator().next();
-        FatBuildCompacted build = builds.computeIfAbsent(someEntryPnt, teamcityIgnited::getFatBuild);
+        FatBuildCompacted build = builds.computeIfAbsent(someEntryPnt,
+            id -> teamcityIgnited.getFatBuild(id, mode));
         FullChainRunCtx fullChainRunCtx = new FullChainRunCtx(build.toBuild(compactor));
 
         contexts.sort(Comparator.comparing(function).reversed());
@@ -270,10 +278,10 @@ public class BuildChainProcessor {
     @NotNull
     @AutoProfiling
     protected Stream<FatBuildCompacted> replaceWithRecent(ITeamcityIgnited teamcityIgnited,
-                                                           LatestRebuildMode includeLatestRebuild,
-                                                           Map<Integer, FatBuildCompacted> builds,
-                                                           FatBuildCompacted buildCompacted,
-                                                           int cntLimit) {
+        LatestRebuildMode includeLatestRebuild,
+        SyncMode syncMode, Map<Integer, FatBuildCompacted> builds,
+        FatBuildCompacted buildCompacted,
+        int cntLimit) {
         if (includeLatestRebuild == LatestRebuildMode.NONE)
             return Stream.of(buildCompacted);
 
@@ -290,7 +298,7 @@ public class BuildChainProcessor {
                     .orElse(buildCompacted);
 
             return Stream.of(recentRef)
-                    .map(b -> builds.computeIfAbsent(b.id(), teamcityIgnited::getFatBuild));
+                    .map(b -> builds.computeIfAbsent(b.id(), id -> teamcityIgnited.getFatBuild(id, syncMode)));
         }
 
         if (includeLatestRebuild == LatestRebuildMode.ALL) {
@@ -360,8 +368,9 @@ public class BuildChainProcessor {
 
     @NotNull
     private Stream<FatBuildCompacted> dependencies(
-            ITeamcityIgnited teamcityIgnited,
-            Map<Integer, FatBuildCompacted> builds,
+        ITeamcityIgnited teamcityIgnited,
+        Map<Integer, FatBuildCompacted> builds,
+        SyncMode mode,
         FatBuildCompacted build) {
 
         Stream<FatBuildCompacted> stream = IntStream.of(build.snapshotDependencies())
@@ -369,15 +378,14 @@ public class BuildChainProcessor {
                 if (builds.containsKey(id))
                     return Futures.<FatBuildCompacted>immediateFuture(null); //load and propagate only new dependencies
 
+                if (mode == SyncMode.NONE)
+                    return Futures.immediateFuture(loadBuild(teamcityIgnited, builds, mode, id));
+
                 return tcUpdatePool.getService().submit(() -> {
                     if (builds.containsKey(id))
                         return null;
 
-                    FatBuildCompacted buildLoaded = teamcityIgnited.getFatBuild(id);
-
-                    FatBuildCompacted prevVal = builds.putIfAbsent(id, buildLoaded);
-
-                    return prevVal == null ? buildLoaded : null;
+                    return loadBuild(teamcityIgnited, builds, mode, id);
                 });
             })
             .collect(Collectors.toList())
@@ -389,4 +397,14 @@ public class BuildChainProcessor {
             Stream.of(build),
             stream);
     }
+
+    @Nullable
+    private FatBuildCompacted loadBuild(ITeamcityIgnited teamcityIgnited, Map<Integer, FatBuildCompacted> builds,
+        SyncMode mode, int id) {
+        FatBuildCompacted buildLoaded = teamcityIgnited.getFatBuild(id, mode);
+
+        FatBuildCompacted prevVal = builds.putIfAbsent(id, buildLoaded);
+
+        return prevVal == null ? buildLoaded : null;
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
index 3165a26..e87029c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/PrChainsProcessor.java
@@ -20,6 +20,7 @@ import com.google.common.base.Strings;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
@@ -51,6 +52,8 @@ public class PrChainsProcessor {
 
     /** Tc server provider. */
     @Inject ITeamcityIgnitedProvider tcIgnitedProvider;
+
+    /** Git hub connection provider. */
     @Inject IGitHubConnectionProvider gitHubConnProvider;
 
     /**
@@ -62,6 +65,7 @@ public class PrChainsProcessor {
      * @param cnt Count.
      * @param baseBranchForTc Base branch name in TC identification.
      * @param checkAllLogs Check all logs
+     * @param mode TC Server Sync Mode
      * @return Test failures summary.
      */
     @AutoProfiling
@@ -73,7 +77,8 @@ public class PrChainsProcessor {
         String act,
         Integer cnt,
         @Nullable String baseBranchForTc,
-        @Nullable Boolean checkAllLogs) {
+        @Nullable Boolean checkAllLogs,
+        SyncMode mode) {
         final TestFailuresSummary res = new TestFailuresSummary();
         final AtomicInteger runningUpdates = new AtomicInteger();
 
@@ -115,7 +120,8 @@ public class PrChainsProcessor {
         final FullChainRunCtx val = buildChainProcessor.loadFullChainContext(teamcity, tcIgnited, hist,
             rebuild,
             logs, buildResMergeCnt == 1,
-            baseBranch);
+            baseBranch,
+            mode);
 
         Optional<FullChainRunCtx> pubCtx = Optional.of(val);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
index fe67693..be329aa 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/chain/TrackedBranchChainsProcessor.java
@@ -29,6 +29,7 @@ import org.apache.ignite.ci.conf.BranchTracked;
 import org.apache.ignite.ci.di.AutoProfiling;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.web.model.current.ChainAtServerCurrentStatus;
@@ -99,7 +100,8 @@ public class TrackedBranchChainsProcessor {
                     rebuild,
                     logs,
                     includeScheduled,
-                    baseBranchTc
+                    baseBranchTc,
+                    SyncMode.RELOAD_QUEUED
                 );
 
                 int cnt = (int)ctx.getRunningUpdates().count();
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 ee8b0bf..5bf5b66 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
@@ -102,15 +102,16 @@ public interface ITeamcityIgnited {
      * @param id Id.
      */
     public default FatBuildCompacted getFatBuild(int id) {
-        return getFatBuild(id, false);
+        return getFatBuild(id, SyncMode.RELOAD_QUEUED);
     }
 
 
 
     /**
      * @param id Id.
+     * @param mode Refresh mode.
      */
-    public FatBuildCompacted getFatBuild(int id, boolean acceptQueued);
+    public FatBuildCompacted getFatBuild(int id, SyncMode mode);
 
     public Collection<ChangeCompacted> getAllChanges(int[] changeIds);
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java
new file mode 100644
index 0000000..f88a11c
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/SyncMode.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.ci.teamcity.ignited;
+
+public enum SyncMode {
+    /** All: Entity version updated, queued builds re-check, absent entry. */
+    RELOAD_QUEUED,
+
+    /** Load only builds absent in DB, queued and running builds returned as is. */
+    LOAD_NEW,
+
+    /** None: Return only DB version, in case entity is absent fake is returned. */
+    NONE
+}
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 0207bfc..63d9727 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
@@ -342,10 +342,17 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     }
 
     /** {@inheritDoc} */
-    @Override public FatBuildCompacted getFatBuild(int buildId, boolean acceptQueued) {
+    @Override public FatBuildCompacted getFatBuild(int buildId, SyncMode mode) {
         FatBuildCompacted existingBuild = getFatBuildFromIgnite(buildId);
 
-        FatBuildCompacted savedVer = buildSync.loadBuild(conn, buildId, existingBuild, acceptQueued);
+        if (mode == SyncMode.NONE) {
+            if (existingBuild != null)
+                return existingBuild;
+            else
+                return new FatBuildCompacted(); // providing fake builds
+        }
+
+        FatBuildCompacted savedVer = buildSync.loadBuild(conn, buildId, existingBuild, mode);
 
         //build was modified, probably we need also to update reference accordindly
         if (savedVer != null)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 3eab437..f8cf42f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -29,6 +29,7 @@ import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
 import org.apache.ignite.ci.teamcity.ignited.BuildRefDao;
 import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.change.ChangeSync;
 import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
 import org.apache.ignite.ci.util.ExceptionUtil;
@@ -200,7 +201,7 @@ public class ProactiveFatBuildSync {
                     try {
                         FatBuildCompacted existingBuild = builds.get(FatBuildDao.buildIdToCacheKey(srvIdMaskHigh, buildId));
 
-                        FatBuildCompacted savedVer = loadBuild(conn, buildId, existingBuild, false);
+                        FatBuildCompacted savedVer = loadBuild(conn, buildId, existingBuild, SyncMode.RELOAD_QUEUED);
 
                         if (savedVer != null)
                             ld.incrementAndGet();
@@ -233,17 +234,16 @@ public class ProactiveFatBuildSync {
      * @param conn
      * @param buildId
      * @param existingBuild
-     * @param acceptQueued
      * @return null if nothing was saved, use existing build
      */
     @Nullable
     public FatBuildCompacted loadBuild(ITeamcityConn conn, int buildId,
                                        @Nullable FatBuildCompacted existingBuild,
-                                       boolean acceptQueued) {
+                                       SyncMode mode) {
         if (existingBuild != null && !existingBuild.isOutdatedEntityVersion()) {
             boolean finished = !existingBuild.isRunning(compactor) && !existingBuild.isQueued(compactor);
 
-            if(finished || acceptQueued)
+            if (finished || mode != SyncMode.RELOAD_QUEUED)
                 return null;
         }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/Version.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/Version.java
index 8deea67..466151c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/Version.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/Version.java
@@ -23,7 +23,7 @@ package org.apache.ignite.ci.web.model;
     public static final String GITHUB_REF = "https://github.com/apache/ignite-teamcity-bot";
 
     /** TC Bot Version. */
-    public static final String VERSION = "20181115";
+    public static final String VERSION = "20181116";
 
     /** TC Bot Version. */
     public String version = VERSION;
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
index 0117742..415daa9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/GetChainResultsAsHtml.java
@@ -29,16 +29,15 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 
 import com.google.inject.Injector;
-import org.apache.ignite.ci.ITcHelper;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
 import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.restcached.ITcServerProvider;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.util.FutureUtil;
@@ -81,7 +80,7 @@ public class GetChainResultsAsHtml {
         final FullChainRunCtx ctx = buildChainProcessor.loadFullChainContext(teamcity, teamcityIgnited, Collections.singletonList(buildId),
             LatestRebuildMode.NONE,
             ProcessLogsMode.SUITE_NOT_COMPLETE, false,
-            failRateBranch);
+            failRateBranch, SyncMode.RELOAD_QUEUED);
 
         ChainAtServerCurrentStatus status = new ChainAtServerCurrentStatus(teamcity.serverId(), ctx.branchName());
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
index 5cc9c5f..5e6f9d2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/build/GetBuildTestFailures.java
@@ -19,10 +19,10 @@ package org.apache.ignite.ci.web.rest.build;
 
 import com.google.common.collect.BiMap;
 import java.text.ParseException;
-import java.util.Date;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import com.google.inject.Injector;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
 import org.apache.ignite.ci.tcbot.chain.BuildChainProcessor;
 import org.apache.ignite.ci.IAnalyticsEnabledTeamcity;
@@ -31,7 +31,6 @@ import org.apache.ignite.ci.ITeamcity;
 import org.apache.ignite.ci.analysis.FullChainRunCtx;
 import org.apache.ignite.ci.analysis.mode.LatestRebuildMode;
 import org.apache.ignite.ci.analysis.mode.ProcessLogsMode;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.ci.tcmodel.result.tests.TestRef;
@@ -141,7 +140,7 @@ public class GetBuildTestFailures {
         final FullChainRunCtx ctx = buildChainProcessor.loadFullChainContext(teamcity, teamcityIgnited, Collections.singletonList(buildId),
                 LatestRebuildMode.NONE,
                 procLogs, false,
-            failRateBranch);
+            failRateBranch, SyncMode.RELOAD_QUEUED);
 
         final ChainAtServerCurrentStatus chainStatus = new ChainAtServerCurrentStatus(srvId, ctx.branchName());
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
index ca93dc5..2cb5bcb 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/pr/GetPrTestFailures.java
@@ -25,12 +25,11 @@ import org.apache.ignite.ci.tcbot.chain.PrChainsProcessor;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
 import org.apache.ignite.ci.github.pure.IGitHubConnectionProvider;
 import org.apache.ignite.ci.github.PullRequest;
+import org.apache.ignite.ci.teamcity.ignited.SyncMode;
 import org.apache.ignite.ci.user.ICredentialsProv;
-import org.apache.ignite.ci.web.BackgroundUpdater;
 import org.apache.ignite.ci.web.CtxListener;
 import org.apache.ignite.ci.web.model.current.TestFailuresSummary;
 import org.apache.ignite.ci.web.model.current.UpdateInfo;
-import org.apache.ignite.ci.web.rest.parms.FullQueryParams;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -69,12 +68,12 @@ public class GetPrTestFailures {
         @Nullable @QueryParam("baseBranchForTc") String baseBranchForTc,
         @Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs) {
 
-        return new UpdateInfo().copyFrom(getPrFailures(srvId, suiteId, branchForTc, act, cnt, baseBranchForTc, checkAllLogs));
+        return new UpdateInfo().copyFrom(getPrFailuresResultsNoSync(srvId, suiteId, branchForTc, act, cnt, baseBranchForTc, checkAllLogs));
     }
 
     @GET
-    @Path("results")
-    public TestFailuresSummary getPrFailures(
+    @Path("resultsNoSync")
+    public TestFailuresSummary getPrFailuresResultsNoSync(
         @Nullable @QueryParam("serverId") String srvId,
         @Nonnull @QueryParam("suiteId") String suiteId,
         @Nonnull @QueryParam("branchForTc") String branchForTc,
@@ -83,15 +82,25 @@ public class GetPrTestFailures {
         @Nullable @QueryParam("baseBranchForTc") String baseBranchForTc,
         @Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs) {
 
-        final BackgroundUpdater updater = CtxListener.getBackgroundUpdater(ctx);
+        return getPrFailsWithSyncMode(srvId, suiteId, branchForTc, act, cnt, baseBranchForTc, checkAllLogs, SyncMode.NONE);
+    }
 
-        final FullQueryParams key = new FullQueryParams(srvId, suiteId, branchForTc, act, cnt, baseBranchForTc);
-        key.setCheckAllLogs(checkAllLogs);
-        final ICredentialsProv prov = ICredentialsProv.get(req);
+    public TestFailuresSummary getPrFailsWithSyncMode(
+        @QueryParam("serverId") @Nullable String srvId,
+        @QueryParam("suiteId") @Nonnull String suiteId,
+        @QueryParam("branchForTc") @Nonnull String branchForTc,
+        @QueryParam("action") @Nonnull String act,
+        @QueryParam("count") @Nullable Integer cnt,
+        @QueryParam("baseBranchForTc") @Nullable String baseBranchForTc,
+        @QueryParam("checkAllLogs") @Nullable Boolean checkAllLogs,
+        SyncMode mode) {
+        final ICredentialsProv creds = ICredentialsProv.get(req);
+        final Injector injector = CtxListener.getInjector(ctx);
+        final PrChainsProcessor prChainsProcessor = injector.getInstance(PrChainsProcessor.class);
 
-        return updater.get(CURRENT_PR_FAILURES, prov, key,
-                (k) -> getPrFailuresNoCache(k.getServerId(), k.getSuiteId(), k.getBranchForTc(), k.getAction(), k.getCount(), baseBranchForTc, k.getCheckAllLogs()),
-                true);
+        return prChainsProcessor.getTestFailuresSummary(creds, srvId, suiteId, branchForTc, act, cnt, baseBranchForTc,
+            checkAllLogs,
+            mode);
     }
 
     /**
@@ -103,8 +112,8 @@ public class GetPrTestFailures {
      * @param baseBranchForTc Base branch name in TC identification.
      */
     @GET
-    @Path("resultsNoCache")
-    @NotNull public TestFailuresSummary getPrFailuresNoCache(
+    @Path("results")
+    @NotNull public TestFailuresSummary getPrFailures (
         @Nullable @QueryParam("serverId") String srvId,
         @Nonnull @QueryParam("suiteId") String suiteId,
         @Nonnull @QueryParam("branchForTc") String branchForTc,
@@ -113,12 +122,7 @@ public class GetPrTestFailures {
         @Nullable @QueryParam("baseBranchForTc") String baseBranchForTc,
         @Nullable @QueryParam("checkAllLogs") Boolean checkAllLogs) {
 
-        final ICredentialsProv creds = ICredentialsProv.get(req);
-        final Injector injector = CtxListener.getInjector(ctx);
-        final PrChainsProcessor prChainsProcessor = injector.getInstance(PrChainsProcessor.class);
-
-        return prChainsProcessor.getTestFailuresSummary(creds, srvId, suiteId, branchForTc, act, cnt, baseBranchForTc,
-            checkAllLogs);
+        return getPrFailsWithSyncMode(srvId, suiteId, branchForTc, act, cnt, baseBranchForTc, checkAllLogs, SyncMode.RELOAD_QUEUED);
     }
 
     @POST
diff --git a/ignite-tc-helper-web/src/main/webapp/pr.html b/ignite-tc-helper-web/src/main/webapp/pr.html
index 6f667ca..8258ce7 100644
--- a/ignite-tc-helper-web/src/main/webapp/pr.html
+++ b/ignite-tc-helper-web/src/main/webapp/pr.html
@@ -13,6 +13,8 @@
 </head>
 <body>
 <script>
+    var g_shownDataHashCodeHex = "";
+
 $(document).ready(function() {
     $.getScript("js/testfails-2.1.js", function(data, textStatus, jqxhr){ });
 
@@ -90,6 +92,7 @@ function loadData() {
     var curFailuresUrl = "rest/pr/results"  + parmsForRest();
 
     $("#loadStatus").html("<img src='https://www.wallies.com/filebin/images/loading_apple.gif' width=20px height=20px> Please wait. First load of PR run-all data may require significant time.");
+    setTimeout(loadPartialData, 3000);
     $.ajax({
         url: curFailuresUrl,
         success: function(result) {
@@ -106,6 +109,23 @@ function loadData() {
     });
 }
 
+
+    function loadPartialData() {
+        var curFailuresUrl = "rest/pr/resultsNoSync" + parmsForRest();
+
+        if (g_shownDataHashCodeHex === "")
+            $.ajax({
+                url: curFailuresUrl,
+                success: function (result) {
+                    if (g_shownDataHashCodeHex === "") {
+                        showData(result);
+                        setTimeout(loadPartialData, 3000);
+                    }
+                },
+                error: showErrInLoadStatus
+            });
+    }
+
 function showData(result) {
     $("#divFailures").html(showChainOnServersResults(result));
 }