You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2015/09/08 19:08:58 UTC

[08/45] 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/ignite-264
Commit: 35bc5ecafd669ace8321774e39e49d6c3b88efe7
Parents: b1f119f
Author: ashutak <as...@gridgain.com>
Authored: Mon Sep 7 23:45:01 2015 +0300
Committer: ashutak <as...@gridgain.com>
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<String, String> 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<Runnable> 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<String, String> 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.<PluginProvider>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
+}