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

dpavlov pushed a commit to branch ignite-9542-new-run-stripe
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git


The following commit(s) were added to refs/heads/ignite-9542-new-run-stripe by 
this push:
     new 81ba33d  IGNITE-9542 A number of optimization for initial loading
81ba33d is described below

commit 81ba33d0cd623263ed917cb9d288d1c7c9caf490
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Wed Nov 28 15:44:26 2018 +0300

    IGNITE-9542 A number of optimization for initial loading
---
 .../ci/teamcity/ignited/runhist/Invocation.java    | 19 +++++++++
 .../teamcity/ignited/runhist/InvocationData.java   | 47 ++++++++++++++++++----
 .../teamcity/ignited/runhist/RunHistCompacted.java | 20 ++++++++-
 .../ignited/runhist/RunHistCompactedDao.java       | 10 +++--
 .../ci/teamcity/ignited/runhist/RunHistSync.java   | 39 +++++++++---------
 .../ci/web/model/current/SuiteCurrentStatus.java   |  2 +-
 6 files changed, 107 insertions(+), 30 deletions(-)

diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
index 88e8510..f540c2f 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/Invocation.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.ci.teamcity.ignited.runhist;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
 public class Invocation {
@@ -64,4 +65,22 @@ public class Invocation {
     public long startDate() {
         return startDate;
     }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        Invocation that = (Invocation)o;
+        return buildId == that.buildId &&
+            status == that.status &&
+            changePresent == that.changePresent &&
+            startDate == that.startDate;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return Objects.hashCode(buildId, status, changePresent, startDate);
+    }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
index c740d15..a194c7c 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/InvocationData.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.ci.teamcity.ignited.runhist;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 import java.time.Duration;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -55,30 +56,44 @@ public class InvocationData {
         return allHistRuns;
     }
 
-    public boolean add(int build, Invocation inv) {
+    public boolean add(Invocation inv) {
+        try {
+            return innerAdd(inv);
+        }
+        finally {
+            removeEldiest();
+        }
+    }
+
+    public boolean innerAdd(Invocation inv) {
+        int build = inv.buildId();
+        if (build < 0)
+            return false;
+
         if (invocationMap.containsKey(build))
             return false;
 
+        if (isExpired(inv.startDate))
+            return false;
+
         Invocation prevVal = invocationMap.putIfAbsent(build, inv);
 
-        final boolean newValue = prevVal == null;
+        final boolean newVal = prevVal == null;
 
-        if (newValue) {
+        if (newVal) {
             allHistRuns++;
             if (inv.isFailure())
                 allHistFailures++;
         }
 
-        removeEldiest();
-
-        return newValue;
+        return newVal;
     }
 
     void removeEldiest() {
         invocationMap.entrySet().removeIf(entries -> 
isExpired(entries.getValue().startDate));
     }
 
-    public boolean isExpired(long startDate) {
+    public static boolean isExpired(long startDate) {
         return (U.currentTimeMillis() - startDate) > 
Duration.ofDays(MAX_DAYS).toMillis();
     }
 
@@ -110,6 +125,7 @@ public class InvocationData {
                         .count();
     }
 
+    /** {@inheritDoc} */
     @Override public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("allHistRuns", allHistRuns)
@@ -118,6 +134,23 @@ public class InvocationData {
                 .toString();
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        InvocationData data = (InvocationData)o;
+        return allHistRuns == data.allHistRuns &&
+            allHistFailures == data.allHistFailures &&
+            Objects.equal(invocationMap, data.invocationMap);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return Objects.hashCode(allHistRuns, allHistFailures, invocationMap);
+    }
+
     /**
      *
      */
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
index f93d618..2841971 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompacted.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.ci.teamcity.ignited.runhist;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
 import org.apache.ignite.cache.query.annotations.QuerySqlField;
 import org.apache.ignite.ci.analysis.IVersionedEntity;
 import org.apache.ignite.ci.db.Persisted;
@@ -96,9 +97,10 @@ public class RunHistCompacted implements IVersionedEntity, 
IRunHistory {
     /**
      * @param build Build.
      * @param inv Invocation.
+     * @return if test run is new and is not expired.
      */
     public boolean addTestRun(int build, Invocation inv) {
-        return data.add(build, inv);
+        return data.add(inv);
     }
 
     /** {@inheritDoc} */
@@ -110,4 +112,20 @@ public class RunHistCompacted implements IVersionedEntity, 
IRunHistory {
                 .add("data", data)
                 .toString();
     }
+
+    @Override public boolean equals(Object o) {
+        if (this == o)
+            return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        RunHistCompacted compacted = (RunHistCompacted)o;
+        return _ver == compacted._ver &&
+            testNameOrSuite == compacted.testNameOrSuite &&
+            srvId == compacted.srvId &&
+            Objects.equal(data, compacted.data);
+    }
+
+    @Override public int hashCode() {
+        return Objects.hashCode(_ver, testNameOrSuite, srvId, data);
+    }
 }
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index a4fa0c7..612249a 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -100,28 +100,32 @@ public class RunHistCompactedDao {
 
     @AutoProfiling
     public Integer addInvocations(RunHistKey histKey, List<Invocation> list) {
-        if(list.isEmpty())
+        if (list.isEmpty())
             return 0;
 
         return testHistCache.invoke(histKey, (entry, parms) -> {
                 int cnt = 0;
+
                 RunHistCompacted hist = entry.getValue();
 
                 if (hist == null)
                     hist = new RunHistCompacted(entry.getKey());
 
+                int initHashCode = hist.hashCode();
+
                 List<Invocation> invocationList = (List<Invocation>)parms[0];
 
                 for (Invocation invocation : invocationList) {
                     boolean added = hist.addTestRun(
                         invocation.buildId(),
                         invocation);
+
                     if (added)
                         cnt++;
-
                 }
 
-                entry.setValue(hist);
+                if (cnt > 0 || hist.hashCode() != initHashCode)
+                    entry.setValue(hist);
 
                 return cnt;
             },
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
index d14a8ed..ade23df 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
@@ -23,11 +23,9 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-import javax.annotation.Nullable;
 import javax.annotation.concurrent.GuardedBy;
 import javax.inject.Inject;
 import org.apache.ignite.ci.di.AutoProfiling;
@@ -38,7 +36,6 @@ import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
 import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
 import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
-import org.apache.ignite.internal.util.GridConcurrentHashSet;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +46,8 @@ import org.slf4j.LoggerFactory;
 public class RunHistSync {
     /** Logger. */
     private static final Logger logger = 
LoggerFactory.getLogger(RunHistSync.class);
+    public static final int MAX_TESTS_QUEUE = 100000;
+    public static final int HIST_LDR_TASKS = 4;
 
     /** Compactor. */
     @Inject private IStringCompactor compactor;
@@ -97,7 +96,7 @@ public class RunHistSync {
         synchronized (this) {
             final SyncTask syncTask = buildToSave.computeIfAbsent(srvVame, s 
-> new SyncTask());
 
-            if (syncTask.sheduled() + cnt <= 100000)
+            if (syncTask.sheduled() + cnt <= MAX_TESTS_QUEUE)
                 syncTask.tests.putAll(data);
             else
                 saveNow = true;
@@ -106,14 +105,16 @@ public class RunHistSync {
         if(saveNow)
             saveInvocationsMap(data);
         else {
-            scheduler.sheduleNamed(taskName("saveBuildToHistory", srvVame),
-                () -> saveBuildToHistory(srvVame), 2, TimeUnit.MINUTES);
+            int ldrToActivate = 
ThreadLocalRandom.current().nextInt(HIST_LDR_TASKS) + 1;
+
+            scheduler.sheduleNamed(taskName("saveBuildToHistory." + 
ldrToActivate, srvVame),
+                () -> saveBuildToHistory(srvVame, ldrToActivate), 2, 
TimeUnit.MINUTES);
         }
     }
 
-    @MonitoredTask(name="Save Builds To History", nameExtArgIndex = 0)
+    @MonitoredTask(name="Save Builds To History(srv, runner)", 
nameExtArgsIndexes = {0,1})
     @SuppressWarnings("WeakerAccess")
-    protected String saveBuildToHistory(String srvName) {
+    protected String saveBuildToHistory(String srvName, int ldrToActivate) {
         Map<RunHistKey, List<Invocation>> saveThisRun;
 
         synchronized (this) {
@@ -134,20 +135,20 @@ public class RunHistSync {
         Set<Integer> confirmedNewBuild = new HashSet<>();
         Set<Integer> confirmedDuplicate = new HashSet<>();
         AtomicInteger invocations = new AtomicInteger();
-        AtomicInteger duplicates = new AtomicInteger();
+        AtomicInteger duplicateOrExpired = new AtomicInteger();
 
         saveThisRun.forEach(
             (histKey, invocationList) -> {
                 saveInvocationList(confirmedNewBuild,
                     confirmedDuplicate,
                     invocations,
-                    duplicates,
+                    duplicateOrExpired,
                     histKey, invocationList);
             }
         );
 
         String res = "History entries: " + saveThisRun.size() + " processed " 
+ invocations.get()
-            + " invocations saved to DB " + duplicates.get() + " duplicates";
+            + " invocations saved to DB " + duplicateOrExpired.get() + " 
duplicates/expired";
 
         System.out.println(Thread.currentThread().getName() + ":" + res);
 
@@ -157,16 +158,17 @@ public class RunHistSync {
     private void saveInvocationList(Set<Integer> confirmedNewBuild,
         Set<Integer> confirmedDuplicate,
         AtomicInteger invocations,
-        AtomicInteger duplicates,
+        AtomicInteger duplicateOrExpired,
         RunHistKey histKey,
         List<Invocation> invocationList) {
-        List<Invocation> newInvocations = new ArrayList<>();
+        List<Invocation> invocationsToSave = new ArrayList<>();
         invocationList.forEach(
             inv -> {
                 int buildId = inv.buildId();
 
                 if (confirmedNewBuild.contains(buildId)) {
-                    newInvocations.add(inv);
+                    if (!InvocationData.isExpired(inv.startDate()))
+                        invocationsToSave.add(inv);
 
                     return;
                 }
@@ -177,17 +179,18 @@ public class RunHistSync {
                 if (histDao.setBuildProcessed(histKey.srvId(), buildId, 
inv.startDate())) {
                     confirmedNewBuild.add(buildId);
 
-                    newInvocations.add(inv);
+                    if (!InvocationData.isExpired(inv.startDate()))
+                        invocationsToSave.add(inv);
                 }
                 else
                     confirmedDuplicate.add(buildId);
             }
         );
 
-        Integer cntAdded = histDao.addInvocations(histKey, newInvocations);
+        Integer cntAdded = histDao.addInvocations(histKey, invocationsToSave);
 
         invocations.addAndGet(cntAdded);
-        duplicates.addAndGet(invocationList.size() - cntAdded);
+        duplicateOrExpired.addAndGet(invocationList.size() - cntAdded);
     }
 
     public void invokeLaterFindMissingHistory(String srvName) {
diff --git 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
index ab724fc..3348e8d 100644
--- 
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
+++ 
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/model/current/SuiteCurrentStatus.java
@@ -52,7 +52,7 @@ import static org.apache.ignite.ci.util.UrlUtil.escape;
  * Represent Suite result
  */
 @SuppressWarnings("WeakerAccess") public class SuiteCurrentStatus extends 
FailureSummary {
-    public static final boolean NEW_RUN_STAT = false;
+    public static final boolean NEW_RUN_STAT = true;
 
     /** Suite Name */
     public String name;

Reply via email to