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/05 09:06:36 UTC

[1/5] ignite git commit: IGNITE-1816: WIP.

Repository: ignite
Updated Branches:
  refs/heads/ignite-1816 [created] d311c5dd5


IGNITE-1816: WIP.


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

Branch: refs/heads/ignite-1816
Commit: adcce88c43f8bc126766342492e892437c593014
Parents: e4b128e
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 4 12:22:41 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 4 12:22:41 2015 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/portable/PortableUtils.java   | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/adcce88c/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 e0368b6..fae952c 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
@@ -96,16 +96,19 @@ public class PortableUtils {
     private static final Collection<Class<?>> PORTABLE_CLS = new HashSet<>();
 
     /** Flag: user type. */
-    public static final short FLAG_USR_TYP = 0x1;
+    public static final short FLAG_USR_TYP = 0x0001;
 
     /** Flag: only raw data exists. */
-    public static final short FLAG_RAW_ONLY = 0x2;
+    public static final short FLAG_RAW_ONLY = 0x0002;
 
     /** Flag: offsets take 1 byte. */
-    public static final short FLAG_OFFSET_ONE_BYTE = 0x4;
+    public static final short FLAG_OFFSET_ONE_BYTE = 0x0004;
 
     /** Flag: offsets take 2 bytes. */
-    public static final short FLAG_OFFSET_TWO_BYTES = 0x8;
+    public static final short FLAG_OFFSET_TWO_BYTES = 0x0008;
+
+    /** Flag: no field IDs in object's footer. */
+    public static final short FLAG_NO_FIELD_IDS = 0x0010;
 
     /** Offset which fits into 1 byte. */
     public static final int OFFSET_1 = 1;


[3/5] ignite git commit: IGNITE-1816: Prepared reader for the fix.

Posted by vo...@apache.org.
IGNITE-1816: Prepared reader for the fix.


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

Branch: refs/heads/ignite-1816
Commit: 89b2f6cc74afc1234f32e1dc785ec7ab0325ed86
Parents: f3e774b
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 4 17:26:24 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 4 17:26:24 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableReaderExImpl.java | 28 ++++++++++++++------
 1 file changed, 20 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/89b2f6cc/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 b5decba..983d61f 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
@@ -118,8 +118,8 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID_AR
  */
 @SuppressWarnings("unchecked")
 public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx, ObjectInput {
-    /** Length of a single field descriptor. */
-    private static final int FIELD_DESC_LEN = 16;
+    /** Length of a single field ID value. */
+    private static final int FIELD_ID_LEN = 4;
 
     /** */
     private final PortableContext ctx;
@@ -166,6 +166,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     /** Offset size in bytes. */
     private int offsetSize;
 
+    /** Whether field IDs exist. */
+    private int fieldIdLen;
+
     /** Object schema. */
     private PortableSchema schema;
 
@@ -227,6 +230,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         short flags = in.readShort();
 
         offsetSize = PortableUtils.fieldOffsetSize(flags);
+        fieldIdLen = PortableUtils.isNoFieldIds(flags) ? 0 : FIELD_ID_LEN;
 
         typeId = in.readIntPositioned(start + GridPortableMarshaller.TYPE_ID_POS);
 
@@ -2567,6 +2571,8 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     public PortableSchema createSchema() {
         parseHeaderIfNeeded();
 
+        assert fieldIdLen == FIELD_ID_LEN;
+
         LinkedHashMap<Integer, Integer> fields = new LinkedHashMap<>();
 
         int searchPos = footerStart;
@@ -2579,7 +2585,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
             fields.put(fieldId, idx++);
 
-            searchPos += 4 + offsetSize;
+            searchPos += FIELD_ID_LEN + offsetSize;
         }
 
         return new PortableSchema(fields);
@@ -2598,7 +2604,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         int searchPos = footerStart;
         int searchTail = searchPos + footerLen;
 
-        if (hasLowFieldsCount(footerLen)) {
+        if (fieldIdLen != 0 && hasLowFieldsCount(footerLen)) {
             while (true) {
                 if (searchPos >= searchTail)
                     return 0;
@@ -2606,14 +2612,14 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 int id0 = in.readIntPositioned(searchPos);
 
                 if (id0 == id) {
-                    int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + 4, offsetSize);
+                    int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + FIELD_ID_LEN, offsetSize);
 
                     in.position(pos);
 
                     return pos;
                 }
 
-                searchPos += 4 + offsetSize;
+                searchPos += FIELD_ID_LEN + offsetSize;
             }
         }
         else {
@@ -2623,6 +2629,10 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 schema0 = ctx.schemaRegistry(typeId).schema(schemaId);
 
                 if (schema0 == null) {
+                    if (fieldIdLen == 0)
+                        throw new PortableException("Cannot find schema for object without field IDs [" +
+                            "typeId=" + typeId + ", schemaId=" + schemaId + ']');
+
                     schema0 = createSchema();
 
                     ctx.schemaRegistry(typeId).addSchema(schemaId, schema0);
@@ -2631,10 +2641,12 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 schema = schema0;
             }
 
+            assert schema != null;
+
             int order = schema.order(id);
 
             if (order != PortableSchema.ORDER_NOT_FOUND) {
-                int offsetPos = footerStart + order * (4 + offsetSize) + 4;
+                int offsetPos = footerStart + order * (fieldIdLen + offsetSize) + fieldIdLen;
 
                 int pos = start + PortableUtils.fieldOffsetRelative(in, offsetPos, offsetSize);
 
@@ -2655,7 +2667,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     private boolean hasLowFieldsCount(int footerLen) {
         assert hdrParsed;
 
-        return footerLen < (FIELD_DESC_LEN << 4);
+        return footerLen < ((offsetSize + fieldIdLen) << 3);
     }
 
     /** {@inheritDoc} */


[4/5] ignite git commit: IGNITE-1816: WIP.

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


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

Branch: refs/heads/ignite-1816
Commit: 425f26fc570e0bcb5f7b4f720d4e1fd5a1642798
Parents: 89b2f6c
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 4 17:30:20 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 4 17:30:20 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableReaderExImpl.java       | 14 ++++++--------
 .../ignite/internal/portable/PortableUtils.java       |  3 +++
 2 files changed, 9 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/425f26fc/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 983d61f..09eb9d9 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
@@ -118,9 +118,6 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID_AR
  */
 @SuppressWarnings("unchecked")
 public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx, ObjectInput {
-    /** Length of a single field ID value. */
-    private static final int FIELD_ID_LEN = 4;
-
     /** */
     private final PortableContext ctx;
 
@@ -230,7 +227,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
         short flags = in.readShort();
 
         offsetSize = PortableUtils.fieldOffsetSize(flags);
-        fieldIdLen = PortableUtils.isNoFieldIds(flags) ? 0 : FIELD_ID_LEN;
+        fieldIdLen = PortableUtils.isNoFieldIds(flags) ? 0 : PortableUtils.FIELD_ID_LEN;
 
         typeId = in.readIntPositioned(start + GridPortableMarshaller.TYPE_ID_POS);
 
@@ -2571,7 +2568,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     public PortableSchema createSchema() {
         parseHeaderIfNeeded();
 
-        assert fieldIdLen == FIELD_ID_LEN;
+        assert fieldIdLen == PortableUtils.FIELD_ID_LEN;
 
         LinkedHashMap<Integer, Integer> fields = new LinkedHashMap<>();
 
@@ -2585,7 +2582,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
             fields.put(fieldId, idx++);
 
-            searchPos += FIELD_ID_LEN + offsetSize;
+            searchPos += PortableUtils.FIELD_ID_LEN + offsetSize;
         }
 
         return new PortableSchema(fields);
@@ -2612,14 +2609,15 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
                 int id0 = in.readIntPositioned(searchPos);
 
                 if (id0 == id) {
-                    int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + FIELD_ID_LEN, offsetSize);
+                    int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + PortableUtils.FIELD_ID_LEN,
+                        offsetSize);
 
                     in.position(pos);
 
                     return pos;
                 }
 
-                searchPos += FIELD_ID_LEN + offsetSize;
+                searchPos += PortableUtils.FIELD_ID_LEN + offsetSize;
             }
         }
         else {

http://git-wip-us.apache.org/repos/asf/ignite/blob/425f26fc/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 d8dc380..78c66cc 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
@@ -119,6 +119,9 @@ public class PortableUtils {
     /** Offset which fits into 4 bytes. */
     public static final int OFFSET_4 = 4;
 
+    /** Length of a single field ID value. */
+    public static final int FIELD_ID_LEN = 4;
+
     /**
      * Check if user type flag is set.
      *


[2/5] ignite git commit: IGNITE-1816: WIP.

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


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

Branch: refs/heads/ignite-1816
Commit: f3e774b3d768cf5ae7395d7983d7cae8b5ac5bcb
Parents: adcce88
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 4 15:15:28 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 4 15:15:28 2015 +0300

----------------------------------------------------------------------
 .../portable/PortableClassDescriptor.java       | 11 +++--
 .../internal/portable/PortableContext.java      |  7 +++
 .../ignite/internal/portable/PortableUtils.java | 46 +++++++++++---------
 .../internal/portable/PortableWriterExImpl.java | 31 ++++++-------
 .../portable/builder/PortableBuilderImpl.java   |  4 +-
 5 files changed, 56 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f3e774b3/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
index aa72017..a1c308e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableClassDescriptor.java
@@ -675,7 +675,6 @@ public class PortableClassDescriptor {
 
         PortableUtils.writeHeader(
             writer,
-            userType,
             registered ? typeId : GridPortableMarshaller.UNREGISTERED_TYPE_ID,
             obj instanceof CacheObjectImpl ? 0 : obj.hashCode(),
             registered ? null : cls.getName()
@@ -710,6 +709,9 @@ public class PortableClassDescriptor {
         try {
             Constructor<?> ctor = U.forceEmptyConstructor(cls);
 
+            if (ctor == null)
+                throw new PortableException("Failed to find empty constructor for class: " + cls.getName());
+
             ctor.setAccessible(true);
 
             return ctor;
@@ -732,11 +734,8 @@ public class PortableClassDescriptor {
             Method writeObj = cls.getDeclaredMethod("writeObject", ObjectOutputStream.class);
             Method readObj = cls.getDeclaredMethod("readObject", ObjectInputStream.class);
 
-            if (!Modifier.isStatic(writeObj.getModifiers()) && !Modifier.isStatic(readObj.getModifiers()) &&
-                writeObj.getReturnType() == void.class && readObj.getReturnType() == void.class)
-                use = true;
-            else
-                use = false;
+            use = !Modifier.isStatic(writeObj.getModifiers()) && !Modifier.isStatic(readObj.getModifiers()) &&
+                writeObj.getReturnType() == void.class && readObj.getReturnType() == void.class;
         }
         catch (NoSuchMethodException e) {
             use = false;

http://git-wip-us.apache.org/repos/asf/ignite/blob/f3e774b3/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
index e61cba7..970aeea 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/PortableContext.java
@@ -850,6 +850,13 @@ public class PortableContext implements Externalizable {
     }
 
     /**
+     * @return Whether field IDs should be skipped in footer or not.
+     */
+    public boolean isNoFieldIds() {
+        return false; // TODO: IGNITE-1816: Take from config.
+    }
+
+    /**
      * @return Whether to convert string to UTF8 bytes.
      */
     public boolean isConvertString() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f3e774b3/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 fae952c..d8dc380 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
@@ -120,40 +120,47 @@ public class PortableUtils {
     public static final int OFFSET_4 = 4;
 
     /**
-     * Write flags.
+     * Check if user type flag is set.
      *
-     * @param writer Writer.
-     * @param userType User type flag.
+     * @param flags Flags.
+     * @return {@code True} if set.
      */
-    public static void writeFlags(PortableWriterExImpl writer, boolean userType) {
-        short val = 0;
-
-        if (userType)
-            val |= FLAG_USR_TYP;
-
-        writer.doWriteShort(val);
+    public static boolean isUserType(short flags) {
+        return isFlagSet(flags, FLAG_USR_TYP);
     }
 
     /**
-     * Check if user type flag is set.
+     * Check if raw-only flag is set.
      *
      * @param flags Flags.
      * @return {@code True} if set.
      */
-    public static boolean isUserType(short flags) {
-        return (flags & FLAG_USR_TYP) == FLAG_USR_TYP;
+    public static boolean isRawOnly(short flags) {
+        return isFlagSet(flags, FLAG_RAW_ONLY);
     }
 
     /**
-     * Check if raw-only flag is set.
+     * Check if "no-field-ids" flag is set.
      *
      * @param flags Flags.
      * @return {@code True} if set.
      */
-    public static boolean isRawOnly(short flags) {
-        return (flags & FLAG_RAW_ONLY) == FLAG_RAW_ONLY;
+    public static boolean isNoFieldIds(short flags) {
+        return isFlagSet(flags, FLAG_NO_FIELD_IDS);
+    }
+
+    /**
+     * Check whether particular flag is set.
+     *
+     * @param flags Flags.
+     * @param flag Flag.
+     * @return {@code True} if flag is set in flags.
+     */
+    private static boolean isFlagSet(short flags, short flag) {
+        return (flags & flag) == flag;
     }
 
+
     /**
      *
      */
@@ -554,18 +561,17 @@ public class PortableUtils {
      * Write portable header.
      *
      * @param writer Writer.
-     * @param usrTyp User type flag.
      * @param typeId Type ID.
      * @param hashCode Hash code.
      * @param clsName Class name (optional).
      * @return Position where length should be written.
      */
-    public static int writeHeader(PortableWriterExImpl writer, boolean usrTyp, int typeId, int hashCode,
-        @Nullable String clsName) {
+    public static int writeHeader(PortableWriterExImpl writer, int typeId, int hashCode, @Nullable String clsName) {
         writer.doWriteByte(GridPortableMarshaller.OBJ);
         writer.doWriteByte(GridPortableMarshaller.PROTO_VER);
 
-        PortableUtils.writeFlags(writer, usrTyp);
+        // Skip flags, they will be written in post-write step.
+        writer.position(writer.position() + 2);
 
         writer.doWriteInt(typeId);
         writer.doWriteInt(hashCode);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f3e774b3/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 542c897..e7ec826 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
@@ -90,7 +90,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
     /** Length: integer. */
     private static final int LEN_INT = 4;
 
-    /** */
+    /** Initial capacity. */
     private static final int INIT_CAP = 1024;
 
     /** FNV1 hash offset basis. */
@@ -333,6 +333,7 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
 
     /**
      * Perform post-write activity. This includes:
+     * - writing flags;
      * - writing object length;
      * - writing schema offset;
      * - writing schema to the tail.
@@ -340,6 +341,11 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
      * @param userType User type flag.
      */
     public void postWrite(boolean userType) {
+        short flags = userType ? PortableUtils.FLAG_USR_TYP : 0;
+
+        if (ctx.isNoFieldIds())
+            flags |= PortableUtils.FLAG_NO_FIELD_IDS;
+
         if (schema != null) {
             // Write schema ID.
             out.writeInt(start + SCHEMA_ID_POS, schemaId);
@@ -354,28 +360,23 @@ public class PortableWriterExImpl implements PortableWriter, PortableRawWriterEx
             if (rawOffPos != 0)
                 out.writeInt(rawOffPos - start);
 
-            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 == PortableUtils.OFFSET_2) {
-                int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_OFFSET_TWO_BYTES;
-
-                out.writeShort(start + FLAGS_POS, (short)flags);
-            }
+            if (offsetByteCnt == PortableUtils.OFFSET_1)
+                flags |= PortableUtils.FLAG_OFFSET_ONE_BYTE;
+            else if (offsetByteCnt == PortableUtils.OFFSET_2)
+                flags |= PortableUtils.FLAG_OFFSET_TWO_BYTES;
         }
         else {
             // Write raw-only flag is needed.
-            int flags = (userType ? PortableUtils.FLAG_USR_TYP : 0) | PortableUtils.FLAG_RAW_ONLY;
-
-            out.writeShort(start + FLAGS_POS, (short)flags);
+            flags |= PortableUtils.FLAG_RAW_ONLY;
 
             // If there are no schema, we are free to write raw offset to schema offset.
             out.writeInt(start + SCHEMA_OR_RAW_OFF_POS, (rawOffPos == 0 ? out.position() : rawOffPos) - start);
         }
 
-        // 5. Write length.
+        // Write flags as we know them at this point.
+        out.writeShort(start + FLAGS_POS, flags);
+
+        // Write length.
         out.writeInt(start + TOTAL_LEN_POS, out.position() - start);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f3e774b3/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 89bb3ff..104eb4c 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
@@ -205,10 +205,10 @@ public class PortableBuilderImpl implements PortableBuilder {
     void serializeTo(PortableWriterExImpl writer, PortableBuilderSerializer serializer) {
         try {
             PortableUtils.writeHeader(writer,
-                true,
                 registeredType ? typeId : UNREGISTERED_TYPE_ID,
                 hashCode,
-                registeredType ? null : clsNameToWrite);
+                registeredType ? null : clsNameToWrite
+            );
 
             Set<Integer> remainsFlds = null;
 


[5/5] ignite git commit: IGNITE-1816: Prepared builder for actual implementation.

Posted by vo...@apache.org.
IGNITE-1816: Prepared builder for actual implementation.


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

Branch: refs/heads/ignite-1816
Commit: d311c5dd5d8a1ac9fc6ecd58b56c6f5257f727c5
Parents: 425f26f
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Wed Nov 4 17:40:24 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Wed Nov 4 17:40:24 2015 +0300

----------------------------------------------------------------------
 .../internal/portable/PortableObjectImpl.java   |  8 ++--
 .../portable/PortableObjectOffheapImpl.java     |  8 ++--
 .../internal/portable/PortableReaderExImpl.java | 26 ++++++------
 .../ignite/internal/portable/PortableUtils.java | 15 ++++++-
 .../portable/builder/PortableBuilderImpl.java   | 44 +++++++++++---------
 5 files changed, 58 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d311c5dd/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 1d1be2b..33dfe62 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
@@ -269,15 +269,15 @@ public final class PortableObjectImpl extends PortableObjectEx implements Extern
         int schemaOffset = PortablePrimitives.readInt(arr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
         short flags = PortablePrimitives.readShort(arr, start + GridPortableMarshaller.FLAGS_POS);
-        int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+        int fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
 
-        int fieldOffsetPos = start + schemaOffset + order * (4 + fieldOffsetSize) + 4;
+        int fieldOffsetPos = start + schemaOffset + order * (4 + fieldOffsetLen) + 4;
 
         int fieldPos;
 
-        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+        if (fieldOffsetLen == PortableUtils.OFFSET_1)
             fieldPos = start + ((int)PortablePrimitives.readByte(arr, fieldOffsetPos) & 0xFF);
-        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+        else if (fieldOffsetLen == PortableUtils.OFFSET_2)
             fieldPos = start + ((int)PortablePrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF);
         else
             fieldPos = start + PortablePrimitives.readInt(arr, fieldOffsetPos);

http://git-wip-us.apache.org/repos/asf/ignite/blob/d311c5dd/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 3027f76..1a4e448 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
@@ -211,15 +211,15 @@ public class PortableObjectOffheapImpl extends PortableObjectEx implements Exter
         int schemaOffset = PortablePrimitives.readInt(ptr, start + GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS);
 
         short flags = PortablePrimitives.readShort(ptr, start + GridPortableMarshaller.FLAGS_POS);
-        int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
 
-        int fieldOffsetPos = start + schemaOffset + order * (4 + fieldOffsetSize) + 4;
+        int fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
+        int fieldOffsetPos = start + schemaOffset + order * (4 + fieldOffsetLen) + 4;
 
         int fieldPos;
 
-        if (fieldOffsetSize == PortableUtils.OFFSET_1)
+        if (fieldOffsetLen == PortableUtils.OFFSET_1)
             fieldPos = start + ((int)PortablePrimitives.readByte(ptr, fieldOffsetPos) & 0xFF);
-        else if (fieldOffsetSize == PortableUtils.OFFSET_2)
+        else if (fieldOffsetLen == PortableUtils.OFFSET_2)
             fieldPos = start + ((int)PortablePrimitives.readShort(ptr, fieldOffsetPos) & 0xFFFF);
         else
             fieldPos = start + PortablePrimitives.readInt(ptr, fieldOffsetPos);

http://git-wip-us.apache.org/repos/asf/ignite/blob/d311c5dd/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 09eb9d9..c774e34 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
@@ -160,12 +160,12 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     /** Schema Id. */
     private int schemaId;
 
-    /** Offset size in bytes. */
-    private int offsetSize;
-
     /** Whether field IDs exist. */
     private int fieldIdLen;
 
+    /** Offset size in bytes. */
+    private int fieldOffsetLen;
+
     /** Object schema. */
     private PortableSchema schema;
 
@@ -226,19 +226,19 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
         short flags = in.readShort();
 
-        offsetSize = PortableUtils.fieldOffsetSize(flags);
-        fieldIdLen = PortableUtils.isNoFieldIds(flags) ? 0 : PortableUtils.FIELD_ID_LEN;
+        fieldIdLen = PortableUtils.fieldIdLength(flags);
+        fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
 
         typeId = in.readIntPositioned(start + GridPortableMarshaller.TYPE_ID_POS);
 
-        IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(in, start, offsetSize);
+        IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(in, start, fieldOffsetLen);
 
         footerStart = footer.get1();
         footerLen = footer.get2() - footerStart;
 
         schemaId = in.readIntPositioned(start + GridPortableMarshaller.SCHEMA_ID_POS);
 
-        rawOff = PortableUtils.rawOffsetAbsolute(in, start, offsetSize);
+        rawOff = PortableUtils.rawOffsetAbsolute(in, start, fieldOffsetLen);
 
         if (typeId == UNREGISTERED_TYPE_ID) {
             // Skip to the class name position.
@@ -2582,7 +2582,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
             fields.put(fieldId, idx++);
 
-            searchPos += PortableUtils.FIELD_ID_LEN + offsetSize;
+            searchPos += PortableUtils.FIELD_ID_LEN + fieldOffsetLen;
         }
 
         return new PortableSchema(fields);
@@ -2610,14 +2610,14 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
 
                 if (id0 == id) {
                     int pos = start + PortableUtils.fieldOffsetRelative(in, searchPos + PortableUtils.FIELD_ID_LEN,
-                        offsetSize);
+                        fieldOffsetLen);
 
                     in.position(pos);
 
                     return pos;
                 }
 
-                searchPos += PortableUtils.FIELD_ID_LEN + offsetSize;
+                searchPos += PortableUtils.FIELD_ID_LEN + fieldOffsetLen;
             }
         }
         else {
@@ -2644,9 +2644,9 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
             int order = schema.order(id);
 
             if (order != PortableSchema.ORDER_NOT_FOUND) {
-                int offsetPos = footerStart + order * (fieldIdLen + offsetSize) + fieldIdLen;
+                int offsetPos = footerStart + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen;
 
-                int pos = start + PortableUtils.fieldOffsetRelative(in, offsetPos, offsetSize);
+                int pos = start + PortableUtils.fieldOffsetRelative(in, offsetPos, fieldOffsetLen);
 
                 in.position(pos);
 
@@ -2665,7 +2665,7 @@ public class PortableReaderExImpl implements PortableReader, PortableRawReaderEx
     private boolean hasLowFieldsCount(int footerLen) {
         assert hdrParsed;
 
-        return footerLen < ((offsetSize + fieldIdLen) << 3);
+        return footerLen < ((fieldOffsetLen + fieldIdLen) << 3);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/d311c5dd/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 78c66cc..b760849 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
@@ -677,11 +677,12 @@ public class PortableUtils {
     }
 
     /**
-     * Get offset size for the given flags.
+     * Get offset length for the given flags.
+     *
      * @param flags Flags.
      * @return Offset size.
      */
-    public static int fieldOffsetSize(short flags) {
+    public static int fieldOffsetLength(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)
@@ -691,6 +692,16 @@ public class PortableUtils {
     }
 
     /**
+     * Get field ID length.
+     *
+     * @param flags Flags.
+     * @return Field ID length.
+     */
+    public static int fieldIdLength(short flags) {
+        return isNoFieldIds(flags) ? 0 : FIELD_ID_LEN;
+    }
+
+    /**
      * Get relative field offset.
      *
      * @param stream Stream.

http://git-wip-us.apache.org/repos/asf/ignite/blob/d311c5dd/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 104eb4c..cc78770 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
@@ -229,26 +229,28 @@ public class PortableBuilderImpl implements PortableBuilder {
                     assignedFldsById = Collections.emptyMap();
 
                 // Get footer details.
-                int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+                int fieldIdLen = PortableUtils.fieldIdLength(flags);
+                int fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
 
-                IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(reader, start, fieldOffsetSize);
+                IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(reader, start, fieldOffsetLen);
 
                 int footerPos = footer.get1();
                 int footerEnd = footer.get2();
 
                 // Get raw position.
-                int rawPos = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetSize);
+                int rawPos = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetLen);
 
                 // Position reader on data.
                 reader.position(start + hdrLen);
 
-                while (reader.position() + 4 < rawPos) {
+                while (reader.position() + fieldIdLen < rawPos) {
                     int fieldId = reader.readIntPositioned(footerPos);
-                    int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldOffsetSize).get2();
+                    int fieldLen =
+                        fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen).get2();
 
                     int postPos = reader.position() + fieldLen; // Position where reader will be placed afterwards.
 
-                    footerPos += 4 + fieldOffsetSize;
+                    footerPos += fieldIdLen + fieldOffsetLen;
 
                     if (assignedFldsById.containsKey(fieldId)) {
                         Object assignedVal = assignedFldsById.remove(fieldId);
@@ -367,9 +369,9 @@ public class PortableBuilderImpl implements PortableBuilder {
 
             if (reader != null) {
                 // Write raw data if any.
-                int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+                int fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
 
-                int rawOff = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetSize);
+                int rawOff = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetLen);
                 int footerStart = PortableUtils.footerStartAbsolute(reader, start);
 
                 if (rawOff < footerStart) {
@@ -402,25 +404,26 @@ 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.
+     * @param fieldIdLen Field ID length.
+     * @param fieldOffsetLen Field offset length.
      * @return Tuple with field position and length.
      */
     private IgniteBiTuple<Integer, Integer> fieldPositionAndLength(int footerPos, int footerEnd, int rawPos,
-        int fieldOffsetSize) {
+        int fieldIdLen, int fieldOffsetLen) {
         // Get field offset first.
-        int fieldOffset = PortableUtils.fieldOffsetRelative(reader, footerPos + 4, fieldOffsetSize);
+        int fieldOffset = PortableUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen, fieldOffsetLen);
         int fieldPos = start + fieldOffset;
 
         // Get field length.
         int fieldLen;
 
-        if (footerPos + 4 + fieldOffsetSize == footerEnd)
+        if (footerPos + fieldIdLen + fieldOffsetLen == 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 = PortableUtils.fieldOffsetRelative(reader, footerPos + 4 + fieldOffsetSize + 4,
-                fieldOffsetSize);
+            int nextFieldOffset = PortableUtils.fieldOffsetRelative(reader,
+                footerPos + fieldIdLen + fieldOffsetLen + fieldIdLen, fieldOffsetLen);
 
             fieldLen = nextFieldOffset - fieldOffset;
         }
@@ -433,29 +436,30 @@ public class PortableBuilderImpl implements PortableBuilder {
      */
     private void ensureReadCacheInit() {
         if (readCache == null) {
-            int fieldOffsetSize = PortableUtils.fieldOffsetSize(flags);
+            int fieldIdLen = PortableUtils.fieldIdLength(flags);
+            int fieldOffsetLen = PortableUtils.fieldOffsetLength(flags);
 
             Map<Integer, Object> readCache = new HashMap<>();
 
-            IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(reader, start, fieldOffsetSize);
+            IgniteBiTuple<Integer, Integer> footer = PortableUtils.footerAbsolute(reader, start, fieldOffsetLen);
 
             int footerPos = footer.get1();
             int footerEnd = footer.get2();
 
-            int rawPos = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetSize);
+            int rawPos = PortableUtils.rawOffsetAbsolute(reader, start, fieldOffsetLen);
 
-            while (footerPos + 4 < footerEnd) {
+            while (footerPos + fieldIdLen < footerEnd) {
                 int fieldId = reader.readIntPositioned(footerPos);
 
                 IgniteBiTuple<Integer, Integer> posAndLen =
-                    fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldOffsetSize);
+                    fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen);
 
                 Object val = reader.getValueQuickly(posAndLen.get1(), posAndLen.get2());
 
                 readCache.put(fieldId, val);
 
                 // Shift current footer position.
-                footerPos += 4 + fieldOffsetSize;
+                footerPos += fieldIdLen + fieldOffsetLen;
             }
 
             this.readCache = readCache;