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 f01a2b6  IGNITE-10562 Change logic of build diverged handling: TC Bot 
DB contains invalid values for build references ID maps to value with other ID.
f01a2b6 is described below

commit f01a2b6e38f277a564b2d7d3d2e1b63b5a397c09
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Thu Dec 6 20:57:26 2018 +0300

    IGNITE-10562 Change logic of build diverged handling: TC Bot DB contains 
invalid values for build references ID maps to value with other ID.
---
 .../ci/teamcity/ignited/BuildRefCompacted.java     | 12 ++-
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   | 26 +++++--
 .../ignited/fatbuild/FatBuildCompacted.java        | 12 ++-
 .../ci/teamcity/ignited/fatbuild/FatBuildDao.java  | 15 ++--
 .../ignited/fatbuild/ProactiveFatBuildSync.java    | 87 ++++++++++++++++------
 .../ignited/IgnitedTcInMemoryIntegrationTest.java  |  4 +-
 6 files changed, 116 insertions(+), 40 deletions(-)

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 ada9317..599a4cb 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
@@ -66,7 +66,7 @@ public class BuildRefCompacted {
         state = compactor.getStringId(ref.state());
     }
 
-    public void setId(Integer buildId) {
+    public void setId(@Nullable Integer buildId) {
         this.id = buildId == null ? -1 : buildId;
     }
 
@@ -158,11 +158,21 @@ public class BuildRefCompacted {
     }
 
     /** */
+    protected void status(int status) {
+        this.status = status;
+    }
+
+    /** */
     public int state() {
         return state;
     }
 
     /** */
+    public void state(int state) {
+        this.state = state;
+    }
+
+    /** */
     public boolean isFakeStub() {
         return id() < 0;
     }
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 0a2ed37..f3125cb 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
@@ -382,11 +382,14 @@ public class TeamcityIgnitedImpl implements 
ITeamcityIgnited {
             return Collections.singletonList(branchName);
     }
 
+    /**
+     * Enables scheduleing for build refs/builds/history sync
+     */
     public void ensureActualizeRequested() {
-        scheduler.sheduleNamed(taskName("actualizeRecentBuildRefs"), 
this::actualizeRecentBuildRefs, 2, TimeUnit.MINUTES);
+        scheduler.sheduleNamed(taskName("actualizeRecentBuildRefs"), () -> 
actualizeRecentBuildRefs(srvNme), 2, TimeUnit.MINUTES);
 
         // schedule find missing later
-        buildSync.invokeLaterFindMissingByBuildRef(srvNme, conn);
+        buildSync.ensureActualizationRequested(srvNme, conn);
 
         runHistSync.invokeLaterFindMissingHistory(srvNme);
     }
@@ -485,11 +488,16 @@ public class TeamcityIgnitedImpl implements 
ITeamcityIgnited {
         return changes.values();
     }
 
+    String actualizeRecentBuildRefs() {
+        return actualizeRecentBuildRefs(srvNme);
+    }
 
     /**
      *
+     * @param srvNme TC service name
      */
-    void actualizeRecentBuildRefs() {
+    @MonitoredTask(name = "Prepare Actualize BuildRefs(srv, full resync)", 
nameExtArgsIndexes = {0})
+    String actualizeRecentBuildRefs(String srvNme) {
         List<BuildRefCompacted> running = 
buildRefDao.getQueuedAndRunning(srvIdMaskHigh);
 
         Set<Integer> paginateUntil = new HashSet<>();
@@ -498,18 +506,22 @@ public class TeamcityIgnitedImpl implements 
ITeamcityIgnited {
         List<Integer> runningIds = 
running.stream().map(BuildRefCompacted::id).collect(Collectors.toList());
         OptionalInt max = runningIds.stream().mapToInt(i -> i).max();
         if (max.isPresent()) {
-            runningIds.forEach(id->{
-                if(id > (max.getAsInt() - 
MAX_ID_DIFF_TO_ENFORCE_CONTINUE_SCAN))
+            runningIds.forEach(id -> {
+                if (id > (max.getAsInt() - 
MAX_ID_DIFF_TO_ENFORCE_CONTINUE_SCAN))
                     paginateUntil.add(id);
                 else
                     directUpload.add(id);
             });
         }
+
+        int cntFreshBuilds = paginateUntil.size();
+
         //schedule direct reload for Fat Builds for all queued too-old builds
         buildSync.scheduleBuildsLoad(conn, directUpload);
 
         runActualizeBuildRefs(srvNme, false, paginateUntil);
 
+        int freshButNotFoundByBuildsRefsScan = paginateUntil.size();
         if (!paginateUntil.isEmpty()) {
             //some builds may stuck in the queued or running, enforce loading 
now
             buildSync.doLoadBuilds(-1, srvNme, conn, paginateUntil);
@@ -517,6 +529,10 @@ public class TeamcityIgnitedImpl implements 
ITeamcityIgnited {
 
         // schedule full resync later
         scheduler.invokeLater(this::sheduleResyncBuildRefs, 15, 
TimeUnit.MINUTES);
+
+        return "Build queue " + running.size() + ", relatively fresh: " + 
cntFreshBuilds +
+             ", fresh but not found by scan: " + 
freshButNotFoundByBuildsRefsScan +
+            ", old builds sheduled " + directUpload.size();
     }
 
     /**
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 3f4ff2b..31cba27 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
@@ -506,7 +506,15 @@ public class FatBuildCompacted extends BuildRefCompacted 
implements IVersionedEn
         return invocation;
     }
 
-    public void setVersion(short version) {
-        this._ver = version;
+    public void setVersion(short ver) {
+        this._ver = ver;
     }
+
+    public FatBuildCompacted setCancelled(IStringCompactor compactor) {
+        status(compactor.getStringId(BuildRef.STATUS_UNKNOWN));
+        state(compactor.getStringId(BuildRef.STATE_FINISHED));
+
+        return this;
+    }
+
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
index 38f6502..6a3381d 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/FatBuildDao.java
@@ -24,7 +24,10 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 import javax.annotation.Nullable;
+import javax.cache.Cache;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.validation.constraints.NotNull;
@@ -119,12 +122,6 @@ public class FatBuildDao {
         buildsCache.put(buildIdToCacheKey(srvIdMaskHigh, buildId), newBuild);
     }
 
-
-    @AutoProfiling
-    public boolean removeFatBuild(int srvIdMaskHigh, int buildId) {
-       return  buildsCache.remove(buildIdToCacheKey(srvIdMaskHigh, buildId));
-    }
-
     public static int[] extractChangeIds(@NotNull ChangesList changesList) {
         return changesList.changes().stream().mapToInt(
                         ch -> {
@@ -183,4 +180,10 @@ public class FatBuildDao {
     public boolean containsKey(int srvIdMaskHigh, int buildId) {
         return buildsCache.containsKey(buildIdToCacheKey(srvIdMaskHigh, 
buildId));
     }
+
+    public Stream<Cache.Entry<Long, FatBuildCompacted>> 
outdatedVersionEntries(int srvId) {
+        return StreamSupport.stream(buildsCache.spliterator(), false)
+            .filter(entry -> entry.getValue().isOutdatedEntityVersion())
+            .filter(entry -> isKeyForServer(entry.getKey(), srvId));
+    }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 8571eb3..5565c58 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -16,7 +16,6 @@
  */
 package org.apache.ignite.ci.teamcity.ignited.fatbuild;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
 import java.util.stream.Stream;
@@ -242,9 +241,40 @@ public class ProactiveFatBuildSync {
      * @param srvName Server name.
      * @param conn Connection.
      */
-    public void invokeLaterFindMissingByBuildRef(String srvName, ITeamcityConn 
conn) {
+    public void ensureActualizationRequested(String srvName, ITeamcityConn 
conn) {
         scheduler.sheduleNamed(taskName("findMissingBuildsFromBuildRef", 
srvName),
-                () -> findMissingBuildsFromBuildRef(srvName, conn), 360, 
TimeUnit.MINUTES);
+            () -> findMissingBuildsFromBuildRef(srvName, conn), 360, 
TimeUnit.MINUTES);
+
+        /*
+        scheduler.sheduleNamed(taskName("migrateBuildsToV6", srvName),
+            () -> migrateBuildsToV6(srvName, conn), 8, TimeUnit.HOURS);
+             */
+    }
+
+    /**
+     * @param srvName Server name.
+     * @param conn Connection.
+     */
+    @MonitoredTask(name = "Migrate Builds to V6", nameExtArgsIndexes = {0})
+    public String migrateBuildsToV6(String srvName, ITeamcityConn conn) {
+        int srvId = ITeamcityIgnited.serverIdToInt(srvName);
+
+        AtomicInteger cnt = new AtomicInteger();
+        AtomicInteger divergedIds = new AtomicInteger();
+        fatBuildDao.outdatedVersionEntries(srvId).forEach(entry -> {
+            cnt.incrementAndGet();
+            int buildId = BuildRefDao.cacheKeyToBuildId(entry.getKey());
+            FatBuildCompacted transformed = transformV5Build(
+                srvId,
+                buildId,
+                entry.getValue());
+
+            if (transformed != null)
+                divergedIds.incrementAndGet();
+        });
+
+        return "Found: " + cnt.get() + " builds found having version < 6 and "
+            + divergedIds.get() + " with ID divergence.";
     }
 
     /**
@@ -304,23 +334,8 @@ public class ProactiveFatBuildSync {
         final int srvIdMask = ITeamcityIgnited.serverIdToInt(srvName);
 
         if (existingBuild != null && existingBuild.isOutdatedEntityVersion()) {
-            int ver = existingBuild.version();
-            if (ver == 
FatBuildCompacted.VER_FULL_DATA_BUT_ID_CONFLICTS_POSSIBLE) {
-                if (Objects.equals(buildId, existingBuild.id())) {
-                    existingBuild.setVersion(FatBuildCompacted.LATEST_VERSION);
-
-                    fatBuildDao.putFatBuild(srvIdMask, buildId, existingBuild);
-
-                    return null;
-                }
-                else {
-                    logger.warn("Build inconsistency found in the DB, removing 
build " + existingBuild.getId());
-
-                    existingBuild = null;
-
-                    fatBuildDao.removeFatBuild(srvIdMask, buildId);
-                }
-            }
+            if (existingBuild.version() == 
FatBuildCompacted.VER_FULL_DATA_BUT_ID_CONFLICTS_POSSIBLE)
+                return transformV5Build(srvIdMask, buildId, existingBuild);
         }
 
         Build build;
@@ -333,9 +348,11 @@ public class ProactiveFatBuildSync {
 
             if (build.isFakeStub())
                 build.setCancelled(); // probably now it will not happen 
because of direct connection to TC.
-            else
-                Preconditions.checkState(Objects.equals(build.getId(), 
buildId),
-                    "Build IDs are not consistent: returned " + build.getId() 
+ " queued is " + buildId);
+            else {
+                if(!Objects.equals(build.getId(), buildId))
+                    throw new FileNotFoundException(
+                        "Build IDs are not consistent: returned " + 
build.getId() + " queued is " + buildId);
+            }
 
             if (build.testOccurrences != null && !build.isComposite()) { // 
don't query tests for compoite
                 String nextHref = null;
@@ -381,7 +398,7 @@ public class ProactiveFatBuildSync {
 
                     problems = existingBuild.problems(compactor);
 
-                    //todo extract new parameters or save fat build without XML
+                    //todo extract new parameters or save fat build without 
XML convertions
                     // - existingBuild.statistics();
                     // - int[] changes = existingBuild.changes();
                 }
@@ -403,4 +420,26 @@ public class ProactiveFatBuildSync {
         // new save will be performed with new entity version for compacted 
build
         return fatBuildDao.saveBuild(srvIdMask, buildId, build, tests, 
problems, statistics, changesList, existingBuild);
     }
+
+    @Nullable
+    public FatBuildCompacted transformV5Build(int srvIdMask, int buildId, 
@NotNull FatBuildCompacted existingBuild) {
+        if (Objects.equals(buildId, existingBuild.id())) {
+            existingBuild.setVersion(FatBuildCompacted.LATEST_VERSION);
+
+            fatBuildDao.putFatBuild(srvIdMask, buildId, existingBuild);
+
+            return null;
+        }
+        else {
+            logger.warn("Build inconsistency found in the DB, removing build " 
+ existingBuild.getId());
+
+            FatBuildCompacted buildCompacted = new FatBuildCompacted()
+                .setFakeStub(true)
+                .setCancelled(compactor);
+
+            fatBuildDao.putFatBuild(srvIdMask, buildId, buildCompacted);
+
+            return buildCompacted;
+        }
+    }
 }
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 923ba18..27d8a11 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
@@ -603,7 +603,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         System.out.println("Running builds (before sync): " + printRefs(c, 
running));
 
         ProactiveFatBuildSync buildSync = 
injector.getInstance(ProactiveFatBuildSync.class);
-        buildSync.invokeLaterFindMissingByBuildRef(srvId, srvConn);
+        buildSync.ensureActualizationRequested(srvId, srvConn);
 
         FatBuildCompacted fatBuild = fatBuildDao.getFatBuild(srvIdInt, 
buildIdQ);
         System.out.println(fatBuild);
@@ -627,7 +627,7 @@ public class IgnitedTcInMemoryIntegrationTest {
         putOldFashionFakeBuild(c, fatBuildDao, buildIdQ, srvIdInt);
         putOldFashionFakeBuild(c, fatBuildDao, buildIdR, srvIdInt);
 
-        buildSync.invokeLaterFindMissingByBuildRef(srvId, srvConn);
+        buildSync.ensureActualizationRequested(srvId, srvConn);
 
         List<BuildRefCompacted> running4 = 
buildRefDao.getQueuedAndRunning(srvIdInt);
         System.out.println("Running builds (before with fake builds): " + 
printRefs(c, running4));

Reply via email to