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/06 12:11:35 UTC

[ignite-teamcity-bot] branch ignite-9800 updated: IGNITE-9800: Persisting PR implemented (without caching of computation)

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

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


The following commit(s) were added to refs/heads/ignite-9800 by this push:
     new a084ab6  IGNITE-9800: Persisting PR implemented (without caching of computation)
a084ab6 is described below

commit a084ab601fecd6b04ee30bb34563057391a38b99
Author: Dmitriy Pavlov <dp...@apache.org>
AuthorDate: Sat Oct 6 15:11:35 2018 +0300

    IGNITE-9800: Persisting PR implemented (without caching of computation)
---
 .../apache/ignite/ci/analysis/LogCheckResult.java  |  2 +
 .../org/apache/ignite/ci/di/IgniteTcBotModule.java |  5 ++
 .../apache/ignite/ci/di/scheduler/IScheduler.java  | 27 ++++++---
 .../ignite/ci/di/scheduler/SchedulerModule.java    | 11 ++++
 .../ignite/ci/di/scheduler/TcBotScheduler.java     | 51 +++++++++++++++++
 .../org/apache/ignite/ci/github/PullRequest.java   | 26 ++++++++-
 .../ci/github/ignited/GitHubConnIgnitedImpl.java   | 66 +++++++++++++++++++---
 .../ci/github/ignited/GitHubIgnitedModule.java     | 12 +---
 .../org/apache/ignite/ci/issue/IssueDetector.java  |  1 +
 .../ignite/ci/tcbot/TcBotSystemProperties.java     | 13 +----
 .../java/org/apache/ignite/ci/web/CtxListener.java |  3 +
 .../java/org/apache/ignite/ci/web/Launcher.java    |  7 +++
 .../web/rest/exception/ExeptionsTraceLogger.java   | 12 ++--
 jetty-launcher/build.gradle                        |  2 +-
 .../apache/ignite/ci/TcHelperJettyLauncher.java    |  3 +
 15 files changed, 198 insertions(+), 43 deletions(-)

diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
index 2ceda10..790f80a 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/analysis/LogCheckResult.java
@@ -65,10 +65,12 @@ public class LogCheckResult implements IVersionedEntity {
         return lastStartedTest;
     }
 
+    /** {@inheritDoc} */
     @Override public int version() {
         return _version == null ? -1 : _version;
     }
 
+    /** {@inheritDoc} */
     @Override public int latestVersion() {
         return LATEST_VERSION;
     }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
index 3e56ede..2f802d4 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/IgniteTcBotModule.java
@@ -25,6 +25,7 @@ import com.google.inject.matcher.Matchers;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.ci.*;
 import org.apache.ignite.ci.db.Ignite1Init;
+import org.apache.ignite.ci.di.scheduler.SchedulerModule;
 import org.apache.ignite.ci.github.ignited.GitHubIgnitedModule;
 import org.apache.ignite.ci.issue.IssueDetector;
 import org.apache.ignite.ci.jira.IJiraIntegration;
