You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ni...@apache.org on 2021/06/29 16:34:19 UTC

[ignite] branch master updated: IGNITE-14990 Incorrect values of cache, cache group, data region metrics after cluster re-activation (#9195)

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

nizhikov 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 3b7809b  IGNITE-14990 Incorrect values of cache, cache group, data region metrics after cluster re-activation (#9195)
3b7809b is described below

commit 3b7809bc0d6d689cd19ecc0b1b33c78b18a1c56f
Author: Nikita Amelchev <ns...@gmail.com>
AuthorDate: Tue Jun 29 19:34:00 2021 +0300

    IGNITE-14990 Incorrect values of cache, cache group, data region metrics after cluster re-activation (#9195)
---
 .../processors/cache/CacheGroupContext.java        |   8 +-
 .../processors/cache/CacheGroupMetricsImpl.java    |  14 +-
 .../processors/cache/GridCacheAdapter.java         |  10 +-
 .../processors/cache/GridCacheProcessor.java       |  12 +-
 .../cache/persistence/DataRegionMetricsImpl.java   |   5 +
 .../IgniteCacheDatabaseSharedManager.java          |   2 +
 .../processors/metric/GridMetricManager.java       |  13 ++
 .../internal/metric/CacheMetricsAddRemoveTest.java |  86 ++++++--
 .../metric/MetricsClusterActivationTest.java       | 220 +++++++++++++++++++++
 .../IgniteSequenceInternalCleanupTest.java         |   4 +-
 .../ignite/testsuites/IgniteBasicTestSuite.java    |   2 +
 11 files changed, 342 insertions(+), 34 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
index 8492982..82d64b3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
@@ -1305,12 +1305,14 @@ public class CacheGroupContext {
 
     /**
      * Removes statistics metrics registries.
+     *
+     * @param destroy Group destroy flag.
      */
-    public void removeIOStatistic() {
+    public void removeIOStatistic(boolean destroy) {
         if (statHolderData != IoStatisticsHolderNoOp.INSTANCE)
-            ctx.kernalContext().metric().remove(statHolderData.metricRegistryName());
+            ctx.kernalContext().metric().remove(statHolderData.metricRegistryName(), destroy);
 
         if (statHolderIdx != IoStatisticsHolderNoOp.INSTANCE)
-            ctx.kernalContext().metric().remove(statHolderIdx.metricRegistryName());
+            ctx.kernalContext().metric().remove(statHolderIdx.metricRegistryName(), destroy);
     }
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsImpl.java
index 3fa3bbd..ced091d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupMetricsImpl.java
@@ -493,17 +493,21 @@ public class CacheGroupMetricsImpl {
         return sparseStorageSize == null ? 0 : sparseStorageSize.value();
     }
 
-    /** Removes all metric for cache group. */
-    public void remove() {
+    /**
+     * Removes all metric for cache group.
+     *
+     * @param destroy Group destroy flag.
+     */
+    public void remove(boolean destroy) {
         if (ctx.shared().kernalContext().isStopping())
             return;
 
         if (ctx.config().getNearConfiguration() != null)
-            ctx.shared().kernalContext().metric().remove(cacheMetricsRegistryName(ctx.config().getName(), true));
+            ctx.shared().kernalContext().metric().remove(cacheMetricsRegistryName(ctx.config().getName(), true), destroy);
 
-        ctx.shared().kernalContext().metric().remove(cacheMetricsRegistryName(ctx.config().getName(), false));
+        ctx.shared().kernalContext().metric().remove(cacheMetricsRegistryName(ctx.config().getName(), false), destroy);
 
-        ctx.shared().kernalContext().metric().remove(metricGroupName());
+        ctx.shared().kernalContext().metric().remove(metricGroupName(), destroy);
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index 8a8e204..c8aeae5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -650,10 +650,14 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
         lastFut = null;
     }
 
-    /** Remove cache metrics. */
-    public void removeMetrics() {
+    /**
+     * Remove cache metrics.
+     *
+     * @param destroy Group destroy flag.
+     */
+    public void removeMetrics(boolean destroy) {
         if (!ctx.kernalContext().isStopping())
-            ctx.kernalContext().metric().remove(cacheMetricsRegistryName(ctx.name(), isNear()));
+            ctx.kernalContext().metric().remove(cacheMetricsRegistryName(ctx.name(), isNear()), destroy);
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 6ef5047..5d129f0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -560,11 +560,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             }
         }
 
-        if (destroy) {
-            grp.metrics().remove();
+        grp.metrics().remove(destroy);
 
-            grp.removeIOStatistic();
-        }
+        grp.removeIOStatistic(destroy);
 
         sharedCtx.evict().cleanupRemovedGroup(grp.groupId());
 
@@ -1039,8 +1037,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
             cache.stop();
 
-            if (destroy)
-                cache.removeMetrics();
+            cache.removeMetrics(destroy);
 
             GridCacheContextInfo cacheInfo = new GridCacheContextInfo(ctx, false);
 
@@ -1056,8 +1053,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 if (dht != null) {
                     dht.stop();
 
-                    if (destroy)
-                        dht.removeMetrics();
+                    dht.removeMetrics(destroy);
 
                     GridCacheContext<?, ?> dhtCtx = dht.context();
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
index 1530d54..6d15f09 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/DataRegionMetricsImpl.java
@@ -726,6 +726,11 @@ public class DataRegionMetricsImpl implements DataRegionMetrics {
             metrics.reset();
     }
 
+    /** Removes all metric for data region. */
+    public void remove() {
+        kernalCtx.metric().remove(metricRegistry().name(), false);
+    }
+
     /** @param time Time to add to {@code totalThrottlingTime} metric in milliseconds. */
     public void addThrottlingTime(long time) {
         if (kernalCtx.performanceStatistics().enabled())
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
index af8f785..e7ee0b1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
@@ -1496,6 +1496,8 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
                 MBEAN_GROUP_NAME,
                 region.metrics().getName()
             );
+
+            region.metrics().remove();
         }
 
         dataRegionMap.clear();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
index 3527bc0..48c9aef 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java
@@ -410,11 +410,24 @@ public class GridMetricManager extends GridManagerAdapter<MetricExporterSpi> imp
      * @param regName Metric registry name.
      */
     public void remove(String regName) {
+        remove(regName, true);
+    }
+
+    /**
+     * Removes metric registry.
+     *
+     * @param regName Metric registry name.
+     * @param removeCfg {@code True} if remove metric configurations.
+     */
+    public void remove(String regName, boolean removeCfg) {
         GridCompoundFuture opsFut = new GridCompoundFuture<>();
 
         registries.computeIfPresent(regName, (key, mreg) -> {
             notifyListeners(mreg, metricRegRemoveLsnrs, log);
 
+            if (!removeCfg)
+                return null;
+
             DistributedMetaStorage metastorage0 = metastorage;
 
             if (metastorage0 == null)
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/CacheMetricsAddRemoveTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/CacheMetricsAddRemoveTest.java
index 1cdb6de..0d71d6a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/CacheMetricsAddRemoveTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/CacheMetricsAddRemoveTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.metric;
 
 import java.util.Arrays;
+import com.google.common.collect.Iterators;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.configuration.CacheConfiguration;
@@ -28,6 +29,8 @@ import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.processors.metric.GridMetricManager;
 import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
+import org.apache.ignite.spi.metric.HistogramMetric;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.jetbrains.annotations.Nullable;
 import org.junit.Test;
@@ -36,6 +39,7 @@ import org.junit.runners.Parameterized;
 
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.cacheMetricsRegistryName;
 import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
+import static org.junit.Assert.assertArrayEquals;
 
 /** */
 @RunWith(Parameterized.class)
@@ -46,6 +50,12 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
     /** */
     public static final String CACHE_PUTS = "CachePuts";
 
+    /** */
+    public static final String GET_TIME = "GetTime";
+
+    /** Test bounds. */
+    public static final long[] BOUNDS = new long[] {50, 100};
+
     /** Cache modes. */
     @Parameterized.Parameters(name = "cacheMode={0},nearEnabled={1}")
     public static Iterable<Object[]> params() {
@@ -100,12 +110,12 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
 
     /** */
     @Test
-    public void testCacheMetricsNotRemovedOnStop() throws Exception {
+    public void testCacheMetricsConfigurationNotRemovedOnStop() throws Exception {
         String cachePrefix = cacheMetricsRegistryName("other-cache", false);
 
         checkMetricsEmpty(cachePrefix);
 
-        createCache("persisted", "other-cache");
+        createCache("persisted", "other-cache", null);
 
         grid("client").cache("other-cache").put(1L, 1L);
 
@@ -114,17 +124,55 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
         //Cache will be stopped during deactivation.
         grid("client").cluster().state(ClusterState.INACTIVE);
 
+        checkMetricsEmpty(cachePrefix);
+
+        grid("client").cluster().state(ClusterState.ACTIVE);
+
+        assertEquals(1L, grid("client").cache("other-cache").get(1L));
+
         checkMetricsNotEmpty(cachePrefix);
 
+        destroyCache();
+
+        checkMetricsEmpty(cachePrefix);
+    }
+
+    /** */
+    @Test
+    public void testCacheMetricsConfigurationNotRemovedOnStopTwoCachesPerGroup() throws Exception {
+        String cachePrefix = cacheMetricsRegistryName("other-cache", false);
+        String cachePrefix2 = cacheMetricsRegistryName("other-cache2", false);
+
+        checkMetricsEmpty(cachePrefix);
+        checkMetricsEmpty(cachePrefix2);
+
+        createCache("persisted", "other-cache", "testGroupName");
+        createCache("persisted", "other-cache2", "testGroupName");
+
+        grid("client").cache("other-cache").put(1L, 1L);
+        grid("client").cache("other-cache2").put(1L, 1L);
+
+        checkMetricsNotEmpty(cachePrefix);
+        checkMetricsNotEmpty(cachePrefix2);
+
+        //Cache will be stopped during deactivation.
+        grid("client").cluster().state(ClusterState.INACTIVE);
+
+        checkMetricsEmpty(cachePrefix);
+        checkMetricsEmpty(cachePrefix2);
+
         grid("client").cluster().state(ClusterState.ACTIVE);
 
         assertEquals(1L, grid("client").cache("other-cache").get(1L));
+        assertEquals(1L, grid("client").cache("other-cache2").get(1L));
 
         checkMetricsNotEmpty(cachePrefix);
+        checkMetricsNotEmpty(cachePrefix2);
 
         destroyCache();
 
         checkMetricsEmpty(cachePrefix);
+        checkMetricsEmpty(cachePrefix2);
     }
 
     /** */
@@ -138,12 +186,13 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
     }
 
     /** */
-    private void createCache() throws InterruptedException {
-        createCache(null, null);
+    private void createCache() throws Exception {
+        createCache(null, null, null);
     }
 
     /** */
-    private void createCache(@Nullable String dataRegionName, @Nullable String cacheName) throws InterruptedException {
+    private void createCache(@Nullable String dataRegionName, @Nullable String cacheName,
+        @Nullable String groupName) throws Exception {
         CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
 
         if (dataRegionName != null)
@@ -152,12 +201,25 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
         if (cacheName != null)
             ccfg.setName(cacheName);
 
+        if (groupName != null)
+            ccfg.setGroupName(groupName);
+
         if (nearEnabled)
             ccfg.setNearConfiguration(new NearCacheConfiguration());
 
         grid("client").createCache(ccfg);
 
         awaitPartitionMapExchange();
+
+        grid("client").context().metric().configureHistogram(
+            MetricUtils.metricName(cacheMetricsRegistryName(ccfg.getName(), false), GET_TIME),
+            BOUNDS);
+
+        if (nearEnabled) {
+            grid("client").context().metric().configureHistogram(
+                MetricUtils.metricName(cacheMetricsRegistryName(ccfg.getName(), true), GET_TIME),
+                BOUNDS);
+        }
     }
 
     /** */
@@ -169,12 +231,16 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
 
             assertNotNull(mreg.findMetric(CACHE_GETS));
             assertNotNull(mreg.findMetric(CACHE_PUTS));
+            assertNotNull(mreg.findMetric(GET_TIME));
+            assertArrayEquals(BOUNDS, mreg.<HistogramMetric>findMetric(GET_TIME).bounds());
 
             if (nearEnabled) {
                 mreg = mmgr.registry(metricName(cachePrefix, "near"));
 
                 assertNotNull(mreg.findMetric(CACHE_GETS));
                 assertNotNull(mreg.findMetric(CACHE_PUTS));
+                assertNotNull(mreg.findMetric(GET_TIME));
+                assertArrayEquals(BOUNDS, mreg.<HistogramMetric>findMetric(GET_TIME).bounds());
             }
         }
     }
@@ -184,16 +250,12 @@ public class CacheMetricsAddRemoveTest extends GridCommonAbstractTest {
         for (int i = 0; i < 3; i++) {
             GridMetricManager mmgr = metricManager(i);
 
-            MetricRegistry mreg = mmgr.registry(cachePrefix);
-
-            assertNull(mreg.findMetric(metricName(cachePrefix, CACHE_GETS)));
-            assertNull(mreg.findMetric(metricName(cachePrefix, CACHE_PUTS)));
+            assertFalse(Iterators.tryFind(mmgr.iterator(), reg -> cachePrefix.equals(reg.name())).isPresent());
 
             if (nearEnabled) {
-                mreg = mmgr.registry(metricName(cachePrefix, "near"));
+                String regName = metricName(cachePrefix, "near");
 
-                assertNull(mreg.findMetric(CACHE_GETS));
-                assertNull(mreg.findMetric(CACHE_PUTS));
+                assertFalse(Iterators.tryFind(mmgr.iterator(), reg -> regName.equals(reg.name())).isPresent());
             }
         }
     }
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsClusterActivationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsClusterActivationTest.java
new file mode 100644
index 0000000..5fa5341
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsClusterActivationTest.java
@@ -0,0 +1,220 @@
+/*
+ * 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.internal.metric;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.cluster.ClusterState;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.cache.persistence.DataRegion;
+import org.apache.ignite.internal.processors.metric.MetricRegistry;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.spi.metric.IntMetric;
+import org.apache.ignite.spi.metric.LongMetric;
+import org.apache.ignite.spi.metric.ObjectMetric;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import static org.apache.ignite.configuration.DataStorageConfiguration.DFLT_DATA_REG_DEFAULT_NAME;
+import static org.apache.ignite.internal.processors.cache.CacheGroupMetricsImpl.CACHE_GROUP_METRICS_PREFIX;
+import static org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl.DATAREGION_METRICS_PREFIX;
+import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.cacheMetricsRegistryName;
+import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
+
+/**
+ * Tests metrics on a cluster activation.
+ */
+@RunWith(Parameterized.class)
+public class MetricsClusterActivationTest extends GridCommonAbstractTest {
+    /** */
+    public static final int ENTRY_CNT = 50;
+
+    /** */
+    public static final int BACKUPS = 2;
+
+    /** Persistence enabled flag. */
+    @Parameterized.Parameter
+    public boolean isPersistenceEnabled;
+
+    /** @return Test parameters. */
+    @Parameterized.Parameters(name = "isPersistenceEnabled={0}")
+    public static Collection<?> parameters() {
+        return Arrays.asList(new Object[][] {{false}, {true}});
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        cfg.setDataStorageConfiguration(
+            new DataStorageConfiguration().setDefaultDataRegionConfiguration(
+                new DataRegionConfiguration()
+                    .setPersistenceEnabled(isPersistenceEnabled)
+                    .setMetricsEnabled(true))
+        );
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        if (isPersistenceEnabled)
+            cleanPersistenceDir();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+
+        if (isPersistenceEnabled)
+            cleanPersistenceDir();
+    }
+
+    /** @throws Exception If failed. */
+    @Test
+    public void testReActivate() throws Exception {
+        IgniteEx ignite = startGrids(3);
+
+        ignite.cluster().state(ClusterState.ACTIVE);
+
+        IgniteCache<Object, Object> cache = ignite.getOrCreateCache(
+            new CacheConfiguration<>(DEFAULT_CACHE_NAME)
+                .setStatisticsEnabled(true)
+                .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
+                .setBackups(BACKUPS));
+
+        for (int i = 0; i < ENTRY_CNT; i++)
+            cache.put(i, i);
+
+        // Pause rebalance to check instant partitions states.
+        grid(0).rebalanceEnabled(false);
+        grid(1).rebalanceEnabled(false);
+        stopGrid(2);
+
+        checkMetrics(true);
+
+        for (int i = 0; i < 3; i++) {
+            ignite.cluster().state(ClusterState.INACTIVE);
+
+            checkMetrics(false);
+
+            ignite.cluster().state(ClusterState.ACTIVE);
+
+            checkMetrics(isPersistenceEnabled);
+        }
+    }
+
+    /** Checks metrics. */
+    private void checkMetrics(boolean expEntries) throws IgniteCheckedException {
+        for (IgniteEx ignite : F.transform(G.allGrids(), ignite -> (IgniteEx)ignite)) {
+            checkDataRegionMetrics(ignite);
+
+            checkCacheGroupsMetrics(ignite);
+
+            checkCacheMetrics(ignite, expEntries);
+        }
+    }
+
+    /** Checks data region metrics. */
+    private void checkDataRegionMetrics(IgniteEx ignite) throws IgniteCheckedException {
+        DataRegion region = ignite.context().cache().context().database().dataRegion(DFLT_DATA_REG_DEFAULT_NAME);
+
+        MetricRegistry mreg = ignite.context().metric().registry(metricName(DATAREGION_METRICS_PREFIX,
+            DFLT_DATA_REG_DEFAULT_NAME));
+
+        if (!ignite.cluster().state().active()) {
+            assertEquals(0, F.size(mreg.iterator()));
+
+            return;
+        }
+
+        long offHeapSize = mreg.<LongMetric>findMetric("OffHeapSize").value();
+        long initialSize = mreg.<LongMetric>findMetric("InitialSize").value();
+        long maxSize = mreg.<LongMetric>findMetric("MaxSize").value();
+
+        assertTrue(offHeapSize > 0);
+        assertTrue(offHeapSize <= region.config().getMaxSize());
+        assertEquals(region.config().getInitialSize(), initialSize);
+        assertEquals(region.config().getMaxSize(), maxSize);
+    }
+
+    /** Checks cache groups metrics. */
+    private void checkCacheGroupsMetrics(IgniteEx ignite) {
+        MetricRegistry mreg = ignite.context().metric().registry(metricName(CACHE_GROUP_METRICS_PREFIX,
+            DEFAULT_CACHE_NAME));
+
+        if (!ignite.cluster().state().active()) {
+            assertEquals(0, F.size(mreg.iterator()));
+
+            return;
+        }
+
+        int minimumNumberOfPartitionCopies = mreg.<IntMetric>findMetric("MinimumNumberOfPartitionCopies").value();
+        int maximumNumberOfPartitionCopies = mreg.<IntMetric>findMetric("MaximumNumberOfPartitionCopies").value();
+        Map<Integer, List<String>> owningPartitionsAllocationMap = mreg.
+            <ObjectMetric<Map<Integer, List<String>>>>findMetric("OwningPartitionsAllocationMap").value();
+        Map<Integer, List<String>> movingPartitionsAllocationMap = mreg.
+            <ObjectMetric<Map<Integer, List<String>>>>findMetric("MovingPartitionsAllocationMap").value();
+
+        assertEquals(BACKUPS, minimumNumberOfPartitionCopies);
+        assertEquals(BACKUPS, maximumNumberOfPartitionCopies);
+        assertFalse(owningPartitionsAllocationMap.isEmpty());
+        assertFalse(movingPartitionsAllocationMap.isEmpty());
+    }
+
+    /** Checks cache metrics. */
+    private void checkCacheMetrics(IgniteEx ignite, boolean expEntries) {
+        MetricRegistry mreg = ignite.context().metric().registry(cacheMetricsRegistryName(DEFAULT_CACHE_NAME, false));
+
+        if (!ignite.cluster().state().active()) {
+            assertEquals(0, F.size(mreg.iterator()));
+
+            return;
+        }
+
+        long offHeapEntriesCount = mreg.<LongMetric>findMetric("OffHeapEntriesCount").value();
+        long offHeapPrimaryEntriesCount = mreg.<LongMetric>findMetric("OffHeapPrimaryEntriesCount").value();
+        long offHeapBackupEntriesCount = mreg.<LongMetric>findMetric("OffHeapBackupEntriesCount").value();
+
+        if (expEntries) {
+            assertEquals(ENTRY_CNT, offHeapEntriesCount);
+            assertTrue(offHeapPrimaryEntriesCount > 0);
+            assertTrue(offHeapBackupEntriesCount > 0);
+        }
+        else {
+            assertEquals(0, offHeapEntriesCount);
+            assertEquals(0, offHeapPrimaryEntriesCount);
+            assertEquals(0, offHeapBackupEntriesCount);
+        }
+    }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSequenceInternalCleanupTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSequenceInternalCleanupTest.java
index b21f225..fceceff 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSequenceInternalCleanupTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSequenceInternalCleanupTest.java
@@ -113,11 +113,9 @@ public class IgniteSequenceInternalCleanupTest extends GridCommonAbstractTest {
 
             ignite.cluster().active(true);
 
-            doSleep(500);
-
             long putsAfter = ignite.cache("test0").metrics().getCachePuts();
 
-            assertEquals(1, putsAfter);
+            assertEquals(0, putsAfter);
         }
         finally {
             stopAllGrids();
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
index abb6a20..62dd926 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
@@ -56,6 +56,7 @@ import org.apache.ignite.internal.managers.IgniteDiagnosticMessagesMultipleConne
 import org.apache.ignite.internal.managers.IgniteDiagnosticMessagesTest;
 import org.apache.ignite.internal.managers.communication.GridIoManagerFileTransmissionSelfTest;
 import org.apache.ignite.internal.managers.discovery.IncompleteDeserializationExceptionTest;
+import org.apache.ignite.internal.metric.MetricsClusterActivationTest;
 import org.apache.ignite.internal.mxbean.IgniteStandardMXBeanTest;
 import org.apache.ignite.internal.pagemem.wal.record.WALRecordSerializationTest;
 import org.apache.ignite.internal.pagemem.wal.record.WALRecordTest;
@@ -236,6 +237,7 @@ import org.junit.runners.Suite;
     IndexStorageSelfTest.class,
     CacheFreeListSelfTest.class,
     DataRegionMetricsSelfTest.class,
+    MetricsClusterActivationTest.class,
     SwapPathConstructionSelfTest.class,
     BitSetIntSetTest.class,
     ImmutableIntSetTest.class,