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&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&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&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&realAgentName=publicagent12_9095&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&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&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&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&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&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&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&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&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&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