IGNITE-2257: Fixed BinaryContext serialization.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/18c413c4 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/18c413c4 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/18c413c4 Branch: refs/heads/ignite-2206 Commit: 18c413c41b51994fb2eeaaebf4cf727049db0c8b Parents: 49c2988 Author: vozerov-gridgain <voze...@gridgain.com> Authored: Fri Dec 25 09:48:28 2015 +0300 Committer: thatcoach <ppoze...@list.ru> Committed: Fri Dec 25 09:48:28 2015 +0300 ---------------------------------------------------------------------- .../ignite/internal/binary/BinaryContext.java | 44 +---------- .../internal/binary/BinaryEnumObjectImpl.java | 4 +- .../internal/binary/BinaryObjectImpl.java | 27 ++++--- .../internal/binary/GridBinaryMarshaller.java | 82 +++++++++++++++++++- 4 files changed, 94 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/18c413c4/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java index 5c63fbd..163532d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryContext.java @@ -31,10 +31,8 @@ import org.apache.ignite.cache.affinity.AffinityKey; import org.apache.ignite.cache.affinity.AffinityKeyMapped; import org.apache.ignite.configuration.BinaryConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.processors.cache.binary.BinaryMetadataKey; -import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; import org.apache.ignite.internal.processors.datastructures.CollocatedQueueItemKey; import org.apache.ignite.internal.processors.datastructures.CollocatedSetItemKey; import org.apache.ignite.internal.util.IgniteUtils; @@ -51,10 +49,6 @@ import org.jsr166.ConcurrentHashMap8; import java.io.Externalizable; import java.io.File; import java.io.IOException; -import java.io.InvalidObjectException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.io.ObjectStreamException; import java.lang.reflect.Field; import java.math.BigDecimal; import java.net.URISyntaxException; @@ -81,10 +75,7 @@ import java.util.jar.JarFile; /** * Binary context. */ -public class BinaryContext implements Externalizable { - /** */ - private static final long serialVersionUID = 0L; - +public class BinaryContext { /** */ private static final ClassLoader dfltLdr = U.gridClassLoader(); @@ -125,9 +116,6 @@ public class BinaryContext implements Externalizable { private MarshallerContext marshCtx; /** */ - private String gridName; - - /** */ private IgniteConfiguration igniteCfg; /** Logger. */ @@ -162,8 +150,6 @@ public class BinaryContext implements Externalizable { this.igniteCfg = igniteCfg; this.log = log; - gridName = igniteCfg.getGridName(); - colTypes.put(ArrayList.class, GridBinaryMarshaller.ARR_LIST); colTypes.put(LinkedList.class, GridBinaryMarshaller.LINKED_LIST); colTypes.put(HashSet.class, GridBinaryMarshaller.HASH_SET); @@ -727,34 +713,6 @@ public class BinaryContext implements Externalizable { return null; } - /** {@inheritDoc} */ - @Override public void writeExternal(ObjectOutput out) throws IOException { - U.writeString(out, igniteCfg.getGridName()); - } - - /** {@inheritDoc} */ - @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - gridName = U.readString(in); - } - - /** - * @return Binary context. - * @throws ObjectStreamException In case of error. - */ - protected Object readResolve() throws ObjectStreamException { - try { - IgniteKernal g = IgnitionEx.gridx(gridName); - - if (g == null) - throw new IllegalStateException("Failed to find grid for name: " + gridName); - - return ((CacheObjectBinaryProcessorImpl)g.context().cacheObjects()).binaryContext(); - } - catch (IllegalStateException e) { - throw U.withCause(new InvalidObjectException(e.getMessage()), e); - } - } - /** * @param cls Class. * @param id Type ID. http://git-wip-us.apache.org/repos/asf/ignite/blob/18c413c4/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java index 001d2d7..536c582 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryEnumObjectImpl.java @@ -183,8 +183,6 @@ public class BinaryEnumObjectImpl implements BinaryObjectEx, Externalizable, Cac /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { - out.writeObject(ctx); - out.writeInt(typeId); out.writeObject(clsName); out.writeInt(ord); @@ -192,7 +190,7 @@ public class BinaryEnumObjectImpl implements BinaryObjectEx, Externalizable, Cac /** {@inheritDoc} */ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - ctx = (BinaryContext)in.readObject(); + ctx = GridBinaryMarshaller.threadLocalContext(); typeId = in.readInt(); clsName = (String)in.readObject(); http://git-wip-us.apache.org/repos/asf/ignite/blob/18c413c4/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index fca8955..44c7a08 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -17,16 +17,6 @@ package org.apache.ignite.internal.binary; -import java.io.Externalizable; -import java.io.IOException; -import java.io.ObjectInput; -import java.io.ObjectOutput; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.sql.Timestamp; -import java.util.Date; -import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.binary.BinaryObjectException; @@ -43,7 +33,18 @@ import org.apache.ignite.plugin.extensions.communication.MessageReader; import org.apache.ignite.plugin.extensions.communication.MessageWriter; import org.jetbrains.annotations.Nullable; -import static java.nio.charset.StandardCharsets.UTF_8; +import java.io.Externalizable; +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.sql.Timestamp; +import java.util.Date; +import java.util.UUID; + +import static java.nio.charset.StandardCharsets.*; /** * Binary object implementation. @@ -427,8 +428,6 @@ public final class BinaryObjectImpl extends BinaryObjectExImpl implements Extern /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { - out.writeObject(ctx); - if (detachAllowed) { int len = length(); @@ -445,7 +444,7 @@ public final class BinaryObjectImpl extends BinaryObjectExImpl implements Extern /** {@inheritDoc} */ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - ctx = (BinaryContext)in.readObject(); + ctx = GridBinaryMarshaller.threadLocalContext(); arr = new byte[in.readInt()]; http://git-wip-us.apache.org/repos/asf/ignite/blob/18c413c4/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java index 71ca018..b4f4291 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/GridBinaryMarshaller.java @@ -17,10 +17,15 @@ package org.apache.ignite.internal.binary; +import org.apache.ignite.IgniteIllegalStateException; +import org.apache.ignite.internal.IgniteKernal; +import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.binary.streams.BinaryHeapInputStream; import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl; +import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor; import org.jetbrains.annotations.Nullable; /** @@ -34,6 +39,9 @@ public class GridBinaryMarshaller { } }; + /** Binary context in TLS store. */ + private static final ThreadLocal<BinaryContext> BINARY_CTX = new ThreadLocal<>(); + /** */ static final byte OPTM_MARSH = -2; @@ -237,7 +245,14 @@ public class GridBinaryMarshaller { @Nullable public <T> T unmarshal(byte[] bytes, @Nullable ClassLoader clsLdr) throws BinaryObjectException { assert bytes != null; - return (T)BinaryUtils.unmarshal(BinaryHeapInputStream.create(bytes, 0), ctx, clsLdr); + BinaryContext oldCtx = pushContext(ctx); + + try { + return (T) BinaryUtils.unmarshal(BinaryHeapInputStream.create(bytes, 0), ctx, clsLdr); + } + finally { + popContext(oldCtx); + } } /** @@ -247,7 +262,14 @@ public class GridBinaryMarshaller { */ @SuppressWarnings("unchecked") @Nullable public <T> T unmarshal(BinaryInputStream in) throws BinaryObjectException { - return (T)BinaryUtils.unmarshal(in, ctx, null); + BinaryContext oldCtx = pushContext(ctx); + + try { + return (T)BinaryUtils.unmarshal(in, ctx, null); + } + finally { + popContext(oldCtx); + } } /** @@ -264,7 +286,40 @@ public class GridBinaryMarshaller { if (arr[0] == NULL) return null; - return (T)new BinaryReaderExImpl(ctx, BinaryHeapInputStream.create(arr, 0), ldr).deserialize(); + BinaryContext oldCtx = pushContext(ctx); + + try { + return (T)new BinaryReaderExImpl(ctx, BinaryHeapInputStream.create(arr, 0), ldr).deserialize(); + } + finally { + popContext(oldCtx); + } + } + + /** + * Push binary context and return the old one. + * + * @param ctx Binary context. + * @return Old binary context. + */ + @Nullable private static BinaryContext pushContext(BinaryContext ctx) { + BinaryContext old = BINARY_CTX.get(); + + BINARY_CTX.set(ctx); + + return old; + } + + /** + * Pop binary context and restore the old one. + * + * @param oldCtx Old binary context. + */ + private static void popContext(@Nullable BinaryContext oldCtx) { + if (oldCtx == null) + BINARY_CTX.remove(); + else + BINARY_CTX.set(oldCtx); } /** @@ -293,4 +348,25 @@ public class GridBinaryMarshaller { public BinaryContext context() { return ctx; } + + /** + * @return Thread-bound context. + */ + public static BinaryContext threadLocalContext() { + BinaryContext ctx = GridBinaryMarshaller.BINARY_CTX.get(); + + if (ctx == null) { + IgniteKernal ignite = IgnitionEx.localIgnite(); + + IgniteCacheObjectProcessor proc = ignite.context().cacheObjects(); + + if (proc instanceof CacheObjectBinaryProcessorImpl) + return ((CacheObjectBinaryProcessorImpl)proc).binaryContext(); + else + throw new IgniteIllegalStateException("Ignite instance must be started with " + + BinaryMarshaller.class.getName() + " [name=" + ignite.name() + ']'); + } + + return ctx; + } }