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/09 15:33:54 UTC

[ignite-teamcity-bot] branch ignite-9800-2 updated: IGNITE-9800: Build history optimized from naive to faster implementation

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

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


The following commit(s) were added to refs/heads/ignite-9800-2 by this push:
     new 18688d1  IGNITE-9800: Build history optimized from naive to faster implementation
18688d1 is described below

commit 18688d191153d90d504d9f9308203a196fb3a970
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Tue Oct 9 18:33:52 2018 +0300

    IGNITE-9800: Build history optimized from naive to faster implementation
---
 .../tcbot/visa/TcBotTriggerAndSignOffService.java  | 14 ++++----
 .../ignite/ci/teamcity/ignited/BuildRefDao.java    | 41 +++++++++++++++++++---
 .../ci/teamcity/ignited/IStringCompactor.java      |  3 ++
 .../ci/teamcity/ignited/IgniteStringCompactor.java | 16 +++++++++
 .../ci/teamcity/ignited/TeamcityIgnitedImpl.java   | 13 +------
 .../ignite/ci/web/rest/visa/TcBotVisaService.java  |  8 ++---
 .../src/main/webapp/css/style-1.5.css              |  4 +++
 ignite-tc-helper-web/src/main/webapp/prs.html      | 30 +++++++++++-----
 8 files changed, 94 insertions(+), 35 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
index 70a5096..2f5745d 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/visa/TcBotTriggerAndSignOffService.java
@@ -205,19 +205,21 @@ public class TcBotTriggerAndSignOffService {
         }).collect(Collectors.toList());
     }
 
