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 2019/08/09 17:27:24 UTC

[ignite-teamcity-bot] 01/01: Counters for tracking updates instead of all model implementation started

This is an automated email from the ASF dual-hosted git repository.

dpavlov pushed a commit to branch upd-cntrs
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git

commit c84e3d3cd39553383615114406bdc43e90aa87ae
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Fri Aug 9 20:27:18 2019 +0300

    Counters for tracking updates instead of all model implementation started
---
 .../rest/tracked/GetTrackedBranchTestResults.java  | 17 +++++++--
 .../tcbot/engine/chain/BuildChainProcessor.java    | 26 ++++++++++----
 .../tcbot/engine/chain/SingleBuildRunCtx.java      |  4 +++
 .../tracked/IDetailedStatusForTrackedBranch.java   |  3 ++
 .../tracked/TrackedBranchChainsProcessor.java      | 26 ++++++++++++++
 .../apache/ignite/tcbot/engine/ui/UpdateInfo.java  |  9 ++---
 .../ignite/tcignited/TeamcityIgnitedModule.java    |  2 ++
 .../tcignited/build/UpdateCountersStorage.java     | 40 ++++++++++++++++++++++
 8 files changed, 114 insertions(+), 13 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
index 2b0c2ed..b245630 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/tracked/GetTrackedBranchTestResults.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.web.rest.tracked;
 
 import com.google.inject.Injector;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -45,6 +46,7 @@ import org.apache.ignite.tcbot.engine.ui.GuardBranchStatusUi;
 import org.apache.ignite.tcbot.engine.ui.UpdateInfo;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.build.UpdateCountersStorage;
 import org.apache.ignite.tcservice.model.mute.MuteInfo;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -78,9 +80,18 @@ public class GetTrackedBranchTestResults {
         @Nullable @QueryParam("showTestLongerThan") Integer showTestLongerThan,
         @Nullable @QueryParam("muted") Boolean showMuted,
         @Nullable @QueryParam("ignored") Boolean showIgnored) {
-        return new UpdateInfo().copyFrom(
-            getTestFailsResultsNoSync(branchOrNull, checkAllLogs, trustedTests, tagSelected, tagForHistSelected,
-                displayMode, sortOption, mergeCnt, showTestLongerThan, showMuted, showIgnored));
+
+        ITcBotUserCreds creds = ITcBotUserCreds.get(req);
+
+        Injector injector = CtxListener.getInjector(ctx);
+
+        IDetailedStatusForTrackedBranch instance = injector.getInstance(IDetailedStatusForTrackedBranch.class);
+
+        UpdateInfo info = new UpdateInfo();
+
+        Map<Integer, Integer> cnts = instance.getTrackedBranchUpdateCounters(branchOrNull, creds);
+        info.hashCodeHex = UpdateCountersStorage.getCountersHash(cnts);
+        return info;
     }
 
     @GET
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
index dca9293..bf55a4a 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/BuildChainProcessor.java
@@ -51,7 +51,9 @@ import org.apache.ignite.tcbot.engine.ui.LrTestsSuiteSummaryUi;
 import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.build.UpdateCountersStorage;
 import org.apache.ignite.tcignited.buildlog.IBuildLogProcessor;
+import org.apache.ignite.tcignited.buildlog.ILogCheckResult;
 import org.apache.ignite.tcignited.buildref.BranchEquivalence;
 import org.apache.ignite.tcignited.history.IRunHistory;
 import org.apache.ignite.tcservice.model.hist.BuildRef;
