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 <[email protected]> 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); } /**
