You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by yz...@apache.org on 2017/01/16 15:21:27 UTC
[01/12] ignite git commit: updated 'setCollocated' flag documentation
Repository: ignite
Updated Branches:
refs/heads/ignite-comm-balance-master 18229e8a5 -> ecd727c4d
updated 'setCollocated' flag documentation
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1f358db1
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1f358db1
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1f358db1
Branch: refs/heads/ignite-comm-balance-master
Commit: 1f358db1eb3c9a28dd1a66042539796c1ef5ac45
Parents: ff0caf8
Author: Denis Magda <dm...@gridgain.com>
Authored: Wed Jan 11 13:43:39 2017 -0800
Committer: Denis Magda <dm...@gridgain.com>
Committed: Wed Jan 11 13:43:39 2017 -0800
----------------------------------------------------------------------
.../java/org/apache/ignite/cache/query/SqlFieldsQuery.java | 6 ++++++
1 file changed, 6 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/1f358db1/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java
index 9b17e78..eac8cfc 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/query/SqlFieldsQuery.java
@@ -164,6 +164,12 @@ public class SqlFieldsQuery extends Query<List<?>> {
/**
* Sets flag defining if this query is collocated.
*
+ * Collocation flag is used for optimization purposes of queries with GROUP BY statements.
+ * Whenever Ignite executes a distributed query, it sends sub-queries to individual cluster members.
+ * If you know in advance that the elements of your query selection are collocated together on the same node and
+ * you group by collocated key (primary or affinity key), then Ignite can make significant performance and network
+ * optimizations by grouping data on remote nodes.
+ *
* @param collocated Flag value.
* @return {@code this} For chaining.
*/
[09/12] ignite git commit: IGNITE-4514: Hadoop: fixed intermittent
intermittent failure in HadoopCommandLineTest.testHiveCommandLine. This
closes #1397.
Posted by yz...@apache.org.
IGNITE-4514: Hadoop: fixed intermittent intermittent failure in HadoopCommandLineTest.testHiveCommandLine. This closes #1397.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d6d42c2a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d6d42c2a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d6d42c2a
Branch: refs/heads/ignite-comm-balance-master
Commit: d6d42c2a17b7cf53a71d59931b2cf838bd8116c9
Parents: 82dd912
Author: Ivan Veselovskiy <iv...@gridgain.com>
Authored: Mon Jan 16 16:46:20 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Mon Jan 16 16:46:20 2017 +0300
----------------------------------------------------------------------
.../processors/hadoop/impl/v2/HadoopV2TaskContext.java | 7 -------
1 file changed, 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/d6d42c2a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/impl/v2/HadoopV2TaskContext.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/impl/v2/HadoopV2TaskContext.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/impl/v2/HadoopV2TaskContext.java
index d328550..5229590 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/impl/v2/HadoopV2TaskContext.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/impl/v2/HadoopV2TaskContext.java
@@ -42,7 +42,6 @@ import org.apache.hadoop.util.ReflectionUtils;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.hadoop.io.PartiallyRawComparator;
import org.apache.ignite.hadoop.io.TextPartiallyRawComparator;
-import org.apache.ignite.internal.processors.hadoop.HadoopClassLoader;
import org.apache.ignite.internal.processors.hadoop.HadoopCommonUtils;
import org.apache.ignite.internal.processors.hadoop.HadoopExternalSplit;
import org.apache.ignite.internal.processors.hadoop.HadoopInputSplit;
@@ -508,12 +507,6 @@ public class HadoopV2TaskContext extends HadoopTaskContext {
FileSystem fs;
try {
- // This assertion uses .startsWith() instead of .equals() because task class loaders may
- // be reused between tasks of the same job.
- assert ((HadoopClassLoader)getClass().getClassLoader()).name()
- .startsWith(HadoopClassLoader.nameForTask(taskInfo(), true));
-
- // We also cache Fs there, all them will be cleared explicitly upon the Job end.
fs = fileSystemForMrUserWithCaching(jobDir.toUri(), jobConf(), fsMap);
}
catch (IOException e) {
[03/12] ignite git commit: ignite-4293 Do not need store deserialized
value for BinaryMarshaller
Posted by yz...@apache.org.
ignite-4293 Do not need store deserialized value for BinaryMarshaller
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d10946b8
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d10946b8
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d10946b8
Branch: refs/heads/ignite-comm-balance-master
Commit: d10946b8b107dee499a5798a4679ab5d14499764
Parents: abc8b90
Author: Alexandr Kuramshin <ak...@gridgain.com>
Authored: Fri Jan 13 12:26:39 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jan 13 12:26:39 2017 +0300
----------------------------------------------------------------------
.../processors/cacheobject/IgniteCacheObjectProcessorImpl.java | 5 ++---
.../java/org/apache/ignite/cache/store/jdbc/model/Person.java | 2 +-
.../processors/cache/CacheEntryProcessorCopySelfTest.java | 6 ++++--
.../processors/cache/GridCacheBasicStoreAbstractTest.java | 2 +-
.../distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java | 5 +----
5 files changed, 9 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/d10946b8/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
index 208ec62..614c612 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cacheobject/IgniteCacheObjectProcessorImpl.java
@@ -244,9 +244,8 @@ public class IgniteCacheObjectProcessorImpl extends GridProcessorAdapter impleme
CacheMemoryMode memMode = ccfg.getMemoryMode();
- boolean storeVal = ctx.config().isPeerClassLoadingEnabled() ||
- GridQueryProcessor.isEnabled(ccfg) ||
- !ccfg.isCopyOnRead();
+ boolean storeVal = !ccfg.isCopyOnRead() || (!isBinaryEnabled(ccfg) &&
+ (GridQueryProcessor.isEnabled(ccfg) || ctx.config().isPeerClassLoadingEnabled()));
CacheObjectContext res = new CacheObjectContext(ctx,
ccfg.getName(),
http://git-wip-us.apache.org/repos/asf/ignite/blob/d10946b8/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/model/Person.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/model/Person.java b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/model/Person.java
index ddf309b..52ddfc8 100644
--- a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/model/Person.java
+++ b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/model/Person.java
@@ -196,7 +196,7 @@ public class Person implements Serializable {
@Override public String toString() {
return "Person [id=" + id +
", orgId=" + orgId +
- ", birthday=" + birthday.getTime() +
+ ", birthday=" + (birthday == null ? null : birthday.getTime()) +
", name=" + name +
"]";
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d10946b8/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheEntryProcessorCopySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheEntryProcessorCopySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheEntryProcessorCopySelfTest.java
index 21395e6..f44889b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheEntryProcessorCopySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheEntryProcessorCopySelfTest.java
@@ -30,6 +30,7 @@ import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheEntryProcessor;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
@@ -93,8 +94,9 @@ public class CacheEntryProcessorCopySelfTest extends GridCommonAbstractTest {
doTest(true, false, OLD_VAL, 1);
// One deserialization due to copyOnRead == true.
- // Additional deserialization in case p2p enabled due to storeValue == true on update entry.
- doTest(true, true, NEW_VAL, p2pEnabled ? 2 : 1);
+ // Additional deserialization in case p2p enabled and not BinaryMarshaller due to storeValue == true on update entry.
+ doTest(true, true, NEW_VAL, p2pEnabled &&
+ !(grid.configuration().getMarshaller() instanceof BinaryMarshaller) ? 2 : 1);
// No deserialization.
doTest(false, false, NEW_VAL, 0);
http://git-wip-us.apache.org/repos/asf/ignite/blob/d10946b8/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheBasicStoreAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheBasicStoreAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheBasicStoreAbstractTest.java
index 8ddd737..026b618 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheBasicStoreAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheBasicStoreAbstractTest.java
@@ -571,7 +571,7 @@ public abstract class GridCacheBasicStoreAbstractTest extends GridCommonAbstract
assert cached != null;
- assert cached == val : "Cached value mismatch [expected=" + val + ", cached=" + cached + ']';
+ assert cached.equals(val) : "Cached value mismatch [expected=" + val + ", cached=" + cached + ']';
// Make sure that value is coming from cache, not from store.
checkLastMethod(null);
http://git-wip-us.apache.org/repos/asf/ignite/blob/d10946b8/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java
index 3f3f84f..e8a6cfb 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCacheDhtEvictionsDisabledSelfTest.java
@@ -117,10 +117,7 @@ public class GridCacheDhtEvictionsDisabledSelfTest extends GridCommonAbstractTes
assertNotNull(v1);
assertNotNull(v2);
- if (affinity(cache).mapKeyToNode(key).isLocal())
- assertSame(v1, v2);
- else
- assertEquals(v1, v2);
+ assertEquals(v1, v2);
}
}
}
\ No newline at end of file
[06/12] ignite git commit: IGNITE-4518 Fixed parallel load of cache.
- Fixes #1426.
Posted by yz...@apache.org.
IGNITE-4518 Fixed parallel load of cache. - Fixes #1426.
Signed-off-by: Andrey Novikov <an...@gridgain.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/79401b2e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/79401b2e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/79401b2e
Branch: refs/heads/ignite-comm-balance-master
Commit: 79401b2ebf814eeffa36d41a82d1238d8eccc7e9
Parents: 6045a24
Author: Andrey Novikov <an...@gridgain.com>
Authored: Mon Jan 16 10:33:16 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Mon Jan 16 10:33:16 2017 +0700
----------------------------------------------------------------------
.../store/jdbc/dialect/BasicJdbcDialect.java | 31 ++++++++-----
.../store/jdbc/CacheJdbcPojoStoreTest.java | 48 +++++++++++++++++++-
2 files changed, 66 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/79401b2e/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/dialect/BasicJdbcDialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/dialect/BasicJdbcDialect.java b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/dialect/BasicJdbcDialect.java
index 3ab112a..139f3fc 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/dialect/BasicJdbcDialect.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/dialect/BasicJdbcDialect.java
@@ -173,13 +173,15 @@ public class BasicJdbcDialect implements JdbcDialect {
if (appendLowerBound) {
sb.a("(");
- for (int cnt = keyCols.size(); cnt > 0; cnt--) {
- for (int j = 0; j < cnt; j++)
- if (j == cnt - 1)
- sb.a(cols[j]).a(" > ? ");
+ for (int keyCnt = keyCols.size(); keyCnt > 0; keyCnt--) {
+ for (int idx = 0; idx < keyCnt; idx++) {
+ if (idx == keyCnt - 1)
+ sb.a(cols[idx]).a(" > ? ");
else
- sb.a(cols[j]).a(" = ? AND ");
- if (cnt != 1)
+ sb.a(cols[idx]).a(" = ? AND ");
+ }
+
+ if (keyCnt != 1)
sb.a("OR ");
}
@@ -192,13 +194,18 @@ public class BasicJdbcDialect implements JdbcDialect {
if (appendUpperBound) {
sb.a("(");
- for (int cnt = keyCols.size(); cnt > 0; cnt--) {
- for (int j = 0; j < cnt; j++)
- if (j == cnt - 1)
- sb.a(cols[j]).a(" <= ? ");
+ for (int keyCnt = keyCols.size(); keyCnt > 0; keyCnt--) {
+ for (int idx = 0, lastIdx = keyCnt - 1; idx < keyCnt; idx++) {
+ sb.a(cols[idx]);
+
+ // For composite key when not all of the key columns are constrained should use < (strictly less).
+ if (idx == lastIdx)
+ sb.a(keyCnt == keyCols.size() ? " <= ? " : " < ? ");
else
- sb.a(cols[j]).a(" = ? AND ");
- if (cnt != 1)
+ sb.a(" = ? AND ");
+ }
+
+ if (keyCnt != 1)
sb.a(" OR ");
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/79401b2e/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
index d8f75d3..4a0b1da 100644
--- a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java
@@ -216,7 +216,7 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS " +
"Person_Complex (id integer not null, org_id integer not null, city_id integer not null, " +
- "name varchar(50), salary integer, PRIMARY KEY(id))");
+ "name varchar(50), salary integer, PRIMARY KEY(id, org_id, city_id))");
conn.commit();
@@ -352,6 +352,52 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache
/**
* @throws Exception If failed.
*/
+ public void testParallelLoad() throws Exception {
+ Connection conn = store.openConnection(false);
+
+ PreparedStatement prnComplexStmt = conn.prepareStatement("INSERT INTO Person_Complex(id, org_id, city_id, name, salary) VALUES (?, ?, ?, ?, ?)");
+
+ for (int i = 0; i < 8; i++) {
+
+ prnComplexStmt.setInt(1, (i >> 2) & 1);
+ prnComplexStmt.setInt(2, (i >> 1) & 1);
+ prnComplexStmt.setInt(3, i % 2);
+
+ prnComplexStmt.setString(4, "name");
+ prnComplexStmt.setInt(5, 1000 + i * 500);
+
+ prnComplexStmt.addBatch();
+ }
+
+ prnComplexStmt.executeBatch();
+
+ U.closeQuiet(prnComplexStmt);
+
+ conn.commit();
+
+ U.closeQuiet(conn);
+
+ final Collection<PersonComplexKey> prnComplexKeys = new ConcurrentLinkedQueue<>();
+
+ IgniteBiInClosure<Object, Object> c = new CI2<Object, Object>() {
+ @Override public void apply(Object k, Object v) {
+ if (k instanceof PersonComplexKey && v instanceof Person)
+ prnComplexKeys.add((PersonComplexKey)k);
+ else
+ fail("Unexpected entry [key=" + k + ", value=" + v + "]");
+ }
+ };
+
+ store.setParallelLoadCacheMinimumThreshold(2);
+
+ store.loadCache(c);
+
+ assertEquals(8, prnComplexKeys.size());
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
public void testWriteRetry() throws Exception {
CacheJdbcPojoStore<Object, Object> store = store();
[05/12] ignite git commit: Added more metrics to Flume IgniteSink.
Posted by yz...@apache.org.
Added more metrics to Flume IgniteSink.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6045a246
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6045a246
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6045a246
Branch: refs/heads/ignite-comm-balance-master
Commit: 6045a2469a4d2e23cad918b44e002c7de237abcb
Parents: e304b48
Author: shroman <rs...@yahoo.com>
Authored: Sat Jan 14 21:14:34 2017 +0900
Committer: shroman <rs...@yahoo.com>
Committed: Sat Jan 14 21:14:34 2017 +0900
----------------------------------------------------------------------
.../main/java/org/apache/ignite/stream/flume/IgniteSink.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/6045a246/modules/flume/src/main/java/org/apache/ignite/stream/flume/IgniteSink.java
----------------------------------------------------------------------
diff --git a/modules/flume/src/main/java/org/apache/ignite/stream/flume/IgniteSink.java b/modules/flume/src/main/java/org/apache/ignite/stream/flume/IgniteSink.java
index e6e7e90..083e833 100644
--- a/modules/flume/src/main/java/org/apache/ignite/stream/flume/IgniteSink.java
+++ b/modules/flume/src/main/java/org/apache/ignite/stream/flume/IgniteSink.java
@@ -85,7 +85,7 @@ public class IgniteSink extends AbstractSink implements Configurable {
}
/**
- * Starts a grid and initializes na event transformer.
+ * Starts a grid and initializes an event transformer.
*/
@SuppressWarnings("unchecked")
@Override synchronized public void start() {
@@ -109,9 +109,13 @@ public class IgniteSink extends AbstractSink implements Configurable {
catch (Exception e) {
log.error("Failed to start grid", e);
+ sinkCounter.incrementConnectionFailedCount();
+
throw new FlumeException("Failed to start grid", e);
}
+ sinkCounter.incrementConnectionCreatedCount();
+
super.start();
}
@@ -122,6 +126,7 @@ public class IgniteSink extends AbstractSink implements Configurable {
if (ignite != null)
ignite.close();
+ sinkCounter.incrementConnectionClosedCount();
sinkCounter.stop();
super.stop();
[07/12] ignite git commit: IGNITE-4545 Added cache for router
hostnames. - Fixes #1428.
Posted by yz...@apache.org.
IGNITE-4545 Added cache for router hostnames. - Fixes #1428.
Signed-off-by: Andrey Novikov <an...@gridgain.com>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/27ba69b5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/27ba69b5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/27ba69b5
Branch: refs/heads/ignite-comm-balance-master
Commit: 27ba69b55f645a022f2e84cc4db76309b02850e3
Parents: 79401b2
Author: Andrey Novikov <an...@gridgain.com>
Authored: Mon Jan 16 11:22:34 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Mon Jan 16 11:22:34 2017 +0700
----------------------------------------------------------------------
.../GridClientConnectionManagerAdapter.java | 7 ++-
.../impl/connection/GridClientTopology.java | 53 ++++++++++++++++----
2 files changed, 49 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/27ba69b5/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
index 12baee0..f714e7a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnectionManagerAdapter.java
@@ -85,6 +85,9 @@ public abstract class GridClientConnectionManagerAdapter implements GridClientCo
/** Class logger. */
private final Logger log;
+ /** All local enabled MACs. */
+ private final Collection<String> macs;
+
/** NIO server. */
private GridNioServer srv;
@@ -166,6 +169,8 @@ public abstract class GridClientConnectionManagerAdapter implements GridClientCo
if (marshId == null && cfg.getMarshaller() == null)
throw new GridClientException("Failed to start client (marshaller is not configured).");
+ macs = U.allLocalMACs();
+
if (cfg.getProtocol() == GridClientProtocol.TCP) {
try {
IgniteLogger gridLog = new JavaLogger(false);
@@ -316,7 +321,7 @@ public abstract class GridClientConnectionManagerAdapter implements GridClientCo
}
boolean sameHost = node.attributes().isEmpty() ||
- F.containsAny(U.allLocalMACs(), node.attribute(ATTR_MACS).toString().split(", "));
+ F.containsAny(macs, node.attribute(ATTR_MACS).toString().split(", "));
Collection<InetSocketAddress> srvs = new LinkedHashSet<>();
http://git-wip-us.apache.org/repos/asf/ignite/blob/27ba69b5/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
index effd5b3..97aa586 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientTopology.java
@@ -21,7 +21,6 @@ import java.net.InetSocketAddress;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Set;
@@ -61,12 +60,18 @@ public class GridClientTopology {
/** Cached last error prevented topology from update. */
private GridClientException lastError;
+ /** Router addresses from configuration. */
+ private final String routers;
+
/**
* Set of router addresses to infer direct connectivity
* when client is working in router connection mode.
* {@code null} when client is working in direct connection node.
*/
- private final Set<String> routerAddrs;
+ private final Set<InetSocketAddress> routerAddrs;
+
+ /** List of all known local MACs */
+ private final Collection<String> macsCache;
/** Protocol. */
private final GridClientProtocol prot;
@@ -96,8 +101,38 @@ public class GridClientTopology {
metricsCache = cfg.isEnableMetricsCache();
attrCache = cfg.isEnableAttributesCache();
prot = cfg.getProtocol();
- routerAddrs = (!cfg.getRouters().isEmpty() && cfg.getServers().isEmpty()) ?
- new HashSet<>(cfg.getRouters()) : null;
+
+ if (!cfg.getRouters().isEmpty() && cfg.getServers().isEmpty()) {
+ routers = cfg.getRouters().toString();
+
+ routerAddrs = U.newHashSet(cfg.getRouters().size());
+
+ for (String router : cfg.getRouters()) {
+ int portIdx = router.lastIndexOf(":");
+
+ if (portIdx > 0) {
+ String hostName = router.substring(0, portIdx);
+
+ try {
+ int port = Integer.parseInt(router.substring(portIdx + 1));
+
+ InetSocketAddress inetSockAddr = new InetSocketAddress(hostName, port);
+
+ routerAddrs.add(inetSockAddr);
+ }
+ catch (Exception ignore) {
+ // No-op.
+ }
+ }
+ }
+ }
+ else {
+ routers = null;
+
+ routerAddrs = Collections.emptySet();
+ }
+
+ macsCache = U.allLocalMACs();
}
/**
@@ -279,7 +314,7 @@ public class GridClientTopology {
try {
if (lastError != null)
throw new GridClientDisconnectedException(
- "Topology is failed [protocol=" + prot + ", routers=" + routerAddrs + ']', lastError);
+ "Topology is failed [protocol=" + prot + ", routers=" + routers + ']', lastError);
else
return nodes.get(id);
}
@@ -376,19 +411,17 @@ public class GridClientTopology {
(metricsCache && attrCache) || (node.attributes().isEmpty() && node.metrics() == null);
// Try to bypass object copying.
- if (noAttrsAndMetrics && routerAddrs == null && node.connectable())
+ if (noAttrsAndMetrics && routerAddrs.isEmpty() && node.connectable())
return node;
// Return a new node instance based on the original one.
GridClientNodeImpl.Builder nodeBuilder = GridClientNodeImpl.builder(node, !attrCache, !metricsCache);
for (InetSocketAddress addr : node.availableAddresses(prot, true)) {
- boolean router = routerAddrs == null ||
- routerAddrs.contains(addr.getHostName() + ":" + addr.getPort()) ||
- routerAddrs.contains(addr.getAddress().getHostAddress() + ":" + addr.getPort());
+ boolean router = routerAddrs.isEmpty() || routerAddrs.contains(addr);
boolean reachable = noAttrsAndMetrics || !addr.getAddress().isLoopbackAddress() ||
- F.containsAny(U.allLocalMACs(), node.attribute(ATTR_MACS).toString().split(", "));
+ F.containsAny(macsCache, node.<String>attribute(ATTR_MACS).split(", "));
if (router && reachable) {
nodeBuilder.connectable(true);
[11/12] ignite git commit: IGNITE-4045 .NET: Support DML API
Posted by yz...@apache.org.
IGNITE-4045 .NET: Support DML API
This closes #1309
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b7908d7a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b7908d7a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b7908d7a
Branch: refs/heads/ignite-comm-balance-master
Commit: b7908d7a65f07615f2ff183e107c5002658bd511
Parents: d6d42c2
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Mon Jan 16 17:48:08 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Mon Jan 16 17:48:08 2017 +0300
----------------------------------------------------------------------
.../utils/PlatformConfigurationUtils.java | 128 +++++++-
.../Apache.Ignite.Core.Tests.csproj | 3 +
.../Binary/BinaryBuilderSelfTest.cs | 159 ++++++----
.../BinaryBuilderSelfTestArrayIdentity.cs | 34 +++
.../Binary/BinaryEqualityComparerTest.cs | 279 +++++++++++++++++
.../Binary/IO/BinaryStreamsTest.cs | 19 ++
.../Cache/CacheConfigurationTest.cs | 5 +-
.../Cache/Query/CacheDmlQueriesTest.cs | 296 +++++++++++++++++++
.../IgniteConfigurationSerializerTest.cs | 46 ++-
.../IgniteConfigurationTest.cs | 28 ++
.../Apache.Ignite.Core.csproj | 4 +
.../Binary/BinaryArrayEqualityComparer.cs | 149 ++++++++++
.../Binary/BinaryConfiguration.cs | 24 ++
.../Binary/BinaryTypeConfiguration.cs | 14 +
.../Cache/Configuration/QueryEntity.cs | 33 ++-
.../Cache/Configuration/QueryField.cs | 6 +
.../Apache.Ignite.Core/IgniteConfiguration.cs | 85 ++++--
.../IgniteConfigurationSection.xsd | 19 ++
.../Apache.Ignite.Core/Impl/Binary/Binary.cs | 28 +-
.../Binary/BinaryEqualityComparerSerializer.cs | 99 +++++++
.../Impl/Binary/BinaryFieldEqualityComparer.cs | 138 +++++++++
.../Impl/Binary/BinaryFullTypeDescriptor.cs | 21 +-
.../Impl/Binary/BinaryObject.cs | 31 +-
.../Impl/Binary/BinaryObjectBuilder.cs | 62 +++-
.../Impl/Binary/BinaryObjectHeader.cs | 21 +-
.../Impl/Binary/BinaryObjectSchemaHolder.cs | 22 ++
.../Binary/BinarySurrogateTypeDescriptor.cs | 6 +
.../Impl/Binary/BinarySystemHandlers.cs | 6 +-
.../Impl/Binary/BinaryWriter.cs | 11 +-
.../Impl/Binary/DateTimeHolder.cs | 15 +-
.../Impl/Binary/IBinaryEqualityComparer.cs | 53 ++++
.../Impl/Binary/IBinaryTypeDescriptor.cs | 5 +
.../Impl/Binary/Io/BinaryHeapStream.cs | 9 +
.../Impl/Binary/Io/BinaryStreamBase.cs | 13 +
.../Impl/Binary/Io/IBinaryStream.cs | 25 ++
.../Impl/Binary/Marshaller.cs | 22 +-
.../Impl/Binary/SerializableObjectHolder.cs | 16 +
.../Common/IgniteConfigurationXmlSerializer.cs | 5 +-
.../Impl/Memory/PlatformMemoryStream.cs | 16 +
39 files changed, 1803 insertions(+), 152 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
index f845675..c0fde97 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformConfigurationUtils.java
@@ -17,8 +17,12 @@
package org.apache.ignite.internal.processors.platform.utils;
+import org.apache.ignite.binary.BinaryArrayIdentityResolver;
+import org.apache.ignite.binary.BinaryFieldIdentityResolver;
+import org.apache.ignite.binary.BinaryIdentityResolver;
import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.binary.BinaryRawWriter;
+import org.apache.ignite.binary.BinaryTypeConfiguration;
import org.apache.ignite.cache.CacheAtomicWriteOrderMode;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMemoryMode;
@@ -68,6 +72,8 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.HashSet;
/**
* Configuration utils.
@@ -428,14 +434,25 @@ public class PlatformConfigurationUtils {
// Fields
int cnt = in.readInt();
+ Set<String> keyFields = new HashSet<>(cnt);
if (cnt > 0) {
LinkedHashMap<String, String> fields = new LinkedHashMap<>(cnt);
- for (int i = 0; i < cnt; i++)
- fields.put(in.readString(), in.readString());
+ for (int i = 0; i < cnt; i++) {
+ String fieldName = in.readString();
+ String fieldType = in.readString();
+
+ fields.put(fieldName, fieldType);
+
+ if (in.readBoolean())
+ keyFields.add(fieldName);
+ }
res.setFields(fields);
+
+ if (!keyFields.isEmpty())
+ res.setKeyFields(keyFields);
}
// Aliases
@@ -539,11 +556,29 @@ public class PlatformConfigurationUtils {
cfg.setCommunicationSpi(comm);
}
- if (in.readBoolean()) {
+ if (in.readBoolean()) { // binary config is present
if (cfg.getBinaryConfiguration() == null)
cfg.setBinaryConfiguration(new BinaryConfiguration());
- cfg.getBinaryConfiguration().setCompactFooter(in.readBoolean());
+ if (in.readBoolean()) // compact footer is set
+ cfg.getBinaryConfiguration().setCompactFooter(in.readBoolean());
+
+ int typeCnt = in.readInt();
+
+ if (typeCnt > 0) {
+ Collection<BinaryTypeConfiguration> types = new ArrayList<>(typeCnt);
+
+ for (int i = 0; i < typeCnt; i++) {
+ BinaryTypeConfiguration type = new BinaryTypeConfiguration(in.readString());
+
+ type.setEnum(in.readBoolean());
+ type.setIdentityResolver(readBinaryIdentityResolver(in));
+
+ types.add(type);
+ }
+
+ cfg.getBinaryConfiguration().setTypeConfigurations(types);
+ }
}
int attrCnt = in.readInt();
@@ -812,11 +847,14 @@ public class PlatformConfigurationUtils {
LinkedHashMap<String, String> fields = queryEntity.getFields();
if (fields != null) {
+ Set<String> keyFields = queryEntity.getKeyFields();
+
writer.writeInt(fields.size());
for (Map.Entry<String, String> field : fields.entrySet()) {
writer.writeString(field.getKey());
writer.writeString(field.getValue());
+ writer.writeBoolean(keyFields != null && keyFields.contains(field.getKey()));
}
}
else
@@ -941,11 +979,29 @@ public class PlatformConfigurationUtils {
w.writeBoolean(false);
BinaryConfiguration bc = cfg.getBinaryConfiguration();
- w.writeBoolean(bc != null);
- if (bc != null)
+ if (bc != null) {
+ w.writeBoolean(true); // binary config exists
+ w.writeBoolean(true); // compact footer is set
w.writeBoolean(bc.isCompactFooter());
+ Collection<BinaryTypeConfiguration> types = bc.getTypeConfigurations();
+
+ if (types != null) {
+ w.writeInt(types.size());
+
+ for (BinaryTypeConfiguration type : types) {
+ w.writeString(type.getTypeName());
+ w.writeBoolean(type.isEnum());
+ writeBinaryIdentityResolver(w, type.getIdentityResolver());
+ }
+ }
+ else
+ w.writeInt(0);
+ }
+ else
+ w.writeBoolean(false);
+
Map<String, ?> attrs = cfg.getUserAttributes();
if (attrs != null) {
@@ -1117,6 +1173,66 @@ public class PlatformConfigurationUtils {
}
/**
+ * Reads resolver
+ *
+ * @param r Reader.
+ * @return Resolver.
+ */
+ private static BinaryIdentityResolver readBinaryIdentityResolver(BinaryRawReader r) {
+ int type = r.readByte();
+
+ switch (type) {
+ case 0:
+ return null;
+
+ case 1:
+ return new BinaryArrayIdentityResolver();
+
+ case 2:
+ int cnt = r.readInt();
+
+ String[] fields = new String[cnt];
+
+ for (int i = 0; i < cnt; i++)
+ fields[i] = r.readString();
+
+ return new BinaryFieldIdentityResolver().setFieldNames(fields);
+
+ default:
+ assert false;
+ return null;
+ }
+ }
+
+ /**
+ * Writes the resolver.
+ *
+ * @param w Writer.
+ * @param resolver Resolver.
+ */
+ private static void writeBinaryIdentityResolver(BinaryRawWriter w, BinaryIdentityResolver resolver) {
+ if (resolver instanceof BinaryArrayIdentityResolver)
+ w.writeByte((byte)1);
+ else if (resolver instanceof BinaryFieldIdentityResolver) {
+ w.writeByte((byte)2);
+
+ String[] fields = ((BinaryFieldIdentityResolver)resolver).getFieldNames();
+
+ if (fields != null) {
+ w.writeInt(fields.length);
+
+ for (String field : fields)
+ w.writeString(field);
+ }
+ else
+ w.writeInt(0);
+ }
+ else {
+ w.writeByte((byte)0);
+ }
+ }
+
+ /**
* Private constructor.
*/
private PlatformConfigurationUtils() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index 78a08d2..e09c682 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -67,6 +67,8 @@
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Binary\BinaryBuilderSelfTestArrayIdentity.cs" />
+ <Compile Include="Binary\BinaryEqualityComparerTest.cs" />
<Compile Include="Binary\BinaryReaderWriterTest.cs" />
<Compile Include="Binary\IO\BinaryStreamsTest.cs" />
<Compile Include="Binary\JavaTypeMappingTest.cs" />
@@ -76,6 +78,7 @@
<Compile Include="Cache\CacheMetricsTest.cs" />
<Compile Include="Cache\CacheResultTest.cs" />
<Compile Include="Cache\CacheSwapSpaceTest.cs" />
+ <Compile Include="Cache\Query\CacheDmlQueriesTest.cs" />
<Compile Include="Cache\CacheAbstractTransactionalTest.cs" />
<Compile Include="Cache\Store\CacheStoreAdapterTest.cs" />
<Compile Include="Collections\MultiValueDictionaryTest.cs" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
index c280255..d6551b5 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTest.cs
@@ -58,33 +58,57 @@ namespace Apache.Ignite.Core.Tests.Binary
{
TypeConfigurations = new List<BinaryTypeConfiguration>
{
- new BinaryTypeConfiguration(typeof (Empty)),
- new BinaryTypeConfiguration(typeof (Primitives)),
- new BinaryTypeConfiguration(typeof (PrimitiveArrays)),
- new BinaryTypeConfiguration(typeof (StringDateGuidEnum)),
- new BinaryTypeConfiguration(typeof (WithRaw)),
- new BinaryTypeConfiguration(typeof (MetaOverwrite)),
- new BinaryTypeConfiguration(typeof (NestedOuter)),
- new BinaryTypeConfiguration(typeof (NestedInner)),
- new BinaryTypeConfiguration(typeof (MigrationOuter)),
- new BinaryTypeConfiguration(typeof (MigrationInner)),
- new BinaryTypeConfiguration(typeof (InversionOuter)),
- new BinaryTypeConfiguration(typeof (InversionInner)),
- new BinaryTypeConfiguration(typeof (CompositeOuter)),
- new BinaryTypeConfiguration(typeof (CompositeInner)),
- new BinaryTypeConfiguration(typeof (CompositeArray)),
- new BinaryTypeConfiguration(typeof (CompositeContainer)),
- new BinaryTypeConfiguration(typeof (ToBinary)),
- new BinaryTypeConfiguration(typeof (Remove)),
- new BinaryTypeConfiguration(typeof (RemoveInner)),
- new BinaryTypeConfiguration(typeof (BuilderInBuilderOuter)),
- new BinaryTypeConfiguration(typeof (BuilderInBuilderInner)),
- new BinaryTypeConfiguration(typeof (BuilderCollection)),
- new BinaryTypeConfiguration(typeof (BuilderCollectionItem)),
- new BinaryTypeConfiguration(typeof (DecimalHolder)),
- new BinaryTypeConfiguration(TypeEmpty),
- new BinaryTypeConfiguration(typeof(TestEnumRegistered)),
+ new BinaryTypeConfiguration(typeof(Empty)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(Primitives)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(PrimitiveArrays)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(StringDateGuidEnum))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(WithRaw)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(MetaOverwrite)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(NestedOuter)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(NestedInner)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(MigrationOuter)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(MigrationInner)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(InversionOuter)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(InversionInner)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(CompositeOuter)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(CompositeInner)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(CompositeArray)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(CompositeContainer))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(ToBinary)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(Remove)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(RemoveInner)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(BuilderInBuilderOuter))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(BuilderInBuilderInner))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(BuilderCollection))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(BuilderCollectionItem))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
+ new BinaryTypeConfiguration(typeof(DecimalHolder)) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(TypeEmpty) {EqualityComparer = GetIdentityResolver()},
+ new BinaryTypeConfiguration(typeof(TestEnumRegistered))
+ {
+ EqualityComparer = GetIdentityResolver()
+ },
new BinaryTypeConfiguration(typeof(NameMapperTestType))
+ {
+ EqualityComparer = GetIdentityResolver()
+ }
},
DefaultIdMapper = new IdMapper(),
DefaultNameMapper = new NameMapper(),
@@ -106,6 +130,14 @@ namespace Apache.Ignite.Core.Tests.Binary
}
/// <summary>
+ /// Gets the identity resolver.
+ /// </summary>
+ protected virtual IEqualityComparer<IBinaryObject> GetIdentityResolver()
+ {
+ return null;
+ }
+
+ /// <summary>
/// Tear down routine.
/// </summary>
[TestFixtureTearDown]
@@ -535,7 +567,7 @@ namespace Apache.Ignite.Core.Tests.Binary
IBinaryObject binObj = _grid.GetBinary().GetBuilder(typeof(Empty)).Build();
Assert.IsNotNull(binObj);
- Assert.AreEqual(0, binObj.GetHashCode());
+ Assert.AreEqual(GetIdentityResolver() == null ? 0 : 1, binObj.GetHashCode());
IBinaryType meta = binObj.GetBinaryType();
@@ -557,7 +589,7 @@ namespace Apache.Ignite.Core.Tests.Binary
IBinaryObject binObj = _grid.GetBinary().GetBuilder(TypeEmpty).Build();
Assert.IsNotNull(binObj);
- Assert.AreEqual(0, binObj.GetHashCode());
+ Assert.AreEqual(GetIdentityResolver() == null ? 0 : 1, binObj.GetHashCode());
IBinaryType meta = binObj.GetBinaryType();
@@ -602,7 +634,9 @@ namespace Apache.Ignite.Core.Tests.Binary
var obj2 = bin.GetBuilder("myType").SetStringField("str", "foo").SetIntField("int", 1).Build();
Assert.AreEqual(obj1, obj2);
- Assert.AreEqual(obj1.GetHashCode(), obj2.GetHashCode());
+
+ Assert.AreEqual(0, obj1.GetHashCode());
+ Assert.AreEqual(0, obj2.GetHashCode());
Assert.IsTrue(Regex.IsMatch(obj1.ToString(), @"myType \[idHash=[0-9]+, str=foo, int=1\]"));
}
@@ -630,7 +664,7 @@ namespace Apache.Ignite.Core.Tests.Binary
CheckPrimitiveFields1(binObj);
// Specific setter methods.
- binObj = _grid.GetBinary().GetBuilder(typeof(Primitives))
+ var binObj2 = _grid.GetBinary().GetBuilder(typeof(Primitives))
.SetByteField("fByte", 1)
.SetBooleanField("fBool", true)
.SetShortField("fShort", 2)
@@ -643,7 +677,11 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetHashCode(100)
.Build();
- CheckPrimitiveFields1(binObj);
+ CheckPrimitiveFields1(binObj2);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
// Overwrite with generic methods.
binObj = binObj.ToBuilder()
@@ -656,13 +694,12 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetField<float>("fFloat", 11)
.SetField<double>("fDouble", 12)
.SetField("fDecimal", 13.13m)
- .SetHashCode(200)
.Build();
CheckPrimitiveFields2(binObj);
// Overwrite with specific methods.
- binObj = binObj.ToBuilder()
+ binObj2 = binObj.ToBuilder()
.SetByteField("fByte", 7)
.SetBooleanField("fBool", false)
.SetShortField("fShort", 8)
@@ -672,10 +709,13 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetFloatField("fFloat", 11)
.SetDoubleField("fDouble", 12)
.SetDecimalField("fDecimal", 13.13m)
- .SetHashCode(200)
.Build();
CheckPrimitiveFields2(binObj);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
}
/// <summary>
@@ -729,8 +769,6 @@ namespace Apache.Ignite.Core.Tests.Binary
/// </summary>
private static void CheckPrimitiveFields2(IBinaryObject binObj)
{
- Assert.AreEqual(200, binObj.GetHashCode());
-
Assert.AreEqual(7, binObj.GetField<byte>("fByte"));
Assert.AreEqual(false, binObj.GetField<bool>("fBool"));
Assert.AreEqual(8, binObj.GetField<short>("fShort"));
@@ -777,7 +815,7 @@ namespace Apache.Ignite.Core.Tests.Binary
CheckPrimitiveArrayFields1(binObj);
// Specific setters.
- binObj = _grid.GetBinary().GetBuilder(typeof(PrimitiveArrays))
+ var binObj2 = _grid.GetBinary().GetBuilder(typeof(PrimitiveArrays))
.SetByteArrayField("fByte", new byte[] {1})
.SetBooleanArrayField("fBool", new[] {true})
.SetShortArrayField("fShort", new short[] {2})
@@ -789,7 +827,13 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetDecimalArrayField("fDecimal", new decimal?[] {7.7m})
.SetHashCode(100)
.Build();
-
+
+ CheckPrimitiveArrayFields1(binObj2);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
+
// Overwrite with generic setter.
binObj = _grid.GetBinary().GetBuilder(binObj)
.SetField("fByte", new byte[] { 7 })
@@ -801,13 +845,12 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetField("fFloat", new float[] { 11 })
.SetField("fDouble", new double[] { 12 })
.SetField("fDecimal", new decimal?[] { 13.13m })
- .SetHashCode(200)
.Build();
CheckPrimitiveArrayFields2(binObj);
// Overwrite with specific setters.
- binObj = _grid.GetBinary().GetBuilder(binObj)
+ binObj2 = _grid.GetBinary().GetBuilder(binObj)
.SetByteArrayField("fByte", new byte[] { 7 })
.SetBooleanArrayField("fBool", new[] { false })
.SetShortArrayField("fShort", new short[] { 8 })
@@ -817,10 +860,13 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetFloatArrayField("fFloat", new float[] { 11 })
.SetDoubleArrayField("fDouble", new double[] { 12 })
.SetDecimalArrayField("fDecimal", new decimal?[] { 13.13m })
- .SetHashCode(200)
.Build();
CheckPrimitiveArrayFields2(binObj);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
}
/// <summary>
@@ -874,8 +920,6 @@ namespace Apache.Ignite.Core.Tests.Binary
/// </summary>
private static void CheckPrimitiveArrayFields2(IBinaryObject binObj)
{
- Assert.AreEqual(200, binObj.GetHashCode());
-
Assert.AreEqual(new byte[] { 7 }, binObj.GetField<byte[]>("fByte"));
Assert.AreEqual(new[] { false }, binObj.GetField<bool[]>("fBool"));
Assert.AreEqual(new short[] { 8 }, binObj.GetField<short[]>("fShort"));
@@ -910,7 +954,7 @@ namespace Apache.Ignite.Core.Tests.Binary
Guid? nGuid = Guid.NewGuid();
// Generic setters.
- IBinaryObject binObj = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
+ var binObj = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
.SetField("fStr", "str")
.SetField("fNDate", nDate)
.SetTimestampField("fNTimestamp", nDate)
@@ -927,7 +971,7 @@ namespace Apache.Ignite.Core.Tests.Binary
CheckStringDateGuidEnum1(binObj, nDate, nGuid);
// Specific setters.
- binObj = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
+ var binObj2 = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
.SetStringField("fStr", "str")
.SetField("fNDate", nDate)
.SetTimestampField("fNTimestamp", nDate)
@@ -941,7 +985,11 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetHashCode(100)
.Build();
- CheckStringDateGuidEnum1(binObj, nDate, nGuid);
+ CheckStringDateGuidEnum1(binObj2, nDate, nGuid);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
// Overwrite.
nDate = DateTime.Now.ToUniversalTime();
@@ -958,13 +1006,12 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetTimestampArrayField("fTimestampArr", new[] { nDate })
.SetField("fGuidArr", new[] { nGuid })
.SetField("fEnumArr", new[] { TestEnum.Two })
- .SetHashCode(200)
.Build();
CheckStringDateGuidEnum2(binObj, nDate, nGuid);
// Overwrite with specific setters
- binObj = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
+ binObj2 = _grid.GetBinary().GetBuilder(typeof(StringDateGuidEnum))
.SetStringField("fStr", "str2")
.SetField("fNDate", nDate)
.SetTimestampField("fNTimestamp", nDate)
@@ -975,10 +1022,13 @@ namespace Apache.Ignite.Core.Tests.Binary
.SetTimestampArrayField("fTimestampArr", new[] { nDate })
.SetGuidArrayField("fGuidArr", new[] { nGuid })
.SetEnumArrayField("fEnumArr", new[] { TestEnum.Two })
- .SetHashCode(200)
.Build();
- CheckStringDateGuidEnum2(binObj, nDate, nGuid);
+ CheckStringDateGuidEnum2(binObj2, nDate, nGuid);
+
+ // Check equality.
+ Assert.AreEqual(binObj, binObj2);
+ Assert.AreEqual(binObj.GetHashCode(), binObj2.GetHashCode());
}
/// <summary>
@@ -1074,8 +1124,6 @@ namespace Apache.Ignite.Core.Tests.Binary
/// </summary>
private static void CheckStringDateGuidEnum2(IBinaryObject binObj, DateTime? nDate, Guid? nGuid)
{
- Assert.AreEqual(200, binObj.GetHashCode());
-
Assert.AreEqual("str2", binObj.GetField<string>("fStr"));
Assert.AreEqual(nDate, binObj.GetField<DateTime?>("fNDate"));
Assert.AreEqual(nDate, binObj.GetField<DateTime?>("fNTimestamp"));
@@ -1432,7 +1480,8 @@ namespace Apache.Ignite.Core.Tests.Binary
IBinaryObjectBuilder builder = _grid.GetBinary().GetBuilder(typeof(MigrationOuter));
- builder.SetHashCode(outer.GetHashCode());
+ if (GetIdentityResolver() == null)
+ builder.SetHashCode(outer.GetHashCode());
builder.SetField<object>("inner1", inner);
builder.SetField<object>("inner2", inner);
@@ -1642,6 +1691,7 @@ namespace Apache.Ignite.Core.Tests.Binary
}
Assert.AreEqual(binEnums[0], binEnums[1]);
+ Assert.AreEqual(binEnums[0].GetHashCode(), binEnums[1].GetHashCode());
}
/// <summary>
@@ -1659,6 +1709,9 @@ namespace Apache.Ignite.Core.Tests.Binary
[Test]
public void TestRemoteBinaryMode()
{
+ if (GetIdentityResolver() != null)
+ return; // When identity resolver is set, it is required to have the same config on all nodes.
+
var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
{
GridName = "grid2",
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestArrayIdentity.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestArrayIdentity.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestArrayIdentity.cs
new file mode 100644
index 0000000..b5e767c
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryBuilderSelfTestArrayIdentity.cs
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+ using System.Collections.Generic;
+ using Apache.Ignite.Core.Binary;
+
+ /// <summary>
+ /// Tests with array equality comparer (identity resolver).
+ /// </summary>
+ public class BinaryBuilderSelfTestArrayIdentity : BinaryBuilderSelfTest
+ {
+ /** <inheritdoc /> */
+ protected override IEqualityComparer<IBinaryObject> GetIdentityResolver()
+ {
+ return new BinaryArrayEqualityComparer();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryEqualityComparerTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryEqualityComparerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryEqualityComparerTest.cs
new file mode 100644
index 0000000..f0550a8
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinaryEqualityComparerTest.cs
@@ -0,0 +1,279 @@
+\ufeff/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Tests.Binary
+{
+ using System.Collections.Generic;
+ using System.Diagnostics.CodeAnalysis;
+ using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Common;
+ using Apache.Ignite.Core.Impl.Binary;
+ using Apache.Ignite.Core.Impl.Binary.IO;
+ using NUnit.Framework;
+
+ /// <summary>
+ /// Equality comparers test.
+ /// </summary>
+ public class BinaryEqualityComparerTest
+ {
+ /// <summary>
+ /// Tests common public methods logic.
+ /// </summary>
+ [Test]
+ [SuppressMessage("ReSharper", "ReturnValueOfPureMethodIsNotUsed")]
+ public void TestPublicMethods()
+ {
+ var cmps = new IEqualityComparer<IBinaryObject>[]
+ {
+ new BinaryArrayEqualityComparer()
+ //new BinaryFieldEqualityComparer()
+ };
+
+ var obj = GetBinaryObject(1, "x", 0);
+
+ foreach (var cmp in cmps)
+ {
+ Assert.IsTrue(cmp.Equals(null, null));
+ Assert.IsTrue(cmp.Equals(obj, obj));
+
+ Assert.IsFalse(cmp.Equals(obj, null));
+ Assert.IsFalse(cmp.Equals(null, obj));
+
+ Assert.AreEqual(0, cmp.GetHashCode(null));
+ Assert.AreNotEqual(0, cmp.GetHashCode(obj));
+ }
+ }
+
+ /// <summary>
+ /// Tests the custom comparer.
+ /// </summary>
+ [Test]
+ public void TestCustomComparer()
+ {
+ var ex = Assert.Throws<IgniteException>(() => Ignition.Start(
+ new IgniteConfiguration(TestUtils.GetTestConfiguration())
+ {
+ BinaryConfiguration = new BinaryConfiguration
+ {
+ TypeConfigurations = new[]
+ {
+ new BinaryTypeConfiguration(typeof(Foo))
+ {
+ EqualityComparer = new MyComparer()
+ }
+ }
+ }
+ }));
+
+ Assert.AreEqual("Unsupported IEqualityComparer<IBinaryObject> implementation: " +
+ "Apache.Ignite.Core.Tests.Binary.BinaryEqualityComparerTest+MyComparer. " +
+ "Only predefined implementations are supported.", ex.Message);
+ }
+
+ /// <summary>
+ /// Tests the array comparer.
+ /// </summary>
+ [Test]
+ public void TestArrayComparer()
+ {
+ var cmp = (IBinaryEqualityComparer) new BinaryArrayEqualityComparer();
+
+ var ms = new BinaryHeapStream(10);
+
+ Assert.AreEqual(1, cmp.GetHashCode(ms, 0, 0, null, 0, null, null));
+
+ ms.WriteByte(1);
+ Assert.AreEqual(31 + 1, cmp.GetHashCode(ms, 0, 1, null, 0, null, null));
+
+ ms.WriteByte(3);
+ Assert.AreEqual((31 + 1) * 31 + 3, cmp.GetHashCode(ms, 0, 2, null, 0, null, null));
+ }
+
+ /// <summary>
+ /// Tests public methods of array comparer.
+ /// </summary>
+ [Test]
+ public void TestArrayComparerPublic()
+ {
+ var cmp = new BinaryArrayEqualityComparer();
+
+ var obj1 = GetBinaryObject(1, "foo", 11);
+ var obj2 = GetBinaryObject(1, "bar", 11);
+ var obj3 = GetBinaryObject(2, "foo", 11);
+ var obj4 = GetBinaryObject(2, "bar", 11);
+ var obj5 = GetBinaryObject(1, "foo", 11);
+ var obj6 = GetBinaryObject(1, "foo", 12);
+
+ // Equals.
+ Assert.IsTrue(cmp.Equals(obj1, obj1));
+ Assert.IsTrue(cmp.Equals(obj1, obj5));
+ Assert.IsFalse(cmp.Equals(obj1, obj2));
+ Assert.IsFalse(cmp.Equals(obj1, obj3));
+ Assert.IsFalse(cmp.Equals(obj1, obj4));
+ Assert.IsFalse(cmp.Equals(obj1, obj6));
+
+ Assert.IsTrue(cmp.Equals(obj2, obj2));
+ Assert.IsFalse(cmp.Equals(obj2, obj5));
+ Assert.IsFalse(cmp.Equals(obj2, obj3));
+ Assert.IsFalse(cmp.Equals(obj2, obj4));
+ Assert.IsFalse(cmp.Equals(obj2, obj6));
+
+ Assert.IsTrue(cmp.Equals(obj3, obj3));
+ Assert.IsFalse(cmp.Equals(obj3, obj5));
+ Assert.IsFalse(cmp.Equals(obj3, obj4));
+ Assert.IsFalse(cmp.Equals(obj3, obj6));
+
+ Assert.IsTrue(cmp.Equals(obj4, obj4));
+ Assert.IsFalse(cmp.Equals(obj4, obj5));
+ Assert.IsFalse(cmp.Equals(obj4, obj6));
+
+ Assert.IsTrue(cmp.Equals(obj5, obj5));
+ Assert.IsFalse(cmp.Equals(obj5, obj6));
+
+ // BinaryObject.GetHashCode.
+ Assert.AreEqual(1934949494, obj1.GetHashCode());
+ Assert.AreEqual(-2013102781, obj2.GetHashCode());
+ Assert.AreEqual(1424415317, obj3.GetHashCode());
+ Assert.AreEqual(1771330338, obj4.GetHashCode());
+ Assert.AreEqual(obj1.GetHashCode(), obj5.GetHashCode());
+ Assert.AreEqual(1934979285, cmp.GetHashCode(obj6));
+
+ // Comparer.GetHashCode.
+ Assert.AreEqual(2001751043, cmp.GetHashCode(GetBinaryObject(0, null, 0)));
+ Assert.AreEqual(194296580, cmp.GetHashCode(GetBinaryObject(1, null, 0)));
+ Assert.AreEqual(1934949494, cmp.GetHashCode(obj1));
+ Assert.AreEqual(-2013102781, cmp.GetHashCode(obj2));
+ Assert.AreEqual(1424415317, cmp.GetHashCode(obj3));
+ Assert.AreEqual(1771330338, cmp.GetHashCode(obj4));
+ Assert.AreEqual(cmp.GetHashCode(obj1), cmp.GetHashCode(obj5));
+ Assert.AreEqual(1934979285, cmp.GetHashCode(obj6));
+
+ // GetHashCode consistency.
+ foreach (var obj in new[] {obj1, obj2, obj3, obj4, obj5, obj6})
+ Assert.AreEqual(obj.GetHashCode(), cmp.GetHashCode(obj));
+ }
+
+ /// <summary>
+ /// Tests the field comparer.
+ /// </summary>
+ [Test]
+ public void TestFieldComparer()
+ {
+ var marsh = new Marshaller(new BinaryConfiguration
+ {
+ TypeConfigurations = new[]
+ {
+ new BinaryTypeConfiguration(typeof(Foo))
+ {
+ EqualityComparer = new BinaryFieldEqualityComparer("Name", "Id")
+ }
+ }
+ });
+
+ var val = new Foo {Id = 58, Name = "John"};
+ var binObj = marsh.Unmarshal<IBinaryObject>(marsh.Marshal(val), BinaryMode.ForceBinary);
+ var expHash = val.Name.GetHashCode() * 31 + val.Id.GetHashCode();
+ Assert.AreEqual(expHash, binObj.GetHashCode());
+
+ val = new Foo {Id = 95};
+ binObj = marsh.Unmarshal<IBinaryObject>(marsh.Marshal(val), BinaryMode.ForceBinary);
+ expHash = val.Id.GetHashCode();
+ Assert.AreEqual(expHash, binObj.GetHashCode());
+ }
+
+ /// <summary>
+ /// Tests the field comparer validation.
+ /// </summary>
+ [Test]
+ public void TestFieldComparerValidation()
+ {
+ var ex = Assert.Throws<IgniteException>(() => Ignition.Start(
+ new IgniteConfiguration(TestUtils.GetTestConfiguration())
+ {
+ BinaryConfiguration = new BinaryConfiguration
+ {
+ TypeConfigurations = new[]
+ {
+ new BinaryTypeConfiguration(typeof(Foo))
+ {
+ EqualityComparer = new BinaryFieldEqualityComparer()
+ }
+ }
+ }
+ }));
+
+ Assert.AreEqual("BinaryFieldEqualityComparer.FieldNames can not be null or empty.", ex.Message);
+ }
+
+ /// <summary>
+ /// Gets the binary object.
+ /// </summary>
+ private static IBinaryObject GetBinaryObject(int id, string name, int raw)
+ {
+ var marsh = new Marshaller(new BinaryConfiguration
+ {
+ TypeConfigurations = new[]
+ {
+ new BinaryTypeConfiguration(typeof(Foo))
+ {
+ EqualityComparer = new BinaryArrayEqualityComparer()
+ }
+ }
+ });
+
+ var bytes = marsh.Marshal(new Foo {Id = id, Name = name, Raw = raw});
+
+ return marsh.Unmarshal<IBinaryObject>(bytes, BinaryMode.ForceBinary);
+ }
+
+ private class Foo : IBinarizable
+ {
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public int Raw { get; set; }
+
+ public void WriteBinary(IBinaryWriter writer)
+ {
+ writer.WriteInt("id", Id);
+ writer.WriteString("name", Name);
+
+ writer.GetRawWriter().WriteInt(Raw);
+ }
+
+ public void ReadBinary(IBinaryReader reader)
+ {
+ Id = reader.ReadInt("id");
+ Name = reader.ReadString("name");
+
+ Raw = reader.GetRawReader().ReadInt();
+ }
+ }
+
+ private class MyComparer : IEqualityComparer<IBinaryObject>
+ {
+ public bool Equals(IBinaryObject x, IBinaryObject y)
+ {
+ return true;
+ }
+
+ public int GetHashCode(IBinaryObject obj)
+ {
+ return 0;
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/IO/BinaryStreamsTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/IO/BinaryStreamsTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/IO/BinaryStreamsTest.cs
index ad5358d..1ebe906 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/IO/BinaryStreamsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/IO/BinaryStreamsTest.cs
@@ -94,6 +94,12 @@ namespace Apache.Ignite.Core.Tests.Binary.IO
stream.Write(bytes, 2);
Assert.AreEqual(2, stream.Position);
+
+ var proc = new SumStreamProcessor();
+ Assert.AreEqual(0, stream.Apply(proc, 0));
+ Assert.AreEqual(1, stream.Apply(proc, 1));
+ Assert.AreEqual(3, stream.Apply(proc, 2));
+
flush();
seek();
@@ -147,5 +153,18 @@ namespace Apache.Ignite.Core.Tests.Binary.IO
check(() => stream.WriteShort(4), () => stream.ReadShort(), (short)4);
check(() => stream.WriteShortArray(new short[] {4}), () => stream.ReadShortArray(1), new short[] {4});
}
+
+ private class SumStreamProcessor : IBinaryStreamProcessor<int, int>
+ {
+ public unsafe int Invoke(byte* data, int arg)
+ {
+ int res = 0;
+
+ for (var i = 0; i < arg; i++)
+ res += *(data + i);
+
+ return res;
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs
index 9d55160..fb8725c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheConfigurationTest.cs
@@ -447,6 +447,7 @@ namespace Apache.Ignite.Core.Tests.Cache
Assert.AreEqual(x.Name, y.Name);
Assert.AreEqual(x.FieldTypeName, y.FieldTypeName);
+ Assert.AreEqual(x.IsKeyField, y.IsKeyField);
}
/// <summary>
@@ -528,7 +529,7 @@ namespace Apache.Ignite.Core.Tests.Cache
Fields = new[]
{
new QueryField("length", typeof(int)),
- new QueryField("name", typeof(string)),
+ new QueryField("name", typeof(string)) {IsKeyField = true},
new QueryField("location", typeof(string)),
},
Aliases = new [] {new QueryAlias("length", "len") },
@@ -624,7 +625,7 @@ namespace Apache.Ignite.Core.Tests.Cache
{
new QueryField("length", typeof(int)),
new QueryField("name", typeof(string)),
- new QueryField("location", typeof(string)),
+ new QueryField("location", typeof(string)) {IsKeyField = true}
},
Aliases = new [] {new QueryAlias("length", "len") },
Indexes = new[]
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
new file mode 100644
index 0000000..c460252
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheDmlQueriesTest.cs
@@ -0,0 +1,296 @@
+\ufeff/*
+ * 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.
+ */
+
+// ReSharper disable UnusedAutoPropertyAccessor.Local
+namespace Apache.Ignite.Core.Tests.Cache.Query
+{
+ using System.Linq;
+ using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Cache.Configuration;
+ using Apache.Ignite.Core.Cache.Query;
+ using Apache.Ignite.Core.Common;
+ using Apache.Ignite.Core.Impl.Binary;
+ using NUnit.Framework;
+
+ /// <summary>
+ /// Tests Data Manipulation Language queries.
+ /// </summary>
+ public class CacheDmlQueriesTest
+ {
+ /// <summary>
+ /// Sets up test fixture.
+ /// </summary>
+ [TestFixtureSetUp]
+ public void FixtureSetUp()
+ {
+ var cfg = new IgniteConfiguration(TestUtils.GetTestConfiguration())
+ {
+ BinaryConfiguration = new BinaryConfiguration(typeof(Foo))
+ {
+ TypeConfigurations =
+ {
+ new BinaryTypeConfiguration(typeof(Key))
+ {
+ EqualityComparer = new BinaryArrayEqualityComparer()
+ },
+ new BinaryTypeConfiguration(typeof(Key2))
+ {
+ EqualityComparer = new BinaryFieldEqualityComparer("Hi", "Lo")
+ }
+ }
+ }
+ };
+
+ Ignition.Start(cfg);
+ }
+
+ /// <summary>
+ /// Tears down test fixture.
+ /// </summary>
+ [TestFixtureTearDown]
+ public void FixtureTearDown()
+ {
+ Ignition.StopAll(true);
+ }
+
+ /// <summary>
+ /// Tests primitive key.
+ /// </summary>
+ [Test]
+ public void TestPrimitiveKey()
+ {
+ var cfg = new CacheConfiguration("primitive_key", new QueryEntity(typeof(int), typeof(Foo)));
+ var cache = Ignition.GetIgnite().CreateCache<int, Foo>(cfg);
+
+ // Test insert.
+ var res = cache.QueryFields(new SqlFieldsQuery("insert into foo(_key, id, name) " +
+ "values (?, ?, ?), (?, ?, ?)",
+ 1, 2, "John", 3, 4, "Mary")).GetAll();
+
+ Assert.AreEqual(1, res.Count);
+ Assert.AreEqual(1, res[0].Count);
+ Assert.AreEqual(2, res[0][0]); // 2 affected rows
+
+ var foos = cache.OrderBy(x => x.Key).ToArray();
+
+ Assert.AreEqual(2, foos.Length);
+
+ Assert.AreEqual(1, foos[0].Key);
+ Assert.AreEqual(2, foos[0].Value.Id);
+ Assert.AreEqual("John", foos[0].Value.Name);
+
+ Assert.AreEqual(3, foos[1].Key);
+ Assert.AreEqual(4, foos[1].Value.Id);
+ Assert.AreEqual("Mary", foos[1].Value.Name);
+
+ // Test key existence.
+ Assert.IsTrue(cache.ContainsKey(1));
+ Assert.IsTrue(cache.ContainsKey(3));
+ }
+
+ /// <summary>
+ /// Tests composite key (which requires QueryField.IsKeyField).
+ /// </summary>
+ [Test]
+ public void TestCompositeKeyArrayEquality()
+ {
+ var cfg = new CacheConfiguration("composite_key_arr", new QueryEntity(typeof(Key), typeof(Foo)));
+ var cache = Ignition.GetIgnite().CreateCache<Key, Foo>(cfg);
+
+ // Test insert.
+ var res = cache.QueryFields(new SqlFieldsQuery("insert into foo(hi, lo, id, name) " +
+ "values (1, 2, 3, 'John'), (4, 5, 6, 'Mary')")).GetAll();
+
+ Assert.AreEqual(1, res.Count);
+ Assert.AreEqual(1, res[0].Count);
+ Assert.AreEqual(2, res[0][0]); // 2 affected rows
+
+ var foos = cache.OrderBy(x => x.Key.Lo).ToArray();
+
+ Assert.AreEqual(2, foos.Length);
+
+ Assert.AreEqual(1, foos[0].Key.Hi);
+ Assert.AreEqual(2, foos[0].Key.Lo);
+ Assert.AreEqual(3, foos[0].Value.Id);
+ Assert.AreEqual("John", foos[0].Value.Name);
+
+ Assert.AreEqual(4, foos[1].Key.Hi);
+ Assert.AreEqual(5, foos[1].Key.Lo);
+ Assert.AreEqual(6, foos[1].Value.Id);
+ Assert.AreEqual("Mary", foos[1].Value.Name);
+
+ // Existence tests check that hash codes are consistent.
+ var binary = cache.Ignite.GetBinary();
+ var binCache = cache.WithKeepBinary<IBinaryObject, IBinaryObject>();
+
+ Assert.IsTrue(cache.ContainsKey(new Key(2, 1)));
+ Assert.IsTrue(cache.ContainsKey(foos[0].Key));
+ Assert.IsTrue(binCache.ContainsKey(
+ binary.GetBuilder(typeof(Key)).SetField("hi", 1).SetField("lo", 2).Build()));
+
+ Assert.IsTrue(cache.ContainsKey(new Key(5, 4)));
+ Assert.IsTrue(cache.ContainsKey(foos[1].Key));
+ Assert.IsTrue(binCache.ContainsKey(
+ binary.GetBuilder(typeof(Key)).SetField("hi", 4).SetField("lo", 5).Build()));
+ }
+
+ /// <summary>
+ /// Tests composite key (which requires QueryField.IsKeyField).
+ /// </summary>
+ [Test]
+ public void TestCompositeKeyFieldEquality()
+ {
+ var cfg = new CacheConfiguration("composite_key_fld", new QueryEntity(typeof(Key2), typeof(Foo)));
+ var cache = Ignition.GetIgnite().CreateCache<Key2, Foo>(cfg);
+
+ // Test insert.
+ var res = cache.QueryFields(new SqlFieldsQuery("insert into foo(hi, lo, str, id, name) " +
+ "values (1, 2, 'Foo', 3, 'John'), (4, 5, 'Bar', 6, 'Mary')")).GetAll();
+
+ Assert.AreEqual(1, res.Count);
+ Assert.AreEqual(1, res[0].Count);
+ Assert.AreEqual(2, res[0][0]); // 2 affected rows
+
+ var foos = cache.OrderBy(x => x.Key.Lo).ToArray();
+
+ Assert.AreEqual(2, foos.Length);
+
+ Assert.AreEqual(1, foos[0].Key.Hi);
+ Assert.AreEqual(2, foos[0].Key.Lo);
+ Assert.AreEqual("Foo", foos[0].Key.Str);
+ Assert.AreEqual(3, foos[0].Value.Id);
+ Assert.AreEqual("John", foos[0].Value.Name);
+
+ Assert.AreEqual(4, foos[1].Key.Hi);
+ Assert.AreEqual(5, foos[1].Key.Lo);
+ Assert.AreEqual("Bar", foos[1].Key.Str);
+ Assert.AreEqual(6, foos[1].Value.Id);
+ Assert.AreEqual("Mary", foos[1].Value.Name);
+
+ // Existence tests check that hash codes are consistent.
+ Assert.IsTrue(cache.ContainsKey(new Key2(2, 1, "Foo")));
+ Assert.IsTrue(cache.ContainsKey(foos[0].Key));
+
+ Assert.IsTrue(cache.ContainsKey(new Key2(5, 4, "Bar")));
+ Assert.IsTrue(cache.ContainsKey(foos[1].Key));
+ }
+
+ /// <summary>
+ /// Tests the composite key without IsKeyField configuration.
+ /// </summary>
+ [Test]
+ public void TestInvalidCompositeKey()
+ {
+ var cfg = new CacheConfiguration("invalid_composite_key", new QueryEntity
+ {
+ KeyTypeName = "Key",
+ ValueTypeName = "Foo",
+ Fields = new[]
+ {
+ new QueryField("Lo", typeof(int)),
+ new QueryField("Hi", typeof(int)),
+ new QueryField("Id", typeof(int)),
+ new QueryField("Name", typeof(string))
+ }
+ });
+
+ var cache = Ignition.GetIgnite().CreateCache<Key, Foo>(cfg);
+
+ var ex = Assert.Throws<IgniteException>(
+ () => cache.QueryFields(new SqlFieldsQuery("insert into foo(lo, hi, id, name) " +
+ "values (1, 2, 3, 'John'), (4, 5, 6, 'Mary')")));
+
+ Assert.AreEqual("Ownership flag not set for binary property. Have you set 'keyFields' " +
+ "property of QueryEntity in programmatic or XML configuration?", ex.Message);
+ }
+
+ /// <summary>
+ /// Tests DML with pure binary cache mode, without classes.
+ /// </summary>
+ [Test]
+ public void TestBinaryMode()
+ {
+ var cfg = new CacheConfiguration("binary_only", new QueryEntity
+ {
+ KeyTypeName = "CarKey",
+ ValueTypeName = "Car",
+ Fields = new[]
+ {
+ new QueryField("VIN", typeof(string)) {IsKeyField = true},
+ new QueryField("Id", typeof(int)) {IsKeyField = true},
+ new QueryField("Make", typeof(string)),
+ new QueryField("Year", typeof(int))
+ }
+ });
+
+ var cache = Ignition.GetIgnite().CreateCache<object, object>(cfg)
+ .WithKeepBinary<IBinaryObject, IBinaryObject>();
+
+ var res = cache.QueryFields(new SqlFieldsQuery("insert into car(VIN, Id, Make, Year) " +
+ "values ('DLRDMC', 88, 'DeLorean', 1982)")).GetAll();
+
+ Assert.AreEqual(1, res.Count);
+ Assert.AreEqual(1, res[0].Count);
+ Assert.AreEqual(1, res[0][0]);
+
+ var car = cache.Single();
+ Assert.AreEqual("CarKey", car.Key.GetBinaryType().TypeName);
+ Assert.AreEqual("Car", car.Value.GetBinaryType().TypeName);
+ }
+
+ /// <summary>
+ /// Key.
+ /// </summary>
+ private struct Key
+ {
+ public Key(int lo, int hi) : this()
+ {
+ Lo = lo;
+ Hi = hi;
+ }
+
+ [QuerySqlField] public int Lo { get; private set; }
+ [QuerySqlField] public int Hi { get; private set; }
+ }
+
+ /// <summary>
+ /// Key.
+ /// </summary>
+ private struct Key2
+ {
+ public Key2(int lo, int hi, string str) : this()
+ {
+ Lo = lo;
+ Hi = hi;
+ Str = str;
+ }
+
+ [QuerySqlField] public int Lo { get; private set; }
+ [QuerySqlField] public int Hi { get; private set; }
+ [QuerySqlField] public string Str { get; private set; }
+ }
+
+ /// <summary>
+ /// Value.
+ /// </summary>
+ private class Foo
+ {
+ [QuerySqlField] public int Id { get; set; }
+ [QuerySqlField] public string Name { get; set; }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
index 55b8dcf..26e04a9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationSerializerTest.cs
@@ -45,6 +45,7 @@ namespace Apache.Ignite.Core.Tests
using Apache.Ignite.Core.Discovery.Tcp;
using Apache.Ignite.Core.Discovery.Tcp.Multicast;
using Apache.Ignite.Core.Events;
+ using Apache.Ignite.Core.Impl.Binary;
using Apache.Ignite.Core.Impl.Common;
using Apache.Ignite.Core.Lifecycle;
using Apache.Ignite.Core.Log;
@@ -72,6 +73,14 @@ namespace Apache.Ignite.Core.Tests
<types>
<string>Apache.Ignite.Core.Tests.IgniteConfigurationSerializerTest+FooClass, Apache.Ignite.Core.Tests</string>
</types>
+ <typeConfigurations>
+ <binaryTypeConfiguration affinityKeyFieldName='affKeyFieldName' isEnum='true' keepDeserialized='True' typeName='typeName'>
+ <equalityComparer type='BinaryArrayEqualityComparer' />
+ <idMapper type='Apache.Ignite.Core.Tests.Binary.IdMapper, Apache.Ignite.Core.Tests' />
+ <nameMapper type='Apache.Ignite.Core.Tests.IgniteConfigurationSerializerTest+NameMapper, Apache.Ignite.Core.Tests' />
+ <serializer type='Apache.Ignite.Core.Tests.IgniteConfigurationSerializerTest+TestSerializer, Apache.Ignite.Core.Tests' />
+ </binaryTypeConfiguration>
+ </typeConfigurations>
</binaryConfiguration>
<discoverySpi type='TcpDiscoverySpi' joinTimeout='0:1:0' localAddress='192.168.1.1' localPort='6655'>
<ipFinder type='TcpDiscoveryMulticastIpFinder' addressRequestAttempts='7' />
@@ -86,7 +95,7 @@ namespace Apache.Ignite.Core.Tests
<queryEntities>
<queryEntity keyType='System.Int32' valueType='System.String'>
<fields>
- <queryField name='length' fieldType='System.Int32' />
+ <queryField name='length' fieldType='System.Int32' isKeyField='true' />
</fields>
<aliases>
<queryAlias fullName='somefield.field' alias='shortField' />
@@ -159,6 +168,7 @@ namespace Apache.Ignite.Core.Tests
Assert.AreEqual(typeof(string), queryEntity.ValueType);
Assert.AreEqual("length", queryEntity.Fields.Single().Name);
Assert.AreEqual(typeof(int), queryEntity.Fields.Single().FieldType);
+ Assert.IsTrue(queryEntity.Fields.Single().IsKeyField);
Assert.AreEqual("somefield.field", queryEntity.Aliases.Single().FullName);
Assert.AreEqual("shortField", queryEntity.Aliases.Single().Alias);
Assert.AreEqual(QueryIndexType.Geospatial, queryEntity.Indexes.Single().IndexType);
@@ -214,6 +224,16 @@ namespace Apache.Ignite.Core.Tests
Assert.AreEqual(25, swap.MaximumWriteQueueSize);
Assert.AreEqual(36, swap.ReadStripesNumber);
Assert.AreEqual(47, swap.WriteBufferSize);
+
+ var binType = cfg.BinaryConfiguration.TypeConfigurations.Single();
+ Assert.AreEqual("typeName", binType.TypeName);
+ Assert.AreEqual("affKeyFieldName", binType.AffinityKeyFieldName);
+ Assert.IsTrue(binType.IsEnum);
+ Assert.AreEqual(true, binType.KeepDeserialized);
+ Assert.IsInstanceOf<BinaryArrayEqualityComparer>(binType.EqualityComparer);
+ Assert.IsInstanceOf<IdMapper>(binType.IdMapper);
+ Assert.IsInstanceOf<NameMapper>(binType.NameMapper);
+ Assert.IsInstanceOf<TestSerializer>(binType.Serializer);
}
/// <summary>
@@ -334,12 +354,12 @@ namespace Apache.Ignite.Core.Tests
};
Assert.AreEqual(FixLineEndings(@"<?xml version=""1.0"" encoding=""utf-16""?>
-<igniteConfiguration gridName=""myGrid"" clientMode=""true"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection"">
+<igniteConfiguration clientMode=""true"" gridName=""myGrid"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection"">
<cacheConfiguration>
- <cacheConfiguration name=""myCache"" cacheMode=""Replicated"">
+ <cacheConfiguration cacheMode=""Replicated"" name=""myCache"">
<queryEntities>
- <queryEntity valueTypeName=""java.lang.Integer"" valueType=""System.Int32"" />
- <queryEntity keyTypeName=""java.lang.Integer"" keyType=""System.Int32"" valueTypeName=""java.lang.String"" valueType=""System.String"" />
+ <queryEntity valueType=""System.Int32"" valueTypeName=""java.lang.Integer"" />
+ <queryEntity keyType=""System.Int32"" keyTypeName=""java.lang.Integer"" valueType=""System.String"" valueTypeName=""java.lang.String"" />
</queryEntities>
</cacheConfiguration>
</cacheConfiguration>
@@ -364,12 +384,12 @@ namespace Apache.Ignite.Core.Tests
}
Assert.AreEqual(FixLineEndings(@"<?xml version=""1.0"" encoding=""utf-16""?>
-<igCfg gridName=""myGrid"" clientMode=""true"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection"">
+<igCfg clientMode=""true"" gridName=""myGrid"" xmlns=""http://ignite.apache.org/schema/dotnet/IgniteConfigurationSection"">
<cacheConfiguration>
- <cacheConfiguration name=""myCache"" cacheMode=""Replicated"">
+ <cacheConfiguration cacheMode=""Replicated"" name=""myCache"">
<queryEntities>
- <queryEntity valueTypeName=""java.lang.Integer"" valueType=""System.Int32"" />
- <queryEntity keyTypeName=""java.lang.Integer"" keyType=""System.Int32"" valueTypeName=""java.lang.String"" valueType=""System.String"" />
+ <queryEntity valueType=""System.Int32"" valueTypeName=""java.lang.Integer"" />
+ <queryEntity keyType=""System.Int32"" keyTypeName=""java.lang.Integer"" valueType=""System.String"" valueTypeName=""java.lang.String"" />
</queryEntities>
</cacheConfiguration>
</cacheConfiguration>
@@ -547,7 +567,8 @@ namespace Apache.Ignite.Core.Tests
TypeName = "typeName",
IdMapper = new IdMapper(),
NameMapper = new NameMapper(),
- Serializer = new TestSerializer()
+ Serializer = new TestSerializer(),
+ EqualityComparer = new BinaryArrayEqualityComparer()
},
new BinaryTypeConfiguration
{
@@ -555,7 +576,8 @@ namespace Apache.Ignite.Core.Tests
KeepDeserialized = false,
AffinityKeyFieldName = "affKeyFieldName",
TypeName = "typeName2",
- Serializer = new BinaryReflectiveSerializer()
+ Serializer = new BinaryReflectiveSerializer(),
+ EqualityComparer = new BinaryFieldEqualityComparer()
}
},
Types = new[] {typeof (string).FullName},
@@ -595,7 +617,7 @@ namespace Apache.Ignite.Core.Tests
{
Fields = new[]
{
- new QueryField("field", typeof (int))
+ new QueryField("field", typeof (int)) { IsKeyField = true }
},
Indexes = new[]
{
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
index 2e39b9b..86ece98 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/IgniteConfigurationTest.cs
@@ -34,6 +34,7 @@ namespace Apache.Ignite.Core.Tests
using Apache.Ignite.Core.Discovery.Tcp.Static;
using Apache.Ignite.Core.Events;
using Apache.Ignite.Core.Impl;
+ using Apache.Ignite.Core.Impl.Binary;
using Apache.Ignite.Core.SwapSpace.File;
using Apache.Ignite.Core.Transactions;
using NUnit.Framework;
@@ -181,6 +182,18 @@ namespace Apache.Ignite.Core.Tests
Assert.AreEqual(swap.MaximumWriteQueueSize, resSwap.MaximumWriteQueueSize);
Assert.AreEqual(swap.ReadStripesNumber, resSwap.ReadStripesNumber);
Assert.AreEqual(swap.WriteBufferSize, resSwap.WriteBufferSize);
+
+ var binCfg = cfg.BinaryConfiguration;
+ Assert.IsFalse(binCfg.CompactFooter);
+
+ var typ = binCfg.TypeConfigurations.Single();
+ Assert.AreEqual("myType", typ.TypeName);
+ Assert.IsTrue(typ.IsEnum);
+ Assert.AreEqual("affKey", typ.AffinityKeyFieldName);
+ Assert.AreEqual(false, typ.KeepDeserialized);
+
+ CollectionAssert.AreEqual(new[] {"fld1", "fld2"},
+ ((BinaryFieldEqualityComparer)typ.EqualityComparer).FieldNames);
}
}
@@ -513,6 +526,21 @@ namespace Apache.Ignite.Core.Tests
WriteBufferSize = 9,
BaseDirectory = Path.GetTempPath(),
MaximumSparsity = 11.22f
+ },
+ BinaryConfiguration = new BinaryConfiguration
+ {
+ CompactFooter = false,
+ TypeConfigurations = new[]
+ {
+ new BinaryTypeConfiguration
+ {
+ TypeName = "myType",
+ IsEnum = true,
+ AffinityKeyFieldName = "affKey",
+ KeepDeserialized = false,
+ EqualityComparer = new BinaryFieldEqualityComparer("fld1", "fld2")
+ }
+ }
}
};
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
index a80dfc0..42ccdd4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
@@ -90,6 +90,8 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="Binary\BinaryArrayEqualityComparer.cs" />
+ <Compile Include="Impl\Binary\BinaryFieldEqualityComparer.cs" />
<Compile Include="Binary\BinaryReflectiveSerializer.cs" />
<Compile Include="Common\JavaException.cs" />
<Compile Include="DataStructures\Configuration\Package-Info.cs" />
@@ -97,8 +99,10 @@
<Compile Include="Discovery\Tcp\Multicast\Package-Info.cs" />
<Compile Include="Discovery\Tcp\Package-Info.cs" />
<Compile Include="Discovery\Tcp\Static\Package-Info.cs" />
+ <Compile Include="Impl\Binary\BinaryEqualityComparerSerializer.cs" />
<Compile Include="Impl\Binary\BinaryProcessor.cs" />
<Compile Include="Impl\Binary\BinaryReflectiveSerializerInternal.cs" />
+ <Compile Include="Impl\Binary\IBinaryEqualityComparer.cs" />
<Compile Include="Impl\Binary\IBinarySerializerInternal.cs" />
<Compile Include="Binary\Package-Info.cs" />
<Compile Include="Cache\Affinity\AffinityKey.cs" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryArrayEqualityComparer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryArrayEqualityComparer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryArrayEqualityComparer.cs
new file mode 100644
index 0000000..09f7f0f
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryArrayEqualityComparer.cs
@@ -0,0 +1,149 @@
+\ufeff/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Binary
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using Apache.Ignite.Core.Impl.Binary;
+ using Apache.Ignite.Core.Impl.Binary.IO;
+
+ /// <summary>
+ /// Compares binary object equality using underlying byte array.
+ /// </summary>
+ public class BinaryArrayEqualityComparer : IEqualityComparer<IBinaryObject>, IBinaryEqualityComparer,
+ IBinaryStreamProcessor<KeyValuePair<int,int>, int>
+ {
+ /// <summary>
+ /// Determines whether the specified objects are equal.
+ /// </summary>
+ /// <param name="x">The first object to compare.</param>
+ /// <param name="y">The second object to compare.</param>
+ /// <returns>
+ /// true if the specified objects are equal; otherwise, false.
+ /// </returns>
+ public bool Equals(IBinaryObject x, IBinaryObject y)
+ {
+ if (x == null)
+ return y == null;
+
+ if (y == null)
+ return false;
+
+ if (ReferenceEquals(x, y))
+ return true;
+
+ var binx = GetBinaryObject(x);
+ var biny = GetBinaryObject(y);
+
+ var lenx = GetDataLength(binx);
+ var leny = GetDataLength(biny);
+
+ if (lenx != leny)
+ return false;
+
+ var startx = GetDataStart(binx);
+ var starty = GetDataStart(biny);
+
+ var arrx = binx.Data;
+ var arry = biny.Data;
+
+ for (var i = 0; i < lenx; i++)
+ {
+ if (arrx[i + startx] != arry[i + starty])
+ return false;
+ }
+
+ return true;
+ }
+
+ /// <summary>
+ /// Returns a hash code for this instance.
+ /// </summary>
+ /// <param name="obj">The object.</param>
+ /// <returns>
+ /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+ /// </returns>
+ public int GetHashCode(IBinaryObject obj)
+ {
+ if (obj == null)
+ return 0;
+
+ var binObj = GetBinaryObject(obj);
+
+ var arg = new KeyValuePair<int, int>(GetDataStart(binObj), GetDataLength(binObj));
+
+ return new BinaryHeapStream(binObj.Data).Apply(this, arg);
+ }
+
+ /** <inheritdoc /> */
+ int IBinaryEqualityComparer.GetHashCode(IBinaryStream stream, int startPos, int length,
+ BinaryObjectSchemaHolder schema, int schemaId, Marshaller marshaller, IBinaryTypeDescriptor desc)
+ {
+ Debug.Assert(stream != null);
+ Debug.Assert(startPos >= 0);
+ Debug.Assert(length >= 0);
+
+ var arg = new KeyValuePair<int, int>(startPos, length);
+
+ return stream.Apply(this, arg);
+ }
+
+ /** <inheritdoc /> */
+ unsafe int IBinaryStreamProcessor<KeyValuePair<int, int>, int>.Invoke(byte* data, KeyValuePair<int, int> arg)
+ {
+ var hash = 1;
+ var ptr = data + arg.Key;
+
+ for (var i = 0; i < arg.Value; i++)
+ hash = 31 * hash + *(ptr + i);
+
+ return hash;
+ }
+
+ /// <summary>
+ /// Casts to <see cref="BinaryObject"/> or throws an error.
+ /// </summary>
+ private static BinaryObject GetBinaryObject(IBinaryObject obj)
+ {
+ var binObj = obj as BinaryObject;
+
+ if (binObj != null)
+ return binObj;
+
+ throw new NotSupportedException(string.Format("{0} of type {1} is not supported.",
+ typeof(IBinaryObject), obj.GetType()));
+ }
+
+ /// <summary>
+ /// Gets the non-raw data length.
+ /// </summary>
+ private static int GetDataLength(BinaryObject binObj)
+ {
+ return binObj.Header.FooterStartOffset - BinaryObjectHeader.Size;
+ }
+
+ /// <summary>
+ /// Gets the data starting position.
+ /// </summary>
+ private static int GetDataStart(BinaryObject binObj)
+ {
+ return binObj.Offset + BinaryObjectHeader.Size;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryConfiguration.cs
index 51df907..c738f28 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryConfiguration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryConfiguration.cs
@@ -141,5 +141,29 @@ namespace Apache.Ignite.Core.Binary
{
get { return _compactFooter; }
}
+
+ /// <summary>
+ /// Merges other config into this.
+ /// </summary>
+ internal void MergeTypes(BinaryConfiguration localConfig)
+ {
+ if (TypeConfigurations == null)
+ {
+ TypeConfigurations = localConfig.TypeConfigurations;
+ }
+ else if (localConfig.TypeConfigurations != null)
+ {
+ // Both configs are present.
+ // Local configuration is more complete and takes preference when it exists for a given type.
+ var localTypeNames = new HashSet<string>(localConfig.TypeConfigurations.Select(x => x.TypeName),
+ StringComparer.OrdinalIgnoreCase);
+
+ var configs = new List<BinaryTypeConfiguration>(localConfig.TypeConfigurations);
+
+ configs.AddRange(TypeConfigurations.Where(x=>!localTypeNames.Contains(x.TypeName)));
+
+ TypeConfigurations = configs;
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryTypeConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryTypeConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryTypeConfiguration.cs
index c36b9fd..722197c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryTypeConfiguration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Binary/BinaryTypeConfiguration.cs
@@ -18,6 +18,7 @@
namespace Apache.Ignite.Core.Binary
{
using System;
+ using System.Collections.Generic;
using Apache.Ignite.Core.Impl.Common;
/// <summary>
@@ -69,6 +70,7 @@ namespace Apache.Ignite.Core.Binary
TypeName = cfg.TypeName;
KeepDeserialized = cfg.KeepDeserialized;
IsEnum = cfg.IsEnum;
+ EqualityComparer = cfg.EqualityComparer;
}
/// <summary>
@@ -113,6 +115,18 @@ namespace Apache.Ignite.Core.Binary
public bool IsEnum { get; set; }
/// <summary>
+ /// Gets or sets the equality comparer to compute hash codes and compare objects
+ /// in <see cref="IBinaryObject"/> form.
+ /// This comparer is important only for types that are used as cache keys.
+ /// <para />
+ /// Null means legacy behavior: hash code is computed by calling <see cref="object.GetHashCode"/>, equality is
+ /// computed by comparing bytes in serialized (binary) form.
+ /// <para />
+ /// Only predefined implementations are supported: <see cref="BinaryArrayEqualityComparer"/>.
+ /// </summary>
+ public IEqualityComparer<IBinaryObject> EqualityComparer { get; set; }
+
+ /// <summary>
/// Returns a string that represents the current object.
/// </summary>
/// <returns>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
index adfe9e1..ff9af37 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryEntity.cs
@@ -178,8 +178,11 @@ namespace Apache.Ignite.Core.Cache.Configuration
ValueTypeName = reader.ReadString();
var count = reader.ReadInt();
- Fields = count == 0 ? null : Enumerable.Range(0, count).Select(x =>
- new QueryField(reader.ReadString(), reader.ReadString())).ToList();
+ Fields = count == 0
+ ? null
+ : Enumerable.Range(0, count).Select(x =>
+ new QueryField(reader.ReadString(), reader.ReadString()) {IsKeyField = reader.ReadBoolean()})
+ .ToList();
count = reader.ReadInt();
Aliases = count == 0 ? null : Enumerable.Range(0, count)
@@ -205,6 +208,7 @@ namespace Apache.Ignite.Core.Cache.Configuration
{
writer.WriteString(field.Name);
writer.WriteString(field.FieldTypeName);
+ writer.WriteBoolean(field.IsKeyField);
}
}
else
@@ -264,16 +268,19 @@ namespace Apache.Ignite.Core.Cache.Configuration
/// <summary>
/// Rescans the attributes in <see cref="KeyType"/> and <see cref="ValueType"/>.
/// </summary>
- private void RescanAttributes(params Type[] types)
+ private void RescanAttributes(Type keyType, Type valType)
{
- if (types.Length == 0 || types.All(t => t == null))
+ if (keyType == null && valType == null)
return;
var fields = new List<QueryField>();
var indexes = new List<QueryIndexEx>();
- foreach (var type in types.Where(t => t != null))
- ScanAttributes(type, fields, indexes, null, new HashSet<Type>());
+ if (keyType != null)
+ ScanAttributes(keyType, fields, indexes, null, new HashSet<Type>(), true);
+
+ if (valType != null)
+ ScanAttributes(valType, fields, indexes, null, new HashSet<Type>(), false);
if (fields.Any())
Fields = fields;
@@ -308,15 +315,17 @@ namespace Apache.Ignite.Core.Cache.Configuration
}
/// <summary>
- /// Scans specified type for occurences of <see cref="QuerySqlFieldAttribute"/>.
+ /// Scans specified type for occurences of <see cref="QuerySqlFieldAttribute" />.
/// </summary>
/// <param name="type">The type.</param>
/// <param name="fields">The fields.</param>
/// <param name="indexes">The indexes.</param>
/// <param name="parentPropName">Name of the parent property.</param>
/// <param name="visitedTypes">The visited types.</param>
+ /// <param name="isKey">Whether this is a key type.</param>
+ /// <exception cref="System.InvalidOperationException">Recursive Query Field definition detected: + type</exception>
private static void ScanAttributes(Type type, List<QueryField> fields, List<QueryIndexEx> indexes,
- string parentPropName, ISet<Type> visitedTypes)
+ string parentPropName, ISet<Type> visitedTypes, bool isKey)
{
Debug.Assert(type != null);
Debug.Assert(fields != null);
@@ -344,9 +353,9 @@ namespace Apache.Ignite.Core.Cache.Configuration
if (parentPropName != null)
columnName = parentPropName + "." + columnName;
- fields.Add(new QueryField(columnName, memberInfo.Value));
+ fields.Add(new QueryField(columnName, memberInfo.Value) {IsKeyField = isKey});
- ScanAttributes(memberInfo.Value, fields, indexes, columnName, visitedTypes);
+ ScanAttributes(memberInfo.Value, fields, indexes, columnName, visitedTypes, isKey);
}
foreach (var attr in customAttributes.OfType<QueryTextFieldAttribute>())
@@ -359,9 +368,9 @@ namespace Apache.Ignite.Core.Cache.Configuration
if (parentPropName != null)
columnName = parentPropName + "." + columnName;
- fields.Add(new QueryField(columnName, memberInfo.Value));
+ fields.Add(new QueryField(columnName, memberInfo.Value) {IsKeyField = isKey});
- ScanAttributes(memberInfo.Value, fields, indexes, columnName, visitedTypes);
+ ScanAttributes(memberInfo.Value, fields, indexes, columnName, visitedTypes, isKey);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
index 12028e2..c33aa57 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cache/Configuration/QueryField.cs
@@ -109,6 +109,12 @@ namespace Apache.Ignite.Core.Cache.Configuration
}
/// <summary>
+ /// Gets or sets a value indicating whether this field belongs to the cache key.
+ /// Proper value here is required for SQL DML queries which create/modify cache keys.
+ /// </summary>
+ public bool IsKeyField { get; set; }
+
+ /// <summary>
/// Validates this instance and outputs information to the log, if necessary.
/// </summary>
internal void Validate(ILogger log, string logInfo)
[10/12] ignite git commit: IGNITE-4045 .NET: Support DML API
Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
index 08789b6..ce9fcf6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfiguration.cs
@@ -157,8 +157,6 @@
{
IgniteArgumentCheck.NotNull(configuration, "configuration");
- CopyLocalProperties(configuration);
-
using (var stream = IgniteManager.Memory.Allocate().GetStream())
{
var marsh = new Marshaller(configuration.BinaryConfiguration);
@@ -171,6 +169,8 @@
ReadCore(marsh.StartUnmarshal(stream));
}
+
+ CopyLocalProperties(configuration);
}
/// <summary>
@@ -255,12 +255,37 @@
writer.WriteBoolean(false);
// Binary config
- var isCompactFooterSet = BinaryConfiguration != null && BinaryConfiguration.CompactFooterInternal != null;
+ if (BinaryConfiguration != null)
+ {
+ writer.WriteBoolean(true);
- writer.WriteBoolean(isCompactFooterSet);
+ if (BinaryConfiguration.CompactFooterInternal != null)
+ {
+ writer.WriteBoolean(true);
+ writer.WriteBoolean(BinaryConfiguration.CompactFooter);
+ }
+ else
+ {
+ writer.WriteBoolean(false);
+ }
+
+ // Send only descriptors with non-null EqualityComparer to preserve old behavior where
+ // remote nodes can have no BinaryConfiguration.
+ var types = writer.Marshaller.GetUserTypeDescriptors().Where(x => x.EqualityComparer != null).ToList();
+
+ writer.WriteInt(types.Count);
- if (isCompactFooterSet)
- writer.WriteBoolean(BinaryConfiguration.CompactFooter);
+ foreach (var type in types)
+ {
+ writer.WriteString(BinaryUtils.SimpleTypeName(type.TypeName));
+ writer.WriteBoolean(type.IsEnum);
+ BinaryEqualityComparerSerializer.Write(writer, type.EqualityComparer);
+ }
+ }
+ else
+ {
+ writer.WriteBoolean(false);
+ }
// User attributes
var attrs = UserAttributes;
@@ -361,7 +386,28 @@
if (r.ReadBoolean())
{
BinaryConfiguration = BinaryConfiguration ?? new BinaryConfiguration();
- BinaryConfiguration.CompactFooter = r.ReadBoolean();
+
+ if (r.ReadBoolean())
+ BinaryConfiguration.CompactFooter = r.ReadBoolean();
+
+ var typeCount = r.ReadInt();
+
+ if (typeCount > 0)
+ {
+ var types = new List<BinaryTypeConfiguration>(typeCount);
+
+ for (var i = 0; i < typeCount; i++)
+ {
+ types.Add(new BinaryTypeConfiguration
+ {
+ TypeName = r.ReadString(),
+ IsEnum = r.ReadBoolean(),
+ EqualityComparer = BinaryEqualityComparerSerializer.Read(r)
+ });
+ }
+
+ BinaryConfiguration.TypeConfigurations = types;
+ }
}
// User attributes
@@ -402,17 +448,15 @@
/// <param name="binaryReader">The binary reader.</param>
private void Read(BinaryReader binaryReader)
{
- var r = binaryReader;
-
- CopyLocalProperties(r.Marshaller.Ignite.Configuration);
+ ReadCore(binaryReader);
- ReadCore(r);
+ CopyLocalProperties(binaryReader.Marshaller.Ignite.Configuration);
// Misc
- IgniteHome = r.ReadString();
+ IgniteHome = binaryReader.ReadString();
- JvmInitialMemoryMb = (int) (r.ReadLong()/1024/2014);
- JvmMaxMemoryMb = (int) (r.ReadLong()/1024/2014);
+ JvmInitialMemoryMb = (int) (binaryReader.ReadLong()/1024/2014);
+ JvmMaxMemoryMb = (int) (binaryReader.ReadLong()/1024/2014);
// Local data (not from reader)
JvmDllPath = Process.GetCurrentProcess().Modules.OfType<ProcessModule>()
@@ -426,9 +470,16 @@
private void CopyLocalProperties(IgniteConfiguration cfg)
{
GridName = cfg.GridName;
- BinaryConfiguration = cfg.BinaryConfiguration == null
- ? null
- : new BinaryConfiguration(cfg.BinaryConfiguration);
+
+ if (BinaryConfiguration != null && cfg.BinaryConfiguration != null)
+ {
+ BinaryConfiguration.MergeTypes(cfg.BinaryConfiguration);
+ }
+ else if (cfg.BinaryConfiguration != null)
+ {
+ BinaryConfiguration = new BinaryConfiguration(cfg.BinaryConfiguration);
+ }
+
JvmClasspath = cfg.JvmClasspath;
JvmOptions = cfg.JvmOptions;
Assemblies = cfg.Assemblies;
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
index b35527d..d54a200 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/IgniteConfigurationSection.xsd
@@ -152,6 +152,20 @@
</xs:attribute>
</xs:complexType>
</xs:element>
+ <xs:element name="equalityComparer" minOccurs="0">
+ <xs:annotation>
+ <xs:documentation>
+ Equality comparer to compute hash codes and compare objects in IBinaryObject form.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:complexType>
+ <xs:attribute name="type" type="xs:string" use="required">
+ <xs:annotation>
+ <xs:documentation>Assembly-qualified type name.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
</xs:all>
<xs:attribute name="typeName" type="xs:string">
<xs:annotation>
@@ -297,6 +311,11 @@
<xs:documentation>Java field type name.</xs:documentation>
</xs:annotation>
</xs:attribute>
+ <xs:attribute name="isKeyField" type="xs:boolean">
+ <xs:annotation>
+ <xs:documentation>Indicates whether this field belongs to the cache key.</xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
index 3d55acd..fa7cf6c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Binary.cs
@@ -81,7 +81,7 @@ namespace Apache.Ignite.Core.Impl.Binary
throw new IgniteException("Type is not binary (add it to BinaryConfiguration): " +
type.FullName);
- return Builder0(null, BinaryFromDescriptor(desc), desc);
+ return Builder0(null, null, desc);
}
/** <inheritDoc /> */
@@ -91,7 +91,7 @@ namespace Apache.Ignite.Core.Impl.Binary
IBinaryTypeDescriptor desc = _marsh.GetDescriptor(typeName);
- return Builder0(null, BinaryFromDescriptor(desc), desc);
+ return Builder0(null, null, desc);
}
/** <inheritDoc /> */
@@ -182,30 +182,6 @@ namespace Apache.Ignite.Core.Impl.Binary
}
/// <summary>
- /// Create empty binary object from descriptor.
- /// </summary>
- /// <param name="desc">Descriptor.</param>
- /// <returns>Empty binary object.</returns>
- private BinaryObject BinaryFromDescriptor(IBinaryTypeDescriptor desc)
- {
- const int len = BinaryObjectHeader.Size;
-
- var flags = desc.UserType ? BinaryObjectHeader.Flag.UserType : BinaryObjectHeader.Flag.None;
-
- if (_marsh.CompactFooter && desc.UserType)
- flags |= BinaryObjectHeader.Flag.CompactFooter;
-
- var hdr = new BinaryObjectHeader(desc.TypeId, 0, len, 0, len, flags);
-
- using (var stream = new BinaryHeapStream(len))
- {
- BinaryObjectHeader.Write(hdr, stream, 0);
-
- return new BinaryObject(_marsh, stream.InternalArray, 0, hdr);
- }
- }
-
- /// <summary>
/// Internal builder creation routine.
/// </summary>
/// <param name="parent">Parent builder.</param>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryEqualityComparerSerializer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryEqualityComparerSerializer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryEqualityComparerSerializer.cs
new file mode 100644
index 0000000..aa4795e
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryEqualityComparerSerializer.cs
@@ -0,0 +1,99 @@
+\ufeff/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Impl.Binary
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using Apache.Ignite.Core.Binary;
+
+ /// <summary>
+ /// Reads and writes <see cref="IBinaryEqualityComparer"/>.
+ /// </summary>
+ internal static class BinaryEqualityComparerSerializer
+ {
+ /// <summary>
+ /// SwapSpace type.
+ /// </summary>
+ private enum Type : byte
+ {
+ None = 0,
+ Array = 1,
+ Field = 2
+ }
+
+ /// <summary>
+ /// Writes an instance.
+ /// </summary>
+ public static void Write(IBinaryRawWriter writer, IBinaryEqualityComparer comparer)
+ {
+ if (comparer == null)
+ {
+ writer.WriteByte((byte) Type.None);
+ return;
+ }
+
+ var arrCmp = comparer as BinaryArrayEqualityComparer;
+
+ if (arrCmp != null)
+ {
+ writer.WriteByte((byte) Type.Array);
+ return;
+ }
+
+ var fieldCmp = (BinaryFieldEqualityComparer) comparer;
+
+ writer.WriteByte((byte) Type.Field);
+
+ fieldCmp.Validate();
+
+ writer.WriteInt(fieldCmp.FieldNames.Count);
+
+ foreach (var field in fieldCmp.FieldNames)
+ writer.WriteString(field);
+ }
+
+ /// <summary>
+ /// Reads an instance.
+ /// </summary>
+ /// <param name="reader">The reader.</param>
+ /// <returns></returns>
+ public static IEqualityComparer<IBinaryObject> Read(IBinaryRawReader reader)
+ {
+ var type = (Type) reader.ReadByte();
+
+ switch (type)
+ {
+ case Type.None:
+ return null;
+
+ case Type.Array:
+ return new BinaryArrayEqualityComparer();
+
+ case Type.Field:
+ return new BinaryFieldEqualityComparer
+ {
+ FieldNames = Enumerable.Range(0, reader.ReadInt()).Select(x => reader.ReadString()).ToArray()
+ };
+
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFieldEqualityComparer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFieldEqualityComparer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFieldEqualityComparer.cs
new file mode 100644
index 0000000..433657a
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFieldEqualityComparer.cs
@@ -0,0 +1,138 @@
+\ufeff/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Impl.Binary
+{
+ using System;
+ using System.Collections.Generic;
+ using System.Diagnostics;
+ using System.IO;
+ using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Common;
+ using Apache.Ignite.Core.Impl.Binary.IO;
+ using Apache.Ignite.Core.Impl.Common;
+
+ /// <summary>
+ /// Uses a set of binary object fields to calculate hash code and check equality.
+ /// Not implemented for now, will be done as part of IGNITE-4397.
+ /// </summary>
+ internal class BinaryFieldEqualityComparer : IEqualityComparer<IBinaryObject>, IBinaryEqualityComparer
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BinaryFieldEqualityComparer"/> class.
+ /// </summary>
+ public BinaryFieldEqualityComparer()
+ {
+ // No-op.
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BinaryFieldEqualityComparer"/> class.
+ /// </summary>
+ /// <param name="fieldNames">The field names for comparison.</param>
+ public BinaryFieldEqualityComparer(params string[] fieldNames)
+ {
+ IgniteArgumentCheck.NotNullOrEmpty(fieldNames, "fieldNames");
+
+ FieldNames = fieldNames;
+ }
+
+ /// <summary>
+ /// Gets or sets the field names to be used for equality comparison.
+ /// </summary>
+ public ICollection<string> FieldNames { get; set; }
+
+ /// <summary>
+ /// Determines whether the specified objects are equal.
+ /// </summary>
+ /// <param name="x">The first object to compare.</param>
+ /// <param name="y">The second object to compare.</param>
+ /// <returns>
+ /// true if the specified objects are equal; otherwise, false.
+ /// </returns>
+ public bool Equals(IBinaryObject x, IBinaryObject y)
+ {
+ throw new NotSupportedException(GetType() + "is not intended for direct usage.");
+ }
+
+ /// <summary>
+ /// Returns a hash code for this instance.
+ /// </summary>
+ /// <param name="obj">The object.</param>
+ /// <returns>
+ /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+ /// </returns>
+ public int GetHashCode(IBinaryObject obj)
+ {
+ throw new NotSupportedException(GetType() + "is not intended for direct usage.");
+ }
+
+ /** <inheritdoc /> */
+ int IBinaryEqualityComparer.GetHashCode(IBinaryStream stream, int startPos, int length,
+ BinaryObjectSchemaHolder schema, int schemaId, Marshaller marshaller, IBinaryTypeDescriptor desc)
+ {
+ Debug.Assert(stream != null);
+ Debug.Assert(startPos >= 0);
+ Debug.Assert(length >= 0);
+ Debug.Assert(schema != null);
+ Debug.Assert(marshaller != null);
+ Debug.Assert(desc != null);
+
+ Validate();
+
+ stream.Flush();
+
+ // Preserve stream position.
+ var pos = stream.Position;
+
+ var reader = marshaller.StartUnmarshal(stream, BinaryMode.ForceBinary);
+ var fields = schema.GetFullSchema(schemaId);
+
+ int hash = 0;
+
+ foreach (var fieldName in FieldNames)
+ {
+ int fieldId = BinaryUtils.FieldId(desc.TypeId, fieldName, desc.NameMapper, desc.IdMapper);
+ int fieldHash = 0; // Null (missing) field hash code is 0.
+ int fieldPos;
+
+ if (fields.TryGetValue(fieldId, out fieldPos))
+ {
+ stream.Seek(startPos + fieldPos - BinaryObjectHeader.Size, SeekOrigin.Begin);
+ var fieldVal = reader.Deserialize<object>();
+ fieldHash = fieldVal != null ? fieldVal.GetHashCode() : 0;
+ }
+
+ hash = 31 * hash + fieldHash;
+ }
+
+ // Restore stream position.
+ stream.Seek(pos, SeekOrigin.Begin);
+
+ return hash;
+ }
+
+ /// <summary>
+ /// Validates this instance.
+ /// </summary>
+ public void Validate()
+ {
+ if (FieldNames == null || FieldNames.Count == 0)
+ throw new IgniteException("BinaryFieldEqualityComparer.FieldNames can not be null or empty.");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFullTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFullTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFullTypeDescriptor.cs
index 6dc5d4d..d88e7a9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFullTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryFullTypeDescriptor.cs
@@ -20,6 +20,7 @@ namespace Apache.Ignite.Core.Impl.Binary
using System;
using System.Collections.Generic;
using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Common;
using Apache.Ignite.Core.Impl.Binary.Structure;
/// <summary>
@@ -66,6 +67,9 @@ namespace Apache.Ignite.Core.Impl.Binary
/** Enum flag. */
private readonly bool _isEnum;
+ /** Comparer. */
+ private readonly IBinaryEqualityComparer _equalityComparer;
+
/// <summary>
/// Constructor.
/// </summary>
@@ -79,6 +83,7 @@ namespace Apache.Ignite.Core.Impl.Binary
/// <param name="keepDeserialized">Whether to cache deserialized value in IBinaryObject</param>
/// <param name="affKeyFieldName">Affinity field key name.</param>
/// <param name="isEnum">Enum flag.</param>
+ /// <param name="comparer">Equality comparer.</param>
public BinaryFullTypeDescriptor(
Type type,
int typeId,
@@ -89,7 +94,8 @@ namespace Apache.Ignite.Core.Impl.Binary
IBinarySerializerInternal serializer,
bool keepDeserialized,
string affKeyFieldName,
- bool isEnum)
+ bool isEnum,
+ IEqualityComparer<IBinaryObject> comparer)
{
_type = type;
_typeId = typeId;
@@ -101,6 +107,13 @@ namespace Apache.Ignite.Core.Impl.Binary
_keepDeserialized = keepDeserialized;
_affKeyFieldName = affKeyFieldName;
_isEnum = isEnum;
+
+ _equalityComparer = comparer as IBinaryEqualityComparer;
+
+ if (comparer != null && _equalityComparer == null)
+ throw new IgniteException(string.Format("Unsupported IEqualityComparer<IBinaryObject> " +
+ "implementation: {0}. Only predefined implementations " +
+ "are supported.", comparer.GetType()));
}
/// <summary>
@@ -181,6 +194,12 @@ namespace Apache.Ignite.Core.Impl.Binary
get { return _isEnum; }
}
+ /** <inheritdoc/> */
+ public IBinaryEqualityComparer EqualityComparer
+ {
+ get { return _equalityComparer; }
+ }
+
/** <inheritDoc /> */
public BinaryStructure WriterTypeStructure
{
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
index 39a2f8b..0a14bd2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObject.cs
@@ -195,6 +195,14 @@ namespace Apache.Ignite.Core.Impl.Binary
get { return _offset; }
}
+ /// <summary>
+ /// Gets the header.
+ /// </summary>
+ public BinaryObjectHeader Header
+ {
+ get { return _header; }
+ }
+
public bool TryGetFieldPosition(string fieldName, out int pos)
{
var desc = _marsh.GetDescriptor(true, _header.TypeId);
@@ -244,6 +252,14 @@ namespace Apache.Ignite.Core.Impl.Binary
if (_data == that._data && _offset == that._offset)
return true;
+ if (TypeId != that.TypeId)
+ return false;
+
+ var desc = _marsh.GetDescriptor(true, TypeId);
+
+ if (desc != null && desc.EqualityComparer != null)
+ return desc.EqualityComparer.Equals(this, that);
+
// 1. Check headers
if (_header == that._header)
{
@@ -266,8 +282,21 @@ namespace Apache.Ignite.Core.Impl.Binary
object fieldVal = GetField<object>(field.Value, null);
object thatFieldVal = that.GetField<object>(that._fields[field.Key], null);
- if (!Equals(fieldVal, thatFieldVal))
+ var arr = fieldVal as Array;
+ var thatArr = thatFieldVal as Array;
+
+ if (arr != null && thatArr != null && arr.Length == thatArr.Length)
+ {
+ for (var i = 0; i < arr.Length; i++)
+ {
+ if (!Equals(arr.GetValue(i), thatArr.GetValue(i)))
+ return false;
+ }
+ }
+ else if (!Equals(fieldVal, thatFieldVal))
+ {
return false;
+ }
}
// 4. Check if objects have the same raw data.
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectBuilder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectBuilder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectBuilder.cs
index 1626a2d..db18638 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectBuilder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectBuilder.cs
@@ -55,7 +55,7 @@ namespace Apache.Ignite.Core.Impl.Binary
private IDictionary<int, BinaryBuilderField> _cache;
/** Hash code. */
- private int _hashCode;
+ private int? _hashCode;
/** Current context. */
private Context _ctx;
@@ -87,15 +87,21 @@ namespace Apache.Ignite.Core.Impl.Binary
BinaryObject obj, IBinaryTypeDescriptor desc)
{
Debug.Assert(binary != null);
- Debug.Assert(obj != null);
Debug.Assert(desc != null);
_binary = binary;
_parent = parent ?? this;
- _obj = obj;
_desc = desc;
- _hashCode = obj.GetHashCode();
+ if (obj != null)
+ {
+ _obj = obj;
+ _hashCode = obj.GetHashCode();
+ }
+ else
+ {
+ _obj = BinaryFromDescriptor(desc);
+ }
}
/** <inheritDoc /> */
@@ -508,7 +514,7 @@ namespace Apache.Ignite.Core.Impl.Binary
BinaryHeapStream inStream,
BinaryHeapStream outStream,
IBinaryTypeDescriptor desc,
- int hashCode,
+ int? hashCode,
IDictionary<string, BinaryBuilderField> vals)
{
// Set correct builder to writer frame.
@@ -578,7 +584,7 @@ namespace Apache.Ignite.Core.Impl.Binary
/// <param name="vals">Values to be replaced.</param>
/// <returns>Mutated object.</returns>
private void Mutate0(Context ctx, BinaryHeapStream inStream, IBinaryStream outStream,
- bool changeHash, int hash, IDictionary<int, BinaryBuilderField> vals)
+ bool changeHash, int? hash, IDictionary<int, BinaryBuilderField> vals)
{
int inStartPos = inStream.Position;
int outStartPos = outStream.Position;
@@ -730,7 +736,25 @@ namespace Apache.Ignite.Core.Impl.Binary
var outLen = outStream.Position - outStartPos;
- var outHash = changeHash ? hash : inHeader.HashCode;
+ var outHash = inHeader.HashCode;
+
+ if (changeHash)
+ {
+ if (hash != null)
+ {
+ outHash = hash.Value;
+ }
+ else
+ {
+ // Get from identity resolver.
+ outHash = _desc.EqualityComparer != null
+ ? _desc.EqualityComparer.GetHashCode(outStream,
+ outStartPos + BinaryObjectHeader.Size,
+ schemaPos - outStartPos - BinaryObjectHeader.Size,
+ outSchema, outSchemaId, _binary.Marshaller, _desc)
+ : 0;
+ }
+ }
var outHeader = new BinaryObjectHeader(inHeader.TypeId, outHash, outLen,
outSchemaId, outSchemaOff, flags);
@@ -1027,6 +1051,30 @@ namespace Apache.Ignite.Core.Impl.Binary
}
/// <summary>
+ /// Create empty binary object from descriptor.
+ /// </summary>
+ /// <param name="desc">Descriptor.</param>
+ /// <returns>Empty binary object.</returns>
+ private BinaryObject BinaryFromDescriptor(IBinaryTypeDescriptor desc)
+ {
+ const int len = BinaryObjectHeader.Size;
+
+ var flags = desc.UserType ? BinaryObjectHeader.Flag.UserType : BinaryObjectHeader.Flag.None;
+
+ if (_binary.Marshaller.CompactFooter && desc.UserType)
+ flags |= BinaryObjectHeader.Flag.CompactFooter;
+
+ var hdr = new BinaryObjectHeader(desc.TypeId, 0, len, 0, len, flags);
+
+ using (var stream = new BinaryHeapStream(len))
+ {
+ BinaryObjectHeader.Write(hdr, stream, 0);
+
+ return new BinaryObject(_binary.Marshaller, stream.InternalArray, 0, hdr);
+ }
+ }
+
+ /// <summary>
/// Mutation context.
/// </summary>
private class Context
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectHeader.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectHeader.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectHeader.cs
index 0e5ad2a..636b177 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectHeader.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectHeader.cs
@@ -211,21 +211,40 @@ namespace Apache.Ignite.Core.Impl.Binary
/// Gets the raw offset of this object in specified stream.
/// </summary>
/// <param name="stream">The stream.</param>
- /// <param name="position">The position.</param>
+ /// <param name="position">The binary object position in the stream.</param>
/// <returns>Raw offset.</returns>
public int GetRawOffset(IBinaryStream stream, int position)
{
Debug.Assert(stream != null);
+ // Either schema or raw is not present - offset is in the header.
if (!HasRaw || !HasSchema)
return SchemaOffset;
+ // Both schema and raw data are present: raw offset is in the last 4 bytes.
stream.Seek(position + Length - 4, SeekOrigin.Begin);
return stream.ReadInt();
}
/// <summary>
+ /// Gets the footer offset where raw and non-raw data ends.
+ /// </summary>
+ /// <value>Footer offset.</value>
+ public int FooterStartOffset
+ {
+ get
+ {
+ // No schema: all we have is data. There is no offset in last 4 bytes.
+ if (!HasSchema)
+ return Length;
+
+ // There is schema. Regardless of raw data presence, footer starts with schema.
+ return SchemaOffset;
+ }
+ }
+
+ /// <summary>
/// Writes specified header to a stream.
/// </summary>
/// <param name="header">The header.</param>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectSchemaHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectSchemaHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectSchemaHolder.cs
index c95746a..8ad78a4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectSchemaHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryObjectSchemaHolder.cs
@@ -18,6 +18,7 @@
namespace Apache.Ignite.Core.Impl.Binary
{
using System;
+ using System.Collections.Generic;
using System.Threading;
using Apache.Ignite.Core.Impl.Binary.IO;
using Apache.Ignite.Core.Impl.Common;
@@ -119,5 +120,26 @@ namespace Apache.Ignite.Core.Impl.Binary
return result;
}
+
+ /// <summary>
+ /// Gets the schema.
+ /// </summary>
+ /// <param name="schemaOffset">The schema offset.</param>
+ /// <returns>Current schema as a dictionary.</returns>
+ public Dictionary<int, int> GetFullSchema(int schemaOffset)
+ {
+ var size = _idx - schemaOffset;
+
+ var result = new Dictionary<int, int>(size);
+
+ for (int i = schemaOffset; i < _idx; i++)
+ {
+ var fld = _fields[i];
+
+ result[fld.Id] = fld.Offset;
+ }
+
+ return result;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySurrogateTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySurrogateTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySurrogateTypeDescriptor.cs
index b572e7c..adba577 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySurrogateTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySurrogateTypeDescriptor.cs
@@ -130,6 +130,12 @@ namespace Apache.Ignite.Core.Impl.Binary
get { return false; }
}
+ /** <inheritdoc/> */
+ public IBinaryEqualityComparer EqualityComparer
+ {
+ get { return null; }
+ }
+
/** <inheritDoc /> */
public BinaryStructure WriterTypeStructure
{
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySystemHandlers.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySystemHandlers.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySystemHandlers.cs
index ccb2d1b..bdd7137 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySystemHandlers.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinarySystemHandlers.cs
@@ -614,7 +614,9 @@ namespace Apache.Ignite.Core.Impl.Binary
*/
private static object ReadEnumArray(BinaryReader ctx, Type type)
{
- return BinaryUtils.ReadTypedArray(ctx, true, type.GetElementType());
+ var elemType = type.GetElementType() ?? typeof(object);
+
+ return BinaryUtils.ReadTypedArray(ctx, true, elemType);
}
/**
@@ -622,7 +624,7 @@ namespace Apache.Ignite.Core.Impl.Binary
*/
private static object ReadArray(BinaryReader ctx, Type type)
{
- var elemType = type.IsArray ? type.GetElementType() : typeof(object);
+ var elemType = type.GetElementType() ?? typeof(object);
return BinaryUtils.ReadTypedArray(ctx, true, elemType);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
index 77a22dd..47b0663 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
@@ -1195,9 +1195,10 @@ namespace Apache.Ignite.Core.Impl.Binary
{
// Write object fields.
desc.Serializer.WriteBinary(obj, this);
+ var dataEnd = _stream.Position;
// Write schema
- var schemaOffset = _stream.Position - pos;
+ var schemaOffset = dataEnd - pos;
int schemaId;
@@ -1230,8 +1231,12 @@ namespace Apache.Ignite.Core.Impl.Binary
var len = _stream.Position - pos;
- var header = new BinaryObjectHeader(desc.TypeId, obj.GetHashCode(), len,
- schemaId, schemaOffset, flags);
+ var hashCode = desc.EqualityComparer != null
+ ? desc.EqualityComparer.GetHashCode(Stream, pos + BinaryObjectHeader.Size,
+ dataEnd - pos - BinaryObjectHeader.Size, _schema, schemaIdx, _marsh, desc)
+ : obj.GetHashCode();
+
+ var header = new BinaryObjectHeader(desc.TypeId, hashCode, len, schemaId, schemaOffset, flags);
BinaryObjectHeader.Write(header, _stream, pos);
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/DateTimeHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/DateTimeHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/DateTimeHolder.cs
index b80348e..6adb847 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/DateTimeHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/DateTimeHolder.cs
@@ -24,7 +24,7 @@ namespace Apache.Ignite.Core.Impl.Binary
/// <summary>
/// Wraps DateTime item in a binarizable.
/// </summary>
- internal class DateTimeHolder : IBinaryWriteAware
+ internal struct DateTimeHolder : IBinaryWriteAware
{
/** */
private readonly DateTime _item;
@@ -64,5 +64,18 @@ namespace Apache.Ignite.Core.Impl.Binary
writer.GetRawWriter().WriteLong(_item.ToBinary());
}
+
+ /** <inheritDoc /> */
+ public override bool Equals(object obj)
+ {
+ if (ReferenceEquals(null, obj)) return false;
+ return obj is DateTimeHolder && _item.Equals(((DateTimeHolder) obj)._item);
+ }
+
+ /** <inheritDoc /> */
+ public override int GetHashCode()
+ {
+ return _item.GetHashCode();
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryEqualityComparer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryEqualityComparer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryEqualityComparer.cs
new file mode 100644
index 0000000..9628688
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryEqualityComparer.cs
@@ -0,0 +1,53 @@
+\ufeff/*
+ * 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.
+ */
+
+namespace Apache.Ignite.Core.Impl.Binary
+{
+ using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Impl.Binary.IO;
+
+ /// <summary>
+ /// Internal comparer interface for <see cref="BinaryTypeConfiguration.EqualityComparer"/> implementations,
+ /// provides more efficient API.
+ /// </summary>
+ internal interface IBinaryEqualityComparer
+ {
+ /// <summary>
+ /// Returns a hash code for the binary object in specified stream at specified position.
+ /// </summary>
+ /// <param name="stream">Stream.</param>
+ /// <param name="startPos">Data start position (right after the header).</param>
+ /// <param name="length">Data length (without header and schema).</param>
+ /// <param name="schema">Schema holder.</param>
+ /// <param name="schemaId">Schema identifier.</param>
+ /// <param name="marshaller">Marshaller.</param>
+ /// <param name="desc">Type descriptor.</param>
+ /// <returns>
+ /// A hash code for the object in the stream.
+ /// </returns>
+ int GetHashCode(IBinaryStream stream, int startPos, int length, BinaryObjectSchemaHolder schema, int schemaId,
+ Marshaller marshaller, IBinaryTypeDescriptor desc);
+
+ /// <summary>
+ /// Returns a value indicating that two binary object are equal.
+ /// </summary>
+ /// <param name="x">First object.</param>
+ /// <param name="y">Second object.</param>
+ /// <returns>True when objects are equal; otherwise false.</returns>
+ bool Equals(IBinaryObject x, IBinaryObject y);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryTypeDescriptor.cs
index e25d720..6c7e360 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/IBinaryTypeDescriptor.cs
@@ -78,6 +78,11 @@ namespace Apache.Ignite.Core.Impl.Binary
bool IsEnum { get; }
/// <summary>
+ /// Gets the equality comparer.
+ /// </summary>
+ IBinaryEqualityComparer EqualityComparer { get; }
+
+ /// <summary>
/// Write type structure.
/// </summary>
BinaryStructure WriterTypeStructure { get; }
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryHeapStream.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryHeapStream.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryHeapStream.cs
index 2ce2138..ad35ff9 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryHeapStream.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryHeapStream.cs
@@ -420,6 +420,15 @@ namespace Apache.Ignite.Core.Impl.Binary.IO
}
/** <inheritdoc /> */
+ public override T Apply<TArg, T>(IBinaryStreamProcessor<TArg, T> proc, TArg arg)
+ {
+ fixed (byte* data0 = _data)
+ {
+ return proc.Invoke(data0, arg);
+ }
+ }
+
+ /** <inheritdoc /> */
protected override void Dispose(bool disposing)
{
// No-op.
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryStreamBase.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryStreamBase.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryStreamBase.cs
index 184209f..0b855f8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryStreamBase.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/BinaryStreamBase.cs
@@ -1119,6 +1119,19 @@ namespace Apache.Ignite.Core.Impl.Binary.IO
return Pos;
}
+ /// <summary>
+ /// Returns a hash code for the specified byte range.
+ /// </summary>
+ public abstract T Apply<TArg, T>(IBinaryStreamProcessor<TArg, T> proc, TArg arg);
+
+ /// <summary>
+ /// Flushes the data to underlying storage.
+ /// </summary>
+ public void Flush()
+ {
+ // No-op.
+ }
+
/** <inheritdoc /> */
public void Dispose()
{
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/IBinaryStream.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/IBinaryStream.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/IBinaryStream.cs
index cd509c6..3a46515 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/IBinaryStream.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Io/IBinaryStream.cs
@@ -318,5 +318,30 @@ namespace Apache.Ignite.Core.Impl.Binary.IO
/// <param name="origin">Seek origin.</param>
/// <returns>Position.</returns>
int Seek(int offset, SeekOrigin origin);
+
+ /// <summary>
+ /// Applies specified processor to the raw stream data.
+ /// </summary>
+ T Apply<TArg, T>(IBinaryStreamProcessor<TArg, T> proc, TArg arg);
+
+ /// <summary>
+ /// Flushes the data to underlying storage.
+ /// </summary>
+ void Flush();
+ }
+
+ /// <summary>
+ /// Binary stream processor.
+ /// </summary>
+ [CLSCompliant(false)]
+ public unsafe interface IBinaryStreamProcessor<in TArg, out T>
+ {
+ /// <summary>
+ /// Invokes the processor.
+ /// </summary>
+ /// <param name="data">Data.</param>
+ /// <param name="arg">Argument.</param>
+ /// <returns>Result.</returns>
+ T Invoke(byte* data, TArg arg);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
index 475762a..6dee998 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
@@ -408,7 +408,7 @@ namespace Apache.Ignite.Core.Impl.Binary
if (meta != BinaryType.Empty)
{
desc = new BinaryFullTypeDescriptor(null, meta.TypeId, meta.TypeName, true, null, null, null, false,
- meta.AffinityKeyFieldName, meta.IsEnum);
+ meta.AffinityKeyFieldName, meta.IsEnum, null);
_idToDesc.GetOrAdd(typeKey, _ => desc);
@@ -419,6 +419,14 @@ namespace Apache.Ignite.Core.Impl.Binary
}
/// <summary>
+ /// Gets the user type descriptors.
+ /// </summary>
+ public ICollection<IBinaryTypeDescriptor> GetUserTypeDescriptors()
+ {
+ return _typeNameToDesc.Values;
+ }
+
+ /// <summary>
/// Add user type.
/// </summary>
/// <param name="cfg">Configuration.</param>
@@ -453,7 +461,7 @@ namespace Apache.Ignite.Core.Impl.Binary
var serializer = GetSerializer(cfg, typeCfg, type, typeId, nameMapper, idMapper);
AddType(type, typeId, typeName, true, keepDeserialized, nameMapper, idMapper, serializer,
- affKeyFld, type.IsEnum);
+ affKeyFld, type.IsEnum, typeCfg.EqualityComparer);
}
else
{
@@ -463,7 +471,7 @@ namespace Apache.Ignite.Core.Impl.Binary
int typeId = BinaryUtils.TypeId(typeName, nameMapper, idMapper);
AddType(null, typeId, typeName, true, keepDeserialized, nameMapper, idMapper, null,
- typeCfg.AffinityKeyFieldName, typeCfg.IsEnum);
+ typeCfg.AffinityKeyFieldName, typeCfg.IsEnum, typeCfg.EqualityComparer);
}
}
@@ -521,9 +529,11 @@ namespace Apache.Ignite.Core.Impl.Binary
/// <param name="serializer">Serializer.</param>
/// <param name="affKeyFieldName">Affinity key field name.</param>
/// <param name="isEnum">Enum flag.</param>
+ /// <param name="comparer">Comparer.</param>
private void AddType(Type type, int typeId, string typeName, bool userType,
bool keepDeserialized, IBinaryNameMapper nameMapper, IBinaryIdMapper idMapper,
- IBinarySerializerInternal serializer, string affKeyFieldName, bool isEnum)
+ IBinarySerializerInternal serializer, string affKeyFieldName, bool isEnum,
+ IEqualityComparer<IBinaryObject> comparer)
{
long typeKey = BinaryUtils.TypeKey(userType, typeId);
@@ -545,7 +555,7 @@ namespace Apache.Ignite.Core.Impl.Binary
throw new BinaryObjectException("Conflicting type name: " + typeName);
var descriptor = new BinaryFullTypeDescriptor(type, typeId, typeName, userType, nameMapper, idMapper,
- serializer, keepDeserialized, affKeyFieldName, isEnum);
+ serializer, keepDeserialized, affKeyFieldName, isEnum, comparer);
if (type != null)
_typeToDesc[type] = descriptor;
@@ -571,7 +581,7 @@ namespace Apache.Ignite.Core.Impl.Binary
typeId = BinaryUtils.TypeId(type.Name, null, null);
AddType(type, typeId, BinaryUtils.GetTypeName(type), false, false, null, null, serializer, affKeyFldName,
- false);
+ false, null);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/SerializableObjectHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/SerializableObjectHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/SerializableObjectHolder.cs
index 99c8f49..26b1d5f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/SerializableObjectHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/SerializableObjectHolder.cs
@@ -76,5 +76,21 @@ namespace Apache.Ignite.Core.Impl.Binary
_item = new BinaryFormatter().Deserialize(streamAdapter, null);
}
}
+
+ /** <inheritdoc /> */
+ public override bool Equals(object obj)
+ {
+ if (ReferenceEquals(null, obj)) return false;
+ if (ReferenceEquals(this, obj)) return true;
+ if (obj.GetType() != GetType()) return false;
+
+ return Equals(_item, ((SerializableObjectHolder) obj)._item);
+ }
+
+ /** <inheritdoc /> */
+ public override int GetHashCode()
+ {
+ return _item != null ? _item.GetHashCode() : 0;
+ }
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs
index e1df50b..bb9cbfc 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/IgniteConfigurationXmlSerializer.cs
@@ -142,7 +142,7 @@ namespace Apache.Ignite.Core.Impl.Common
/// </summary>
private static void WriteComplexProperty(object obj, XmlWriter writer, Type valueType)
{
- var props = GetNonDefaultProperties(obj).ToList();
+ var props = GetNonDefaultProperties(obj).OrderBy(x => x.Name).ToList();
// Specify type for interfaces and abstract classes
if (valueType.IsAbstract)
@@ -353,7 +353,8 @@ namespace Apache.Ignite.Core.Impl.Common
/// </summary>
private static List<Type> GetConcreteDerivedTypes(Type type)
{
- return type.Assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && type.IsAssignableFrom(t)).ToList();
+ return typeof(IIgnite).Assembly.GetTypes()
+ .Where(t => t.IsClass && !t.IsAbstract && type.IsAssignableFrom(t)).ToList();
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/b7908d7a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Memory/PlatformMemoryStream.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Memory/PlatformMemoryStream.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Memory/PlatformMemoryStream.cs
index c758d28..3719846 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Memory/PlatformMemoryStream.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Memory/PlatformMemoryStream.cs
@@ -732,6 +732,22 @@ namespace Apache.Ignite.Core.Impl.Memory
}
/// <summary>
+ /// Returns a hash code for the specified byte range.
+ /// </summary>
+ public T Apply<TArg, T>(IBinaryStreamProcessor<TArg, T> proc, TArg arg)
+ {
+ return proc.Invoke(_data, arg);
+ }
+
+ /// <summary>
+ /// Flushes the data to underlying storage.
+ /// </summary>
+ public void Flush()
+ {
+ SynchronizeOutput();
+ }
+
+ /// <summary>
/// Ensure capacity for write and shift position.
/// </summary>
/// <param name="cnt">Bytes count.</param>
[08/12] ignite git commit: IGNITE-4424 REPLICATED cache isn't synced
across nodes
Posted by yz...@apache.org.
IGNITE-4424 REPLICATED cache isn't synced across nodes
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/82dd9128
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/82dd9128
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/82dd9128
Branch: refs/heads/ignite-comm-balance-master
Commit: 82dd912889b0dfca213edb1374c1fa0ed79411fd
Parents: 27ba69b
Author: Anton Vinogradov <av...@apache.org>
Authored: Fri Dec 30 13:41:34 2016 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Mon Jan 16 12:18:14 2017 +0300
----------------------------------------------------------------------
.../GridNearAtomicAbstractUpdateFuture.java | 34 ++-
.../GridNearAtomicSingleUpdateFuture.java | 44 ++--
.../dht/atomic/GridNearAtomicUpdateFuture.java | 57 ++---
.../AtomicPutAllChangingTopologyTest.java | 212 +++++++++++++++++++
.../IgniteCacheFailoverTestSuite.java | 3 +
5 files changed, 284 insertions(+), 66 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/82dd9128/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
index 2fbabaa..c92e0f5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
@@ -212,14 +212,18 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridFutureAdapt
// Cannot remap.
remapCnt = 1;
- map(topVer);
+ GridCacheVersion futVer = addAtomicFuture(topVer);
+
+ if (futVer != null)
+ map(topVer, futVer);
}
}
/**
* @param topVer Topology version.
+ * @param futVer Future version
*/
- protected abstract void map(AffinityTopologyVersion topVer);
+ protected abstract void map(AffinityTopologyVersion topVer, GridCacheVersion futVer);
/**
* Maps future on ready topology.
@@ -302,7 +306,7 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridFutureAdapt
* @param req Request.
* @param e Error.
*/
- protected void onSendError(GridNearAtomicAbstractUpdateRequest req, IgniteCheckedException e) {
+ protected final void onSendError(GridNearAtomicAbstractUpdateRequest req, IgniteCheckedException e) {
synchronized (mux) {
GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(cctx.cacheId(),
req.nodeId(),
@@ -314,4 +318,28 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridFutureAdapt
onResult(req.nodeId(), res, true);
}
}
+
+ /**
+ * Adds future prevents topology change before operation complete.
+ * Should be invoked before topology lock released.
+ *
+ * @param topVer Topology version.
+ * @return Future version in case future added.
+ */
+ protected final GridCacheVersion addAtomicFuture(AffinityTopologyVersion topVer) {
+ GridCacheVersion futVer = cctx.versions().next(topVer);
+
+ synchronized (mux) {
+ assert this.futVer == null : this;
+ assert this.topVer == AffinityTopologyVersion.ZERO : this;
+
+ this.topVer = topVer;
+ this.futVer = futVer;
+ }
+
+ if (storeFuture() && !cctx.mvcc().addAtomicFuture(futVer, this))
+ return null;
+
+ return futVer;
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/82dd9128/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
index bd231cf..7376aff 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
@@ -348,14 +348,7 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
@Override public void apply(final IgniteInternalFuture<AffinityTopologyVersion> fut) {
cctx.kernalContext().closure().runLocalSafe(new Runnable() {
@Override public void run() {
- try {
- AffinityTopologyVersion topVer = fut.get();
-
- map(topVer);
- }
- catch (IgniteCheckedException e) {
- onDone(e);
- }
+ mapOnTopology();
}
});
}
@@ -388,7 +381,9 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
@Override protected void mapOnTopology() {
cache.topology().readLock();
- AffinityTopologyVersion topVer = null;
+ AffinityTopologyVersion topVer;
+
+ GridCacheVersion futVer;
try {
if (cache.topology().stopping()) {
@@ -410,6 +405,8 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
}
topVer = fut.topologyVersion();
+
+ futVer = addAtomicFuture(topVer);
}
else {
if (waitTopFut) {
@@ -435,11 +432,12 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
cache.topology().readUnlock();
}
- map(topVer);
+ if (futVer != null)
+ map(topVer, futVer);
}
/** {@inheritDoc} */
- protected void map(AffinityTopologyVersion topVer) {
+ @Override protected void map(AffinityTopologyVersion topVer, GridCacheVersion futVer) {
Collection<ClusterNode> topNodes = CU.affinityNodes(cctx, topVer);
if (F.isEmpty(topNodes)) {
@@ -449,11 +447,6 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
return;
}
- Exception err = null;
- GridNearAtomicAbstractUpdateRequest singleReq0 = null;
-
- GridCacheVersion futVer = cctx.versions().next(topVer);
-
GridCacheVersion updVer;
// Assign version on near node in CLOCK ordering mode even if fastMap is false.
@@ -470,16 +463,17 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
else
updVer = null;
+ Exception err = null;
+ GridNearAtomicAbstractUpdateRequest singleReq0 = null;
+
try {
singleReq0 = mapSingleUpdate(topVer, futVer, updVer);
synchronized (mux) {
- assert this.futVer == null : this;
- assert this.topVer == AffinityTopologyVersion.ZERO : this;
+ assert this.futVer == futVer || (this.isDone() && this.error() != null);
+ assert this.topVer == topVer;
- this.topVer = topVer;
this.updVer = updVer;
- this.futVer = futVer;
resCnt = 0;
@@ -496,14 +490,6 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
return;
}
- if (storeFuture()) {
- if (!cctx.mvcc().addAtomicFuture(futVer, this)) {
- assert isDone() : this;
-
- return;
- }
- }
-
// Optimize mapping for single key.
mapSingle(singleReq0.nodeId(), singleReq0);
}
@@ -511,7 +497,7 @@ public class GridNearAtomicSingleUpdateFuture extends GridNearAtomicAbstractUpda
/**
* @return Future version.
*/
- GridCacheVersion onFutureDone() {
+ private GridCacheVersion onFutureDone() {
GridCacheVersion ver0;
GridFutureAdapter<Void> fut0;
http://git-wip-us.apache.org/repos/asf/ignite/blob/82dd9128/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
index cd64117..950e5bd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
@@ -456,14 +456,7 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
@Override public void apply(final IgniteInternalFuture<AffinityTopologyVersion> fut) {
cctx.kernalContext().closure().runLocalSafe(new Runnable() {
@Override public void run() {
- try {
- AffinityTopologyVersion topVer = fut.get();
-
- map(topVer, remapKeys);
- }
- catch (IgniteCheckedException e) {
- onDone(e);
- }
+ mapOnTopology();
}
});
}
@@ -497,7 +490,9 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
@Override protected void mapOnTopology() {
cache.topology().readLock();
- AffinityTopologyVersion topVer = null;
+ AffinityTopologyVersion topVer;
+
+ GridCacheVersion futVer;
try {
if (cache.topology().stopping()) {
@@ -519,6 +514,8 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
}
topVer = fut.topologyVersion();
+
+ futVer = addAtomicFuture(topVer);
}
else {
if (waitTopFut) {
@@ -544,7 +541,8 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
cache.topology().readUnlock();
}
- map(topVer, null);
+ if (futVer != null)
+ map(topVer, futVer, remapKeys);
}
/**
@@ -602,15 +600,18 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
}
/** {@inheritDoc} */
- protected void map(AffinityTopologyVersion topVer) {
- map(topVer, null);
+ @Override protected void map(AffinityTopologyVersion topVer, GridCacheVersion futVer) {
+ map(topVer, futVer, null);
}
/**
* @param topVer Topology version.
+ * @param futVer Future ID.
* @param remapKeys Keys to remap.
*/
- void map(AffinityTopologyVersion topVer, @Nullable Collection<KeyCacheObject> remapKeys) {
+ void map(AffinityTopologyVersion topVer,
+ GridCacheVersion futVer,
+ @Nullable Collection<KeyCacheObject> remapKeys) {
Collection<ClusterNode> topNodes = CU.affinityNodes(cctx, topVer);
if (F.isEmpty(topNodes)) {
@@ -620,14 +621,6 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
return;
}
- Exception err = null;
- GridNearAtomicFullUpdateRequest singleReq0 = null;
- Map<UUID, GridNearAtomicFullUpdateRequest> mappings0 = null;
-
- int size = keys.size();
-
- GridCacheVersion futVer = cctx.versions().next(topVer);
-
GridCacheVersion updVer;
// Assign version on near node in CLOCK ordering mode even if fastMap is false.
@@ -644,6 +637,12 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
else
updVer = null;
+ Exception err = null;
+ GridNearAtomicFullUpdateRequest singleReq0 = null;
+ Map<UUID, GridNearAtomicFullUpdateRequest> mappings0 = null;
+
+ int size = keys.size();
+
try {
if (size == 1 && !fastMap) {
assert remapKeys == null || remapKeys.size() == 1;
@@ -676,12 +675,10 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
}
synchronized (mux) {
- assert this.futVer == null : this;
- assert this.topVer == AffinityTopologyVersion.ZERO : this;
+ assert this.futVer == futVer || (this.isDone() && this.error() != null);
+ assert this.topVer == topVer;
- this.topVer = topVer;
this.updVer = updVer;
- this.futVer = futVer;
resCnt = 0;
@@ -701,14 +698,6 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
return;
}
- if (storeFuture()) {
- if (!cctx.mvcc().addAtomicFuture(futVer, this)) {
- assert isDone() : this;
-
- return;
- }
- }
-
// Optimize mapping for single key.
if (singleReq0 != null)
mapSingle(singleReq0.nodeId(), singleReq0);
@@ -725,7 +714,7 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
/**
* @return Future version.
*/
- GridCacheVersion onFutureDone() {
+ private GridCacheVersion onFutureDone() {
GridCacheVersion ver0;
GridFutureAdapter<Void> fut0;
http://git-wip-us.apache.org/repos/asf/ignite/blob/82dd9128/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/AtomicPutAllChangingTopologyTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/AtomicPutAllChangingTopologyTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/AtomicPutAllChangingTopologyTest.java
new file mode 100644
index 0000000..878cb17
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/AtomicPutAllChangingTopologyTest.java
@@ -0,0 +1,212 @@
+/*
+ * 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.dht.atomic;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.affinity.fair.FairAffinityFunction;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.util.typedef.internal.U;
+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;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+import static org.apache.ignite.cache.CachePeekMode.BACKUP;
+import static org.apache.ignite.cache.CachePeekMode.PRIMARY;
+import static org.apache.ignite.cache.CacheRebalanceMode.SYNC;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/** */
+public class AtomicPutAllChangingTopologyTest extends GridCommonAbstractTest {
+ /** */
+ private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+
+ /** */
+ private static final int NODES_CNT = 3;
+
+ /** */
+ public static final String CACHE_NAME = "test-cache";
+
+ /** */
+ private static final int CACHE_SIZE = 20_000;
+
+ /** */
+ private static volatile CountDownLatch FILLED_LATCH;
+
+ /**
+ * @return Cache configuration.
+ */
+ private CacheConfiguration<Integer, Integer> cacheConfig() {
+ return new CacheConfiguration<Integer, Integer>()
+ .setAtomicityMode(ATOMIC)
+ .setCacheMode(REPLICATED)
+ .setAffinity(new FairAffinityFunction(false, 1))
+ .setWriteSynchronizationMode(FULL_SYNC)
+ .setRebalanceMode(SYNC)
+ .setName(CACHE_NAME);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+ ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
+
+ return cfg;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testPutAllOnChangingTopology() throws Exception {
+ List<IgniteInternalFuture> futs = new LinkedList<>();
+
+ for (int i = 1; i < NODES_CNT; i++)
+ futs.add(startNodeAsync(i));
+
+ futs.add(startSeedNodeAsync());
+
+ boolean failed = false;
+
+ for (IgniteInternalFuture fut : futs) {
+ try {
+ fut.get();
+ }
+ catch (Throwable th) {
+ log.error("Check failed.", th);
+
+ failed = true;
+ }
+ }
+
+ if (failed)
+ throw new RuntimeException("Test Failed.");
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ FILLED_LATCH = new CountDownLatch(1);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ super.afterTest();
+
+ stopAllGrids();
+ }
+
+ /**
+ * @return Future.
+ * @throws IgniteCheckedException If failed.
+ */
+ private IgniteInternalFuture startSeedNodeAsync() throws IgniteCheckedException {
+ return GridTestUtils.runAsync(new Callable<Object>() {
+ @Override public Boolean call() throws Exception {
+ Ignite node = startGrid(0);
+
+ log.info("Creating cache.");
+
+ IgniteCache<Integer, Integer> cache = node.getOrCreateCache(cacheConfig());
+
+ log.info("Created cache.");
+
+ Map<Integer, Integer> data = new HashMap<>(CACHE_SIZE);
+
+ for (int i = 0; i < CACHE_SIZE; i++)
+ data.put(i, i);
+
+ log.info("Filling.");
+
+ cache.putAll(data);
+
+ log.info("Filled.");
+
+ FILLED_LATCH.countDown();
+
+ checkCacheState(node, cache);
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * @param nodeId Node index.
+ * @return Future.
+ * @throws IgniteCheckedException If failed.
+ */
+ private IgniteInternalFuture startNodeAsync(final int nodeId) throws IgniteCheckedException {
+ return GridTestUtils.runAsync(new Callable<Object>() {
+ @Override public Boolean call() throws Exception {
+ Ignite node = startGrid(nodeId);
+
+ log.info("Getting cache.");
+
+ IgniteCache<Integer, Integer> cache = node.getOrCreateCache(cacheConfig());
+
+ log.info("Got cache.");
+
+ FILLED_LATCH.await();
+
+ log.info("Got Filled.");
+
+ cache.put(1, nodeId);
+
+ checkCacheState(node, cache);
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * @param node Node.
+ * @param cache Cache.
+ * @throws Exception If failed.
+ */
+ private void checkCacheState(Ignite node, IgniteCache<Integer, Integer> cache) throws Exception {
+ int locSize = cache.localSize(PRIMARY, BACKUP);
+ int locSize2 = -1;
+
+ if (locSize != CACHE_SIZE) {
+ U.sleep(5000);
+
+ // Rechecking.
+ locSize2 = cache.localSize(PRIMARY, BACKUP);
+ }
+
+ assertEquals("Wrong cache size on node [node=" + node.configuration().getGridName() +
+ ", expected= " + CACHE_SIZE +
+ ", actual=" + locSize +
+ ", actual2=" + locSize2 + "]",
+ locSize, CACHE_SIZE);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/82dd9128/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
index 26cea39..986b8d4 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFailoverTestSuite.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheDhtR
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCacheTxNodeFailureSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridNearCacheTxNodeFailureSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.IgniteAtomicLongChangingTopologySelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicPutAllChangingTopologyTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientInvalidPartitionHandlingSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicClientRemoveFailureTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridCacheAtomicInvalidPartitionHandlingSelfTest;
@@ -97,6 +98,8 @@ public class IgniteCacheFailoverTestSuite extends TestSuite {
suite.addTestSuite(GridCacheTxNodeFailureSelfTest.class);
suite.addTestSuite(GridNearCacheTxNodeFailureSelfTest.class);
+ suite.addTestSuite(AtomicPutAllChangingTopologyTest.class);
+
return suite;
}
}
[12/12] ignite git commit: merge from master
Posted by yz...@apache.org.
merge from master
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ecd727c4
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ecd727c4
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ecd727c4
Branch: refs/heads/ignite-comm-balance-master
Commit: ecd727c4df9d9f53ece4a24182d964102e2c1508
Parents: 18229e8 b7908d7
Author: Yakov Zhdanov <yz...@gridgain.com>
Authored: Mon Jan 16 18:21:10 2017 +0300
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Mon Jan 16 18:21:10 2017 +0300
----------------------------------------------------------------------
.../ignite/cache/query/SqlFieldsQuery.java | 6 +
.../store/jdbc/dialect/BasicJdbcDialect.java | 31 +-
.../GridClientConnectionManagerAdapter.java | 7 +-
.../impl/connection/GridClientTopology.java | 53 +++-
.../GridNearAtomicAbstractUpdateFuture.java | 34 ++-
.../GridNearAtomicSingleUpdateFuture.java | 48 ++-
.../dht/atomic/GridNearAtomicUpdateFuture.java | 61 ++--
.../IgniteCacheObjectProcessorImpl.java | 5 +-
.../utils/PlatformConfigurationUtils.java | 128 +++++++-
.../processors/query/GridQueryProcessor.java | 2 +-
.../store/jdbc/CacheJdbcPojoStoreTest.java | 48 ++-
.../ignite/cache/store/jdbc/model/Person.java | 2 +-
.../cache/CacheEntryProcessorCopySelfTest.java | 6 +-
.../cache/GridCacheBasicStoreAbstractTest.java | 2 +-
.../GridCacheDhtEvictionsDisabledSelfTest.java | 5 +-
.../AtomicPutAllChangingTopologyTest.java | 212 +++++++++++++
.../IgniteCacheFailoverTestSuite.java | 3 +
.../apache/ignite/stream/flume/IgniteSink.java | 7 +-
.../hadoop/impl/v2/HadoopV2TaskContext.java | 7 -
...niteCacheAbstractInsertSqlQuerySelfTest.java | 14 +-
.../IgniteCacheAbstractSqlDmlQuerySelfTest.java | 6 +-
.../IgniteCacheInsertSqlQuerySelfTest.java | 18 +-
.../cache/IgniteCacheMergeSqlQuerySelfTest.java | 14 +-
.../IgniteCacheUpdateSqlQuerySelfTest.java | 4 +-
.../Apache.Ignite.Core.Tests.csproj | 3 +
.../Binary/BinaryBuilderSelfTest.cs | 159 ++++++----
.../BinaryBuilderSelfTestArrayIdentity.cs | 34 +++
.../Binary/BinaryEqualityComparerTest.cs | 279 +++++++++++++++++
.../Binary/IO/BinaryStreamsTest.cs | 19 ++
.../Cache/CacheConfigurationTest.cs | 5 +-
.../Cache/Query/CacheDmlQueriesTest.cs | 296 +++++++++++++++++++
.../IgniteConfigurationSerializerTest.cs | 46 ++-
.../IgniteConfigurationTest.cs | 28 ++
.../Apache.Ignite.Core.csproj | 4 +
.../Binary/BinaryArrayEqualityComparer.cs | 149 ++++++++++
.../Binary/BinaryConfiguration.cs | 24 ++
.../Binary/BinaryTypeConfiguration.cs | 14 +
.../Cache/Configuration/QueryEntity.cs | 33 ++-
.../Cache/Configuration/QueryField.cs | 6 +
.../Apache.Ignite.Core/IgniteConfiguration.cs | 85 ++++--
.../IgniteConfigurationSection.xsd | 19 ++
.../Apache.Ignite.Core/Impl/Binary/Binary.cs | 28 +-
.../Binary/BinaryEqualityComparerSerializer.cs | 99 +++++++
.../Impl/Binary/BinaryFieldEqualityComparer.cs | 138 +++++++++
.../Impl/Binary/BinaryFullTypeDescriptor.cs | 21 +-
.../Impl/Binary/BinaryObject.cs | 31 +-
.../Impl/Binary/BinaryObjectBuilder.cs | 62 +++-
.../Impl/Binary/BinaryObjectHeader.cs | 21 +-
.../Impl/Binary/BinaryObjectSchemaHolder.cs | 22 ++
.../Impl/Binary/BinaryReader.cs | 16 +-
.../Binary/BinarySurrogateTypeDescriptor.cs | 6 +
.../Impl/Binary/BinarySystemHandlers.cs | 6 +-
.../Impl/Binary/BinaryWriter.cs | 11 +-
.../Impl/Binary/DateTimeHolder.cs | 15 +-
.../Impl/Binary/IBinaryEqualityComparer.cs | 53 ++++
.../Impl/Binary/IBinaryTypeDescriptor.cs | 5 +
.../Impl/Binary/Io/BinaryHeapStream.cs | 9 +
.../Impl/Binary/Io/BinaryStreamBase.cs | 13 +
.../Impl/Binary/Io/IBinaryStream.cs | 25 ++
.../Impl/Binary/Marshaller.cs | 22 +-
.../Impl/Binary/SerializableObjectHolder.cs | 16 +
.../Common/IgniteConfigurationXmlSerializer.cs | 5 +-
.../Impl/Memory/PlatformMemoryStream.cs | 16 +
63 files changed, 2271 insertions(+), 295 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/ecd727c4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
index fb4ca78,c92e0f5..a77facc
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
@@@ -220,26 -220,10 +223,27 @@@ public abstract class GridNearAtomicAbs
}
/**
+ * @param completer
+ */
+ public void completer(Runnable completer) {
+ this.completer = completer;
+ }
+
+ /** {@inheritDoc} */
+ protected Runnable clearCompleter() {
+ Runnable r = completer;
+
+ if (r != null)
+ completer = null;
+
+ return r;
+ }
+
+ /**
* @param topVer Topology version.
+ * @param futVer Future version
*/
- protected abstract void map(AffinityTopologyVersion topVer);
+ protected abstract void map(AffinityTopologyVersion topVer, GridCacheVersion futVer);
/**
* Maps future on ready topology.
http://git-wip-us.apache.org/repos/asf/ignite/blob/ecd727c4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
index f148cbb,7376aff..06076be
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFuture.java
@@@ -386,60 -379,61 +379,67 @@@ public class GridNearAtomicSingleUpdate
/** {@inheritDoc} */
@Override protected void mapOnTopology() {
- AffinityTopologyVersion topVer = null;
- cache.topology().readLock();
-
+ AffinityTopologyVersion topVer;
-
+ GridCacheVersion futVer;
- try {
- if (cache.topology().stopping()) {
- onDone(new IgniteCheckedException("Failed to perform cache operation (cache is stopped): " +
- cache.name()));
+ if (!CU.cheatCache(cctx.cacheId())) {
+ cache.topology().readLock();
- return;
- }
+ try {
+ if (cache.topology().stopping()) {
+ onDone(new IgniteCheckedException("Failed to perform cache operation (cache is stopped): " +
+ cache.name()));
- GridDhtTopologyFuture fut = cache.topology().topologyVersionFuture();
+ return;
+ }
- if (fut.isDone()) {
- Throwable err = fut.validateCache(cctx);
+ GridDhtTopologyFuture fut = cache.topology().topologyVersionFuture();
- if (err != null) {
- onDone(err);
+ if (fut.isDone()) {
+ Throwable err = fut.validateCache(cctx);
- return;
- }
+ if (err != null) {
+ onDone(err);
- topVer = fut.topologyVersion();
+ return;
+ }
- futVer = addAtomicFuture(topVer);
- }
- else {
- if (waitTopFut) {
- assert !topLocked : this;
-
- fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
- @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> t) {
- cctx.kernalContext().closure().runLocalSafe(new Runnable() {
- @Override public void run() {
- mapOnTopology();
- }
- });
- }
- });
+ topVer = fut.topologyVersion();
++
++ futVer = addAtomicFuture(topVer);
}
- else
- onDone(new GridCacheTryPutFailedException());
+ else {
+ if (waitTopFut) {
+ assert !topLocked : this;
+
+ fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
+ @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> t) {
+ cctx.kernalContext().closure().runLocalSafe(new Runnable() {
+ @Override public void run() {
+ mapOnTopology();
+ }
+ });
+ }
+ });
+ }
+ else
+ onDone(new GridCacheTryPutFailedException());
- return;
+ return;
+ }
+ }
+ finally {
+ cache.topology().readUnlock();
}
}
- else
- finally {
- cache.topology().readUnlock();
++ else {
+ topVer = cache.topology().topologyVersionFuture().topologyVersion();
+
- map(topVer);
++ futVer = addAtomicFuture(topVer);
+ }
+
+ if (futVer != null)
+ map(topVer, futVer);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/ecd727c4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
index 0b917e9,950e5bd..9f6e761
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
@@@ -495,60 -488,61 +488,67 @@@ public class GridNearAtomicUpdateFutur
/** {@inheritDoc} */
@Override protected void mapOnTopology() {
- AffinityTopologyVersion topVer = null;
- cache.topology().readLock();
-
+ AffinityTopologyVersion topVer;
-
+ GridCacheVersion futVer;
- try {
- if (cache.topology().stopping()) {
- onDone(new IgniteCheckedException("Failed to perform cache operation (cache is stopped): " +
- cache.name()));
+ if (!CU.cheatCache(cctx.cacheId())) {
+ cache.topology().readLock();
- return;
- }
+ try {
+ if (cache.topology().stopping()) {
+ onDone(new IgniteCheckedException("Failed to perform cache operation (cache is stopped): " +
+ cache.name()));
- GridDhtTopologyFuture fut = cache.topology().topologyVersionFuture();
+ return;
+ }
- if (fut.isDone()) {
- Throwable err = fut.validateCache(cctx);
+ GridDhtTopologyFuture fut = cache.topology().topologyVersionFuture();
- if (err != null) {
- onDone(err);
+ if (fut.isDone()) {
+ Throwable err = fut.validateCache(cctx);
- return;
- }
+ if (err != null) {
+ onDone(err);
- topVer = fut.topologyVersion();
+ return;
+ }
- futVer = addAtomicFuture(topVer);
- }
- else {
- if (waitTopFut) {
- assert !topLocked : this;
-
- fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
- @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> t) {
- cctx.kernalContext().closure().runLocalSafe(new Runnable() {
- @Override public void run() {
- mapOnTopology();
- }
- });
- }
- });
+ topVer = fut.topologyVersion();
++
++ futVer = addAtomicFuture(topVer);
}
- else
- onDone(new GridCacheTryPutFailedException());
+ else {
+ if (waitTopFut) {
+ assert !topLocked : this;
+
+ fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
+ @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> t) {
+ cctx.kernalContext().closure().runLocalSafe(new Runnable() {
+ @Override public void run() {
+ mapOnTopology();
+ }
+ });
+ }
+ });
+ }
+ else
+ onDone(new GridCacheTryPutFailedException());
- return;
+ return;
+ }
+ }
+ finally {
+ cache.topology().readUnlock();
}
}
- else
- finally {
- cache.topology().readUnlock();
++ else {
+ topVer = cache.topology().topologyVersionFuture().topologyVersion();
+
- map(topVer, null);
++ futVer = addAtomicFuture(topVer);
+ }
+
+ if (futVer != null)
+ map(topVer, futVer, remapKeys);
}
/**
[04/12] ignite git commit: .NET: Improve exception messages for
binary misconfiguration and missing assemblies
Posted by yz...@apache.org.
.NET: Improve exception messages for binary misconfiguration and missing assemblies
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e304b48b
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e304b48b
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e304b48b
Branch: refs/heads/ignite-comm-balance-master
Commit: e304b48b92fe75027442b7f7cfb46b421d58ae49
Parents: d10946b
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Jan 13 16:49:48 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jan 13 16:49:48 2017 +0300
----------------------------------------------------------------------
.../Apache.Ignite.Core/Impl/Binary/BinaryReader.cs | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/e304b48b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryReader.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryReader.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryReader.cs
index 100091f..d9facc3 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryReader.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryReader.cs
@@ -697,10 +697,18 @@ namespace Apache.Ignite.Core.Impl.Binary
if (desc.Type == null)
{
if (desc is BinarySurrogateTypeDescriptor)
- throw new BinaryObjectException("Unknown type ID: " + hdr.TypeId);
-
- throw new BinaryObjectException("No matching type found for object [typeId=" +
- desc.TypeId + ", typeName=" + desc.TypeName + ']');
+ {
+ throw new BinaryObjectException(string.Format(
+ "Unknown type ID: {0}. " +
+ "This usually indicates missing BinaryConfiguration." +
+ "Make sure that all nodes have the same BinaryConfiguration.", hdr.TypeId));
+ }
+
+ throw new BinaryObjectException(string.Format(
+ "No matching type found for object [typeId={0}, typeName={1}]." +
+ "This usually indicates that assembly with specified type is not loaded on a node." +
+ "When using Apache.Ignite.exe, make sure to load assemblies with -assembly parameter.",
+ desc.TypeId, desc.TypeName));
}
// Preserve old frame.
[02/12] ignite git commit: IGNITE-4531: SQL: Use correct property
name in BinaryProperty. This closes 1419.
Posted by yz...@apache.org.
IGNITE-4531: SQL: Use correct property name in BinaryProperty. This closes 1419.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/abc8b909
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/abc8b909
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/abc8b909
Branch: refs/heads/ignite-comm-balance-master
Commit: abc8b9091e9eda8cc43f398939bf1fb6035f7a3f
Parents: 1f358db
Author: Alexander Paschenko <al...@gmail.com>
Authored: Thu Jan 12 10:50:14 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Thu Jan 12 10:50:14 2017 +0300
----------------------------------------------------------------------
.../processors/query/GridQueryProcessor.java | 2 +-
...IgniteCacheAbstractInsertSqlQuerySelfTest.java | 14 +++++++-------
.../IgniteCacheAbstractSqlDmlQuerySelfTest.java | 6 +++---
.../cache/IgniteCacheInsertSqlQuerySelfTest.java | 18 ++++++++++--------
.../cache/IgniteCacheMergeSqlQuerySelfTest.java | 14 +++++++-------
.../cache/IgniteCacheUpdateSqlQuerySelfTest.java | 4 ++--
6 files changed, 30 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/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 58f94f4..3286bac 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
@@ -2147,7 +2147,7 @@ public class GridQueryProcessor extends GridProcessorAdapter {
if (!(obj instanceof BinaryObjectBuilder))
throw new UnsupportedOperationException("Individual properties can be set for binary builders only");
- setValue0((BinaryObjectBuilder) obj, name(), propVal, type());
+ setValue0((BinaryObjectBuilder) obj, propName, propVal, type());
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
index df4259e..86d01c7 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractInsertSqlQuerySelfTest.java
@@ -151,7 +151,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
LinkedHashMap<String, String> flds = new LinkedHashMap<>();
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
s2p.setFields(flds);
@@ -172,7 +172,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
LinkedHashMap<String, String> flds = new LinkedHashMap<>();
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
i2p.setFields(flds);
@@ -194,7 +194,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
flds.put("key", Integer.class.getName());
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
k2p.setFields(flds);
@@ -216,7 +216,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
flds.put("Id", Integer.class.getName());
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
flds.put("IntVal", Integer.class.getName());
k22p.setFields(flds);
@@ -240,7 +240,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
flds.put("key", Integer.class.getName());
flds.put("strKey", String.class.getName());
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
k32p.setFields(flds);
@@ -263,7 +263,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
flds.put("key", Integer.class.getName());
flds.put("strKey", String.class.getName());
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
k42p.setFields(flds);
@@ -515,7 +515,7 @@ public abstract class IgniteCacheAbstractInsertSqlQuerySelfTest extends GridComm
protected int id;
/** */
- @QuerySqlField
+ @QuerySqlField(name = "firstName")
protected String name;
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
index 7f79ec4..649012f 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAbstractSqlDmlQuerySelfTest.java
@@ -139,7 +139,7 @@ public abstract class IgniteCacheAbstractSqlDmlQuerySelfTest extends GridCommonA
BinaryObjectBuilder bldr = ignite(0).binary().builder("Person");
bldr.setField("id", id);
- bldr.setField("name", name);
+ bldr.setField("firstName", name);
bldr.setField("secondName", secondName);
return bldr.build();
@@ -186,7 +186,7 @@ public abstract class IgniteCacheAbstractSqlDmlQuerySelfTest extends GridCommonA
LinkedHashMap<String, String> flds = new LinkedHashMap<>();
flds.put("id", Integer.class.getName());
- flds.put("name", String.class.getName());
+ flds.put("firstName", String.class.getName());
flds.put("secondName", String.class.getName());
e.setFields(flds);
@@ -214,7 +214,7 @@ public abstract class IgniteCacheAbstractSqlDmlQuerySelfTest extends GridCommonA
protected int id;
/** */
- @QuerySqlField
+ @QuerySqlField(name = "firstName")
protected final String name;
/** */
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
index 04a352f..e9c21dc 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
@@ -56,7 +56,7 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
public void testInsertWithExplicitKey() {
IgniteCache<String, Person> p = ignite(0).cache("S2P").withKeepBinary();
- p.query(new SqlFieldsQuery("insert into Person (_key, id, name) values ('s', ?, ?), " +
+ p.query(new SqlFieldsQuery("insert into Person (_key, id, firstName) values ('s', ?, ?), " +
"('a', 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get("s"));
@@ -76,7 +76,7 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
assertEquals("Sergi", p.get("s"));
assertEquals("Alex", p.get("a"));
- p.query(new SqlFieldsQuery("insert into Person(_key, id, name) " +
+ p.query(new SqlFieldsQuery("insert into Person(_key, id, firstName) " +
"(select substring(lower(_val), 0, 2), cast(length(_val) as int), _val from String)"));
assertEquals(createPerson(5, "Sergi"), p.get("se"));
@@ -91,7 +91,7 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
IgniteCache<Integer, Person> p = ignite(0).cache("I2P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "insert into Person (_key, id, name) values (cast('1' as int), ?, ?), (2, (5 - 3), 'Alex')")
+ "insert into Person (_key, id, firstName) values (cast('1' as int), ?, ?), (2, (5 - 3), 'Alex')")
.setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(1));
@@ -106,7 +106,7 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
IgniteCache<Key, Person> p = ignite(0).cache("K2P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "insert into Person (key, id, name) values (1, ?, ?), (2, 2, 'Alex')").setArgs(1, "Sergi"));
+ "insert into Person (key, id, firstName) values (1, ?, ?), (2, 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key(1)));
@@ -119,8 +119,8 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
public void testFieldsCaseSensitivity() {
IgniteCache<Key2, Person> p = ignite(0).cache("K22P").withKeepBinary();
- p.query(new SqlFieldsQuery("insert into \"Person2\" (\"Id\", \"id\", \"name\", \"IntVal\") values (1, ?, ?, 5), " +
- "(2, 3, 'Alex', 6)").setArgs(4, "Sergi"));
+ p.query(new SqlFieldsQuery("insert into \"Person2\" (\"Id\", \"id\", \"firstName\", \"IntVal\") " +
+ "values (1, ?, ?, 5), (2, 3, 'Alex', 6)").setArgs(4, "Sergi"));
assertEquals(createPerson2(4, "Sergi", 5), p.get(new Key2(1)));
@@ -177,7 +177,8 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
IgniteCache<Key3, Person> p = ignite(0).cache("K32P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "insert into Person (key, strKey, id, name) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
+ "insert into Person (key, strKey, id, firstName) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')")
+ .setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key3(1)));
@@ -194,7 +195,8 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
IgniteCache<Key4, Person> p = ignite(0).cache("K42P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "insert into Person (key, strKey, id, name) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
+ "insert into Person (key, strKey, id, firstName) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')")
+ .setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key4(1)));
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
index 0ff3fda..58d07af 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheMergeSqlQuerySelfTest.java
@@ -32,7 +32,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
public void testMergeWithExplicitKey() {
IgniteCache<String, Person> p = ignite(0).cache("S2P").withKeepBinary();
- p.query(new SqlFieldsQuery("merge into Person (_key, id, name) values ('s', ?, ?), " +
+ p.query(new SqlFieldsQuery("merge into Person (_key, id, firstName) values ('s', ?, ?), " +
"('a', 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get("s"));
@@ -52,7 +52,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
assertEquals("Sergi", p.get("s"));
assertEquals("Alex", p.get("a"));
- p.query(new SqlFieldsQuery("merge into Person(_key, id, name) " +
+ p.query(new SqlFieldsQuery("merge into Person(_key, id, firstName) " +
"(select substring(lower(_val), 0, 2), cast(length(_val) as int), _val from String)"));
assertEquals(createPerson(5, "Sergi"), p.get("se"));
@@ -67,7 +67,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
IgniteCache<Integer, Person> p = ignite(0).cache("I2P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "merge into Person (_key, id, name) values (cast(? as int), ?, ?), (2, (5 - 3), 'Alex')")
+ "merge into Person (_key, id, firstName) values (cast(? as int), ?, ?), (2, (5 - 3), 'Alex')")
.setArgs("1", 1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(1));
@@ -82,7 +82,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
IgniteCache<Key, Person> p = ignite(0).cache("K2P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "merge into Person (key, id, name) values (1, ?, ?), (2, 2, 'Alex')").setArgs(1, "Sergi"));
+ "merge into Person (key, id, firstName) values (1, ?, ?), (2, 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key(1)));
@@ -95,7 +95,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
public void testFieldsCaseSensitivity() {
IgniteCache<Key2, Person> p = ignite(0).cache("K22P").withKeepBinary();
- p.query(new SqlFieldsQuery("merge into \"Person2\" (\"Id\", \"id\", \"name\", \"IntVal\") values (1, ?, ?, 5), " +
+ p.query(new SqlFieldsQuery("merge into \"Person2\" (\"Id\", \"id\", \"firstName\", \"IntVal\") values (1, ?, ?, 5), " +
"(2, 3, 'Alex', 6)").setArgs(4, "Sergi"));
assertEquals(createPerson2(4, "Sergi", 5), p.get(new Key2(1)));
@@ -127,7 +127,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
IgniteCache<Key3, Person> p = ignite(0).cache("K32P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "merge into Person (key, strKey, id, name) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
+ "merge into Person (key, strKey, id, firstName) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key3(1)));
@@ -144,7 +144,7 @@ public class IgniteCacheMergeSqlQuerySelfTest extends IgniteCacheAbstractInsertS
IgniteCache<Key4, Person> p = ignite(0).cache("K42P").withKeepBinary();
p.query(new SqlFieldsQuery(
- "merge into Person (key, strKey, id, name) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
+ "merge into Person (key, strKey, id, firstName) values (1, 'aa', ?, ?), (2, 'bb', 2, 'Alex')").setArgs(1, "Sergi"));
assertEquals(createPerson(1, "Sergi"), p.get(new Key4(1)));
http://git-wip-us.apache.org/repos/asf/ignite/blob/abc8b909/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
index 332a082..58bcaac 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheUpdateSqlQuerySelfTest.java
@@ -61,8 +61,8 @@ public class IgniteCacheUpdateSqlQuerySelfTest extends IgniteCacheAbstractSqlDml
public void testUpdateSimple() {
IgniteCache p = cache();
- QueryCursor<List<?>> c = p.query(new SqlFieldsQuery("update Person p set p.id = p.id * 2, p.name = " +
- "substring(p.name, 0, 2) where length(p._key) = ? or p.secondName like ?").setArgs(2, "%ite"));
+ QueryCursor<List<?>> c = p.query(new SqlFieldsQuery("update Person p set p.id = p.id * 2, p.firstName = " +
+ "substring(p.firstName, 0, 2) where length(p._key) = ? or p.secondName like ?").setArgs(2, "%ite"));
c.iterator();