You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/08/03 11:29:10 UTC

[28/48] ignite git commit: ignite-3300 Added test.

ignite-3300 Added test.


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

Branch: refs/heads/ignite-3443
Commit: 9ff4e5393f2230327a56aa2ac918bfb4cd94e23e
Parents: 5060605
Author: sboikov <sb...@gridgain.com>
Authored: Fri Jul 29 10:51:50 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jul 29 10:51:50 2016 +0300

----------------------------------------------------------------------
 .../junits/common/GridCommonAbstractTest.java   |   2 +-
 .../cache/IgniteCacheQueriesLoadTest1.java      | 604 +++++++++++++++++++
 .../IgniteBinaryCacheQueryTestSuite.java        |   1 -
 .../IgniteBinaryCacheQueryTestSuite2.java       |   3 +
 4 files changed, 608 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9ff4e539/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index e475754..032d99e 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -1148,7 +1148,7 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
      * @return Result of closure execution.
      * @throws Exception If failed.
      */
-    protected <T> T doInTransaction(Ignite ignite,
+    protected static <T> T doInTransaction(Ignite ignite,
         TransactionConcurrency concurrency,
         TransactionIsolation isolation,
         Callable<T> clo) throws Exception {

http://git-wip-us.apache.org/repos/asf/ignite/blob/9ff4e539/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheQueriesLoadTest1.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheQueriesLoadTest1.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheQueriesLoadTest1.java
new file mode 100644
index 0000000..d16fe99
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheQueriesLoadTest1.java
@@ -0,0 +1,604 @@
+/*
+ * 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.processors.cache;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ThreadLocalRandom;
+import javax.cache.Cache;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.lang.IgniteCallable;
+import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.resources.IgniteInstanceResource;
+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.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMemoryMode.OFFHEAP_TIERED;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+
+/**
+ *
+ */
+@SuppressWarnings("unchecked")
+public class IgniteCacheQueriesLoadTest1 extends GridCommonAbstractTest {
+    /** Operation. */
+    private static final String OPERATION = "Operation";
+
+    /** Deposit. */
+    private static final String DEPOSIT = "Deposit";
+
+    /** Trader. */
+    private static final String TRADER = "Trader";
+
+    /** Id. */
+    private static final String ID = "ID";
+
+    /** Deposit id. */
+    private static final String DEPOSIT_ID = "DEPOSIT_ID";
+
+    /** Trader id. */
+    private static final String TRADER_ID = "TRADER_ID";
+
+    /** Firstname. */
+    private static final String FIRSTNAME = "FIRSTNAME";
+
+    /** Secondname. */
+    private static final String SECONDNAME = "SECONDNAME";
+
+    /** Email. */
+    private static final String EMAIL = "EMAIL";
+
+    /** Business day. */
+    private static final String BUSINESS_DAY = "BUSINESS_DAY";
+
+    /** Trader link. */
+    private static final String TRADER_LINK = "TRADER";
+
+    /** Balance. */
+    private static final String BALANCE = "BALANCE";
+
+    /** Margin rate. */
+    private static final String MARGIN_RATE = "MARGIN_RATE";
+
+    /** Balance on day open. */
+    private static final String BALANCE_ON_DAY_OPEN = "BALANCEDO";
+
+    /** Trader cache name. */
+    private static final String TRADER_CACHE = "TRADER_CACHE";
+
+    /** Deposit cache name. */
+    private static final String DEPOSIT_CACHE = "DEPOSIT_CACHE";
+
+    /** History of operation over deposit. */
+    private static final String DEPOSIT_HISTORY_CACHE = "DEPOSIT_HISTORY_CACHE";
+
+    /** Count of operations by deposit. */
+    private static final String DEPOSIT_OPERATION_COUNT_SQL = "SELECT COUNT(*) FROM \"" + DEPOSIT_HISTORY_CACHE
+        + "\"." + OPERATION + " WHERE " + "DEPOSIT_ID" + "=?";
+
+    /** Get last history row. */
+    private static final String LAST_HISTORY_ROW_SQL = "SELECT MAX("+BUSINESS_DAY+") FROM \""+DEPOSIT_HISTORY_CACHE
+        + "\"." + OPERATION + " WHERE " + "DEPOSIT_ID" + "=?";
+
+    /** Find deposit SQL query. */
+    private static final String FIND_DEPOSIT_SQL = "SELECT _key FROM \"" + DEPOSIT_CACHE + "\"." + DEPOSIT
+        + " WHERE " + TRADER_ID + "=?";
+
+    /** */
+    private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+
+    /** */
+    private static final int NODES = 5;
+
+    /** Distribution of partitions by nodes. */
+    private Map<UUID, List<Integer>> partitionsMap;
+
+    /** Preload amount. */
+    private final int preloadAmount = 10_000;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        cfg.setIncludeEventTypes();
+
+        cfg.setMarshaller(null);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
+
+        RendezvousAffinityFunction aff = new RendezvousAffinityFunction();
+        aff.setPartitions(3000);
+
+        CacheConfiguration<Object, Object> parentCfg = new CacheConfiguration<>();
+        parentCfg.setAffinity(aff);
+        parentCfg.setAtomicityMode(TRANSACTIONAL);
+        parentCfg.setCacheMode(PARTITIONED);
+        parentCfg.setMemoryMode(OFFHEAP_TIERED);
+        parentCfg.setBackups(2);
+        parentCfg.setWriteSynchronizationMode(FULL_SYNC);
+
+        cfg.setCacheConfiguration(
+            getTraderCfg(parentCfg),
+            getDepositCfg(parentCfg),
+            getDepositHistoryCfg(parentCfg)
+        );
+
+        return cfg;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testQueries() throws Exception {
+        runQueries(1, true, 10_000);
+
+        runQueries(10, false, 30_000);
+    }
+
+    /**
+     * @param threads Threads number.
+     * @param checkBalance Check balance flag.
+     * @param time Execution time.
+     * @throws Exception If failed.
+     */
+    private void runQueries(int threads, final boolean checkBalance, final long time) throws Exception {
+        final Ignite ignite = grid(0);
+
+        GridTestUtils.runMultiThreaded(new Callable<Object>() {
+            @Override public Object call() {
+                long endTime = System.currentTimeMillis() + time;
+
+                while (System.currentTimeMillis() < endTime) {
+                    ScanQueryBroadcastClosure c = new ScanQueryBroadcastClosure(partitionsMap, checkBalance);
+
+                    ignite.compute().broadcast(c);
+                }
+
+                return null;
+            }
+        }, threads, "test-thread");
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        startGridsMultiThreaded(NODES);
+
+        partitionsMap = traderCachePartitions(ignite(0));
+
+        assertEquals(NODES, partitionsMap.size());
+
+        preLoading();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        assert G.allGrids().isEmpty();
+    }
+
+    /**
+     * @throws Exception If fail.
+     */
+    private void preLoading() throws Exception {
+        final Thread preloadAccount = new Thread() {
+            @Override public void run() {
+                setName("preloadTraders");
+
+                Ignite ignite = ignite(0);
+
+                try (IgniteDataStreamer dataLdr = ignite.dataStreamer(TRADER_CACHE)) {
+                    for (int i = 0; i < preloadAmount && !isInterrupted(); i++) {
+                        String traderKey = "traderId=" + i;
+
+                        dataLdr.addData(traderKey, createTrader(ignite, traderKey));
+                    }
+                }
+            }
+        };
+
+        preloadAccount.start();
+
+        Thread preloadTrade = new Thread() {
+            @Override public void run() {
+                setName("preloadDeposits");
+
+                Ignite ignite = ignite(0);
+
+                try (IgniteDataStreamer dataLdr = ignite.dataStreamer(DEPOSIT_CACHE)) {
+                    for (int i = 0; i < preloadAmount && !isInterrupted(); i++) {
+                        int traderId = nextRandom(preloadAmount);
+
+                        String traderKey = "traderId=" + traderId;
+                        String key = traderKey + "&depositId=" + i;
+
+                        dataLdr.addData(key, createDeposit(ignite, key, traderKey, i));
+                    }
+                }
+            }
+        };
+
+        preloadTrade.start();
+
+        preloadTrade.join();
+        preloadAccount.join();
+    }
+
+    /**
+     * @param ignite Node.
+     * @param id Identifier.
+     * @return Trader entity as binary object.
+     */
+    private BinaryObject createTrader(Ignite ignite, String id) {
+        return ignite.binary()
+            .builder(TRADER)
+            .setField(ID, id)
+            .setField(FIRSTNAME, "First name " + id)
+            .setField(SECONDNAME, "Second name " + id)
+            .setField(EMAIL, "trader" + id + "@mail.org")
+            .build();
+    }
+
+    /**
+     * @param ignite Node.
+     * @param id Identifier.
+     * @param traderId Key.
+     * @param num Num.
+     * @return Deposit entity as binary object.
+     */
+    private BinaryObject createDeposit(Ignite ignite, String id, String traderId, int num) {
+        double startBalance = 100 + nextRandom(100) / 1.123;
+
+        return ignite.binary()
+            .builder(DEPOSIT)
+            .setField(ID, id)
+            .setField(TRADER_ID, traderId)
+            .setField(TRADER_LINK, num)
+            .setField(BALANCE, new BigDecimal(startBalance))
+            .setField(MARGIN_RATE, new BigDecimal(0.1))
+            .setField(BALANCE_ON_DAY_OPEN, new BigDecimal(startBalance))
+            .build();
+    }
+
+    /**
+     * Building a map that contains mapping of node ID to a list of partitions stored on the node.
+     *
+     * @param ignite Node.
+     * @return Node to partitions map.
+     */
+    private Map<UUID, List<Integer>> traderCachePartitions(Ignite ignite) {
+        // Getting affinity for account cache.
+        Affinity<?> affinity = ignite.affinity(TRADER_CACHE);
+
+        // Building a list of all partitions numbers.
+        List<Integer> partNumbers = new ArrayList<>(affinity.partitions());
+
+        for (int i = 0; i < affinity.partitions(); i++)
+            partNumbers.add(i);
+
+        // Getting partition to node mapping.
+        Map<Integer, ClusterNode> partPerNodes = affinity.mapPartitionsToNodes(partNumbers);
+
+        // Building node to partitions mapping.
+        Map<UUID, List<Integer>> nodesToPart = new HashMap<>();
+
+        for (Map.Entry<Integer, ClusterNode> entry : partPerNodes.entrySet()) {
+            List<Integer> nodeParts = nodesToPart.get(entry.getValue().id());
+
+            if (nodeParts == null) {
+                nodeParts = new ArrayList<>();
+
+                nodesToPart.put(entry.getValue().id(), nodeParts);
+            }
+
+            nodeParts.add(entry.getKey());
+        }
+
+        return nodesToPart;
+    }
+
+    /**
+     * Closure for scan query executing.
+     */
+    private static class ScanQueryBroadcastClosure implements IgniteRunnable {
+        /**
+         * Ignite node.
+         */
+        @IgniteInstanceResource
+        private Ignite node;
+
+        /**
+         * Information about partition.
+         */
+        private final Map<UUID, List<Integer>> cachePart;
+
+        /** */
+        private final boolean checkBalance;
+
+        /**
+         * @param cachePart Partition by node for Ignite cache.
+         * @param checkBalance Check balance flag.
+         */
+        private ScanQueryBroadcastClosure(Map<UUID, List<Integer>> cachePart, boolean checkBalance) {
+            this.cachePart = cachePart;
+            this.checkBalance = checkBalance;
+        }
+
+        /** {@inheritDoc} */
+        @Override public void run() {
+            try {
+                IgniteCache traders = node.cache(TRADER_CACHE).withKeepBinary();
+
+                IgniteCache<String, BinaryObject> depositCache = node.cache(DEPOSIT_CACHE).withKeepBinary();
+
+                // Getting a list of the partitions owned by this node.
+                List<Integer> myPartitions = cachePart.get(node.cluster().localNode().id());
+
+                for (Integer part : myPartitions) {
+                    ScanQuery scanQry = new ScanQuery();
+
+                    scanQry.setPartition(part);
+
+                    try (QueryCursor<Cache.Entry<String, BinaryObject>> cursor = traders.query(scanQry)) {
+                        for (Cache.Entry<String, BinaryObject> entry : cursor) {
+                            String traderId = entry.getKey();
+
+                            SqlFieldsQuery findDepositQry = new SqlFieldsQuery(FIND_DEPOSIT_SQL).setLocal(true);
+
+                            try (QueryCursor cursor1 = depositCache.query(findDepositQry.setArgs(traderId))) {
+                                for (Object obj : cursor1) {
+                                    List<String> depositIds = (List<String>)obj;
+
+                                    for (String depositId : depositIds) {
+                                        updateDeposit(depositCache, depositId);
+
+                                        checkDeposit(depositCache, depositId);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception e) {
+                throw new IgniteException(e);
+            }
+        }
+
+        /**
+         * @param depositCache Ignite cache of deposit.
+         * @param depositKey Key of deposit.
+         * @throws Exception If failed.
+         */
+        private void updateDeposit(final IgniteCache<String, BinaryObject> depositCache, final String depositKey)
+            throws Exception {
+            final IgniteCache histCache = node.cache(DEPOSIT_HISTORY_CACHE).withKeepBinary();
+
+            doInTransaction(node, PESSIMISTIC,
+                REPEATABLE_READ, new IgniteCallable<Object>() {
+                    @Override public Object call() throws Exception {
+                        BinaryObject deposit = depositCache.get(depositKey);
+
+                        BigDecimal amount = deposit.field(BALANCE);
+                        BigDecimal rate = deposit.field(MARGIN_RATE);
+
+                        BigDecimal newBalance = amount.multiply(rate.add(BigDecimal.ONE));
+
+                        deposit = deposit.toBuilder()
+                            .setField(BALANCE, newBalance)
+                            .build();
+
+                        SqlFieldsQuery findDepositHist = new SqlFieldsQuery(LAST_HISTORY_ROW_SQL).setLocal(true);
+
+                        try (QueryCursor cursor1 = histCache.query(findDepositHist.setArgs(depositKey))) {
+                            for (Object o: cursor1){
+                                // No-op.
+                            }
+                        }
+
+                        String depositHistKey = depositKey + "&histId=" + System.nanoTime();
+
+                        BinaryObject depositHistRow = node.binary().builder(OPERATION)
+                            .setField(ID, depositHistKey)
+                            .setField(DEPOSIT_ID, depositKey)
+                            .setField(BUSINESS_DAY, new Date())
+                            .setField(BALANCE, newBalance)
+                            .build();
+
+                        histCache.put(depositHistKey, depositHistRow);
+
+                        depositCache.put(depositKey, deposit);
+
+                        return null;
+                    }
+                });
+        }
+
+        /**
+         * @param depositCache Deposit cache.
+         * @param depositKey Deposit key.
+         */
+        private void checkDeposit(IgniteCache<String, BinaryObject> depositCache, String depositKey) {
+            IgniteCache histCache = node.cache(DEPOSIT_HISTORY_CACHE).withKeepBinary();
+
+            BinaryObject deposit = depositCache.get(depositKey);
+
+            BigDecimal startBalance = deposit.field(BALANCE_ON_DAY_OPEN);
+
+            BigDecimal balance = deposit.field(BALANCE);
+
+            BigDecimal rate = deposit.field(MARGIN_RATE);
+
+            BigDecimal expBalance;
+
+            SqlFieldsQuery findDepositHist = new SqlFieldsQuery(DEPOSIT_OPERATION_COUNT_SQL);
+
+            try (QueryCursor cursor1 = histCache.query(findDepositHist.setArgs(depositKey))) {
+                Long cnt = (Long)((ArrayList)cursor1.iterator().next()).get(0);
+
+                expBalance = startBalance.multiply(rate.add(BigDecimal.ONE).pow(cnt.intValue()));
+            }
+
+            expBalance = expBalance.setScale(2, BigDecimal.ROUND_DOWN);
+            balance = balance.setScale(2, BigDecimal.ROUND_DOWN);
+
+            if (checkBalance && !expBalance.equals(balance)) {
+                node.log().error("Deposit " + depositKey + " has incorrect balance "
+                    + balance + " when expected " + expBalance, null);
+
+                throw new IgniteException("Deposit " + depositKey + " has incorrect balance "
+                    + balance + " when expected " + expBalance);
+
+            }
+        }
+    }
+
+    /**
+     * @param max Max.
+     * @return Random value.
+     */
+    private static int nextRandom(int max) {
+        return ThreadLocalRandom.current().nextInt(max);
+    }
+
+    /**
+     * @param parentCfg Parent config.
+     * @return Configuration.
+     */
+    private static CacheConfiguration<Object, Object> getDepositHistoryCfg(
+        CacheConfiguration<Object, Object> parentCfg) {
+        CacheConfiguration<Object, Object> depositHistCfg = new CacheConfiguration<>(parentCfg);
+        depositHistCfg.setName(DEPOSIT_HISTORY_CACHE);
+
+        String strCls = String.class.getCanonicalName();
+        String dblCls = Double.class.getCanonicalName();
+        String dtCls = Date.class.getCanonicalName();
+
+        LinkedHashMap<String, String> qryFields = new LinkedHashMap<>();
+        qryFields.put(ID, strCls);
+        qryFields.put(DEPOSIT_ID, strCls);
+        qryFields.put(BUSINESS_DAY, dtCls);
+        qryFields.put(BALANCE, dblCls);
+
+        QueryEntity qryEntity = new QueryEntity();
+        qryEntity.setValueType(OPERATION);
+        qryEntity.setKeyType(strCls);
+        qryEntity.setFields(qryFields);
+        qryEntity.setIndexes(Arrays.asList(new QueryIndex(ID, true), new QueryIndex(DEPOSIT_ID, true)));
+
+        depositHistCfg.setQueryEntities(Collections.singleton(qryEntity));
+
+        return depositHistCfg;
+    }
+
+    /**
+     * @param parentCfg Parent config.
+     * @return Configuration.
+     */
+    private static CacheConfiguration<Object, Object> getDepositCfg(CacheConfiguration<Object, Object> parentCfg) {
+        CacheConfiguration<Object, Object> depositCfg = new CacheConfiguration<>(parentCfg);
+        depositCfg.setName(DEPOSIT_CACHE);
+
+        String strCls = String.class.getCanonicalName();
+        String dblCls = Double.class.getCanonicalName();
+        String intCls = Integer.class.getCanonicalName();
+
+        LinkedHashMap<String, String> qryFields = new LinkedHashMap<>();
+        qryFields.put(ID, strCls);
+        qryFields.put(TRADER_ID, strCls);
+        qryFields.put(TRADER_LINK, intCls);
+        qryFields.put(BALANCE, dblCls);
+        qryFields.put(MARGIN_RATE, dblCls);
+        qryFields.put(BALANCE_ON_DAY_OPEN, dblCls);
+
+        QueryEntity qryEntity = new QueryEntity();
+        qryEntity.setValueType(DEPOSIT);
+        qryEntity.setKeyType(strCls);
+        qryEntity.setFields(qryFields);
+        qryEntity.setIndexes(Collections.singleton(new QueryIndex(ID, false)));
+
+        depositCfg.setQueryEntities(Collections.singleton(qryEntity));
+        return depositCfg;
+    }
+
+    /**
+     * @param parentCfg Parent config.
+     * @return Configuration.
+     */
+    private static CacheConfiguration<Object, Object> getTraderCfg(CacheConfiguration<Object, Object> parentCfg) {
+        CacheConfiguration<Object, Object> traderCfg = new CacheConfiguration<>(parentCfg);
+        traderCfg.setName(TRADER_CACHE);
+
+        String strCls = String.class.getCanonicalName();
+
+        LinkedHashMap<String, String> qryFields = new LinkedHashMap<>();
+        qryFields.put(ID, strCls);
+        qryFields.put(FIRSTNAME, strCls);
+        qryFields.put(SECONDNAME, strCls);
+        qryFields.put(EMAIL, strCls);
+
+        QueryEntity qryEntity = new QueryEntity();
+        qryEntity.setValueType(TRADER);
+        qryEntity.setKeyType(strCls);
+        qryEntity.setFields(qryFields);
+
+        LinkedHashMap<String, Boolean> grpIdx = new LinkedHashMap<>();
+        grpIdx.put(FIRSTNAME, false);
+        grpIdx.put(SECONDNAME, false);
+
+        qryEntity.setIndexes(Arrays.asList(
+            new QueryIndex(ID, true),
+            new QueryIndex(grpIdx, QueryIndexType.FULLTEXT)
+        ));
+
+        traderCfg.setQueryEntities(Collections.singleton(qryEntity));
+        return traderCfg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/9ff4e539/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
index 761d4bd..3cb603c 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
@@ -24,7 +24,6 @@ import org.apache.ignite.internal.processors.cache.BinarySerializationQueryWithR
 import org.apache.ignite.internal.processors.cache.IgniteCacheBinaryObjectsScanSelfTest;
 import org.apache.ignite.internal.processors.cache.binary.distributed.dht.GridCacheBinaryDuplicateIndexObjectPartitionedAtomicSelfTest;
 import org.apache.ignite.internal.processors.cache.binary.distributed.dht.GridCacheBinaryDuplicateIndexObjectPartitionedTransactionalSelfTest;
-import org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryLostPartitionTest;
 import org.apache.ignite.testframework.config.GridTestProperties;
 
 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/9ff4e539/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java
index 5c9c733..359c7fd 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite2.java
@@ -19,6 +19,7 @@ package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.cache.IgniteCacheQueriesLoadTest1;
 import org.apache.ignite.testframework.config.GridTestProperties;
 
 /**
@@ -34,6 +35,8 @@ public class IgniteBinaryCacheQueryTestSuite2 extends TestSuite {
 
         TestSuite suite = IgniteCacheQuerySelfTestSuite2.suite();
 
+        suite.addTestSuite(IgniteCacheQueriesLoadTest1.class);
+
         return suite;
     }
 }