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/10/24 15:40:38 UTC

[ignite-teamcity-bot] branch master updated: IGNITE-9848 Standalone storage development for [TC Bot] Background upload of all builds from TC to the bot DB - Fixes #35.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6faa8ff  IGNITE-9848 Standalone storage development for [TC Bot] Background upload of all builds from TC to the bot DB - Fixes #35.
6faa8ff is described below

commit 6faa8ff74b70e59ecb6ec7733e83f95e37b521fd
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Wed Oct 24 18:37:19 2018 +0300

    IGNITE-9848 Standalone storage development for [TC Bot] Background upload of all builds from TC to the bot DB - Fixes #35.
    
    Signed-off-by: Dmitriy Pavlov <dp...@apache.org>
---
 .../apache/ignite/ci/analysis/MultBuildRunCtx.java |   3 -
 .../java/org/apache/ignite/ci/db/TcHelperDb.java   |   2 +-
 .../org/apache/ignite/ci/jobs/CheckQueueJob.java   |   2 +-
 .../apache/ignite/ci/tcmodel/conf/BuildType.java   |  21 ++++
 .../org/apache/ignite/ci/tcmodel/result/Build.java |  60 +++++++++---
 .../ci/teamcity/ignited/BuildRefCompacted.java     |  60 +++++++++---
 .../ignite/ci/teamcity/ignited/BuildRefDao.java    |  19 ++--
 .../ci/teamcity/ignited/FatBuildCompacted.java     | 109 +++++++++++++++++++++
 .../ignite/ci/teamcity/ignited/FatBuildDao.java    | 105 ++++++++++++++++++++
 .../ci/teamcity/ignited/IStringCompactor.java      |   8 +-
 .../ci/teamcity/ignited/ITeamcityIgnited.java      |   8 ++
 .../ci/teamcity/ignited/IgniteStringCompactor.java |   3 +-
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   |   4 +-
 .../org/apache/ignite/ci/util/ObjectInterner.java  |   8 +-
 .../ci/di/scheduler/DirectExecNoWaitSheduler.java  |   0
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  |  80 ++++++++++++++-
 ignite-tc-helper-web/src/test/resources/build.xml  |  47 +++++++++
 ignite-tc-helper-web/src/test/resources/change.xml |  15 +++
 .../src/test/resources/change2.xml                 |  11 +++
 .../src/test/resources/changeList.xml              |   9 ++
 .../src/test/resources/testFull.xml                |   6 ++
 .../src/test/resources/testList.xml                |  33 +++++++
 22 files changed, 562 insertions(+), 51 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
index 6a338a8..29ecc76 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/MultBuildRunCtx.java
@@ -75,9 +75,6 @@ public class MultBuildRunCtx implements ISuiteResults {
         builds.add(ctx);
     }
 
-    /** Thread dump short file name */
-    @Nullable private Integer threadDumpFileIdx;
-
     /** Currently running builds */
     @Nullable private CompletableFuture<Long> runningBuildCount;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
index 903e5bf..28a181c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/TcHelperDb.java
@@ -121,7 +121,7 @@ public class TcHelperDb {
 
     }
 