@@ -72,6 +74,12 @@ public class BuildChainProcessor {
     /** Compactor. */
     @Inject private IStringCompactor compactor;
 
+    /** Build logs processor. */
+    @Inject private IBuildLogProcessor buildLogProcessor;
+
+    @Inject private UpdateCountersStorage counters;
+
+
     /**
      * Collects data about all long-running tests (run time more than one minute) across all suites in RunAll chain in
      * master branch.
@@ -436,8 +444,6 @@ public class BuildChainProcessor {
         }
     }
 
-    @Inject IBuildLogProcessor buildLogProcessor;
-
     @SuppressWarnings("WeakerAccess")
     @AutoProfiling
     protected void analyzeTests(MultBuildRunCtx outCtx, ITeamcityIgnited teamcity,
@@ -448,10 +454,18 @@ public class BuildChainProcessor {
                     || procLog == ProcessLogsMode.ALL)
                 ctx.setLogCheckResFut(
                         CompletableFuture.supplyAsync(
-                                () -> buildLogProcessor.analyzeBuildLog(teamcity,
-                                        ctx.buildId(),
-                                    incompleteFailure),
-                                tcUpdatePool.getService()));
+                            () -> {
+                                ILogCheckResult res = buildLogProcessor.analyzeBuildLog(teamcity,
+                                    ctx.buildId(),
+                                    incompleteFailure);
+                                int branchName = ctx.branchName();
+
+                                //build log result is ready for branch.
+                                counters.increment(branchName);
+
+                                return res;
+                            },
+                            tcUpdatePool.getService()));
         }
     }
 
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java
index 77ddf63..6f3b766 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/chain/SingleBuildRunCtx.java
@@ -348,4 +348,8 @@ public class SingleBuildRunCtx implements ISuiteResults {
     public void addTags(Set<String> strings) {
         this.tags.addAll(strings);
     }
+
+    public int branchName() {
+        return buildCompacted.branchName();
+    }
 }
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
index 684aa23..13baae2 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/IDetailedStatusForTrackedBranch.java
@@ -16,6 +16,7 @@
  */
 package org.apache.ignite.tcbot.engine.tracked;
 
+import java.util.Map;
 import javax.annotation.Nullable;
 import org.apache.ignite.tcbot.engine.chain.SortOption;
 import org.apache.ignite.tcbot.engine.ui.DsSummaryUi;
@@ -63,5 +64,7 @@ public interface IDetailedStatusForTrackedBranch {
      */
     public GuardBranchStatusUi getBranchSummary(String name, ICredentialsProv prov);
 
+    public Map<Integer, Integer> getTrackedBranchUpdateCounters(@Nullable String branch, ICredentialsProv creds);
+
     //  * @param baseTrackedBranch Branch tracked branch in Bot, has a priority if both TC & Bot branches (baseBranchForTcParm) present.
 }
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
index 6decee6..d2663fd 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/tracked/TrackedBranchChainsProcessor.java
@@ -21,8 +21,10 @@ import java.time.Duration;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
@@ -49,6 +51,8 @@ import org.apache.ignite.tcbot.persistence.IStringCompactor;
 import org.apache.ignite.tcignited.ITeamcityIgnited;
 import org.apache.ignite.tcignited.ITeamcityIgnitedProvider;
 import org.apache.ignite.tcignited.SyncMode;
+import org.apache.ignite.tcignited.build.UpdateCountersStorage;
+import org.apache.ignite.tcignited.buildref.BranchEquivalence;
 import org.apache.ignite.tcignited.creds.ICredentialsProv;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
@@ -69,6 +73,8 @@ public class TrackedBranchChainsProcessor implements IDetailedStatusForTrackedBr
     /** Compactor. */
     @Inject private IStringCompactor compactor;
 
+    @Inject private UpdateCountersStorage countersStorage;
+
     /** {@inheritDoc} */
     @AutoProfiling
     @Nonnull
@@ -242,6 +248,26 @@ public class TrackedBranchChainsProcessor implements IDetailedStatusForTrackedBr
         return statusUi;
     }
 
+    @Override public Map<Integer, Integer> getTrackedBranchUpdateCounters(@Nullable String branch,
+        @Nonnull ICredentialsProv creds) {
+
+        final String branchNn = isNullOrEmpty(branch) ? ITcServerConfig.DEFAULT_TRACKED_BRANCH_NAME : branch;
+        final ITrackedBranch tracked = tcBotCfg.getTrackedBranches().getBranchMandatory(branchNn);
+
+        Set<Integer> allBranches = new HashSet<>();
+        tracked.chainsStream()
+            .filter(chainTracked -> tcIgnitedProv.hasAccess(chainTracked.serverCode(), creds))
+            .forEach(chainTracked -> {
+                String tcBranch = chainTracked.tcBranch();
+
+                Set<Integer> allBranchIds = new BranchEquivalence().branchIdsForQuery(tcBranch, compactor);
+
+                allBranches.addAll(allBranchIds);
+            });
+
+        return countersStorage.getCounters(allBranches);
+    }
+
     /**
      * Collects data about all long-running tests (run time more than one minute) within one transfer object.
      *
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/UpdateInfo.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/UpdateInfo.java
index 6e31a09..5c617b9 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/UpdateInfo.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/ui/UpdateInfo.java
@@ -36,7 +36,8 @@ import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
     /** Flags to use in javascript. */
     public Integer javaFlags = 0;
 
