diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/CacheQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/CacheQuery.java index 6f394c2efce5d..634556f270022 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/CacheQuery.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/CacheQuery.java @@ -859,14 +859,22 @@ private static Collection nodes(final GridCacheContext cctx, if (part != null && part >= cctx.affinity().partitions()) throw new IgniteCheckedException("Invalid partition number: " + part); - final Set owners = - part == null ? Collections.emptySet() : new HashSet<>(cctx.topology().owners(part, topVer)); + final Set partHolders; + + if (part != null) { + if (cctx.config().getCacheMode() == CacheMode.PARTITIONED) + partHolders = Collections.singleton(cctx.affinity().primaryByPartition(part, topVer)); + else + partHolders = new HashSet<>(cctx.topology().owners(part, topVer)); + } + else + partHolders = Collections.emptySet(); return F.view(affNodes, new P1() { @Override public boolean apply(ClusterNode n) { return cctx.discovery().cacheAffinityNode(n, cctx.name()) && (prj == null || prj.node(n.id()) != null) && - (part == null || owners.contains(n)); + (part == null || partHolders.contains(n)); } }); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java index 8fe2c925bb10b..a23361aa0bdd4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java @@ -46,6 +46,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cache.CacheEntry; +import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.cache.query.IndexQuery; import org.apache.ignite.cache.query.QueryMetrics; @@ -1123,7 +1124,10 @@ public GridCloseableIterator indexQueryLocal(final CacheQuery qry) throws Ignite if (part != null) { final GridDhtLocalPartition locPart = cctx.dht().topology().localPartition(part); - if (locPart == null || locPart.state() != OWNING) { + boolean nonLocPart = locPart == null || locPart.state() != OWNING || + (cctx.config().getCacheMode() == CacheMode.PARTITIONED && !locPart.primary(AffinityTopologyVersion.NONE)); + + if (nonLocPart) { throw new CacheInvalidStateException("Failed to execute index query because required partition " + "has not been found on local node [cacheName=" + cctx.name() + ", part=" + part + "]"); } diff --git a/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryPartitionTest.java b/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryPartitionTest.java index 73ea7f305320b..a0704047a43d7 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryPartitionTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/cache/query/IndexQueryPartitionTest.java @@ -78,6 +78,7 @@ public static List params() { .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL) .setCacheMode(cacheMode) .setIndexedTypes(Integer.class, Person.class) + .setBackups(1) .setAffinity(new RendezvousAffinityFunction().setPartitions(100)); cfg.setCacheConfiguration(ccfg); @@ -136,7 +137,7 @@ public void testSinglePartition() { } } - assertEquals(sendReq, TestRecordingCommunicationSpi.spi(grid()).recordedMessages(true).size()); + assertEquals("part=" + part, sendReq, TestRecordingCommunicationSpi.spi(grid()).recordedMessages(true).size()); } }