This is an automated email from the ASF dual-hosted git repository.
ptupitsyn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 8cc19b1 IGNITE-14293 .NET: Fix AffinityKey metadata in
QueryEntity.KeyType
8cc19b1 is described below
commit 8cc19b1041b64d7dd3bb368ce4b9cadee07a3718
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Wed Mar 10 18:43:44 2021 +0300
IGNITE-14293 .NET: Fix AffinityKey metadata in QueryEntity.KeyType
`AffinityKey` system type, when used as a `QueryEntiry` key, got
overwritten by `UnmanagedCallbacks.BinaryTypeGet` call, which broke the mapping
to a corresponding Java type.
* Add missing check for existing registered type (actual fix in
Marshaller.cs)
* Add check for system type overwrite
* Add test for `AffinityKey` + `QueryEntity`
* Improve examples tests - SQL and LINQ examples were affected by this bug
* Change cache names in examples so different examples do not interfere
Co-authored-by: Igor Sapego <[email protected]>
---
.../Cache/Affinity/AffinityTest.cs | 40 +++++++++++++
.../Apache.Ignite.Core.Tests/Examples/Example.cs | 12 ++++
.../Examples/ExamplesTestBase.cs | 69 ++++++++++++++++++++--
.../Examples/ExpectedOutput/AtomicReference.txt | 2 +-
.../Examples/ExpectedOutput/ClientReconnect.txt | 3 +-
.../Examples/ExpectedOutput/DataStreamer.txt | 2 +-
.../Examples/ExpectedOutput/Lifecycle.txt | 2 +-
.../Examples/ExpectedOutput/Linq.txt | 8 +--
.../Examples/ExpectedOutput/LinqThin.txt | 8 +--
.../Examples/ExpectedOutput/Messaging.txt | 40 ++++++-------
.../ExpectedOutput/OptimisticTransaction.txt | 2 +-
.../ExpectedOutput/OptimisticTransactionThin.txt | 2 +-
.../ExpectedOutput/PeerAssemblyLoading.txt | 2 +-
.../Examples/ExpectedOutput/PutGet.txt | 6 +-
.../Examples/ExpectedOutput/PutGetThin.txt | 6 +-
.../Examples/ExpectedOutput/SqlThin.txt | 2 -
.../TransactionDeadlockDetection.txt | 10 ++--
.../Apache.Ignite.Core/Impl/Binary/Marshaller.cs | 21 +++++++
.../examples/Thick/Cache/QueryFullText/Program.cs | 2 +-
.../examples/Thick/Cache/QueryScan/Program.cs | 2 +-
.../dotnet/examples/Thick/Cache/Store/Program.cs | 2 +-
.../examples/Thick/Cache/Transaction/Program.cs | 4 +-
.../dotnet/examples/Thick/Sql/Linq/Program.cs | 6 +-
.../examples/Thin/Cache/QueryScanThin/Program.cs | 2 +-
.../examples/Thin/Cache/TransactionThin/Program.cs | 4 +-
.../dotnet/examples/Thin/Sql/LinqThin/Program.cs | 6 +-
26 files changed, 198 insertions(+), 67 deletions(-)
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
index 37bc53b..cd7a327 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Affinity/AffinityTest.cs
@@ -122,6 +122,46 @@ namespace Apache.Ignite.Core.Tests.Cache.Affinity
}
/// <summary>
+ /// Tests that <see cref="AffinityKey"/> works when used as <see
cref="QueryEntity.KeyType"/>.
+ /// </summary>
+ [Test]
+ public void TestAffinityKeyWithQueryEntity()
+ {
+ var cacheCfg = new CacheConfiguration(TestUtils.TestName)
+ {
+ QueryEntities = new List<QueryEntity>
+ {
+ new QueryEntity(typeof(AffinityKey),
typeof(QueryEntityValue))
+ }
+ };
+
+ var ignite = Ignition.GetIgnite("grid-0");
+ var cache = ignite.GetOrCreateCache<AffinityKey,
QueryEntityValue>(cacheCfg);
+ var aff = ignite.GetAffinity(cache.Name);
+
+ var ignite2 = Ignition.GetIgnite("grid-1");
+ var cache2 = ignite2.GetOrCreateCache<AffinityKey,
QueryEntityValue>(cacheCfg);
+ var aff2 = ignite2.GetAffinity(cache2.Name);
+
+ // Check mapping.
+ for (var i = 0; i < 100; i++)
+ {
+ Assert.AreEqual(aff.GetPartition(i), aff.GetPartition(new
AffinityKey("foo" + i, i)));
+ Assert.AreEqual(aff2.GetPartition(i), aff2.GetPartition(new
AffinityKey("bar" + i, i)));
+ Assert.AreEqual(aff.GetPartition(i), aff2.GetPartition(i));
+ }
+
+ // Check put/get.
+ var key = new AffinityKey("x", 123);
+ var expected = new QueryEntityValue {Name = "y", AffKey = 321};
+ cache[key] = expected;
+
+ var val = cache2[key];
+ Assert.AreEqual(expected.Name, val.Name);
+ Assert.AreEqual(expected.AffKey, val.AffKey);
+ }
+
+ /// <summary>
/// Tests that <see cref="AffinityKeyMappedAttribute"/> works when
used on a property of a type that is
/// specified as <see cref="QueryEntity.KeyType"/> or <see
cref="QueryEntity.ValueType"/>.
/// </summary>
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/Example.cs
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/Example.cs
index c35f64e..b7b671d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/Example.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/Example.cs
@@ -29,6 +29,13 @@ namespace Apache.Ignite.Core.Tests.Examples
/// </summary>
public class Example
{
+ /** Examples with undefined output order. */
+ private static readonly IReadOnlyCollection<string>
UnorderedOutputExamples = new HashSet<string>
+ {
+ "Dml", "Ddl", "EntryProcessor", "Func", "Messaging",
"QueryContinuous", "Task", "Sql", "Linq", "AtomicLong",
+ "ClientReconnect"
+ };
+
/** All projects. */
public static readonly Example[] AllProjects = GetExamples()
.OrderBy(x => x.Name)
@@ -64,6 +71,9 @@ namespace Apache.Ignite.Core.Tests.Examples
/** Whether this example disallows external nodes. */
public bool DisallowsExternalNode { get; }
+ /** Whether the output of this example can be unordered (e.g. compute
task execution order is not guaranteed. */
+ public bool UndefinedOutputOrder { get; }
+
/// <summary>
/// Initializes a new instance of <see cref="Example"/> class.
/// </summary>
@@ -76,6 +86,8 @@ namespace Apache.Ignite.Core.Tests.Examples
RequiresExternalNode = sourceCode.Contains("ServerNode project");
DisallowsExternalNode = sourceCode.Contains("without external
node");
IsClient = sourceCode.Contains("GetClientNodeConfiguration") &&
!DisallowsExternalNode;
+ UndefinedOutputOrder = UnorderedOutputExamples.Contains(name) ||
+
UnorderedOutputExamples.Contains(name.Replace("Thin", ""));
}
/// <summary>
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExamplesTestBase.cs
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExamplesTestBase.cs
index 16b402b..053072a 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExamplesTestBase.cs
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExamplesTestBase.cs
@@ -19,6 +19,7 @@ namespace Apache.Ignite.Core.Tests.Examples
{
using System;
using System.IO;
+ using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using NUnit.Framework;
@@ -82,7 +83,7 @@ namespace Apache.Ignite.Core.Tests.Examples
StringAssert.Contains(line, output);
}
- var expectedOutputFile =
Path.Combine(ExamplePaths.ExpectedOutputDir, example.Name)+ ".txt";
+ var expectedOutputFile =
Path.Combine(ExamplePaths.ExpectedOutputDir, example.Name) + ".txt";
Assert.IsTrue(File.Exists(expectedOutputFile),
$"File.Exists({expectedOutputFile})");
@@ -94,13 +95,37 @@ namespace Apache.Ignite.Core.Tests.Examples
expectedOutputFile = expectedOutputFile2;
}
- var expectedLines = File.ReadAllLines(expectedOutputFile);
+ var expectedLines = File.ReadAllLines(expectedOutputFile)
+ .Where(l => !string.IsNullOrWhiteSpace(l))
+ .ToList();
- foreach (var line in expectedLines)
+ if (example.UndefinedOutputOrder)
{
- if (!string.IsNullOrWhiteSpace(line))
+ var expLines = expectedLines.GroupBy(l => l)
+ .Select(g => new {g.Key, Count = g.Count()})
+ .ToList();
+
+ foreach (var line in expLines)
+ {
+ var count = GetSubstringCount(output,
GetExpectedLine(line.Key));
+
+ Assert.AreEqual(line.Count, count, "Unexpected line
occurence count: " + line.Key);
+ }
+ }
+ else
+ {
+ var lastIdx = 0;
+
+ foreach (var line in expectedLines)
{
- StringAssert.Contains(line, output);
+ var idx = output.IndexOf(GetExpectedLine(line), lastIdx,
StringComparison.Ordinal);
+
+ if (idx < 0)
+ {
+ Assert.Fail("Expected line not found after index {0}:
{1}", lastIdx, line);
+ }
+
+ lastIdx = idx;
}
}
}
@@ -109,5 +134,39 @@ namespace Apache.Ignite.Core.Tests.Examples
/// Gets the example output.
/// </summary>
private string GetOutput() => Regex.Replace(_outSb.ToString(),
@"idHash=(\d+)", "idHash=_");
+
+ /// <summary>
+ /// Gets substring count.
+ /// </summary>
+ private static int GetSubstringCount(string str, string substr)
+ {
+ int startIdx = 0;
+ int count = 0;
+
+ while (true)
+ {
+ var idx = str.IndexOf(substr, startIdx,
StringComparison.Ordinal);
+
+ if (idx < startIdx)
+ {
+ break;
+ }
+
+ startIdx = idx + substr.Length;
+ count++;
+ }
+
+ return count;
+ }
+
+ /// <summary>
+ /// Gets the expected line.
+ /// </summary>
+ private static string GetExpectedLine(string line)
+ {
+ return line.EndsWith("*")
+ ? line.Substring(0, line.Length - 1)
+ : line + "\n";
+ }
}
}
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/AtomicReference.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/AtomicReference.txt
index 044feb3..dbd222c 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/AtomicReference.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/AtomicReference.txt
@@ -1 +1 @@
->>> Current atomic reference value:
+>>> Current atomic reference value:*
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/ClientReconnect.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/ClientReconnect.txt
index bfe8e77..f710a91 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/ClientReconnect.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/ClientReconnect.txt
@@ -5,7 +5,7 @@
>>> Put value with key: 1
>>> Put value with key: 2
>>> Put value with key: 3
-Ignite node stopped OK [name=serverNode, uptime=
+Ignite node stopped OK [name=serverNode, uptime=*
>>> Server node stopped.
>>> Put value with key: 4
>>> Client disconnected from the cluster. Failed to put value with key: 4
@@ -16,3 +16,4 @@ Ignite node stopped OK [name=serverNode, uptime=
>>> Put value with key: 7
>>> Put value with key: 8
>>> Put value with key: 9
+Ignite node stopped OK [name=serverNode, uptime=*
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/DataStreamer.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/DataStreamer.txt
index 435a20d..59c6029 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/DataStreamer.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/DataStreamer.txt
@@ -48,4 +48,4 @@ Loaded 460000 accounts.
Loaded 470000 accounts.
Loaded 480000 accounts.
Loaded 490000 accounts.
->>> Loaded 500000 accounts in
+>>> Loaded 500000 accounts in *
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Lifecycle.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Lifecycle.txt
index a02929a..03ea472 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Lifecycle.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Lifecycle.txt
@@ -10,7 +10,7 @@
>>> Ignite lifecycle event occurred: AfterNodeStop
>>> Ignite name: lifecycle-example
-Ignite node stopped OK [name=lifecycle-example, uptime=
+Ignite node stopped OK [name=lifecycle-example, uptime=*
>>> Started (should be false): False
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Linq.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Linq.txt
index 4f6ba3c..7319965 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Linq.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Linq.txt
@@ -3,7 +3,7 @@
>>> Employees with zipcode 94109:
>>> Employee [name=James Wilson, salary=12500, address=Address [street=1096
>>> Eddy Street, San Francisco, CA, zip=94109], departments=[Human Resources,
>>> Customer Service]]
>>> Employee [name=Allison Mathis, salary=25300, address=Address
>>> [street=2702 Freedom Lane, San Francisco, CA, zip=94109],
>>> departments=[Development]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee".EMPLOYEE as _T0 where (_T0.ZIP IS NOT DISTINCT
FROM ?)
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee".EMPLOYEE as _T0 where (_T0.ZIP IS NOT DISTINCT FROM ?)
>>> Employees with zipcode 94109 using compiled query:
>>> Employee [name=James Wilson, salary=12500, address=Address [street=1096
>>> Eddy Street, San Francisco, CA, zip=94109], departments=[Human Resources,
>>> Customer Service]]
@@ -13,13 +13,13 @@
>>> Employee [name=James Wilson, salary=12500, address=Address
>>> [street=1096 Eddy Street, San Francisco, CA, zip=94109],
>>> departments=[Human Resources, Customer Service]]
>>> Employee [name=Daniel Adams, salary=11000, address=Address [street=184
>>> Fidler Drive, San Antonio, TX, zip=78130], departments=[Development, QA]]
>>> Employee [name=Cristian Moss, salary=12500, address=Address
>>> [street=667 Jerry Dove Drive, Florence, SC, zip=29501],
>>> departments=[Logistics]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee_colocated".EMPLOYEE as _T0 ,
"dotnet_cache_query_organization".ORGANIZATION as _T1 where
((_T0.ORGANIZATIONID IS NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT
DISTINCT FROM ?))
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee_colocated".EMPLOYEE as _T0 ,
"dotnet_linq_organization".ORGANIZATION as _T1 where ((_T0.ORGANIZATIONID IS
NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT DISTINCT FROM ?))
>>> Employees working for Apache using distributed joins:
>>> Employee [name=James Wilson, salary=12500, address=Address
>>> [street=1096 Eddy Street, San Francisco, CA, zip=94109],
>>> departments=[Human Resources, Customer Service]]
>>> Employee [name=Daniel Adams, salary=11000, address=Address [street=184
>>> Fidler Drive, San Antonio, TX, zip=78130], departments=[Development, QA]]
>>> Employee [name=Cristian Moss, salary=12500, address=Address
>>> [street=667 Jerry Dove Drive, Florence, SC, zip=29501],
>>> departments=[Logistics]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee".EMPLOYEE as _T0 ,
"dotnet_cache_query_organization".ORGANIZATION as _T1 where
((_T0.ORGANIZATIONID IS NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT
DISTINCT FROM ?))
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee".EMPLOYEE as _T0 ,
"dotnet_linq_organization".ORGANIZATION as _T1 where ((_T0.ORGANIZATIONID IS
NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT DISTINCT FROM ?))
>>> Employee names and their salaries:
>>> [Name=James Wilson, salary=12500]
@@ -29,4 +29,4 @@
>>> [Name=Breana Robbin, salary=6500]
>>> [Name=Philip Horsley, salary=19800]
>>> [Name=Brian Peters, salary=10600]
->>> Generated SQL: select _T0.NAME, _T0.SALARY from
"dotnet_cache_query_employee".EMPLOYEE as _T0
+>>> Generated SQL: select _T0.NAME, _T0.SALARY from
"dotnet_linq_employee".EMPLOYEE as _T0
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/LinqThin.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/LinqThin.txt
index a4dc80d..b671263 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/LinqThin.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/LinqThin.txt
@@ -3,7 +3,7 @@
>>> Employees with zipcode 94109:
>>> Employee [name=James Wilson, salary=12500, address=Address [street=1096
>>> Eddy Street, San Francisco, CA, zip=94109], departments=[Human Resources,
>>> Customer Service]]
>>> Employee [name=Allison Mathis, salary=25300, address=Address
>>> [street=2702 Freedom Lane, San Francisco, CA, zip=94109],
>>> departments=[Development]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee".EMPLOYEE as _T0 where (_T0.ZIP IS NOT DISTINCT
FROM ?)
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee".EMPLOYEE as _T0 where (_T0.ZIP IS NOT DISTINCT FROM ?)
>>> Employees with zipcode 94109 using compiled query:
>>> Employee [name=James Wilson, salary=12500, address=Address [street=1096
>>> Eddy Street, San Francisco, CA, zip=94109], departments=[Human Resources,
>>> Customer Service]]
@@ -13,13 +13,13 @@
>>> Employee [name=Daniel Adams, salary=11000, address=Address [street=184
>>> Fidler Drive, San Antonio, TX, zip=78130], departments=[Development, QA]]
>>> Employee [name=James Wilson, salary=12500, address=Address
>>> [street=1096 Eddy Street, San Francisco, CA, zip=94109],
>>> departments=[Human Resources, Customer Service]]
>>> Employee [name=Cristian Moss, salary=12500, address=Address
>>> [street=667 Jerry Dove Drive, Florence, SC, zip=29501],
>>> departments=[Logistics]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee_colocated".EMPLOYEE as _T0 ,
"dotnet_cache_query_organization".ORGANIZATION as _T1 where
((_T0.ORGANIZATIONID IS NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT
DISTINCT FROM ?))
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee_colocated".EMPLOYEE as _T0 ,
"dotnet_linq_organization".ORGANIZATION as _T1 where ((_T0.ORGANIZATIONID IS
NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT DISTINCT FROM ?))
>>> Employees working for Apache using distributed joins:
>>> Employee [name=James Wilson, salary=12500, address=Address
>>> [street=1096 Eddy Street, San Francisco, CA, zip=94109],
>>> departments=[Human Resources, Customer Service]]
>>> Employee [name=Daniel Adams, salary=11000, address=Address [street=184
>>> Fidler Drive, San Antonio, TX, zip=78130], departments=[Development, QA]]
>>> Employee [name=Cristian Moss, salary=12500, address=Address
>>> [street=667 Jerry Dove Drive, Florence, SC, zip=29501],
>>> departments=[Logistics]]
->>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_cache_query_employee".EMPLOYEE as _T0 ,
"dotnet_cache_query_organization".ORGANIZATION as _T1 where
((_T0.ORGANIZATIONID IS NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT
DISTINCT FROM ?))
+>>> Generated SQL: select _T0._KEY, _T0._VAL from
"dotnet_linq_employee".EMPLOYEE as _T0 ,
"dotnet_linq_organization".ORGANIZATION as _T1 where ((_T0.ORGANIZATIONID IS
NOT DISTINCT FROM _T1._KEY) and (_T1.NAME IS NOT DISTINCT FROM ?))
>>> Employee names and their salaries:
>>> [Name=James Wilson, salary=12500]
@@ -29,4 +29,4 @@
>>> [Name=Breana Robbin, salary=6500]
>>> [Name=Philip Horsley, salary=19800]
>>> [Name=Brian Peters, salary=10600]
->>> Generated SQL: select _T0.NAME, _T0.SALARY from
"dotnet_cache_query_employee".EMPLOYEE as _T0
+>>> Generated SQL: select _T0.NAME, _T0.SALARY from
"dotnet_linq_employee".EMPLOYEE as _T0
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Messaging.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Messaging.txt
index 61efbaf..b8c2da5 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Messaging.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/Messaging.txt
@@ -6,23 +6,23 @@
>>> Finished sending ordered messages.
>>> Check output on all nodes for message printouts.
>>> Waiting for messages acknowledgements from all remote nodes...
-Received unordered message [msg=6, fromNodeId=
-Received unordered message [msg=0, fromNodeId=
-Received unordered message [msg=5, fromNodeId=
-Received unordered message [msg=4, fromNodeId=
-Received unordered message [msg=7, fromNodeId=
-Received unordered message [msg=3, fromNodeId=
-Received unordered message [msg=2, fromNodeId=
-Received unordered message [msg=1, fromNodeId=
-Received unordered message [msg=9, fromNodeId=
-Received unordered message [msg=8, fromNodeId=
-Received ordered message [msg=0, fromNodeId=
-Received ordered message [msg=1, fromNodeId=
-Received ordered message [msg=2, fromNodeId=
-Received ordered message [msg=3, fromNodeId=
-Received ordered message [msg=4, fromNodeId=
-Received ordered message [msg=5, fromNodeId=
-Received ordered message [msg=6, fromNodeId=
-Received ordered message [msg=7, fromNodeId=
-Received ordered message [msg=8, fromNodeId=
-Received ordered message [msg=9, fromNodeId=
+Received unordered message [msg=6, fromNodeId=*
+Received unordered message [msg=0, fromNodeId=*
+Received unordered message [msg=5, fromNodeId=*
+Received unordered message [msg=4, fromNodeId=*
+Received unordered message [msg=7, fromNodeId=*
+Received unordered message [msg=3, fromNodeId=*
+Received unordered message [msg=2, fromNodeId=*
+Received unordered message [msg=1, fromNodeId=*
+Received unordered message [msg=9, fromNodeId=*
+Received unordered message [msg=8, fromNodeId=*
+Received ordered message [msg=0, fromNodeId=*
+Received ordered message [msg=1, fromNodeId=*
+Received ordered message [msg=2, fromNodeId=*
+Received ordered message [msg=3, fromNodeId=*
+Received ordered message [msg=4, fromNodeId=*
+Received ordered message [msg=5, fromNodeId=*
+Received ordered message [msg=6, fromNodeId=*
+Received ordered message [msg=7, fromNodeId=*
+Received ordered message [msg=8, fromNodeId=*
+Received ordered message [msg=9, fromNodeId=*
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransaction.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransaction.txt
index 07b70de..626bcbf 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransaction.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransaction.txt
@@ -2,6 +2,6 @@
successfully incremented cached value.
-failed to increment cached value. Caught an expected optimistic exception:
Failed to prepare transaction
+failed to increment cached value. Caught an expected optimistic exception:
Failed to prepare transaction*
>>> Resulting value in cache: 1
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransactionThin.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransactionThin.txt
index 07b70de..626bcbf 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransactionThin.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/OptimisticTransactionThin.txt
@@ -2,6 +2,6 @@
successfully incremented cached value.
-failed to increment cached value. Caught an expected optimistic exception:
Failed to prepare transaction
+failed to increment cached value. Caught an expected optimistic exception:
Failed to prepare transaction*
>>> Resulting value in cache: 1
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PeerAssemblyLoading.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PeerAssemblyLoading.txt
index b7fbacd..31d8216 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PeerAssemblyLoading.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PeerAssemblyLoading.txt
@@ -1,4 +1,4 @@
>>> Peer loading example started.
>>> Executing an action on all remote nodes...
-Hello from automatically deployed assembly! Version is 1.0.
+Hello from automatically deployed assembly! Version is 1.0.*
>>> Action executed, check output on remote nodes.
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGet.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGet.txt
index 352fdf9..da5d9cd 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGet.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGet.txt
@@ -1,12 +1,12 @@
>>> Cache put-get example started.
->>> Retrieved organization instance from cache: Organization [name=Microsoft,
address=Address [street=1096 Eddy Street, San Francisco, CA, zip=94109],
type=Private, lastUpdated=
+>>> Retrieved organization instance from cache: Organization [name=Microsoft,
address=Address [street=1096 Eddy Street, San Francisco, CA, zip=94109],
type=Private, lastUpdated=*
>>> Retrieved organization name from binary object: Microsoft
>>> Retrieved organization instances from cache:
->>> Organization [name=Microsoft, address=Address [street=1096 Eddy
Street, San Francisco, CA, zip=94109], type=Private, lastUpdated=
->>> Organization [name=Red Cross, address=Address [street=184 Fidler
Drive, San Antonio, TX, zip=78205], type=NonProfit, lastUpdated=
+>>> Organization [name=Microsoft, address=Address [street=1096 Eddy
Street, San Francisco, CA, zip=94109], type=Private, lastUpdated=*
+>>> Organization [name=Red Cross, address=Address [street=184 Fidler
Drive, San Antonio, TX, zip=78205], type=NonProfit, lastUpdated=*
>>> Retrieved organization names from binary objects:
>>> Microsoft
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGetThin.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGetThin.txt
index 352fdf9..da5d9cd 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGetThin.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/PutGetThin.txt
@@ -1,12 +1,12 @@
>>> Cache put-get example started.
->>> Retrieved organization instance from cache: Organization [name=Microsoft,
address=Address [street=1096 Eddy Street, San Francisco, CA, zip=94109],
type=Private, lastUpdated=
+>>> Retrieved organization instance from cache: Organization [name=Microsoft,
address=Address [street=1096 Eddy Street, San Francisco, CA, zip=94109],
type=Private, lastUpdated=*
>>> Retrieved organization name from binary object: Microsoft
>>> Retrieved organization instances from cache:
->>> Organization [name=Microsoft, address=Address [street=1096 Eddy
Street, San Francisco, CA, zip=94109], type=Private, lastUpdated=
->>> Organization [name=Red Cross, address=Address [street=184 Fidler
Drive, San Antonio, TX, zip=78205], type=NonProfit, lastUpdated=
+>>> Organization [name=Microsoft, address=Address [street=1096 Eddy
Street, San Francisco, CA, zip=94109], type=Private, lastUpdated=*
+>>> Organization [name=Red Cross, address=Address [street=184 Fidler
Drive, San Antonio, TX, zip=78205], type=NonProfit, lastUpdated=*
>>> Retrieved organization names from binary objects:
>>> Microsoft
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/SqlThin.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/SqlThin.txt
index 4d5656d..0edc941 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/SqlThin.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/SqlThin.txt
@@ -2,7 +2,6 @@
>>> Employees with zipcode 94109 (SQL):
>>> [Name=James Wilson, salary=12500]
->>> [Name=James Wilson, salary=12500]
>>> [Name=Allison Mathis, salary=25300]
>>> Employees working for Apache:
@@ -12,6 +11,5 @@
>>> Employees working for Apache (distributed joins enabled):
>>> James Wilson
->>> James Wilson
>>> Daniel Adams
>>> Cristian Moss
diff --git
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/TransactionDeadlockDetection.txt
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/TransactionDeadlockDetection.txt
index a69b756..beb2ad5 100644
---
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/TransactionDeadlockDetection.txt
+++
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Examples/ExpectedOutput/TransactionDeadlockDetection.txt
@@ -1,6 +1,6 @@
>>> Transaction deadlock detection example started.
->>> Transaction deadlock in thread
+>>> Transaction deadlock in thread *
Deadlock detected:
K1: TX1 holds lock, TX2 waits lock.
@@ -8,10 +8,10 @@ K2: TX2 holds lock, TX1 waits lock.
Transactions:
-TX1 [txId=GridCacheVersion [topVer=
-TX2 [txId=GridCacheVersion [topVer=
+TX1 [txId=GridCacheVersion [topVer=*
+TX2 [txId=GridCacheVersion [topVer=*
Keys:
-K1 [key=
-K2 [key=
+K1 [key=*
+K2 [key=*
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 f6346a5..a7c5411 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/Marshaller.cs
@@ -20,6 +20,7 @@ namespace Apache.Ignite.Core.Impl.Binary
using System;
using System.Collections.Generic;
using System.Diagnostics;
+ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
@@ -565,6 +566,11 @@ namespace Apache.Ignite.Core.Impl.Binary
if (type != null)
{
+ if (_typeToDesc.TryGetValue(type, out desc))
+ {
+ return desc;
+ }
+
return AddUserType(type, typeId, GetTypeName(type), true,
desc);
}
}
@@ -665,12 +671,26 @@ namespace Apache.Ignite.Core.Impl.Binary
ThrowConflictingTypeError(type, desc0.Type, typeId);
}
+ ValidateRegistration(type);
_typeToDesc.Set(type, desc);
return desc;
}
/// <summary>
+ /// Validates type registration.
+ /// </summary>
+ [ExcludeFromCodeCoverage]
+ private void ValidateRegistration(Type type)
+ {
+ BinaryFullTypeDescriptor desc;
+ if (_typeToDesc.TryGetValue(type, out desc) && !desc.UserType)
+ {
+ throw new BinaryObjectException("Invalid attempt to overwrite
system type registration: " + type);
+ }
+ }
+
+ /// <summary>
/// Throws the conflicting type error.
/// </summary>
private static void ThrowConflictingTypeError(object type1, object
type2, int typeId)
@@ -805,6 +825,7 @@ namespace Apache.Ignite.Core.Impl.Binary
if (type != null)
{
+ ValidateRegistration(type);
_typeToDesc.Set(type, descriptor);
}
diff --git
a/modules/platforms/dotnet/examples/Thick/Cache/QueryFullText/Program.cs
b/modules/platforms/dotnet/examples/Thick/Cache/QueryFullText/Program.cs
index f18f47e..c721233 100644
--- a/modules/platforms/dotnet/examples/Thick/Cache/QueryFullText/Program.cs
+++ b/modules/platforms/dotnet/examples/Thick/Cache/QueryFullText/Program.cs
@@ -29,7 +29,7 @@ namespace Apache.Ignite.Examples.Thick.Cache.QueryFullText
/// </summary>
public static class Program
{
- private const string EmployeeCacheName = "dotnet_cache_query_employee";
+ private const string EmployeeCacheName =
"dotnet_cache_query_full_text_employee";
public static void Main()
{
diff --git a/modules/platforms/dotnet/examples/Thick/Cache/QueryScan/Program.cs
b/modules/platforms/dotnet/examples/Thick/Cache/QueryScan/Program.cs
index 357c02f..21d036d 100644
--- a/modules/platforms/dotnet/examples/Thick/Cache/QueryScan/Program.cs
+++ b/modules/platforms/dotnet/examples/Thick/Cache/QueryScan/Program.cs
@@ -30,7 +30,7 @@ namespace Apache.Ignite.Examples.Thick.Cache.QueryScan
/// </summary>
public static class Program
{
- private const string EmployeeCacheName = "dotnet_cache_query_employee";
+ private const string EmployeeCacheName =
"dotnet_cache_query_scan_employee";
public static void Main()
{
diff --git a/modules/platforms/dotnet/examples/Thick/Cache/Store/Program.cs
b/modules/platforms/dotnet/examples/Thick/Cache/Store/Program.cs
index e59ee35..5a69b74 100644
--- a/modules/platforms/dotnet/examples/Thick/Cache/Store/Program.cs
+++ b/modules/platforms/dotnet/examples/Thick/Cache/Store/Program.cs
@@ -78,7 +78,7 @@ namespace Apache.Ignite.Examples.Thick.Cache.Store
));
Console.WriteLine();
- Console.WriteLine(">>> Put entry to cache. ");
+ Console.WriteLine(">>> Put entry to cache.");
Console.WriteLine(">>> Current cache size: " +
cache.GetSize());
// Clear values again.
diff --git
a/modules/platforms/dotnet/examples/Thick/Cache/Transaction/Program.cs
b/modules/platforms/dotnet/examples/Thick/Cache/Transaction/Program.cs
index 1bad509..8de3ac5 100644
--- a/modules/platforms/dotnet/examples/Thick/Cache/Transaction/Program.cs
+++ b/modules/platforms/dotnet/examples/Thick/Cache/Transaction/Program.cs
@@ -103,7 +103,7 @@ namespace Apache.Ignite.Examples.Thick.Cache.Transaction
Console.WriteLine(">>> Transfer finished.");
Console.WriteLine();
- Console.WriteLine(">>> Accounts after transfer: ");
+ Console.WriteLine(">>> Accounts after transfer:");
Console.WriteLine(">>> " + cache.Get(1));
Console.WriteLine(">>> " + cache.Get(2));
Console.WriteLine();
@@ -122,7 +122,7 @@ namespace Apache.Ignite.Examples.Thick.Cache.Transaction
cache.Put(2, new Account(2, 200));
Console.WriteLine();
- Console.WriteLine(">>> Accounts before transfer: ");
+ Console.WriteLine(">>> Accounts before transfer:");
Console.WriteLine(">>> " + cache.Get(1));
Console.WriteLine(">>> " + cache.Get(2));
Console.WriteLine();
diff --git a/modules/platforms/dotnet/examples/Thick/Sql/Linq/Program.cs
b/modules/platforms/dotnet/examples/Thick/Sql/Linq/Program.cs
index b97cb65..4afc010 100644
--- a/modules/platforms/dotnet/examples/Thick/Sql/Linq/Program.cs
+++ b/modules/platforms/dotnet/examples/Thick/Sql/Linq/Program.cs
@@ -33,11 +33,11 @@ namespace Apache.Ignite.Examples.Thick.Sql.Linq
/// </summary>
public static class Program
{
- private const string OrganizationCacheName =
"dotnet_cache_query_organization";
+ private const string OrganizationCacheName =
"dotnet_linq_organization";
- private const string EmployeeCacheName = "dotnet_cache_query_employee";
+ private const string EmployeeCacheName = "dotnet_linq_employee";
- private const string EmployeeCacheNameColocated =
"dotnet_cache_query_employee_colocated";
+ private const string EmployeeCacheNameColocated =
"dotnet_linq_employee_colocated";
public static void Main()
{
diff --git
a/modules/platforms/dotnet/examples/Thin/Cache/QueryScanThin/Program.cs
b/modules/platforms/dotnet/examples/Thin/Cache/QueryScanThin/Program.cs
index e7087d7..4670516 100644
--- a/modules/platforms/dotnet/examples/Thin/Cache/QueryScanThin/Program.cs
+++ b/modules/platforms/dotnet/examples/Thin/Cache/QueryScanThin/Program.cs
@@ -36,7 +36,7 @@ namespace Apache.Ignite.Examples.Thin.Cache.QueryScanThin
/// </summary>
public static class Program
{
- private const string EmployeeCacheName = "dotnet_cache_query_employee";
+ private const string EmployeeCacheName =
"dotnet_cache_query_scan_employee";
public static void Main()
{
diff --git
a/modules/platforms/dotnet/examples/Thin/Cache/TransactionThin/Program.cs
b/modules/platforms/dotnet/examples/Thin/Cache/TransactionThin/Program.cs
index 073e0e4..681fb03 100644
--- a/modules/platforms/dotnet/examples/Thin/Cache/TransactionThin/Program.cs
+++ b/modules/platforms/dotnet/examples/Thin/Cache/TransactionThin/Program.cs
@@ -109,7 +109,7 @@ namespace Apache.Ignite.Examples.Thin.Cache.TransactionThin
Console.WriteLine(">>> Transfer finished.");
Console.WriteLine();
- Console.WriteLine(">>> Accounts after transfer: ");
+ Console.WriteLine(">>> Accounts after transfer:");
Console.WriteLine(">>> " + cache.Get(1));
Console.WriteLine(">>> " + cache.Get(2));
Console.WriteLine();
@@ -128,7 +128,7 @@ namespace Apache.Ignite.Examples.Thin.Cache.TransactionThin
cache.Put(2, new Account(2, 200));
Console.WriteLine();
- Console.WriteLine(">>> Accounts before transfer: ");
+ Console.WriteLine(">>> Accounts before transfer:");
Console.WriteLine(">>> " + cache.Get(1));
Console.WriteLine(">>> " + cache.Get(2));
Console.WriteLine();
diff --git a/modules/platforms/dotnet/examples/Thin/Sql/LinqThin/Program.cs
b/modules/platforms/dotnet/examples/Thin/Sql/LinqThin/Program.cs
index db2e270..119b809 100644
--- a/modules/platforms/dotnet/examples/Thin/Sql/LinqThin/Program.cs
+++ b/modules/platforms/dotnet/examples/Thin/Sql/LinqThin/Program.cs
@@ -39,11 +39,11 @@ namespace Apache.Ignite.Examples.Thin.Sql.LinqThin
/// </summary>
public static class Program
{
- private const string OrganizationCacheName =
"dotnet_cache_query_organization";
+ private const string OrganizationCacheName =
"dotnet_linq_organization";
- private const string EmployeeCacheName = "dotnet_cache_query_employee";
+ private const string EmployeeCacheName = "dotnet_linq_employee";
- private const string EmployeeCacheNameColocated =
"dotnet_cache_query_employee_colocated";
+ private const string EmployeeCacheNameColocated =
"dotnet_linq_employee_colocated";
public static void Main()
{