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);
     }
 
     /**