You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/10/07 11:59:31 UTC

[4/4] ignite git commit: IGNITE-1282: Refactoring.

IGNITE-1282: Refactoring.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3548457c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3548457c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3548457c

Branch: refs/heads/ignite-1282-opto
Commit: 3548457c234456f1a3695dac497ceb452c4971ed
Parents: b34084e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Oct 7 13:00:05 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Oct 7 13:00:05 2015 +0300

----------------------------------------------------------------------
 .../Apache.Ignite.Core.Tests.csproj             |   1 +
 .../Portable/PortableStructureTest.cs           | 260 +++++++++++++++++++
 .../Impl/Portable/IPortableTypeDescriptor.cs    |   2 +-
 .../Impl/Portable/PortableFullTypeDescriptor.cs |   2 +-
 .../Portable/PortableSurrogateTypeDescriptor.cs |   2 +-
 .../Impl/Portable/PortableWriterImpl.cs         |   2 +-
 .../Portable/Structure/PortableStructure.cs     |  30 ++-
 .../Structure/PortableStructureEntry.cs         |   8 +-
 .../Structure/PortableStructureJumpTable.cs     |   4 +-
 9 files changed, 295 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/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 90f3481..7cbe784 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
@@ -111,6 +111,7 @@
     <Compile Include="MarshallerTest.cs" />
     <Compile Include="MessagingTest.cs" />
     <Compile Include="PortableConfigurationTest.cs" />
+    <Compile Include="Portable\PortableStructureTest.cs" />
     <Compile Include="SerializationTest.cs" />
     <Compile Include="IgniteStartStopTest.cs" />
     <Compile Include="TestUtils.cs" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Portable/PortableStructureTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Portable/PortableStructureTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Portable/PortableStructureTest.cs
