You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/11/26 08:50:05 UTC
[01/11] ignite git commit: IGNITE-1999: Improved .NET ServicesExample
a bit.
Repository: ignite
Updated Branches:
refs/heads/ignite-1956 d44f68dd8 -> 8dfd7f9b8
IGNITE-1999: Improved .NET ServicesExample a bit.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f9690df8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f9690df8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f9690df8
Branch: refs/heads/ignite-1956
Commit: f9690df8e6a87b5e537a2e75f5affc61deda468d
Parents: ef2007d
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 25 17:44:15 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 25 17:44:15 2015 +0300
----------------------------------------------------------------------
.../examples/Apache.Ignite.Examples/Services/ServicesExample.cs | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f9690df8/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Services/ServicesExample.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Services/ServicesExample.cs b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Services/ServicesExample.cs
index 121a5c4..77eb253 100644
--- a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Services/ServicesExample.cs
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Services/ServicesExample.cs
@@ -72,6 +72,10 @@ namespace Apache.Ignite.Examples.Services
ignite.GetServices().CancelAll();
}
+
+ Console.WriteLine();
+ Console.WriteLine(">>> Example finished, press any key to exit ...");
+ Console.ReadKey();
}
}
}
[09/11] ignite git commit: Disabled shmem communication in failover
tests.
Posted by vo...@apache.org.
Disabled shmem communication in failover tests.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/28d6e006
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/28d6e006
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/28d6e006
Branch: refs/heads/ignite-1956
Commit: 28d6e006c40b83fc8744b44312e74779264c0265
Parents: 4af461a
Author: sboikov <sb...@gridgain.com>
Authored: Thu Nov 26 09:55:24 2015 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Nov 26 09:55:24 2015 +0300
----------------------------------------------------------------------
.../GridCacheAbstractDataStructuresFailoverSelfTest.java | 3 +++
.../cache/datastructures/IgniteCollectionAbstractTest.java | 3 +++
2 files changed, 6 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/28d6e006/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java
index bc11448..4ee200b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java
@@ -54,6 +54,7 @@ import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.lang.IgniteCallable;
import org.apache.ignite.lang.IgniteClosure;
import org.apache.ignite.resources.IgniteInstanceResource;
+import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.testframework.GridTestUtils;
@@ -122,6 +123,8 @@ public abstract class GridCacheAbstractDataStructuresFailoverSelfTest extends Ig
@Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(gridName);
+ ((TcpCommunicationSpi)cfg.getCommunicationSpi()).setSharedMemoryPort(-1);
+
AtomicConfiguration atomicCfg = new AtomicConfiguration();
atomicCfg.setCacheMode(collectionCacheMode());
http://git-wip-us.apache.org/repos/asf/ignite/blob/28d6e006/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCollectionAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCollectionAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCollectionAbstractTest.java
index 36c846a..3e38a58 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCollectionAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCollectionAbstractTest.java
@@ -26,6 +26,7 @@ import org.apache.ignite.configuration.CollectionConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.datastructures.GridCacheQueueAdapter;
+import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi;
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;
@@ -45,6 +46,8 @@ public abstract class IgniteCollectionAbstractTest extends GridCommonAbstractTes
@Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(gridName);
+ ((TcpCommunicationSpi)cfg.getCommunicationSpi()).setSharedMemoryPort(-1);
+
TcpDiscoverySpi spi = new TcpDiscoverySpi();
spi.setIpFinder(ipFinder);
[03/11] ignite git commit: Merge branch 'ignite-1.5' of
https://git-wip-us.apache.org/repos/asf/ignite into ignite-1.5
Posted by vo...@apache.org.
Merge branch 'ignite-1.5' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-1.5
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b9e4e036
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b9e4e036
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b9e4e036
Branch: refs/heads/ignite-1956
Commit: b9e4e0367dd38c5d4053e15e1d7307621f52bcfc
Parents: 8a9cc54 f9690df
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Nov 25 18:23:54 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Nov 25 18:23:54 2015 +0300
----------------------------------------------------------------------
examples/pom.xml | 2 +-
.../org/apache/ignite/internal/IgnitionEx.java | 9 +++--
.../internal/portable/BinaryReaderExImpl.java | 18 +++++++--
.../processors/cache/CacheLockImpl.java | 18 ++++++++-
.../colocated/GridDhtColocatedLockFuture.java | 8 ++--
.../platform/PlatformContextImpl.java | 2 +-
.../cache/GridCacheAbstractFullApiSelfTest.java | 42 +++++++++++++++++++-
.../Services/ServicesExample.cs | 4 ++
modules/scalar/pom.xml | 4 +-
modules/spark/pom.xml | 4 +-
modules/visor-console/pom.xml | 2 +-
parent/pom.xml | 2 +-
12 files changed, 93 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
[07/11] ignite git commit: IGNITE-1990 Added missing classed to
classnames-jdk.properties.
Posted by vo...@apache.org.
IGNITE-1990 Added missing classed to classnames-jdk.properties.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3c42da8b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3c42da8b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3c42da8b
Branch: refs/heads/ignite-1956
Commit: 3c42da8b08973fab850a5ebc48b71915ce02f992
Parents: 97270bf
Author: AKuznetsov <ak...@gridgain.com>
Authored: Thu Nov 26 07:21:18 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Thu Nov 26 07:21:18 2015 +0700
----------------------------------------------------------------------
.../visor/cache/VisorCacheConfiguration.java | 4 +-
.../cache/VisorCacheTypeFieldMetadata.java | 30 ++++-
.../visor/cache/VisorCacheTypeMetadata.java | 133 +++++++++++++++++--
.../META-INF/classnames-jdk.properties | 2 +
4 files changed, 152 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/3c42da8b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
index 073ad22..69eb311 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheConfiguration.java
@@ -138,7 +138,7 @@ public class VisorCacheConfiguration implements Serializable {
maxConcurrentAsyncOps = ccfg.getMaxConcurrentAsyncOperations();
memoryMode = ccfg.getMemoryMode();
interceptor = compactClass(ccfg.getInterceptor());
- typeMeta = VisorCacheTypeMetadata.list(ccfg.getTypeMetadata());
+ typeMeta = VisorCacheTypeMetadata.list(ccfg.getQueryEntities(), ccfg.getCacheStoreFactory(), ccfg.getTypeMetadata());
statisticsEnabled = ccfg.isStatisticsEnabled();
mgmtEnabled = ccfg.isManagementEnabled();
ldrFactory = compactClass(ccfg.getCacheLoaderFactory());
@@ -350,4 +350,4 @@ public class VisorCacheConfiguration implements Serializable {
@Override public String toString() {
return S.toString(VisorCacheConfiguration.class, this);
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3c42da8b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
index c21354b..323e536 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeFieldMetadata.java
@@ -45,14 +45,30 @@ public class VisorCacheTypeFieldMetadata implements Serializable {
* @return Data transfer object for given cache field metadata.
*/
public static VisorCacheTypeFieldMetadata from(CacheTypeFieldMetadata f) {
- VisorCacheTypeFieldMetadata fieldMetadata = new VisorCacheTypeFieldMetadata();
+ return new VisorCacheTypeFieldMetadata(f.getDatabaseName(), f.getDatabaseType(),
+ f.getJavaName(), U.compact(f.getJavaType().getName()));
+ }
- fieldMetadata.dbName = f.getDatabaseName();
- fieldMetadata.dbType = f.getDatabaseType();
- fieldMetadata.javaName = f.getJavaName();
- fieldMetadata.javaType = U.compact(f.getJavaType().getName());
+ /**
+ * Empty constructor.
+ */
+ public VisorCacheTypeFieldMetadata() {
+ // No-op.
+ }
- return fieldMetadata;
+ /**
+ * Full constructor.
+ *
+ * @param dbName Column name in database.
+ * @param dbType Column JDBC type in database.
+ * @param javaName Field name in java object.
+ * @param javaType Corresponding java type.
+ */
+ public VisorCacheTypeFieldMetadata(String dbName, int dbType, String javaName, String javaType) {
+ this.dbName = dbName;
+ this.dbType = dbType;
+ this.javaName = javaName;
+ this.javaType = javaType;
}
/**
@@ -82,4 +98,4 @@ public class VisorCacheTypeFieldMetadata implements Serializable {
public String javaType() {
return javaType;
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3c42da8b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
index 2a00ec1..ec7a114 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheTypeMetadata.java
@@ -25,10 +25,17 @@ import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.ignite.cache.CacheTypeFieldMetadata;
import org.apache.ignite.cache.CacheTypeMetadata;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory;
+import org.apache.ignite.cache.store.jdbc.JdbcType;
+import org.apache.ignite.cache.store.jdbc.JdbcTypeField;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiTuple;
+import javax.cache.configuration.Factory;
+
/**
* Data transfer object for {@link CacheTypeMetadata}.
*/
@@ -77,19 +84,129 @@ public class VisorCacheTypeMetadata implements Serializable {
private Map<String, LinkedHashMap<String, IgniteBiTuple<String, Boolean>>> grps;
/**
+ * @param qryEntities Collection of query entities.
+ * @param factory Store factory to extract JDBC types info.
* @param types Cache types metadata configurations.
* @return Data transfer object for cache type metadata configurations.
*/
- public static Collection<VisorCacheTypeMetadata> list(Collection<CacheTypeMetadata> types) {
- if (types == null)
- return Collections.emptyList();
+ public static Collection<VisorCacheTypeMetadata> list(Collection<QueryEntity> qryEntities, Factory factory,
+ Collection<CacheTypeMetadata> types) {
+ final Collection<VisorCacheTypeMetadata> metas = new ArrayList<>();
+
+ Map<String, VisorCacheTypeMetadata> metaMap =
+ U.newHashMap(qryEntities != null ? qryEntities.size() : 0);
+
+ // Add query entries.
+ if (qryEntities != null)
+ for (QueryEntity qryEntity : qryEntities) {
+ VisorCacheTypeMetadata meta = from(qryEntity);
+
+ metas.add(meta);
+
+ metaMap.put(meta.keyType, meta);
+ }
+
+ // Add JDBC types.
+ if (factory != null && factory instanceof CacheJdbcPojoStoreFactory) {
+ CacheJdbcPojoStoreFactory jdbcFactory = (CacheJdbcPojoStoreFactory) factory;
+
+ for (JdbcType jdbcType : jdbcFactory.getTypes()) {
+ VisorCacheTypeMetadata meta = metaMap.get(jdbcType.getKeyType());
+
+ boolean notFound = meta == null;
+
+ if (notFound) {
+ meta = new VisorCacheTypeMetadata();
+
+ meta.keyType = jdbcType.getKeyType();
+ meta.valType = jdbcType.getValueType();
+
+ meta.qryFlds = Collections.emptyMap();
+ meta.ascFlds = Collections.emptyMap();
+ meta.descFlds = Collections.emptyMap();
+ meta.txtFlds = Collections.emptyList();
+ meta.grps = Collections.emptyMap();
+ }
- final Collection<VisorCacheTypeMetadata> cfgs = new ArrayList<>(types.size());
+ meta.dbSchema = jdbcType.getDatabaseSchema();
+ meta.dbTbl = jdbcType.getDatabaseTable();
- for (CacheTypeMetadata type : types)
- cfgs.add(from(type));
+ JdbcTypeField[] keyFields = jdbcType.getKeyFields();
+
+ meta.keyFields = new ArrayList<>(keyFields.length);
+
+ for (JdbcTypeField fld : keyFields)
+ meta.keyFields.add(new VisorCacheTypeFieldMetadata(
+ fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
+ fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
+
+ JdbcTypeField[] valFields = jdbcType.getValueFields();
+
+ meta.valFields = new ArrayList<>(valFields.length);
+
+ for (JdbcTypeField fld : valFields)
+ meta.valFields.add(new VisorCacheTypeFieldMetadata(
+ fld.getDatabaseFieldName(), fld.getDatabaseFieldType(),
+ fld.getDatabaseFieldName(), U.compact(fld.getJavaFieldType().getName())));
+
+ if (notFound)
+ metas.add(meta);
+ }
+ }
+
+ // Add old deprecated CacheTypeMetadata for compatibility.
+ if (types != null)
+ for (CacheTypeMetadata type : types)
+ metas.add(from(type));
+
+ return metas;
+ }
- return cfgs;
+ /**
+ * @param q Actual cache query entities.
+ * @return Data transfer object for given cache type metadata.
+ */
+ public static VisorCacheTypeMetadata from(QueryEntity q) {
+ assert q != null;
+
+ VisorCacheTypeMetadata metadata = new VisorCacheTypeMetadata();
+
+ metadata.keyType = q.getKeyType();
+ metadata.valType = q.getValueType();
+
+ metadata.dbSchema = "";
+ metadata.dbTbl = "";
+
+ metadata.keyFields = Collections.emptyList();
+ metadata.valFields = Collections.emptyList();
+
+ LinkedHashMap<String, String> qryFields = q.getFields();
+
+ metadata.qryFlds = new LinkedHashMap<>(qryFields);
+
+ metadata.ascFlds = Collections.emptyMap();
+ metadata.descFlds = Collections.emptyMap();
+ metadata.txtFlds = Collections.emptyList();
+
+ Collection<QueryIndex> qryIdxs = q.getIndexes();
+
+ metadata.grps = new LinkedHashMap<>(qryIdxs.size());
+
+ for (QueryIndex qryIdx : qryIdxs) {
+ LinkedHashMap<String, Boolean> qryIdxFlds = qryIdx.getFields();
+
+ LinkedHashMap<String, IgniteBiTuple<String, Boolean>> grpFlds = new LinkedHashMap<>();
+
+ for (Map.Entry<String, Boolean> qryIdxFld : qryIdxFlds.entrySet()) {
+ String fldName = qryIdxFld.getKey();
+
+ grpFlds.put(fldName, new IgniteBiTuple<>(qryFields.get(fldName), !qryIdxFld.getValue()));
+ }
+
+ metadata.grps.put(qryIdx.getName(), grpFlds);
+ }
+
+ return metadata;
}
/**
@@ -246,4 +363,4 @@ public class VisorCacheTypeMetadata implements Serializable {
public Map<String, LinkedHashMap<String, IgniteBiTuple<String, Boolean>>> grps() {
return grps;
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/3c42da8b/modules/core/src/main/resources/META-INF/classnames-jdk.properties
----------------------------------------------------------------------
diff --git a/modules/core/src/main/resources/META-INF/classnames-jdk.properties b/modules/core/src/main/resources/META-INF/classnames-jdk.properties
index 4dd20b7..bc74998 100644
--- a/modules/core/src/main/resources/META-INF/classnames-jdk.properties
+++ b/modules/core/src/main/resources/META-INF/classnames-jdk.properties
@@ -141,6 +141,8 @@ java.lang.reflect.MalformedParameterizedTypeException
java.lang.reflect.Proxy
java.lang.reflect.ReflectPermission
java.lang.reflect.UndeclaredThrowableException
+java.math.BigDecimal
+java.math.BigInteger
java.net.Authenticator$RequestorType
java.net.BindException
java.net.ConnectException
[10/11] ignite git commit: Fixed test to do not fail with
non-full-sync mode.
Posted by vo...@apache.org.
Fixed test to do not fail with non-full-sync mode.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/041cd38d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/041cd38d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/041cd38d
Branch: refs/heads/ignite-1956
Commit: 041cd38d46b458ea3ae945e15411d4519c1bf777
Parents: 28d6e00
Author: sboikov <sb...@gridgain.com>
Authored: Thu Nov 26 10:09:46 2015 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Nov 26 10:09:46 2015 +0300
----------------------------------------------------------------------
.../ignite/internal/IgniteClientReconnectCacheTest.java | 7 +++++++
1 file changed, 7 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/041cd38d/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectCacheTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectCacheTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectCacheTest.java
index 6cf10f4..3d8f601 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectCacheTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientReconnectCacheTest.java
@@ -56,6 +56,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLock
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetResponse;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishResponse;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxPrepareResponse;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.CI1;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.T2;
@@ -1292,6 +1293,12 @@ public class IgniteClientReconnectCacheTest extends IgniteClientReconnectAbstrac
cache.put(1, 1);
+ GridTestUtils.waitForCondition(new GridAbsPredicate() {
+ @Override public boolean apply() {
+ return cache.get(1) != null;
+ }
+ }, 5000);
+
assertEquals(1, cache.get(1));
}
[02/11] ignite git commit: IGNITE-1544: Make sure objects number
stored in a cache can be bigger than Integer.MAX_VALUE. This closes #252
Posted by vo...@apache.org.
IGNITE-1544: Make sure objects number stored in a cache can be bigger than Integer.MAX_VALUE. This closes #252
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8a9cc540
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8a9cc540
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8a9cc540
Branch: refs/heads/ignite-1956
Commit: 8a9cc5408f99713fb4a1a9036940fc76aef7b050
Parents: c23cda1
Author: Andrey Gura <ag...@gridgain.com>
Authored: Wed Nov 25 18:21:48 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Nov 25 18:21:48 2015 +0300
----------------------------------------------------------------------
.../java/org/apache/ignite/IgniteCache.java | 23 +++
.../processors/cache/GridCacheAdapter.java | 156 ++++++++++++++++++-
.../processors/cache/GridCacheProxyImpl.java | 61 ++++++++
.../processors/cache/IgniteCacheProxy.java | 42 +++++
.../processors/cache/IgniteInternalCache.java | 47 +++++-
.../distributed/dht/GridDhtCacheAdapter.java | 7 +-
.../distributed/near/GridNearCacheAdapter.java | 10 ++
.../CacheDeferredDeleteSanitySelfTest.java | 98 ++++++++++++
.../multijvm/IgniteCacheProcessProxy.java | 38 +++++
.../ignite/testsuites/IgniteCacheTestSuite.java | 2 +
...niteCacheP2pUnmarshallingQueryErrorTest.java | 7 +-
.../ignite-int-max-values-offheap-config.xml | 89 +++++++++++
.../ignite-int-max-values-onheap-config.xml | 84 ++++++++++
.../ignite-int-max-values-swap-config.xml | 93 +++++++++++
.../test-max-int-values-offheap.properties | 70 +++++++++
.../test-max-int-values-onheap.properties | 70 +++++++++
.../config/test-max-int-values-swap.properties | 69 ++++++++
.../yardstick/cache/IntMaxValueEntriesTest.java | 135 ++++++++++++++++
18 files changed, 1094 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCache.java b/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
index c9de3f1..c575865 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteCache.java
@@ -348,6 +348,19 @@ public interface IgniteCache<K, V> extends javax.cache.Cache<K, V>, IgniteAsyncS
public int size(CachePeekMode... peekModes) throws CacheException;
/**
+ * Gets the number of all entries cached across all nodes as a long value. By default, if {@code peekModes} value
+ * isn't defined, only size of primary copies across all nodes will be returned. This behavior is identical to
+ * calling this method with {@link CachePeekMode#PRIMARY} peek mode.
+ * <p>
+ * NOTE: this operation is distributed and will query all participating nodes for their cache sizes.
+ *
+ * @param peekModes Optional peek modes. If not provided, then total cache size is returned.
+ * @return Cache size across all nodes.
+ */
+ @IgniteAsyncSupported
+ public long sizeLong(CachePeekMode... peekModes) throws CacheException;
+
+ /**
* Gets the number of all entries cached on this node. By default, if {@code peekModes} value isn't defined,
* only size of primary copies will be returned. This behavior is identical to calling this method with
* {@link CachePeekMode#PRIMARY} peek mode.
@@ -358,6 +371,16 @@ public interface IgniteCache<K, V> extends javax.cache.Cache<K, V>, IgniteAsyncS
public int localSize(CachePeekMode... peekModes);
/**
+ * Gets the number of all entries cached on this node as a long value. By default, if {@code peekModes} value isn't
+ * defined, only size of primary copies will be returned. This behavior is identical to calling this method with
+ * {@link CachePeekMode#PRIMARY} peek mode.
+ *
+ * @param peekModes Optional peek modes. If not provided, then total cache size is returned.
+ * @return Cache size on this node.
+ */
+ public long localSizeLong(CachePeekMode... peekModes);
+
+ /**
* @param map Map containing keys and entry processors to be applied to values.
* @param args Additional arguments to pass to the {@link EntryProcessor}.
* @return The map of {@link EntryProcessorResult}s of the processing per key,
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index 26a3acd..d9713e1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -303,7 +303,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @param ctx Cache context.
* @param map Concurrent map.
*/
- @SuppressWarnings("OverriddenMethodCallDuringObjectConstruction")
+ @SuppressWarnings({"OverriddenMethodCallDuringObjectConstruction", "deprecation"})
protected GridCacheAdapter(final GridCacheContext<K, V> ctx, GridCacheConcurrentMap map) {
assert ctx != null;
@@ -821,6 +821,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @throws GridCacheEntryRemovedException If entry removed.
* @throws IgniteCheckedException If failed.
*/
+ @SuppressWarnings("ConstantConditions")
@Nullable private CacheObject localCachePeek0(KeyCacheObject key,
boolean heap,
boolean offheap,
@@ -3601,6 +3602,14 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/** {@inheritDoc} */
+ @Override public long sizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException {
+ if (isLocal())
+ return localSizeLong(peekModes);
+
+ return sizeLongAsync(peekModes).get();
+ }
+
+ /** {@inheritDoc} */
@Override public IgniteInternalFuture<Integer> sizeAsync(final CachePeekMode[] peekModes) {
assert peekModes != null;
@@ -3622,11 +3631,36 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/** {@inheritDoc} */
- @SuppressWarnings("ForLoopReplaceableByForEach")
+ @Override public IgniteInternalFuture<Long> sizeLongAsync(final CachePeekMode[] peekModes) {
+ assert peekModes != null;
+
+ PeekModes modes = parsePeekModes(peekModes, true);
+
+ IgniteClusterEx cluster = ctx.grid().cluster();
+
+ ClusterGroup grp = modes.near ? cluster.forCacheNodes(name(), true, true, false) : cluster.forDataNodes(name());
+
+ Collection<ClusterNode> nodes = grp.nodes();
+
+ if (nodes.isEmpty())
+ return new GridFinishedFuture<>(0L);
+
+ ctx.kernalContext().task().setThreadContext(TC_SUBGRID, nodes);
+
+ return ctx.kernalContext().task().execute(
+ new SizeLongTask(ctx.name(), ctx.affinity().affinityTopologyVersion(), peekModes), null);
+ }
+
+ /** {@inheritDoc} */
@Override public int localSize(CachePeekMode[] peekModes) throws IgniteCheckedException {
+ return (int)localSizeLong(peekModes);
+ }
+
+ /** {@inheritDoc} */
+ @Override public long localSizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException {
PeekModes modes = parsePeekModes(peekModes, true);
- int size = 0;
+ long size = 0;
if (ctx.isLocal()) {
modes.primary = true;
@@ -3676,6 +3710,11 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/** {@inheritDoc} */
+ @Override public long sizeLong() {
+ return map.publicSize();
+ }
+
+ /** {@inheritDoc} */
@Override public int nearSize() {
return 0;
}
@@ -3686,6 +3725,11 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/** {@inheritDoc} */
+ @Override public long primarySizeLong() {
+ return map.publicSize();
+ }
+
+ /** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridCacheAdapter.class, this, "name", name(), "size", size());
}
@@ -5233,6 +5277,47 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/**
+ * Internal callable for global size calculation.
+ */
+ @GridInternal
+ private static class SizeLongJob extends TopologyVersionAwareJob {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Peek modes. */
+ private final CachePeekMode[] peekModes;
+
+ /**
+ * @param cacheName Cache name.
+ * @param topVer Affinity topology version.
+ * @param peekModes Cache peek modes.
+ */
+ private SizeLongJob(String cacheName, AffinityTopologyVersion topVer, CachePeekMode[] peekModes) {
+ super(cacheName, topVer);
+
+ this.peekModes = peekModes;
+ }
+
+ /** {@inheritDoc} */
+ @Nullable @Override public Object localExecute(@Nullable IgniteInternalCache cache) {
+ if (cache == null)
+ return 0;
+
+ try {
+ return cache.localSizeLong(peekModes);
+ }
+ catch (IgniteCheckedException e) {
+ throw U.convertException(e);
+ }
+ }
+
+ /** {@inheritDoc} */
+ public String toString() {
+ return S.toString(SizeLongJob.class, this);
+ }
+ }
+
+ /**
* Holder for last async operation future.
*/
protected static class FutureHolder {
@@ -5942,6 +6027,71 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/**
+ * Size task.
+ */
+ private static class SizeLongTask extends ComputeTaskAdapter<Object, Long> {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Cache name. */
+ private final String cacheName;
+
+ /** Affinity topology version. */
+ private final AffinityTopologyVersion topVer;
+
+ /** Peek modes. */
+ private final CachePeekMode[] peekModes;
+
+ /**
+ * @param cacheName Cache name.
+ * @param topVer Affinity topology version.
+ * @param peekModes Cache peek modes.
+ */
+ public SizeLongTask(String cacheName, AffinityTopologyVersion topVer, CachePeekMode[] peekModes) {
+ this.cacheName = cacheName;
+ this.topVer = topVer;
+ this.peekModes = peekModes;
+ }
+
+ /** {@inheritDoc} */
+ @Nullable @Override public Map<? extends ComputeJob, ClusterNode> map(List<ClusterNode> subgrid,
+ @Nullable Object arg) throws IgniteException {
+ Map<ComputeJob, ClusterNode> jobs = new HashMap();
+
+ for (ClusterNode node : subgrid)
+ jobs.put(new SizeLongJob(cacheName, topVer, peekModes), node);
+
+ return jobs;
+ }
+
+ /** {@inheritDoc} */
+ @Override public ComputeJobResultPolicy result(ComputeJobResult res, List<ComputeJobResult> rcvd) {
+ IgniteException e = res.getException();
+
+ if (e != null) {
+ if (e instanceof ClusterTopologyException)
+ return ComputeJobResultPolicy.WAIT;
+
+ throw new IgniteException("Remote job threw exception.", e);
+ }
+
+ return ComputeJobResultPolicy.WAIT;
+ }
+
+ /** {@inheritDoc} */
+ @Nullable @Override public Long reduce(List<ComputeJobResult> results) throws IgniteException {
+ long size = 0;
+
+ for (ComputeJobResult res : results) {
+ if (res != null && res.getException() == null)
+ size += res.<Long>getData();
+ }
+
+ return size;
+ }
+ }
+
+ /**
* Clear task.
*/
private static class ClearTask<K> extends ComputeTaskAdapter<Object, Object> {
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
index cca6d6a..e82c422 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
@@ -228,6 +228,7 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
@Override public <K1, V1> GridCacheProxyImpl<K1, V1> keepPortable() {
if (opCtx != null && opCtx.isKeepBinary())
return (GridCacheProxyImpl<K1, V1>)this;
@@ -1352,6 +1353,18 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @Override public long sizeLong() {
+ CacheOperationContext prev = gate.enter(opCtx);
+
+ try {
+ return delegate.sizeLong();
+ }
+ finally {
+ gate.leave(prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public int size(CachePeekMode[] peekModes) throws IgniteCheckedException {
CacheOperationContext prev = gate.enter(opCtx);
@@ -1364,6 +1377,18 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @Override public long sizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException {
+ CacheOperationContext prev = gate.enter(opCtx);
+
+ try {
+ return delegate.sizeLong(peekModes);
+ }
+ finally {
+ gate.leave(prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public IgniteInternalFuture<Integer> sizeAsync(CachePeekMode[] peekModes) {
CacheOperationContext prev = gate.enter(opCtx);
@@ -1376,6 +1401,18 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @Override public IgniteInternalFuture<Long> sizeLongAsync(CachePeekMode[] peekModes) {
+ CacheOperationContext prev = gate.enter(opCtx);
+
+ try {
+ return delegate.sizeLongAsync(peekModes);
+ }
+ finally {
+ gate.leave(prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public int localSize(CachePeekMode[] peekModes) throws IgniteCheckedException {
CacheOperationContext prev = gate.enter(opCtx);
@@ -1388,6 +1425,18 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @Override public long localSizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException {
+ CacheOperationContext prev = gate.enter(opCtx);
+
+ try {
+ return delegate.localSizeLong(peekModes);
+ }
+ finally {
+ gate.leave(prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public int nearSize() {
CacheOperationContext prev = gate.enter(opCtx);
@@ -1412,6 +1461,18 @@ public class GridCacheProxyImpl<K, V> implements IgniteInternalCache<K, V>, Exte
}
/** {@inheritDoc} */
+ @Override public long primarySizeLong() {
+ CacheOperationContext prev = gate.enter(opCtx);
+
+ try {
+ return delegate.primarySizeLong();
+ }
+ finally {
+ gate.leave(prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public void promoteAll(@Nullable Collection<? extends K> keys) throws IgniteCheckedException {
CacheOperationContext prev = gate.enter(opCtx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
index cb36432..2bab152 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
@@ -279,6 +279,7 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
}
/** {@inheritDoc} */
+ @SuppressWarnings("deprecation")
@Nullable @Override public Cache.Entry<K, V> randomEntry() {
GridKernalContext kctx = ctx.kernalContext();
@@ -784,6 +785,30 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
}
/** {@inheritDoc} */
+ @Override public long sizeLong(CachePeekMode... peekModes) throws CacheException {
+ GridCacheGateway<K, V> gate = this.gate;
+
+ CacheOperationContext prev = onEnter(gate, opCtx);
+
+ try {
+ if (isAsync()) {
+ setFuture(delegate.sizeLongAsync(peekModes));
+
+ return 0;
+ }
+ else
+ return delegate.sizeLong(peekModes);
+ }
+ catch (IgniteCheckedException e) {
+ throw cacheException(e);
+ }
+ finally {
+ onLeave(gate, prev);
+ }
+ }
+
+
+ /** {@inheritDoc} */
@Override public int localSize(CachePeekMode... peekModes) {
GridCacheGateway<K, V> gate = this.gate;
@@ -801,6 +826,23 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
}
/** {@inheritDoc} */
+ @Override public long localSizeLong(CachePeekMode... peekModes) {
+ GridCacheGateway<K, V> gate = this.gate;
+
+ CacheOperationContext prev = onEnter(gate, opCtx);
+
+ try {
+ return delegate.localSizeLong(peekModes);
+ }
+ catch (IgniteCheckedException e) {
+ throw cacheException(e);
+ }
+ finally {
+ onLeave(gate, prev);
+ }
+ }
+
+ /** {@inheritDoc} */
@Override public V get(K key) {
try {
GridCacheGateway<K, V> gate = this.gate;
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java
index 4155706..1055cf4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteInternalCache.java
@@ -1342,6 +1342,17 @@ public interface IgniteInternalCache<K, V> extends Iterable<Cache.Entry<K, V>> {
public int size();
/**
+ * Gets the number of all entries cached on this node as a long value. This method will return the count of
+ * all cache entries and has O(1) complexity on base {@link IgniteInternalCache}. It is essentially the
+ * size of cache key set and is semantically identical to {{@code Cache.keySet().size()}.
+ * <p>
+ * NOTE: this operation is not distributed and returns only the number of entries cached on this node.
+ *
+ * @return Size of cache on this node.
+ */
+ public long sizeLong();
+
+ /**
* @param peekModes Peek modes.
* @return Local cache size.
* @throws IgniteCheckedException If failed.
@@ -1350,6 +1361,13 @@ public interface IgniteInternalCache<K, V> extends Iterable<Cache.Entry<K, V>> {
/**
* @param peekModes Peek modes.
+ * @return Local cache size as a long value.
+ * @throws IgniteCheckedException If failed.
+ */
+ public long localSizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException;
+
+ /**
+ * @param peekModes Peek modes.
* @return Global cache size.
* @throws IgniteCheckedException If failed.
*/
@@ -1357,11 +1375,24 @@ public interface IgniteInternalCache<K, V> extends Iterable<Cache.Entry<K, V>> {
/**
* @param peekModes Peek modes.
+ * @return Global cache size as a long value.
+ * @throws IgniteCheckedException If failed.
+ */
+ public long sizeLong(CachePeekMode[] peekModes) throws IgniteCheckedException;
+
+ /**
+ * @param peekModes Peek modes.
* @return Future.
*/
public IgniteInternalFuture<Integer> sizeAsync(CachePeekMode[] peekModes);
/**
+ * @param peekModes Peek modes.
+ * @return Future.
+ */
+ public IgniteInternalFuture<Long> sizeLongAsync(CachePeekMode[] peekModes);
+
+ /**
* Gets size of near cache key set. This method will return count of all entries in near
* cache and has O(1) complexity on base cache projection.
* <p>
@@ -1386,6 +1417,20 @@ public interface IgniteInternalCache<K, V> extends Iterable<Cache.Entry<K, V>> {
public int primarySize();
/**
+ * Gets the number of all primary entries cached on this node as a long value. For {@link CacheMode#LOCAL}
+ * non-distributed cache mode, this method is identical to {@link #size()}.
+ * <p>
+ * For {@link CacheMode#PARTITIONED} and {@link CacheMode#REPLICATED} modes, this method will
+ * return number of primary entries cached on this node (excluding any backups). The complexity of
+ * this method is O(P), where P is the total number of partitions.
+ * <p>
+ * NOTE: this operation is not distributed and returns only the number of primary entries cached on this node.
+ *
+ * @return Number of primary entries in cache.
+ */
+ public long primarySizeLong();
+
+ /**
* This method unswaps cache entries by given keys, if any, from swap storage
* into memory.
* <h2 class="header">Transactions</h2>
@@ -1491,7 +1536,7 @@ public interface IgniteInternalCache<K, V> extends Iterable<Cache.Entry<K, V>> {
* @param subjId Client ID.
* @return Internal projection.
*/
- IgniteInternalCache<K, V> forSubjectId(UUID subjId);
+ public IgniteInternalCache<K, V> forSubjectId(UUID subjId);
/**
* Store DR data.
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/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 8537357..de11235 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
@@ -593,7 +593,12 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
/** {@inheritDoc} */
@Override public int primarySize() {
- int sum = 0;
+ return (int)primarySizeLong();
+ }
+
+ /** {@inheritDoc} */
+ @Override public long primarySizeLong() {
+ long sum = 0;
AffinityTopologyVersion topVer = ctx.affinity().affinityTopologyVersion();
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
index cc9d007..b471486 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
@@ -310,11 +310,21 @@ public abstract class GridNearCacheAdapter<K, V> extends GridDistributedCacheAda
}
/** {@inheritDoc} */
+ @Override public long sizeLong() {
+ return nearEntries().size() + dht().sizeLong();
+ }
+
+ /** {@inheritDoc} */
@Override public int primarySize() {
return dht().primarySize();
}
/** {@inheritDoc} */
+ @Override public long primarySizeLong() {
+ return dht().primarySizeLong();
+ }
+
+ /** {@inheritDoc} */
@Override public int nearSize() {
return nearEntries().size();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteSanitySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteSanitySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteSanitySelfTest.java
new file mode 100644
index 0000000..5040172
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteSanitySelfTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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 org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.LOCAL;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Sanity tests of deferred delete for different cache configurations.
+ */
+public class CacheDeferredDeleteSanitySelfTest extends GridCommonAbstractTest {
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ startGrid(0);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+ }
+
+ /**
+ * @throws Exception If fails.
+ */
+ public void testDeferredDelete() throws Exception {
+ testDeferredDelete(LOCAL, ATOMIC, false, false);
+ testDeferredDelete(LOCAL, TRANSACTIONAL, false, false);
+
+ testDeferredDelete(PARTITIONED, ATOMIC, false, true);
+ testDeferredDelete(PARTITIONED, TRANSACTIONAL, false, true);
+
+ testDeferredDelete(REPLICATED, ATOMIC, false, true);
+ testDeferredDelete(REPLICATED, TRANSACTIONAL, false, true);
+
+ // Near
+ testDeferredDelete(LOCAL, ATOMIC, true, false);
+ testDeferredDelete(LOCAL, TRANSACTIONAL, true, false);
+
+ testDeferredDelete(PARTITIONED, ATOMIC, true, true);
+ testDeferredDelete(PARTITIONED, TRANSACTIONAL, true, false);
+
+ testDeferredDelete(REPLICATED, ATOMIC, true, true);
+ testDeferredDelete(REPLICATED, TRANSACTIONAL, true, true);
+ }
+
+ /**
+ * @param mode Mode.
+ * @param atomicityMode Atomicity mode.
+ * @param near Near cache enabled.
+ * @param expVal Expected deferred delete value.
+ */
+ @SuppressWarnings("unchecked")
+ private void testDeferredDelete(CacheMode mode, CacheAtomicityMode atomicityMode, boolean near, boolean expVal) {
+ CacheConfiguration ccfg = new CacheConfiguration()
+ .setCacheMode(mode)
+ .setAtomicityMode(atomicityMode);
+
+ if (near)
+ ccfg.setNearConfiguration(new NearCacheConfiguration());
+
+ IgniteCache cache = null;
+
+ try {
+ cache = grid(0).getOrCreateCache(ccfg);
+
+ assertEquals(expVal, ((IgniteCacheProxy)grid(0).cache(null)).context().deferredDelete());
+ }
+ finally {
+ if (cache != null)
+ cache.destroy();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
index d2e17d8..035f1b0 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteCacheProcessProxy.java
@@ -196,11 +196,21 @@ public class IgniteCacheProcessProxy<K, V> implements IgniteCache<K, V> {
}
/** {@inheritDoc} */
+ @Override public long sizeLong(CachePeekMode... peekModes) throws CacheException {
+ return compute.call(new SizeLongTask(cacheName, isAsync, peekModes, false));
+ }
+
+ /** {@inheritDoc} */
@Override public int localSize(CachePeekMode... peekModes) {
return compute.call(new SizeTask(cacheName, isAsync, peekModes, true));
}
/** {@inheritDoc} */
+ @Override public long localSizeLong(CachePeekMode... peekModes) {
+ return compute.call(new SizeLongTask(cacheName, isAsync, peekModes, true));
+ }
+
+ /** {@inheritDoc} */
@Override public <T> Map<K, EntryProcessorResult<T>> invokeAll(
Map<? extends K, ? extends EntryProcessor<K, V, T>> map,
Object... args)
@@ -649,6 +659,34 @@ public class IgniteCacheProcessProxy<K, V> implements IgniteCache<K, V> {
/**
*
*/
+ private static class SizeLongTask extends CacheTaskAdapter<Void, Void, Long> {
+ /** Peek modes. */
+ private final CachePeekMode[] peekModes;
+
+ /** Local. */
+ private final boolean loc;
+
+ /**
+ * @param cacheName Cache name.
+ * @param async Async.
+ * @param peekModes Peek modes.
+ * @param loc Local.
+ */
+ public SizeLongTask(String cacheName, boolean async, CachePeekMode[] peekModes, boolean loc) {
+ super(cacheName, async);
+ this.loc = loc;
+ this.peekModes = peekModes;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Long call() throws Exception {
+ return loc ? cache().localSizeLong(peekModes) : cache().sizeLong(peekModes);
+ }
+ }
+
+ /**
+ *
+ */
private static class GetTask<K, V> extends CacheTaskAdapter<K, V, V> {
/** Key. */
private final K key;
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java
index 8af9443..2c9ba93 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite.java
@@ -36,6 +36,7 @@ import org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStorePortableMarshallerSe
import org.apache.ignite.cache.store.jdbc.GridCacheJdbcBlobStoreMultithreadedSelfTest;
import org.apache.ignite.cache.store.jdbc.GridCacheJdbcBlobStoreSelfTest;
import org.apache.ignite.internal.processors.cache.CacheAffinityCallSelfTest;
+import org.apache.ignite.internal.processors.cache.CacheDeferredDeleteSanitySelfTest;
import org.apache.ignite.internal.processors.cache.CacheFutureExceptionSelfTest;
import org.apache.ignite.internal.processors.cache.CacheNamesSelfTest;
import org.apache.ignite.internal.processors.cache.GridCacheAffinityApiSelfTest;
@@ -262,6 +263,7 @@ public class IgniteCacheTestSuite extends TestSuite {
suite.addTestSuite(GridCachePartitionedOffHeapLocalStoreSelfTest.class);
suite.addTestSuite(GridCacheTxPartitionedLocalStoreSelfTest.class);
suite.addTestSuite(IgniteCacheSystemTransactionsSelfTest.class);
+ suite.addTestSuite(CacheDeferredDeleteSanitySelfTest.class);
suite.addTest(IgniteCacheTcpClientDiscoveryTestSuite.suite());
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheP2pUnmarshallingQueryErrorTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheP2pUnmarshallingQueryErrorTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheP2pUnmarshallingQueryErrorTest.java
index 4d9456a..d4a4c62 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheP2pUnmarshallingQueryErrorTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheP2pUnmarshallingQueryErrorTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache;
import java.io.IOException;
import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import javax.cache.CacheException;
import org.apache.ignite.cache.query.ScanQuery;
import org.apache.ignite.cache.query.SqlQuery;
@@ -68,8 +69,6 @@ public class IgniteCacheP2pUnmarshallingQueryErrorTest extends IgniteCacheP2pUnm
public void testResponseMessageOnRequestUnmarshallingFailed() throws Exception {
readCnt.set(Integer.MAX_VALUE);
- jcache(0).put(new TestKey(String.valueOf(++key)), "");
-
try {
jcache().query(new ScanQuery<>(new IgniteBiPredicate<TestKey, String>() {
@Override public boolean apply(TestKey key, String val) {
@@ -79,6 +78,10 @@ public class IgniteCacheP2pUnmarshallingQueryErrorTest extends IgniteCacheP2pUnm
private void readObject(ObjectInputStream is) throws IOException {
throw new IOException();
}
+
+ private void writeObject(ObjectOutputStream os) throws IOException {
+ throw new IOException();
+ }
})).getAll();
assertTrue("Request unmarshalling failed, but error response was not sent.", portableMarshaller());
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/ignite-int-max-values-offheap-config.xml
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/ignite-int-max-values-offheap-config.xml b/modules/yardstick/config/ignite-int-max-values-offheap-config.xml
new file mode 100644
index 0000000..1aaab67
--- /dev/null
+++ b/modules/yardstick/config/ignite-int-max-values-offheap-config.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ Ignite Spring configuration file.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+ <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+ <property name="peerClassLoadingEnabled" value="true"/>
+
+ <property name="marshaller">
+ <bean class="org.apache.ignite.marshaller.optimized.OptimizedMarshaller">
+ <property name="requireSerializable" value="false"/>
+ </bean>
+ </property>
+
+<!--
+ <property name="marshaller">
+ <bean class="org.apache.ignite.internal.portable.api.PortableMarshaller"/>
+ </property>
+-->
+
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="discoverySpi">
+ <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="socketTimeout" value="600000"/>
+
+ <property name="ackTimeout" value="60000"/>
+
+ <property name="ipFinder">
+ <!-- <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> -->
+ <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
+ <!--
+ <property name="addresses">
+ <list>
+ <!– In distributed environment, replace with actual host IP address. –>
+ <value>127.0.0.1:47500..47509</value>
+ </list>
+ </property>
+ -->
+ </bean>
+ </property>
+ </bean>
+ </property>
+
+ <property name="cacheConfiguration">
+ <list>
+ <bean class="org.apache.ignite.configuration.CacheConfiguration">
+ <property name="name" value="int-max-value-cache"/>
+ <property name="cacheMode" value="PARTITIONED"/>
+ <property name="backups" value="0"/>
+ <property name="atomicityMode" value="ATOMIC"/>
+ <property name="memoryMode" value="ONHEAP_TIERED"/>
+ <property name="offHeapMaxMemory" value="#{32 * 1024 * 1024 * 1024L}"/>
+ <property name="swapEnabled" value="false"/>
+ <property name="evictionPolicy">
+ <bean class="org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy">
+ <property name="maxSize" value="4000000"/>
+ <property name="batchSize" value="500000"/>
+ </bean>
+ </property>
+ </bean>
+ </list>
+ </property>
+ </bean>
+</beans>
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/ignite-int-max-values-onheap-config.xml
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/ignite-int-max-values-onheap-config.xml b/modules/yardstick/config/ignite-int-max-values-onheap-config.xml
new file mode 100644
index 0000000..d1359b3
--- /dev/null
+++ b/modules/yardstick/config/ignite-int-max-values-onheap-config.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ Ignite Spring configuration file.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+ <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+ <property name="peerClassLoadingEnabled" value="true"/>
+
+ <property name="marshaller">
+ <bean class="org.apache.ignite.marshaller.optimized.OptimizedMarshaller">
+ <property name="requireSerializable" value="false"/>
+ </bean>
+ </property>
+
+<!--
+ <property name="marshaller">
+ <bean class="org.apache.ignite.internal.portable.api.PortableMarshaller"/>
+ </property>
+-->
+
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="discoverySpi">
+ <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="socketTimeout" value="600000"/>
+
+ <property name="ackTimeout" value="60000"/>
+
+
+ <property name="ipFinder">
+ <!-- <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> -->
+ <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
+ <!--
+ <property name="addresses">
+ <list>
+ <!– In distributed environment, replace with actual host IP address. –>
+ <value>127.0.0.1:47500..47509</value>
+ </list>
+ </property>
+ -->
+ </bean>
+ </property>
+ </bean>
+ </property>
+
+ <property name="cacheConfiguration">
+ <list>
+ <bean class="org.apache.ignite.configuration.CacheConfiguration">
+ <property name="name" value="int-max-value-cache"/>
+ <property name="cacheMode" value="PARTITIONED"/>
+ <property name="backups" value="0"/>
+ <property name="atomicityMode" value="ATOMIC"/>
+ <property name="memoryMode" value="ONHEAP_TIERED"/>
+ <property name="offHeapMaxMemory" value="-1"/>
+ <property name="swapEnabled" value="false"/>
+ </bean>
+ </list>
+ </property>
+ </bean>
+</beans>
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/ignite-int-max-values-swap-config.xml
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/ignite-int-max-values-swap-config.xml b/modules/yardstick/config/ignite-int-max-values-swap-config.xml
new file mode 100644
index 0000000..8634b4f
--- /dev/null
+++ b/modules/yardstick/config/ignite-int-max-values-swap-config.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ Ignite Spring configuration file.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+ <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+ <property name="peerClassLoadingEnabled" value="true"/>
+
+ <property name="marshaller">
+ <bean class="org.apache.ignite.marshaller.optimized.OptimizedMarshaller">
+ <property name="requireSerializable" value="false"/>
+ </bean>
+ </property>
+
+<!--
+ <property name="marshaller">
+ <bean class="org.apache.ignite.internal.portable.api.PortableMarshaller"/>
+ </property>
+-->
+
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="discoverySpi">
+ <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+ <property name="networkTimeout" value="600000"/>
+
+ <property name="socketTimeout" value="600000"/>
+
+ <property name="ackTimeout" value="60000"/>
+
+ <property name="ipFinder">
+ <!-- <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder"> -->
+ <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
+ <!--
+ <property name="addresses">
+ <list>
+ <!– In distributed environment, replace with actual host IP address. –>
+ <value>127.0.0.1:47500..47509</value>
+ </list>
+ </property>
+ -->
+ </bean>
+ </property>
+ </bean>
+ </property>
+
+ <property name="cacheConfiguration">
+ <list>
+ <bean class="org.apache.ignite.configuration.CacheConfiguration">
+ <property name="name" value="int-max-value-cache"/>
+ <property name="cacheMode" value="PARTITIONED"/>
+ <property name="backups" value="0"/>
+ <property name="atomicityMode" value="ATOMIC"/>
+ <property name="memoryMode" value="ONHEAP_TIERED"/>
+ <property name="offHeapMaxMemory" value="#{32 * 1024 * 1024 * 1024L}"/>
+ <property name="swapEnabled" value="true"/>
+ <property name="evictionPolicy">
+ <bean class="org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy">
+ <property name="maxSize" value="4000000"/>
+ <property name="batchSize" value="500000"/>
+ </bean>
+ </property>
+ </bean>
+ </list>
+ </property>
+
+ <property name="swapSpaceSpi">
+ <bean class="org.apache.ignite.spi.swapspace.file.FileSwapSpaceSpi"/>
+ </property>
+ </bean>
+</beans>
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/test-max-int-values-offheap.properties
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/test-max-int-values-offheap.properties b/modules/yardstick/config/test-max-int-values-offheap.properties
new file mode 100644
index 0000000..5b4da20
--- /dev/null
+++ b/modules/yardstick/config/test-max-int-values-offheap.properties
@@ -0,0 +1,70 @@
+# 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.
+
+#
+# Contains benchmarks for SQL queries.
+#
+
+# JVM options.
+# JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false \
+ -Xloggc:./gc${now0}.log \
+ -XX:+PrintGCDetails \
+ -XX:-PrintGCTimeStamps \
+ -verbose:gc \
+ -Xmx8g \
+ -Xms8g \
+ -XX:+UseParNewGC \
+ -XX:+UseConcMarkSweepGC \
+ -XX:+UseTLAB \
+ -XX:NewSize=1g \
+ -XX:MaxNewSize=1g \
+ -XX:MaxTenuringThreshold=0 \
+ -XX:SurvivorRatio=1024 \
+ -XX:+UseCMSInitiatingOccupancyOnly \
+ -XX:CMSInitiatingOccupancyFraction=60 \
+"
+
+# List of default probes.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+# BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
+SERVER_HOSTS=fosters-215,fosters-216,fosters-217,fosters-226,fosters-219,fosters-221,fosters-222,fosters-223
+
+# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
+DRIVER_HOSTS=fosters-218
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Run configuration.
+# Note that each benchmark is set to run for 300 seconds (5 mins) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-int-max-values-offheap-config.xml -nn ${nodesNum} -b 0 -w 0 -d 9999999 -t 1 -sm PRIMARY_SYNC -dn IntMaxValueEntriesTest -sn IgniteNode -ds int-max-values-offheap\
+"
+
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/test-max-int-values-onheap.properties
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/test-max-int-values-onheap.properties b/modules/yardstick/config/test-max-int-values-onheap.properties
new file mode 100644
index 0000000..d29800a
--- /dev/null
+++ b/modules/yardstick/config/test-max-int-values-onheap.properties
@@ -0,0 +1,70 @@
+# 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.
+
+#
+# Contains benchmarks for SQL queries.
+#
+
+# JVM options.
+# JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false \
+ -Xloggc:./gc${now0}.log \
+ -XX:+PrintGCDetails \
+ -XX:-PrintGCTimeStamps \
+ -verbose:gc \
+ -Xmx92g \
+ -Xms32g \
+ -XX:+UseParNewGC \
+ -XX:+UseConcMarkSweepGC \
+ -XX:+UseTLAB \
+ -XX:NewSize=4g \
+ -XX:MaxNewSize=4g \
+ -XX:MaxTenuringThreshold=0 \
+ -XX:SurvivorRatio=1024 \
+ -XX:+UseCMSInitiatingOccupancyOnly \
+ -XX:CMSInitiatingOccupancyFraction=60 \
+"
+
+# List of default probes.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+# BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
+SERVER_HOSTS=fosters-215,fosters-216,fosters-217,fosters-226,fosters-219,fosters-221,fosters-222,fosters-223
+
+# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
+DRIVER_HOSTS=fosters-218
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Run configuration.
+# Note that each benchmark is set to run for 300 seconds (5 mins) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-int-max-values-onheap-config.xml -nn ${nodesNum} -b 0 -w 0 -d 9999999 -t 1 -sm PRIMARY_SYNC -dn IntMaxValueEntriesTest -sn IgniteNode -ds int-max-values-onheap\
+"
+
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/config/test-max-int-values-swap.properties
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/test-max-int-values-swap.properties b/modules/yardstick/config/test-max-int-values-swap.properties
new file mode 100644
index 0000000..203f004
--- /dev/null
+++ b/modules/yardstick/config/test-max-int-values-swap.properties
@@ -0,0 +1,69 @@
+# 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.
+
+#
+# Contains benchmarks for SQL queries.
+#
+
+# JVM options.
+# JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+# Uncomment to enable concurrent garbage collection (GC) if you encounter long GC pauses.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false \
+ -Xloggc:./gc${now0}.log \
+ -XX:+PrintGCDetails \
+ -XX:-PrintGCTimeStamps \
+ -verbose:gc \
+ -Xmx8g \
+ -Xms8g \
+ -XX:+UseParNewGC \
+ -XX:+UseConcMarkSweepGC \
+ -XX:+UseTLAB \
+ -XX:NewSize=1g \
+ -XX:MaxNewSize=1g \
+ -XX:MaxTenuringThreshold=0 \
+ -XX:SurvivorRatio=1024 \
+ -XX:+UseCMSInitiatingOccupancyOnly \
+ -XX:CMSInitiatingOccupancyFraction=60 \
+"
+
+# List of default probes.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+# BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# Comma-separated list of the hosts to run BenchmarkServers on. 2 nodes on local host are enabled by default.
+SERVER_HOSTS=fosters-215,fosters-216,fosters-217,fosters-226,fosters-219,fosters-221,fosters-222,fosters-223
+
+# Comma-separated list of the hosts to run BenchmarkDrivers on. 1 node on local host is enabled by default.
+DRIVER_HOSTS=fosters-218
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Run configuration.
+# Note that each benchmark is set to run for 300 seconds (5 mins) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-int-max-values-swap-config.xml -nn ${nodesNum} -b 0 -w 0 -d 9999999 -t 1 -sm PRIMARY_SYNC -dn IntMaxValueEntriesTest -sn IgniteNode -ds int-max-values-swap\
+"
+
http://git-wip-us.apache.org/repos/asf/ignite/blob/8a9cc540/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IntMaxValueEntriesTest.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IntMaxValueEntriesTest.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IntMaxValueEntriesTest.java
new file mode 100644
index 0000000..06ca3b7
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IntMaxValueEntriesTest.java
@@ -0,0 +1,135 @@
+/*
+ * 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.yardstick.cache;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+import javax.cache.Cache;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
+import org.jsr166.LongAdder8;
+
+import static org.yardstickframework.BenchmarkUtils.println;
+
+/**
+ *
+ */
+public class IntMaxValueEntriesTest extends IgniteCacheAbstractBenchmark {
+ /** Threads. */
+ private static final int THREADS = 16;
+
+ /** Keys lo. */
+ private static final int KEYS_LO = -100_000;
+
+ /** Keys hi. */
+ private static final long KEYS_HI = Integer.MAX_VALUE;
+
+ /** Report delta. */
+ private static final int REPORT_DELTA = 1_000_000;
+
+ /** Cache name. */
+ private static final String CACHE_NAME = "int-max-value-cache";
+
+ /** {@inheritDoc} */
+ @Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ final IgniteCache<Integer, Object> cache = cache();
+
+ final IgniteDataStreamer<Integer, Object> stmr = ignite().dataStreamer(cache.getName());
+
+ final List<Thread> threads = new ArrayList<>(THREADS);
+
+ final LongAdder8 addedCnt = new LongAdder8();
+
+ int delta = (int)((KEYS_HI + Math.abs(KEYS_LO)) / THREADS);
+
+ System.out.println("Delta: " + delta);
+
+ for (int i = 0; i < THREADS; i++) {
+ final int lo = i == 0 ? KEYS_LO : delta * i + 1;
+
+ final int hi = i == THREADS - 1 ? (int)KEYS_HI : (int)((long)delta * (i + 1));
+
+ Thread t = new Thread(new Runnable() {
+ @Override public void run() {
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+ byte val = (byte)rnd.nextInt();
+
+ println("Start from " + lo + " to " + hi);
+
+ for (int j = lo, k = 0; j < hi; j++, k++) {
+ stmr.addData(j, val++);
+
+ addedCnt.increment();
+
+ if (k % REPORT_DELTA == 0)
+ println(addedCnt.sum() + " entries");
+ }
+
+ println("Thread finished. " + addedCnt.sum() + " entries.");
+ }
+ });
+
+ threads.add(t);
+ t.start();
+ }
+
+ for (Thread thread : threads)
+ thread.join();
+
+ println("All threads finished. " + addedCnt.sum() + " entries.");
+
+ println("Streamer flush");
+
+ stmr.flush();
+
+ println("Streamer flushed");
+
+ println("Calculating cache size");
+ println("Cache size: " + cache.size());
+
+ println("Calculating long cache size");
+ println("Cache size long: " + cache.sizeLong());
+
+ Thread.sleep(10000);
+
+ println("Iterating started");
+
+ long cnt = 0;
+
+ for (Cache.Entry<Integer, Object> ignored : cache) {
+ cnt++;
+
+ if (cnt > 0 && cnt % REPORT_DELTA == 0)
+ println("Iterated via " + cnt + " entries");
+ }
+
+ println("Iterated via " + cnt + " entries");
+
+ cache.destroy();
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteCache cache() {
+ return ignite().cache(CACHE_NAME);
+ }
+}
[05/11] ignite git commit: ignite-1800: Annotation
MBeanServerResource should be deleted as unsupported. This closes #260
Posted by vo...@apache.org.
ignite-1800: Annotation MBeanServerResource should be deleted as unsupported. This closes #260
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b83f75ed
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b83f75ed
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b83f75ed
Branch: refs/heads/ignite-1956
Commit: b83f75edaa7145be443429d9cce54c86fe85730a
Parents: e02edcd
Author: Roman Shtykh <ap...@gmail.com>
Authored: Wed Nov 25 18:41:03 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Nov 25 18:41:03 2015 +0300
----------------------------------------------------------------------
.../ignite/resources/MBeanServerResource.java | 69 --------------------
1 file changed, 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b83f75ed/modules/core/src/main/java/org/apache/ignite/resources/MBeanServerResource.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/resources/MBeanServerResource.java b/modules/core/src/main/java/org/apache/ignite/resources/MBeanServerResource.java
deleted file mode 100644
index 17b9aa7..0000000
--- a/modules/core/src/main/java/org/apache/ignite/resources/MBeanServerResource.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.resources;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import javax.management.MBeanServer;
-
-/**
- * Annotates a field or a setter method for injection of {@link MBeanServer} resource. MBean server
- * is provided to grid via {@link org.apache.ignite.configuration.IgniteConfiguration}.
- * <p>
- * MBean server can be injected into instances of following classes:
- * <ul>
- * <li>{@link org.apache.ignite.compute.ComputeTask}</li>
- * <li>{@link org.apache.ignite.compute.ComputeJob}</li>
- * <li>{@link org.apache.ignite.spi.IgniteSpi}</li>
- * <li>{@link org.apache.ignite.lifecycle.LifecycleBean}</li>
- * </ul>
- * <p>
- * Here is how injection would typically happen:
- * <pre name="code" class="java">
- * public class MyGridJob implements ComputeJob {
- * ...
- * @IgniteMBeanServerResource
- * private MBeanServer mbeanSrv;
- * ...
- * }
- * </pre>
- * or
- * <pre name="code" class="java">
- * public class MyGridJob implements ComputeJob {
- * ...
- * private MBeanSever mbeanSrv;
- * ...
- * @IgniteMBeanServerResource
- * public void setMBeanServer(MBeanServer mbeanSrv) {
- * this.mbeanSrv = mbeanSrv;
- * }
- * ...
- * }
- * </pre>
- * <p>
- * See {@link org.apache.ignite.configuration.IgniteConfiguration#getMBeanServer()} for Grid configuration details.
- */
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.FIELD})
-public @interface MBeanServerResource {
- // No-op.
-}
\ No newline at end of file
[08/11] ignite git commit: Queries optimizations: - cache prepared
statements and two-step queries - skip reduce query if possible - do not use
index snapshots by default
Posted by vo...@apache.org.
Queries optimizations:
- cache prepared statements and two-step queries
- skip reduce query if possible
- do not use index snapshots by default
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4af461a7
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4af461a7
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4af461a7
Branch: refs/heads/ignite-1956
Commit: 4af461a7f403fc0e4df13d23d0789eee49200b26
Parents: 3c42da8
Author: sboikov <sb...@gridgain.com>
Authored: Thu Nov 26 09:30:10 2015 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Nov 26 09:30:10 2015 +0300
----------------------------------------------------------------------
.../configuration/CacheConfiguration.java | 30 +++
.../cache/query/GridCacheSqlQuery.java | 42 ++++
.../cache/query/GridCacheTwoStepQuery.java | 35 ++-
.../processors/query/GridQueryProcessor.java | 40 +---
.../processors/query/GridQueryProperty.java | 45 ++++
.../query/GridQueryTypeDescriptor.java | 6 +
.../query/h2/GridH2ResultSetIterator.java | 19 +-
.../processors/query/h2/IgniteH2Indexing.java | 227 ++++++++++++++++---
.../query/h2/opt/GridH2RowDescriptor.java | 5 +
.../processors/query/h2/opt/GridH2Table.java | 69 +++++-
.../query/h2/opt/GridH2TreeIndex.java | 98 +++++---
.../query/h2/sql/GridSqlQuerySplitter.java | 73 ++++--
.../processors/query/h2/sql/GridSqlSelect.java | 27 +++
.../query/h2/twostep/GridMapQueryExecutor.java | 17 +-
.../query/h2/twostep/GridMergeIndex.java | 7 +
.../h2/twostep/GridMergeIndexUnsorted.java | 14 ++
.../h2/twostep/GridReduceQueryExecutor.java | 117 +++++++---
.../cache/IgniteCacheAbstractQuerySelfTest.java | 69 +++---
...PartitionedSnapshotEnabledQuerySelfTest.java | 28 +++
.../h2/GridIndexingSpiAbstractSelfTest.java | 19 ++
.../IgniteCacheQuerySelfTestSuite.java | 2 +
21 files changed, 776 insertions(+), 213 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index e87346f..e2bf912 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -373,6 +373,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
/** */
private int sqlOnheapRowCacheSize = DFLT_SQL_ONHEAP_ROW_CACHE_SIZE;
+ /** */
+ private boolean snapshotableIdx;
+
/** Copy on read flag. */
private boolean cpOnRead = DFLT_COPY_ON_READ;
@@ -463,6 +466,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
rebalancePoolSize = cc.getRebalanceThreadPoolSize();
rebalanceTimeout = cc.getRebalanceTimeout();
rebalanceThrottle = cc.getRebalanceThrottle();
+ snapshotableIdx = cc.isSnapshotableIndex();
sqlEscapeAll = cc.isSqlEscapeAll();
sqlFuncCls = cc.getSqlFunctionClasses();
sqlOnheapRowCacheSize = cc.getSqlOnheapRowCacheSize();
@@ -1900,6 +1904,32 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
}
/**
+ * Gets flag indicating whether SQL indexes should support snapshots.
+ *
+ * @return {@code True} if SQL indexes should support snapshots.
+ */
+ public boolean isSnapshotableIndex() {
+ return snapshotableIdx;
+ }
+
+ /**
+ * Sets flag indicating whether SQL indexes should support snapshots.
+ * <p>
+ * Default value is {@code false}.
+ * <p>
+ * <b>Note</b> that this flag is ignored if indexes are stored in offheap memory,
+ * for offheap indexes snapshots are always enabled.
+ *
+ * @param snapshotableIdx {@code True} if SQL indexes should support snapshots.
+ * @return {@code this} for chaining.
+ */
+ public CacheConfiguration<K, V> setSnapshotableIndex(boolean snapshotableIdx) {
+ this.snapshotableIdx = snapshotableIdx;
+
+ return this;
+ }
+
+ /**
* Gets array of cache plugin configurations.
*
* @return Cache plugin configurations.
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
index be7bbe9..e56e445 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheSqlQuery.java
@@ -55,6 +55,16 @@ public class GridCacheSqlQuery implements Message {
/** */
@GridToStringInclude
@GridDirectTransient
+ private int[] paramIdxs;
+
+ /** */
+ @GridToStringInclude
+ @GridDirectTransient
+ private int paramsSize;
+
+ /** */
+ @GridToStringInclude
+ @GridDirectTransient
private LinkedHashMap<String, ?> cols;
/** Field kept for backward compatibility. */
@@ -77,6 +87,14 @@ public class GridCacheSqlQuery implements Message {
this.qry = qry;
this.params = F.isEmpty(params) ? EMPTY_PARAMS : params;
+ paramsSize = this.params.length;
+ }
+
+ /**
+ * @param paramIdxs Parameter indexes.
+ */
+ public void parameterIndexes(int[] paramIdxs) {
+ this.paramIdxs = paramIdxs;
}
/**
@@ -222,4 +240,28 @@ public class GridCacheSqlQuery implements Message {
@Override public byte fieldsCount() {
return 3;
}
+
+ /**
+ * @param args Arguments.
+ * @return Copy.
+ */
+ public GridCacheSqlQuery copy(Object[] args) {
+ GridCacheSqlQuery cp = new GridCacheSqlQuery();
+
+ cp.qry = qry;
+ cp.cols = cols;
+ cp.paramIdxs = paramIdxs;
+ cp.paramsSize = paramsSize;
+
+ if (F.isEmpty(args))
+ cp.params = EMPTY_PARAMS;
+ else {
+ cp.params = new Object[paramsSize];
+
+ for (int paramIdx : paramIdxs)
+ cp.params[paramIdx] = args[paramIdx];
+ }
+
+ return cp;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
index 4b5fe22..da59c18 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheTwoStepQuery.java
@@ -47,16 +47,27 @@ public class GridCacheTwoStepQuery {
/** */
private Set<String> spaces;
+ /** */
+ private final boolean skipMergeTbl;
+
/**
* @param spaces All spaces accessed in query.
* @param rdc Reduce query.
+ * @param skipMergeTbl {@code True} if reduce query can skip merge table creation and
+ * get data directly from merge index.
*/
- public GridCacheTwoStepQuery(Set<String> spaces, GridCacheSqlQuery rdc) {
+ public GridCacheTwoStepQuery(Set<String> spaces, GridCacheSqlQuery rdc, boolean skipMergeTbl) {
assert rdc != null;
this.spaces = spaces;
-
this.rdc = rdc;
+ this.skipMergeTbl = skipMergeTbl;
+ }
+ /**
+ * @return {@code True} if reduce query can skip merge table creation and get data directly from merge index.
+ */
+ public boolean skipMergeTable() {
+ return skipMergeTbl;
}
/**
@@ -89,9 +100,12 @@ public class GridCacheTwoStepQuery {
/**
* @param qry SQL Query.
+ * @return {@code this}.
*/
- public void addMapQuery(GridCacheSqlQuery qry) {
+ public GridCacheTwoStepQuery addMapQuery(GridCacheSqlQuery qry) {
mapQrys.add(qry);
+
+ return this;
}
/**
@@ -122,6 +136,21 @@ public class GridCacheTwoStepQuery {
this.spaces = spaces;
}
+ /**
+ * @param args New arguments to copy with.
+ * @return Copy.
+ */
+ public GridCacheTwoStepQuery copy(Object[] args) {
+ assert !explain;
+
+ GridCacheTwoStepQuery cp = new GridCacheTwoStepQuery(spaces, rdc.copy(args), skipMergeTbl);
+ cp.pageSize = pageSize;
+ for (int i = 0; i < mapQrys.size(); i++)
+ cp.mapQrys.add(mapQrys.get(i).copy(args));
+
+ return cp;
+ }
+
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridCacheTwoStepQuery.class, this);
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index d0eeeb1..814229c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -1672,34 +1672,9 @@ public class GridQueryProcessor extends GridProcessorAdapter {
}
/**
- *
- */
- private abstract static class Property {
- /**
- * Gets this property value from the given object.
- *
- * @param key Key.
- * @param val Value.
- * @return Property value.
- * @throws IgniteCheckedException If failed.
- */
- public abstract Object value(Object key, Object val) throws IgniteCheckedException;
-
- /**
- * @return Property name.
- */
- public abstract String name();
-
- /**
- * @return Class member type.
- */
- public abstract Class<?> type();
- }
-
- /**
* Description of type property.
*/
- private static class ClassProperty extends Property {
+ private static class ClassProperty extends GridQueryProperty {
/** */
private final Member member;
@@ -1794,7 +1769,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
/**
*
*/
- private class PortableProperty extends Property {
+ private class PortableProperty extends GridQueryProperty {
/** Property name. */
private String propName;
@@ -1938,7 +1913,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
/** */
@GridToStringExclude
- private final Map<String, Property> props = new HashMap<>();
+ private final Map<String, GridQueryProperty> props = new HashMap<>();
/** */
@GridToStringInclude
@@ -1993,11 +1968,16 @@ public class GridQueryProcessor extends GridProcessorAdapter {
}
/** {@inheritDoc} */
+ @Override public GridQueryProperty property(String name) {
+ return props.get(name);
+ }
+
+ /** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public <T> T value(String field, Object key, Object val) throws IgniteCheckedException {
assert field != null;
- Property prop = props.get(field);
+ GridQueryProperty prop = props.get(field);
if (prop == null)
throw new IgniteCheckedException("Failed to find field '" + field + "' in type '" + name + "'.");
@@ -2096,7 +2076,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
* @param failOnDuplicate Fail on duplicate flag.
* @throws IgniteCheckedException In case of error.
*/
- public void addProperty(Property prop, boolean failOnDuplicate) throws IgniteCheckedException {
+ public void addProperty(GridQueryProperty prop, boolean failOnDuplicate) throws IgniteCheckedException {
String name = prop.name();
if (props.put(name, prop) != null && failOnDuplicate)
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
new file mode 100644
index 0000000..d623d25
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProperty.java
@@ -0,0 +1,45 @@
+/*
+ * 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.query;
+
+import org.apache.ignite.IgniteCheckedException;
+
+/**
+ * Description and access method for query entity field.
+ */
+public abstract class GridQueryProperty {
+ /**
+ * Gets this property value from the given object.
+ *
+ * @param key Key.
+ * @param val Value.
+ * @return Property value.
+ * @throws IgniteCheckedException If failed.
+ */
+ public abstract Object value(Object key, Object val) throws IgniteCheckedException;
+
+ /**
+ * @return Property name.
+ */
+ public abstract String name();
+
+ /**
+ * @return Class member type.
+ */
+ public abstract Class<?> type();
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
index b05e1d8..45919ef 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java
@@ -50,6 +50,12 @@ public interface GridQueryTypeDescriptor {
public <T> T value(String field, Object key, Object val) throws IgniteCheckedException;
/**
+ * @param name Property name.
+ * @return Property.
+ */
+ public GridQueryProperty property(String name);
+
+ /**
* Gets indexes for this type.
*
* @return Indexes for this type.
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/GridH2ResultSetIterator.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/GridH2ResultSetIterator.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/GridH2ResultSetIterator.java
index 2c67638..3603bb5 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/GridH2ResultSetIterator.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/GridH2ResultSetIterator.java
@@ -41,14 +41,19 @@ public abstract class GridH2ResultSetIterator<T> extends GridCloseableIteratorAd
protected final Object[] row;
/** */
+ private final boolean closeStmt;
+
+ /** */
private boolean hasRow;
/**
* @param data Data array.
+ * @param closeStmt If {@code true} closes result set statement when iterator is closed.
* @throws IgniteCheckedException If failed.
*/
- protected GridH2ResultSetIterator(ResultSet data) throws IgniteCheckedException {
+ protected GridH2ResultSetIterator(ResultSet data, boolean closeStmt) throws IgniteCheckedException {
this.data = data;
+ this.closeStmt = closeStmt;
if (data != null) {
try {
@@ -115,11 +120,13 @@ public abstract class GridH2ResultSetIterator<T> extends GridCloseableIteratorAd
// Nothing to close.
return;
- try {
- U.closeQuiet(data.getStatement());
- }
- catch (SQLException e) {
- throw new IgniteCheckedException(e);
+ if (closeStmt) {
+ try {
+ U.closeQuiet(data.getStatement());
+ }
+ catch (SQLException e) {
+ throw new IgniteCheckedException(e);
+ }
}
U.closeQuiet(data);
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index d5efebf..cc452c1 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -79,6 +79,7 @@ import org.apache.ignite.internal.processors.query.GridQueryFieldsResult;
import org.apache.ignite.internal.processors.query.GridQueryFieldsResultAdapter;
import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor;
import org.apache.ignite.internal.processors.query.GridQueryIndexing;
+import org.apache.ignite.internal.processors.query.GridQueryProperty;
import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2KeyValueRowOffheap;
@@ -93,12 +94,14 @@ import org.apache.ignite.internal.processors.query.h2.opt.GridLuceneIndex;
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter;
import org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor;
import org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor;
+import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap;
import org.apache.ignite.internal.util.GridEmptyCloseableIterator;
import org.apache.ignite.internal.util.GridSpinBusyLock;
import org.apache.ignite.internal.util.lang.GridCloseableIterator;
import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeGuard;
import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory;
import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.T3;
import org.apache.ignite.internal.util.typedef.internal.LT;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.SB;
@@ -176,6 +179,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0;" +
"RECOMPILE_ALWAYS=1;MAX_OPERATION_MEMORY=0";
+ /** */
+ private static final int PREPARED_STMT_CACHE_SIZE = 256;
+
+ /** */
+ private static final int TWO_STEP_QRY_CACHE_SIZE = 1024;
+
/** Field name for key. */
public static final String KEY_FIELD_NAME = "_key";
@@ -190,6 +199,8 @@ public class IgniteH2Indexing implements GridQueryIndexing {
*/
static {
try {
+ System.setProperty("h2.objectCache", "false");
+
COMMAND_FIELD = JdbcPreparedStatement.class.getDeclaredField("command");
COMMAND_FIELD.setAccessible(true);
@@ -242,6 +253,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
c = initialValue();
set(c);
+
+ // Reset statement cache when new connection is created.
+ stmtCache.get().clear();
}
return c;
@@ -266,6 +280,17 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/** */
private volatile GridKernalContext ctx;
+ /** */
+ private final ThreadLocal<StatementCache> stmtCache = new ThreadLocal<StatementCache>() {
+ @Override protected StatementCache initialValue() {
+ return new StatementCache(PREPARED_STMT_CACHE_SIZE);
+ }
+ };
+
+ /** */
+ private final GridBoundedConcurrentLinkedHashMap<T3<String, String, Boolean>, TwoStepCachedQuery> twoStepCache =
+ new GridBoundedConcurrentLinkedHashMap<>(TWO_STEP_QRY_CACHE_SIZE);
+
/**
* @param space Space.
* @return Connection.
@@ -280,6 +305,35 @@ public class IgniteH2Indexing implements GridQueryIndexing {
}
/**
+ * @param c Connection.
+ * @param sql SQL.
+ * @param useStmtCache If {@code true} uses statement cache.
+ * @return Prepared statement.
+ * @throws SQLException If failed.
+ */
+ private PreparedStatement prepareStatement(Connection c, String sql, boolean useStmtCache) throws SQLException {
+ if (useStmtCache) {
+ StatementCache cache = stmtCache.get();
+
+ PreparedStatement stmt = cache.get(sql);
+
+ if (stmt != null && !stmt.isClosed()) {
+ assert stmt.getConnection() == c;
+
+ return stmt;
+ }
+
+ stmt = c.prepareStatement(sql);
+
+ cache.put(sql, stmt);
+
+ return stmt;
+ }
+ else
+ return c.prepareStatement(sql);
+ }
+
+ /**
* Gets DB connection.
*
* @param schema Whether to set schema for connection or not.
@@ -648,7 +702,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
try {
Connection conn = connectionForThread(schema(spaceName));
- ResultSet rs = executeSqlQueryWithTimer(spaceName, conn, qry, params);
+ ResultSet rs = executeSqlQueryWithTimer(spaceName, conn, qry, params, true);
List<GridQueryFieldMetadata> meta = null;
@@ -710,15 +764,16 @@ public class IgniteH2Indexing implements GridQueryIndexing {
* @param conn Connection,.
* @param sql Sql query.
* @param params Parameters.
+ * @param useStmtCache If {@code true} uses statement cache.
* @return Result.
* @throws IgniteCheckedException If failed.
*/
- private ResultSet executeSqlQuery(Connection conn, String sql, Collection<Object> params)
+ private ResultSet executeSqlQuery(Connection conn, String sql, Collection<Object> params, boolean useStmtCache)
throws IgniteCheckedException {
PreparedStatement stmt;
try {
- stmt = conn.prepareStatement(sql);
+ stmt = prepareStatement(conn, sql, useStmtCache);
}
catch (SQLException e) {
throw new IgniteCheckedException("Failed to parse SQL query: " + sql, e);
@@ -747,18 +802,23 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/**
* Executes sql query and prints warning if query is too slow..
*
+ * @param space Space name.
* @param conn Connection,.
* @param sql Sql query.
* @param params Parameters.
+ * @param useStmtCache If {@code true} uses statement cache.
* @return Result.
* @throws IgniteCheckedException If failed.
*/
- public ResultSet executeSqlQueryWithTimer(String space, Connection conn, String sql,
- @Nullable Collection<Object> params) throws IgniteCheckedException {
+ public ResultSet executeSqlQueryWithTimer(String space,
+ Connection conn,
+ String sql,
+ @Nullable Collection<Object> params,
+ boolean useStmtCache) throws IgniteCheckedException {
long start = U.currentTimeMillis();
try {
- ResultSet rs = executeSqlQuery(conn, sql, params);
+ ResultSet rs = executeSqlQuery(conn, sql, params, useStmtCache);
long time = U.currentTimeMillis() - start;
@@ -767,7 +827,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
if (time > longQryExecTimeout) {
String msg = "Query execution is too long (" + time + " ms): " + sql;
- ResultSet plan = executeSqlQuery(conn, "EXPLAIN " + sql, params);
+ ResultSet plan = executeSqlQuery(conn, "EXPLAIN " + sql, params, false);
plan.next();
@@ -803,7 +863,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
String sql = generateQuery(qry, tbl);
- return executeSqlQueryWithTimer(space, conn, sql, params);
+ return executeSqlQueryWithTimer(space, conn, sql, params, true);
}
/**
@@ -924,41 +984,52 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/** {@inheritDoc} */
@Override public QueryCursor<List<?>> queryTwoStep(GridCacheContext<?,?> cctx, SqlFieldsQuery qry) {
- String space = cctx.name();
- String sqlQry = qry.getSql();
+ final String space = cctx.name();
+ final String sqlQry = qry.getSql();
Connection c = connectionForSpace(space);
- PreparedStatement stmt;
+ GridCacheTwoStepQuery twoStepQry;
+ List<GridQueryFieldMetadata> meta;
- try {
- stmt = c.prepareStatement(sqlQry);
- }
- catch (SQLException e) {
- throw new CacheException("Failed to parse query: " + sqlQry, e);
- }
+ final T3<String, String, Boolean> cachedQryKey = new T3<>(space, sqlQry, qry.isCollocated());
+ TwoStepCachedQuery cachedQry = twoStepCache.get(cachedQryKey);
- try {
- bindParameters(stmt, F.asList(qry.getArgs()));
- }
- catch (IgniteCheckedException e) {
- throw new CacheException("Failed to bind parameters: [qry=" + sqlQry + ", params=" +
- Arrays.deepToString(qry.getArgs()) + "]", e);
+ if (cachedQry != null) {
+ twoStepQry = cachedQry.twoStepQry.copy(qry.getArgs());
+ meta = cachedQry.meta;
}
+ else {
+ PreparedStatement stmt;
- GridCacheTwoStepQuery twoStepQry;
- List<GridQueryFieldMetadata> meta;
+ try {
+ // Do not cache this statement because the whole two step query object will be cached later on.
+ stmt = prepareStatement(c, sqlQry, false);
+ }
+ catch (SQLException e) {
+ throw new CacheException("Failed to parse query: " + sqlQry, e);
+ }
+ try {
+ try {
+ bindParameters(stmt, F.asList(qry.getArgs()));
+ }
+ catch (IgniteCheckedException e) {
+ throw new CacheException("Failed to bind parameters: [qry=" + sqlQry + ", params=" +
+ Arrays.deepToString(qry.getArgs()) + "]", e);
+ }
- try {
- twoStepQry = GridSqlQuerySplitter.split((JdbcPreparedStatement)stmt, qry.getArgs(), qry.isCollocated());
+ try {
+ twoStepQry = GridSqlQuerySplitter.split((JdbcPreparedStatement)stmt, qry.getArgs(), qry.isCollocated());
- meta = meta(stmt.getMetaData());
- }
- catch (SQLException e) {
- throw new CacheException(e);
- }
- finally {
- U.close(stmt, log);
+ meta = meta(stmt.getMetaData());
+ }
+ catch (SQLException e) {
+ throw new CacheException(e);
+ }
+ }
+ finally {
+ U.close(stmt, log);
+ }
}
if (log.isDebugEnabled())
@@ -970,6 +1041,11 @@ public class IgniteH2Indexing implements GridQueryIndexing {
cursor.fieldsMeta(meta);
+ if (cachedQry == null && !twoStepQry.explain()) {
+ cachedQry = new TwoStepCachedQuery(meta, twoStepQry.copy(null));
+ twoStepCache.putIfAbsent(cachedQryKey, cachedQry);
+ }
+
return cursor;
}
@@ -1542,6 +1618,31 @@ public class IgniteH2Indexing implements GridQueryIndexing {
}
/**
+ * Cached two-step query.
+ */
+ private static final class TwoStepCachedQuery {
+ /** */
+ final List<GridQueryFieldMetadata> meta;
+
+ /** */
+ final GridCacheTwoStepQuery twoStepQry;
+
+ /**
+ * @param meta Fields metadata.
+ * @param twoStepQry Query.
+ */
+ public TwoStepCachedQuery(List<GridQueryFieldMetadata> meta, GridCacheTwoStepQuery twoStepQry) {
+ this.meta = meta;
+ this.twoStepQry = twoStepQry;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(TwoStepCachedQuery.class, this);
+ }
+ }
+
+ /**
* Wrapper to store connection and flag is schema set or not.
*/
private static class ConnectionWrapper {
@@ -1889,7 +1990,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
* @throws IgniteCheckedException If failed.
*/
protected FieldsIterator(ResultSet data) throws IgniteCheckedException {
- super(data);
+ super(data, false);
}
/** {@inheritDoc} */
@@ -1914,7 +2015,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
* @throws IgniteCheckedException If failed.
*/
protected KeyValIterator(ResultSet data) throws IgniteCheckedException {
- super(data);
+ super(data, false);
}
/** {@inheritDoc} */
@@ -2091,6 +2192,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/** */
private final boolean preferSwapVal;
+ /** */
+ private final boolean snapshotableIdx;
+
+ /** */
+ private final GridQueryProperty[] props;
+
/**
* @param type Type descriptor.
* @param schema Schema.
@@ -2120,7 +2227,18 @@ public class IgniteH2Indexing implements GridQueryIndexing {
keyType = DataType.getTypeFromClass(type.keyClass());
valType = DataType.getTypeFromClass(type.valueClass());
+ props = new GridQueryProperty[fields.length];
+
+ for (int i = 0; i < fields.length; i++) {
+ GridQueryProperty p = type.property(fields[i]);
+
+ assert p != null : fields[i];
+
+ props[i] = p;
+ }
+
preferSwapVal = schema.ccfg.getMemoryMode() == CacheMemoryMode.OFFHEAP_TIERED;
+ snapshotableIdx = schema.ccfg.isSnapshotableIndex() || schema.offheap != null;
}
/** {@inheritDoc} */
@@ -2274,7 +2392,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
/** {@inheritDoc} */
@Override public Object columnValue(Object key, Object val, int col) {
try {
- return type.value(fields[col], key, val);
+ return props[col].value(key, val);
}
catch (IgniteCheckedException e) {
throw DbException.convert(e);
@@ -2298,5 +2416,40 @@ public class IgniteH2Indexing implements GridQueryIndexing {
@Override public boolean preferSwapValue() {
return preferSwapVal;
}
+
+ /** {@inheritDoc} */
+ @Override public boolean snapshotableIndex() {
+ return snapshotableIdx;
+ }
+ }
+
+ /**
+ * Statement cache.
+ */
+ private static class StatementCache extends LinkedHashMap<String, PreparedStatement> {
+ /** */
+ private int size;
+
+ /**
+ * @param size Size.
+ */
+ private StatementCache(int size) {
+ super(size, (float)0.75, true);
+
+ this.size = size;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean removeEldestEntry(Map.Entry<String, PreparedStatement> eldest) {
+ boolean rmv = size() > size;
+
+ if (rmv) {
+ PreparedStatement stmt = eldest.getValue();
+
+ U.closeQuiet(stmt);
+ }
+
+ return rmv;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
index ed3ff7a..80dcfcb 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
@@ -116,4 +116,9 @@ public interface GridH2RowDescriptor extends GridOffHeapSmartPointerFactory<Grid
* @return {@code True} if should check swap value before offheap.
*/
public boolean preferSwapValue();
+
+ /**
+ * @return {@code True} if index should support snapshots.
+ */
+ public boolean snapshotableIndex();
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index bf318b2..f1e5b16 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -54,6 +54,7 @@ import org.h2.table.TableFilter;
import org.h2.value.Value;
import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentHashMap8;
+import org.jsr166.LongAdder8;
import static org.apache.ignite.internal.processors.query.h2.opt.GridH2AbstractKeyValueRow.VAL_COL;
@@ -79,6 +80,12 @@ public class GridH2Table extends TableBase {
/** */
private volatile Object[] actualSnapshot;
+ /** */
+ private final LongAdder8 size = new LongAdder8();
+
+ /** */
+ private final boolean snapshotEnabled;
+
/**
* Creates table.
*
@@ -101,10 +108,12 @@ public class GridH2Table extends TableBase {
assert idxs != null;
assert idxs.size() >= 1;
- lock = new ReentrantReadWriteLock();
+ lock = new ReentrantReadWriteLock();
// Add scan index at 0 which is required by H2.
idxs.add(0, new ScanIndex(index(0)));
+
+ snapshotEnabled = desc == null || desc.snapshotableIndex();
}
/** {@inheritDoc} */
@@ -164,7 +173,7 @@ public class GridH2Table extends TableBase {
GridUnsafeMemory mem = desc.memory();
- lock.readLock().lock();
+ readLock();
if (mem != null)
desc.guard().begin();
@@ -183,7 +192,7 @@ public class GridH2Table extends TableBase {
return true;
}
finally {
- lock.readLock().unlock();
+ readUnlock();
if (mem != null)
desc.guard().end();
@@ -209,6 +218,9 @@ public class GridH2Table extends TableBase {
}
}
+ if (!snapshotEnabled)
+ return;
+
Object[] snapshot;
for (long waitTime = 100;; waitTime *= 2) { // Increase wait time to avoid starvation.
@@ -297,16 +309,14 @@ public class GridH2Table extends TableBase {
* Closes table and releases resources.
*/
public void close() {
- Lock l = lock.writeLock();
-
- l.lock();
+ writeLock();
try {
for (int i = 1, len = idxs.size(); i < len; i++)
index(i).close(null);
}
finally {
- l.unlock();
+ writeUnlock();
}
}
@@ -363,7 +373,7 @@ public class GridH2Table extends TableBase {
// getting updated from different threads with different rows with the same key is impossible.
GridUnsafeMemory mem = desc == null ? null : desc.memory();
- lock.readLock().lock();
+ readLock();
if (mem != null)
desc.guard().begin();
@@ -379,6 +389,8 @@ public class GridH2Table extends TableBase {
kvOld.onUnswap(kvOld.getValue(VAL_COL), true);
}
+ else if (old == null)
+ size.increment();
int len = idxs.size();
@@ -414,6 +426,8 @@ public class GridH2Table extends TableBase {
}
if (old != null) {
+ size.decrement();
+
// Remove row from all indexes.
// Start from 2 because 0 - Scan (don't need to update), 1 - PK (already updated).
for (int i = 2, len = idxs.size(); i < len; i++) {
@@ -432,7 +446,7 @@ public class GridH2Table extends TableBase {
return true;
}
finally {
- lock.readLock().unlock();
+ readUnlock();
if (mem != null)
desc.guard().end();
@@ -469,6 +483,9 @@ public class GridH2Table extends TableBase {
* Rebuilds all indexes of this table.
*/
public void rebuildIndexes() {
+ if (!snapshotEnabled)
+ return;
+
GridUnsafeMemory memory = desc == null ? null : desc.memory();
lock.writeLock().lock();
@@ -579,7 +596,7 @@ public class GridH2Table extends TableBase {
/** {@inheritDoc} */
@Override public long getRowCountApproximation() {
- return getUniqueIndex().getRowCountApproximation();
+ return size.longValue();
}
/** {@inheritDoc} */
@@ -605,6 +622,38 @@ public class GridH2Table extends TableBase {
}
/**
+ *
+ */
+ private void readLock() {
+ if (snapshotEnabled)
+ lock.readLock().lock();
+ }
+
+ /**
+ *
+ */
+ private void readUnlock() {
+ if (snapshotEnabled)
+ lock.readLock().unlock();
+ }
+
+ /**
+ *
+ */
+ private void writeLock() {
+ if (snapshotEnabled)
+ lock.writeLock().lock();
+ }
+
+ /**
+ *
+ */
+ private void writeUnlock() {
+ if (snapshotEnabled)
+ lock.writeLock().unlock();
+ }
+
+ /**
* H2 Table engine.
*/
@SuppressWarnings({"PublicInnerClass", "FieldAccessedSynchronizedAndUnsynchronized"})
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
index 387c58b..28adeee 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
@@ -23,6 +23,7 @@ import java.util.Comparator;
import java.util.Iterator;
import java.util.NavigableMap;
import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
import org.apache.ignite.internal.util.GridEmptyIterator;
import org.apache.ignite.internal.util.offheap.unsafe.GridOffHeapSnapTreeMap;
import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeGuard;
@@ -51,8 +52,10 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
protected final ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> tree;
/** */
- private final ThreadLocal<ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row>> snapshot =
- new ThreadLocal<>();
+ private final ThreadLocal<ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row>> snapshot = new ThreadLocal<>();
+
+ /** */
+ private final boolean snapshotEnabled;
/**
* Constructor with index initialization.
@@ -81,40 +84,68 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
final GridH2RowDescriptor desc = tbl.rowDescriptor();
- tree = desc == null || desc.memory() == null ? new SnapTreeMap<GridSearchRowPointer, GridH2Row>(this) {
- @Override protected void afterNodeUpdate_nl(Node<GridSearchRowPointer, GridH2Row> node, Object val) {
- if (val != null)
- node.key = (GridSearchRowPointer)val;
- }
+ if (desc == null || desc.memory() == null) {
+ snapshotEnabled = desc == null || desc.snapshotableIndex();
- @Override protected Comparable<? super GridSearchRowPointer> comparable(Object key) {
- if (key instanceof ComparableRow)
- return (Comparable<? super SearchRow>)key;
+ if (snapshotEnabled) {
+ tree = new SnapTreeMap<GridSearchRowPointer, GridH2Row>(this) {
+ @Override protected void afterNodeUpdate_nl(Node<GridSearchRowPointer, GridH2Row> node, Object val) {
+ if (val != null)
+ node.key = (GridSearchRowPointer)val;
+ }
- return super.comparable(key);
+ @Override protected Comparable<? super GridSearchRowPointer> comparable(Object key) {
+ if (key instanceof ComparableRow)
+ return (Comparable<? super SearchRow>)key;
+
+ return super.comparable(key);
+ }
+ };
}
- } : new GridOffHeapSnapTreeMap<GridSearchRowPointer, GridH2Row>(desc, desc, desc.memory(), desc.guard(), this) {
- @Override protected void afterNodeUpdate_nl(long node, GridH2Row val) {
- final long oldKey = keyPtr(node);
+ else {
+ tree = new ConcurrentSkipListMap<>(
+ new Comparator<GridSearchRowPointer>() {
+ @Override public int compare(GridSearchRowPointer o1, GridSearchRowPointer o2) {
+ if (o1 instanceof ComparableRow)
+ return ((ComparableRow)o1).compareTo(o2);
- if (val != null) {
- key(node, val);
+ if (o2 instanceof ComparableRow)
+ return -((ComparableRow)o2).compareTo(o1);
- guard.finalizeLater(new Runnable() {
- @Override public void run() {
- desc.createPointer(oldKey).decrementRefCount();
+ return compareRows(o1, o2);
+ }
}
- });
- }
+ );
}
+ }
+ else {
+ assert desc.snapshotableIndex() : desc;
- @Override protected Comparable<? super GridSearchRowPointer> comparable(Object key) {
- if (key instanceof ComparableRow)
- return (Comparable<? super SearchRow>)key;
+ snapshotEnabled = true;
- return super.comparable(key);
- }
- };
+ tree = new GridOffHeapSnapTreeMap<GridSearchRowPointer, GridH2Row>(desc, desc, desc.memory(), desc.guard(), this) {
+ @Override protected void afterNodeUpdate_nl(long node, GridH2Row val) {
+ final long oldKey = keyPtr(node);
+
+ if (val != null) {
+ key(node, val);
+
+ guard.finalizeLater(new Runnable() {
+ @Override public void run() {
+ desc.createPointer(oldKey).decrementRefCount();
+ }
+ });
+ }
+ }
+
+ @Override protected Comparable<? super GridSearchRowPointer> comparable(Object key) {
+ if (key instanceof ComparableRow)
+ return (Comparable<? super SearchRow>)key;
+
+ return super.comparable(key);
+ }
+ };
+ }
}
/**
@@ -133,6 +164,9 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
*/
@SuppressWarnings("unchecked")
@Override public Object takeSnapshot(@Nullable Object s) {
+ if (!snapshotEnabled)
+ return null;
+
assert snapshot.get() == null;
if (s == null)
@@ -148,6 +182,9 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
* Releases snapshot for current thread.
*/
@Override public void releaseSnapshot() {
+ if (!snapshotEnabled)
+ return;
+
ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> s = snapshot.get();
snapshot.remove();
@@ -160,6 +197,9 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
* @return Snapshot for current thread if there is one.
*/
private ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> treeForRead() {
+ if (!snapshotEnabled)
+ return tree;
+
ConcurrentNavigableMap<GridSearchRowPointer, GridH2Row> res = snapshot.get();
if (res == null)
@@ -199,7 +239,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
/** {@inheritDoc} */
@Override public long getRowCountApproximation() {
- return tree.size();
+ return table.getRowCountApproximation();
}
/** {@inheritDoc} */
@@ -372,7 +412,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
* Comparable row with bias. Will be used for queries to have correct bounds (in case of multicolumn index
* and query on few first columns we will multiple equal entries in tree).
*/
- private class ComparableRow implements GridSearchRowPointer, Comparable<SearchRow> {
+ private final class ComparableRow implements GridSearchRowPointer, Comparable<SearchRow> {
/** */
private final SearchRow row;
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java
index 7b89824..0c9c8fe 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlQuerySplitter.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
import org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing;
import org.apache.ignite.internal.util.typedef.F;
import org.h2.jdbc.JdbcPreparedStatement;
+import org.h2.util.IntArray;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.internal.processors.query.h2.sql.GridSqlFunctionType.AVG;
@@ -224,13 +225,23 @@ public class GridSqlQuerySplitter {
rdcQry.distinct(true);
}
- // Build resulting two step query.
- GridCacheTwoStepQuery res = new GridCacheTwoStepQuery(spaces, new GridCacheSqlQuery(rdcQry.getSQL(),
- findParams(rdcQry, params, new ArrayList<>()).toArray()));
+ IntArray paramIdxs = new IntArray(params.length);
+
+ GridCacheSqlQuery rdc = new GridCacheSqlQuery(rdcQry.getSQL(),
+ findParams(rdcQry, params, new ArrayList<>(), paramIdxs).toArray());
+
+ rdc.parameterIndexes(toIntArray(paramIdxs));
+
+ paramIdxs = new IntArray(params.length);
- res.addMapQuery(new GridCacheSqlQuery(mapQry.getSQL(),
- findParams(mapQry, params, new ArrayList<>(params.length)).toArray())
- .columns(collectColumns(mapExps)));
+ GridCacheSqlQuery map = new GridCacheSqlQuery(mapQry.getSQL(),
+ findParams(mapQry, params, new ArrayList<>(params.length), paramIdxs).toArray())
+ .columns(collectColumns(mapExps));
+
+ map.parameterIndexes(toIntArray(paramIdxs));
+
+ // Build resulting two step query.
+ GridCacheTwoStepQuery res = new GridCacheTwoStepQuery(spaces, rdc, rdcQry.simpleQuery()).addMapQuery(map);
res.explain(explain);
@@ -238,6 +249,16 @@ public class GridSqlQuerySplitter {
}
/**
+ * @param arr Integer array.
+ * @return Primitive int array.
+ */
+ private static int[] toIntArray(IntArray arr) {
+ int[] res = new int[arr.size()];
+ arr.toArray(res);
+ return res;
+ }
+
+ /**
* @param cols Columns from SELECT clause.
* @return Map of columns with types.
*/
@@ -341,19 +362,21 @@ public class GridSqlQuerySplitter {
* @param qry Select.
* @param params Parameters.
* @param target Extracted parameters.
+ * @param paramIdxs Parameter indexes.
* @return Extracted parameters list.
*/
- private static List<Object> findParams(GridSqlQuery qry, Object[] params, ArrayList<Object> target) {
+ private static List<Object> findParams(GridSqlQuery qry, Object[] params, ArrayList<Object> target,
+ IntArray paramIdxs) {
if (qry instanceof GridSqlSelect)
- return findParams((GridSqlSelect)qry, params, target);
+ return findParams((GridSqlSelect)qry, params, target, paramIdxs);
GridSqlUnion union = (GridSqlUnion)qry;
- findParams(union.left(), params, target);
- findParams(union.right(), params, target);
+ findParams(union.left(), params, target, paramIdxs);
+ findParams(union.right(), params, target, paramIdxs);
- findParams(qry.limit(), params, target);
- findParams(qry.offset(), params, target);
+ findParams(qry.limit(), params, target, paramIdxs);
+ findParams(qry.offset(), params, target, paramIdxs);
return target;
}
@@ -362,22 +385,24 @@ public class GridSqlQuerySplitter {
* @param qry Select.
* @param params Parameters.
* @param target Extracted parameters.
+ * @param paramIdxs Parameter indexes.
* @return Extracted parameters list.
*/
- private static List<Object> findParams(GridSqlSelect qry, Object[] params, ArrayList<Object> target) {
+ private static List<Object> findParams(GridSqlSelect qry, Object[] params, ArrayList<Object> target,
+ IntArray paramIdxs) {
if (params.length == 0)
return target;
for (GridSqlElement el : qry.columns(false))
- findParams(el, params, target);
+ findParams(el, params, target, paramIdxs);
- findParams(qry.from(), params, target);
- findParams(qry.where(), params, target);
+ findParams(qry.from(), params, target, paramIdxs);
+ findParams(qry.where(), params, target, paramIdxs);
// Don't search in GROUP BY and HAVING since they expected to be in select list.
- findParams(qry.limit(), params, target);
- findParams(qry.offset(), params, target);
+ findParams(qry.limit(), params, target, paramIdxs);
+ findParams(qry.offset(), params, target, paramIdxs);
return target;
}
@@ -386,15 +411,17 @@ public class GridSqlQuerySplitter {
* @param el Element.
* @param params Parameters.
* @param target Extracted parameters.
+ * @param paramIdxs Parameter indexes.
*/
- private static void findParams(@Nullable GridSqlElement el, Object[] params, ArrayList<Object> target) {
+ private static void findParams(@Nullable GridSqlElement el, Object[] params, ArrayList<Object> target,
+ IntArray paramIdxs) {
if (el == null)
return;
if (el instanceof GridSqlParameter) {
// H2 Supports queries like "select ?5" but first 4 non-existing parameters are need to be set to any value.
// Here we will set them to NULL.
- int idx = ((GridSqlParameter)el).index();
+ final int idx = ((GridSqlParameter)el).index();
while (target.size() < idx)
target.add(null);
@@ -409,12 +436,14 @@ public class GridSqlQuerySplitter {
target.add(param);
else
target.set(idx, param);
+
+ paramIdxs.add(idx);
}
else if (el instanceof GridSqlSubquery)
- findParams(((GridSqlSubquery)el).select(), params, target);
+ findParams(((GridSqlSubquery)el).select(), params, target, paramIdxs);
else
for (GridSqlElement child : el)
- findParams(child, params, target);
+ findParams(child, params, target, paramIdxs);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java
index e537ace..e190c87 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sql/GridSqlSelect.java
@@ -103,6 +103,33 @@ public class GridSqlSelect extends GridSqlQuery {
}
/**
+ * @return {@code True} if this simple SQL query like 'SELECT A, B, C from SOME_TABLE' without any conditions
+ * and expressions.
+ */
+ public boolean simpleQuery() {
+ boolean simple = !distinct &&
+ from instanceof GridSqlTable &&
+ where == null &&
+ grpCols == null &&
+ havingCol < 0 &&
+ sort.isEmpty() &&
+ limit == null &&
+ offset == null;
+
+ if (simple) {
+ for (GridSqlElement expression : columns(true)) {
+ if (expression instanceof GridSqlAlias)
+ expression = expression.child();
+
+ if (!(expression instanceof GridSqlColumn))
+ return false;
+ }
+ }
+
+ return simple;
+ }
+
+ /**
* @param buff Statement builder.
* @param expression Alias expression.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
index b4e1932..21541ec 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
@@ -451,8 +451,11 @@ public class GridMapQueryExecutor {
int i = 0;
for (GridCacheSqlQuery qry : qrys) {
- ResultSet rs = h2.executeSqlQueryWithTimer(req.space(), h2.connectionForSpace(req.space()), qry.query(),
- F.asList(qry.parameters()));
+ ResultSet rs = h2.executeSqlQueryWithTimer(req.space(),
+ h2.connectionForSpace(req.space()),
+ qry.query(),
+ F.asList(qry.parameters()),
+ true);
if (ctx.event().isRecordable(EVT_CACHE_QUERY_EXECUTED)) {
ctx.event().record(new CacheQueryExecutedEvent<>(
@@ -820,17 +823,7 @@ public class GridMapQueryExecutor {
closed = true;
- Statement stmt;
-
- try {
- stmt = rs.getStatement();
- }
- catch (SQLException e) {
- throw new IllegalStateException(e); // Must not happen.
- }
-
U.close(rs, log);
- U.close(stmt, log);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
index 7f8caed..12c2240 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
@@ -80,6 +80,13 @@ public abstract class GridMergeIndex extends BaseIndex {
}
/**
+ *
+ */
+ protected GridMergeIndex() {
+ // No-op.
+ }
+
+ /**
* @return Return source nodes for this merge index.
*/
public Set<UUID> sources() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
index 5f5eb25..501480a 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
@@ -47,6 +47,20 @@ public class GridMergeIndexUnsorted extends GridMergeIndex {
super(tbl, name, IndexType.createScan(false), IndexColumn.wrap(tbl.getColumns()));
}
+ /**
+ * @return Dummy index instance.
+ */
+ public static GridMergeIndexUnsorted createDummy() {
+ return new GridMergeIndexUnsorted();
+ }
+
+ /**
+ *
+ */
+ private GridMergeIndexUnsorted() {
+ // No-op.
+ }
+
/** {@inheritDoc} */
@Override protected void addPage0(GridResultPage page) {
assert page.rowsInPage() > 0 || page.isLast() || page.isFail();
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
index f515a78..1d4fa30 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
@@ -79,10 +79,12 @@ import org.apache.ignite.marshaller.Marshaller;
import org.apache.ignite.plugin.extensions.communication.Message;
import org.h2.command.ddl.CreateTableData;
import org.h2.engine.Session;
+import org.h2.index.Cursor;
import org.h2.jdbc.JdbcConnection;
import org.h2.jdbc.JdbcResultSet;
import org.h2.jdbc.JdbcStatement;
import org.h2.result.ResultInterface;
+import org.h2.result.Row;
import org.h2.table.Column;
import org.h2.util.IntArray;
import org.h2.value.Value;
@@ -184,8 +186,8 @@ public class GridReduceQueryExecutor {
UUID nodeId = ((DiscoveryEvent)evt).eventNode().id();
for (QueryRun r : runs.values()) {
- for (GridMergeTable tbl : r.tbls) {
- if (tbl.getScanIndex(null).hasSource(nodeId)) {
+ for (GridMergeIndex idx : r.idxs) {
+ if (idx.hasSource(nodeId)) {
handleNodeLeft(r, nodeId);
break;
@@ -270,7 +272,7 @@ public class GridReduceQueryExecutor {
final int pageSize = r.pageSize;
- GridMergeIndex idx = r.tbls.get(msg.query()).getScanIndex(null);
+ GridMergeIndex idx = r.idxs.get(msg.query());
GridResultPage page;
@@ -468,7 +470,7 @@ public class GridReduceQueryExecutor {
r.pageSize = qry.pageSize() <= 0 ? GridCacheTwoStepQuery.DFLT_PAGE_SIZE : qry.pageSize();
- r.tbls = new ArrayList<>(qry.mapQueries().size());
+ r.idxs = new ArrayList<>(qry.mapQueries().size());
String space = cctx.name();
@@ -501,7 +503,7 @@ public class GridReduceQueryExecutor {
assert !nodes.isEmpty();
if (cctx.isReplicated() || qry.explain()) {
- assert qry.explain() || !nodes.contains(ctx.cluster().get().localNode()) :
+ assert qry.explain() || !nodes.contains(ctx.discovery().localNode()) :
"We must be on a client node.";
// Select random data node to run query on a replicated data or get EXPLAIN PLAN from a single node.
@@ -510,27 +512,35 @@ public class GridReduceQueryExecutor {
int tblIdx = 0;
+ final boolean skipMergeTbl = !qry.explain() && qry.skipMergeTable();
+
for (GridCacheSqlQuery mapQry : qry.mapQueries()) {
- GridMergeTable tbl;
+ GridMergeIndex idx;
- try {
- tbl = createMergeTable(r.conn, mapQry, qry.explain());
- }
- catch (IgniteCheckedException e) {
- throw new IgniteException(e);
- }
+ if (!skipMergeTbl) {
+ GridMergeTable tbl;
+
+ try {
+ tbl = createMergeTable(r.conn, mapQry, qry.explain());
+ }
+ catch (IgniteCheckedException e) {
+ throw new IgniteException(e);
+ }
- GridMergeIndex idx = tbl.getScanIndex(null);
+ idx = tbl.getScanIndex(null);
+
+ fakeTable(r.conn, tblIdx++).setInnerTable(tbl);
+ }
+ else
+ idx = GridMergeIndexUnsorted.createDummy();
for (ClusterNode node : nodes)
idx.addSource(node.id());
- r.tbls.add(tbl);
-
- fakeTable(r.conn, tblIdx++).setInnerTable(tbl);
+ r.idxs.add(idx);
}
- r.latch = new CountDownLatch(r.tbls.size() * nodes.size());
+ r.latch = new CountDownLatch(r.idxs.size() * nodes.size());
runs.put(qryReqId, r);
@@ -586,19 +596,52 @@ public class GridReduceQueryExecutor {
else // Send failed.
retry = true;
- ResultSet res = null;
+ Iterator<List<?>> resIter = null;
if (!retry) {
if (qry.explain())
return explainPlan(r.conn, space, qry);
- GridCacheSqlQuery rdc = qry.reduceQuery();
+ if (skipMergeTbl) {
+ List<List<?>> res = new ArrayList<>();
+
+ assert r.idxs.size() == 1 : r.idxs;
- res = h2.executeSqlQueryWithTimer(space, r.conn, rdc.query(), F.asList(rdc.parameters()));
+ GridMergeIndex idx = r.idxs.get(0);
+
+ Cursor cur = idx.findInStream(null, null);
+
+ while (cur.next()) {
+ Row row = cur.get();
+
+ int cols = row.getColumnCount();
+
+ List<Object> resRow = new ArrayList<>(cols);
+
+ for (int c = 0; c < cols; c++)
+ resRow.add(row.getValue(c).getObject());
+
+ res.add(resRow);
+ }
+
+ resIter = res.iterator();
+ }
+ else {
+ GridCacheSqlQuery rdc = qry.reduceQuery();
+
+ // Statement caching is prohibited here because we can't guarantee correct merge index reuse.
+ ResultSet res = h2.executeSqlQueryWithTimer(space,
+ r.conn,
+ rdc.query(),
+ F.asList(rdc.parameters()),
+ false);
+
+ resIter = new Iter(res);
+ }
}
- for (GridMergeTable tbl : r.tbls) {
- if (!tbl.getScanIndex(null).fetchedAll()) // We have to explicitly cancel queries on remote nodes.
+ for (GridMergeIndex idx : r.idxs) {
+ if (!idx.fetchedAll()) // We have to explicitly cancel queries on remote nodes.
send(nodes, new GridQueryCancelRequest(qryReqId), null);
}
@@ -609,7 +652,7 @@ public class GridReduceQueryExecutor {
continue;
}
- return new GridQueryCacheObjectsIterator(new Iter(res), cctx, keepPortable);
+ return new GridQueryCacheObjectsIterator(resIter, cctx, keepPortable);
}
catch (IgniteCheckedException | RuntimeException e) {
U.closeQuiet(r.conn);
@@ -633,8 +676,10 @@ public class GridReduceQueryExecutor {
if (!runs.remove(qryReqId, r))
U.warn(log, "Query run was already removed: " + qryReqId);
- for (int i = 0, mapQrys = qry.mapQueries().size(); i < mapQrys; i++)
- fakeTable(null, i).setInnerTable(null); // Drop all merge tables.
+ if (!skipMergeTbl) {
+ for (int i = 0, mapQrys = qry.mapQueries().size(); i < mapQrys; i++)
+ fakeTable(null, i).setInnerTable(null); // Drop all merge tables.
+ }
}
}
}
@@ -941,7 +986,7 @@ public class GridReduceQueryExecutor {
List<List<?>> lists = new ArrayList<>();
for (int i = 0, mapQrys = qry.mapQueries().size(); i < mapQrys; i++) {
- ResultSet rs = h2.executeSqlQueryWithTimer(space, c, "SELECT PLAN FROM " + table(i), null);
+ ResultSet rs = h2.executeSqlQueryWithTimer(space, c, "SELECT PLAN FROM " + table(i), null, false);
lists.add(F.asList(getPlan(rs)));
}
@@ -956,7 +1001,11 @@ public class GridReduceQueryExecutor {
GridCacheSqlQuery rdc = qry.reduceQuery();
- ResultSet rs = h2.executeSqlQueryWithTimer(space, c, "EXPLAIN " + rdc.query(), F.asList(rdc.parameters()));
+ ResultSet rs = h2.executeSqlQueryWithTimer(space,
+ c,
+ "EXPLAIN " + rdc.query(),
+ F.asList(rdc.parameters()),
+ false);
lists.add(F.asList(getPlan(rs)));
@@ -1013,7 +1062,7 @@ public class GridReduceQueryExecutor {
}
if (locNodeFound) // Local node goes the last to allow parallel execution.
- h2.mapQueryExecutor().onMessage(ctx.localNodeId(), copy(msg, ctx.cluster().get().localNode(), partsMap));
+ h2.mapQueryExecutor().onMessage(ctx.localNodeId(), copy(msg, ctx.discovery().localNode(), partsMap));
return ok;
}
@@ -1120,7 +1169,7 @@ public class GridReduceQueryExecutor {
*/
private static class QueryRun {
/** */
- private List<GridMergeTable> tbls;
+ private List<GridMergeIndex> idxs;
/** */
private CountDownLatch latch;
@@ -1148,8 +1197,8 @@ public class GridReduceQueryExecutor {
while (latch.getCount() != 0) // We don't need to wait for all nodes to reply.
latch.countDown();
- for (GridMergeTable tbl : tbls) // Fail all merge indexes.
- tbl.getScanIndex(null).fail(nodeId);
+ for (GridMergeIndex idx : idxs) // Fail all merge indexes.
+ idx.fail(nodeId);
}
/**
@@ -1162,8 +1211,8 @@ public class GridReduceQueryExecutor {
while (latch.getCount() != 0) // We don't need to wait for all nodes to reply.
latch.countDown();
- for (GridMergeTable tbl : tbls) // Fail all merge indexes.
- tbl.getScanIndex(null).fail(e);
+ for (GridMergeIndex idx : idxs) // Fail all merge indexes.
+ idx.fail(e);
}
}
@@ -1179,7 +1228,7 @@ public class GridReduceQueryExecutor {
* @throws IgniteCheckedException If failed.
*/
protected Iter(ResultSet data) throws IgniteCheckedException {
- super(data);
+ super(data, true);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
index f3fbf15..c510600 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractQuerySelfTest.java
@@ -156,36 +156,38 @@ public abstract class IgniteCacheAbstractQuerySelfTest extends GridCommonAbstrac
if (i > 0)
cc.setName("c" + i);
- cc.setCacheMode(cacheMode());
- cc.setAtomicityMode(atomicityMode());
- cc.setNearConfiguration(nearCacheConfiguration());
- cc.setWriteSynchronizationMode(FULL_SYNC);
- cc.setCacheStoreFactory(new StoreFactory());
- cc.setReadThrough(true);
- cc.setWriteThrough(true);
- cc.setLoadPreviousValue(true);
- cc.setRebalanceMode(SYNC);
- cc.setSwapEnabled(true);
- cc.setSqlFunctionClasses(SqlFunctions.class);
- cc.setIndexedTypes(
- BadHashKeyObject.class, Byte.class,
- ObjectValue.class, Long.class,
- Integer.class, Integer.class,
- Integer.class, String.class,
- Integer.class, ObjectValue.class,
- String.class, ObjectValueOther.class,
- Integer.class, ArrayObject.class,
- Key.class, GridCacheQueryTestValue.class,
- UUID.class, Person.class,
- IgniteCacheReplicatedQuerySelfTest.CacheKey.class, IgniteCacheReplicatedQuerySelfTest.CacheValue.class
- );
-
- if (cacheMode() != CacheMode.LOCAL)
- cc.setAffinity(new RendezvousAffinityFunction());
-
- // Explicitly set number of backups equal to number of grids.
- if (cacheMode() == CacheMode.PARTITIONED)
- cc.setBackups(gridCount());
+ cc.setCacheMode(cacheMode());
+ cc.setAtomicityMode(atomicityMode());
+ cc.setNearConfiguration(nearCacheConfiguration());
+ cc.setWriteSynchronizationMode(FULL_SYNC);
+ cc.setCacheStoreFactory(new StoreFactory());
+ cc.setReadThrough(true);
+ cc.setWriteThrough(true);
+ cc.setLoadPreviousValue(true);
+ cc.setRebalanceMode(SYNC);
+ cc.setSwapEnabled(true);
+ cc.setSqlFunctionClasses(SqlFunctions.class);
+ cc.setIndexedTypes(
+ BadHashKeyObject.class, Byte.class,
+ ObjectValue.class, Long.class,
+ Integer.class, Integer.class,
+ Integer.class, String.class,
+ Integer.class, ObjectValue.class,
+ String.class, ObjectValueOther.class,
+ Integer.class, ArrayObject.class,
+ Key.class, GridCacheQueryTestValue.class,
+ UUID.class, Person.class,
+ IgniteCacheReplicatedQuerySelfTest.CacheKey.class, IgniteCacheReplicatedQuerySelfTest.CacheValue.class
+ );
+
+ if (cacheMode() != CacheMode.LOCAL)
+ cc.setAffinity(new RendezvousAffinityFunction());
+
+ // Explicitly set number of backups equal to number of grids.
+ if (cacheMode() == CacheMode.PARTITIONED)
+ cc.setBackups(gridCount());
+
+ cc.setSnapshotableIndex(snapshotableIndex());
ccs[i] = cc;
}
@@ -198,6 +200,13 @@ public abstract class IgniteCacheAbstractQuerySelfTest extends GridCommonAbstrac
return c;
}
+ /**
+ * @return {@code True} if index snapshot is enabled.
+ */
+ protected boolean snapshotableIndex() {
+ return false;
+ }
+
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
ignite = startGridsMultiThreaded(gridCount());
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteCachePartitionedSnapshotEnabledQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteCachePartitionedSnapshotEnabledQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteCachePartitionedSnapshotEnabledQuerySelfTest.java
new file mode 100644
index 0000000..9a68b16
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/IgniteCachePartitionedSnapshotEnabledQuerySelfTest.java
@@ -0,0 +1,28 @@
+/*
+ * 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.distributed.near;
+
+/**
+ *
+ */
+public class IgniteCachePartitionedSnapshotEnabledQuerySelfTest extends IgniteCachePartitionedQuerySelfTest {
+ /** {@inheritDoc} */
+ @Override protected boolean snapshotableIndex() {
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
index 194fb82..c027b26 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.processors.cache.CacheObjectContext;
import org.apache.ignite.internal.processors.query.GridQueryFieldsResult;
import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor;
import org.apache.ignite.internal.processors.query.GridQueryIndexType;
+import org.apache.ignite.internal.processors.query.GridQueryProperty;
import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -505,6 +506,24 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract
}
/** {@inheritDoc} */
+ @Override public GridQueryProperty property(final String name) {
+ return new GridQueryProperty() {
+ @Override public Object value(Object key, Object val) throws IgniteCheckedException {
+ return TypeDesc.this.value(name, key, val);
+ }
+
+ @Override public String name() {
+ return name;
+ }
+
+ @Override
+ public Class<?> type() {
+ return Object.class;
+ }
+ };
+ }
+
+ /** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public <T> T value(String field, Object key, Object val) throws IgniteSpiException {
assert !F.isEmpty(field);
http://git-wip-us.apache.org/repos/asf/ignite/blob/4af461a7/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
index 6cc2599..0745cd7 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
@@ -55,6 +55,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheP
import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedFieldsQuerySelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQueryP2PDisabledSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedQuerySelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCachePartitionedSnapshotEnabledQuerySelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.IgniteCacheQueryNodeRestartSelfTest2;
import org.apache.ignite.internal.processors.cache.distributed.replicated.IgniteCacheReplicatedFieldsQueryP2PEnabledSelfTest;
@@ -118,6 +119,7 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
suite.addTestSuite(IgniteCacheReplicatedQuerySelfTest.class);
suite.addTestSuite(IgniteCacheReplicatedQueryP2PDisabledSelfTest.class);
suite.addTestSuite(IgniteCachePartitionedQuerySelfTest.class);
+ suite.addTestSuite(IgniteCachePartitionedSnapshotEnabledQuerySelfTest.class);
suite.addTestSuite(IgniteCacheAtomicQuerySelfTest.class);
suite.addTestSuite(IgniteCacheAtomicNearEnabledQuerySelfTest.class);
suite.addTestSuite(IgniteCachePartitionedQueryP2PDisabledSelfTest.class);
[04/11] ignite git commit: IGNITE-1992: [Test failed]
CacheStopAndDestroySelfTest.testLocalClose test fails periodicaly. This
closes #261
Posted by vo...@apache.org.
IGNITE-1992: [Test failed] CacheStopAndDestroySelfTest.testLocalClose test fails periodicaly. This closes #261
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e02edcd3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e02edcd3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e02edcd3
Branch: refs/heads/ignite-1956
Commit: e02edcd36d79f1e107c2ebe5096238f2f2a62a23
Parents: b9e4e03
Author: Andrey Gura <ag...@gridgain.com>
Authored: Wed Nov 25 18:34:42 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Nov 25 18:34:42 2015 +0300
----------------------------------------------------------------------
.../processors/cache/CacheStopAndDestroySelfTest.java | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e02edcd3/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
index 29828af..061a374 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
@@ -30,6 +30,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.NearCacheConfiguration;
import org.apache.ignite.internal.managers.communication.GridIoMessage;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxPrepareRequest;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteInClosure;
@@ -67,9 +68,6 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
/** local cache name. */
protected static String CACHE_NAME_LOC = "cache_local";
- /** */
- private static volatile boolean stop;
-
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
super.beforeTest();
@@ -674,6 +672,10 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
// Local creation after closed.
+ AffinityTopologyVersion topVer = grid(1).context().cache().context().exchange().lastTopologyFuture().get();
+
+ grid(0).context().cache().context().exchange().affinityReadyFuture(topVer).get();
+
grid(0).getOrCreateCache(getLocalConfig());
grid(0).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + "recreated0");
[11/11] ignite git commit: Merge branch 'ignite-1.5' into ignite-1956
Posted by vo...@apache.org.
Merge branch 'ignite-1.5' into ignite-1956
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8dfd7f9b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8dfd7f9b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8dfd7f9b
Branch: refs/heads/ignite-1956
Commit: 8dfd7f9b8e003eeaa21af44fc35b0bcceb86401f
Parents: d44f68d 041cd38
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Thu Nov 26 10:46:40 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Thu Nov 26 10:46:40 2015 +0300
----------------------------------------------------------------------
.../client/router/RouterFactorySelfTest.java | 2 +
.../java/org/apache/ignite/IgniteCache.java | 23 ++
.../configuration/CacheConfiguration.java | 30 +++
.../processors/cache/GridCacheAdapter.java | 156 ++++++++++++-
.../processors/cache/GridCacheProxyImpl.java | 61 +++++
.../processors/cache/IgniteCacheProxy.java | 42 ++++
.../processors/cache/IgniteInternalCache.java | 47 +++-
.../distributed/dht/GridDhtCacheAdapter.java | 7 +-
.../distributed/near/GridNearCacheAdapter.java | 10 +
.../cache/query/GridCacheSqlQuery.java | 42 ++++
.../cache/query/GridCacheTwoStepQuery.java | 35 ++-
.../processors/query/GridQueryProcessor.java | 40 +---
.../processors/query/GridQueryProperty.java | 45 ++++
.../query/GridQueryTypeDescriptor.java | 6 +
.../visor/cache/VisorCacheConfiguration.java | 4 +-
.../cache/VisorCacheTypeFieldMetadata.java | 30 ++-
.../visor/cache/VisorCacheTypeMetadata.java | 133 ++++++++++-
.../ignite/resources/MBeanServerResource.java | 69 ------
.../META-INF/classnames-jdk.properties | 2 +
.../IgniteClientReconnectCacheTest.java | 7 +
.../CacheDeferredDeleteSanitySelfTest.java | 98 ++++++++
.../cache/CacheStopAndDestroySelfTest.java | 8 +-
...eAbstractDataStructuresFailoverSelfTest.java | 3 +
.../IgniteCollectionAbstractTest.java | 3 +
.../multijvm/IgniteCacheProcessProxy.java | 38 ++++
.../ignite/testsuites/IgniteCacheTestSuite.java | 2 +
.../query/h2/GridH2ResultSetIterator.java | 19 +-
.../processors/query/h2/IgniteH2Indexing.java | 227 ++++++++++++++++---
.../query/h2/opt/GridH2RowDescriptor.java | 5 +
.../processors/query/h2/opt/GridH2Table.java | 69 +++++-
.../query/h2/opt/GridH2TreeIndex.java | 98 +++++---
.../query/h2/sql/GridSqlQuerySplitter.java | 73 ++++--
.../processors/query/h2/sql/GridSqlSelect.java | 27 +++
.../query/h2/twostep/GridMapQueryExecutor.java | 17 +-
.../query/h2/twostep/GridMergeIndex.java | 7 +
.../h2/twostep/GridMergeIndexUnsorted.java | 14 ++
.../h2/twostep/GridReduceQueryExecutor.java | 117 +++++++---
.../cache/IgniteCacheAbstractQuerySelfTest.java | 69 +++---
...niteCacheP2pUnmarshallingQueryErrorTest.java | 7 +-
...PartitionedSnapshotEnabledQuerySelfTest.java | 28 +++
.../h2/GridIndexingSpiAbstractSelfTest.java | 19 ++
.../IgniteCacheQuerySelfTestSuite.java | 2 +
.../Services/ServicesExample.cs | 4 +
.../ignite-int-max-values-offheap-config.xml | 89 ++++++++
.../ignite-int-max-values-onheap-config.xml | 84 +++++++
.../ignite-int-max-values-swap-config.xml | 93 ++++++++
.../test-max-int-values-offheap.properties | 70 ++++++
.../test-max-int-values-onheap.properties | 70 ++++++
.../config/test-max-int-values-swap.properties | 69 ++++++
.../yardstick/cache/IntMaxValueEntriesTest.java | 135 +++++++++++
50 files changed, 2046 insertions(+), 309 deletions(-)
----------------------------------------------------------------------
[06/11] ignite git commit: IGNITE-2005: [Test failed] Ignite Java
Client suite fails. This closes #264
Posted by vo...@apache.org.
IGNITE-2005: [Test failed] Ignite Java Client suite fails. This closes #264
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/97270bf3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/97270bf3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/97270bf3
Branch: refs/heads/ignite-1956
Commit: 97270bf3ec5a220f44b21ba6fbaf254a9c0a6c08
Parents: b83f75e
Author: Andrey Gura <ag...@gridgain.com>
Authored: Wed Nov 25 18:56:15 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Nov 25 18:56:15 2015 +0300
----------------------------------------------------------------------
.../ignite/internal/client/router/RouterFactorySelfTest.java | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/97270bf3/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
index d5eee7f..2e9e62a 100644
--- a/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/internal/client/router/RouterFactorySelfTest.java
@@ -105,6 +105,8 @@ public class RouterFactorySelfTest extends GridCommonAbstractTest {
}
finally {
GridRouterFactory.stopAllRouters();
+
+ stopAllGrids();
}
}
}
\ No newline at end of file