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/26 17:38:05 UTC
[ignite-teamcity-bot] 01/02: Handling of 404 errors from TC,
storing build ref in up-to-date manner with main build
This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch ignite-9848-load-all-builds
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
commit 5442d4dedfde1983d1e881e3a8facd3c2c442f37
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri Oct 26 20:17:55 2018 +0300
Handling of 404 errors from TC, storing build ref in up-to-date manner with main build
---
.../apache/ignite/ci/IgnitePersistentTeamcity.java | 1 -
.../apache/ignite/ci/tcmodel/hist/BuildRef.java | 6 +++
.../ci/teamcity/ignited/BuildRefCompacted.java | 17 +++++++
.../ignite/ci/teamcity/ignited/BuildRefDao.java | 18 ++++++-
.../ignite/ci/teamcity/ignited/FatBuildDao.java | 3 +-
.../ci/teamcity/ignited/TeamcityIgnitedImpl.java | 58 ++++++++++++++++++----
.../ci/teamcity/ignited/TeamcityIgnitedModule.java | 1 +
.../ignited/fatbuild/FatBuildCompacted.java | 8 +++
8 files changed, 98 insertions(+), 14 deletions(-)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
index ac8aa98..3487566 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/IgnitePersistentTeamcity.java
@@ -1222,7 +1222,6 @@ public class IgnitePersistentTeamcity implements IAnalyticsEnabledTeamcity, ITea
return teamcity.sendJiraComment(ticket, comment);
}
-
/** {@inheritDoc} */
@Override public void setJiraApiUrl(String url) {
teamcity.setJiraApiUrl(url);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java
index 4ce62f7..0ac3293 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcmodel/hist/BuildRef.java
@@ -73,6 +73,12 @@ public class BuildRef extends AbstractRef {
return STATUS_UNKNOWN.equals(status);
}
+ public void setCancelled() {
+ status = STATUS_UNKNOWN;
+ state = STATE_FINISHED;
+ }
+
+
public boolean isSuccess() {
return STATUS_SUCCESS.equals(status);
}
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 a68523a..589b13b 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
@@ -59,6 +59,18 @@ public class BuildRefCompacted {
}
/**
+ * @param refCompacted Reference compacted.
+ */
+ public BuildRefCompacted(BuildRefCompacted refCompacted) {
+ id = refCompacted.id();
+ buildTypeId = refCompacted.buildTypeId();
+ branchName = refCompacted.branchName();
+ status = refCompacted.status();
+ state = refCompacted.state();
+ }
+
+
+ /**
* @param compactor Compacter.
*/
public BuildRef toBuildRef(IStringCompactor compactor) {
@@ -117,6 +129,11 @@ public class BuildRefCompacted {
}
/** */
+ private int status() {
+ return status;
+ }
+
+ /** */
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 4980cc9..f6f7c44 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
@@ -19,7 +19,6 @@ package org.apache.ignite.ci.teamcity.ignited;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -202,4 +201,21 @@ public class BuildRefDao {
return list;
}
+
+ /**
+ * @param srvId Server id.
+ * @param refCompacted Reference compacted.
+ */
+ public boolean save(int srvId, BuildRefCompacted refCompacted) {
+ long cacheKey = buildIdToCacheKey(srvId, refCompacted.id());
+ BuildRefCompacted buildPersisted = buildRefsCache.get(cacheKey);
+
+ if (buildPersisted == null || !buildPersisted.equals(refCompacted)) {
+ buildRefsCache.put(cacheKey, refCompacted);
+
+ return true;
+ }
+
+ return false;
+ }
}
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
index 01ad032..43a1573 100644
--- 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
@@ -61,7 +61,7 @@ public class FatBuildDao {
* @param build Build data.
* @param tests TestOccurrences one or several pages.
* @param existingBuild existing version of build in the DB.
- * @return Fat Build saved (if modifications detected)
+ * @return Fat Build saved (if modifications detected), otherwise null.
*/
public FatBuildCompacted saveBuild(long srvIdMaskHigh,
Build build,
@@ -75,6 +75,7 @@ public class FatBuildDao {
if (existingBuild == null || !existingBuild.equals(newBuild)) {
buildsCache.put(buildIdToCacheKey(srvIdMaskHigh, build.getId()), newBuild);
+
return newBuild;
}
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 0a42012..840178e 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
@@ -18,6 +18,9 @@ package org.apache.ignite.ci.teamcity.ignited;
import com.google.common.base.Strings;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Sets;
+import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -33,7 +36,6 @@ import java.util.stream.Collectors;
import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy;
import javax.inject.Inject;
-import com.google.common.collect.Sets;
import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.di.AutoProfiling;
import org.apache.ignite.ci.di.MonitoredTask;
@@ -46,6 +48,7 @@ import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.TestCompacted;
import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
+import org.apache.ignite.ci.util.ExceptionUtil;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -75,6 +78,8 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
/** Build DAO. */
@Inject private FatBuildDao fatBuildDao;
+ @Inject private IStringCompactor compactor;
+
/** Server ID mask for cache Entries. */
private int srvIdMaskHigh;
@@ -155,6 +160,10 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
FatBuildCompacted savedVer = reloadBuild(buildId, existingBuild);
+ //build was modified, probably we need also to update reference accordindly
+ if (savedVer != null)
+ buildRefDao.save(srvIdMaskHigh, new BuildRefCompacted(savedVer));
+
return savedVer == null ? existingBuild : savedVer;
}
@@ -163,22 +172,49 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
* @param existingBuild
* @return new build if it was updated or null if no updates detected
*/
- public FatBuildCompacted reloadBuild(int buildId, FatBuildCompacted existingBuild) {
+ public FatBuildCompacted reloadBuild(int buildId, @Nullable FatBuildCompacted existingBuild) {
// System.err.println(Thread.currentThread().getName()+ ": Build " + buildId);
//todo some sort of locking to avoid double requests
- Build build = conn.getBuild(buildId);
-
+ Build build;
List<TestOccurrencesFull> tests = new ArrayList<>();
- String nextHref = null;
- do {
- boolean testDtls = !build.isComposite(); // don't query test details for compoite
- TestOccurrencesFull page = conn.getTestsPage(buildId, nextHref, testDtls);
- nextHref = page.nextHref();
+ try {
+ build = conn.getBuild(buildId);
+
+ String nextHref = null;
+ do {
+ boolean testDtls = !build.isComposite(); // don't query test details for compoite
+ TestOccurrencesFull page = conn.getTestsPage(buildId, nextHref, testDtls);
+ nextHref = page.nextHref();
- tests.add(page);
+ tests.add(page);
+ }
+ while (!Strings.isNullOrEmpty(nextHref));
+ }
+ catch (Exception e) {
+ if (Throwables.getRootCause(e) instanceof FileNotFoundException) {
+ logger.info("Loading build [" + buildId + "] for server [" + srvId + "] failed:" + e.getMessage(), e);
+
+ if (existingBuild != null) {
+ build = existingBuild.toBuild(compactor);
+
+ if(build.isRunning() || build.isQueued())
+ build.setCancelled();
+
+ tests = Collections.singletonList(existingBuild.getTestOcurrences(compactor));
+ }
+ else
+ build = Build.createFakeStub();
+ } else {
+ logger.error("Loading build [" + buildId + "] for server [" + srvId + "] failed:" + e.getMessage(), e);
+
+ e.printStackTrace();
+
+ throw ExceptionUtil.propagateException(e);
+ }
}
- while (!Strings.isNullOrEmpty(nextHref));
+ //if we are here because of some sort of outdated version of build,
+ // new save will be performed with new entity version for compacted build
return fatBuildDao.saveBuild(srvIdMaskHigh, build, tests, existingBuild);
}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
index 16ad2cc..6ef440b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
@@ -35,6 +35,7 @@ public class TeamcityIgnitedModule extends AbstractModule {
bind(ITeamcityIgnitedProvider.class).to(TcIgnitedCachingProvider.class).in(new SingletonScope());
bind(BuildRefDao.class).in(new SingletonScope());
bind(BuildConditionDao.class).in(new SingletonScope());
+ bind(FatBuildDao.class).in(new SingletonScope());
bind(IStringCompactor.class).to(IgniteStringCompactor.class).in(new SingletonScope());
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
index 4a101a3..59701f2 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildCompacted.java
@@ -47,6 +47,9 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
/** Composite flag offset. */
public static final int COMPOSITE_F = 2;
+ /** flag offset. */
+ public static final int FAKE_BUILD_F = 4;
+
/** Entity fields version. */
private short _ver = LATEST_VERSION;
@@ -59,7 +62,9 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
/** Finish date. The number of milliseconds since January 1, 1970, 00:00:00 GMT */
private long queuedDate;
+ /** Project ID, where suite is located. */
private int projectId = -1;
+
/** Suite Name for this builds. */
private int name = -1;
@@ -110,6 +115,9 @@ public class FatBuildCompacted extends BuildRefCompacted implements IVersionedEn
setFlag(DEF_BR_F, build.defaultBranch);
setFlag(COMPOSITE_F, build.composite);
+
+ if(build.isFakeStub())
+ setFlag(FAKE_BUILD_F, true);
}
/**