Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 461B2200C30 for ; Mon, 20 Feb 2017 12:46:28 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 44FB1160B78; Mon, 20 Feb 2017 11:46:28 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C310C160B86 for ; Mon, 20 Feb 2017 12:46:26 +0100 (CET) Received: (qmail 68206 invoked by uid 500); 20 Feb 2017 11:46:26 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 67532 invoked by uid 99); 20 Feb 2017 11:46:25 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 20 Feb 2017 11:46:25 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 7CF21E97B6; Mon, 20 Feb 2017 11:46:25 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Mon, 20 Feb 2017 11:46:47 -0000 Message-Id: In-Reply-To: <7593ce747c0b42e483bb8f4850632dbf@git.apache.org> References: <7593ce747c0b42e483bb8f4850632dbf@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [23/29] ignite git commit: ignite-4624 Scan query optimization archived-at: Mon, 20 Feb 2017 11:46:28 -0000 ignite-4624 Scan query optimization Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/260ec364 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/260ec364 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/260ec364 Branch: refs/heads/ignite-2.0 Commit: 260ec364b8671b9c3315de423d3c9b546afa7ee1 Parents: 11bc058 Author: Andrey V. Mashenkov Authored: Fri Feb 17 16:15:31 2017 +0300 Committer: sboikov Committed: Fri Feb 17 16:15:31 2017 +0300 ---------------------------------------------------------------------- .../distributed/dht/GridDhtCacheAdapter.java | 19 +++- .../cache/query/GridCacheQueryManager.java | 97 ++++++++++---------- 2 files changed, 64 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/260ec364/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java index 1cd3cfb..0e6d876 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java @@ -1242,14 +1242,27 @@ public abstract class GridDhtCacheAdapter extends GridDistributedCacheAdap final boolean backup, final boolean keepBinary, final AffinityTopologyVersion topVer) { + + return iterator(localEntriesIteratorEx(primary, backup, topVer), !keepBinary); + } + + /** + * @param primary If {@code true} includes primary entries. + * @param backup If {@code true} includes backup entries. + * @param topVer Specified affinity topology version. + * @return Local entries iterator. + */ + public Iterator localEntriesIteratorEx(final boolean primary, + final boolean backup, + final AffinityTopologyVersion topVer) { assert primary || backup; if (primary && backup) - return iterator(entries().iterator(), !keepBinary); + return entries().iterator(); else { final Iterator partIt = topology().currentLocalPartitions().iterator(); - Iterator it = new Iterator() { + return new Iterator() { private GridCacheMapEntry next; private Iterator curIt; @@ -1306,8 +1319,6 @@ public abstract class GridDhtCacheAdapter extends GridDistributedCacheAdap while (partIt.hasNext()); } }; - - return iterator(it, !keepBinary); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/260ec364/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java ---------------------------------------------------------------------- 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 87ba87c..7af3485 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 @@ -1033,23 +1033,25 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte * @throws GridDhtUnreservedPartitionException If failed to reserve partition. */ private GridIterator> onheapIterator( - GridCacheQueryAdapter qry, + final GridCacheQueryAdapter qry, AffinityTopologyVersion topVer, final IgniteBiPredicate keyValFilter, - boolean backups, + final boolean backups, final ExpiryPolicy plc, final boolean locNode) throws GridDhtUnreservedPartitionException { - Iterator keyIter; + Iterator entryIter; GridDhtLocalPartition locPart = null; Integer part = qry.partition(); - if (part == null || cctx.isLocal()) { - // Performance optimization. - if (locNode && plc == null && !cctx.isLocal()) { - GridDhtCacheAdapter cache = cctx.isNear() ? cctx.near().dht() : cctx.dht(); + if (cctx.isLocal()) + entryIter = cctx.local().allEntries().iterator(); + else if (part == null) { + GridDhtCacheAdapter cache = cctx.isNear() ? cctx.near().dht() : cctx.dht(); + // Performance optimization. + if (locNode && plc == null) { final Iterator> iter = cache.localEntriesIterator(true, backups, cache.context().keepBinary(), topVer); @@ -1099,12 +1101,10 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte }; } - IgniteInternalCache keepBinaryCache = cctx.cache().keepBinary(); - - keyIter = backups ? keepBinaryCache.keySetx().iterator() : keepBinaryCache.primaryKeySet().iterator(); + entryIter = cache.localEntriesIteratorEx(true, backups, topVer); } else if (part < 0 || part >= cctx.affinity().partitions()) - keyIter = new GridEmptyIterator<>(); + return new GridEmptyIterator<>(); else { final GridDhtCacheAdapter dht = cctx.isNear() ? cctx.near().dht() : cctx.dht(); @@ -1115,28 +1115,12 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte throw new GridDhtUnreservedPartitionException(part, cctx.affinity().affinityTopologyVersion(), "Partition can not be reserved."); - final GridDhtLocalPartition locPart0 = locPart; - - keyIter = new Iterator() { - private Iterator iter0 = locPart0.keySet().iterator(); - - @Override public boolean hasNext() { - return iter0.hasNext(); - } - - @Override public K next() { - return (K)iter0.next(); - } - - @Override public void remove() { - iter0.remove(); - } - }; + entryIter = locPart.allEntries().iterator(); } final GridDhtLocalPartition locPart0 = locPart; - return new PeekValueExpiryAwareIterator(keyIter, plc, topVer, keyValFilter, qry.keepBinary(), locNode, true) { + return new PeekValueExpiryAwareIterator(entryIter, plc, topVer, keyValFilter, qry.keepBinary(), locNode, true) { @Override protected void onClose() { super.onClose(); @@ -1263,18 +1247,20 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte ExpiryPolicy expPlc, final boolean keepBinary, boolean locNode) { - Iterator keyIter = new Iterator() { + Iterator keyIter = new Iterator() { /** {@inheritDoc} */ @Override public boolean hasNext() { return it.hasNext(); } /** {@inheritDoc} */ - @Override public K next() { + @Override public GridCacheEntryEx next() { try { KeyCacheObject key = cctx.toCacheKeyObject(it.next().getKey()); - return (K)cctx.unwrapBinaryIfNeeded(key, keepBinary); + final GridCacheEntryEx entryEx = cctx.cache().entryEx(key); + + return entryEx; } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -2190,8 +2176,8 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte } /** - * Gets cache queries detailed metrics. - * Detail metrics could be enabled by setting non-zero value via {@link CacheConfiguration#setQueryDetailMetricsSize(int)} + * Gets cache queries detailed metrics. Detail metrics could be enabled by setting non-zero value via {@link + * CacheConfiguration#setQueryDetailMetricsSize(int)} * * @return Cache queries metrics aggregated by query type and query text. */ @@ -3092,8 +3078,10 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte private abstract static class CachedResult extends GridFutureAdapter> { /** Absolute position of each recipient. */ private final Map recipients = new GridLeanMap<>(1); + /** */ private CircularQueue queue; + /** */ private int pruned; @@ -3530,10 +3518,10 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte private IgniteCacheExpiryPolicy expiryPlc; /** */ - private Iterator keyIt; + private Iterator entryIt; /** - * @param keyIt Key iterator. + * @param entryIter Key iterator. * @param plc Expiry policy. * @param topVer Topology version. * @param keyValFilter Key-value filter. @@ -3541,8 +3529,8 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte * @param locNode Local node. * @param heapOnly Heap only. */ - private PeekValueExpiryAwareIterator( - Iterator keyIt, + PeekValueExpiryAwareIterator( + Iterator entryIter, ExpiryPolicy plc, AffinityTopologyVersion topVer, IgniteBiPredicate keyValFilter, @@ -3550,7 +3538,7 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte boolean locNode, boolean heapOnly ) { - this.keyIt = keyIt; + this.entryIt = entryIter; this.plc = plc; this.topVer = topVer; this.keyValFilter = keyValFilter; @@ -3594,15 +3582,27 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte private void advance() { IgniteBiTuple next0 = null; - while (keyIt.hasNext()) { + while (entryIt.hasNext()) { next0 = null; - K key = keyIt.next(); + GridCacheEntryEx entry = entryIt.next(); + + if (entry.deleted()) + continue; + KeyCacheObject key = entry.key(); CacheObject val; try { - val = value(key); + if (heapOnly) + val = entry.peek(true, false, false, expiryPlc); + else + val = value(entry, entry.key()); + } + catch (GridCacheEntryRemovedException ignore) { + assert heapOnly; + + continue; } catch (IgniteCheckedException e) { if (log.isDebugEnabled()) @@ -3665,23 +3665,24 @@ public abstract class GridCacheQueryManager extends GridCacheManagerAdapte } /** + * @param entry Entry. * @param key Key. * @return Value. * @throws IgniteCheckedException If failed to peek value. */ - private CacheObject value(K key) throws IgniteCheckedException { + private CacheObject value(GridCacheEntryEx entry, KeyCacheObject key) throws IgniteCheckedException { while (true) { try { - GridCacheEntryEx entry = heapOnly ? cache.peekEx(key) : cache.entryEx(key); + if (entry == null) + entry = cache.entryEx(key); - if (expiryPlc != null && !heapOnly) + if (expiryPlc != null) entry.unswap(); - return entry != null ? entry.peek(true, !heapOnly, !heapOnly, topVer, expiryPlc) : null; + return entry.peek(true, true, true, topVer, expiryPlc); } catch (GridCacheEntryRemovedException ignore) { - if (heapOnly) - return null; + entry = null; } } }