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));