new file mode 100644
index 0000000..46c9539
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Portable/PortableStructureTest.cs
@@ -0,0 +1,260 @@
+/*
+ * 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.Portable
+{
+    using System;
+    using System.Collections.Generic;
+    using Apache.Ignite.Core.Impl;
+    using Apache.Ignite.Core.Impl.Portable;
+    using Apache.Ignite.Core.Impl.Portable.Structure;
+    using Apache.Ignite.Core.Portable;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Contains tests for portable type structure.
+    /// </summary>
+    [TestFixture]
+    public class PortableStructureTest
+    {
+        /** Repeat count. */
+        public static readonly int RepeatCnt = 10;
+
+        public static readonly int ObjectsPerMode = 5;
+
+        /// <summary>
+        /// Test object write with different structures.
+        /// </summary>
+        [Test]
+        public void TestStructure()
+        {
+            for (int i = 1; i <= RepeatCnt; i++)
+            {
+                Console.WriteLine(">>> Iteration started: " + i);
+
+                // 1. Generate and shuffle objects.
+                IList<BranchedType> objs = new List<BranchedType>();
+
+                for (int j = 0; j < 6 * ObjectsPerMode; j++)
+                    objs.Add(new BranchedType((j%6) + 1));
+
+                objs = IgniteUtils.Shuffle(objs);
+
+                // 2. Create new marshaller.
+                PortableTypeConfiguration typeCfg = new PortableTypeConfiguration(typeof(BranchedType));
+
+                PortableConfiguration cfg = new PortableConfiguration
+                {
+                    TypeConfigurations = new List<PortableTypeConfiguration> { typeCfg }
+                };
+
+                PortableMarshaller marsh = new PortableMarshaller(cfg);
+
+                // 3. Marshal all data and ensure deserialized object is fine.
+                foreach (BranchedType obj in objs)
+                {
+                    Console.WriteLine(">>> Write object [mode=" + obj.mode + ']');
+
+                    byte[] data = marsh.Marshal(obj);
+
+                    BranchedType other = marsh.Unmarshal<BranchedType>(data);
+
+                    Assert.IsTrue(obj.Equals(other));
+                }
+                
+                Console.WriteLine();
+
+                // 4. Ensure that all fields are recorded.
+                IPortableTypeDescriptor desc = marsh.Descriptor(typeof (BranchedType));
+
+                PortableStructure typeStruct = desc.TypeStructure;
+
+                IDictionary<string, byte> fields = typeStruct.FieldTypes;
+
+                Assert.IsTrue(fields.Count == 8);
+
+                Assert.IsTrue(fields.ContainsKey("mode"));
+                Assert.IsTrue(fields.ContainsKey("f2"));
+                Assert.IsTrue(fields.ContainsKey("f3"));
+                Assert.IsTrue(fields.ContainsKey("f4"));
+                Assert.IsTrue(fields.ContainsKey("f5"));
+                Assert.IsTrue(fields.ContainsKey("f6"));
+                Assert.IsTrue(fields.ContainsKey("f7"));
+                Assert.IsTrue(fields.ContainsKey("f8"));
+            }
+        }
+    }
+
+    public class BranchedType : IPortableMarshalAware
+    {
+        public int mode;
+        public int f2;
+        public int f3;
+        public int f4;
+        public int f5;
+        public int f6;
+        public int f7;
+        public int f8;
+
+        public BranchedType(int mode)
+        {
+            this.mode = mode;
+
+            switch (mode)
+            {
+                case 1:
+                    f2 = 2;
+
+                    break;
+
+                case 2:
+                    f2 = 2;
+                    f3 = 3;
+                    f4 = 4;
+
+                    break;
+
+                case 3:
+                    f2 = 2;
+                    f3 = 3;
+                    f5 = 5;
+
+                    break;
+
+                case 4:
+                    f2 = 2;
+                    f3 = 3;
+                    f5 = 5;
+                    f6 = 6;
+
+                    break;
+
+                case 5:
+                    f2 = 2;
+                    f3 = 3;
+                    f7 = 7;
+
+                    break;
+
+                case 6:
+                    f8 = 8;
+
+                    break;
+            }
+        }
+
+        public void WritePortable(IPortableWriter writer)
+        {
+            writer.WriteInt("mode", mode);
+
+            switch (mode)
+            {
+                case 1:
+                    writer.WriteInt("f2", f2);
+
+                    break;
+
+                case 2:
+                    writer.WriteInt("f2", f2);
+                    writer.WriteInt("f3", f3);
+                    writer.WriteInt("f4", f4);
+
+                    break;
+
+                case 3:
+                    writer.WriteInt("f2", f2);
+                    writer.WriteInt("f3", f3);
+                    writer.WriteInt("f5", f5);
+
+                    break;
+
+                case 4:
+                    writer.WriteInt("f2", f2);
+                    writer.WriteInt("f3", f3);
+                    writer.WriteInt("f5", f5);
+                    writer.WriteInt("f6", f6);
+
+                    break;
+
+                case 5:
+                    writer.WriteInt("f2", f2);
+                    writer.WriteInt("f3", f3);
+                    writer.WriteInt("f7", f7);
+
+                    break;
+
+                case 6:
+                    writer.WriteInt("f8", f8);
+
+                    break;
+            }
+        }
+
+        public void ReadPortable(IPortableReader reader)
+        {
+            mode = reader.ReadInt("mode");
+
+            switch (mode)
+            {
+                case 1:
+                    f2 = reader.ReadInt("f2");
+
+                    break;
+
+                case 2:
+                    f2 = reader.ReadInt("f2");
+                    f3 = reader.ReadInt("f3");
+                    f4 = reader.ReadInt("f4");
+
+                    break;
+
+                case 3:
+                    f2 = reader.ReadInt("f2");
+                    f3 = reader.ReadInt("f3");
+                    f5 = reader.ReadInt("f5");
+
+                    break;
+
+                case 4:
+                    f2 = reader.ReadInt("f2");
+                    f3 = reader.ReadInt("f3");
+                    f5 = reader.ReadInt("f5");
+                    f6 = reader.ReadInt("f6");
+
+                    break;
+
+                case 5:
+                    f2 = reader.ReadInt("f2");
+                    f3 = reader.ReadInt("f3");
+                    f7 = reader.ReadInt("f7");
+
+                    break;
+
+                case 6:
+                    f8 = reader.ReadInt("f8");
+
+                    break;
+            }
+        }
+
+        public bool Equals(BranchedType other)
+        {
+            return mode == other.mode && f2 == other.f2 && f3 == other.f3 && f4 == other.f4 && f5 == other.f5 &&
+                   f6 == other.f6 && f7 == other.f7 && f8 == other.f8;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/IPortableTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/IPortableTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/IPortableTypeDescriptor.cs
index 8a84daf..d4bde4f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/IPortableTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/IPortableTypeDescriptor.cs
@@ -118,6 +118,6 @@ namespace Apache.Ignite.Core.Impl.Portable
         /// <param name="exp">Expected type structure.</param>
         /// <param name="pathIdx">Path index.</param>
         /// <param name="updates">Recorded updates.</param>
-        void UpdateStrcuture(PortableStructure exp, int pathIdx, IList<PortableStructureUpdate> updates);
+        void UpdateStructure(PortableStructure exp, int pathIdx, IList<PortableStructureUpdate> updates);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableFullTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableFullTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableFullTypeDescriptor.cs
index 247a0b0..701147d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableFullTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableFullTypeDescriptor.cs
@@ -184,7 +184,7 @@ namespace Apache.Ignite.Core.Impl.Portable
         }
 
         /** <inheritDoc /> */
-        public void UpdateStrcuture(PortableStructure exp, int pathIdx, 
+        public void UpdateStructure(PortableStructure exp, int pathIdx, 
             IList<PortableStructureUpdate> updates)
         {
             lock (this)

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSurrogateTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSurrogateTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSurrogateTypeDescriptor.cs
index 103dd75..e786746 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSurrogateTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableSurrogateTypeDescriptor.cs
@@ -131,7 +131,7 @@ namespace Apache.Ignite.Core.Impl.Portable
         }
 
         /** <inheritDoc /> */
-        public void UpdateStrcuture(PortableStructure exp, int pathIdx,
+        public void UpdateStructure(PortableStructure exp, int pathIdx,
             IList<PortableStructureUpdate> updates)
         {
             lock (this)

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs
index cafc69d..09ca45e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/PortableWriterImpl.cs
@@ -1345,7 +1345,7 @@ namespace Apache.Ignite.Core.Impl.Portable
                 // Apply structure updates if any.
                 if (_curStructUpdates != null)
                 {
-                    desc.UpdateStrcuture(_curStruct, _curStructPath, _curStructUpdates);
+                    desc.UpdateStructure(_curStruct, _curStructPath, _curStructUpdates);
 
                     IPortableMetadataHandler metaHnd = _marsh.MetadataHandler(desc);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructure.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructure.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructure.cs
index c434110..aaeaadd 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructure.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructure.cs
@@ -99,9 +99,9 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
                     if (pathIdx0 < 0)
                         return 0;
 
-                    Debug.Assert(pathIdx < _paths.Length);
+                    Debug.Assert(pathIdx0 < _paths.Length);
 
-                    entry = _paths[pathIdx][actionIdx];
+                    entry = _paths[pathIdx0][actionIdx];
 
                     entry.ValidateType(fieldType);
 
@@ -219,7 +219,12 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
                         {
                             newPaths[oldPathIdx][i] = newPaths[pathIdx][i];
 
-                            newPaths[pathIdx][i] = new PortableStructureEntry();
+                            if (i == firstUpdate.Index)
+                                // Jump table must be placed here.
+                                newPaths[pathIdx][i] = new PortableStructureEntry(newJumpIdx);
+                            else
+                                // Just nullify.
+                                newPaths[pathIdx][i] = new PortableStructureEntry();
                         }
 
                         // Apply updats to the new path.
@@ -246,11 +251,12 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
 
             int newPathLen = Math.Max(_paths[0].Length, minLen);
 
-            for (int i = 0; i < _paths.Length; i++)
+            for (int i = 0; i < newPaths.Length; i++)
             {
                 newPaths[i] = new PortableStructureEntry[newPathLen];
 
-                Array.Copy(_paths[i], newPaths[i], _paths[i].Length);
+                if (i < _paths.Length)
+                    Array.Copy(_paths[i], newPaths[i], _paths[i].Length);
             }
 
             return newPaths;
@@ -265,8 +271,12 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
         {
             var newJumps = new PortableStructureJumpTable[_jumps.Length + additionalJumps];
 
-            for (int i = 0; i < _jumps.Length; i++)
+            for (int i = 1; i < _jumps.Length; i++)
+            {
+                // The very first jump is always null so that we can distinguish jump table 
+                // and empty value in PortableStructureEntry.
                 newJumps[i] = _jumps[i].Copy();
+            }
 
             return newJumps;
         }
@@ -313,5 +323,13 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
             return newFieldTypes.Count == _fieldTypes.Count ? 
                 this : new PortableStructure(_paths, _jumps, newFieldTypes);
         }
+
+        /// <summary>
+        /// Recorded field types.
+        /// </summary>
+        internal IDictionary<string, byte> FieldTypes
+        {
+            get { return _fieldTypes; }
+        } 
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureEntry.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureEntry.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureEntry.cs
index 5229a95..e3efc2a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureEntry.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureEntry.cs
@@ -66,12 +66,12 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
         /// <summary>
         /// Check whether current field entry matches passed arguments.
         /// </summary>
-        /// <param name="name"></param>
-        /// <param name="type"></param>
-        /// <returns></returns>
+        /// <param name="name">Field name.</param>
+        /// <param name="type">Field type.</param>
+        /// <returns>True if expected.</returns>
         public bool IsExpected(string name, byte type)
         {
-            if (!ReferenceEquals(_name, name) && !_name.Equals(name))
+            if (!ReferenceEquals(_name, name) && !name.Equals(_name))
                 return false;
 
             ValidateType(type);

http://git-wip-us.apache.org/repos/asf/ignite/blob/3548457c/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureJumpTable.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureJumpTable.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureJumpTable.cs
index 85e71c4..9eab9d4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureJumpTable.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Portable/Structure/PortableStructureJumpTable.cs
@@ -52,8 +52,8 @@ namespace Apache.Ignite.Core.Impl.Portable.Structure
         /// <param name="pathIdxs">Path indexes.</param>
         private PortableStructureJumpTable(string[] names, int[] pathIdxs)
         {
-            Debug.Assert(_names.Length > 1);
-            Debug.Assert(_names.Length == pathIdxs.Length);
+            Debug.Assert(names.Length > 1);
+            Debug.Assert(names.Length == pathIdxs.Length);
             
             _names = names;
             _pathIdxs = pathIdxs;