You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2015/11/21 23:46:05 UTC
[37/55] [abbrv] ignite git commit: IGNITE-1960: Reworked and
simplified binary object header write logic.
IGNITE-1960: Reworked and simplified binary object header write logic.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/462f8332
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/462f8332
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/462f8332
Branch: refs/heads/ignite-1.5
Commit: 462f8332b5b745c6f748d157657365cf576355db
Parents: b876f76
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Fri Nov 20 13:01:21 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Fri Nov 20 13:01:21 2015 +0300
----------------------------------------------------------------------
.../internal/portable/BinaryWriterExImpl.java | 101 ++++++++++++-------
.../portable/PortableClassDescriptor.java | 45 ++++-----
.../ignite/internal/portable/PortableUtils.java | 32 +-----
.../builder/BinaryObjectBuilderImpl.java | 8 +-
.../streams/PortableAbstractOutputStream.java | 7 +-
.../portable/streams/PortableOutputStream.java | 7 ++
.../memory/PlatformOutputStreamImpl.java | 7 +-
7 files changed, 107 insertions(+), 100 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
index 6f8534a..ec47f57 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/BinaryWriterExImpl.java
@@ -51,11 +51,11 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.DATE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DATE_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DECIMAL;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DECIMAL_ARR;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.DFLT_HDR_LEN;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DOUBLE;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.DOUBLE_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.ENUM;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.ENUM_ARR;
-import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLAGS_POS;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLOAT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.FLOAT_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.INT;
@@ -65,18 +65,17 @@ import static org.apache.ignite.internal.portable.GridPortableMarshaller.LONG_AR
import static org.apache.ignite.internal.portable.GridPortableMarshaller.MAP;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.MAP_ENTRY;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.NULL;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.OBJ;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.OBJ_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.OPTM_MARSH;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.PORTABLE_OBJ;
-import static org.apache.ignite.internal.portable.GridPortableMarshaller.SCHEMA_ID_POS;
-import static org.apache.ignite.internal.portable.GridPortableMarshaller.SCHEMA_OR_RAW_OFF_POS;
+import static org.apache.ignite.internal.portable.GridPortableMarshaller.PROTO_VER;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.SHORT_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.STRING_ARR;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.TIMESTAMP_ARR;
-import static org.apache.ignite.internal.portable.GridPortableMarshaller.TOTAL_LEN_POS;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.UNREGISTERED_TYPE_ID;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID;
import static org.apache.ignite.internal.portable.GridPortableMarshaller.UUID_ARR;
@@ -265,44 +264,53 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje
}
/**
- * @param bytes Number of bytes to reserve.
- * @return Offset.
+ * Perform pre-write. Reserves space for header and writes class name if needed.
+ *
+ * @param clsName Class name (optional).
*/
- public int reserve(int bytes) {
- int pos = out.position();
+ public void preWrite(@Nullable String clsName) {
+ out.position(out.position() + DFLT_HDR_LEN);
- out.position(pos + bytes);
-
- return pos;
+ if (clsName != null)
+ doWriteString(clsName);
}
/**
- * Perform post-write activity. This includes:
- * - writing flags;
- * - writing object length;
- * - writing schema offset;
- * - writing schema to the tail.
+ * Perform post-write. Fills object header.
*
* @param userType User type flag.
+ * @param registered Whether type is registered.
+ * @param hashCode Hash code.
*/
- public void postWrite(boolean userType) {
- short flags = userType ? PortableUtils.FLAG_USR_TYP : 0;
+ public void postWrite(boolean userType, boolean registered, int hashCode) {
+ short flags;
+ boolean useCompactFooter;
- boolean useCompactFooter = ctx.isCompactFooter() && userType;
+ if (userType) {
+ if (ctx.isCompactFooter()) {
+ flags = PortableUtils.FLAG_USR_TYP | PortableUtils.FLAG_COMPACT_FOOTER;
+ useCompactFooter = true;
+ }
+ else {
+ flags = PortableUtils.FLAG_USR_TYP;
+ useCompactFooter = false;
+ }
+ }
+ else {
+ flags = 0;
+ useCompactFooter = false;
+ }
- if (useCompactFooter)
- flags |= PortableUtils.FLAG_COMPACT_FOOTER;
+ int finalSchemaId;
+ int offset;
if (fieldCnt != 0) {
- flags |= PortableUtils.FLAG_HAS_SCHEMA;
-
- // Write schema ID.
- out.unsafeWriteInt(start + SCHEMA_ID_POS, schemaId);
-
- // Write schema offset.
- out.unsafeWriteInt(start + SCHEMA_OR_RAW_OFF_POS, out.position() - start);
+ finalSchemaId = schemaId;
+ offset = out.position() - start;
// Write the schema.
+ flags |= PortableUtils.FLAG_HAS_SCHEMA;
+
int offsetByteCnt = schema.write(out, fieldCnt, useCompactFooter);
if (offsetByteCnt == PortableUtils.OFFSET_1)
@@ -319,20 +327,33 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje
}
else {
if (rawOffPos != 0) {
- // If there are no schema, we are free to write raw offset to schema offset.
- flags |= PortableUtils.FLAG_HAS_RAW;
+ finalSchemaId = 0;
+ offset = rawOffPos - start;
- out.unsafeWriteInt(start + SCHEMA_OR_RAW_OFF_POS, rawOffPos - start);
+ // If there is no schema, we are free to write raw offset to schema offset.
+ flags |= PortableUtils.FLAG_HAS_RAW;
+ }
+ else {
+ finalSchemaId = 0;
+ offset = 0;
}
- else
- out.unsafeWriteInt(start + SCHEMA_OR_RAW_OFF_POS, 0);
}
- // Write flags.
- out.unsafeWriteShort(start + FLAGS_POS, flags);
+ // Actual write.
+ int retPos = out.position();
- // Write length.
- out.unsafeWriteInt(start + TOTAL_LEN_POS, out.position() - start);
+ out.unsafePosition(start);
+
+ out.unsafeWriteByte(OBJ);
+ out.unsafeWriteByte(PROTO_VER);
+ out.unsafeWriteShort(flags);
+ out.unsafeWriteInt(registered ? typeId : UNREGISTERED_TYPE_ID);
+ out.unsafeWriteInt(hashCode);
+ out.unsafeWriteInt(retPos - start);
+ out.unsafeWriteInt(finalSchemaId);
+ out.unsafeWriteInt(offset);
+
+ out.unsafePosition(retPos);
}
/**
@@ -1645,7 +1666,11 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje
/** {@inheritDoc} */
@Override public int reserveInt() {
- return reserve(LEN_INT);
+ int pos = out.position();
+
+ out.position(pos + LEN_INT);
+
+ return pos;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/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 c233267..7c857be 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
@@ -548,14 +548,14 @@ public class PortableClassDescriptor {
break;
case PORTABLE:
- if (writeHeader(obj, writer)) {
+ if (preWrite(writer, obj)) {
try {
if (serializer != null)
serializer.writeBinary(obj, writer);
else
((Binarylizable)obj).writeBinary(writer);
- writer.postWrite(userType);
+ postWrite(writer, obj);
// Check whether we need to update metadata.
if (obj.getClass() != BinaryMetadata.class) {
@@ -590,13 +590,13 @@ public class PortableClassDescriptor {
break;
case EXTERNALIZABLE:
- if (writeHeader(obj, writer)) {
+ if (preWrite(writer, obj)) {
writer.rawWriter();
try {
((Externalizable)obj).writeExternal(writer);
- writer.postWrite(userType);
+ postWrite(writer, obj);
}
catch (IOException e) {
throw new BinaryObjectException("Failed to write Externalizable object: " + obj, e);
@@ -609,14 +609,14 @@ public class PortableClassDescriptor {
break;
case OBJECT:
- if (writeHeader(obj, writer)) {
+ if (preWrite(writer, obj)) {
try {
for (BinaryFieldAccessor info : fields)
info.write(obj, writer);
writer.schemaId(stableSchema.schemaId());
- writer.postWrite(userType);
+ postWrite(writer, obj);
}
finally {
writer.popSchema();
@@ -705,35 +705,32 @@ public class PortableClassDescriptor {
}
/**
- * @param obj Object.
+ * Pre-write phase.
+ *
* @param writer Writer.
+ * @param obj Object.
* @return Whether further write is needed.
*/
- private boolean writeHeader(Object obj, BinaryWriterExImpl writer) {
+ private boolean preWrite(BinaryWriterExImpl writer, Object obj) {
if (writer.tryWriteAsHandle(obj))
return false;
- if (registered) {
- PortableUtils.writeHeader(
- writer,
- typeId,
- obj instanceof CacheObjectImpl ? 0 : obj.hashCode(),
- null
- );
- }
- else {
- PortableUtils.writeHeader(
- writer,
- GridPortableMarshaller.UNREGISTERED_TYPE_ID,
- obj instanceof CacheObjectImpl ? 0 : obj.hashCode(),
- cls.getName()
- );
- }
+ writer.preWrite(registered ? null : cls.getName());
return true;
}
/**
+ * Post-write phase.
+ *
+ * @param writer Writer.
+ * @param obj Object.
+ */
+ private void postWrite(BinaryWriterExImpl writer, Object obj) {
+ writer.postWrite(userType, registered, obj instanceof CacheObjectImpl ? 0 : obj.hashCode());
+ }
+
+ /**
* @return Instance.
* @throws BinaryObjectException In case of error.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/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 53d414c..6d155fe 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
@@ -17,14 +17,13 @@
package org.apache.ignite.internal.portable;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.binary.BinaryObjectException;
import org.apache.ignite.binary.Binarylizable;
import org.apache.ignite.internal.portable.builder.PortableLazyValue;
-import org.apache.ignite.internal.portable.streams.PortableOutputStream;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiTuple;
-import org.apache.ignite.binary.BinaryObjectException;
-import org.apache.ignite.binary.BinaryObject;
import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentHashMap8;
@@ -663,33 +662,6 @@ public class PortableUtils {
}
/**
- * Write portable header.
- *
- * @param writer Writer.
- * @param typeId Type ID.
- * @param hashCode Hash code.
- * @param clsName Class name (optional).
- * @return Position where length should be written.
- */
- public static int writeHeader(BinaryWriterExImpl writer, int typeId, int hashCode, @Nullable String clsName) {
- PortableOutputStream out = writer.out();
-
- out.unsafeEnsure(12);
- out.unsafeWriteByte(GridPortableMarshaller.OBJ);
- out.unsafeWriteByte(GridPortableMarshaller.PROTO_VER);
- out.unsafeWriteShort((short) 0);
- out.unsafeWriteInt(typeId);
- out.unsafeWriteInt(hashCode);
-
- int reserved = writer.reserve(12);
-
- if (clsName != null)
- writer.doWriteString(clsName);
-
- return reserved;
- }
-
- /**
* Get portable object length.
*
* @param in Input stream.
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
index 2ce2416..b2fb7d8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/BinaryObjectBuilderImpl.java
@@ -199,11 +199,7 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder {
*/
void serializeTo(BinaryWriterExImpl writer, PortableBuilderSerializer serializer) {
try {
- PortableUtils.writeHeader(writer,
- registeredType ? typeId : UNREGISTERED_TYPE_ID,
- hashCode,
- registeredType ? null : clsNameToWrite
- );
+ writer.preWrite(registeredType ? null : clsNameToWrite);
Set<Integer> remainsFlds = null;
@@ -363,7 +359,7 @@ public class BinaryObjectBuilderImpl implements BinaryObjectBuilder {
reader.position(start + PortableUtils.length(reader, start));
}
- writer.postWrite(true);
+ writer.postWrite(true, registeredType, hashCode);
// Update metadata if needed.
int schemaId = writer.schemaId();
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
index b68e9d1..7efc942 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
@@ -239,7 +239,7 @@ public abstract class PortableAbstractOutputStream extends PortableAbstractStrea
@Override public void position(int pos) {
ensureCapacity(pos);
- this.pos = pos;
+ unsafePosition(pos);
}
/** {@inheritDoc} */
@@ -253,6 +253,11 @@ public abstract class PortableAbstractOutputStream extends PortableAbstractStrea
}
/** {@inheritDoc} */
+ @Override public void unsafePosition(int pos) {
+ this.pos = pos;
+ }
+
+ /** {@inheritDoc} */
@Override public void unsafeWriteBoolean(boolean val) {
unsafeWriteByte(val ? BYTE_ONE : BYTE_ZERO);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
index 3a2e9e1..e516ff5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
@@ -172,6 +172,13 @@ public interface PortableOutputStream extends PortableStream, AutoCloseable {
@Override public void close();
/**
+ * Set position in unsafe mode.
+ *
+ * @param pos Position.
+ */
+ public void unsafePosition(int pos);
+
+ /**
* Ensure capacity for unsafe writes.
*
* @param cap Capacity.
http://git-wip-us.apache.org/repos/asf/ignite/blob/462f8332/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
index 670dd28..59d8981 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
@@ -186,7 +186,7 @@ public class PlatformOutputStreamImpl implements PlatformOutputStream {
@Override public void position(int pos) {
ensureCapacity(pos);
- this.pos = pos;
+ unsafePosition(pos);
}
/** {@inheritDoc} */
@@ -228,6 +228,11 @@ public class PlatformOutputStreamImpl implements PlatformOutputStream {
}
/** {@inheritDoc} */
+ @Override public void unsafePosition(int pos) {
+ this.pos = pos;
+ }
+
+ /** {@inheritDoc} */
@Override public void unsafeWriteByte(byte val) {
UNSAFE.putByte(data + pos++, val);
}