You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dg...@apache.org on 2019/06/03 10:50:25 UTC

[ignite] branch master updated: IGNITE-11882 Bugs related to SPI & tests fixes - Fixes #6581.

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

dgovorukhin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 3e75725  IGNITE-11882 Bugs related to SPI & tests fixes - Fixes #6581.
3e75725 is described below

commit 3e7572549e1966f50f7697ed0965e90a1028ada3
Author: Ivan Bessonov <be...@gmail.com>
AuthorDate: Mon Jun 3 13:47:39 2019 +0300

    IGNITE-11882 Bugs related to SPI & tests fixes - Fixes #6581.
    
    Signed-off-by: Dmitriy Govorukhin <dm...@gmail.com>
---
 .../apache/ignite/internal/IgniteVersionUtils.java | 10 +++-
 .../managers/discovery/GridDiscoveryManager.java   | 32 ++++++------
 .../cache/GridCachePartitionExchangeManager.java   |  2 +-
 .../GridCacheDatabaseSharedManager.java            |  2 +
 .../cluster/GridClusterStateProcessor.java         |  4 +-
 .../autoadjust/BaselineAutoAdjustStatus.java       |  7 +++
 .../persistence/DistributedMetaStorageImpl.java    |  4 ++
 .../apache/ignite/lang/IgniteProductVersion.java   |  4 +-
 .../persistence/IgnitePdsCorruptedStoreTest.java   | 58 +++++++++++++---------
 .../startup/cmdline/GridCommandLineLoaderTest.java | 23 +++++++--
 10 files changed, 95 insertions(+), 51 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
index d12560e..9fe0043 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.TimeZone;
 import org.apache.ignite.lang.IgniteProductVersion;
 
 /**
@@ -31,6 +32,9 @@ public class IgniteVersionUtils {
     /** Ignite version. */
     public static final IgniteProductVersion VER;
 
+    /** UTC build date formatter. */
+    public static final SimpleDateFormat BUILD_TSTAMP_DATE_FORMATTER;
+
     /** Formatted build date. */
     public static final String BUILD_TSTAMP_STR;
 
