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:02:02 UTC
[5/7] ignite git commit: IGNITE-1814: Fixed offheap object.
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