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 2016/11/17 09:56:19 UTC
ignite git commit: IGNITE-4137 .NET: Atomic examples added
Repository: ignite
Updated Branches:
refs/heads/master f3b9ded50 -> 19a62db57
IGNITE-4137 .NET: Atomic examples added
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/19a62db5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/19a62db5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/19a62db5
Branch: refs/heads/master
Commit: 19a62db571c5dd8bb01ddee607a5a77d45ae2001
Parents: f3b9ded
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Thu Nov 17 12:56:11 2016 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Thu Nov 17 12:56:11 2016 +0300
----------------------------------------------------------------------
.../Apache.Ignite.Examples.csproj | 3 +
.../DataStructures/AtomicLongExample.cs | 65 +++++++++++++++
.../DataStructures/AtomicReferenceExample.cs | 65 +++++++++++++++
.../DataStructures/AtomicSequenceExample.cs | 88 ++++++++++++++++++++
.../Apache.Ignite.ExamplesDll.csproj | 3 +
.../DataStructures/AtomicLongIncrementAction.cs | 49 +++++++++++
.../AtomicReferenceModifyAction.cs | 61 ++++++++++++++
.../AtomicSequenceIncrementAction.cs | 49 +++++++++++
8 files changed, 383 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Apache.Ignite.Examples.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Apache.Ignite.Examples.csproj b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Apache.Ignite.Examples.csproj
index 2583381..b601529 100644
--- a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Apache.Ignite.Examples.csproj
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/Apache.Ignite.Examples.csproj
@@ -60,6 +60,9 @@
<Compile Include="Datagrid\StoreExample.cs" />
<Compile Include="Datagrid\TransactionDeadlockDetectionExample.cs" />
<Compile Include="Datagrid\TransactionExample.cs" />
+ <Compile Include="DataStructures\AtomicLongExample.cs" />
+ <Compile Include="DataStructures\AtomicReferenceExample.cs" />
+ <Compile Include="DataStructures\AtomicSequenceExample.cs" />
<Compile Include="Events\EventsExample.cs" />
<Compile Include="Messaging\MessagingExample.cs" />
<Compile Include="Misc\LifecycleExample.cs" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicLongExample.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicLongExample.cs b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicLongExample.cs
new file mode 100644
index 0000000..86f28a5
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicLongExample.cs
@@ -0,0 +1,65 @@
+\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.Examples.DataStructures
+{
+ using System;
+ using System.Threading;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.ExamplesDll.DataStructures;
+
+ /// <summary>
+ /// The example demonstrates the usage of the distributed atomic long data structure, which has functionality
+ /// similar to <see cref="Interlocked"/>, but provides cluster-wide atomicity guarantees.
+ /// <para />
+ /// 1) Set this class as startup object (Apache.Ignite.Examples project -> right-click -> Properties ->
+ /// Application -> Startup object);
+ /// 2) Start example (F5 or Ctrl+F5).
+ /// <para />
+ /// This example can be run with standalone Apache Ignite.NET node:
+ /// 1) Run %IGNITE_HOME%/platforms/dotnet/bin/Apache.Ignite.exe:
+ /// Apache.Ignite.exe -configFileName=platforms\dotnet\examples\apache.ignite.examples\app.config -assembly=[path_to_Apache.Ignite.ExamplesDll.dll]
+ /// 2) Start example.
+ /// </summary>
+ public static class AtomicLongExample
+ {
+ [STAThread]
+ public static void Main()
+ {
+ using (var ignite = Ignition.StartFromApplicationConfiguration())
+ {
+ Console.WriteLine();
+ Console.WriteLine(">>> Atomic long example started.");
+
+ IAtomicLong atomicLong = ignite.GetAtomicLong(AtomicLongIncrementAction.AtomicLongName, 0, true);
+
+ Console.WriteLine(">>> Atomic long initial value: " + atomicLong.Read());
+
+ // Broadcast an action that increments AtomicLong a number of times.
+ ignite.GetCompute().Broadcast(new AtomicLongIncrementAction());
+
+ // Actual value will depend on a number of participating nodes.
+ Console.WriteLine("\n>>> Atomic long current value: " + atomicLong.Read());
+ }
+
+ Console.WriteLine("\n>>> Check output on all nodes.");
+ Console.WriteLine("\n>>> Example finished, press any key to exit ...");
+ Console.ReadKey();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicReferenceExample.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicReferenceExample.cs b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicReferenceExample.cs
new file mode 100644
index 0000000..9d44bcf
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicReferenceExample.cs
@@ -0,0 +1,65 @@
+\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.Examples.DataStructures
+{
+ using System;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.ExamplesDll.DataStructures;
+
+ /// <summary>
+ /// The example demonstrates the usage of the distributed atomic reference data structure.
+ /// <para />
+ /// 1) Set this class as startup object (Apache.Ignite.Examples project -> right-click -> Properties ->
+ /// Application -> Startup object);
+ /// 2) Start example (F5 or Ctrl+F5).
+ /// <para />
+ /// This example can be run with standalone Apache Ignite.NET node:
+ /// 1) Run %IGNITE_HOME%/platforms/dotnet/bin/Apache.Ignite.exe:
+ /// Apache.Ignite.exe -configFileName=platforms\dotnet\examples\apache.ignite.examples\app.config -assembly=[path_to_Apache.Ignite.ExamplesDll.dll]
+ /// 2) Start example.
+ /// </summary>
+ public static class AtomicReferenceExample
+ {
+ [STAThread]
+ public static void Main()
+ {
+ using (var ignite = Ignition.StartFromApplicationConfiguration())
+ {
+ Console.WriteLine();
+ Console.WriteLine(">>> Atomic reference example started.");
+
+ // Create atomic reference with a value of empty Guid.
+ IAtomicReference<Guid> atomicRef = ignite.GetAtomicReference(
+ AtomicReferenceModifyAction.AtomicReferenceName, Guid.Empty, true);
+
+ // Make sure initial value is set to Empty.
+ atomicRef.Write(Guid.Empty);
+
+ // Attempt to modify the value on each node. Only one node will succeed.
+ ignite.GetCompute().Broadcast(new AtomicReferenceModifyAction());
+
+ // Print current value which is equal to the Id of the node that has modified the reference first.
+ Console.WriteLine("\n>>> Current atomic reference value: " + atomicRef.Read());
+ }
+
+ Console.WriteLine("\n>>> Example finished, press any key to exit ...");
+ Console.ReadKey();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicSequenceExample.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicSequenceExample.cs b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicSequenceExample.cs
new file mode 100644
index 0000000..f08c998
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.Examples/DataStructures/AtomicSequenceExample.cs
@@ -0,0 +1,88 @@
+\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.Examples.DataStructures
+{
+ using System;
+ using System.Threading;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.Core.DataStructures.Configuration;
+ using Apache.Ignite.Core.Discovery.Tcp;
+ using Apache.Ignite.Core.Discovery.Tcp.Multicast;
+ using Apache.Ignite.ExamplesDll.DataStructures;
+
+ /// <summary>
+ /// The example demonstrates the usage of the distributed atomic sequence data structure, which has functionality
+ /// similar to <see cref="Interlocked"/>, but provides cluster-wide atomicity guarantees.
+ /// <para />
+ /// 1) Set this class as startup object (Apache.Ignite.Examples project -> right-click -> Properties ->
+ /// Application -> Startup object);
+ /// 2) Start example (F5 or Ctrl+F5).
+ /// <para />
+ /// This example can be run with standalone Apache Ignite.NET node:
+ /// 1) Run %IGNITE_HOME%/platforms/dotnet/bin/Apache.Ignite.exe:
+ /// Apache.Ignite.exe -configFileName=platforms\dotnet\examples\apache.ignite.examples\app.config -assembly=[path_to_Apache.Ignite.ExamplesDll.dll]
+ /// 2) Start example.
+ /// </summary>
+ public static class AtomicSequenceExample
+ {
+ [STAThread]
+ public static void Main()
+ {
+ var atomicCfg = new AtomicConfiguration
+ {
+ // Each node reserves 10 numbers to itself, so that 10 increments can be done locally,
+ // without communicating to other nodes. After that, another 10 elements are reserved.
+ AtomicSequenceReserveSize = 10
+ };
+
+ var cfg = new IgniteConfiguration
+ {
+ DiscoverySpi = new TcpDiscoverySpi
+ {
+ IpFinder = new TcpDiscoveryMulticastIpFinder
+ {
+ Endpoints = new[] { "127.0.0.1:47500" }
+ }
+ },
+ AtomicConfiguration = atomicCfg
+ };
+
+ using (var ignite = Ignition.Start(cfg))
+ {
+ Console.WriteLine();
+ Console.WriteLine(">>> Atomic sequence example started.");
+
+ IAtomicSequence atomicSequence =
+ ignite.GetAtomicSequence(AtomicSequenceIncrementAction.AtomicSequenceName, 0, true);
+
+ Console.WriteLine(">>> Atomic sequence initial value: " + atomicSequence.Read());
+
+ // Broadcast an action that increments AtomicSequence a number of times.
+ ignite.GetCompute().Broadcast(new AtomicSequenceIncrementAction());
+
+ // Actual value will depend on number of participating nodes.
+ Console.WriteLine("\n>>> Atomic sequence current value: " + atomicSequence.Read());
+ }
+
+ Console.WriteLine("\n>>> Check output on all nodes.");
+ Console.WriteLine("\n>>> Example finished, press any key to exit ...");
+ Console.ReadKey();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Apache.Ignite.ExamplesDll.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Apache.Ignite.ExamplesDll.csproj b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Apache.Ignite.ExamplesDll.csproj
index a41c2f4..4ab2d4b 100644
--- a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Apache.Ignite.ExamplesDll.csproj
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/Apache.Ignite.ExamplesDll.csproj
@@ -50,6 +50,9 @@
<Compile Include="Datagrid\ContinuousQueryFilter.cs" />
<Compile Include="Datagrid\EmployeeStore.cs" />
<Compile Include="Datagrid\ScanQueryFilter.cs" />
+ <Compile Include="DataStructures\AtomicReferenceModifyAction.cs" />
+ <Compile Include="DataStructures\AtomicSequenceIncrementAction.cs" />
+ <Compile Include="DataStructures\AtomicLongIncrementAction.cs" />
<Compile Include="Events\LocalListener.cs" />
<Compile Include="Messaging\LocalListener.cs" />
<Compile Include="Messaging\RemoteOrderedListener.cs" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicLongIncrementAction.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicLongIncrementAction.cs b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicLongIncrementAction.cs
new file mode 100644
index 0000000..87732f8
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicLongIncrementAction.cs
@@ -0,0 +1,49 @@
+\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.ExamplesDll.DataStructures
+{
+ using System;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.Compute;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.Core.Resource;
+
+ /// <summary>
+ /// Increments atomic long.
+ /// </summary>
+ [Serializable]
+ public class AtomicLongIncrementAction : IComputeAction
+ {
+ /** */
+ public const string AtomicLongName = "dotnet_atomic_long";
+
+ /** */
+ [InstanceResource] private readonly IIgnite _ignite;
+
+ /// <summary>
+ /// Invokes action.
+ /// </summary>
+ public void Invoke()
+ {
+ IAtomicLong atomicLong = _ignite.GetAtomicLong(AtomicLongName, 0, true);
+
+ for (int i = 0; i < 20; i++)
+ Console.WriteLine(">>> AtomicLong value has been incremented: " + atomicLong.Increment());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicReferenceModifyAction.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicReferenceModifyAction.cs b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicReferenceModifyAction.cs
new file mode 100644
index 0000000..196a2d1
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicReferenceModifyAction.cs
@@ -0,0 +1,61 @@
+\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.ExamplesDll.DataStructures
+{
+ using System;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.Compute;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.Core.Resource;
+
+ /// <summary>
+ /// Increments atomic sequence.
+ /// </summary>
+ [Serializable]
+ public class AtomicReferenceModifyAction : IComputeAction
+ {
+ /** */
+ public const string AtomicReferenceName = "dotnet_atomic_reference";
+
+ /** */
+ [InstanceResource] private readonly IIgnite _ignite;
+
+ /// <summary>
+ /// Invokes action.
+ /// </summary>
+ public void Invoke()
+ {
+ // Get or create the atomic reference.
+ IAtomicReference<Guid> atomicRef = _ignite.GetAtomicReference(AtomicReferenceName, Guid.Empty, true);
+
+ // Get local node id.
+ Guid localNodeId = _ignite.GetCluster().GetLocalNode().Id;
+
+ // Replace empty value with current node id.
+ Guid expectedValue = Guid.Empty;
+
+ Guid originalValue = atomicRef.CompareExchange(localNodeId, expectedValue);
+
+ if (originalValue == expectedValue)
+ Console.WriteLine(">>> Successfully updated atomic reference on node {0}", localNodeId);
+ else
+ Console.WriteLine(">>> Failed to update atomic reference on node {0}, actual value is {1}",
+ localNodeId, originalValue);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/19a62db5/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicSequenceIncrementAction.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicSequenceIncrementAction.cs b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicSequenceIncrementAction.cs
new file mode 100644
index 0000000..c7112b9
--- /dev/null
+++ b/modules/platforms/dotnet/examples/Apache.Ignite.ExamplesDll/DataStructures/AtomicSequenceIncrementAction.cs
@@ -0,0 +1,49 @@
+\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.ExamplesDll.DataStructures
+{
+ using System;
+ using Apache.Ignite.Core;
+ using Apache.Ignite.Core.Compute;
+ using Apache.Ignite.Core.DataStructures;
+ using Apache.Ignite.Core.Resource;
+
+ /// <summary>
+ /// Increments atomic sequence.
+ /// </summary>
+ [Serializable]
+ public class AtomicSequenceIncrementAction : IComputeAction
+ {
+ /** */
+ public const string AtomicSequenceName = "dotnet_atomic_sequence";
+
+ /** */
+ [InstanceResource] private readonly IIgnite _ignite;
+
+ /// <summary>
+ /// Invokes action.
+ /// </summary>
+ public void Invoke()
+ {
+ IAtomicSequence atomicSequence = _ignite.GetAtomicSequence(AtomicSequenceName, 0, true);
+
+ for (int i = 0; i < 20; i++)
+ Console.WriteLine(">>> AtomicSequence value has been incremented: " + atomicSequence.Increment());
+ }
+ }
+}