-    private static class LocalOnlyTcpDiscoveryIpFinder implements TcpDiscoveryIpFinder {
+    public static class LocalOnlyTcpDiscoveryIpFinder implements TcpDiscoveryIpFinder {
         private int port;
 
         public LocalOnlyTcpDiscoveryIpFinder(int port) {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
index f1cdf72..e5733d7 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/jobs/CheckQueueJob.java
@@ -165,7 +165,7 @@ public class CheckQueueJob implements Runnable {
         int running = 0;
 
         for (Agent agent : agents) {
-            if (agent.getBuild() != null) //  || !STATE_RUNNING.equals(agent.getBuild().status)
+            if (agent.getBuild() != null) //  || !STATE_RUNNING.equals(agent.getFatBuild().status)
                 ++running;
         }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java
index a7998a6..234b441 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/conf/BuildType.java
@@ -48,4 +48,25 @@ public class BuildType {
     public String getProjectId() {
         return projectId;
     }
+
+    /**
+     * @param id New id.
+     */
+    public void id(String id) {
+        this.id = id;
+    }
+
+    /**
+     * @param name Name.
+     */
+    public void name(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @param projectId Project id.
+     */
+    public void projectId(String projectId) {
+        this.projectId = projectId;
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
index 9c6a9cd..b4b1c9b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/result/Build.java
@@ -28,13 +28,19 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.tcmodel.changes.ChangesList;
 import org.apache.ignite.ci.tcmodel.changes.ChangesListRef;
 import org.apache.ignite.ci.tcmodel.conf.BuildType;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+
+
+import org.apache.ignite.ci.util.ExceptionUtil;
 import org.jetbrains.annotations.NotNull;
 
+import static org.apache.ignite.ci.util.ExceptionUtil.propagateException;
+
 /**
  * Build from history with test and problems references
  */
@@ -42,11 +48,16 @@ import org.jetbrains.annotations.NotNull;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class Build extends BuildRef implements IVersionedEntity {
     public static final int LATEST_VERSION = 2;
-    @XmlElement(name = "buildType") BuildType buildType;
+
+    /** Format local. */
+    @XmlTransient private static ThreadLocal<SimpleDateFormat> fmtLoc
+        = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd'T'HHmmssZ"));
+
+    @XmlElement(name = "buildType") private BuildType buildType;
 
     @XmlElement public String queuedDate;
-    @XmlElement public String startDate;
-    @XmlElement public String finishDate;
+    @XmlElement private String startDate;
+    @XmlElement private String finishDate;
 
     @XmlElement(name = "build")
     @XmlElementWrapper(name = "snapshot-dependencies")
@@ -69,6 +80,7 @@ public class Build extends BuildRef implements IVersionedEntity {
     /** Information about build triggering. */
     @XmlElement(name = "triggered") private Triggered triggered;
 
+    @XmlTransient
     @SuppressWarnings("FieldCanBeLocal") public Integer _version = LATEST_VERSION;
 
     @NotNull public static Build createFakeStub() {
@@ -83,28 +95,43 @@ public class Build extends BuildRef implements IVersionedEntity {
         return buildType == null ? null : buildType.getName();
     }
 
-    public String getFinishDateDdMmYyyy() throws ParseException {
-        Date parse = getFinishDate();
-        return new SimpleDateFormat("dd.MM.yyyy").format(parse);
-    }
-
+    /**
+     *
+     */
     public Date getFinishDate() {
         return getDate(finishDate);
     }
 
+    /**
+     *
+     */
     public Date getStartDate() {
         return getDate(startDate);
     }
 
+    /**
+     * @param ts Timestamp.
+     */
+    public void setStartDateTs(long ts) {
+        startDate = ts < 0 ? null : fmtLoc.get().format(new Date(ts));
+    }
+
+    /**
+     * @param ts Timestamp.
+     */
+    public void setFinishDateTs(long ts) {
+        finishDate = ts < 0 ? null : fmtLoc.get().format(new Date(ts));
+    }
+
+    /**
+     * @param date Date as string.
+     */
     private Date getDate(String date) {
         try {
-            if (date == null)
-                return null;
-            SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd'T'HHmmssZ");
-            return f.parse(date);
+            return date == null ? null : fmtLoc.get().parse(date);
         }
         catch (ParseException e) {
-            throw new IllegalStateException(e);
+            throw propagateException(e);
         }
     }
 
@@ -137,4 +164,11 @@ public class Build extends BuildRef implements IVersionedEntity {
     public void setTriggered(Triggered triggered) {
         this.triggered = triggered;
     }
+
+    /**
+     * @param type Type.
+     */
+    public void setBuildType(BuildType type) {
+        buildType = type;
+    }
 }
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
index a983e77..3c455d3 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefCompacted.java
@@ -17,14 +17,25 @@
 package org.apache.ignite.ci.teamcity.ignited;
 
 import com.google.common.base.Objects;
+import org.apache.ignite.ci.db.Persisted;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 
+@Persisted
 public class BuildRefCompacted {
-    int id = -1;
-    int buildTypeId = -1;
-    int branchName = -1;
-    int status = -1;
-    int state = -1;
+    /** Build Id without modifications, -1 if it is null. */
+    private int id = -1;
+
+    /** Compacter identifier for string 'Build type id'. */
+    private int buildTypeId = -1;
+
+    /** Compacter identifier for string 'Branch name'. */
+    private int branchName = -1;
+
+    /** Compacter identifier for string 'Status'. */
+    private int status = -1;
+
+    /** Compacter identifier for string 'State'. */
+    private int state = -1;
 
     /**
      * Default constructor.
@@ -33,15 +44,15 @@ public class BuildRefCompacted {
     }
 
     /**
-     * @param compacter Compacter.
+     * @param compactor Compactor.
      * @param ref Reference.
      */
-    public BuildRefCompacted(IStringCompactor compacter, BuildRef ref) {
+    public BuildRefCompacted(IStringCompactor compactor, BuildRef ref) {
         id = ref.getId() == null ? -1 : ref.getId();
-        buildTypeId = compacter.getStringId(ref.buildTypeId());
-        branchName = compacter.getStringId(ref.branchName());
-        status = compacter.getStringId(ref.status());
-        state = compacter.getStringId(ref.state());
+        buildTypeId = compactor.getStringId(ref.buildTypeId());
+        branchName = compactor.getStringId(ref.branchName());
+        status = compactor.getStringId(ref.status());
+        state = compactor.getStringId(ref.state());
     }
 
     /**
@@ -50,13 +61,17 @@ public class BuildRefCompacted {
     public BuildRef toBuildRef(IStringCompactor compactor) {
         BuildRef res = new BuildRef();
 
+        fillBuildRefFields(compactor, res);
+
+        return res;
+    }
+
+    protected void fillBuildRefFields(IStringCompactor compactor, BuildRef res) {
         res.setId(id < 0 ? null : id);
         res.buildTypeId = compactor.getStringFromId(buildTypeId);
         res.branchName = compactor.getStringFromId(branchName);
         res.status = compactor.getStringFromId(status);
         res.state = compactor.getStringFromId(state);
-
-        return res;
     }
 
     /** {@inheritDoc} */
@@ -78,10 +93,23 @@ public class BuildRefCompacted {
         return Objects.hashCode(id, buildTypeId, branchName, status, state);
     }
 
-    /**
-     *
-     */
+    /** */
     public int id() {
         return id;
     }
+
+    /** */
+    public int buildTypeId() {
+        return buildTypeId;
+    }
+
+    /** */
+    public int branchName() {
+        return branchName;
+    }
+
+    /** */
+    public int state() {
+        return state;
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
index 2b68806..6febf4f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
@@ -33,11 +33,12 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.util.GridIntList;
 import org.jetbrains.annotations.NotNull;
 
 public class BuildRefDao {
-    /** Cache name*/
+    /** Cache name */
     public static final String TEAMCITY_BUILD_CACHE_NAME = "teamcityBuild";
 
     /** Ignite provider. */
@@ -50,8 +51,8 @@ public class BuildRefDao {
     @Inject private IStringCompactor compactor;
 
     public void init () {
-        Ignite ignite = igniteProvider.get();
-        buildsCache = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(TEAMCITY_BUILD_CACHE_NAME));
+        CacheConfiguration<Long, BuildRefCompacted> cfg = TcHelperDb.getCacheV2Config(TEAMCITY_BUILD_CACHE_NAME);
+        buildsCache = igniteProvider.get().getOrCreateCache(cfg);
     }
 
     @NotNull protected Stream<BuildRefCompacted> compactedBuildsForServer(long srvId) {
@@ -60,6 +61,10 @@ public class BuildRefDao {
             .map(javax.cache.Cache.Entry::getValue);
     }
 
+    /**
+     * @param srvId Server id mask high.
+     * @param ghData Gh data.
+     */
     public int saveChunk(long srvId, List<BuildRef> ghData) {
         Set<Long> ids = ghData.stream().map(BuildRef::getId)
             .filter(Objects::nonNull)
@@ -74,7 +79,7 @@ public class BuildRefDao {
             .collect(Collectors.toList());
 
         for (BuildRefCompacted next : collect) {
-            long cacheKey = buildIdToCacheKey(srvId, next.id);
+            long cacheKey = buildIdToCacheKey(srvId, next.id());
             BuildRefCompacted buildPersisted = existingEntries.get(cacheKey);
 
             if (buildPersisted == null || !buildPersisted.equals(next))
@@ -113,8 +118,8 @@ public class BuildRefDao {
             return Collections.emptyList();
 
         return compactedBuildsForServer(srvId)
-            .filter(e -> e.buildTypeId == (int)buildTypeIdId)
-            .filter(e -> e.branchName == (int)bracnhNameQryId)
+            .filter(e -> e.buildTypeId() == buildTypeIdId)
+            .filter(e -> e.branchName() == bracnhNameQryId)
             .map(compacted -> compacted.toBuildRef(compactor))
             .collect(Collectors.toList());
     }
@@ -134,7 +139,7 @@ public class BuildRefDao {
 
 
         return compactedBuildsForServer(srvId)
-            .filter(e ->  list.contains(e.state) )
+            .filter(e ->  list.contains(e.state()) )
             .collect(Collectors.toList());
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildCompacted.java
new file mode 100644
index 0000000..7254abe
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildCompacted.java
@@ -0,0 +1,109 @@
+/*
+ * 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;
+
+import org.apache.ignite.ci.analysis.IVersionedEntity;
+import org.apache.ignite.ci.db.Persisted;
+import org.apache.ignite.ci.tcmodel.conf.BuildType;
+import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.ci.tcmodel.result.Build;
+
+/**
+ *
+ */
+@Persisted
+public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEntity {
+    /** Latest version. */
+    private static final int LATEST_VERSION = 0;
+
+    /** Entity fields version. */
+    private short _ver;
+
+    /** Start date. The number of milliseconds since January 1, 1970, 00:00:00 GMT */
+    private long startDate;
+
+    /** Finish date. The number of milliseconds since January 1, 1970, 00:00:00 GMT */
+    private long finishDate;
+
+    private int projectId = -1;
+    private int name = -1;
+
+    /** {@inheritDoc} */
+    @Override public int version() {
+        return _ver;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int latestVersion() {
+        return LATEST_VERSION;
+    }
+
+    /**
+     * Default constructor.
+     */
+    public FatBuildCompacted() {
+    }
+
+    /**
+     * @param compactor Compactor.
+     * @param ref Reference.
+     */
+    public FatBuildCompacted(IStringCompactor compactor, Build ref) {
+        super(compactor, ref);
+
+        startDate = ref.getStartDate() == null ? -1L : ref.getStartDate().getTime();
+        finishDate = ref.getFinishDate() == null ? -1L : ref.getFinishDate().getTime();
+
+        BuildType type = ref.getBuildType();
+        if (type != null) {
+            projectId = compactor.getStringId(type.getProjectId());
+            name = compactor.getStringId(type.getName());
+        }
+    }
+
+    /**
+     * @param compactor Compacter.
+     */
+    public Build toBuild(IStringCompactor compactor) {
+        Build res = new Build();
+
+        fillBuildRefFields(compactor, res);
+
+        fillBuildFields(compactor, res);
+
+        return res;
+    }
+
+    /**
+     * @param compactor Compactor.
+     * @param res Response.
+     */
+    private void fillBuildFields(IStringCompactor compactor, Build res) {
+        if (startDate > 0)
+            res.setStartDateTs(startDate);
+
+        if (finishDate > 0)
+            res.setFinishDateTs(finishDate);
+
+        BuildType type = new BuildType();
+        type.id(res.buildTypeId());
+        type.name(compactor.getStringFromId(name));
+        type.projectId(compactor.getStringFromId(projectId));
+        res.setBuildType(type);
+    }
+
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildDao.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildDao.java
new file mode 100644
index 0000000..e0706d1
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/FatBuildDao.java
@@ -0,0 +1,105 @@
+/*
+ * 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;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+import javax.inject.Inject;
+import javax.inject.Provider;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.ci.db.TcHelperDb;
+import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class FatBuildDao {
+    /** Cache name */
+    public static final String TEAMCITY_FAT_BUILD_CACHE_NAME = "teamcityFatBuild";
+
+    /** Ignite provider. */
+    @Inject private Provider<Ignite> igniteProvider;
+
+    /** Builds cache. */
+    private IgniteCache<Long, FatBuildCompacted> buildsCache;
+
+    /** Compactor. */
+    @Inject private IStringCompactor compactor;
+
+    /**
+     *
+     */
+    public void init() {
+        buildsCache = igniteProvider.get().getOrCreateCache(TcHelperDb.getCacheV2Config(TEAMCITY_FAT_BUILD_CACHE_NAME));
+    }
+
+    /**
+     * @param srvIdMaskHigh Server id mask high.
+     * @param ghData Gh data.
+     */
+    public int saveChunk(long srvIdMaskHigh, List<Build> ghData) {
+        Set<Long> ids = ghData.stream().map(BuildRef::getId)
+            .filter(Objects::nonNull)
+            .map(buildId -> buildIdToCacheKey(srvIdMaskHigh, buildId))
+            .collect(Collectors.toSet());
+
+        Map<Long, FatBuildCompacted> existingEntries = buildsCache.getAll(ids);
+        Map<Long, FatBuildCompacted> entriesToPut = new TreeMap<>();
+
+        List<FatBuildCompacted> collect = ghData.stream()
+            .map(ref -> new FatBuildCompacted(compactor, ref))
+            .collect(Collectors.toList());
+
+        for (FatBuildCompacted next : collect) {
+            long cacheKey = buildIdToCacheKey(srvIdMaskHigh, next.id());
+            FatBuildCompacted buildPersisted = existingEntries.get(cacheKey);
+
+            if (buildPersisted == null || !buildPersisted.equals(next))
+                entriesToPut.put(cacheKey, next);
+        }
+
+        int size = entriesToPut.size();
+        if (size != 0)
+            buildsCache.putAll(entriesToPut);
+
+        return size;
+    }
+
+    /**
+     * @param srvIdMaskHigh Server id mask high.
+     * @param buildId Build id.
+     */
+    private long buildIdToCacheKey(long srvIdMaskHigh, int buildId) {
+        return (long)buildId | srvIdMaskHigh << 32;
+    }
+
+    /**
+     * @param srvIdMaskHigh Server id mask high.
+     * @param buildId Build id.
+     */
+    public FatBuildCompacted getFatBuild(int srvIdMaskHigh, int buildId) {
+        return buildsCache.get(buildIdToCacheKey(srvIdMaskHigh, buildId));
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
index 59c2986..dfdc3b2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
@@ -16,6 +16,9 @@
  */
 package org.apache.ignite.ci.teamcity.ignited;
 
+/**
+ *
+ */
 public interface IStringCompactor {
     /**
      * @param val Value.
@@ -27,5 +30,8 @@ public interface IStringCompactor {
      */
     public String getStringFromId(int id);
 
-    public Integer getStringIdIfPresent(String id);
+    /**
+     * @param val Value to check in the compactor.
+     */
+    public Integer getStringIdIfPresent(String val);
 }
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 470d5d1..fadf0fb 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
@@ -48,4 +48,12 @@ public interface ITeamcityIgnited {
      * @param queueAtTop Put at the top of the build queue.
      */
     public Build triggerBuild(String buildTypeId, String branchName, boolean cleanRebuild, boolean queueAtTop);
+
+    /**
+     * @param srvId Server id.
+     * @return integer representation of server ID.
+     */
+    public static int serverIdToInt(String srvId) {
+        return Math.abs(srvId.hashCode());
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
index 5cd2a0b..906b0d5 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
@@ -34,6 +34,7 @@ import org.apache.ignite.cache.query.SqlQuery;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.ci.di.AutoProfiling;
 import org.apache.ignite.ci.util.ExceptionUtil;
+import org.apache.ignite.ci.util.ObjectInterner;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.jetbrains.annotations.NotNull;
 
@@ -147,7 +148,7 @@ public class IgniteStringCompactor implements IStringCompactor {
 
         qryCursor.close();
 
-        return next.getValue().val;
+        return ObjectInterner.internString(next.getValue().val);
     }
 
     /** {@inheritDoc} */
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 5e598ec..0667976 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
@@ -41,10 +41,10 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     /** Pure HTTP Connection API. */
     private ITeamcityConn conn;
 
-
     /** Scheduler. */
     @Inject private IScheduler scheduler;
 
+    /** Build reference DAO. */
     @Inject private BuildRefDao buildRefDao;
 
     /** Server ID mask for cache Entries. */
@@ -55,7 +55,7 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
         this.srvId = srvId;
         this.conn = conn;
 
-        srvIdMaskHigh = Math.abs(srvId.hashCode());
+        srvIdMaskHigh = ITeamcityIgnited.serverIdToInt(srvId);
         buildRefDao.init(); //todo init somehow in auto
     }
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java
index b58fe96..9834d5c 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/util/ObjectInterner.java
@@ -32,6 +32,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  * Class with util method for custom strings deduplication (intern analogue).
  */
 public class ObjectInterner {
+    /** String cache. */
     private static final LoadingCache<String, String> stringCache
         = CacheBuilder
         .<String, String>newBuilder()
@@ -39,13 +40,16 @@ public class ObjectInterner {
         .initialCapacity(67537)
         .build(
             new CacheLoader<String, String>() {
-                @Override public String load(String key) throws Exception {
+                @Override public String load(String key) {
                     return key;
                 }
             }
         );
 
-    private static String internString(String str) {
+    /**
+     * @param str String.
+     */
+    public static String internString(String str) {
         if (str == null)
             return null;
 
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitSheduler.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitSheduler.java
similarity index 100%
rename from ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitSheduler.java
rename to ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/di/scheduler/DirectExecNoWaitSheduler.java
diff --git a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index ea7e0a9..737cca3 100644
--- a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++ b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -15,25 +15,34 @@
  * limitations under the License.
  */
 package org.apache.ignite.ci.teamcity.ignited;
-
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import java.io.FileNotFoundException;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
+import javax.xml.bind.JAXBException;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.Ignition;
+import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.scheduler.DirectExecNoWaitSheduler;
 import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.ci.di.scheduler.NoOpSheduler;
+import org.apache.ignite.ci.tcmodel.conf.BuildType;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.ci.tcmodel.result.Build;
 import org.apache.ignite.ci.teamcity.pure.BuildHistoryEmulator;
 import org.apache.ignite.ci.teamcity.pure.ITeamcityHttpConnection;
 import org.apache.ignite.ci.user.ICredentialsProv;
+import org.apache.ignite.ci.util.XmlUtil;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.jetbrains.annotations.NotNull;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -51,7 +60,11 @@ import static org.mockito.Mockito.when;
  */
 public class IgnitedTcInMemoryIntegrationTest {
     /** Server Name for test. */
-    public static final String APACHE = "apache";
+    public static final String APACHE = "apachetest";
+
+    /** Test ignite port. */
+    public static final int TEST_IGNITE_PORT = 64124;
+
     /** Ignite. */
     private static Ignite ignite;
 
@@ -60,7 +73,18 @@ public class IgnitedTcInMemoryIntegrationTest {
      */
     @BeforeClass
     public static void startIgnite() {
-        ignite = Ignition.start();
+        IgniteConfiguration cfg = new IgniteConfiguration();
+        final TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        int locPort = TEST_IGNITE_PORT;
+
+
+        spi.setLocalPort(locPort);
+        spi.setLocalPortRange(1);
+        spi.setIpFinder(new TcHelperDb.LocalOnlyTcpDiscoveryIpFinder(locPort));
+
+        cfg.setDiscoverySpi(spi);
+
+        ignite = Ignition.start(cfg);
     }
 
     /**
@@ -68,7 +92,8 @@ public class IgnitedTcInMemoryIntegrationTest {
      */
     @AfterClass
     public static void stopIgnite() {
-        ignite.close();
+        if (ignite != null)
+            ignite.close();
     }
 
     @Test
@@ -124,6 +149,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         );
     }
 
+
     @Test
     public void incrementalActualizationOfBuildsContainsQueued() throws IOException {
         ITeamcityHttpConnection http = Mockito.mock(ITeamcityHttpConnection.class);
@@ -200,6 +226,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         System.out.println("After " + statues);
     }
 
+
     /**
      *
      */
@@ -213,4 +240,49 @@ public class IgnitedTcInMemoryIntegrationTest {
         return mock;
     }
 
+    @Test
+    public void testFatBuild() throws JAXBException, IOException {
+        InputStream stream = getClass().getResourceAsStream("/build.xml");
+        Build refBuild = XmlUtil.load(Build.class, new InputStreamReader(stream));
+        Injector injector = Guice.createInjector(new AbstractModule() {
+            @Override protected void configure() {
+                bind(Ignite.class).toInstance(ignite);
+                bind(IStringCompactor.class).to(IgniteStringCompactor.class);
+            }
+        });
+
+        FatBuildDao instance = injector.getInstance(FatBuildDao.class);
+        instance.init();
+
+        int srvIdMaskHigh = ITeamcityIgnited.serverIdToInt(APACHE);
+        int i = instance.saveChunk(srvIdMaskHigh, Collections.singletonList(refBuild));
+        assertEquals(1, i);
+
+        FatBuildCompacted fatBuild = instance.getFatBuild(srvIdMaskHigh, 2039380);
+
+        Build actBuild = fatBuild.toBuild(injector.getInstance(IStringCompactor.class));
+
+        try (FileWriter writer = new FileWriter("src/test/resources/build1.xml")) {
+            writer.write(XmlUtil.save(refBuild));
+        }
+
+        String save = XmlUtil.save(actBuild);
+        System.out.println(save);
+        try (FileWriter writer = new FileWriter("src/test/resources/build2.xml")) {
+            writer.write(save);
+        }
+
+        assertEquals(refBuild.getId(), actBuild.getId());
+        assertEquals(refBuild.status(), actBuild.status());
+        assertEquals(refBuild.state(), actBuild.state());
+        assertEquals(refBuild.buildTypeId(), actBuild.buildTypeId());
+        assertEquals(refBuild.getStartDate(), actBuild.getStartDate());
+        assertEquals(refBuild.getFinishDate(), actBuild.getFinishDate());
+        BuildType refBt = refBuild.getBuildType();
+        BuildType actBt = actBuild.getBuildType();
+        assertEquals(refBt.getName(), actBt.getName());
+        assertEquals(refBt.getProjectId(), actBt.getProjectId());
+        assertEquals(refBt.getId(), actBt.getId());
+    }
+
 }
diff --git a/ignite-tc-helper-web/src/test/resources/build.xml b/ignite-tc-helper-web/src/test/resources/build.xml
new file mode 100644
index 0000000..6cf6e3d
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/build.xml
@@ -0,0 +1,47 @@
+<!--https://ci.ignite.apache.org/app/rest/latest/builds/id:2039380-->
+<build id="2039380" buildTypeId="IgniteTests24Java8_Jta" number="3617" status="SUCCESS" state="finished" branchName="refs/heads/master" defaultBranch="true" href="/app/rest/latest/builds/id:2039380" webUrl="http://ci.ignite.apache.org/viewLog.html?buildId=2039380&amp;buildTypeId=IgniteTests24Java8_Jta">
+    <statusText>Tests passed: 30</statusText>
+    <buildType id="IgniteTests24Java8_Jta" name="JTA" projectName="Ignite Tests 2.4+ (Java 8/9/10/11)" projectId="IgniteTests24Java8" href="/app/rest/latest/buildTypes/id:IgniteTests24Java8_Jta" webUrl="http://ci.ignite.apache.org/viewType.html?buildTypeId=IgniteTests24Java8_Jta"/>
+    <queuedDate>20181009T062019+0300</queuedDate>
+    <startDate>20181009T063622+0300</startDate>
+    <finishDate>20181009T063721+0300</finishDate>
+    <triggered type="snapshotDependency" date="20181009T062019+0300">
+        <user username="dpavlov" name="Dmitriy Pavlov" id="129" href="/app/rest/latest/users/id:129"/>
+        <build id="2039462" buildTypeId="IgniteTests24Java8_RunAll" number="5370" status="FAILURE" state="finished" composite="true" branchName="refs/heads/master" defaultBranch="true" href="/app/rest/latest/builds/id:2039462" webUrl="http://ci.ignite.apache.org/viewLog.html?buildId=2039462&amp;buildTypeId=IgniteTests24Java8_RunAll"/>
+        <buildType id="IgniteTests24Java8_RunAll" name="--> Run :: All" description="Dummy build for run all build in project by one click" projectName="Ignite Tests 2.4+ (Java 8/9/10/11)" projectId="IgniteTests24Java8" href="/app/rest/latest/buildTypes/id:IgniteTests24Java8_RunAll" webUrl="http://ci.ignite.apache.org/viewType.html?buildTypeId=IgniteTests24Java8_RunAll"/>
+    </triggered>
+    <lastChanges count="1">
+        <change id="834072" version="b50a9dc18a115d5fc599ac15a11546911ae0bc45" username="29892836+stuartmacd" date="20181008T182104+0300" href="/app/rest/latest/changes/id:834072" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834072&amp;personal=false"/>
+    </lastChanges>
+    <changes href="/app/rest/latest/changes?locator=build:(id:2039380)"/>
+    <revisions count="1">
+        <revision version="b50a9dc18a115d5fc599ac15a11546911ae0bc45" vcsBranchName="refs/heads/master">
+            <vcs-root-instance id="278" vcs-root-id="GitHubApacheIgnite" name="(proxy) GitHub [apache/ignite]" href="/app/rest/latest/vcs-root-instances/id:278"/>
+        </revision>
+    </revisions>
+    <agent id="239" name="publicagent12_9095" typeId="241" href="/app/rest/latest/agents/id:239" webUrl="http://ci.ignite.apache.org/agentDetails.html?id=239&amp;realAgentName=publicagent12_9095&amp;agentTypeId=241"/>
+    <testOccurrences count="30" href="/app/rest/latest/testOccurrences?locator=build:(id:2039380)" passed="30"/>
+    <artifacts href="/app/rest/latest/builds/id:2039380/artifacts/children/"/>
+    <relatedIssues href="/app/rest/latest/builds/id:2039380/relatedIssues"/>
+    <properties count="12">
+        <property name="ACTUAL_VERSION" value="%dep.IgniteTests24Java8_BuildApacheIgnite.ACTUAL_VERSION%" inherited="true"/>
+        <property name="env.JAVA_HOME" value="%env.JDK_ORA_18%"/>
+        <property name="JVM_ARGS" value="" inherited="true"/>
+        <property name="JVM_EXTRA_ARGS" value="%dep.IgniteTests24Java8_BuildApacheIgnite.JVM_EXTRA_ARGS%" inherited="true"/>
+        <property name="MAVEN_GOALS" value="surefire:test" inherited="true"/>
+        <property name="MAVEN_MODULES" value=":ignite-jta" inherited="true"/>
+        <property name="MAVEN_OPTS" value="" inherited="true"/>
+        <property name="reverse.dep.*.env.JAVA_HOME" value="%env.JDK_ORA_18%" inherited="true"/>
+        <property name="system.IGNITE_DUMP_THREADS_ON_FAILURE" value="false" inherited="true"/>
+        <property name="TEST_SUITE" value="IgniteJtaTestSuite" inherited="true"/>
+        <property name="XMS" value="2g" inherited="true"/>
+        <property name="XMX" value="2g" inherited="true"/>
+    </properties>
+    <statistics href="/app/rest/latest/builds/id:2039380/statistics"/>
+    <snapshot-dependencies count="1">
+        <build id="2039356" buildTypeId="IgniteTests24Java8_BuildApacheIgnite" number="6721" status="SUCCESS" state="finished" branchName="refs/heads/master" defaultBranch="true" href="/app/rest/latest/builds/id:2039356" webUrl="http://ci.ignite.apache.org/viewLog.html?buildId=2039356&amp;buildTypeId=IgniteTests24Java8_BuildApacheIgnite"/>
+    </snapshot-dependencies>
+    <artifact-dependencies count="1">
+        <build id="2039356" buildTypeId="IgniteTests24Java8_BuildApacheIgnite" number="6721" status="SUCCESS" state="finished" branchName="refs/heads/master" defaultBranch="true" href="/app/rest/latest/builds/id:2039356" webUrl="http://ci.ignite.apache.org/viewLog.html?buildId=2039356&amp;buildTypeId=IgniteTests24Java8_BuildApacheIgnite"/>
+    </artifact-dependencies>
+</build>
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/test/resources/change.xml b/ignite-tc-helper-web/src/test/resources/change.xml
new file mode 100644
index 0000000..48d8723
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/change.xml
@@ -0,0 +1,15 @@
+<!--https://ci.ignite.apache.org/app/rest/latest/changes/id:834843-->
+<change id="834843" version="5925444df9170652d4436288f470bf6d031c104e" username="jokserfn" date="20181011T190027+0300" href="/app/rest/latest/changes/id:834843" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834843&personal=false">
+    <comment>
+        IGNITE-9561 Optimize affinity initialization for started cache groups - Fixes #4854.
+    </comment>
+    <user username="pkovalenko" name="Pavel Kovalenko" id="138" href="/app/rest/latest/users/id:138"/>
+    <files count="5">
+        <file before-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" after-revision="5925444df9170652d4436288f470bf6d031c104e" changeType="edited" file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java" relative-file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java"/>
+        <file before-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" after-revision="5925444df9170652d4436288f470bf6d031c104e" changeType="edited" file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java" relative-file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java"/>
+        <file before-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" after-revision="5925444df9170652d4436288f470bf6d031c104e" changeType="edited" file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/CacheGroupAffinityMessage.java" relative-file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/CacheGroupAffinityMessage.java"/>
+        <file before-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" after-revision="5925444df9170652d4436288f470bf6d031c104e" changeType="edited" file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java" relative-file="modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java"/>
+        <file before-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" after-revision="5925444df9170652d4436288f470bf6d031c104e" changeType="edited" file="modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java" relative-file="modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java"/>
+    </files>
+    <vcsRootInstance id="278" vcs-root-id="GitHubApacheIgnite" name="(proxy) GitHub [apache/ignite]" href="/app/rest/latest/vcs-root-instances/id:278"/>
+</change>
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/test/resources/change2.xml b/ignite-tc-helper-web/src/test/resources/change2.xml
new file mode 100644
index 0000000..6b3572d
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/change2.xml
@@ -0,0 +1,11 @@
+<!--https://ci.ignite.apache.org/app/rest/latest/changes/id:834837-->
+<change id="834837" version="584652293c8646d8a893eed1a2b2ae1a179a5d20" username="aplatonovv" date="20181011T184228+0300" href="/app/rest/latest/changes/id:834837" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834837&personal=false">
+    <comment>
+        IGNITE-9726 Prevent the whole suite lockup after GridCacheAbstractFailoverSelfTest failure - Fixes #4859. Signed-off-by: Alexey Goncharuk <al...@gmail.com>
+    </comment>
+    <files count="2">
+        <file before-revision="88df5ee607b23a30e051e9724dcd97b7e43aa6d6" after-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" changeType="edited" file="modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java" relative-file="modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFailoverSelfTest.java"/>
+        <file before-revision="88df5ee607b23a30e051e9724dcd97b7e43aa6d6" after-revision="584652293c8646d8a893eed1a2b2ae1a179a5d20" changeType="edited" file="modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java" relative-file="modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java"/>
+    </files>
+    <vcsRootInstance id="278" vcs-root-id="GitHubApacheIgnite" name="(proxy) GitHub [apache/ignite]" href="/app/rest/latest/vcs-root-instances/id:278"/>
+</change>
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/test/resources/changeList.xml b/ignite-tc-helper-web/src/test/resources/changeList.xml
new file mode 100644
index 0000000..1f12d11
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/changeList.xml
@@ -0,0 +1,9 @@
+<!--https://ci.ignite.apache.org/app/rest/latest/changes?locator=build:(id:2063765)-->
+<changes count="6" href="/app/rest/latest/changes?locator=build:(id:2063765)">
+    <change id="834843" version="5925444df9170652d4436288f470bf6d031c104e" username="jokserfn" date="20181011T190027+0300" href="/app/rest/latest/changes/id:834843" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834843&amp;personal=false"/>
+    <change id="834837" version="584652293c8646d8a893eed1a2b2ae1a179a5d20" username="aplatonovv" date="20181011T184228+0300" href="/app/rest/latest/changes/id:834837" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834837&amp;personal=false"/>
+    <change id="834798" version="88df5ee607b23a30e051e9724dcd97b7e43aa6d6" username="kondakov87" date="20181011T161152+0300" href="/app/rest/latest/changes/id:834798" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834798&amp;personal=false"/>
+    <change id="834773" version="f57b807bb84606dceba26ec1e34e694712579524" username="mr.weider" date="20181011T150104+0300" href="/app/rest/latest/changes/id:834773" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834773&amp;personal=false"/>
+    <change id="834768" version="f97ebff9a59514a681258b46ae1b74c1ce4e0a3b" username="tledkov" date="20181011T143420+0300" href="/app/rest/latest/changes/id:834768" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834768&amp;personal=false"/>
+    <change id="834760" version="a3c2ea3bf5601fa600c92d2f1701372546bc2a7d" username="isapego" date="20181011T132601+0300" href="/app/rest/latest/changes/id:834760" webUrl="http://ci.ignite.apache.org/viewModification.html?modId=834760&amp;personal=false"/>
+</changes>
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/test/resources/testFull.xml b/ignite-tc-helper-web/src/test/resources/testFull.xml
new file mode 100644
index 0000000..7b6da00
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/testFull.xml
@@ -0,0 +1,6 @@
+<!--https://ci.ignite.apache.org/app/rest/latest/testOccurrences/id:3078,build:(id:2039380)-->
+<testOccurrence id="id:3078,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest.testAsyncOpAwait" status="SUCCESS" duration="102" href="/app/rest/latest/testOccurrences/id:3078,build:(id:2039380)">
+    <details/>
+    <test id="6611322481661461526" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest.testAsyncOpAwait" href="/app/rest/latest/tests/id:6611322481661461526"/>
+    <build id="2039380" buildTypeId="IgniteTests24Java8_Jta" number="3617" status="SUCCESS" state="finished" branchName="refs/heads/master" defaultBranch="true" href="/app/rest/latest/builds/id:2039380" webUrl="http://ci.ignite.apache.org/viewLog.html?buildId=2039380&amp;buildTypeId=IgniteTests24Java8_Jta"/>
+</testOccurrence>
\ No newline at end of file
diff --git a/ignite-tc-helper-web/src/test/resources/testList.xml b/ignite-tc-helper-web/src/test/resources/testList.xml
new file mode 100644
index 0000000..1e1d654
--- /dev/null
+++ b/ignite-tc-helper-web/src/test/resources/testList.xml
@@ -0,0 +1,33 @@
+<!-- https://ci.ignite.apache.org/app/rest/latest/testOccurrences?locator=build:(id:2039380),expandInvocations:true-->
+<testOccurrences count="30" href="http://ci.ignite.apache.org:443/app/rest/testOccurrences?locator=build:(id:2039380),expandInvocations:true">
+    <testOccurrence id="id:3074,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest.testJta" status="SUCCESS" duration="1912" href="/app/rest/latest/testOccurrences/id:3074,build:(id:2039380)"/>
+    <testOccurrence id="id:3076,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest.testJtaTwoCaches" status="SUCCESS" duration="47" href="/app/rest/latest/testOccurrences/id:3076,build:(id:2039380)"/>
+    <testOccurrence id="id:3078,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest.testAsyncOpAwait" status="SUCCESS" duration="102" href="/app/rest/latest/testOccurrences/id:3078,build:(id:2039380)"/>
+    <testOccurrence id="id:3080,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactorySelfTest.testJta" status="SUCCESS" duration="202" href="/app/rest/latest/testOccurrences/id:3080,build:(id:2039380)"/>
+    <testOccurrence id="id:3082,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactorySelfTest.testJtaTwoCaches" status="SUCCESS" duration="16" href="/app/rest/latest/testOccurrences/id:3082,build:(id:2039380)"/>
+    <testOccurrence id="id:3084,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactorySelfTest.testAsyncOpAwait" status="SUCCESS" duration="37" href="/app/rest/latest/testOccurrences/id:3084,build:(id:2039380)"/>
+    <testOccurrence id="id:3086,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaLookupClassNameSelfTest.testJta" status="SUCCESS" duration="237" href="/app/rest/latest/testOccurrences/id:3086,build:(id:2039380)"/>
+    <testOccurrence id="id:3088,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaLookupClassNameSelfTest.testJtaTwoCaches" status="SUCCESS" duration="32" href="/app/rest/latest/testOccurrences/id:3088,build:(id:2039380)"/>
+    <testOccurrence id="id:3090,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaLookupClassNameSelfTest.testAsyncOpAwait" status="SUCCESS" duration="82" href="/app/rest/latest/testOccurrences/id:3090,build:(id:2039380)"/>
+    <testOccurrence id="id:3092,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaLookupClassNameSelfTest.testJta" status="SUCCESS" duration="172" href="/app/rest/latest/testOccurrences/id:3092,build:(id:2039380)"/>
+    <testOccurrence id="id:3094,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaLookupClassNameSelfTest.testJtaTwoCaches" status="SUCCESS" duration="14" href="/app/rest/latest/testOccurrences/id:3094,build:(id:2039380)"/>
+    <testOccurrence id="id:3096,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaLookupClassNameSelfTest.testAsyncOpAwait" status="SUCCESS" duration="42" href="/app/rest/latest/testOccurrences/id:3096,build:(id:2039380)"/>
+    <testOccurrence id="id:3098,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactoryUseSyncSelfTest.testJta" status="SUCCESS" duration="207" href="/app/rest/latest/testOccurrences/id:3098,build:(id:2039380)"/>
+    <testOccurrence id="id:3100,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactoryUseSyncSelfTest.testJtaTwoCaches" status="SUCCESS" duration="36" href="/app/rest/latest/testOccurrences/id:3100,build:(id:2039380)"/>
+    <testOccurrence id="id:3102,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactoryUseSyncSelfTest.testAsyncOpAwait" status="SUCCESS" duration="50" href="/app/rest/latest/testOccurrences/id:3102,build:(id:2039380)"/>
+    <testOccurrence id="id:3104,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactoryUseSyncSelfTest.testJta" status="SUCCESS" duration="179" href="/app/rest/latest/testOccurrences/id:3104,build:(id:2039380)"/>
+    <testOccurrence id="id:3106,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactoryUseSyncSelfTest.testJtaTwoCaches" status="SUCCESS" duration="14" href="/app/rest/latest/testOccurrences/id:3106,build:(id:2039380)"/>
+    <testOccurrence id="id:3108,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactoryUseSyncSelfTest.testAsyncOpAwait" status="SUCCESS" duration="34" href="/app/rest/latest/testOccurrences/id:3108,build:(id:2039380)"/>
+    <testOccurrence id="id:3110,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaLifecycleAwareSelfTest.testGlobalLookupLifecycleAware" status="SUCCESS" duration="11" href="/app/rest/latest/testOccurrences/id:3110,build:(id:2039380)"/>
+    <testOccurrence id="id:3112,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaLifecycleAwareSelfTest.testFactoryLifecycleAware" status="SUCCESS" href="/app/rest/latest/testOccurrences/id:3112,build:(id:2039380)"/>
+    <testOccurrence id="id:3114,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaLifecycleAwareSelfTest.testLifecycleAware" status="SUCCESS" duration="1" href="/app/rest/latest/testOccurrences/id:3114,build:(id:2039380)"/>
+    <testOccurrence id="id:3116,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaLifecycleAwareSelfTest.testCacheLookupLifecycleAware" status="SUCCESS" duration="1" href="/app/rest/latest/testOccurrences/id:3116,build:(id:2039380)"/>
+    <testOccurrence id="id:3118,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridCacheJtaConfigurationValidationSelfTest.testAtomicWithTmLookup" status="SUCCESS" duration="1358" href="/app/rest/latest/testOccurrences/id:3118,build:(id:2039380)"/>
+    <testOccurrence id="id:3120,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridCacheJtaFactoryConfigValidationSelfTest.testNullFactory" status="SUCCESS" duration="98" href="/app/rest/latest/testOccurrences/id:3120,build:(id:2039380)"/>
+    <testOccurrence id="id:3122,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridCacheJtaFactoryConfigValidationSelfTest.testExceptionFactory" status="SUCCESS" duration="78" href="/app/rest/latest/testOccurrences/id:3122,build:(id:2039380)"/>
+    <testOccurrence id="id:3124,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridCacheJtaFactoryConfigValidationSelfTest.testWrongTypeFactory" status="SUCCESS" duration="68" href="/app/rest/latest/testOccurrences/id:3124,build:(id:2039380)"/>
+    <testOccurrence id="id:3126,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaTransactionManagerSelfTest.testJtaTxContextSwitch" status="SUCCESS" duration="1438" href="/app/rest/latest/testOccurrences/id:3126,build:(id:2039380)"/>
+    <testOccurrence id="id:3128,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.GridJtaTransactionManagerSelfTest.testJtaTxContextSwitchWithExistingTx" status="SUCCESS" duration="32" href="/app/rest/latest/testOccurrences/id:3128,build:(id:2039380)"/>
+    <testOccurrence id="id:3130,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.CacheJndiTmFactorySelfTest.testFactory" status="SUCCESS" duration="31" href="/app/rest/latest/testOccurrences/id:3130,build:(id:2039380)"/>
+    <testOccurrence id="id:3132,build:(id:2039380)" name="org.apache.ignite.testsuites.IgniteJtaTestSuite: org.apache.ignite.internal.processors.cache.CacheJndiTmFactorySelfTest.testFactoryException" status="SUCCESS" duration="3" href="/app/rest/latest/testOccurrences/id:3132,build:(id:2039380)"/>
+</testOccurrences>
\ No newline at end of file