You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/03/10 07:23:48 UTC

[27/43] ignite git commit: IGNITE-4694 Add tests to check there are no memory leaks in PageMemory

IGNITE-4694 Add tests to check there are no memory leaks in PageMemory


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/25c19276
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/25c19276
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/25c19276

Branch: refs/heads/ignite-4712
Commit: 25c192762aae86d60e689e9cfd90f501618ea753
Parents: 88c04bb
Author: Igor Seliverstov <gv...@gmail.com>
Authored: Wed Feb 15 18:04:38 2017 +0300
Committer: Igor Seliverstov <gv...@gmail.com>
Committed: Wed Mar 1 10:44:54 2017 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheOffheapManagerImpl.java    |   2 +-
 .../database/IgniteDbAbstractTest.java          |   6 +
 .../IgniteDbMemoryLeakAbstractTest.java         | 172 ++++++++++++++-----
 .../database/IgniteDbMemoryLeakIndexedTest.java |  65 +------
 .../IgniteDbMemoryLeakLargeObjectsTest.java     |  64 ++-----
 .../IgniteDbMemoryLeakLargePagesTest.java       |  67 ++------
 .../database/IgniteDbMemoryLeakTest.java        |  63 ++-----
 .../IgniteDbMemoryLeakWithExpirationTest.java   |  58 +------
 8 files changed, 182 insertions(+), 315 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index b863edd..ad3663c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -906,7 +906,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
          */
         private boolean canUpdateOldRow(@Nullable CacheDataRow oldRow, DataRow dataRow)
             throws IgniteCheckedException {
-            if (oldRow == null || indexingEnabled)
+            if (oldRow == null || indexingEnabled || oldRow.expireTime() != dataRow.expireTime())
                 return false;
 
             if (oldRow.expireTime() != dataRow.expireTime())

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbAbstractTest.java
index 3bc7004..9297cec 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbAbstractTest.java
@@ -130,10 +130,16 @@ public abstract class IgniteDbAbstractTest extends GridCommonAbstractTest {
         return cfg;
     }
 
+    /**
+     * @param cfg IgniteConfiguration.
+     */
     protected void configure(IgniteConfiguration cfg){
         //NOP
     }
 
+    /**
+     * @param mCfg MemoryConfiguration.
+     */
     protected void configure(MemoryConfiguration mCfg){
         //NOP
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakAbstractTest.java
index fc0e715..bca3af0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakAbstractTest.java
@@ -17,69 +17,157 @@
 
 package org.apache.ignite.internal.processors.database;
 
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCompute;
-import org.apache.ignite.compute.ComputeTaskFuture;
-import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.lang.IgniteRunnable;
-import org.apache.ignite.resources.IgniteInstanceResource;
-
+import java.util.Random;
 import java.util.concurrent.TimeUnit;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.MemoryConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.GridRandom;
+import org.jetbrains.annotations.NotNull;
 
 /**
- * TODO: fix javadoc warnings, code style.
+ * Base class for memory leaks tests.
  */
 public abstract class IgniteDbMemoryLeakAbstractTest extends IgniteDbAbstractTest {
-    // TODO: take duration from system property.
-    /** Test duration in seconds*/
-    protected abstract int duration();
-
-    @Override
-    protected long getTestTimeout() {
-        return duration() * 1200;
-    }
 
     /** */
-    protected abstract void operation(IgniteEx ig);
+    private volatile Exception ex = null;
 
     /** */
-    public void testMemoryLeak() throws Exception {
-        // TODO: take PageMemory max size is the same as we configured.
+    private static final ThreadLocal<Random> THREAD_LOCAL_RANDOM = new ThreadLocal<>();
 
-        final long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(duration());
+    /** {@inheritDoc} */
+    @Override protected void configure(IgniteConfiguration cfg) {
+        cfg.setMetricsLogFrequency(5000);
+    }
 
-        // TODO: use threads instead of compute or make sure there are enough threads in pool.
-        int tasksCnt = Runtime.getRuntime().availableProcessors() * 4;
+    /** {@inheritDoc} */
+    @Override protected void configure(MemoryConfiguration mCfg) {
+        int concLvl = Runtime.getRuntime().availableProcessors();
 
-        IgniteCompute compute = grid(0).compute().withAsync();
+        mCfg.setConcurrencyLevel(concLvl);
+        mCfg.setPageCacheSize(1024 * 1024 * concLvl); //minimal possible value
+    }
 
-        ComputeTaskFuture[] futs = new ComputeTaskFuture[tasksCnt];
+    /**
+     * @return Test duration in seconds.
+     */
+    protected int duration() {
+        return 300;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected int gridCount() {
+        return 1;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean indexingEnabled() {
+        return false;
+    }
 
-        for (int i = 0; i < tasksCnt; i++) {
-            compute.run(new IgniteRunnable() {
-                @IgniteInstanceResource
-                private Ignite ig;
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return (duration() + 1) * 1000;
+    }
 
-                @Override
-                public void run() {
-                    int i = 0;
-                    while (System.nanoTime() < end) {
-                        operation((IgniteEx) ig);
+    /**
+     * @param ig Ignite instance.
+     * @return IgniteCache.
+     */
+    protected abstract IgniteCache<Object,Object> cache(IgniteEx ig);
+
+    /**
+     * @return Cache key to perform an operation.
+     */
+    protected abstract Object key();
+
+    /**
+     * @return Cache value to perform an operation.
+     * @param key Cache key to perform an operation.
+     */
+    protected abstract Object value(Object key);
+
+    /**
+     * @param cache IgniteCache.
+     */
+    protected void operation(IgniteCache<Object, Object> cache) {
+        Object key = key();
+        Object value = value(key);
+
+        switch (getRandom().nextInt(3)) {
+            case 0:
+                cache.getAndPut(key, value);
+            case 1:
+                cache.get(key);
+                break;
+            case 2:
+                cache.getAndRemove(key);
+        }
+    }
 
-                        if(i++ == 100) {
-                            check((IgniteEx) ig);
-                            i = 0;
-                        }
+    /**
+     * @return Random.
+     */
+    @NotNull protected static Random getRandom() {
+        Random rnd = THREAD_LOCAL_RANDOM.get();
+
+        if(rnd == null){
+            rnd = new GridRandom();
+            THREAD_LOCAL_RANDOM.set(rnd);
+        }
+
+        return rnd;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testMemoryLeak() throws Exception {
+        final long end = System.nanoTime() + TimeUnit.SECONDS.toNanos(duration());
+
+        final IgniteEx ignite = grid(0);
+        final IgniteCache<Object, Object> cache = cache(ignite);
+
+        Runnable target = new Runnable() {
+            @Override public void run() {
+                while (ex == null && System.nanoTime() < end) {
+                    try {
+                        operation(cache);
+                        check(ignite);
+                    }
+                    catch (Exception e) {
+                        ex = e;
+
+                        break;
                     }
                 }
-            });
+            }
+        };
+
+        Thread[] threads = new Thread[Runtime.getRuntime().availableProcessors()];
 
-            futs[i] = compute.future();
+        for (int i = 0; i < threads.length; i++) {
+            threads[i] = new Thread(target);
+            threads[i].start();
         }
 
-        for (ComputeTaskFuture fut : futs)
-            fut.get();
+        for (Thread thread : threads) {
+            thread.join();
+        }
+
+        if(ex != null){
+            throw ex;
+        }
     }
 
-    protected void check(IgniteEx ig) {}
+    /**
+     * Callback to check the current state
+     *
+     * @param ig Ignite instance
+     * @throws Exception If failed.
+     */
+    protected void check(IgniteEx ig) throws Exception {
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakIndexedTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakIndexedTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakIndexedTest.java
index db77131..acc6c2f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakIndexedTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakIndexedTest.java
@@ -17,72 +17,13 @@
 
 package org.apache.ignite.internal.processors.database;
 
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.MemoryConfiguration;
-import org.apache.ignite.internal.IgniteEx;
-
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
 /**
  *
  */
-public class IgniteDbMemoryLeakIndexedTest extends IgniteDbMemoryLeakAbstractTest {
-
-    @Override
-    protected int duration() {
-        return 300;
-    }
-
-    @Override
-    protected int gridCount() {
-        return 1;
-    }
-
-    @Override
-    protected void configure(IgniteConfiguration cfg) {
-        cfg.setMetricsLogFrequency(5000);
-    }
-
-    @Override
-    protected void configure(MemoryConfiguration mCfg) {
-        mCfg.setPageCacheSize(1024 * 1024);
-    }
+public class IgniteDbMemoryLeakIndexedTest extends IgniteDbMemoryLeakTest {
 
-    @Override
-    // TODO: move test to module ignite-indexing.
-    protected boolean indexingEnabled() {
+    /** {@inheritDoc} */
+    @Override protected boolean indexingEnabled() {
         return true;
     }
-
-    protected void operation(IgniteEx ig){
-        IgniteCache<Object, Object> cache = ig.cache("non-primitive");
-        Random rnd = ThreadLocalRandom.current();
-
-        for (int i = 0; i < 1000; i++) {
-            DbKey key = new DbKey(rnd.nextInt(200_000));
-
-            DbValue v0 = new DbValue(key.val, "test-value-" + rnd.nextInt(200), rnd.nextInt(500));
-
-            // TODO: also execute sql queries.
-
-            switch (rnd.nextInt(3)) {
-                case 0:
-                    cache.getAndPut(key, v0);
-                case 1:
-                    cache.get(key);
-                    break;
-                case 2:
-                    cache.getAndRemove(key);
-            }
-        }
-    }
-
-    @Override
-    protected void check(IgniteEx ig) {
-        long pages = ig.context().cache().context().database().pageMemory().loadedPages();
-
-        assertTrue(pages < 19100);
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
index 2a6c8cd..8943743 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargeObjectsTest.java
@@ -18,13 +18,8 @@
 package org.apache.ignite.internal.processors.database;
 
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
 /**
  *
  */
@@ -35,62 +30,29 @@ public class IgniteDbMemoryLeakLargeObjectsTest extends IgniteDbMemoryLeakAbstra
     static {
         ARRAY = new int[1024];
 
-        Random rnd = new Random();
-
         for (int i = 0; i < ARRAY.length; i++)
-            ARRAY[i] = rnd.nextInt();
-    }
-
-    @Override
-    protected int duration() {
-        return 300;
-    }
-
-    @Override
-    protected int gridCount() {
-        return 1;
+            ARRAY[i] = getRandom().nextInt();
     }
 
-    @Override
-    protected void configure(IgniteConfiguration cfg) {
-        cfg.setMetricsLogFrequency(5000);
+    /** {@inheritDoc} */
+    @Override protected IgniteCache<Object, Object> cache(IgniteEx ig) {
+        return ig.cache("non-primitive");
     }
 
-    @Override
-    protected void configure(MemoryConfiguration mCfg) {
-        mCfg.setPageCacheSize(60 * 1024 * 1024);
+    /** {@inheritDoc} */
+    @Override protected Object key() {
+        return new DbKey(getRandom().nextInt(200_000));
     }
 
-    @Override
-    protected boolean indexingEnabled() {
-        return false;
-    }
-
-    protected void operation(IgniteEx ig){
-        IgniteCache<Object, Object> cache = ig.cache("large");
-        Random rnd = ThreadLocalRandom.current();
-
-        for (int i = 0; i < 1000; i++) {
-            LargeDbKey key = new LargeDbKey(rnd.nextInt(10_000), 1024);
-
-            LargeDbValue v0 = new LargeDbValue("test-value-1-" + rnd.nextInt(200), "test-value-2-" + rnd.nextInt(200), ARRAY);
-
-            switch (rnd.nextInt(3)) {
-                case 0:
-                    cache.getAndPut(key, v0);
-                case 1:
-                    cache.get(key);
-                    break;
-                case 2:
-                    cache.getAndRemove(key);
-            }
-        }
+    /** {@inheritDoc} */
+    @Override protected Object value(Object key) {
+        return new DbValue(((DbKey)key).val, "test-value-" + getRandom().nextInt(200), getRandom().nextInt(500));
     }
 
-    @Override
-    protected void check(IgniteEx ig) {
+    /** {@inheritDoc} */
+    @Override protected void check(IgniteEx ig) {
         long pages = ig.context().cache().context().database().pageMemory().loadedPages();
 
-        assertTrue(pages < 50000);
+        assertTrue(pages < 20000);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargePagesTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargePagesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargePagesTest.java
index 91c96af..8e4d0b4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargePagesTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakLargePagesTest.java
@@ -17,76 +17,31 @@
 
 package org.apache.ignite.internal.processors.database;
 
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
 /**
  *
  */
-public class IgniteDbMemoryLeakLargePagesTest extends IgniteDbMemoryLeakAbstractTest {
-
-    @Override
-    protected int duration() {
-        return 300;
-    }
+public class IgniteDbMemoryLeakLargePagesTest extends IgniteDbMemoryLeakTest {
 
-    @Override
-    protected int gridCount() {
-        return 1;
-    }
+    /** {@inheritDoc} */
+    @Override protected void configure(MemoryConfiguration mCfg) {
+        int concLvl = Runtime.getRuntime().availableProcessors();
+        mCfg.setConcurrencyLevel(concLvl);
+        mCfg.setPageCacheSize(1024 * 1024 * concLvl * 16);
 
-    @Override
-    protected void configure(IgniteConfiguration cfg) {
-        cfg.setMetricsLogFrequency(5000);
     }
 
-    @Override
-    protected void configure(MemoryConfiguration mCfg) {
-        // TODO: understand why such overhead with large pages.
-        mCfg.setPageCacheSize(100 * 1024 * 1024);
-    }
-
-    @Override
-    protected boolean indexingEnabled() {
-        return false;
-    }
-
-    @Override
-    protected boolean isLargePage() {
+    /** {@inheritDoc} */
+    @Override protected boolean isLargePage() {
         return true;
     }
 
-    // TODO: avoid copy/paste.
-    protected void operation(IgniteEx ig){
-        IgniteCache<Object, Object> cache = ig.cache("non-primitive");
-        Random rnd = ThreadLocalRandom.current();
-
-        for (int i = 0; i < 1000; i++) {
-            DbKey key = new DbKey(rnd.nextInt(200_000));
-
-            DbValue v0 = new DbValue(key.val, "test-value-" + rnd.nextInt(200), rnd.nextInt(500));
-
-            switch (rnd.nextInt(3)) {
-                case 0:
-                    cache.getAndPut(key, v0);
-                case 1:
-                    cache.get(key);
-                    break;
-                case 2:
-                    cache.getAndRemove(key);
-            }
-        }
-    }
-
-    @Override
-    protected void check(IgniteEx ig) {
+    /** {@inheritDoc} */
+    @Override protected void check(IgniteEx ig) {
         long pages = ig.context().cache().context().database().pageMemory().loadedPages();
 
-        assertTrue(pages < 4600);
+        assertTrue(pages < 4000);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakTest.java
index 2b0ce1e..81d831b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakTest.java
@@ -18,72 +18,31 @@
 package org.apache.ignite.internal.processors.database;
 
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-
 /**
  *
  */
 public class IgniteDbMemoryLeakTest extends IgniteDbMemoryLeakAbstractTest {
     /** {@inheritDoc} */
-    @Override protected int duration() {
-        return 300;
-    }
-
-    @Override
-    protected int gridCount() {
-        return 1;
-    }
-
-    @Override
-    protected void configure(IgniteConfiguration cfg) {
-        cfg.setMetricsLogFrequency(5000);
-    }
-
-    @Override
-    protected void configure(MemoryConfiguration mCfg) {
-        mCfg.setPageCacheSize(1024 * 1024);
+    @Override protected IgniteCache<Object, Object> cache(IgniteEx ig) {
+        return ig.cache("non-primitive");
     }
 
-    @Override
-    protected boolean indexingEnabled() {
-        return false;
+    /** {@inheritDoc} */
+    @Override protected Object key() {
+        return new DbKey(getRandom().nextInt(200_000));
     }
 
-    protected void operation(IgniteEx ig){
-        IgniteCache<Object, Object> cache = ig.cache("non-primitive");
-        Random rnd = ThreadLocalRandom.current();
-
-        for (int i = 0; i < 1000; i++) {
-            DbKey key = new DbKey(rnd.nextInt(200_000));
-
-            DbValue v0 = new DbValue(key.val, "test-value-" + rnd.nextInt(200), rnd.nextInt(500));
-
-            // TODO: also execute scan query.
-
-            switch (rnd.nextInt(3)) {
-                case 0:
-                    cache.getAndPut(key, v0);
-                    break;
-
-                case 1:
-                    cache.get(key);
-                    break;
-
-                case 2:
-                    cache.getAndRemove(key);
-            }
-        }
+    /** {@inheritDoc} */
+    @Override protected Object value(Object key) {
+        return new DbValue(((DbKey)key).val, "test-value-" + getRandom().nextInt(200), getRandom().nextInt(500));
     }
 
-    @Override
-    protected void check(IgniteEx ig) {
+    /** {@inheritDoc} */
+    @Override protected void check(IgniteEx ig) {
         long pages = ig.context().cache().context().database().pageMemory().loadedPages();
 
-        assertTrue(pages < 19100);
+        assertTrue(pages < 20000);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/25c19276/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakWithExpirationTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakWithExpirationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakWithExpirationTest.java
index 95fe8c8..a31ffb4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakWithExpirationTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/IgniteDbMemoryLeakWithExpirationTest.java
@@ -18,75 +18,31 @@
 package org.apache.ignite.internal.processors.database;
 
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.internal.IgniteEx;
 
 import javax.cache.expiry.CreatedExpiryPolicy;
 import javax.cache.expiry.Duration;
 import javax.cache.expiry.ExpiryPolicy;
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 /**
  *
  */
-public class IgniteDbMemoryLeakWithExpirationTest extends IgniteDbMemoryLeakAbstractTest {
+public class IgniteDbMemoryLeakWithExpirationTest extends IgniteDbMemoryLeakTest {
     /** */
     private static final ExpiryPolicy EXPIRY = new CreatedExpiryPolicy(new Duration(MILLISECONDS, 10L));
 
-    @Override
-    protected int duration() {
-        return 300;
+    /** {@inheritDoc} */
+    @Override protected IgniteCache<Object, Object> cache(IgniteEx ig) {
+        return ig.cache("non-primitive").withExpiryPolicy(EXPIRY);
     }
 
-    @Override
-    protected int gridCount() {
-        return 1;
-    }
-
-    @Override
-    protected void configure(IgniteConfiguration cfg) {
-        cfg.setMetricsLogFrequency(5000);
-    }
-
-    @Override
-    protected void configure(MemoryConfiguration mCfg) {
-        mCfg.setPageCacheSize(1024 * 1024);
-    }
-
-    @Override
-    protected boolean indexingEnabled() {
-        return false;
-    }
-
-    protected void operation(IgniteEx ig) {
-        IgniteCache<Object, Object> cache = ig.cache("non-primitive").withExpiryPolicy(EXPIRY);
-        Random rnd = ThreadLocalRandom.current();
-
-        for (int i = 0; i < 1000; i++) {
-            DbKey key = new DbKey(rnd.nextInt(200_000));
-
-            DbValue v0 = new DbValue(key.val, "test-value-" + rnd.nextInt(200), rnd.nextInt(500));
-
-            switch (rnd.nextInt(3)) {
-                case 0:
-                    cache.getAndPut(key, v0);
-                case 1:
-                    cache.get(key);
-                    break;
-                case 2:
-                    cache.getAndRemove(key);
-            }
-        }
-    }
-
-    @Override
-    protected void check(IgniteEx ig) {
+    /** {@inheritDoc} */
+    @Override protected void check(IgniteEx ig) {
         long pages = ig.context().cache().context().database().pageMemory().loadedPages();
 
-        assertTrue(pages < 10000);
+        assertTrue(pages < 7000);
     }
 }