Repository: ignite Updated Branches: refs/heads/master 64e0e69a5 -> afe23b60b
IGNITE-9902 Fixed ScanQuery to account for LOST partitions - Fixes #5464. Signed-off-by: Alexey Goncharuk <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/afe23b60 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/afe23b60 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/afe23b60 Branch: refs/heads/master Commit: afe23b60bbbf4938cb7c471f20a59b51a7ad26a8 Parents: 64e0e69 Author: Alexey Platonov <[email protected]> Authored: Tue Dec 18 17:35:34 2018 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Tue Dec 18 17:35:34 2018 +0300 ---------------------------------------------------------------------- .../cache/query/GridCacheQueryAdapter.java | 25 +++++++++++++++++--- .../IgniteCachePartitionLossPolicySelfTest.java | 24 ++++++++++++++++--- 2 files changed, 43 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/afe23b60/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java index 36ee3ba..6f3772c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryAdapter.java @@ -33,6 +33,7 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.PartitionLossPolicy; import org.apache.ignite.cache.query.Query; import org.apache.ignite.cache.query.QueryMetrics; import org.apache.ignite.cluster.ClusterGroup; @@ -537,9 +538,17 @@ public class GridCacheQueryAdapter<T> implements CacheQuery<T> { cctx.checkSecurity(SecurityPermission.CACHE_READ); if (nodes.isEmpty()) { - if (part != null && forceLocal) - throw new IgniteCheckedException("No queryable nodes for partition " + part - + " [forced local query=" + this + "]"); + if (part != null) { + if (forceLocal) { + throw new IgniteCheckedException("No queryable nodes for partition " + part + + " [forced local query=" + this + "]"); + } + + if (isSafeLossPolicy()) { + throw new IgniteCheckedException("Failed to execute scan query because cache partition has been " + + "lost [cacheName=" + cctx.name() + ", part=" + part + "]"); + } + } return new GridEmptyCloseableIterator(); } @@ -588,6 +597,16 @@ public class GridCacheQueryAdapter<T> implements CacheQuery<T> { } /** + * @return true if current PartitionLossPolicy corresponds to *_SAFE values. + */ + private boolean isSafeLossPolicy() { + PartitionLossPolicy lossPlc = cctx.cache().configuration().getPartitionLossPolicy(); + + return lossPlc == PartitionLossPolicy.READ_ONLY_SAFE || + lossPlc == PartitionLossPolicy.READ_WRITE_SAFE; + } + + /** * @return Nodes to execute on. */ private Collection<ClusterNode> nodes() throws IgniteCheckedException { http://git-wip-us.apache.org/repos/asf/ignite/blob/afe23b60/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java index 3855c39..70d139f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java @@ -32,6 +32,7 @@ import javax.cache.CacheException; import junit.framework.AssertionFailedError; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cache.PartitionLossPolicy; import org.apache.ignite.cache.affinity.Affinity; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; @@ -837,9 +838,26 @@ public class IgniteCachePartitionLossPolicySelfTest extends GridCommonAbstractTe * @param parts Partitions. */ protected void checkQueryFails(Ignite node, boolean loc, int... parts) { - // TODO Scan queries never fail due to partition loss - https://issues.apache.org/jira/browse/IGNITE-9902. - // TODO Need to add an actual check after https://issues.apache.org/jira/browse/IGNITE-9902 is fixed. - // No-op. + if (parts.length == 0) + return; + + IgniteCache cache = node.cache(DEFAULT_CACHE_NAME); + + String msg = loc ? "forced local query" : "partition has been lost"; + GridTestUtils.assertThrows(log, () -> { + List res = null; + for (int partition : parts) { + ScanQuery qry = new ScanQuery(); + qry.setPartition(partition); + + if (loc) + qry.setLocal(true); + + res = cache.query(qry).getAll(); + } + + return res; + }, IgniteCheckedException.class, msg); } /** */