@@ -67,7 +71,11 @@ public class IgniteVersionUtils {
         BUILD_TSTAMP = !BUILD_TSTAMP_FROM_PROPERTY.isEmpty() && Long.parseLong(BUILD_TSTAMP_FROM_PROPERTY) != 0
             ? Long.parseLong(BUILD_TSTAMP_FROM_PROPERTY) : System.currentTimeMillis() / 1000;
 
-        BUILD_TSTAMP_STR = new SimpleDateFormat("yyyyMMdd").format(new Date(BUILD_TSTAMP * 1000));
+        BUILD_TSTAMP_DATE_FORMATTER = new SimpleDateFormat("yyyyMMdd");
+
+        BUILD_TSTAMP_DATE_FORMATTER.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+        BUILD_TSTAMP_STR = BUILD_TSTAMP_DATE_FORMATTER.format(new Date(BUILD_TSTAMP * 1000));
 
         COPYRIGHT = BUILD_TSTAMP_STR.substring(0, 4) + " Copyright(C) Apache Software Foundation";
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 26da89e..27a33b9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -698,7 +698,12 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     else if (customMsg instanceof ChangeGlobalStateFinishMessage) {
                         ctx.state().onStateFinishMessage((ChangeGlobalStateFinishMessage)customMsg);
 
-                        updateTopologySnapshot();
+                        Snapshot snapshot = topSnap.get();
+
+                        // Topology version does not change, but need create DiscoCache with new state.
+                        DiscoCache discoCache = snapshot.discoCache.copy(snapshot.topVer, ctx.state().clusterState());
+
+                        topSnap.set(new Snapshot(snapshot.topVer, discoCache));
 
                         incMinorTopVer = false;
                     }
@@ -782,7 +787,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
 
                 if (locJoinEvt || !node.isClient() && !node.isDaemon()) {
                     if (type == EVT_NODE_LEFT || type == EVT_NODE_FAILED || type == EVT_NODE_JOINED) {
-                        boolean discoCacheUpdated = ctx.state().autoAdjustInMemoryClusterState(
+                        boolean discoCacheRecalculationRequired = ctx.state().autoAdjustInMemoryClusterState(
                             node.id(),
                             topSnapshot,
                             discoCache,
@@ -790,10 +795,17 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                             minorTopVer
                         );
 
-                        if (discoCacheUpdated) {
-                            discoCache = discoCache();
+                        if (discoCacheRecalculationRequired) {
+                            discoCache = createDiscoCache(
+                                nextTopVer,
+                                ctx.state().clusterState(),
+                                locNode,
+                                topSnapshot
+                            );
 
                             discoCacheHist.put(nextTopVer, discoCache);
+
+                            topSnap.set(new Snapshot(nextTopVer, discoCache));
                         }
                     }
                 }
@@ -1035,18 +1047,6 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
     }
 
     /**
-     * Update {@link #topSnap} with the latest cluster state.
-     */
-    public void updateTopologySnapshot() {
-        Snapshot snapshot = topSnap.get();
-
-        // Topology version does not change, but need create DiscoCache with new state.
-        DiscoCache discoCache = snapshot.discoCache.copy(snapshot.topVer, ctx.state().clusterState());
-
-        topSnap.set(new Snapshot(snapshot.topVer, discoCache));
-    }
-
-    /**
      * @param type Message type.
      * @param customMsg Custom message.
      * @return {@code True} if should not process message.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index c390c0a..ea51a87 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -2932,7 +2932,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                     err = e;
             }
             catch (Throwable e) {
-                if (!(stop && X.hasCause(e, IgniteInterruptedCheckedException.class)))
+                if (!(e == stopErr || (stop && (X.hasCause(e, IgniteInterruptedCheckedException.class)))))
                     err = e;
             }
             finally {
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
index 7c63338..d45cd93 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
@@ -4502,6 +4502,8 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
                     try {
                         GridFutureAdapter<?> res = new GridFutureAdapter<>();
 
+                        res.listen(fut -> updateHeartbeat());
+
                         asyncRunner.execute(U.wrapIgniteFuture(cmd, res));
 
                         pendingTaskFuture.add(res);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
index 17d4be0..ffade1b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
@@ -1407,7 +1407,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I
      * @param discoCache Discovery cache from the discovery manager.
      * @param topVer Topology version.
      * @param minorTopVer Minor topology version.
-     * @return {@code true} if baseline was changed.
+     * @return {@code true} if baseline was changed and discovery cache recalculation is required.
      */
     public boolean autoAdjustInMemoryClusterState(
         UUID nodeId,
@@ -1464,8 +1464,6 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I
 
                 globalState.localBaselineAutoAdjustment(true);
 
-                ctx.discovery().updateTopologySnapshot();
-
                 return true;
             }
         }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/baseline/autoadjust/BaselineAutoAdjustStatus.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/baseline/autoadjust/BaselineAutoAdjustStatus.java
index a98fa77..4b814ce 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/baseline/autoadjust/BaselineAutoAdjustStatus.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/baseline/autoadjust/BaselineAutoAdjustStatus.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.processors.cluster.baseline.autoadjust;
 
+import org.apache.ignite.internal.util.typedef.internal.S;
+
 /**
  * Statistic of baseline auto-adjust.
  */
@@ -71,6 +73,11 @@ public class BaselineAutoAdjustStatus {
         return taskState;
     }
 
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(BaselineAutoAdjustStatus.class, this);
+    }
+
     /**
      *
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
index f9bba3c..eed9313 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
@@ -40,6 +40,7 @@ import org.apache.ignite.failure.FailureContext;
 import org.apache.ignite.failure.FailureType;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
@@ -1174,6 +1175,9 @@ public class DistributedMetaStorageImpl extends GridProcessorAdapter
             else
                 completeWrite(bridge, new DistributedMetaStorageHistoryItem(msg.key(), msg.value()), false, true);
         }
+        catch (IgniteInterruptedCheckedException e) {
+            throw U.convertException(e);
+        }
         catch (IgniteCheckedException | Error e) {
             throw criticalError(e);
         }
diff --git a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
index 96c5365..4af513b 100644
--- a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
@@ -21,11 +21,11 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.IgniteVersionUtils;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.jetbrains.annotations.NotNull;
 
@@ -259,7 +259,7 @@ public class IgniteProductVersion implements Comparable<IgniteProductVersion>, E
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        String revTsStr = new SimpleDateFormat("yyyyMMdd").format(new Date(revTs * 1000));
+        String revTsStr = IgniteVersionUtils.BUILD_TSTAMP_DATE_FORMATTER.format(new Date(revTs * 1000));
 
         String hash = U.byteArray2HexString(revHash).toLowerCase();
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
index cab5efa..64cef84 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
@@ -19,7 +19,10 @@ package org.apache.ignite.internal.processors.cache.persistence;
 
 import java.io.File;
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.file.OpenOption;
+import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.ignite.Ignite;
@@ -53,7 +56,6 @@ import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.PagePartitionMetaIO;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiClosure;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
@@ -336,9 +338,18 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
     public void testReadOnlyMetaStore() throws Exception {
         IgniteEx ignite0 = startGrid(0);
 
+        AtomicReference<File> readOnlyFile = new AtomicReference<>();
+
+        failingFileIOFactory.createClosure((file, options) -> {
+            if (Arrays.asList(options).contains(StandardOpenOption.WRITE) && file.equals(readOnlyFile.get()))
+                throw new IOException("File is readonly.");
+
+            return null;
+        });
+
         ignite0.cluster().active(true);
 
-        IgniteInternalCache cache = ignite0.cachex(CACHE_NAME1);
+        IgniteInternalCache<Integer, Integer> cache = ignite0.cachex(CACHE_NAME1);
 
         cache.put(1, 1);
 
@@ -350,27 +361,22 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
         File metaStoreDir = new File(workDir, MetaStorage.METASTORAGE_CACHE_NAME.toLowerCase());
         File metaStoreFile = new File(metaStoreDir, String.format(FilePageStoreManager.PART_FILE_TEMPLATE, 0));
 
-        metaStoreFile.setWritable(false);
+        readOnlyFile.set(metaStoreFile);
 
-        try {
-            IgniteInternalFuture fut = GridTestUtils.runAsync(new Runnable() {
-                @Override public void run() {
-                    try {
-                        ignite0.cluster().active(true);
-                    }
-                    catch (Exception ignore) {
-                        // No-op.
-                    }
+        IgniteInternalFuture fut = GridTestUtils.runAsync(new Runnable() {
+            @Override public void run() {
+                try {
+                    ignite0.cluster().active(true);
+                }
+                catch (Exception ignore) {
+                    // No-op.
                 }
-            });
+            }
+        });
 
-            waitFailure(IOException.class);
+        waitFailure(IOException.class);
 
-            fut.cancel();
-        }
-        finally {
-            metaStoreFile.setWritable(true);
-        }
+        fut.cancel();
     }
 
 
@@ -390,9 +396,9 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
         AtomicBoolean fail = new AtomicBoolean(true);
         AtomicReference<FileIO> ref = new AtomicReference<>();
 
-        failingFileIOFactory.createClosure(new IgniteBiClosure<File, OpenOption[], FileIO>() {
+        failingFileIOFactory.createClosure(new IgniteBiClosureX<File, OpenOption[], FileIO>() {
             @Override public FileIO apply(File file, OpenOption[] options) {
-                if (file.getName().indexOf("-END.bin") >= 0) {
+                if (file.getName().contains("-END.bin")) {
                     FileIO delegate;
 
                     try {
@@ -486,7 +492,7 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
         private final FileIOFactory delegateFactory = new RandomAccessFileIOFactory();
 
         /** Create FileIO closure. */
