You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2017/08/31 15:14:36 UTC
[3/7] ignite git commit: IGNITE-6081 .NET: Fix PutAll for dependent
objects
IGNITE-6081 .NET: Fix PutAll for dependent objects
This closes #2555
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f104976f
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f104976f
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f104976f
Branch: refs/heads/ignite-5896
Commit: f104976fe197d592c8265b3fd30bb0324f624e38
Parents: bc8e645
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Thu Aug 31 11:38:37 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Thu Aug 31 11:38:37 2017 +0300
----------------------------------------------------------------------
.../Binary/BinarySelfTest.cs | 7 +--
.../Cache/CacheAbstractTest.cs | 50 ++++++++++++++++----
.../Impl/Binary/BinaryWriter.cs | 9 ++--
.../Impl/Binary/BinaryWriterExtensions.cs | 4 +-
.../Impl/Cache/CacheEntryFilterHolder.cs | 2 +-
.../Impl/Cache/CacheEntryProcessorHolder.cs | 4 +-
.../Impl/Cache/Store/CacheStoreInternal.cs | 14 ++----
.../Impl/Compute/Closure/ComputeActionJob.cs | 2 +-
.../Impl/Compute/Closure/ComputeFuncJob.cs | 4 +-
.../Impl/Compute/Closure/ComputeOutFuncJob.cs | 2 +-
.../Impl/Compute/ComputeFunc.cs | 2 +-
.../Impl/Compute/ComputeJob.cs | 2 +-
.../Impl/Compute/ComputeJobHolder.cs | 2 +-
.../Impl/Compute/ComputeOutFunc.cs | 2 +-
.../Impl/Deployment/PeerLoadingExtensions.cs | 4 +-
.../Impl/Deployment/PeerLoadingObjectHolder.cs | 2 +-
.../Impl/Messaging/MessageListenerHolder.cs | 2 +-
17 files changed, 68 insertions(+), 46 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
index 4237eda..3ec1e8c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Binary/BinarySelfTest.cs
@@ -1302,8 +1302,6 @@ namespace Apache.Ignite.Core.Tests.Binary
HandleOuter newOuter = outerObj.Deserialize<HandleOuter>();
- Assert.IsFalse(newOuter == newOuter.Inner.Outer);
- Assert.IsFalse(newOuter == newOuter.Inner.RawOuter);
Assert.IsFalse(newOuter == newOuter.RawInner.RawOuter);
Assert.IsFalse(newOuter == newOuter.RawInner.RawOuter);
@@ -1313,7 +1311,6 @@ namespace Apache.Ignite.Core.Tests.Binary
Assert.IsTrue(newOuter.RawInner.Outer == newOuter.RawInner.RawOuter);
Assert.IsTrue(newOuter.Inner == newOuter.Inner.Outer.Inner);
- Assert.IsTrue(newOuter.Inner == newOuter.Inner.Outer.RawInner);
Assert.IsTrue(newOuter.RawInner == newOuter.RawInner.Outer.Inner);
Assert.IsTrue(newOuter.RawInner == newOuter.RawInner.Outer.RawInner);
}
@@ -2341,7 +2338,7 @@ namespace Apache.Ignite.Core.Tests.Binary
writer.WriteString("before", Before);
- writer0.WithDetach(w => w.WriteObject("inner", Inner));
+ writer0.WriteObject("inner", Inner);
writer.WriteString("after", After);
@@ -2349,7 +2346,7 @@ namespace Apache.Ignite.Core.Tests.Binary
rawWriter.WriteString(RawBefore);
- writer0.WithDetach(w => w.WriteObject(RawInner));
+ writer0.WriteObjectDetached(RawInner);
rawWriter.WriteString(RawAfter);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
index 9e44720..27ac3f4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTest.cs
@@ -597,27 +597,52 @@ namespace Apache.Ignite.Core.Tests.Cache
}
[Test]
- public void TestPutAll()
+ public void TestPutAll([Values(true, false)] bool async)
{
var cache = Cache();
+ if (async)
+ {
+ cache = cache.WrapAsync();
+ }
+
+ // Primitives.
cache.PutAll(new Dictionary<int, int> { { 1, 1 }, { 2, 2 }, { 3, 3 } });
Assert.AreEqual(1, cache.Get(1));
Assert.AreEqual(2, cache.Get(2));
Assert.AreEqual(3, cache.Get(3));
- }
- [Test]
- public void TestPutAllAsync()
- {
- var cache = Cache().WrapAsync();
+ // Objects.
+ var cache2 = Cache<int, Container>();
- cache.PutAll(new Dictionary<int, int> { { 1, 1 }, { 2, 2 }, { 3, 3 } });
+ if (async)
+ {
+ cache2 = cache2.WrapAsync();
+ }
- Assert.AreEqual(1, cache.Get(1));
- Assert.AreEqual(2, cache.Get(2));
- Assert.AreEqual(3, cache.Get(3));
+ var obj1 = new Container();
+ var obj2 = new Container();
+ var obj3 = new Container();
+
+ obj1.Inner = obj2;
+ obj2.Inner = obj1;
+ obj3.Inner = obj2;
+
+ cache2.PutAll(new Dictionary<int, Container>
+ {
+ {1, obj1},
+ {2, obj2},
+ {3, obj3}
+ });
+
+ var res1 = cache2[1];
+ var res2 = cache2[2];
+ var res3 = cache2[3];
+
+ Assert.AreEqual(res1, res1.Inner.Inner);
+ Assert.AreEqual(res2, res2.Inner.Inner);
+ Assert.IsNotNull(res3.Inner.Inner.Inner);
}
/// <summary>
@@ -2537,5 +2562,10 @@ namespace Apache.Ignite.Core.Tests.Cache
}
}
}
+
+ private class Container
+ {
+ public Container Inner;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/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 3f35b7b..73b4136 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriter.cs
@@ -1413,11 +1413,12 @@ namespace Apache.Ignite.Core.Impl.Binary
/// <summary>
/// Perform action with detached semantics.
/// </summary>
- /// <param name="a"></param>
- internal void WithDetach(Action<BinaryWriter> a)
+ internal void WriteObjectDetached<T>(T o)
{
if (_detaching)
- a(this);
+ {
+ Write(o);
+ }
else
{
_detaching = true;
@@ -1427,7 +1428,7 @@ namespace Apache.Ignite.Core.Impl.Binary
try
{
- a(this);
+ Write(o);
}
finally
{
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
index 3dc8a96..02b5dec 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
@@ -174,8 +174,8 @@ namespace Apache.Ignite.Core.Impl.Binary
foreach (var pair in vals)
{
- writer.Write(pair.Key);
- writer.Write(pair.Value);
+ writer.WriteObjectDetached(pair.Key);
+ writer.WriteObjectDetached(pair.Value);
cnt++;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryFilterHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryFilterHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryFilterHolder.cs
index 779e350..3377f11 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryFilterHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryFilterHolder.cs
@@ -82,7 +82,7 @@ namespace Apache.Ignite.Core.Impl.Cache
{
var writer0 = (BinaryWriter)writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteObject(_pred));
+ writer0.WriteObjectDetached(_pred);
writer0.WriteBoolean(_keepBinary);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryProcessorHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryProcessorHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryProcessorHolder.cs
index 9fc7c7d..24a142a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryProcessorHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEntryProcessorHolder.cs
@@ -105,8 +105,8 @@ namespace Apache.Ignite.Core.Impl.Cache
{
var writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteObject(_proc));
- writer0.WithDetach(w => w.WriteObject(_arg));
+ writer0.WriteObjectDetached(_proc);
+ writer0.WriteObjectDetached(_arg);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
index df4c1ae..12183f8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
@@ -137,11 +137,8 @@ namespace Apache.Ignite.Core.Impl.Cache.Store
{
lock (writer) // User-defined store can be multithreaded.
{
- writer.WithDetach(w =>
- {
- w.WriteObject(k);
- w.WriteObject(v);
- });
+ writer.WriteObjectDetached(k);
+ writer.WriteObjectDetached(v);
cnt++;
}
@@ -188,11 +185,8 @@ namespace Apache.Ignite.Core.Impl.Cache.Store
{
var entry0 = entry; // Copy modified closure.
- writer.WithDetach(w =>
- {
- w.WriteObject(entry0.Key);
- w.WriteObject(entry0.Value);
- });
+ writer.WriteObjectDetached(entry0.Key);
+ writer.WriteObjectDetached(entry0.Value);
cnt++;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeActionJob.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeActionJob.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeActionJob.cs
index a1f84da..6db1055 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeActionJob.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeActionJob.cs
@@ -66,7 +66,7 @@ namespace Apache.Ignite.Core.Impl.Compute.Closure
{
var writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteWithPeerDeployment(_action));
+ writer0.WriteWithPeerDeployment(_action);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeFuncJob.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeFuncJob.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeFuncJob.cs
index 8350818..ecb4b98 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeFuncJob.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeFuncJob.cs
@@ -68,8 +68,8 @@ namespace Apache.Ignite.Core.Impl.Compute.Closure
{
BinaryWriter writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteWithPeerDeployment(_clo));
- writer0.WithDetach(w => w.WriteWithPeerDeployment(_arg));
+ writer0.WriteWithPeerDeployment(_clo);
+ writer0.WriteWithPeerDeployment(_arg);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeOutFuncJob.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeOutFuncJob.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeOutFuncJob.cs
index abdf448..9652794 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeOutFuncJob.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/Closure/ComputeOutFuncJob.cs
@@ -62,7 +62,7 @@ namespace Apache.Ignite.Core.Impl.Compute.Closure
{
var writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteObject(_clo));
+ writer0.WriteObjectDetached(_clo);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeFunc.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeFunc.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeFunc.cs
index 4132347..44f2880 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeFunc.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeFunc.cs
@@ -79,7 +79,7 @@ namespace Apache.Ignite.Core.Impl.Compute
{
var writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteWithPeerDeployment(_func));
+ writer0.WriteWithPeerDeployment(_func);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJob.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJob.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJob.cs
index 56e3708..57e234c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJob.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJob.cs
@@ -109,7 +109,7 @@ namespace Apache.Ignite.Core.Impl.Compute
{
var writer0 = (BinaryWriter)writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteWithPeerDeployment(Job));
+ writer0.WriteWithPeerDeployment(Job);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
index 120d074..5c009ac 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeJobHolder.cs
@@ -223,7 +223,7 @@ namespace Apache.Ignite.Core.Impl.Compute
{
BinaryWriter writer0 = (BinaryWriter) writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteObject(_job));
+ writer0.WriteObjectDetached(_job);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeOutFunc.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeOutFunc.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeOutFunc.cs
index 4e5f523..3d59245 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeOutFunc.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeOutFunc.cs
@@ -83,7 +83,7 @@ namespace Apache.Ignite.Core.Impl.Compute
{
var writer0 = (BinaryWriter)writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteWithPeerDeployment(_func));
+ writer0.WriteWithPeerDeployment(_func);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingExtensions.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingExtensions.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingExtensions.cs
index 035a041..614f26c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingExtensions.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingExtensions.cs
@@ -40,7 +40,7 @@ namespace Apache.Ignite.Core.Impl.Deployment
try
{
writer.WrapperFunc = WrapperFunc;
- writer.WriteObject(o);
+ writer.WriteObjectDetached(o);
}
finally
{
@@ -49,7 +49,7 @@ namespace Apache.Ignite.Core.Impl.Deployment
}
else
{
- writer.WriteObject(o);
+ writer.WriteObjectDetached(o);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingObjectHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingObjectHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingObjectHolder.cs
index 584750a..9457538 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingObjectHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Deployment/PeerLoadingObjectHolder.cs
@@ -84,7 +84,7 @@ namespace Apache.Ignite.Core.Impl.Deployment
writer0.WriteGuid(writer0.Marshaller.Ignite.GetLocalNode().Id);
writer0.WriteString(_object.GetType().AssemblyQualifiedName);
- writer0.WithDetach(w => w.WriteObject(_object));
+ writer0.WriteObjectDetached(_object);
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/f104976f/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/MessageListenerHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/MessageListenerHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/MessageListenerHolder.cs
index 8e794d1..6e4e9f7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/MessageListenerHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/MessageListenerHolder.cs
@@ -148,7 +148,7 @@ namespace Apache.Ignite.Core.Impl.Messaging
{
var writer0 = (BinaryWriter)writer.GetRawWriter();
- writer0.WithDetach(w => w.WriteObject(Filter));
+ writer0.WriteObjectDetached(Filter);
}
/// <summary>