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/11/02 13:01:58 UTC

[1/7] ignite git commit: IGNITE-1814: WIP.

Repository: ignite
Updated Branches:
  refs/heads/ignite-1814 [created] e225cab21


IGNITE-1814: WIP.


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

Branch: refs/heads/ignite-1814
Commit: 247825e2624215d7d372d2058f2cae49318a5055
Parents: 00c3a43
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 12:15:47 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 12:15:47 2015 +0300

----------------------------------------------------------------------
 .../ignite/internal/portable/PortableUtils.java |  6 ++
 .../internal/portable/PortableWriterExImpl.java | 63 ++++++++++++++++++--
 2 files changed, 64 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/247825e2/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index eafcbd1..c369317 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -100,6 +100,12 @@ public class PortableUtils {
     /** Flag: only raw data exists. */
     public static final short FLAG_RAW_ONLY = 0x2;
 
+    /** Flag: offsets take 1 byte. */
+    public static final short FLAG_OFFSET_ONE_BYTE = 0x4;
+
+    /** Flag: offsets take 2 bytes. */
+    public static final short FLAG_OFFSET_TWO_BYTES = 0x8;
+
     /**
      * Write flags.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/247825e2/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
index 227087b..5991f18 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
@@ -99,6 +99,21 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
     /** FNV1 hash prime. */
     private static final int FNV1_PRIME = 0x01000193;
 
+    /** Maximum offset which fits in 1 byte. */
+    private static final int MAX_OFFSET_1 = 2 << 8;
+
+    /** Maximum offset which fits in 2 bytes. */
+    private static final int MAX_OFFSET_2 = 2 << 16;
+
+    /** Offset which fits into 1 byte. */
+    private static final int OFFSET_1 = 1;
+
+    /** Offset which fits into 2 bytes. */
+    private static final int OFFSET_2 = 2;
+
+    /** Offset which fits into 4 bytes. */
+    private static final int OFFSET_4 = 4;
+
     /** Thread-local schema. */
     private static final ThreadLocal<SchemaHolder> SCHEMA = new ThreadLocal<>();
 
@@ -342,11 +357,22 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
             out.writeInt(start + SCHEMA_OR_RAW_OFF_POS, out.position() - start);
 
             // Write the schema.
-            schema.writeAndPop(this, fieldCnt);
+            int offsetByteCnt = schema.writeAndPop(this, fieldCnt);
 
             // Write raw offset if needed.
             if (rawOffPos != 0)
                 out.writeInt(rawOffPos - start);
+
+            if (offsetByteCnt == OFFSET_1) {
+                int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_OFFSET_ONE_BYTE;
+
+                out.writeShort(start + FLAGS_POS, (short)flags);
+            }
+            else if (offsetByteCnt == OFFSET_2) {
+                int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_OFFSET_TWO_BYTES;
+
+                out.writeShort(start + FLAGS_POS, (short)flags);
+            }
         }
         else {
             // Write raw-only flag is needed.
@@ -1834,15 +1860,40 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
          *
          * @param writer Writer.
          * @param cnt Count.
+         * @return Amount of bytes dedicated to
          */
-        public void writeAndPop(PortableWriterExImpl writer, int cnt) {
+        public int writeAndPop(PortableWriterExImpl writer, int cnt) {
             int startIdx = idx - cnt * 2;
 
             assert startIdx >= 0;
 
-            for (int idx0 = startIdx; idx0 < idx;) {
-                writer.writeInt(data[idx0++]);
-                writer.writeInt(data[idx0++]);
+            int lastOffset = data[idx - 1];
+
+            int res;
+
+            if (lastOffset < MAX_OFFSET_1) {
+                for (int idx0 = startIdx; idx0 < idx; ) {
+                    writer.writeInt(data[idx0++]);
+                    writer.writeByte((byte) data[idx0++]);
+                }
+
+                res = OFFSET_1;
+            }
+            else if (lastOffset < MAX_OFFSET_2) {
+                for (int idx0 = startIdx; idx0 < idx; ) {
+                    writer.writeInt(data[idx0++]);
+                    writer.writeShort((short)data[idx0++]);
+                }
+
+                res = OFFSET_2;
+            }
+            else {
+                for (int idx0 = startIdx; idx0 < idx; ) {
+                    writer.writeInt(data[idx0++]);
+                    writer.writeInt(data[idx0++]);
+                }
+
+                res = OFFSET_4;
             }
 
             idx = startIdx;
@@ -1850,6 +1901,8 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
             // Shrink data array if needed.
             if (idx == 0 && data.length > MAX_SIZE)
                 data = new int[MAX_SIZE];
+
+            return res;
         }
     }
 }


[5/7] ignite git commit: IGNITE-1814: Fixed offheap object.

Posted by vo...@apache.org.
IGNITE-1814: Fixed offheap object.


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

Branch: refs/heads/ignite-1814
Commit: a28fe9b8806313211209fdb966022940e48cdf91
Parents: c74b98e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 13:26:28 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 13:26:28 2015 +0300

----------------------------------------------------------------------
 .../portable/PortableObjectOffheapImpl.java     | 112 +++++++++++++++----
 .../internal/portable/PortablePrimitives.java   |  96 ++++++++++++++++
 2 files changed, 188 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/a28fe9b8/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
index 0559c06..46401a4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
@@ -17,16 +17,10 @@
 
 package org.apache.ignite.internal.portable;
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.portable.streams.PortableOffheapInputStream;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
-import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.plugin.extensions.communication.MessageReader;
 import org.apache.ignite.plugin.extensions.communication.MessageWriter;
@@ -35,7 +29,21 @@ import org.apache.ignite.portable.PortableField;
 import org.apache.ignite.portable.PortableMetadata;
 import org.apache.ignite.portable.PortableObject;
 import org.jetbrains.annotations.Nullable;
-import sun.misc.Unsafe;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.nio.ByteBuffer;
+
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.BOOLEAN;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.BYTE;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.CHAR;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DOUBLE;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLOAT;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.INT;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.LONG;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT;
 
 /**
  *  Portable object implementation over offheap memory
@@ -45,9 +53,6 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
     private static final long serialVersionUID = 0L;
 
     /** */
-    private static final Unsafe UNSAFE = GridUnsafe.unsafe();
-
-    /** */
     private final PortableContext ctx;
 
     /** */
@@ -88,22 +93,22 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
 
     /** {@inheritDoc} */
     @Override public int typeId() {
-        return UNSAFE.getInt(ptr + start + GridPortableMarshaller.TYPE_ID_POS);
+        return PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.TYPE_ID_POS);
     }
 
     /** {@inheritDoc} */
     @Override public int length() {
-        return UNSAFE.getInt(ptr + start + GridPortableMarshaller.TOTAL_LEN_POS);
+        return PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.TOTAL_LEN_POS);
     }
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return UNSAFE.getInt(ptr + start + GridPortableMarshaller.HASH_CODE_POS);
+        return PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.HASH_CODE_POS);
     }
 
     /** {@inheritDoc} */
     @Override protected int schemaId() {
-        return UNSAFE.getInt(ptr + start + GridPortableMarshaller.SCHEMA_ID_POS);
+        return PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.SCHEMA_ID_POS);
     }
 
     /** {@inheritDoc} */
