From dceb001b2eea93d1658cc2c2366f86ddec8aefab Mon Sep 17 00:00:00 2001 From: Valentin Kulichenko Date: Wed, 3 Feb 2016 17:08:40 -0800 Subject: [PATCH] # ignite-2450 --- .../internal/binary/BinaryClassDescriptor.java | 22 ++++ .../ignite/internal/binary/BinaryReaderExImpl.java | 8 +- .../apache/ignite/internal/binary/BinaryUtils.java | 48 +++++--- .../ignite/internal/binary/BinaryWriteMode.java | 3 + .../ignite/internal/binary/BinaryWriterExImpl.java | 34 ++++++ .../internal/binary/GridBinaryMarshaller.java | 3 + .../optimized/OptimizedClassDescriptor.java | 37 +++++- .../optimized/OptimizedMarshallerUtils.java | 3 + .../optimized/OptimizedObjectInputStream.java | 15 ++- .../optimized/OptimizedObjectOutputStream.java | 4 +- .../DynamicProxySerializationMultiJvmSelfTest.java | 131 +++++++++++++++++++++ .../junits/multijvm/IgniteNodeRunner.java | 16 +-- .../junits/multijvm/IgniteProcessProxy.java | 19 +-- .../ignite/testsuites/IgniteBasicTestSuite.java | 3 + .../testsuites/IgniteBinaryBasicTestSuite.java | 2 + 15 files changed, 313 insertions(+), 35 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/marshaller/DynamicProxySerializationMultiJvmSelfTest.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java index 5cb8a86..e831e96 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.java @@ -22,6 +22,7 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.ArrayList; @@ -109,6 +110,9 @@ public class BinaryClassDescriptor { /** */ private final boolean excluded; + /** */ + private final Class[] intfs; + /** * @param ctx Context. * @param cls Class. @@ -229,6 +233,16 @@ public class BinaryClassDescriptor { fields = null; stableFieldsMeta = null; stableSchema = null; + intfs = null; + + break; + + case PROXY: + ctor = null; + fields = null; + stableFieldsMeta = null; + stableSchema = null; + intfs = cls.getInterfaces(); break; @@ -237,6 +251,7 @@ public class BinaryClassDescriptor { fields = null; stableFieldsMeta = null; stableSchema = null; + intfs = null; break; @@ -291,6 +306,8 @@ public class BinaryClassDescriptor { stableSchema = schemaBuilder.build(); + intfs = null; + break; default: @@ -611,6 +628,11 @@ public class BinaryClassDescriptor { break; + case PROXY: + writer.doWriteProxy((Proxy)obj, intfs); + + break; + case BINARY_OBJ: writer.doWriteBinaryObject((BinaryObjectImpl)obj); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 607dabc..f9e7aa5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -68,6 +68,7 @@ import static org.apache.ignite.internal.binary.GridBinaryMarshaller.NULL; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.OBJ; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.OBJ_ARR; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.OPTM_MARSH; +import static org.apache.ignite.internal.binary.GridBinaryMarshaller.PROXY; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.SHORT; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.SHORT_ARR; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.STRING; @@ -1621,6 +1622,11 @@ public class BinaryReaderExImpl implements BinaryReader, BinaryRawReaderEx, Bina break; + case PROXY: + obj = BinaryUtils.doReadProxy(in, ctx, ldr, this); + + break; + case OPTM_MARSH: obj = BinaryUtils.doReadOptimized(in, ctx, ldr); @@ -2013,7 +2019,7 @@ public class BinaryReaderExImpl implements BinaryReader, BinaryRawReaderEx, Bina /** * Flag. */ - private static enum Flag { + private enum Flag { /** Regular. */ NORMAL, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index a82b65f..c3343d4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -17,28 +17,15 @@ package org.apache.ignite.internal.binary; -import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.binary.BinaryCollectionFactory; -import org.apache.ignite.binary.BinaryInvalidTypeException; -import org.apache.ignite.binary.BinaryMapFactory; -import org.apache.ignite.binary.BinaryObject; -import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.binary.Binarylizable; -import org.apache.ignite.internal.binary.builder.BinaryLazyValue; -import org.apache.ignite.internal.binary.streams.BinaryInputStream; -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.jetbrains.annotations.Nullable; -import org.jsr166.ConcurrentHashMap8; - import java.io.ByteArrayInputStream; import java.io.Externalizable; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.reflect.Array; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; @@ -58,6 +45,20 @@ import java.util.TreeSet; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.binary.BinaryCollectionFactory; +import org.apache.ignite.binary.BinaryInvalidTypeException; +import org.apache.ignite.binary.BinaryMapFactory; +import org.apache.ignite.binary.BinaryObject; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.binary.Binarylizable; +import org.apache.ignite.internal.binary.builder.BinaryLazyValue; +import org.apache.ignite.internal.binary.streams.BinaryInputStream; +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.jetbrains.annotations.Nullable; +import org.jsr166.ConcurrentHashMap8; import static java.nio.charset.StandardCharsets.UTF_8; @@ -1042,6 +1043,8 @@ public class BinaryUtils { return BinaryWriteMode.ENUM; else if (cls == Class.class) return BinaryWriteMode.CLASS; + else if (Proxy.class.isAssignableFrom(cls)) + return BinaryWriteMode.PROXY; else return BinaryWriteMode.OBJECT; } @@ -1365,6 +1368,21 @@ public class BinaryUtils { } /** + * @return Value. + */ + public static Object doReadProxy(BinaryInputStream in, BinaryContext ctx, ClassLoader ldr, + BinaryReaderHandlesHolder handles) { + Class[] intfs = new Class[in.readInt()]; + + for (int i = 0; i < intfs.length; i++) + intfs[i] = doReadClass(in, ctx, ldr); + + InvocationHandler ih = (InvocationHandler)doReadObject(in, ctx, ldr, handles); + + return Proxy.newProxyInstance(ldr != null ? ldr : U.gridClassLoader(), intfs, ih); + } + + /** * Read plain type. * * @param in Input stream. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java index b037945..7e8c9bd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriteMode.java @@ -148,6 +148,9 @@ public enum BinaryWriteMode { CLASS(GridBinaryMarshaller.CLASS), /** */ + PROXY(GridBinaryMarshaller.PROXY), + + /** */ BINARY(GridBinaryMarshaller.BINARY_OBJ), /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 877a2db..8060a13 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -19,7 +19,9 @@ package org.apache.ignite.internal.binary; import java.io.IOException; import java.io.ObjectOutput; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; @@ -817,6 +819,38 @@ public class BinaryWriterExImpl implements BinaryWriter, BinaryRawWriterEx, Obje } /** + * @param proxy Proxy. + */ + public void doWriteProxy(Proxy proxy, Class[] intfs) { + if (proxy == null) + out.writeByte(GridBinaryMarshaller.NULL); + else { + out.unsafeEnsure(1 + 4); + + out.unsafeWriteByte(GridBinaryMarshaller.PROXY); + out.unsafeWriteInt(intfs.length); + + for (Class intf : intfs) { + BinaryClassDescriptor desc = ctx.descriptorForClass(intf, false); + + if (desc.registered()) + out.writeInt(desc.typeId()); + else { + out.writeInt(GridBinaryMarshaller.UNREGISTERED_TYPE_ID); + + doWriteString(intf.getName()); + } + } + + InvocationHandler ih = Proxy.getInvocationHandler(proxy); + + assert ih != null; + + doWriteObject(ih); + } + } + + /** * @param po Binary object. */ public void doWriteBinaryObject(@Nullable BinaryObjectImpl po) { 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 8e138fc..67e741b 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 @@ -144,6 +144,9 @@ public class GridBinaryMarshaller { /** Timestamp array. */ public static final byte TIMESTAMP_ARR = 34; + /** Proxy. */ + public static final byte PROXY = 35; + /** */ public static final byte NULL = (byte)101; diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java index c5be139..5a5b54d 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedClassDescriptor.java @@ -26,9 +26,11 @@ import java.io.ObjectStreamField; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -79,6 +81,7 @@ import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.LO import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.LONG_ARR; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.OBJ_ARR; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.PROPS; +import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.PROXY; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SERIALIZABLE; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SHORT; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SHORT_ARR; @@ -160,6 +163,9 @@ class OptimizedClassDescriptor { /** Access order field offset. */ private long accessOrderFieldOff; + /** Proxy interfaces. */ + private Class[] proxyIntfs; + /** * Creates descriptor for class. * @@ -329,6 +335,11 @@ class OptimizedClassDescriptor { isCls = true; } + else if (Proxy.class.isAssignableFrom(cls)) { + type = PROXY; + + proxyIntfs = cls.getInterfaces(); + } else { Class c = cls; @@ -558,6 +569,13 @@ class OptimizedClassDescriptor { } /** + * @return {@code True} if descriptor is for {@link Proxy}. + */ + boolean isProxy() { + return type == PROXY; + } + + /** * Replaces object. * * @param obj Object. @@ -738,6 +756,23 @@ class OptimizedClassDescriptor { break; + case PROXY: + out.writeInt(proxyIntfs.length); + + for (Class intf : proxyIntfs) { + OptimizedClassDescriptor intfDesc = classDescriptor(clsMap, intf, ctx, mapper); + + intfDesc.writeTypeData(out); + } + + InvocationHandler ih = Proxy.getInvocationHandler(obj); + + assert ih != null; + + out.writeObject(ih); + + break; + case ENUM: writeTypeData(out); @@ -1017,4 +1052,4 @@ class OptimizedClassDescriptor { return fields.get(i); } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java index fa6f962..923f385 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java @@ -136,6 +136,9 @@ class OptimizedMarshallerUtils { static final byte CLS = 28; /** */ + static final byte PROXY = 29; + + /** */ static final byte ENUM = 100; /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java index 988a777..95a301b 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectInputStream.java @@ -25,8 +25,10 @@ import java.io.ObjectInputValidation; import java.io.ObjectStreamClass; import java.lang.reflect.Array; import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -77,6 +79,7 @@ import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.LO import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.NULL; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.OBJ_ARR; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.PROPS; +import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.PROXY; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SERIALIZABLE; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SHORT; import static org.apache.ignite.marshaller.optimized.OptimizedMarshallerUtils.SHORT_ARR; @@ -297,6 +300,16 @@ class OptimizedObjectInputStream extends ObjectInputStream { case CLS: return readClass(); + case PROXY: + Class[] intfs = new Class[readInt()]; + + for (int i = 0; i < intfs.length; i++) + intfs[i] = readClass(); + + InvocationHandler ih = (InvocationHandler)readObject(); + + return Proxy.newProxyInstance(clsLdr != null ? clsLdr : U.gridClassLoader(), intfs, ih); + case ENUM: case EXTERNALIZABLE: case SERIALIZABLE: @@ -1215,4 +1228,4 @@ class OptimizedObjectInputStream extends ObjectInputStream { return objs[fieldInfo.getIndex(name)] != null ? (T)objs[fieldInfo.getIndex(name)] : dflt; } } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java index d884564..96cbbcd 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedObjectOutputStream.java @@ -227,7 +227,7 @@ class OptimizedObjectOutputStream extends ObjectOutputStream { int handle = -1; - if (!desc.isPrimitive() && !desc.isEnum() && !desc.isClass()) + if (!desc.isPrimitive() && !desc.isEnum() && !desc.isClass() && !desc.isProxy()) handle = handles.lookup(obj); if (obj0 != obj) { @@ -895,4 +895,4 @@ class OptimizedObjectOutputStream extends ObjectOutputStream { objs[i] = F.t(info.type(), val); } } -} \ No newline at end of file +} diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/DynamicProxySerializationMultiJvmSelfTest.java b/modules/core/src/test/java/org/apache/ignite/marshaller/DynamicProxySerializationMultiJvmSelfTest.java new file mode 100644 index 0000000..d22aeac --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/marshaller/DynamicProxySerializationMultiJvmSelfTest.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.marshaller; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.concurrent.Callable; +import org.apache.ignite.Ignite; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.binary.BinaryMarshaller; +import org.apache.ignite.lang.IgniteCallable; +import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +/** + * Multi-JVM test for dynamic proxy serialization. + */ +public class DynamicProxySerializationMultiJvmSelfTest extends GridCommonAbstractTest { + /** */ + private static Callable marshFactory; + + /** {@inheritDoc} */ + @Override protected boolean isMultiJvm() { + return true; + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(gridName); + + cfg.setMarshaller(marshFactory.call()); + + return cfg; + } + + /** + * @throws Exception If failed. + */ + public void testOptimized() throws Exception { + marshFactory = new Callable() { + @Override public Marshaller call() throws Exception { + return new OptimizedMarshaller(false); + } + }; + + doTest(); + } + + /** + * @throws Exception If failed. + */ + public void testBinary() throws Exception { + marshFactory = new Callable() { + @Override public Marshaller call() throws Exception { + return new BinaryMarshaller(); + } + }; + + doTest(); + } + + /** + * @throws Exception If failed. + */ + private void doTest() throws Exception { + try { + Ignite ignite = startGrids(2); + + MyProxy p = (MyProxy)Proxy.newProxyInstance(getClass().getClassLoader(), + new Class[] { MyProxy.class }, new InvocationHandler() { + @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if ("value".equals(method.getName())) + return 42; + + throw new IllegalStateException(); + } + }); + + int val = ignite.compute(ignite.cluster().forRemotes()).call(new MyCallable(p)); + + assertEquals(42, val); + } + finally { + stopAllGrids(); + } + } + + /** + */ + private static class MyCallable implements IgniteCallable { + /** */ + private final MyProxy p; + + /** + * @param p Proxy. + */ + public MyCallable(MyProxy p) { + this.p = p; + } + + /** {@inheritDoc} */ + @Override public Integer call() throws Exception { + return p.value(); + } + } + + /** + */ + private static interface MyProxy { + /** + * @return Value. + */ + public int value(); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteNodeRunner.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteNodeRunner.java index 0597eda..7d1a37d 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteNodeRunner.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteNodeRunner.java @@ -17,7 +17,6 @@ package org.apache.ignite.testframework.junits.multijvm; -import com.thoughtworks.xstream.XStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; @@ -29,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; +import com.thoughtworks.xstream.XStream; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.Ignition; @@ -100,12 +100,14 @@ public class IgniteNodeRunner { String fileName = IGNITE_CONFIGURATION_FILE + cfg.getNodeId(); try(OutputStream out = new BufferedOutputStream(new FileOutputStream(fileName))) { - cfg.setMBeanServer(null); - cfg.setMarshaller(null); - cfg.setDiscoverySpi(null); - cfg.setGridLogger(null); + IgniteConfiguration cfg0 = new IgniteConfiguration(cfg); + + cfg0.setMBeanServer(null); + cfg0.setMarshaller(null); + cfg0.setDiscoverySpi(null); + cfg0.setGridLogger(null); - new XStream().toXML(cfg, out); + new XStream().toXML(cfg0, out); } return fileName; @@ -176,4 +178,4 @@ public class IgniteNodeRunner { return res; } -} \ No newline at end of file +} diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java index fed42e1..a2e0d5a 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteProcessProxy.java @@ -19,7 +19,6 @@ package org.apache.ignite.testframework.junits.multijvm; import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -31,10 +30,10 @@ import org.apache.ignite.IgniteAtomicLong; import org.apache.ignite.IgniteAtomicReference; import org.apache.ignite.IgniteAtomicSequence; import org.apache.ignite.IgniteAtomicStamped; +import org.apache.ignite.IgniteBinary; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCompute; import org.apache.ignite.IgniteCountDownLatch; -import org.apache.ignite.IgniteSemaphore; import org.apache.ignite.IgniteDataStreamer; import org.apache.ignite.IgniteEvents; import org.apache.ignite.IgniteException; @@ -42,9 +41,9 @@ import org.apache.ignite.IgniteFileSystem; import org.apache.ignite.IgniteIllegalStateException; import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteMessaging; -import org.apache.ignite.IgniteBinary; import org.apache.ignite.IgniteQueue; import org.apache.ignite.IgniteScheduler; +import org.apache.ignite.IgniteSemaphore; import org.apache.ignite.IgniteServices; import org.apache.ignite.IgniteSet; import org.apache.ignite.IgniteTransactions; @@ -76,6 +75,7 @@ import org.apache.ignite.lang.IgniteInClosure; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.lang.IgniteRunnable; +import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.plugin.IgnitePlugin; import org.apache.ignite.plugin.PluginNotFoundException; import org.apache.ignite.resources.IgniteInstanceResource; @@ -121,14 +121,17 @@ public class IgniteProcessProxy implements IgniteEx { String cfgFileName = IgniteNodeRunner.storeToFile(cfg.setNodeId(id)); - List jvmArgs = U.jvmArgs(); - Collection filteredJvmArgs = new ArrayList<>(); - for (String arg : jvmArgs) { - if(arg.startsWith("-Xmx") || arg.startsWith("-Xms") || + Marshaller marsh = cfg.getMarshaller(); + + if (marsh != null) + filteredJvmArgs.add("-D" + IgniteTestResources.MARSH_CLASS_NAME + "=" + marsh.getClass().getName()); + + for (String arg : U.jvmArgs()) { + if (arg.startsWith("-Xmx") || arg.startsWith("-Xms") || arg.startsWith("-cp") || arg.startsWith("-classpath") || - arg.startsWith("-D" + IgniteTestResources.MARSH_CLASS_NAME)) + (marsh != null && arg.startsWith("-D" + IgniteTestResources.MARSH_CLASS_NAME))) filteredJvmArgs.add(arg); } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java index dece258..c904ef4 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java @@ -44,6 +44,7 @@ import org.apache.ignite.internal.processors.service.ClosureServiceClientsNodesT import org.apache.ignite.internal.product.GridProductVersionSelfTest; import org.apache.ignite.internal.util.nio.IgniteExceptionInNioWorkerSelfTest; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.DynamicProxySerializationMultiJvmSelfTest; import org.apache.ignite.messaging.GridMessagingNoPeerClassLoadingSelfTest; import org.apache.ignite.messaging.GridMessagingSelfTest; import org.apache.ignite.messaging.IgniteMessagingWithClientTest; @@ -116,6 +117,8 @@ public class IgniteBasicTestSuite extends TestSuite { suite.addTestSuite(IgniteExceptionInNioWorkerSelfTest.class); + GridTestUtils.addTestIfNeeded(suite, DynamicProxySerializationMultiJvmSelfTest.class, ignoredTests); + return suite; } } diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBinaryBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBinaryBasicTestSuite.java index cbb87fa..e0c06dc 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBinaryBasicTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBinaryBasicTestSuite.java @@ -35,6 +35,7 @@ import org.apache.ignite.internal.util.IgniteUtilsSelfTest; import org.apache.ignite.internal.util.io.GridUnsafeDataOutputArraySizingSelfTest; import org.apache.ignite.internal.util.nio.GridNioSelfTest; import org.apache.ignite.internal.util.nio.GridNioSslSelfTest; +import org.apache.ignite.marshaller.DynamicProxySerializationMultiJvmSelfTest; import org.apache.ignite.marshaller.jdk.GridJdkMarshallerSelfTest; import org.apache.ignite.marshaller.optimized.OptimizedMarshallerEnumSelfTest; import org.apache.ignite.marshaller.optimized.OptimizedMarshallerNodeFailoverTest; @@ -84,6 +85,7 @@ public class IgniteBinaryBasicTestSuite extends TestSuite { ignoredTests.add(GridMessagingSelfTest.class); ignoredTests.add(GridVersionSelfTest.class); ignoredTests.add(GridDeploymentMessageCountSelfTest.class); + ignoredTests.add(DynamicProxySerializationMultiJvmSelfTest.class); // TODO: check and delete if pass. ignoredTests.add(IgniteDaemonNodeMarshallerCacheTest.class); -- 2.5.4 (Apple Git-61)