Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 53CB610796 for ; Tue, 23 Dec 2014 08:24:37 +0000 (UTC) Received: (qmail 82709 invoked by uid 500); 23 Dec 2014 08:24:37 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 82678 invoked by uid 500); 23 Dec 2014 08:24:37 -0000 Mailing-List: contact commits-help@ignite.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.incubator.apache.org Delivered-To: mailing list commits@ignite.incubator.apache.org Received: (qmail 82669 invoked by uid 99); 23 Dec 2014 08:24:37 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 23 Dec 2014 08:24:37 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO mail.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with SMTP; Tue, 23 Dec 2014 08:24:35 +0000 Received: (qmail 81200 invoked by uid 99); 23 Dec 2014 08:24:15 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 23 Dec 2014 08:24:15 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id D958DA34A04; Tue, 23 Dec 2014 08:24:14 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.incubator.apache.org Date: Tue, 23 Dec 2014 08:24:15 -0000 Message-Id: <44e20e1d4bec44909718a690ceee06b5@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [2/7] incubator-ignite git commit: GG-9580 - Fix for queries in replicated cache X-Virus-Checked: Checked by ClamAV on apache.org GG-9580 - Fix for queries in replicated cache Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/1483feb0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/1483feb0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/1483feb0 Branch: refs/heads/ignite-1 Commit: 1483feb0e2eed3263ea664115385f9bbe48f927a Parents: 1812040 Author: Valentin Kulichenko Authored: Mon Dec 22 16:00:22 2014 -0800 Committer: Valentin Kulichenko Committed: Mon Dec 22 16:00:22 2014 -0800 ---------------------------------------------------------------------- .../cache/query/GridCacheQueryAdapter.java | 46 ++++++++++++++++---- .../java/org/gridgain/grid/util/GridUtils.java | 19 ++++++++ .../cache/GridCacheAbstractQuerySelfTest.java | 3 +- .../GridCacheReplicatedQuerySelfTest.java | 39 ++++++++++++++++- 4 files changed, 96 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1483feb0/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/GridCacheQueryAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/GridCacheQueryAdapter.java b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/GridCacheQueryAdapter.java index d15d77c..e22b420 100644 --- a/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/GridCacheQueryAdapter.java +++ b/modules/core/src/main/java/org/gridgain/grid/kernal/processors/cache/query/GridCacheQueryAdapter.java @@ -13,7 +13,6 @@ import org.apache.ignite.*; import org.apache.ignite.cluster.*; import org.apache.ignite.lang.*; import org.apache.ignite.plugin.security.*; -import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.cache.query.*; import org.gridgain.grid.kernal.processors.cache.*; @@ -23,6 +22,7 @@ import org.jetbrains.annotations.*; import java.util.*; +import static org.gridgain.grid.cache.GridCacheDistributionMode.*; import static org.gridgain.grid.kernal.processors.cache.query.GridCacheQueryType.*; /** @@ -447,18 +447,48 @@ public class GridCacheQueryAdapter implements GridCacheQuery { * @return Nodes to execute on. */ private Collection nodes() { - Collection nodes = CU.allNodes(cctx); + GridCacheMode cacheMode = cctx.config().getCacheMode(); + + switch (cacheMode) { + case LOCAL: + if (prj != null) + U.warn(log, "Ignoring query projection because it's executed over LOCAL cache " + + "(only local node will be queried): " + this); - if (prj == null) { - if (cctx.isReplicated()) return Collections.singletonList(cctx.localNode()); - return nodes; + case REPLICATED: + if (prj != null) + return nodes(cctx, prj); + + GridCacheDistributionMode mode = cctx.config().getDistributionMode(); + + return mode == PARTITIONED_ONLY || mode == NEAR_PARTITIONED ? + Collections.singletonList(cctx.localNode()) : + Collections.singletonList(F.rand(nodes(cctx, null))); + + case PARTITIONED: + return nodes(cctx, prj); + + default: + throw new IllegalStateException("Unknown cache distribution mode: " + cacheMode); } + } + + /** + * @param cctx Cache context. + * @param prj Projection (optional). + * @return Collection of data nodes in provided projection (if any). + */ + private static Collection nodes(final GridCacheContext cctx, @Nullable final ClusterGroup prj) { + assert cctx != null; + + return F.view(CU.allNodes(cctx), new P1() { + @Override public boolean apply(ClusterNode n) { + GridCacheDistributionMode mode = U.distributionMode(n, cctx.name()); - return F.view(nodes, new P1() { - @Override public boolean apply(ClusterNode e) { - return prj.node(e.id()) != null; + return (mode == PARTITIONED_ONLY || mode == NEAR_PARTITIONED) && + (prj == null || prj.node(n.id()) != null); } }); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1483feb0/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java b/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java index 803badd..fb7955d 100644 --- a/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java +++ b/modules/core/src/main/java/org/gridgain/grid/util/GridUtils.java @@ -7194,6 +7194,25 @@ public abstract class GridUtils { } /** + * Gets cache distribution mode on given node or {@code null} if cache is not + * present on given node. + * + * @param n Node to check. + * @param cacheName Cache to check. + * @return Cache distribution mode or {@code null} if cache is not found. + */ + @Nullable public static GridCacheDistributionMode distributionMode(ClusterNode n, String cacheName) { + GridCacheAttributes[] caches = n.attribute(ATTR_CACHE); + + if (caches != null) + for (GridCacheAttributes attrs : caches) + if (F.eq(cacheName, attrs.cacheName())) + return attrs.partitionedTaxonomy(); + + return null; + } + + /** * Checks if given node has near cache enabled for the specified * partitioned cache. * http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1483feb0/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractQuerySelfTest.java b/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractQuerySelfTest.java index 2883215..4987a8c 100644 --- a/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractQuerySelfTest.java +++ b/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/GridCacheAbstractQuerySelfTest.java @@ -18,7 +18,6 @@ import org.apache.ignite.spi.discovery.tcp.*; import org.apache.ignite.spi.discovery.tcp.ipfinder.*; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*; import org.apache.ignite.spi.swapspace.file.*; -import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.cache.query.*; import org.gridgain.grid.cache.store.*; @@ -117,7 +116,7 @@ public abstract class GridCacheAbstractQuerySelfTest extends GridCommonAbstractT cc.setCacheMode(cacheMode()); cc.setAtomicityMode(atomicityMode()); - cc.setDistributionMode(distributionMode()); + cc.setDistributionMode(gridName.startsWith("client") ? CLIENT_ONLY :distributionMode()); cc.setWriteSynchronizationMode(FULL_SYNC); cc.setStore(store); cc.setPreloadMode(SYNC); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1483feb0/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/replicated/GridCacheReplicatedQuerySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/replicated/GridCacheReplicatedQuerySelfTest.java b/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/replicated/GridCacheReplicatedQuerySelfTest.java index d72d004..c0c3306 100644 --- a/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/replicated/GridCacheReplicatedQuerySelfTest.java +++ b/modules/indexing/src/test/java/org/gridgain/grid/kernal/processors/cache/distributed/replicated/GridCacheReplicatedQuerySelfTest.java @@ -13,7 +13,6 @@ import org.apache.ignite.*; import org.apache.ignite.cluster.*; import org.apache.ignite.events.*; import org.apache.ignite.lang.*; -import org.gridgain.grid.*; import org.gridgain.grid.cache.*; import org.gridgain.grid.cache.query.*; import org.gridgain.grid.kernal.*; @@ -98,6 +97,44 @@ public class GridCacheReplicatedQuerySelfTest extends GridCacheAbstractQuerySelf } /** + * @throws Exception If failed. + */ + public void testClientOnlyNode() throws Exception { + try { + Ignite g = startGrid("client"); + + GridCache c = g.cache(null); + + for (int i = 0; i < 10; i++) + c.putx(i, i); + + // Client cache should be empty. + assertEquals(0, c.size()); + + Collection> res = + c.queries().createSqlQuery(Integer.class, "_key >= 5 order by _key").execute().get(); + + assertEquals(5, res.size()); + + Iterator> it = res.iterator(); + + int i = 5; + + while (it.hasNext()) { + Map.Entry e = it.next(); + + assertEquals(i, e.getKey().intValue()); + assertEquals(i, e.getValue().intValue()); + + i++; + } + } + finally { + stopGrid("client"); + } + } + + /** * JUnit. * * @throws Exception If failed.