@@ -180,13 +185,80 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
     @Nullable @Override protected <F> F fieldByOrder(int order) {
-        PortableReaderExImpl reader = new PortableReaderExImpl(ctx,
-            new PortableOffheapInputStream(ptr, size, false),
-            start,
-            null);
+        // Get field position
+        int schemaOffset = PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
+
+        int fieldOffsetSize =
+            PortableUtils.fieldOffsetSize(PortablePrimitives.readShort(ptr, start + GridPortableMarshaller.FLAGS_POS));
+
+        int fieldPos;
+
+        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+            fieldPos = start + PortablePrimitives.readInt(ptr, start + schemaOffset + order * 5) & 0xFF;
+        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+            fieldPos = start + PortablePrimitives.readInt(ptr, start + schemaOffset + order * 6) & 0xFFFF;
+        else
+            fieldPos = start + PortablePrimitives.readInt(ptr, start + schemaOffset + order * 8);
+
+        // Read header and try performing fast lookup for well-known types (the most common types go first).
+        byte hdr = PortablePrimitives.readByte(ptr, fieldPos);
+
+        Object val;
+
+        switch (hdr) {
+            case INT:
+                val = PortablePrimitives.readInt(ptr, fieldPos + 1);
+
+                break;
+
+            case LONG:
+                val = PortablePrimitives.readLong(ptr, fieldPos + 1);
+
+                break;
+
+            case BOOLEAN:
+                val = PortablePrimitives.readBoolean(ptr, fieldPos + 1);
+
+                break;
+
+            case SHORT:
+                val = PortablePrimitives.readShort(ptr, fieldPos + 1);
+
+                break;
+
+            case BYTE:
+                val = PortablePrimitives.readByte(ptr, fieldPos + 1);
+
+                break;
+
+            case CHAR:
+                val = PortablePrimitives.readChar(ptr, fieldPos + 1);
+
+                break;
+
+            case FLOAT:
+                val = PortablePrimitives.readFloat(ptr, fieldPos + 1);
+
+                break;
+
+            case DOUBLE:
+                val = PortablePrimitives.readDouble(ptr, fieldPos + 1);
+
+                break;
+
+            // TODO: More field types: string, decimal, date, timestamp.
+
+            default: {
+                PortableReaderExImpl reader = new PortableReaderExImpl(ctx,
+                    new PortableOffheapInputStream(ptr, size, false),
+                    start,
+                    null);
+
+                val = reader.unmarshalFieldOnAbsolutePosition(fieldPos);
+            }
+        }
 
-        // TODO: Proper position detection.
-        return (F)reader.unmarshalFieldOnAbsolutePosition(order);
+        return (F)val;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/a28fe9b8/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
index b60ac68..d5a78bc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
@@ -57,6 +57,15 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static byte readByte(long ptr, int off) {
+        return UNSAFE.getByte(ptr + off);
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -75,6 +84,15 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static boolean readBoolean(long ptr, int off) {
+        return readByte(ptr, off) == 1;
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -101,6 +119,20 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static short readShort(long ptr, int off) {
+        short val = UNSAFE.getShort(ptr + off);
+
+        if (BIG_ENDIAN)
+            val = Short.reverseBytes(val);
+
+        return val;
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -127,6 +159,20 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static char readChar(long ptr, int off) {
+        char val = UNSAFE.getChar(ptr + off);
+
+        if (BIG_ENDIAN)
+            val = Character.reverseBytes(val);
+
+        return val;
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
@@ -171,6 +217,20 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static int readInt(long ptr, int off) {
+        int val = UNSAFE.getInt(ptr + off);
+
+        if (BIG_ENDIAN)
+            val = Integer.reverseBytes(val);
+
+        return val;
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -197,6 +257,20 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static long readLong(long ptr, int off) {
+        long val = UNSAFE.getLong(ptr + off);
+
+        if (BIG_ENDIAN)
+            val = Long.reverseBytes(val);
+
+        return val;
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -219,6 +293,17 @@ public abstract class PortablePrimitives {
     }
 
     /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static float readFloat(long ptr, int off) {
+        int val = readInt(ptr, off);
+
+        return Float.intBitsToFloat(val);
+    }
+
+    /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
@@ -239,4 +324,15 @@ public abstract class PortablePrimitives {
 
         return Double.longBitsToDouble(val);
     }
+
+    /**
+     * @param ptr Pointer.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static double readDouble(long ptr, int off) {
+        long val = readLong(ptr, off);
+
+        return Double.longBitsToDouble(val);
+    }
 }
\ No newline at end of file


[6/7] ignite git commit: IGNITE-1814: Debug.

Posted by vo...@apache.org.
IGNITE-1814: Debug.


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

Branch: refs/heads/ignite-1814
Commit: c374c160b502cc57eaeec03e3735202b1791647c
Parents: a28fe9b
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 14:43:14 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 14:43:14 2015 +0300

----------------------------------------------------------------------
 .../portable/PortablePositionReadable.java      |  8 ++++
 .../internal/portable/PortableReaderExImpl.java |  7 +++-
 .../ignite/internal/portable/PortableUtils.java |  8 ++--
 .../portable/builder/PortableBuilderImpl.java   | 44 +++++++++++++++-----
 .../portable/builder/PortableBuilderReader.java |  2 +-
 .../streams/PortableAbstractInputStream.java    | 18 ++++++++
 .../streams/PortableHeapInputStream.java        |  5 +++
 .../streams/PortableOffheapInputStream.java     |  5 +++
 .../PlatformBigEndianInputStreamImpl.java       |  5 +++
 .../memory/PlatformInputStreamImpl.java         | 10 +++++
 10 files changed, 93 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePositionReadable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePositionReadable.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePositionReadable.java
index 7e8d9d3..c49c898 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePositionReadable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePositionReadable.java
@@ -22,6 +22,14 @@ package org.apache.ignite.internal.portable;
  */
 public interface PortablePositionReadable {
     /**
+     * Read byte at the given position.
+     *
+     * @param pos Position.
+     * @return Value.
+     */
+    public byte readBytePositioned(int pos);
+
+    /**
      * Read short at the given position.
      *
      * @param pos Position.

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
index f9cbae4..e243ed8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
@@ -235,6 +235,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         footerStart = footer.get1();
         footerLen = footer.get2() - footerStart;
 
+        if (footerLen % (4 + offsetSize) != 0)
+            footerLen -= 4;
+
         schemaId = in.readIntPositioned(start + GridPortableMarshaller.SCHEMA_ID_POS);
 
         rawOff = PortableUtils.rawOffsetAbsolute(in, start);
@@ -2611,9 +2614,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                     int pos;
 
                     if (offsetSize == PortableUtils.OFFSET_1)
-                        pos = start + in.readIntPositioned(searchPos + 1) & 0xFF;
+                        pos = start + (int)in.readBytePositioned(searchPos + 4) & 0xFF;
                     else if (offsetSize == PortableUtils.OFFSET_2)
-                        pos = start + in.readIntPositioned(searchPos + 2) & 0xFFFF;
+                        pos = start + (int)in.readShortPositioned(searchPos + 4) & 0xFFFF;
                     else
                         pos = start + in.readIntPositioned(searchPos + 4);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index f08b48a..933f518 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -625,10 +625,6 @@ public class PortableUtils {
         int footerStart = footerStartRelative(in, start);
         int footerEnd = length(in, start);
 
-        // Take in count possible raw offset.
-        if ((((footerEnd - footerStart) >> 2) & 0x1) == 0x1)
-            footerEnd -= 4;
-
         return F.t(start + footerStart, start + footerEnd);
     }
 
@@ -651,7 +647,9 @@ public class PortableUtils {
             // Schema exists.
             int schemaOff = in.readIntPositioned(start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
-            if ((((len - schemaOff) >> 2) & 0x1) == 0x0)
+            int pairLen = 4 + fieldOffsetSize(flags);
+
+            if (((len - schemaOff) & pairLen) == 0x0)
                 // Even amount of records in schema => no raw offset.
                 return start + schemaOff;
             else

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
index 442fc35..6c5a4d2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
@@ -41,6 +41,7 @@ import java.util.Map;
 import java.util.Set;
 
 import static org.apache.ignite.internal.portable.GridPortableMarshaller.DFLT_HDR_LEN;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLAGS_POS;
 import static org.apache.ignite.internal.portable.GridPortableMarshaller.HASH_CODE_POS;
 import static org.apache.ignite.internal.portable.GridPortableMarshaller.PROTO_VER_POS;
 import static org.apache.ignite.internal.portable.GridPortableMarshaller.TYPE_ID_POS;
@@ -77,6 +78,9 @@ public class PortableBuilderImpl implements PortableBuilder {
     /** Position of object in source array, or -1 if object is not created from PortableObject. */
     private final int start;
 
+    /** Flags. */
+    private final short flags;
+
     /** Total header length */
     private final int hdrLen;
 
@@ -115,6 +119,7 @@ public class PortableBuilderImpl implements PortableBuilder {
         this.ctx = ctx;
 
         start = -1;
+        flags = -1;
         reader = null;
         hdrLen = DFLT_HDR_LEN;
 
@@ -137,8 +142,9 @@ public class PortableBuilderImpl implements PortableBuilder {
     PortableBuilderImpl(PortableBuilderReader reader, int start) {
         this.reader = reader;
         this.start = start;
+        this.flags = reader.readShortPositioned(start + FLAGS_POS);
 
-        byte ver = reader.readByteAbsolute(start + PROTO_VER_POS);
+        byte ver = reader.readBytePositioned(start + PROTO_VER_POS);
 
         PortableUtils.checkProtocolVersion(ver);
 
@@ -229,17 +235,19 @@ public class PortableBuilderImpl implements PortableBuilder {
             int footerPos = footer.get1();
             int footerEnd = footer.get2();
 
+            int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+
             // Get raw position.
             int rawPos = PortableUtils.rawOffsetAbsolute(reader, start);
 
             // Position reader on data.
             reader.position(start + hdrLen);
 
-            while (reader.position() < rawPos) {
+            while (reader.position() + 4 < rawPos) {
                 int fieldId = reader.readIntPositioned(footerPos);
-                int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos).get2();
+                int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldOffsetSize).get2();
 
-                footerPos += 8;
+                footerPos += 4 + fieldOffsetSize;
 
                 if (assignedFldsById.containsKey(fieldId)) {
                     Object assignedVal = assignedFldsById.remove(fieldId);
@@ -391,21 +399,32 @@ public class PortableBuilderImpl implements PortableBuilder {
      * @param footerPos Field position inside the footer (absolute).
      * @param footerEnd Footer end (absolute).
      * @param rawPos Raw data position (absolute).
+     * @param fieldOffsetSize Size of field's offset.
      * @return Tuple with field position and length.
      */
-    private IgniteBiTuple<Integer, Integer> fieldPositionAndLength(int footerPos, int footerEnd, int rawPos) {
-        int fieldOffset = reader.readIntPositioned(footerPos + 4);
+    private IgniteBiTuple<Integer, Integer> fieldPositionAndLength(int footerPos, int footerEnd, int rawPos,
+        int fieldOffsetSize) {
+        // Get field offset first.
+        int fieldOffset;
+
+        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+            fieldOffset = reader.readIntPositioned(footerPos + 1) & 0xFF;
+        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+            fieldOffset = reader.readIntPositioned(footerPos + 2) & 0xFFFF;
+        else
+            fieldOffset = reader.readIntPositioned(footerPos + 4);
+
         int fieldPos = start + fieldOffset;
 
         // Get field length.
         int fieldLen;
 
-        if (footerPos + 8 == footerEnd)
+        if (footerPos + 4 + fieldOffsetSize == footerEnd)
             // This is the last field, compare to raw offset.
             fieldLen = rawPos - fieldPos;
         else {
             // Field is somewhere in the middle, get difference with the next offset.
-            int nextFieldOffset = reader.readIntPositioned(footerPos + 8 + 4);
+            int nextFieldOffset = reader.readIntPositioned(footerPos + fieldOffsetSize + 4 + fieldOffsetSize);
 
             fieldLen = nextFieldOffset - fieldOffset;
         }
@@ -418,6 +437,8 @@ public class PortableBuilderImpl implements PortableBuilder {
      */
     private void ensureReadCacheInit() {
         if (readCache == null) {
+            int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+
             Map<Integer, Object> readCache = new HashMap<>();
 
             IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(reader, start);
@@ -427,17 +448,18 @@ public class PortableBuilderImpl implements PortableBuilder {
 
             int rawPos = PortableUtils.rawOffsetAbsolute(reader, start);
 
-            while (footerPos < footerEnd) {
+            while (footerPos + 4 < footerEnd) {
                 int fieldId = reader.readIntPositioned(footerPos);
 
-                IgniteBiTuple<Integer, Integer> posAndLen = fieldPositionAndLength(footerPos, footerEnd, rawPos);
+                IgniteBiTuple<Integer, Integer> posAndLen =
+                    fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldOffsetSize);
 
                 Object val = reader.getValueQuickly(posAndLen.get1(), posAndLen.get2());
 
                 readCache.put(fieldId, val);
 
                 // Shift current footer position.
-                footerPos += 8;
+                footerPos += 4 + fieldOffsetSize;
             }
 
             this.readCache = readCache;

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
index 57ae3e7..9645ced 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
@@ -124,7 +124,7 @@ public class PortableBuilderReader implements PortablePositionReadable {
      * @param pos Position in the source array.
      * @return Read byte value.
      */
-    public byte readByteAbsolute(int pos) {
+    public byte readBytePositioned(int pos) {
         return PortablePrimitives.readByte(arr, pos);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractInputStream.java
index 7dbee92..d7f66c9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractInputStream.java
@@ -158,6 +158,16 @@ public abstract class PortableAbstractInputStream extends PortableAbstractStream
     }
 
     /** {@inheritDoc} */
+    @Override public byte readBytePositioned(int pos) {
+        int delta = pos + 1 - this.pos;
+
+        if (delta > 0)
+            ensureEnoughData(delta);
+
+        return readBytePositioned0(pos);
+    }
+
+    /** {@inheritDoc} */
     @Override public short readShortPositioned(int pos) {
         int delta = pos + 2 - this.pos;
 
@@ -344,6 +354,14 @@ public abstract class PortableAbstractInputStream extends PortableAbstractStream
     protected abstract long readLongFast();
 
     /**
+     * Internal routine for positioned byte value read.
+     *
+     * @param pos Position.
+     * @return Int value.
+     */
+    protected abstract byte readBytePositioned0(int pos);
+
+    /**
      * Internal routine for positioned short value read.
      *
      * @param pos Position.

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapInputStream.java
index adfeaad..e027d70 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapInputStream.java
@@ -123,6 +123,11 @@ public final class PortableHeapInputStream extends PortableAbstractInputStream {
     }
 
     /** {@inheritDoc} */
+    @Override protected byte readBytePositioned0(int pos) {
+        return UNSAFE.getByte(data, BYTE_ARR_OFF + pos);
+    }
+
+    /** {@inheritDoc} */
     @Override protected short readShortPositioned0(int pos) {
         short res = UNSAFE.getShort(data, BYTE_ARR_OFF + pos);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapInputStream.java
index 75bffb9..1dc9b5b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapInputStream.java
@@ -113,6 +113,11 @@ public class PortableOffheapInputStream extends PortableAbstractInputStream {
     }
 
     /** {@inheritDoc} */
+    @Override protected byte readBytePositioned0(int pos) {
+        return UNSAFE.getByte(ptr + pos);
+    }
+
+    /** {@inheritDoc} */
     @Override protected short readShortPositioned0(int pos) {
         short res = UNSAFE.getShort(ptr + pos);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianInputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianInputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianInputStreamImpl.java
index a4d711e..41bc43f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianInputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianInputStreamImpl.java
@@ -65,6 +65,11 @@ public class PlatformBigEndianInputStreamImpl extends PlatformInputStreamImpl {
     }
 
     /** {@inheritDoc} */
+    @Override public byte readBytePositioned(int pos) {
+        return super.readBytePositioned(pos);
+    }
+
+    /** {@inheritDoc} */
     @Override public short readShortPositioned(int pos) {
         return Short.reverseBytes(super.readShortPositioned(pos));
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/c374c160/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
index 68b4141..13da8c5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
@@ -146,6 +146,16 @@ public class PlatformInputStreamImpl implements PlatformInputStream {
     }
 
     /** {@inheritDoc} */
+    @Override public byte readBytePositioned(int pos) {
+        int delta = pos + 1 - this.pos;
+
+        if (delta > 0)
+            ensureEnoughData(delta);
+
+        return UNSAFE.getByte(data + pos);
+    }
+
+    /** {@inheritDoc} */
     @Override public short readShortPositioned(int pos) {
         int delta = pos + 2 - this.pos;
 


[3/7] ignite git commit: IGNITE-1814: Removed unused primitives.

Posted by vo...@apache.org.
IGNITE-1814: Removed unused primitives.


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

Branch: refs/heads/ignite-1814
Commit: 4a170d35f70729e56960ca2b2f6da713ed0e03bf
Parents: 2c7b61e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 13:04:16 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 13:04:16 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortablePrimitives.java   | 377 -------------------
 1 file changed, 377 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/4a170d35/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
index 4c6b5fe..9bd1b7b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
@@ -153,115 +153,10 @@ public abstract class PortablePrimitives {
     /**
      * @param arr Array.
      * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeByteArray(byte[] arr, int off, byte[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract byte[] readByteArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeShortArray(byte[] arr, int off, short[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract short[] readShortArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeIntArray(byte[] arr, int off, int[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract int[] readIntArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeLongArray(byte[] arr, int off, long[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract long[] readLongArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeFloatArray(byte[] arr, int off, float[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract float[] readFloatArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeDoubleArray(byte[] arr, int off, double[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract double[] readDoubleArray(byte[] arr, int off, int len);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeCharArray(byte[] arr, int off, char[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
      * @return Value.
      */
     public abstract char[] readCharArray(byte[] arr, int off, int len);
 
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeBooleanArray(byte[] arr, int off, boolean[] val);
-
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @return Value.
-     */
-    public abstract boolean[] readBooleanArray(byte[] arr, int off, int len);
-
     /** */
     private static class UnsafePrimitives extends PortablePrimitives {
         /** */
@@ -271,26 +166,8 @@ public abstract class PortablePrimitives {
         private static final long BYTE_ARR_OFF = UNSAFE.arrayBaseOffset(byte[].class);
 
         /** */
-        private static final long SHORT_ARR_OFF = UNSAFE.arrayBaseOffset(short[].class);
-
-        /** */
-        private static final long INT_ARR_OFF = UNSAFE.arrayBaseOffset(int[].class);
-
-        /** */
-        private static final long LONG_ARR_OFF = UNSAFE.arrayBaseOffset(long[].class);
-
-        /** */
-        private static final long FLOAT_ARR_OFF = UNSAFE.arrayBaseOffset(float[].class);
-
-        /** */
-        private static final long DOUBLE_ARR_OFF = UNSAFE.arrayBaseOffset(double[].class);
-
-        /** */
         private static final long CHAR_ARR_OFF = UNSAFE.arrayBaseOffset(char[].class);
 
-        /** */
-        private static final long BOOLEAN_ARR_OFF = UNSAFE.arrayBaseOffset(boolean[].class);
-
         /** {@inheritDoc} */
         @Override public void writeByte(byte[] arr, int off, byte val) {
             UNSAFE.putByte(arr, BYTE_ARR_OFF + off, val);
@@ -372,95 +249,6 @@ public abstract class PortablePrimitives {
         }
 
         /** {@inheritDoc} */
-        @Override public void writeByteArray(byte[] arr, int off, byte[] val) {
-            UNSAFE.copyMemory(val, BYTE_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length);
-        }
-
-        /** {@inheritDoc} */
-        @Override public byte[] readByteArray(byte[] arr, int off, int len) {
-            byte[] arr0 = new byte[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, BYTE_ARR_OFF, len);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeShortArray(byte[] arr, int off, short[] val) {
-            UNSAFE.copyMemory(val, SHORT_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 1);
-        }
-
-        /** {@inheritDoc} */
-        @Override public short[] readShortArray(byte[] arr, int off, int len) {
-            short[] arr0 = new short[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, SHORT_ARR_OFF, len << 1);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeIntArray(byte[] arr, int off, int[] val) {
-            UNSAFE.copyMemory(val, INT_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 2);
-        }
-
-        /** {@inheritDoc} */
-        @Override public int[] readIntArray(byte[] arr, int off, int len) {
-            int[] arr0 = new int[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, INT_ARR_OFF, len << 2);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeLongArray(byte[] arr, int off, long[] val) {
-            UNSAFE.copyMemory(val, LONG_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 3);
-        }
-
-        /** {@inheritDoc} */
-        @Override public long[] readLongArray(byte[] arr, int off, int len) {
-            long[] arr0 = new long[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, LONG_ARR_OFF, len << 3);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeFloatArray(byte[] arr, int off, float[] val) {
-            UNSAFE.copyMemory(val, FLOAT_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 2);
-        }
-
-        /** {@inheritDoc} */
-        @Override public float[] readFloatArray(byte[] arr, int off, int len) {
-            float[] arr0 = new float[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, FLOAT_ARR_OFF, len << 2);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeDoubleArray(byte[] arr, int off, double[] val) {
-            UNSAFE.copyMemory(val, DOUBLE_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 3);
-        }
-
-        /** {@inheritDoc} */
-        @Override public double[] readDoubleArray(byte[] arr, int off, int len) {
-            double[] arr0 = new double[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, DOUBLE_ARR_OFF, len << 3);
-
-            return arr0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeCharArray(byte[] arr, int off, char[] val) {
-            UNSAFE.copyMemory(val, CHAR_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length << 1);
-        }
-
-        /** {@inheritDoc} */
         @Override public char[] readCharArray(byte[] arr, int off, int len) {
             char[] arr0 = new char[len];
 
@@ -468,20 +256,6 @@ public abstract class PortablePrimitives {
 
             return arr0;
         }
-
-        /** {@inheritDoc} */
-        @Override public void writeBooleanArray(byte[] arr, int off, boolean[] val) {
-            UNSAFE.copyMemory(val, BOOLEAN_ARR_OFF, arr, BYTE_ARR_OFF + off, val.length);
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean[] readBooleanArray(byte[] arr, int off, int len) {
-            boolean[] arr0 = new boolean[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, BOOLEAN_ARR_OFF, len);
-
-            return arr0;
-        }
     }
 
     /** */
@@ -607,141 +381,6 @@ public abstract class PortablePrimitives {
         }
 
         /** {@inheritDoc} */
-        @Override public void writeByteArray(byte[] arr, int off, byte[] val) {
-            for (byte b : val)
-                arr[off++] = b;
-        }
-
-        /** {@inheritDoc} */
-        @Override public byte[] readByteArray(byte[] arr, int off, int len) {
-            byte[] val = new byte[len];
-
-            for (int i = 0; i < len; i++)
-                val[i] = arr[off++];
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeShortArray(byte[] arr, int off, short[] val) {
-            for (short s : val) {
-                writeShort(arr, off, s);
-
-                off += 2;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public short[] readShortArray(byte[] arr, int off, int len) {
-            short[] val = new short[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readShort(arr, off);
-
-                off += 2;
-            }
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeIntArray(byte[] arr, int off, int[] val) {
-            for (int i : val) {
-                writeInt(arr, off, i);
-
-                off += 4;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public int[] readIntArray(byte[] arr, int off, int len) {
-            int[] val = new int[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readInt(arr, off);
-
-                off += 4;
-            }
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeLongArray(byte[] arr, int off, long[] val) {
-            for (long l : val) {
-                writeLong(arr, off, l);
-
-                off += 8;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public long[] readLongArray(byte[] arr, int off, int len) {
-            long[] val = new long[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readLong(arr, off);
-
-                off += 8;
-            }
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeFloatArray(byte[] arr, int off, float[] val) {
-            for (float f : val) {
-                writeFloat(arr, off, f);
-
-                off += 4;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public float[] readFloatArray(byte[] arr, int off, int len) {
-            float[] val = new float[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readFloat(arr, off);
-
-                off += 4;
-            }
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeDoubleArray(byte[] arr, int off, double[] val) {
-            for (double d : val) {
-                writeDouble(arr, off, d);
-
-                off += 8;
-            }
-        }
-
-        /** {@inheritDoc} */
-        @Override public double[] readDoubleArray(byte[] arr, int off, int len) {
-            double[] val = new double[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readDouble(arr, off);
-
-                off += 8;
-            }
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeCharArray(byte[] arr, int off, char[] val) {
-            for (char c : val) {
-                writeChar(arr, off, c);
-
-                off += 2;
-            }
-        }
-
-        /** {@inheritDoc} */
         @Override public char[] readCharArray(byte[] arr, int off, int len) {
             char[] val = new char[len];
 
@@ -753,21 +392,5 @@ public abstract class PortablePrimitives {
 
             return val;
         }
-
-        /** {@inheritDoc} */
-        @Override public void writeBooleanArray(byte[] arr, int off, boolean[] val) {
-            for (boolean b : val)
-                writeBoolean(arr, off++, b);
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean[] readBooleanArray(byte[] arr, int off, int len) {
-            boolean[] val = new boolean[len];
-
-            for (int i = 0; i < len; i++)
-                val[i] = readBoolean(arr, off++);
-
-            return val;
-        }
     }
 }
\ No newline at end of file


[7/7] ignite git commit: IGNITE-1814: Fixing.

Posted by vo...@apache.org.
IGNITE-1814: Fixing.


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

Branch: refs/heads/ignite-1814
Commit: e225cab21049385e23bc3da306426971825e8296
Parents: c374c16
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 14:55:42 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 14:55:42 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableReaderExImpl.java | 34 +++-----------------
 .../ignite/internal/portable/PortableUtils.java | 21 ++++++++++++
 .../portable/builder/PortableBuilderImpl.java   | 17 +++-------
 3 files changed, 29 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e225cab2/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
index e243ed8..eabd251 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
@@ -2611,14 +2611,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 int id0 = in.readIntPositioned(searchPos);
 
                 if (id0 == id) {
-                    int pos;
-
-                    if (offsetSize == PortableUtils.OFFSET_1)
-                        pos = start + (int)in.readBytePositioned(searchPos + 4) & 0xFF;
-                    else if (offsetSize == PortableUtils.OFFSET_2)
-                        pos = start + (int)in.readShortPositioned(searchPos + 4) & 0xFFFF;
-                    else
-                        pos = start + in.readIntPositioned(searchPos + 4);
+                    int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + 4, offsetSize);
 
                     in.position(pos);
 
@@ -2646,7 +2639,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
             int order = schema.order(id);
 
             if (order != 0) {
-                int pos = start + fieldPosition(order);
+                int offsetPos = footerStart + order * (4 + offsetSize);
+
+                int pos = start + PortableUtils.fieldOffsetRelative(in, offsetPos, offsetSize);;
 
                 in.position(pos);
 
@@ -2658,27 +2653,6 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     }
 
     /**
-     * Get relative field position based on it's order.
-     *
-     * @param order Field order.
-     * @return Relative field position.
-     */
-    private int fieldPosition(int order) {
-        int offsetPos = footerStart + order * (4 + offsetSize);
-
-        int offset;
-
-        if (offsetSize == PortableUtils.OFFSET_1)
-            offset = in.readIntPositioned(offsetPos - 3) & 0xFF;
-        else if (offsetSize == PortableUtils.OFFSET_2)
-            offset = in.readIntPositioned(offsetPos - 2) & 0xFFFF;
-        else
-            offset = in.readIntPositioned(offsetPos);
-
-        return offset;
-    }
-
-    /**
      * Check whether object has low amount of fields.
      *
      * @param footerLen Footer length.

http://git-wip-us.apache.org/repos/asf/ignite/blob/e225cab2/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index 933f518..ced4d6a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -671,4 +671,25 @@ public class PortableUtils {
         else
             return OFFSET_4;
     }
+
+    /**
+     * Get relative field offset.
+     *
+     * @param stream Stream.
+     * @param pos Position.
+     * @param fieldOffsetSize Field offset size.
+     * @return Relative field offset.
+     */
+    public static int fieldOffsetRelative(PortablePositionReadable stream, int pos, int fieldOffsetSize) {
+        int res;
+
+        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+            res = (int)stream.readBytePositioned(pos) & 0xFF;
+        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+            res = (int)stream.readShortPositioned(pos) & 0xFFFF;
+        else
+            res = stream.readIntPositioned(pos);
+
+        return res;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/e225cab2/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
index 6c5a4d2..b8d10a2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
@@ -84,9 +84,7 @@ public class PortableBuilderImpl implements PortableBuilder {
     /** Total header length */
     private final int hdrLen;
 
-    /**
-     * Context of PortableObject reading process. Or {@code null} if object is not created from PortableObject.
-     */
+    /** Context of PortableObject reading process. Or {@code null} if object is not created from PortableObject. */
     private final PortableBuilderReader reader;
 
     /** */
@@ -405,15 +403,7 @@ public class PortableBuilderImpl implements PortableBuilder {
     private IgniteBiTuple<Integer, Integer> fieldPositionAndLength(int footerPos, int footerEnd, int rawPos,
         int fieldOffsetSize) {
         // Get field offset first.
-        int fieldOffset;
-
-        if (fieldOffsetSize == PortableUtils.OFFSET_1)
-            fieldOffset = reader.readIntPositioned(footerPos + 1) & 0xFF;
-        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
-            fieldOffset = reader.readIntPositioned(footerPos + 2) & 0xFFFF;
-        else
-            fieldOffset = reader.readIntPositioned(footerPos + 4);
-
+        int fieldOffset = PortableUtils.fieldOffsetRelative(reader, footerPos + 4, fieldOffsetSize);
         int fieldPos = start + fieldOffset;
 
         // Get field length.
@@ -424,7 +414,8 @@ public class PortableBuilderImpl implements PortableBuilder {
             fieldLen = rawPos - fieldPos;
         else {
             // Field is somewhere in the middle, get difference with the next offset.
-            int nextFieldOffset = reader.readIntPositioned(footerPos + fieldOffsetSize + 4 + fieldOffsetSize);
+            int nextFieldOffset = PortableUtils.fieldOffsetRelative(reader, footerPos + 4 + fieldOffsetSize + 4,
+                fieldOffsetSize);
 
             fieldLen = nextFieldOffset - fieldOffset;
         }


[2/7] ignite git commit: IGNITE-1814: WIP.

Posted by vo...@apache.org.
IGNITE-1814: WIP.


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

Branch: refs/heads/ignite-1814
Commit: 2c7b61ee4b415a86eb24937b061ad8d3e0c8df22
Parents: 247825e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 13:00:40 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 13:00:40 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableFieldImpl.java    | 10 +--
 .../internal/portable/PortableObjectEx.java     |  6 +-
 .../internal/portable/PortableObjectImpl.java   | 48 +++++---------
 .../portable/PortableObjectOffheapImpl.java     |  5 +-
 .../internal/portable/PortableReaderExImpl.java | 61 +++++++++++++----
 .../internal/portable/PortableSchema.java       | 70 ++++++++++----------
 .../ignite/internal/portable/PortableUtils.java | 23 +++++++
 .../internal/portable/PortableWriterExImpl.java | 19 ++----
 8 files changed, 141 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableFieldImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableFieldImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableFieldImpl.java
index 5780b76..12be55c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableFieldImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableFieldImpl.java
@@ -45,7 +45,7 @@ public class PortableFieldImpl implements PortableField {
     @Override public boolean exists(PortableObject obj) {
         PortableObjectEx obj0 = (PortableObjectEx)obj;
 
-        return fieldOffset(obj0) != 0;
+        return fieldOrder(obj0) != 0;
     }
 
     /** {@inheritDoc} */
@@ -53,9 +53,9 @@ public class PortableFieldImpl implements PortableField {
     @Override public <T> T value(PortableObject obj) {
         PortableObjectEx obj0 = (PortableObjectEx)obj;
 
-        int offset = fieldOffset(obj0);
+        int order = fieldOrder(obj0);
 
-        return offset != 0 ? (T)obj0.fieldByOffset(offset) : null;
+        return order != 0 ? (T)obj0.fieldByOrder(order) : null;
     }
 
     /**
@@ -64,7 +64,7 @@ public class PortableFieldImpl implements PortableField {
      * @param obj Object.
      * @return Field offset.
      */
-    private int fieldOffset(PortableObjectEx obj) {
+    private int fieldOrder(PortableObjectEx obj) {
         int schemaId = obj.schemaId();
 
         PortableSchema schema = schemas.schema(schemaId);
@@ -77,6 +77,6 @@ public class PortableFieldImpl implements PortableField {
 
         assert schema != null;
 
-        return schema.offset(fieldId);
+        return schema.order(fieldId);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectEx.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectEx.java
index 42c973b..014bfa1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectEx.java
@@ -67,12 +67,12 @@ public abstract class PortableObjectEx implements PortableObject {
     @Nullable public abstract <F> F field(int fieldId) throws PortableException;
 
     /**
-     * Get field by offset.
+     * Get field by order.
      *
-     * @param fieldOffset Field offset.
+     * @param order Field order.
      * @return Field value.
      */
-    @Nullable protected abstract <F> F fieldByOffset(int fieldOffset);
+    @Nullable protected abstract <F> F fieldByOrder(int order);
 
     /**
      * @param ctx Reader context.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
index dfe6d88..de77778 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
@@ -259,15 +259,27 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
 
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
-    @Nullable @Override protected <F> F fieldByOffset(int fieldOffset) {
-        Object val;
-
+    @Nullable @Override protected <F> F fieldByOrder(int order) {
+        // Get field position
         int schemaOffset = PRIM.readInt(arr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
-        int fieldPos = PRIM.readInt(arr, start + schemaOffset + fieldOffset);
+
+        int fieldOffsetSize =
+            PortableUtils.fieldOffsetSize(PRIM.readShort(arr, start + GridPortableMarshaller.FLAGS_POS));
+
+        int fieldPos;
+
+        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 5) & 0xFF;
+        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 6) & 0xFFFF;
+        else
+            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 8);
 
         // Read header and try performing fast lookup for well-known types (the most common types go first).
         byte hdr = PRIM.readByte(arr, fieldPos);
 
+        Object val;
+
         switch (hdr) {
             case INT:
                 val = PRIM.readInt(arr, fieldPos + 1);
@@ -309,36 +321,12 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
 
                 break;
 
-//            case DECIMAL:
-//                val = doReadDecimal();
-//
-//                break;
-//
-//            case STRING:
-//                val = doReadString();
-//
-//                break;
-//
-//            case UUID:
-//                val = doReadUuid();
-//
-//                break;
-//
-//            case DATE:
-//                val = doReadDate();
-//
-//                break;
-//
-//            case TIMESTAMP:
-//                val = doReadTimestamp();
-//
-//                break;
+            // TODO: More field types: string, decimal, date, timestamp.
 
             default: {
-                // TODO: Pass absolute offset, not relative.
                 PortableReaderExImpl reader = new PortableReaderExImpl(ctx, arr, start, null);
 
-                val = reader.unmarshalFieldByOffset(fieldOffset);
+                val = reader.unmarshalFieldOnAbsolutePosition(fieldPos);
             }
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
index f023f2e..0559c06 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectOffheapImpl.java
@@ -179,13 +179,14 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
 
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
-    @Nullable @Override protected <F> F fieldByOffset(int fieldOffset) {
+    @Nullable @Override protected <F> F fieldByOrder(int order) {
         PortableReaderExImpl reader = new PortableReaderExImpl(ctx,
             new PortableOffheapInputStream(ptr, size, false),
             start,
             null);
 
-        return (F)reader.unmarshalFieldByOffset(fieldOffset);
+        // TODO: Proper position detection.
+        return (F)reader.unmarshalFieldOnAbsolutePosition(order);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
index aa1519d..f9cbae4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableReaderExImpl.java
@@ -163,6 +163,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     /** Schema Id. */
     private int schemaId;
 
+    /** Offset size in bytes. */
+    private int offsetSize;
+
     /** Object schema. */
     private PortableSchema schema;
 
@@ -221,7 +224,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
         PortableUtils.checkProtocolVersion(in.readByte());
 
-        in.position(in.position() + 2); // Skip flags.
+        short flags = in.readShort();
+
+        offsetSize = PortableUtils.fieldOffsetSize(flags);
 
         typeId = in.readIntPositioned(start + GridPortableMarshaller.TYPE_ID_POS);
 
@@ -307,16 +312,18 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     }
 
     /**
-     * @param fieldOffset Field offset.
+     * Unmarshal field on absolute position.
+     *
+     * @param pos Field position.
      * @return Unmarshalled value.
      * @throws PortableException In case of error.
      */
-    @Nullable Object unmarshalFieldByOffset(int fieldOffset) throws PortableException {
-        assert fieldOffset != 0;
+    @Nullable Object unmarshalFieldOnAbsolutePosition(int pos) throws PortableException {
+        assert pos != 0;
 
         parseHeaderIfNeeded();
 
-        in.position(start + in.readIntPositioned(footerStart + fieldOffset));
+        in.position(pos);
 
         return unmarshal();
     }
@@ -2567,12 +2574,14 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         int searchPos = footerStart;
         int searchEnd = searchPos + footerLen;
 
+        int idx = 0;
+
         while (searchPos < searchEnd) {
             int fieldId = in.readIntPositioned(searchPos);
 
-            fields.put(fieldId, searchPos + 4 - footerStart);
+            fields.put(fieldId, idx++);
 
-            searchPos += 8;
+            searchPos += 4 + offsetSize;
         }
 
         return new PortableSchema(fields);
@@ -2599,14 +2608,21 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 int id0 = in.readIntPositioned(searchPos);
 
                 if (id0 == id) {
-                    int pos = start + in.readIntPositioned(searchPos + 4);
+                    int pos;
+
+                    if (offsetSize == PortableUtils.OFFSET_1)
+                        pos = start + in.readIntPositioned(searchPos + 1) & 0xFF;
+                    else if (offsetSize == PortableUtils.OFFSET_2)
+                        pos = start + in.readIntPositioned(searchPos + 2) & 0xFFFF;
+                    else
+                        pos = start + in.readIntPositioned(searchPos + 4);
 
                     in.position(pos);
 
                     return pos;
                 }
 
-                searchPos += 8;
+                searchPos += 4 + offsetSize;
             }
         }
         else {
@@ -2624,10 +2640,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 schema = schema0;
             }
 
-            int fieldOffsetPos = schema.offset(id);
+            int order = schema.order(id);
 
-            if (fieldOffsetPos != 0) {
-                int pos = start + in.readIntPositioned(footerStart + fieldOffsetPos);
+            if (order != 0) {
+                int pos = start + fieldPosition(order);
 
                 in.position(pos);
 
@@ -2639,6 +2655,27 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     }
 
     /**
+     * Get relative field position based on it's order.
+     *
+     * @param order Field order.
+     * @return Relative field position.
+     */
+    private int fieldPosition(int order) {
+        int offsetPos = footerStart + order * (4 + offsetSize);
+
+        int offset;
+
+        if (offsetSize == PortableUtils.OFFSET_1)
+            offset = in.readIntPositioned(offsetPos - 3) & 0xFF;
+        else if (offsetSize == PortableUtils.OFFSET_2)
+            offset = in.readIntPositioned(offsetPos - 2) & 0xFFFF;
+        else
+            offset = in.readIntPositioned(offsetPos);
+
+        return offset;
+    }
+
+    /**
      * Check whether object has low amount of fields.
      *
      * @param footerLen Footer length.

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableSchema.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableSchema.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableSchema.java
index 09bfe35..250598a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableSchema.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableSchema.java
@@ -39,49 +39,49 @@ public class PortableSchema {
     private final int id1;
 
     /** Offset 1. */
-    private final int offset1;
+    private final int pos1;
 
     /** ID 2. */
     private final int id2;
 
     /** Offset 2. */
-    private final int offset2;
+    private final int pos2;
 
     /** ID 3. */
     private final int id3;
 
     /** Offset 3. */
-    private final int offset3;
+    private final int pos3;
 
     /** ID 4. */
     private final int id4;
 
     /** Offset 4. */
-    private final int offset4;
+    private final int pos4;
 
     /** ID 1. */
     private final int id5;
 
     /** Offset 1. */
-    private final int offset5;
+    private final int pos5;
 
     /** ID 2. */
     private final int id6;
 
     /** Offset 2. */
-    private final int offset6;
+    private final int pos6;
 
     /** ID 3. */
     private final int id7;
 
     /** Offset 3. */
-    private final int offset7;
+    private final int pos7;
 
     /** ID 4. */
     private final int id8;
 
     /** Offset 4. */
-    private final int offset8;
+    private final int pos8;
 
     /**
      * Constructor.
@@ -98,74 +98,74 @@ public class PortableSchema {
 
             if (entry != null) {
                 id1 = entry.getKey();
-                offset1 = entry.getValue();
+                pos1 = entry.getValue();
             }
             else{
                 id1 = 0;
-                offset1 = 0;
+                pos1 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id2 = entry.getKey();
-                offset2 = entry.getValue();
+                pos2 = entry.getValue();
             }
             else{
                 id2 = 0;
-                offset2 = 0;
+                pos2 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id3 = entry.getKey();
-                offset3 = entry.getValue();
+                pos3 = entry.getValue();
             }
             else{
                 id3 = 0;
-                offset3 = 0;
+                pos3 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id4 = entry.getKey();
-                offset4 = entry.getValue();
+                pos4 = entry.getValue();
             }
             else{
                 id4 = 0;
-                offset4 = 0;
+                pos4 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id5 = entry.getKey();
-                offset5 = entry.getValue();
+                pos5 = entry.getValue();
             }
             else{
                 id5 = 0;
-                offset5 = 0;
+                pos5 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id6 = entry.getKey();
-                offset6 = entry.getValue();
+                pos6 = entry.getValue();
             }
             else{
                 id6 = 0;
-                offset6 = 0;
+                pos6 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id7 = entry.getKey();
-                offset7 = entry.getValue();
+                pos7 = entry.getValue();
             }
             else{
                 id7 = 0;
-                offset7 = 0;
+                pos7 = 0;
             }
 
             if ((entry = iter.hasNext() ? iter.next() : null) != null) {
                 id8 = entry.getKey();
-                offset8 = entry.getValue();
+                pos8 = entry.getValue();
             }
             else{
                 id8 = 0;
-                offset8 = 0;
+                pos8 = 0;
             }
 
             map = null;
@@ -174,43 +174,43 @@ public class PortableSchema {
             inline = false;
 
             id1 = id2 = id3 = id4 = id5 = id6 = id7 = id8 = 0;
-            offset1 = offset2 = offset3 = offset4 = offset5 = offset6 = offset7 = offset8 = 0;
+            pos1 = pos2 = pos3 = pos4 = pos5 = pos6 = pos7 = pos8 = 0;
 
             map = new HashMap<>(vals);
         }
     }
 
     /**
-     * Get offset for the given field ID.
+     * Get field position in footer by schema ID.
      *
      * @param id Field ID.
      * @return Offset or {@code 0} if there is no such field.
      */
-    public int offset(int id) {
+    public int order(int id) {
         if (inline) {
             if (id == id1)
-                return offset1;
+                return pos1;
 
             if (id == id2)
-                return offset2;
+                return pos2;
 
             if (id == id3)
-                return offset3;
+                return pos3;
 
             if (id == id4)
-                return offset4;
+                return pos4;
 
             if (id == id5)
-                return offset5;
+                return pos5;
 
             if (id == id6)
-                return offset6;
+                return pos6;
 
             if (id == id7)
-                return offset7;
+                return pos7;
 
             if (id == id8)
-                return offset8;
+                return pos8;
 
             return 0;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
index c369317..f08b48a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableUtils.java
@@ -106,6 +106,15 @@ public class PortableUtils {
     /** Flag: offsets take 2 bytes. */
     public static final short FLAG_OFFSET_TWO_BYTES = 0x8;
 
+    /** Offset which fits into 1 byte. */
+    public static final int OFFSET_1 = 1;
+
+    /** Offset which fits into 2 bytes. */
+    public static final int OFFSET_2 = 2;
+
+    /** Offset which fits into 4 bytes. */
+    public static final int OFFSET_4 = 4;
+
     /**
      * Write flags.
      *
@@ -650,4 +659,18 @@ public class PortableUtils {
                 return start + in.readIntPositioned(start + len - 4);
         }
     }
+
+    /**
+     * Get offset size for the given flags.
+     * @param flags Flags.
+     * @return Offset size.
+     */
+    public static int fieldOffsetSize(short flags) {
+        if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE)
+            return OFFSET_1;
+        else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES)
+            return OFFSET_2;
+        else
+            return OFFSET_4;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/2c7b61ee/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
index 5991f18..8128f84 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableWriterExImpl.java
@@ -105,15 +105,6 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
     /** Maximum offset which fits in 2 bytes. */
     private static final int MAX_OFFSET_2 = 2 << 16;
 
-    /** Offset which fits into 1 byte. */
-    private static final int OFFSET_1 = 1;
-
-    /** Offset which fits into 2 bytes. */
-    private static final int OFFSET_2 = 2;
-
-    /** Offset which fits into 4 bytes. */
-    private static final int OFFSET_4 = 4;
-
     /** Thread-local schema. */
     private static final ThreadLocal<SchemaHolder> SCHEMA = new ThreadLocal<>();
 
@@ -363,12 +354,12 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
             if (rawOffPos != 0)
                 out.writeInt(rawOffPos - start);
 
-            if (offsetByteCnt == OFFSET_1) {
+            if (offsetByteCnt == PortableUtils.OFFSET_1) {
                 int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_OFFSET_ONE_BYTE;
 
                 out.writeShort(start + FLAGS_POS, (short)flags);
             }
-            else if (offsetByteCnt == OFFSET_2) {
+            else if (offsetByteCnt == PortableUtils.OFFSET_2) {
                 int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_OFFSET_TWO_BYTES;
 
                 out.writeShort(start + FLAGS_POS, (short)flags);
@@ -1877,7 +1868,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
                     writer.writeByte((byte) data[idx0++]);
                 }
 
-                res = OFFSET_1;
+                res = PortableUtils.OFFSET_1;
             }
             else if (lastOffset < MAX_OFFSET_2) {
                 for (int idx0 = startIdx; idx0 < idx; ) {
@@ -1885,7 +1876,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
                     writer.writeShort((short)data[idx0++]);
                 }
 
-                res = OFFSET_2;
+                res = PortableUtils.OFFSET_2;
             }
             else {
                 for (int idx0 = startIdx; idx0 < idx; ) {
@@ -1893,7 +1884,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
                     writer.writeInt(data[idx0++]);
                 }
 
-                res = OFFSET_4;
+                res = PortableUtils.OFFSET_4;
             }
 
             idx = startIdx;


[4/7] ignite git commit: IGNITE-1814: Reworked primitives.

Posted by vo...@apache.org.
IGNITE-1814: Reworked primitives.


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

Branch: refs/heads/ignite-1814
Commit: c74b98e9f64db7a7163505824d66e13cf6c240b6
Parents: 4a170d3
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 2 13:20:01 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 2 13:20:01 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableObjectImpl.java   |  39 +-
 .../internal/portable/PortablePrimitives.java   | 376 ++++++-------------
 .../portable/builder/PortableBuilderReader.java |  39 +-
 3 files changed, 147 insertions(+), 307 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/c74b98e9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
index de77778..a4deef0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableObjectImpl.java
@@ -63,9 +63,6 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
     private static final long serialVersionUID = 0L;
 
     /** */
-    private static final PortablePrimitives PRIM = PortablePrimitives.get();
-
-    /** */
     @GridDirectTransient
     private PortableContext ctx;
 
@@ -154,7 +151,7 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
 
     /** {@inheritDoc} */
     @Override public int length() {
-        return PRIM.readInt(arr, start + GridPortableMarshaller.TOTAL_LEN_POS);
+        return PortablePrimitives.readInt(arr, start + GridPortableMarshaller.TOTAL_LEN_POS);
     }
 
     /**
@@ -230,7 +227,7 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
 
     /** {@inheritDoc} */
     @Override public int typeId() {
-        return PRIM.readInt(arr, start + GridPortableMarshaller.TYPE_ID_POS);
+        return PortablePrimitives.readInt(arr, start + GridPortableMarshaller.TYPE_ID_POS);
     }
 
     /** {@inheritDoc} */
@@ -261,63 +258,63 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
     @SuppressWarnings("unchecked")
     @Nullable @Override protected <F> F fieldByOrder(int order) {
         // Get field position
-        int schemaOffset = PRIM.readInt(arr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
+        int schemaOffset = PortablePrimitives.readInt(arr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
         int fieldOffsetSize =
-            PortableUtils.fieldOffsetSize(PRIM.readShort(arr, start + GridPortableMarshaller.FLAGS_POS));
+            PortableUtils.fieldOffsetSize(PortablePrimitives.readShort(arr, start + GridPortableMarshaller.FLAGS_POS));
 
         int fieldPos;
 
         if (fieldOffsetSize == PortableUtils.OFFSET_1)
-            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 5) & 0xFF;
+            fieldPos = start + PortablePrimitives.readInt(arr, start + schemaOffset + order * 5) & 0xFF;
         else if (fieldOffsetSize == PortableUtils.OFFSET_2)
-            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 6) & 0xFFFF;
+            fieldPos = start + PortablePrimitives.readInt(arr, start + schemaOffset + order * 6) & 0xFFFF;
         else
-            fieldPos = start + PRIM.readInt(arr, start + schemaOffset + order * 8);
+            fieldPos = start + PortablePrimitives.readInt(arr, start + schemaOffset + order * 8);
 
         // Read header and try performing fast lookup for well-known types (the most common types go first).
-        byte hdr = PRIM.readByte(arr, fieldPos);
+        byte hdr = PortablePrimitives.readByte(arr, fieldPos);
 
         Object val;
 
         switch (hdr) {
             case INT:
-                val = PRIM.readInt(arr, fieldPos + 1);
+                val = PortablePrimitives.readInt(arr, fieldPos + 1);
 
                 break;
 
             case LONG:
-                val = PRIM.readLong(arr, fieldPos + 1);
+                val = PortablePrimitives.readLong(arr, fieldPos + 1);
 
                 break;
 
             case BOOLEAN:
-                val = PRIM.readBoolean(arr, fieldPos + 1);
+                val = PortablePrimitives.readBoolean(arr, fieldPos + 1);
 
                 break;
 
             case SHORT:
-                val = PRIM.readShort(arr, fieldPos + 1);
+                val = PortablePrimitives.readShort(arr, fieldPos + 1);
 
                 break;
 
             case BYTE:
-                val = PRIM.readByte(arr, fieldPos + 1);
+                val = PortablePrimitives.readByte(arr, fieldPos + 1);
 
                 break;
 
             case CHAR:
-                val = PRIM.readChar(arr, fieldPos + 1);
+                val = PortablePrimitives.readChar(arr, fieldPos + 1);
 
                 break;
 
             case FLOAT:
-                val = PRIM.readFloat(arr, fieldPos + 1);
+                val = PortablePrimitives.readFloat(arr, fieldPos + 1);
 
                 break;
 
             case DOUBLE:
-                val = PRIM.readDouble(arr, fieldPos + 1);
+                val = PortablePrimitives.readDouble(arr, fieldPos + 1);
 
                 break;
 
@@ -381,12 +378,12 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
 
     /** {@inheritDoc} */
     @Override public int hashCode() {
-        return PRIM.readInt(arr, start + GridPortableMarshaller.HASH_CODE_POS);
+        return PortablePrimitives.readInt(arr, start + GridPortableMarshaller.HASH_CODE_POS);
     }
 
     /** {@inheritDoc} */
     @Override protected int schemaId() {
-        return PRIM.readInt(arr, start + GridPortableMarshaller.SCHEMA_ID_POS);
+        return PortablePrimitives.readInt(arr, start + GridPortableMarshaller.SCHEMA_ID_POS);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/c74b98e9/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
index 9bd1b7b..b60ac68 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortablePrimitives.java
@@ -20,377 +20,223 @@ package org.apache.ignite.internal.portable;
 import org.apache.ignite.internal.util.GridUnsafe;
 import sun.misc.Unsafe;
 
-import static java.nio.ByteOrder.LITTLE_ENDIAN;
-import static java.nio.ByteOrder.nativeOrder;
+import java.nio.ByteOrder;
 
 /**
  * Primitives writer.
  */
 public abstract class PortablePrimitives {
     /** */
-    private static final PortablePrimitives INSTANCE =
-        nativeOrder() == LITTLE_ENDIAN ? new UnsafePrimitives() : new BytePrimitives();
+    private static final Unsafe UNSAFE = GridUnsafe.unsafe();
 
-    /**
-     * @return Primitives writer.
-     */
-    public static PortablePrimitives get() {
-        return INSTANCE;
-    }
+    /** */
+    private static final long BYTE_ARR_OFF = UNSAFE.arrayBaseOffset(byte[].class);
+
+    /** */
+    private static final long CHAR_ARR_OFF = UNSAFE.arrayBaseOffset(char[].class);
+
+    /** Whether little endian is set. */
+    private static final boolean BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeByte(byte[] arr, int off, byte val);
+    public static void writeByte(byte[] arr, int off, byte val) {
+        UNSAFE.putByte(arr, BYTE_ARR_OFF + off, val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract byte readByte(byte[] arr, int off);
+    public static byte readByte(byte[] arr, int off) {
+        return UNSAFE.getByte(arr, BYTE_ARR_OFF + off);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeShort(byte[] arr, int off, short val);
+    public static void writeBoolean(byte[] arr, int off, boolean val) {
+        writeByte(arr, off, val ? (byte)1 : (byte)0);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract short readShort(byte[] arr, int off);
+    public static boolean readBoolean(byte[] arr, int off) {
+        return readByte(arr, off) == 1;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeInt(byte[] arr, int off, int val);
+    public static void writeShort(byte[] arr, int off, short val) {
+        if (BIG_ENDIAN)
+            val = Short.reverseBytes(val);
+
+        UNSAFE.putShort(arr, BYTE_ARR_OFF + off, val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract int readInt(byte[] arr, int off);
+    public static short readShort(byte[] arr, int off) {
+        short val = UNSAFE.getShort(arr, BYTE_ARR_OFF + off);
+
+        if (BIG_ENDIAN)
+            val = Short.reverseBytes(val);
+
+        return val;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeLong(byte[] arr, int off, long val);
+    public static void writeChar(byte[] arr, int off, char val) {
+        if (BIG_ENDIAN)
+            val = Character.reverseBytes(val);
+
+        UNSAFE.putChar(arr, BYTE_ARR_OFF + off, val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract long readLong(byte[] arr, int off);
+    public static char readChar(byte[] arr, int off) {
+        char val = UNSAFE.getChar(arr, BYTE_ARR_OFF + off);
 
-    /**
-     * @param arr Array.
-     * @param off Offset.
-     * @param val Value.
-     */
-    public abstract void writeFloat(byte[] arr, int off, float val);
+        if (BIG_ENDIAN)
+            val = Character.reverseBytes(val);
+
+        return val;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract float readFloat(byte[] arr, int off);
+    public static char[] readCharArray(byte[] arr, int off, int len) {
+        char[] arr0 = new char[len];
+
+        UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, CHAR_ARR_OFF, len << 1);
+
+        if (BIG_ENDIAN) {
+            for (int i = 0; i < len; i++)
+                arr0[i] = Character.reverseBytes(arr0[i]);
+        }
+
+        return arr0;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeDouble(byte[] arr, int off, double val);
+    public static void writeInt(byte[] arr, int off, int val) {
+        if (BIG_ENDIAN)
+            val = Integer.reverseBytes(val);
+
+        UNSAFE.putInt(arr, BYTE_ARR_OFF + off, val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract double readDouble(byte[] arr, int off);
+    public static int readInt(byte[] arr, int off) {
+        int val = UNSAFE.getInt(arr, BYTE_ARR_OFF + off);
+
+        if (BIG_ENDIAN)
+            val = Integer.reverseBytes(val);
+
+        return val;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeChar(byte[] arr, int off, char val);
+    public static void writeLong(byte[] arr, int off, long val) {
+        if (BIG_ENDIAN)
+            val = Long.reverseBytes(val);
+
+        UNSAFE.putLong(arr, BYTE_ARR_OFF + off, val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract char readChar(byte[] arr, int off);
+    public static long readLong(byte[] arr, int off) {
+        long val = UNSAFE.getLong(arr, BYTE_ARR_OFF + off);
+
+        if (BIG_ENDIAN)
+            val = Long.reverseBytes(val);
+
+        return val;
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @param val Value.
      */
-    public abstract void writeBoolean(byte[] arr, int off, boolean val);
+    public static void writeFloat(byte[] arr, int off, float val) {
+        int val0 = Float.floatToIntBits(val);
+
+        writeInt(arr, off, val0);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
      * @return Value.
      */
-    public abstract boolean readBoolean(byte[] arr, int off);
+    public static float readFloat(byte[] arr, int off) {
+        int val = readInt(arr, off);
+
+        return Float.intBitsToFloat(val);
+    }
 
     /**
      * @param arr Array.
      * @param off Offset.
-     * @return Value.
+     * @param val Value.
      */
-    public abstract char[] readCharArray(byte[] arr, int off, int len);
-
-    /** */
-    private static class UnsafePrimitives extends PortablePrimitives {
-        /** */
-        private static final Unsafe UNSAFE = GridUnsafe.unsafe();
-
-        /** */
-        private static final long BYTE_ARR_OFF = UNSAFE.arrayBaseOffset(byte[].class);
-
-        /** */
-        private static final long CHAR_ARR_OFF = UNSAFE.arrayBaseOffset(char[].class);
-
-        /** {@inheritDoc} */
-        @Override public void writeByte(byte[] arr, int off, byte val) {
-            UNSAFE.putByte(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public byte readByte(byte[] arr, int off) {
-            return UNSAFE.getByte(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeShort(byte[] arr, int off, short val) {
-            UNSAFE.putShort(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public short readShort(byte[] arr, int off) {
-            return UNSAFE.getShort(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeInt(byte[] arr, int off, int val) {
-            UNSAFE.putInt(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public int readInt(byte[] arr, int off) {
-            return UNSAFE.getInt(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeLong(byte[] arr, int off, long val) {
-            UNSAFE.putLong(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public long readLong(byte[] arr, int off) {
-            return UNSAFE.getLong(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeFloat(byte[] arr, int off, float val) {
-            UNSAFE.putFloat(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public float readFloat(byte[] arr, int off) {
-            return UNSAFE.getFloat(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeDouble(byte[] arr, int off, double val) {
-            UNSAFE.putDouble(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public double readDouble(byte[] arr, int off) {
-            return UNSAFE.getDouble(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeChar(byte[] arr, int off, char val) {
-            UNSAFE.putChar(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public char readChar(byte[] arr, int off) {
-            return UNSAFE.getChar(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeBoolean(byte[] arr, int off, boolean val) {
-            UNSAFE.putBoolean(arr, BYTE_ARR_OFF + off, val);
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean readBoolean(byte[] arr, int off) {
-            return UNSAFE.getBoolean(arr, BYTE_ARR_OFF + off);
-        }
-
-        /** {@inheritDoc} */
-        @Override public char[] readCharArray(byte[] arr, int off, int len) {
-            char[] arr0 = new char[len];
-
-            UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, arr0, CHAR_ARR_OFF, len << 1);
+    public static void writeDouble(byte[] arr, int off, double val) {
+        long val0 = Double.doubleToLongBits(val);
 
-            return arr0;
-        }
+        writeLong(arr, off, val0);
     }
 
-    /** */
-    private static class BytePrimitives extends PortablePrimitives {
-        /** {@inheritDoc} */
-        @Override public void writeByte(byte[] arr, int off, byte val) {
-            arr[off] = val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public byte readByte(byte[] arr, int off) {
-            return arr[off];
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeShort(byte[] arr, int off, short val) {
-            arr[off++] = (byte)(val & 0xff);
-            arr[off] = (byte)((val >>> 8) & 0xff);
-        }
-
-        /** {@inheritDoc} */
-        @Override public short readShort(byte[] arr, int off) {
-            short val = 0;
-
-            val |= (arr[off++] & 0xff);
-            val |= (arr[off] & 0xff) << 8;
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeInt(byte[] arr, int off, int val) {
-            arr[off++] = (byte)(val & 0xff);
-            arr[off++] = (byte)((val >>> 8) & 0xff);
-            arr[off++] = (byte)((val >>> 16) & 0xff);
-            arr[off] = (byte)((val >>> 24) & 0xff);
-        }
-
-        /** {@inheritDoc} */
-        @Override public int readInt(byte[] arr, int off) {
-            int val = 0;
-
-            val |= (arr[off++] & 0xff);
-            val |= (arr[off++] & 0xff) << 8;
-            val |= (arr[off++] & 0xff) << 16;
-            val |= (arr[off] & 0xff) << 24;
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeLong(byte[] arr, int off, long val) {
-            arr[off++] = (byte)(val & 0xffL);
-            arr[off++] = (byte)((val >>> 8) & 0xffL);
-            arr[off++] = (byte)((val >>> 16) & 0xffL);
-            arr[off++] = (byte)((val >>> 24) & 0xffL);
-            arr[off++] = (byte)((val >>> 32) & 0xffL);
-            arr[off++] = (byte)((val >>> 40) & 0xffL);
-            arr[off++] = (byte)((val >>> 48) & 0xffL);
-            arr[off] = (byte)((val >>> 56) & 0xffL);
-        }
-
-        /** {@inheritDoc} */
-        @Override public long readLong(byte[] arr, int off) {
-            long val = 0;
-
-            val |= (arr[off++] & 0xffL);
-            val |= (arr[off++] & 0xffL) << 8;
-            val |= (arr[off++] & 0xffL) << 16;
-            val |= (arr[off++] & 0xffL) << 24;
-            val |= (arr[off++] & 0xffL) << 32;
-            val |= (arr[off++] & 0xffL) << 40;
-            val |= (arr[off++] & 0xffL) << 48;
-            val |= (arr[off] & 0xffL) << 56;
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeFloat(byte[] arr, int off, float val) {
-            writeInt(arr, off, Float.floatToIntBits(val));
-        }
-
-        /** {@inheritDoc} */
-        @Override public float readFloat(byte[] arr, int off) {
-            return Float.intBitsToFloat(readInt(arr, off));
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeDouble(byte[] arr, int off, double val) {
-            writeLong(arr, off, Double.doubleToLongBits(val));
-        }
-
-        /** {@inheritDoc} */
-        @Override public double readDouble(byte[] arr, int off) {
-            return Double.longBitsToDouble(readLong(arr, off));
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeChar(byte[] arr, int off, char val) {
-            arr[off++] = (byte)(val & 0xff);
-            arr[off] = (byte)((val >>> 8) & 0xff);
-        }
-
-        /** {@inheritDoc} */
-        @Override public char readChar(byte[] arr, int off) {
-            char val = 0;
-
-            val |= (arr[off++] & 0xff);
-            val |= (arr[off] & 0xff) << 8;
-
-            return val;
-        }
-
-        /** {@inheritDoc} */
-        @Override public void writeBoolean(byte[] arr, int off, boolean val) {
-            arr[off] = (byte)(val ? 1 : 0);
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean readBoolean(byte[] arr, int off) {
-            return arr[off] != 0;
-        }
-
-        /** {@inheritDoc} */
-        @Override public char[] readCharArray(byte[] arr, int off, int len) {
-            char[] val = new char[len];
-
-            for (int i = 0; i < len; i++) {
-                val[i] = readChar(arr, off);
-
-                off += 2;
-            }
+    /**
+     * @param arr Array.
+     * @param off Offset.
+     * @return Value.
+     */
+    public static double readDouble(byte[] arr, int off) {
+        long val = readLong(arr, off);
 
-            return val;
-        }
+        return Double.longBitsToDouble(val);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/c74b98e9/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
index b999cde..57ae3e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderReader.java
@@ -40,9 +40,6 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING;
  */
 public class PortableBuilderReader implements PortablePositionReadable {
     /** */
-    private static final PortablePrimitives PRIM = PortablePrimitives.get();
-
-    /** */
     private final Map<Integer, PortableBuilderImpl> objMap = new HashMap<>();
 
     /** */
@@ -120,7 +117,7 @@ public class PortableBuilderReader implements PortablePositionReadable {
      * @return Read int value.
      */
     public int readInt(int off) {
-        return PRIM.readInt(arr, pos + off);
+        return PortablePrimitives.readInt(arr, pos + off);
     }
 
     /**
@@ -128,24 +125,24 @@ public class PortableBuilderReader implements PortablePositionReadable {
      * @return Read byte value.
      */
     public byte readByteAbsolute(int pos) {
-        return PRIM.readByte(arr, pos);
+        return PortablePrimitives.readByte(arr, pos);
     }
 
     /** {@inheritDoc} */
     @Override public short readShortPositioned(int pos) {
-        return PRIM.readShort(arr, pos);
+        return PortablePrimitives.readShort(arr, pos);
     }
 
     /** {@inheritDoc} */
     @Override public int readIntPositioned(int pos) {
-        return PRIM.readInt(arr, pos);
+        return PortablePrimitives.readInt(arr, pos);
     }
 
     /**
      * @return Read length of array.
      */
     public int readLength() {
-        return PRIM.readInt(arr, pos);
+        return PortablePrimitives.readInt(arr, pos);
     }
 
     /**
@@ -154,9 +151,9 @@ public class PortableBuilderReader implements PortablePositionReadable {
      * @return String length.
      */
     public int readStringLength() {
-        boolean utf = PRIM.readBoolean(arr, pos);
+        boolean utf = PortablePrimitives.readBoolean(arr, pos);
 
-        int arrLen = PRIM.readInt(arr, pos + 1);
+        int arrLen = PortablePrimitives.readInt(arr, pos + 1);
 
         return 1 + (utf ? arrLen : arrLen << 1);
     }
@@ -186,7 +183,7 @@ public class PortableBuilderReader implements PortablePositionReadable {
             pos += len;
         }
         else {
-            str = String.valueOf(PRIM.readCharArray(arr, pos, len));
+            str = String.valueOf(PortablePrimitives.readCharArray(arr, pos, len));
 
             pos += len << 1;
         }
@@ -389,22 +386,22 @@ public class PortableBuilderReader implements PortablePositionReadable {
                 return arr[pos + 1];
 
             case GridPortableMarshaller.SHORT:
-                return PRIM.readShort(arr, pos + 1);
+                return PortablePrimitives.readShort(arr, pos + 1);
 
             case GridPortableMarshaller.INT:
-                return PRIM.readInt(arr, pos + 1);
+                return PortablePrimitives.readInt(arr, pos + 1);
 
             case GridPortableMarshaller.LONG:
-                return PRIM.readLong(arr, pos + 1);
+                return PortablePrimitives.readLong(arr, pos + 1);
 
             case GridPortableMarshaller.FLOAT:
-                return PRIM.readFloat(arr, pos + 1);
+                return PortablePrimitives.readFloat(arr, pos + 1);
 
             case GridPortableMarshaller.DOUBLE:
-                return PRIM.readDouble(arr, pos + 1);
+                return PortablePrimitives.readDouble(arr, pos + 1);
 
             case GridPortableMarshaller.CHAR:
-                return PRIM.readChar(arr, pos + 1);
+                return PortablePrimitives.readChar(arr, pos + 1);
 
             case GridPortableMarshaller.BOOLEAN:
                 return arr[pos + 1] != 0;
@@ -518,7 +515,7 @@ public class PortableBuilderReader implements PortablePositionReadable {
                 return arr[pos++];
 
             case GridPortableMarshaller.SHORT: {
-                Object res = PRIM.readShort(arr, pos);
+                Object res = PortablePrimitives.readShort(arr, pos);
                 pos += 2;
                 return res;
             }
@@ -638,7 +635,7 @@ public class PortableBuilderReader implements PortablePositionReadable {
                     if (flag != GridPortableMarshaller.DATE)
                         throw new PortableException("Invalid flag value: " + flag);
 
-                    long time = PRIM.readLong(arr, pos);
+                    long time = PortablePrimitives.readLong(arr, pos);
 
                     pos += 8;
 
@@ -662,11 +659,11 @@ public class PortableBuilderReader implements PortablePositionReadable {
                     if (flag != GridPortableMarshaller.TIMESTAMP)
                         throw new PortableException("Invalid flag value: " + flag);
 
-                    long time = PRIM.readLong(arr, pos);
+                    long time = PortablePrimitives.readLong(arr, pos);
 
                     pos += 8;
 
-                    int nano = PRIM.readInt(arr, pos);
+                    int nano = PortablePrimitives.readInt(arr, pos);
 
                     pos += 4;