Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 2F89F106EB for ; Wed, 9 Sep 2015 08:53:03 +0000 (UTC) Received: (qmail 770 invoked by uid 500); 9 Sep 2015 08:53:00 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 727 invoked by uid 500); 9 Sep 2015 08:53:00 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 681 invoked by uid 99); 9 Sep 2015 08:52:59 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Sep 2015 08:52:59 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id CBB7CE00CC; Wed, 9 Sep 2015 08:52:59 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: vozerov@apache.org To: commits@ignite.apache.org Date: Wed, 09 Sep 2015 08:53:00 -0000 Message-Id: In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [02/43] ignite git commit: Stopping GridUpdateNotifier properly on Ignite stopping. Stopping GridUpdateNotifier properly on Ignite stopping. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/35bc5eca Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/35bc5eca Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/35bc5eca Branch: refs/heads/master Commit: 35bc5ecafd669ace8321774e39e49d6c3b88efe7 Parents: b1f119f Author: ashutak Authored: Mon Sep 7 23:45:01 2015 +0300 Committer: ashutak Committed: Mon Sep 7 23:45:01 2015 +0300 ---------------------------------------------------------------------- .../ignite/internal/GridUpdateNotifier.java | 82 ++++++++++++++------ .../apache/ignite/internal/IgniteKernal.java | 5 +- .../internal/GridUpdateNotifierSelfTest.java | 23 +++--- 3 files changed, 70 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/35bc5eca/modules/core/src/main/java/org/apache/ignite/internal/GridUpdateNotifier.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridUpdateNotifier.java b/modules/core/src/main/java/org/apache/ignite/internal/GridUpdateNotifier.java index 448f87b..b6162ed 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/GridUpdateNotifier.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/GridUpdateNotifier.java @@ -26,12 +26,12 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLConnection; import java.util.Collection; -import java.util.Map; -import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.atomic.AtomicReference; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -59,21 +59,24 @@ import static java.net.URLEncoder.encode; * gracefully ignore any errors occurred during notification and verification process. */ class GridUpdateNotifier { + /** Default encoding. */ + private static final String CHARSET = "UTF-8"; + /** Access URL to be used to access latest version data. */ private static final String UPD_STATUS_PARAMS = IgniteProperties.get("ignite.update.status.params"); /** Throttling for logging out. */ private static final long THROTTLE_PERIOD = 24 * 60 * 60 * 1000; // 1 day. + /** Sleep milliseconds time for worker thread. */ + public static final int WORKER_THREAD_SLEEP_TIME = 5000; + /** Grid version. */ private final String ver; /** Site. */ private final String url; - /** Asynchronous checked. */ - private GridWorker checker; - /** Latest version. */ private volatile String latestVer; @@ -95,7 +98,8 @@ class GridUpdateNotifier { /** System properties */ private final String vmProps; - private final Map pluginVers; + /** Plugins information for request */ + private final String pluginsVers; /** Kernal gateway */ private final GridKernalGateway gw; @@ -103,6 +107,12 @@ class GridUpdateNotifier { /** */ private long lastLog = -1; + /** Command for worker thread. */ + private final AtomicReference cmd = new AtomicReference<>(); + + /** Worker thread to process http request. */ + private final Thread workerThread; + /** * Creates new notifier with default values. * @@ -136,18 +146,46 @@ class GridUpdateNotifier { this.gridName = gridName == null ? "null" : gridName; this.gw = gw; - pluginVers = U.newHashMap(pluginProviders.size()); + SB pluginsBuilder = new SB(); for (PluginProvider provider : pluginProviders) - pluginVers.put(provider.name() + "-plugin-version", provider.version()); + pluginsBuilder.a("&").a(provider.name() + "-plugin-version").a("="). + a(encode(provider.version(), CHARSET)); + + pluginsVers = pluginsBuilder.toString(); this.reportOnlyNew = reportOnlyNew; vmProps = getSystemProperties(); + + workerThread = new Thread(new Runnable() { + @Override public void run() { + try { + while(!Thread.currentThread().isInterrupted()) { + Runnable cmd0 = cmd.getAndSet(null); + + if (cmd0 != null) + cmd0.run(); + else + Thread.sleep(WORKER_THREAD_SLEEP_TIME); + } + } + catch (InterruptedException ignore) { + // No-op. + } + } + }, "upd-ver-checker"); + + workerThread.setDaemon(true); + + workerThread.start(); } catch (ParserConfigurationException e) { throw new IgniteCheckedException("Failed to create xml parser.", e); } + catch (UnsupportedEncodingException e) { + throw new IgniteCheckedException("Failed to encode.", e); + } } /** @@ -197,16 +235,15 @@ class GridUpdateNotifier { /** * Starts asynchronous process for retrieving latest version data. * - * @param exec Executor service. * @param log Logger. */ - void checkForNewVersion(Executor exec, IgniteLogger log) { + void checkForNewVersion(IgniteLogger log) { assert log != null; log = log.getLogger(getClass()); try { - exec.execute(checker = new UpdateChecker(log)); + cmd.set(new UpdateChecker(log)); } catch (RejectedExecutionException e) { U.error(log, "Failed to schedule a thread due to execution rejection (safely ignoring): " + @@ -224,10 +261,6 @@ class GridUpdateNotifier { log = log.getLogger(getClass()); - // Don't join it to avoid any delays on update checker. - // Checker thread will eventually exit. - U.cancel(checker); - String latestVer = this.latestVer; String downloadUrl = this.downloadUrl; @@ -272,12 +305,16 @@ class GridUpdateNotifier { } /** + * Stops update notifier. + */ + public void stop() { + workerThread.interrupt(); + } + + /** * Asynchronous checker of the latest version available. */ private class UpdateChecker extends GridWorker { - /** Default encoding. */ - private static final String CHARSET = "UTF-8"; - /** Logger. */ private final IgniteLogger log; @@ -297,18 +334,13 @@ class GridUpdateNotifier { try { String stackTrace = gw != null ? gw.userStackTrace() : null; - SB plugins = new SB(); - - for (Map.Entry p : pluginVers.entrySet()) - plugins.a("&").a(p.getKey()).a("=").a(encode(p.getValue(), CHARSET)); - String postParams = "gridName=" + encode(gridName, CHARSET) + (!F.isEmpty(UPD_STATUS_PARAMS) ? "&" + UPD_STATUS_PARAMS : "") + (topSize > 0 ? "&topSize=" + topSize : "") + (!F.isEmpty(stackTrace) ? "&stackTrace=" + encode(stackTrace, CHARSET) : "") + (!F.isEmpty(vmProps) ? "&vmProps=" + encode(vmProps, CHARSET) : "") + - plugins.toString(); + pluginsVers; URLConnection conn = new URL(url).openConnection(); @@ -419,4 +451,4 @@ class GridUpdateNotifier { return obtainMeta("downloadUrl", node); } } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/ignite/blob/35bc5eca/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 14d7c14..f160d46 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -1839,6 +1839,9 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { if (updateNtfTimer != null) updateNtfTimer.cancel(); + if (verChecker != null) + verChecker.stop(); + if (starveTask != null) starveTask.close(); @@ -3220,7 +3223,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { verChecker.topologySize(kernal.cluster().nodes().size()); } - verChecker.checkForNewVersion(execSvc, log); + verChecker.checkForNewVersion(log); // Just wait for 10 secs. Thread.sleep(PERIODIC_VER_CHECK_CONN_TIMEOUT); http://git-wip-us.apache.org/repos/asf/ignite/blob/35bc5eca/modules/core/src/test/java/org/apache/ignite/internal/GridUpdateNotifierSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridUpdateNotifierSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridUpdateNotifierSelfTest.java index b6109f7..61c2085 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/GridUpdateNotifierSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/GridUpdateNotifierSelfTest.java @@ -19,7 +19,6 @@ package org.apache.ignite.internal; import java.util.Collections; import java.util.Properties; -import java.util.concurrent.Executor; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.internal.U; @@ -27,7 +26,6 @@ import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.plugin.PluginProvider; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonTest; -import org.jetbrains.annotations.NotNull; /** * Update notifier test. @@ -74,10 +72,17 @@ public class GridUpdateNotifierSelfTest extends GridCommonAbstractTest { GridUpdateNotifier ntf = new GridUpdateNotifier(null, nodeVer, TEST_GATEWAY, Collections.emptyList(), false); - ntf.checkForNewVersion(new SelfExecutor(), log); + ntf.checkForNewVersion(log); String ver = ntf.latestVersion(); + // Wait 60 sec for response. + for (int i = 0; ver == null && i < 600; i++) { + Thread.sleep(100); + + ver = ntf.latestVersion(); + } + info("Latest version: " + ver); assertNotNull("Ignite latest version has not been detected.", ver); @@ -93,16 +98,6 @@ public class GridUpdateNotifierSelfTest extends GridCommonAbstractTest { } /** - * Executor that runs task in current thread. - */ - private static class SelfExecutor implements Executor { - /** {@inheritDoc} */ - @Override public void execute(@NotNull Runnable r) { - r.run(); - } - } - - /** * Test kernal gateway that always return uninitialized user stack trace. */ private static final GridKernalGateway TEST_GATEWAY = new GridKernalGateway() { @@ -138,4 +133,4 @@ public class GridUpdateNotifierSelfTest extends GridCommonAbstractTest { // No-op. } }; -} \ No newline at end of file +}