@@ -43,6 +44,9 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+/**
+ *
+ */
 public class IgniteTcBotModule extends AbstractModule {
     /** Ignite future. */
     private Future<Ignite> igniteFut;
@@ -83,6 +87,7 @@ public class IgniteTcBotModule extends AbstractModule {
         bind(BackgroundUpdater.class).in(new SingletonScope());
         install(new TcRealConnectionModule());
         install(new GitHubIgnitedModule());
+        install(new SchedulerModule());
     }
 
     //todo fallback to TC big class
diff --git a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java
similarity index 53%
copy from jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java
index d11a8e3..aa7f237 100644
--- a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/IScheduler.java
@@ -14,16 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.ignite.ci.di.scheduler;
 
-package org.apache.ignite.ci;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.TimeUnit;
 
-import static org.apache.ignite.ci.web.Launcher.*;
+public interface IScheduler {
+    /**
+     * Creates and executes a one-shot action that becomes enabled
+     * after the given delay.
+     *
+     * @param cmd the task to execute.
+     * @param delay the time from now to delay execution.
+     * @param unit the time unit of the delay parameter.
+     *
+     * @throws RejectedExecutionException if the task cannot be
+     *         scheduled for execution
+     * @throws NullPointerException if command is null
+     */
+    public void invokeLater(Runnable cmd, long delay, TimeUnit unit);
 
-/**
- * Starts TC Helper REST server in production mode.
- */
-public class TcHelperJettyLauncher {
-    public static void main(String[] args) throws Exception {
-        runServer(false);
-    }
+    public void stop();
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java
new file mode 100644
index 0000000..69a310b
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/SchedulerModule.java
@@ -0,0 +1,11 @@
+package org.apache.ignite.ci.di.scheduler;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.internal.SingletonScope;
+
+public class SchedulerModule extends AbstractModule {
+    /** {@inheritDoc} */
+    @Override protected void configure() {
+        bind(IScheduler.class).to(TcBotScheduler.class).in(new SingletonScope());
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java
new file mode 100644
index 0000000..941d3ab
--- /dev/null
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/di/scheduler/TcBotScheduler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ignite.ci.di.scheduler;
+
+import com.google.common.base.Preconditions;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+class TcBotScheduler implements IScheduler {
+    /** Initial guard. */
+    private AtomicBoolean initGuard = new AtomicBoolean();
+
+    /** Executor service. */
+    private volatile ScheduledExecutorService executorSvc;
+
+    @Override public void invokeLater(Runnable cmd, long delay, TimeUnit unit) {
+        service().schedule(cmd, delay, unit);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void stop() {
+        if(executorSvc!=null)
+            executorSvc.shutdown();
+    }
+
+    private ScheduledExecutorService service() {
+        if (executorSvc == null && initGuard.compareAndSet(false, true))
+            executorSvc = Executors.newScheduledThreadPool(3);
+
+        Preconditions.checkNotNull(executorSvc, "Service should be created");
+
+        return executorSvc;
+    }
+}
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
index afd2722..bcfca07 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/PullRequest.java
@@ -20,11 +20,21 @@ package org.apache.ignite.ci.github;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.gson.annotations.SerializedName;
+import org.apache.ignite.ci.analysis.IVersionedEntity;
+import org.apache.ignite.ci.db.Persisted;
 
 /**
  *
  */
-public class PullRequest {
+@Persisted
+public class PullRequest implements IVersionedEntity {
+    public static final String OPEN = "open";
+    /** Latest version. */
+    private static final int LATEST_VERSION = 6;
+
+    /** Entity version. */
+    @SuppressWarnings("FieldCanBeLocal") private Integer _ver = LATEST_VERSION;
+
     /** Pull Request number. You can see it at {@code apache/ignite/pull/"number"}. */
     @SerializedName("number") private int num;
 
@@ -104,6 +114,7 @@ public class PullRequest {
             return false;
         PullRequest req = (PullRequest)o;
         return num == req.num &&
+            Objects.equal(_ver, req._ver) &&
             Objects.equal(state, req.state) &&
             Objects.equal(title, req.title) &&
             Objects.equal(htmlUrl, req.htmlUrl) &&
@@ -114,6 +125,17 @@ public class PullRequest {
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return Objects.hashCode(num, state, title, htmlUrl, updatedAt, statusesUrl, gitHubUser);
+        return Objects.hashCode(_ver, num, state, title, htmlUrl, updatedAt, statusesUrl, gitHubUser);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int version() {
+        return _ver == null ? -1 : _ver;
     }
+
+    /** {@inheritDoc} */
+    @Override public int latestVersion() {
+        return LATEST_VERSION;
+    }
+
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
index 1d2ff00..9660b38 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubConnIgnitedImpl.java
@@ -19,28 +19,34 @@ package org.apache.ignite.ci.github.ignited;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
 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.github.PullRequest;
 import org.apache.ignite.ci.github.pure.IGitHubConnection;
-import org.apache.ignite.ci.util.ExceptionUtil;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.jetbrains.annotations.NotNull;
 
 class GitHubConnIgnitedImpl implements IGitHubConnIgnited {
     public static final String GIT_HUB_PR = "gitHubPr";
-    private String id;
+    private String srvId;
     private IGitHubConnection conn;
 
     @Inject Provider<Ignite> igniteProvider;
+    @Inject IScheduler scheduler;
 
-    /** Data loaded. */
+    @Deprecated
     private final Cache<String, List<PullRequest>> prListCache
         = CacheBuilder.newBuilder()
         .maximumSize(100)
@@ -49,15 +55,15 @@ class GitHubConnIgnitedImpl implements IGitHubConnIgnited {
         .build();
 
     /** Server ID mask for cache Entries. */
-    private long serverIdMask;
+    private long srvIdMaskHigh;
 
     private IgniteCache<Long, PullRequest> prCache;
 
     public void init(String srvId, IGitHubConnection conn) {
-        id = srvId;
+        this.srvId = srvId;
         this.conn = conn;
 
-        serverIdMask = ((long)srvId.hashCode()) << 32;
+        srvIdMaskHigh = srvId.hashCode();
 
         prCache = igniteProvider.get().getOrCreateCache(getCache8PartsConfig(GIT_HUB_PR));
     }
@@ -74,11 +80,55 @@ class GitHubConnIgnitedImpl implements IGitHubConnIgnited {
     /** {@inheritDoc} */
     @AutoProfiling
     @Override public List<PullRequest> getPullRequests() {
-        try {
+        scheduler.invokeLater(this::actualizePrs, 10, TimeUnit.SECONDS);
+
+        return StreamSupport.stream(prCache.spliterator(), false)
+            .filter(entry -> entry.getKey() >> 32 == srvIdMaskHigh)
+            .filter(entry -> PullRequest.OPEN.equals(entry.getValue().getState()))
+            .map(javax.cache.Cache.Entry::getValue)
+            .collect(Collectors.toList());
+
+        /* try {
             return prListCache.get("", conn::getPullRequests);
         }
         catch (ExecutionException e) {
             throw ExceptionUtil.propagateException(e);
+        }*/
+    }
+
+    private void actualizePrs() {
+        runAtualizePrs(srvId);
+    }
+
+    /**
+     * @param srvId Server id.
+     */
+    @MonitoredTask(name = "Actualize PRs", nameExtArgIndex = 0)
+    @AutoProfiling
+    protected String runAtualizePrs(String srvId) {
+        List<PullRequest> ghData = conn.getPullRequests();
+
+        Set<Long> ids = ghData.stream().map(PullRequest::getNumber)
+            .map(this::prNumberToCacheKey)
+            .collect(Collectors.toSet());
+
+        Map<Long, PullRequest> existingEntries = prCache.getAll(ids);
+        Map<Long, PullRequest> entriesToPut = new TreeMap<>();
+
+        for (PullRequest next : ghData) {
+            long cacheKey = prNumberToCacheKey(next.getNumber());
+            PullRequest prPersisted = existingEntries.get(cacheKey);
+
+            if (prPersisted == null || !prPersisted.equals(next))
+                entriesToPut.put(cacheKey, next);
         }
+
+        prCache.putAll(entriesToPut);
+
+        return "Entries saved " + entriesToPut.size();
+    }
+
+    private long prNumberToCacheKey(int prNumber) {
+        return (long)prNumber | srvIdMaskHigh << 32;
     }
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedModule.java
index fa9b0df..22c39f9 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/github/ignited/GitHubIgnitedModule.java
@@ -16,18 +16,13 @@
  */
 package org.apache.ignite.ci.github.ignited;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
 import com.google.inject.AbstractModule;
 import com.google.inject.internal.SingletonScope;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import org.apache.ignite.ci.di.AutoProfiling;
-import org.apache.ignite.ci.github.PullRequest;
 import org.apache.ignite.ci.github.pure.GitHubIntegrationModule;
-import org.apache.ignite.ci.util.ExceptionUtil;
 
+/**
+ * Requires {@link org.apache.ignite.ci.di.scheduler.SchedulerModule} to be installed
+ */
 public class GitHubIgnitedModule extends AbstractModule {
     /** {@inheritDoc} */
     @Override protected void configure() {
@@ -35,5 +30,4 @@ public class GitHubIgnitedModule extends AbstractModule {
 
         bind(IGitHubConnIgnitedProvider.class).to(GitHubIgnitedProvImpl.class).in(new SingletonScope());
     }
-
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
index a7c0a45..7e2afa8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/issue/IssueDetector.java
@@ -80,6 +80,7 @@ public class IssueDetector {
     private final AtomicBoolean init = new AtomicBoolean();
     private ICredentialsProv backgroundOpsCreds;
     private ITcHelper backgroundOpsTcHelper;
+    @Deprecated //todo use scheduler
     private ScheduledExecutorService executorService;
 
     @Inject private Provider<CheckQueueJob> checkQueueJobProv;
diff --git a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java
similarity index 74%
copy from jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
copy to ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java
index d11a8e3..a77dbd2 100644
--- a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotSystemProperties.java
@@ -15,15 +15,8 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.ci;
+package org.apache.ignite.ci.tcbot;
 
-import static org.apache.ignite.ci.web.Launcher.*;
-
-/**
- * Starts TC Helper REST server in production mode.
- */
-public class TcHelperJettyLauncher {
-    public static void main(String[] args) throws Exception {
-        runServer(false);
-    }
+public class TcBotSystemProperties {
+    public static final String DEV_MODE = "DEV_MODE";
 }
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
index 26d7489..249d554 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/CtxListener.java
@@ -34,6 +34,7 @@ import org.apache.ignite.ci.ITcHelper;
 import org.apache.ignite.ci.TcHelper;
 import org.apache.ignite.ci.db.TcHelperDb;
 import org.apache.ignite.ci.di.IgniteTcBotModule;
+import org.apache.ignite.ci.di.scheduler.IScheduler;
 import org.apache.ignite.ci.observer.BuildObserver;
 import org.apache.ignite.ci.teamcity.pure.TeamcityRecorder;
 import org.apache.ignite.ci.user.ICredentialsProv;
@@ -114,6 +115,8 @@ public class CtxListener implements ServletContextListener {
         try {
             injector.getInstance(TcUpdatePool.class).stop();
             injector.getInstance(BuildObserver.class).stop();
+
+            injector.getInstance(IScheduler.class).stop();
         }
         catch (Exception e) {
             e.printStackTrace();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
index 9c07fce..4ff0f81 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/Launcher.java
@@ -22,6 +22,7 @@ import java.io.Console;
 import java.io.File;
 import java.io.IOException;
 import java.io.Reader;
+import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.webapp.WebAppContext;
@@ -34,7 +35,13 @@ public class Launcher {
         runServer(true);
     }
 
+    /**
+     * @param dev Dev mode.
+     */
     public static void runServer(boolean dev) throws Exception {
+        if(dev)
+            System.setProperty(TcBotSystemProperties.DEV_MODE, "true");
+
         Server srv = new Server();
 
         ServerConnector connector = new ServerConnector(srv);
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
index 482af1d..20958fa 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/web/rest/exception/ExeptionsTraceLogger.java
@@ -18,6 +18,8 @@ package org.apache.ignite.ci.web.rest.exception;
 
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
+import javax.ws.rs.core.Response;
+import org.apache.ignite.ci.tcbot.TcBotSystemProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,10 +32,12 @@ public class ExeptionsTraceLogger implements ExceptionMapper<Throwable> {
     private static final Logger logger = LoggerFactory.getLogger(ExeptionsTraceLogger.class);
 
     /** {@inheritDoc} */
-    @Override public javax.ws.rs.core.Response toResponse(Throwable t) {
+    @Override public Response toResponse(Throwable t) {
         logger.error("Error during processing request (Internal Server Error [500]). Caused by: ", t);
-        return javax.ws.rs.core.Response.serverError()
-            .entity(t.getMessage())
-            .build();
+
+        if (Boolean.valueOf(System.getProperty(TcBotSystemProperties.DEV_MODE)))
+            t.printStackTrace();
+
+        return Response.serverError().entity(t.getMessage()).build();
     }
 }
\ No newline at end of file
diff --git a/jetty-launcher/build.gradle b/jetty-launcher/build.gradle
index 89f0588..c0659f0 100644
--- a/jetty-launcher/build.gradle
+++ b/jetty-launcher/build.gradle
@@ -29,7 +29,7 @@ repositories {
 mainClassName = 'org.apache.ignite.ci.TcHelperJettyLauncher'
 applicationDefaultJvmArgs = ["-Dteamcity.helper.home=../work",
                              "-Dteamcity.bot.regionsize=16", // 16g Durable Memory region
-                             "-Dhttp.maxConnections=120",
+                             "-Dhttp.maxConnections=70",
                              "-server",
                              "-Xmx16g",
                              "-XX:+AlwaysPreTouch",
diff --git a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java b/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
index d11a8e3..ce1f991 100644
--- a/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
+++ b/jetty-launcher/src/main/java/org/apache/ignite/ci/TcHelperJettyLauncher.java
@@ -23,6 +23,9 @@ import static org.apache.ignite.ci.web.Launcher.*;
  * Starts TC Helper REST server in production mode.
  */
 public class TcHelperJettyLauncher {
+    /**
+     * @param args Args.
+     */
     public static void main(String[] args) throws Exception {
         runServer(false);
     }