Merge branch 'ignite-5267' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-gg-12163
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 2832fbd..d6015d7 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -615,6 +615,9 @@
      */
      public static final String IGNITE_PDS_WAL_REBALANCE_THRESHOLD = "IGNITE_PDS_WAL_REBALANCE_THRESHOLD";
 
+    /** Ignite page memory concurrency level. */
+    public static final String IGNITE_OFFHEAP_LOCK_CONCURRENCY_LEVEL = "IGNITE_OFFHEAP_LOCK_CONCURRENCY_LEVEL";
+
     /** Returns true for system properties only avoiding sending sensitive information. */
     private static final IgnitePredicate<Map.Entry<String, String>> PROPS_FILTER = new IgnitePredicate<Map.Entry<String, String>>() {
         @Override public boolean apply(final Map.Entry<String, String> entry) {
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
index e6324dc..2d71e99 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/MemoryConfiguration.java
@@ -102,7 +102,7 @@
     private String dfltMemPlcName = DFLT_MEM_PLC_DEFAULT_NAME;
 
     /** Size of memory (in bytes) to use for default MemoryPolicy. */
-    private Long dfltMemPlcSize;
+    private long dfltMemPlcSize = DFLT_MEMORY_POLICY_MAX_SIZE;
 
     /** Memory policies. */
     private MemoryPolicyConfiguration[] memPlcs;
@@ -126,6 +126,8 @@
      * @return {@code this} for chaining.
      */
     public MemoryConfiguration setSystemCacheInitialSize(long sysCacheInitSize) {
+        A.ensure(sysCacheMaxSize > 0, "System cache initial size can not be less zero.");
+
         this.sysCacheInitSize = sysCacheInitSize;
 
         return this;
@@ -149,6 +151,8 @@
      * @return {@code this} for chaining.
      */
     public MemoryConfiguration setSystemCacheMaxSize(long sysCacheMaxSize) {
+        A.ensure(sysCacheMaxSize > 0, "System cache max size can not be less zero.");
+
         this.sysCacheMaxSize = sysCacheMaxSize;
 
         return this;
@@ -214,7 +218,7 @@
     public MemoryPolicyConfiguration createDefaultPolicyConfig() {
         MemoryPolicyConfiguration memPlc = new MemoryPolicyConfiguration();
 
-        long maxSize = (dfltMemPlcSize != null) ? dfltMemPlcSize : DFLT_MEMORY_POLICY_MAX_SIZE;
+        long maxSize = dfltMemPlcSize;
 
         if (maxSize < DFLT_MEMORY_POLICY_INITIAL_SIZE)
             memPlc.setInitialSize(maxSize);
@@ -248,10 +252,10 @@
     /**
      * Gets a size for default memory policy overridden by user.
      *
-     * @return default memory policy size overridden by user or -1 if nothing was specified.
+     * @return default memory policy size overridden by user or {@link #DFLT_MEMORY_POLICY_MAX_SIZE} if nothing was specified.
      */
     public long getDefaultMemoryPolicySize() {
-        return (dfltMemPlcSize != null) ? dfltMemPlcSize : -1;
+        return dfltMemPlcSize;
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index 7bc92d6..dc72482 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.mem.DirectMemoryProvider;
 import org.apache.ignite.internal.mem.DirectMemoryRegion;
@@ -36,10 +37,12 @@
 import org.apache.ignite.internal.processors.cache.database.MemoryMetricsImpl;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
 import org.apache.ignite.internal.util.GridUnsafe;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.OffheapReadWriteLock;
 import org.apache.ignite.internal.util.offheap.GridOffHeapOutOfMemoryException;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_OFFHEAP_LOCK_CONCURRENCY_LEVEL;
 import static org.apache.ignite.internal.util.GridUnsafe.wrapPointer;
 
 /**
@@ -143,6 +146,12 @@
     /** */
     private OffheapReadWriteLock rwLock;
 
+    /** Concurrency lvl. */
+    private final int lockConcLvl = IgniteSystemProperties.getInteger(
+        IGNITE_OFFHEAP_LOCK_CONCURRENCY_LEVEL,
+        IgniteUtils.nearestPow2(Runtime.getRuntime().availableProcessors() * 4)
+    );
+
     /** */
     private final int totalPages;
 
@@ -182,8 +191,7 @@
 
         totalPages = (int)(memPlcCfg.getMaxSize() / sysPageSize);
 
-        // TODO configure concurrency level.
-        rwLock = new OffheapReadWriteLock(128);
+        rwLock = new OffheapReadWriteLock(lockConcLvl);
     }
 
     /** {@inheritDoc} */
@@ -516,9 +524,8 @@
 
             if (cmp < 0)
                 high = mid - 1;
-            else if (cmp > 0) {
+            else if (cmp > 0)
                 low = mid + 1;
-            }
             else
                 return seg.pageIndex(seqNo);
         }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
index 0a906b2..098fa1e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheDatabaseSharedManager.java
@@ -106,24 +106,21 @@
      * @throws IgniteCheckedException If failed.
      */
     public void init() throws IgniteCheckedException {
-        if (memPlcMap == null) {
-            MemoryConfiguration memCfg = cctx.kernalContext().config().getMemoryConfiguration();
+        MemoryConfiguration memCfg = cctx.kernalContext().config().getMemoryConfiguration();
 
-            if (memCfg == null)
-                memCfg = new MemoryConfiguration();
+        assert memCfg != null;
 
-            validateConfiguration(memCfg);
+        validateConfiguration(memCfg);
 
-            pageSize = memCfg.getPageSize();
+        pageSize = memCfg.getPageSize();
 
-            initPageMemoryPolicies(memCfg);
+        initPageMemoryPolicies(memCfg);
 
-            registerMetricsMBeans();
+        registerMetricsMBeans();
 
-            startMemoryPolicies();
+        startMemoryPolicies();
 
-            initPageMemoryDataStructures(memCfg);
-        }
+        initPageMemoryDataStructures(memCfg);
     }
 
     /**
@@ -220,9 +217,11 @@
             memPlcMap = U.newHashMap(2);
             memMetricsMap = U.newHashMap(2);
 
-            addMemoryPolicy(memCfg,
+            addMemoryPolicy(
+                memCfg,
                 memCfg.createDefaultPolicyConfig(),
-                DFLT_MEM_PLC_DEFAULT_NAME);
+                DFLT_MEM_PLC_DEFAULT_NAME
+            );
 
             U.warn(log, "No user-defined default MemoryPolicy found; system default of 1GB size will be used.");
         }
@@ -234,9 +233,11 @@
                 memPlcMap = U.newHashMap(memPlcsCfgs.length + 2);
                 memMetricsMap = U.newHashMap(memPlcsCfgs.length + 2);
 
-                addMemoryPolicy(memCfg,
+                addMemoryPolicy(
+                    memCfg,
                     memCfg.createDefaultPolicyConfig(),
-                    DFLT_MEM_PLC_DEFAULT_NAME);
+                    DFLT_MEM_PLC_DEFAULT_NAME
+                );
 
                 U.warn(log, "No user-defined default MemoryPolicy found; system default of 1GB size will be used.");
             }
@@ -250,27 +251,34 @@
                 addMemoryPolicy(memCfg, memPlcCfg, memPlcCfg.getName());
         }
 
-        addMemoryPolicy(memCfg,
-            createSystemMemoryPolicy(memCfg.getSystemCacheInitialSize(), memCfg.getSystemCacheMaxSize()),
-            SYSTEM_MEMORY_POLICY_NAME);
+        addMemoryPolicy(
+            memCfg,
+            createSystemMemoryPolicy(
+                memCfg.getSystemCacheInitialSize(),
+                memCfg.getSystemCacheMaxSize()
+            ),
+            SYSTEM_MEMORY_POLICY_NAME
+        );
     }
 
     /**
-     * @param dbCfg Database config.
+     * @param memCfg Database config.
      * @param memPlcCfg Memory policy config.
      * @param memPlcName Memory policy name.
      */
-    private void addMemoryPolicy(MemoryConfiguration dbCfg,
-                                 MemoryPolicyConfiguration memPlcCfg,
-                                 String memPlcName) {
-        String dfltMemPlcName = dbCfg.getDefaultMemoryPolicyName();
+    private void addMemoryPolicy(
+        MemoryConfiguration memCfg,
+        MemoryPolicyConfiguration memPlcCfg,
+        String memPlcName
+    ) {
+        String dfltMemPlcName = memCfg.getDefaultMemoryPolicyName();
 
         if (dfltMemPlcName == null)
             dfltMemPlcName = DFLT_MEM_PLC_DEFAULT_NAME;
 
         MemoryMetricsImpl memMetrics = new MemoryMetricsImpl(memPlcCfg);
 
-        MemoryPolicy memPlc = initMemory(dbCfg, memPlcCfg, memMetrics);
+        MemoryPolicy memPlc = initMemory(memCfg, memPlcCfg, memMetrics);
 
         memPlcMap.put(memPlcName, memPlc);
 
@@ -328,8 +336,10 @@
 
         Set<String> plcNames = (plcCfgs != null) ? U.<String>newHashSet(plcCfgs.length) : new HashSet<String>(0);
 
-        checkSystemMemoryPolicySizeConfiguration(memCfg.getSystemCacheInitialSize(),
-            memCfg.getSystemCacheMaxSize());
+        checkSystemMemoryPolicySizeConfiguration(
+            memCfg.getSystemCacheInitialSize(),
+            memCfg.getSystemCacheMaxSize()
+        );
 
         if (plcCfgs != null) {
             for (MemoryPolicyConfiguration plcCfg : plcCfgs) {
@@ -344,9 +354,10 @@
         }
 
         checkDefaultPolicyConfiguration(
-                memCfg.getDefaultMemoryPolicyName(),
-                memCfg.getDefaultMemoryPolicySize(),
-                plcNames);
+            memCfg.getDefaultMemoryPolicyName(),
+            memCfg.getDefaultMemoryPolicySize(),
+            plcNames
+        );
     }
 
     /**
@@ -355,7 +366,10 @@
      *
      * @throws IgniteCheckedException In case of validation violation.
      */
-    private void checkSystemMemoryPolicySizeConfiguration(long sysCacheInitSize, long sysCacheMaxSize) throws IgniteCheckedException {
+    private static void checkSystemMemoryPolicySizeConfiguration(
+        long sysCacheInitSize,
+        long sysCacheMaxSize
+    ) throws IgniteCheckedException {
         if (sysCacheInitSize < MIN_PAGE_MEMORY_SIZE)
             throw new IgniteCheckedException("Initial size for system cache must have size more than 10MB (use " +
                 "MemoryConfiguration.systemCacheInitialSize property to set correct size in bytes) " +
@@ -388,7 +402,7 @@
         long dfltPlcSize,
         Collection<String> plcNames
     ) throws IgniteCheckedException {
-        if (dfltPlcSize != -1) {
+        if (dfltPlcSize != MemoryConfiguration.DFLT_MEMORY_POLICY_MAX_SIZE) {
             if (!F.eq(dfltPlcName, MemoryConfiguration.DFLT_MEM_PLC_DEFAULT_NAME))
                 throw new IgniteCheckedException("User-defined MemoryPolicy configuration " +
                     "and defaultMemoryPolicySize properties are set at the same time. " +
@@ -843,7 +857,15 @@
         MemoryPolicyConfiguration memPlcCfg,
         MemoryMetricsImpl memMetrics
     ) {
-        return new PageMemoryNoStoreImpl(log, memProvider, cctx, memCfg.getPageSize(), memPlcCfg, memMetrics, false);
+        return new PageMemoryNoStoreImpl(
+            log,
+            memProvider,
+            cctx,
+            memCfg.getPageSize(),
+            memPlcCfg,
+            memMetrics,
+            false
+        );
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
index d93831d..9a7cfdc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
@@ -265,23 +265,28 @@
      * @return {@code True} if mapped.
      */
     private boolean map(KeyCacheObject key) {
-        GridDhtLocalPartition part = topVer.topologyVersion() > 0 ?
-            cache().topology().localPartition(cctx.affinity().partition(key), topVer, true) :
-            cache().topology().localPartition(key, false);
+        try {
+            GridDhtLocalPartition part = topVer.topologyVersion() > 0 ?
+                cache().topology().localPartition(cctx.affinity().partition(key), topVer, true) :
+                cache().topology().localPartition(key, false);
 
-        if (part == null)
-            return false;
+            if (part == null)
+                return false;
 
-        assert this.part == -1;
+            assert this.part == -1;
 
-        // By reserving, we make sure that partition won't be unloaded while processed.
-        if (part.reserve()) {
-            this.part = part.id();
+            // By reserving, we make sure that partition won't be unloaded while processed.
+            if (part.reserve()) {
+                this.part = part.id();
 
-            return true;
+                return true;
+            }
+            else
+                return false;
         }
-        else
+        catch (GridDhtInvalidPartitionException ex) {
             return false;
+        }
     }
 
     /**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index d57c0f1..ba4717a 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -10186,6 +10186,35 @@
     }
 
     /**
+     * @param x X.
+     */
+    public static int nearestPow2(int x) {
+        return nearestPow2(x, true);
+    }
+
+    /**
+     * @param x X.
+     * @param less Less.
+     */
+    public static int nearestPow2(int x, boolean less) {
+        assert x > 0 : "can not calculate for less zero";
+
+        long y = 1;
+
+        while (y < x){
+            if (y * 2 > Integer.MAX_VALUE)
+                return (int)y;
+
+            y *= 2;
+        }
+
+        if (less)
+            y /= 2;
+
+        return (int)y;
+    }
+
+    /**
      * @param lock Lock.
      */
     public static ReentrantReadWriteLockTracer lockTracer(ReadWriteLock lock) {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectExceptionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectExceptionSelfTest.java
index e4be824..35756a4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectExceptionSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectExceptionSelfTest.java
@@ -45,6 +45,9 @@
     /** */
     private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
 
+    /** Cache name. */
+    private final String cacheName = "cache";
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(gridName);
@@ -52,7 +55,10 @@
         cfg.setMarshaller(new BinaryMarshaller());
         cfg.setDiscoverySpi(new TcpDiscoverySpi().setIpFinder(IP_FINDER));
 
-        cfg.setCacheConfiguration(new CacheConfiguration().setCopyOnRead(true));
+        cfg.setCacheConfiguration(
+            new CacheConfiguration(cacheName)
+                .setCopyOnRead(true)
+        );
 
         BinaryConfiguration bcfg = new BinaryConfiguration();
 
@@ -84,7 +90,7 @@
     public void testUnexpectedFieldType() throws Exception {
         IgniteEx grid = grid(0);
 
-        IgniteCache<String, Value> cache = grid.cache(null);
+        IgniteCache<String, Value> cache = grid.cache(cacheName);
 
         cache.put(TEST_KEY, new Value());
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
index d8a2065..99e6afb 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
@@ -40,9 +40,10 @@
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
-import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
+import static org.apache.ignite.testframework.GridTestUtils.getFieldValue;
+
 /**
  *
  */
@@ -234,7 +235,7 @@
      * @param msg Message.
      */
     private void checkFullMessage(GridDhtPartitionsFullMessage msg) {
-        Map<Integer, Integer> dupPartsData = GridTestUtils.getFieldValue(msg, "dupPartsData");
+        Map<Integer, Integer> dupPartsData = getFieldValue(msg, "dupPartsData");
 
         assertNotNull(dupPartsData);
 
@@ -243,7 +244,8 @@
 
         assertFalse(dupPartsData.containsKey(CU.cacheId(AFF3_CACHE1)));
 
-        Map<Integer, Map<Integer, Long>> partCntrs = GridTestUtils.getFieldValue(msg, "partCntrs");
+        Map<Integer, Map<Integer, Long>> partCntrs =
+            getFieldValue(getFieldValue(msg, "partCntrs"), "map");
 
         if (partCntrs != null) {
             for (Map<Integer, Long> cntrs : partCntrs.values())
@@ -255,7 +257,7 @@
      * @param msg Message.
      */
     private void checkSingleMessage(GridDhtPartitionsSingleMessage msg) {
-        Map<Integer, Integer> dupPartsData = GridTestUtils.getFieldValue(msg, "dupPartsData");
+        Map<Integer, Integer> dupPartsData = getFieldValue(msg, "dupPartsData");
 
         assertNotNull(dupPartsData);
 
@@ -264,7 +266,7 @@
 
         assertFalse(dupPartsData.containsKey(CU.cacheId(AFF3_CACHE1)));
 
-        Map<Integer, Map<Integer, Long>> partCntrs = GridTestUtils.getFieldValue(msg, "partCntrs");
+        Map<Integer, Map<Integer, Long>> partCntrs = getFieldValue(msg, "partCntrs");
 
         if (partCntrs != null) {
             for (Map<Integer, Long> cntrs : partCntrs.values())
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
index b98f429..5206472 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/MetadataStorageSelfTest.java
@@ -17,6 +17,12 @@
 
 package org.apache.ignite.internal.processors.database;
 
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.configuration.MemoryPolicyConfiguration;
 import org.apache.ignite.internal.mem.DirectMemoryProvider;
 import org.apache.ignite.internal.pagemem.FullPageId;
@@ -30,13 +36,6 @@
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.atomic.AtomicLong;
-
 /**
  *
  */
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java
index 6f2201f..465b38d 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/TcpDiscoveryIpFinderAbstractSelfTest.java
@@ -54,6 +54,13 @@
         injectLogger(finder);
     }
 
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        stopAllGrids();
+    }
+
     /**
      * @throws Exception If any error occurs.
      */
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
index 25cb083..acc12c2 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ipfinder/vm/TcpDiscoveryVmIpFinderSelfTest.java
@@ -223,6 +223,7 @@
 
         Ignition.stop("client1", true);
         Ignition.stop("client2", true);
+        Ignition.stop("client3", true);
 
         assertEquals(3 * srvSize, IP_FINDER.getRegisteredAddresses().size());
 
@@ -237,12 +238,14 @@
         Ignition.stop("server1", true);
         Ignition.stop("server2", true);
 
-        GridTestUtils.waitForCondition(new GridAbsPredicate() {
+        boolean res = GridTestUtils.waitForCondition(new GridAbsPredicate() {
             @Override public boolean apply() {
-                return 0 == G.allGrids().size();
+                return G.allGrids().isEmpty();
             }
         }, 10000);
 
+        assertTrue(res);
+
         assertTrue(3 * srvSize >= IP_FINDER.getRegisteredAddresses().size());
     }
 
diff --git a/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheDatabaseSharedManager.java b/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheDatabaseSharedManager.java
index 45b5abf..a78ba27 100755
--- a/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheDatabaseSharedManager.java
+++ b/modules/pds/src/main/java/org/apache/ignite/internal/processors/cache/database/GridCacheDatabaseSharedManager.java
@@ -150,7 +150,7 @@
         IgniteSystemProperties.getLong(IGNITE_PDS_PARTITION_DESTROY_CHECKPOINT_DELAY, 30_000);
 
     /** */
-    private final int ggWalRebalanceThreshold = IgniteSystemProperties.getInteger(
+    private final int walRebalanceThreshold = IgniteSystemProperties.getInteger(
         IGNITE_PDS_WAL_REBALANCE_THRESHOLD, 500_000);
 
     /** Checkpoint lock hold count. */
@@ -355,15 +355,36 @@
             );
 
         // Intentionally use identity comparison to check if configuration default has changed.
-        //noinspection NumberEquality
+        // Noinspection NumberEquality.
         if (cpBufSize == PersistentStoreConfiguration.DFLT_CHECKPOINT_PAGE_BUFFER_SIZE) {
             MemoryConfiguration memCfg = cctx.kernalContext().config().getMemoryConfiguration();
 
-            // Limit the checkpoint page buffer size by 2GB.
-            //TODO find max page cache and use it instead of memCfg.getPageCacheSize() (replaced with Long.MAX_VALUE now)
-            long adjusted = Math.min(Long.MAX_VALUE / 4, 2 * 1024L * 1024L * 1024L);
+            assert memCfg != null;
 
-            if (memCfg != null && cpBufSize < adjusted) {
+            long totalSize = memCfg.getSystemCacheMaxSize();
+
+            if (memCfg.getMemoryPolicies() == null)
+                totalSize += MemoryConfiguration.DFLT_MEMORY_POLICY_MAX_SIZE;
+            else {
+                for (MemoryPolicyConfiguration memPlc : memCfg.getMemoryPolicies()) {
+                    if (Long.MAX_VALUE - memPlc.getMaxSize() > totalSize)
+                        totalSize += memPlc.getMaxSize();
+                    else {
+                        totalSize = Long.MAX_VALUE;
+
+                        break;
+                    }
+                }
+
+                assert totalSize > 0;
+            }
+
+            // Limit the checkpoint page buffer size by 2GB.
+            long dfltSize = 2 * 1024L * 1024L * 1024L;
+
+            long adjusted = Math.min(totalSize / 4, dfltSize);
+
+            if (cpBufSize < adjusted) {
                 U.quietAndInfo(log,
                     "Default checkpoint page buffer size is too small, setting to an adjusted value: "
                         + U.readableSize(adjusted, false)
@@ -555,7 +576,10 @@
     ) {
         return new PageMemoryImpl(
             memProvider,
-            calculateFragmentSizes(memCfg.getConcurrencyLevel(), plcCfg.getMaxSize()),
+            calculateFragmentSizes(
+                memCfg.getConcurrencyLevel(),
+                plcCfg.getMaxSize()
+            ),
             cctx,
             memCfg.getPageSize(),
             new GridInClosure3X<FullPageId, ByteBuffer, Integer>() {
@@ -880,7 +904,7 @@
                 continue;
 
             for (GridDhtLocalPartition part : cacheCtx.topology().currentLocalPartitions()) {
-                if (part.state() != GridDhtPartitionState.OWNING || part.dataStore().size() <= ggWalRebalanceThreshold)
+                if (part.state() != GridDhtPartitionState.OWNING || part.dataStore().size() <= walRebalanceThreshold)
                     continue;
 
                 CheckpointEntry cpEntry = searchCheckpointEntry(cacheCtx, part.id(), null);
diff --git a/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheRebalancingAbstractTest.java b/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheRebalancingAbstractTest.java
index ddaf368..9f64f1b 100644
--- a/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheRebalancingAbstractTest.java
+++ b/modules/pds/src/test/java/org/apache/ignite/cache/database/IgnitePersistentStoreCacheRebalancingAbstractTest.java
@@ -315,6 +315,8 @@
      * @throws Exception If fails.
      */
     public void testPartitionLossAndRecover() throws Exception {
+        fail("IGNITE-5302");
+
         Ignite ignite1 = startGrid(0);
         Ignite ignite2 = startGrid(1);
         Ignite ignite3 = startGrid(2);
@@ -362,6 +364,8 @@
      * @throws Exception If failed.
      */
     public void testTopologyChangesWithConstantLoad() throws Exception {
+        fail("only for one run, must be removed soon");
+
         final int entriesCnt = 10_000;
         int maxNodesCount = 4;
         int topChanges = 20;
diff --git a/modules/pds/src/test/java/org/apache/ignite/cache/database/db/file/PageStoreEvictionSelfTest.java b/modules/pds/src/test/java/org/apache/ignite/cache/database/db/file/PageStoreEvictionSelfTest.java
index 4205756..2ef4524 100644
--- a/modules/pds/src/test/java/org/apache/ignite/cache/database/db/file/PageStoreEvictionSelfTest.java
+++ b/modules/pds/src/test/java/org/apache/ignite/cache/database/db/file/PageStoreEvictionSelfTest.java
@@ -59,6 +59,9 @@
     /** */
     private static final int PAGES_NUM = 128_000;
 
+    /** Cache name. */
+    private final String cacheName = "cache";
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         final IgniteConfiguration cfg = super.getConfiguration(gridName);
@@ -67,6 +70,8 @@
 
         cfg.setMemoryConfiguration(createDbConfig());
 
+        cfg.setCacheConfiguration(new CacheConfiguration<>(cacheName));
+
         return cfg;
     }
 
@@ -74,19 +79,19 @@
      * @return DB config.
      */
     private MemoryConfiguration createDbConfig() {
-        final MemoryConfiguration dbCfg = new MemoryConfiguration();
+        final MemoryConfiguration memCfg = new MemoryConfiguration();
 
         MemoryPolicyConfiguration memPlcCfg = new MemoryPolicyConfiguration();
         memPlcCfg.setInitialSize(MEMORY_LIMIT);
         memPlcCfg.setMaxSize(MEMORY_LIMIT);
         memPlcCfg.setName("dfltMemPlc");
 
-        dbCfg.setPageSize(PAGE_SIZE);
-        dbCfg.setConcurrencyLevel(NUMBER_OF_SEGMENTS);
-        dbCfg.setMemoryPolicies(memPlcCfg);
-        dbCfg.setDefaultMemoryPolicyName("dfltMemPlc");
+        memCfg.setPageSize(PAGE_SIZE);
+        memCfg.setConcurrencyLevel(NUMBER_OF_SEGMENTS);
+        memCfg.setMemoryPolicies(memPlcCfg);
+        memCfg.setDefaultMemoryPolicyName("dfltMemPlc");
 
-        return dbCfg;
+        return memCfg;
     }
 
 
@@ -111,11 +116,10 @@
      */
     public void testPageEviction() throws Exception {
         final IgniteEx ig = startGrid(0);
-        ig.getOrCreateCache(new CacheConfiguration<>("partitioned"));
 
         final PageMemory memory = getMemory(ig);
 
-        writeData(ig, memory, CU.cacheId("partitioned"));
+        writeData(ig, memory, CU.cacheId(cacheName));
     }
 
     /**