-        private volatile IgniteBiClosure<File, OpenOption[], FileIO> createClo;
+        private volatile IgniteBiClosureX<File, OpenOption[], FileIO> createClo;
 
         /** {@inheritDoc} */
         @Override public FileIO create(File file, OpenOption... openOption) throws IOException {
@@ -500,7 +506,7 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
         /**
          * @param createClo FileIO create closure.
          */
-        public void createClosure(IgniteBiClosure<File, OpenOption[], FileIO> createClo) {
+        public void createClosure(IgniteBiClosureX<File, OpenOption[], FileIO> createClo) {
             this.createClo = createClo;
         }
 
@@ -511,4 +517,10 @@ public class IgnitePdsCorruptedStoreTest extends GridCommonAbstractTest {
             return delegateFactory;
         }
     }
+
+    /** */
+    private interface IgniteBiClosureX<E1, E2, R> extends Serializable {
+        /** */
+        R apply(E1 e1, E2 e2) throws IOException;
+    }
 }
diff --git a/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineLoaderTest.java b/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineLoaderTest.java
index 4982d89..4436b1f 100644
--- a/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineLoaderTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineLoaderTest.java
@@ -17,9 +17,11 @@
 
 package org.apache.ignite.startup.cmdline;
 
+import java.util.concurrent.CountDownLatch;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
+import org.apache.ignite.Ignition;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -81,32 +83,43 @@ public class GridCommandLineLoaderTest extends GridCommonAbstractTest {
      * Kills node after it is started.
      */
     public static class KillerLifecycleBean implements LifecycleBean {
+        /**
+         * Latch for wainting start both nodes from sping xml config.
+         */
+        private static final CountDownLatch INIT_TWO_NODES_LATCH = new CountDownLatch(2);
+
         /** */
         @IgniteInstanceResource
         private Ignite ignite;
 
-        /** */
+        /**
+         *
+         */
         @Override public void onLifecycleEvent(LifecycleEventType evt) throws IgniteException {
             if (evt == LifecycleEventType.AFTER_NODE_START) {
                 System.setProperty(IGNITE_RESTART_CODE, Integer.toString(
                     1 + IgniteSystemProperties.getInteger(IGNITE_RESTART_CODE, 0)));
 
-                System.out.println("Ignite instance seen, will shut it down.");
+                String name = ignite.name();
+
+                System.out.println("Ignite instance seen, will shut it down. Name=" + name);
 
                 new Thread(new Runnable() {
                     @Override public void run() {
                         try {
-                            Thread.sleep(3000);
+                            INIT_TWO_NODES_LATCH.await();
                         }
                         catch (InterruptedException e) {
                             e.printStackTrace();
                         }
 
-                        System.out.println("Shutdown imminent.");
+                        System.out.println("Shutdown imminent. Name=" + name);
 
-                        ignite.close();
+                        Ignition.stop(name, true);
                     }
                 }).start();
+
+                INIT_TWO_NODES_LATCH.countDown();
             }
         }
     }