-    public List<BuildRef> buildsForContribution(String srvId, ICredentialsProv prov,
-        String suiteId, String prId) {
-
+    @Nullable public String findBranchForPr(String srvId, ICredentialsProv prov, String suiteId, String prId) {
         ITeamcityIgnited srv = teamcityIgnitedProvider.server(srvId, prov);
 
-        List<BuildRef> buildHist = srv.getBuildHistory(suiteId, branchForTcA(prId));
+        String branchName = branchForTcA(prId);
+        List<BuildRef> buildHist = srv.getBuildHistory(suiteId, branchName);
 
         if (!buildHist.isEmpty())
-            return buildHist;
+            return buildHist.get(0).branchName();
 
         buildHist = srv.getBuildHistory(suiteId, branchForTcB(prId));
 
-        return buildHist;
+        if (!buildHist.isEmpty())
+            return buildHist.get(0).branchName();
+
+        return null;
     }
 
     String branchForTcA(String prId) {
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 ac109e1..cfcd3bd 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
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.ci.teamcity.ignited;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -25,12 +26,14 @@ import java.util.TreeMap;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.jetbrains.annotations.NotNull;
 
 public class BuildRefDao {
     /** Cache name*/
@@ -42,18 +45,18 @@ public class BuildRefDao {
     /** Builds cache. */
     private IgniteCache<Long, BuildRefCompacted> buildsCache;
 
-    @Inject private IStringCompactor compacter;
+    /** Compactor. */
+    @Inject private IStringCompactor compactor;
 
     public void init () {
         Ignite ignite = igniteProvider.get();
         buildsCache = ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(TEAMCITY_BUILD_CACHE_NAME));
     }
 
-    public Stream<BuildRef> getAllBuilds(long srvIdMaskHigh) {
+    @NotNull protected Stream<BuildRefCompacted> compactedBuildsForServer(long srvIdMaskHigh) {
         return StreamSupport.stream(buildsCache.spliterator(), false)
             .filter(entry -> entry.getKey() >> 32 == srvIdMaskHigh)
-            .map(javax.cache.Cache.Entry::getValue)
-            .map(compacted -> compacted.toBuildRef(compacter));
+            .map(javax.cache.Cache.Entry::getValue);
     }
 
     public int saveChunk(long srvIdMaskHigh, List<BuildRef> ghData) {
@@ -66,7 +69,7 @@ public class BuildRefDao {
         Map<Long, BuildRefCompacted> entriesToPut = new TreeMap<>();
 
         List<BuildRefCompacted> collect = ghData.stream()
-            .map(ref -> new BuildRefCompacted(compacter, ref))
+            .map(ref -> new BuildRefCompacted(compactor, ref))
             .collect(Collectors.toList());
 
         for (BuildRefCompacted next : collect) {
@@ -83,7 +86,35 @@ public class BuildRefDao {
         return size;
     }
 
+    /**
+     * @param srvIdMaskHigh Server id mask high.
+     * @param buildId Build id.
+     */
     private long buildIdToCacheKey(long srvIdMaskHigh, int buildId) {
         return (long)buildId | srvIdMaskHigh << 32;
     }
+
+    /**
+     * @param srvIdMaskHigh Server id mask high.
+     * @param buildTypeId Build type id.
+     * @param bracnhNameQry Bracnh name query.
+     */
+    @NotNull public List<BuildRef> findBuildsInHistory(long srvIdMaskHigh,
+        @Nullable String buildTypeId,
+        String bracnhNameQry) {
+
+        Integer buildTypeIdId = compactor.getStringIdIfPresent(buildTypeId);
+        if (buildTypeIdId == null)
+            return Collections.emptyList();
+
+        Integer bracnhNameQryId = compactor.getStringIdIfPresent(bracnhNameQry);
+        if (bracnhNameQryId == null)
+            return Collections.emptyList();
+
+        return compactedBuildsForServer(srvIdMaskHigh)
+            .filter(e -> e.buildTypeId == (int)buildTypeIdId)
+            .filter(e -> e.branchName == (int)bracnhNameQryId)
+            .map(compacted -> compacted.toBuildRef(compactor))
+            .collect(Collectors.toList());
+    }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
index bd6f8cf..59c2986 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IStringCompactor.java
@@ -21,8 +21,11 @@ public interface IStringCompactor {
      * @param val Value.
      */
     public int getStringId(String val);
+
     /**
      * @param id Id.
      */
     public String getStringFromId(int id);
+
+    public Integer getStringIdIfPresent(String id);
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
index f623cc0..5cd2a0b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
@@ -150,6 +150,22 @@ public class IgniteStringCompactor implements IStringCompactor {
         return next.getValue().val;
     }
 
+    /** {@inheritDoc} */
+    @Override public Integer getStringIdIfPresent(String val) {
+        if (val == null)
+            return -1;
+
+        initIfNeeded();
+
+        CompactorEntity entity = stringsCache.get(val);
+
+        if (entity != null)
+            return entity.id;
+
+        return null;
+
+    }
+
     @NotNull
     public static <K, V> CacheConfiguration<K, V> getCache8PartsConfig(String name) {
         CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(name);
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 ff76a35..998cc34 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
@@ -17,11 +17,8 @@
 package org.apache.ignite.ci.teamcity.ignited;
 
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 import org.apache.ignite.ci.ITeamcity;
@@ -29,7 +26,6 @@ import org.apache.ignite.ci.di.AutoProfiling;
 import org.apache.ignite.ci.di.MonitoredTask;
 import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.ci.tcmodel.hist.BuildRef;
-import org.jetbrains.annotations.NotNull;
 
 public class TeamcityIgnitedImpl implements ITeamcityIgnited {
     /** Server id. */
@@ -71,14 +67,7 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited {
         else
             bracnhNameQry = branchName;
 
-        return allBuildsEver()
-            .filter(e -> Objects.equals(e.buildTypeId, buildTypeId))
-            .filter(e -> Objects.equals(e.branchName, bracnhNameQry))
-            .collect(Collectors.toList());
-    }
-
-    @NotNull private Stream<BuildRef> allBuildsEver() {
-        return buildRefDao.getAllBuilds(srvIdMaskHigh);
+        return buildRefDao.findBuildsInHistory(srvIdMaskHigh, buildTypeId, bracnhNameQry);
     }
 
     private void actualizeRecentBuilds() {
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
index fa57009..bb2c71f 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/visa/TcBotVisaService.java
@@ -26,11 +26,11 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
 import org.apache.ignite.ci.user.ICredentialsProv;
 import org.apache.ignite.ci.tcbot.visa.ContributionToCheck;
 import org.apache.ignite.ci.tcbot.visa.TcBotTriggerAndSignOffService;
 import org.apache.ignite.ci.web.CtxListener;
+import org.apache.ignite.ci.web.model.SimpleResult;
 import org.apache.ignite.ci.web.rest.exception.ServiceUnauthorizedException;
 import org.jetbrains.annotations.Nullable;
 
@@ -59,8 +59,8 @@ public class TcBotVisaService {
     }
 
     @GET
-    @Path("buildsForContribution")
-    public List<BuildRef> buildsForContribution(@Nullable @QueryParam("serverId") String srvId,
+    @Path("findBranchForPr")
+    public SimpleResult findBranchForPr(@Nullable @QueryParam("serverId") String srvId,
         @Nonnull @QueryParam("suiteId") String suiteId,
         @QueryParam("prId") String prId) {
         ICredentialsProv prov = ICredentialsProv.get(req);
@@ -71,6 +71,6 @@ public class TcBotVisaService {
         TcBotTriggerAndSignOffService instance = CtxListener.getInjector(ctx)
             .getInstance(TcBotTriggerAndSignOffService.class);
 
-        return instance.buildsForContribution(srvId, prov, suiteId, prId);
+        return new SimpleResult(instance.findBranchForPr(srvId, prov, suiteId, prId));
     }
 }
diff --git a/ignite-tc-helper-web/src/main/webapp/css/style-1.5.css b/ignite-tc-helper-web/src/main/webapp/css/style-1.5.css
index d670800..ffc2770 100644
--- a/ignite-tc-helper-web/src/main/webapp/css/style-1.5.css
+++ b/ignite-tc-helper-web/src/main/webapp/css/style-1.5.css
@@ -127,6 +127,10 @@ form, .formgroup {
 	box-shadow: 3px 2px 6px -2px rgba(0,0,0,0.64);
 }
 
+.disabledbtn {
+	background: #b4b4b4;
+}
+
 .idxpgbutton {
     width: 100px;
     min-height: 100px;
diff --git a/ignite-tc-helper-web/src/main/webapp/prs.html b/ignite-tc-helper-web/src/main/webapp/prs.html
index 2c330ef..8503675 100644
--- a/ignite-tc-helper-web/src/main/webapp/prs.html
+++ b/ignite-tc-helper-web/src/main/webapp/prs.html
@@ -95,6 +95,15 @@
             });
         }
 
+        function prShowHref(srvId, suiteId, branchName) {
+            return "/pr.html?serverId=" + srvId + "&" +
+                "suiteId=" + suiteId +
+                //"&baseBranchForTc=" +
+                "&branchForTc=" +
+                branchName +
+                "&action=Latest";
+        }
+
         function showTable(result, srvId, suiteId) {
 
             let tableForSrv = $('#serverContributions-' + srvId);
@@ -139,20 +148,25 @@
                         title: "Existing RunAll",
                         "render": function(data, type, row, meta){
                             let prId = data;
-                            if(type === 'display'){
-                                data = "<a href='/pr.html?serverId="+srvId+"&" +
-
-                                    "suiteId=" + suiteId +
-                                     //"&baseBranchForTc=" +
-                                    "&branchForTc=pull%2F" + prId+ "%2Fhead&action=Latest'><button>Open /" + data + "/head</button></a>";
+                            if(type === 'display') {
+                                data = "<a id='link_" + prId + "' href='" +
+                                    prShowHref(srvId, suiteId, "pull%2F" + prId + "%2Fhead") +
+                                    "'>" +
+                                    "<button id='show_" + prId + "'>Open /" + data + "/head</button></a>";
 
                                 $.ajax({
-                                    url: "rest/visa/buildsForContribution?serverId=" + srvId +
+                                    url: "rest/visa/findBranchForPr?serverId=" + srvId +
                                         "&suiteId=" + suiteId +
                                         "&prId=" + prId,
                                     success:
                                         function (result) {
-                                            console.log("Contribution "+prId + "branshes: " + result + " ")
+                                            console.log("Contribution " + prId + " bransh: " + result + " ");
+                                            if(isDefinedAndFilled(result.result)) {
+                                                $('#link_' + prId).attr('href', prShowHref(srvId, suiteId, result.result));
+
+                                            } else {
+                                                $('#show_' + prId).attr('class', 'disabledbtn');
+                                            }
                                         }
                                 });