-    /** Running updates is in progress, summary is ready, but it is subject to change */
+    /** Running updates is in progress, not used since it should be updated using counters */
+    @Deprecated
     public int runningUpdates = 0;
 
     /** Hash code hexadecimal, protects from redraw and minimizing mode info in case data not changed */
@@ -51,14 +52,14 @@ import org.apache.ignite.tcbot.common.conf.IJiraServerConfig;
     }
 
     /**
-     * @param gitHubConfig
+     * @param gitHubCfg
      * @param jiraCfg
      */
-    public void setJavaFlags(IGitHubConfig gitHubConfig, IJiraServerConfig jiraCfg) {
+    public void setJavaFlags(IGitHubConfig gitHubCfg, IJiraServerConfig jiraCfg) {
         //since user has logged in, TC flag should be set
         javaFlags |= TEAMCITY_FLAG;
 
-        if (gitHubConfig.isGitTokenAvailable())
+        if (gitHubCfg.isGitTokenAvailable())
             javaFlags |= GITHUB_FLAG;
 
         if (jiraCfg.isJiraTokenAvailable())
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TeamcityIgnitedModule.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TeamcityIgnitedModule.java
index 0f39f7a..273c00f 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TeamcityIgnitedModule.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/TeamcityIgnitedModule.java
@@ -19,6 +19,7 @@ package org.apache.ignite.tcignited;
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
 import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
+import org.apache.ignite.tcignited.build.UpdateCountersStorage;
 import org.apache.ignite.tcignited.buildlog.BuildLogCheckResultDao;
 import org.apache.ignite.tcignited.buildlog.ILogProductSpecific;
 import org.apache.ignite.tcignited.buildlog.LogIgniteSpecific;
@@ -70,6 +71,7 @@ public class TeamcityIgnitedModule extends AbstractModule {
         bind(SuiteInvocationHistoryDao.class).in(new SingletonScope());
         bind(HistoryCollector.class).in(new SingletonScope());
         bind(ILogProductSpecific.class).to(LogIgniteSpecific.class).in(new SingletonScope());
+        bind(UpdateCountersStorage.class).in(new SingletonScope());
 
         TcRealConnectionModule module = new TcRealConnectionModule();
         if (conn != null)
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/UpdateCountersStorage.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/UpdateCountersStorage.java
new file mode 100644
index 0000000..e8bd9a0
--- /dev/null
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/UpdateCountersStorage.java
@@ -0,0 +1,40 @@
+package org.apache.ignite.tcignited.build;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.ignite.internal.util.typedef.internal.U;
+
+public class UpdateCountersStorage {
+    /** Counters: Map from Branch name compactor ID to its correspondent update counter value. */
+    private ConcurrentMap<Integer, AtomicInteger> counters = new ConcurrentHashMap<>();
+
+    public Map<Integer, Integer> getCounters(Collection<Integer> branchNames) {
+        Map<Integer, Integer> res = new TreeMap<>();
+
+        for (Integer name : branchNames) {
+            if (name == null)
+                continue;
+
+            res.put(name, getIntegerForEntry(name).get());
+        }
+
+        return res;
+    }
+
+    public static String getCountersHash(Map<Integer, Integer> counters) {
+       return Integer.toHexString(U.safeAbs(counters.hashCode()));
+    }
+
+    public AtomicInteger getIntegerForEntry(int name) {
+        return counters.computeIfAbsent(name, (k_) -> new AtomicInteger());
+    }
+
+    public void increment(int branchName) {
+        getIntegerForEntry(branchName).incrementAndGet();
+    }
+}