Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 32E3818143 for ; Wed, 28 Oct 2015 12:47:04 +0000 (UTC) Received: (qmail 48308 invoked by uid 500); 28 Oct 2015 12:47:04 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 48225 invoked by uid 500); 28 Oct 2015 12:47:04 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 46915 invoked by uid 99); 28 Oct 2015 12:47:01 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Oct 2015 12:47:01 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id C01EFE0579; Wed, 28 Oct 2015 12:47:01 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Wed, 28 Oct 2015 12:47:30 -0000 Message-Id: <5e1943039e9b4d32bd214d15c48fd8b4@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [30/50] [abbrv] ignite git commit: ignite-1526: IBM JDK is not fully supported by the platfrom. Additional hot fixes. ignite-1526: IBM JDK is not fully supported by the platfrom. Additional hot fixes. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e9aa4d10 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e9aa4d10 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e9aa4d10 Branch: refs/heads/ignite-1537 Commit: e9aa4d101506a6d9bc93dc9133c1d1c5aac0996f Parents: df931bd Author: Andrey Gura Authored: Tue Oct 27 12:52:06 2015 +0300 Committer: Denis Magda Committed: Tue Oct 27 12:52:06 2015 +0300 ---------------------------------------------------------------------- .../apache/ignite/IgniteSystemProperties.java | 9 ++++ .../apache/ignite/internal/IgniteKernal.java | 2 + .../ignite/internal/IgniteNodeAttributes.java | 3 ++ .../ignite/internal/util/lang/GridFunc.java | 8 ++- .../optimized/OptimizedMarshaller.java | 10 +++- .../optimized/OptimizedMarshallerUtils.java | 35 ++++++++++--- .../ignite/spi/discovery/tcp/ServerImpl.java | 52 ++++++++++++++++++++ .../GridDiscoveryManagerAttributesSelfTest.java | 44 +++++++++++++++-- .../ignite/testframework/GridTestUtils.java | 19 ++++++- 9 files changed, 165 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java index 5d3b08b..1e7d002 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java @@ -17,9 +17,11 @@ package org.apache.ignite; +import java.io.Serializable; import java.lang.management.RuntimeMXBean; import java.util.Properties; import javax.net.ssl.HostnameVerifier; +import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; import org.jetbrains.annotations.Nullable; /** @@ -363,6 +365,13 @@ public final class IgniteSystemProperties { public static final String IGNITE_JDBC_DRIVER_CURSOR_REMOVE_DELAY = "IGNITE_JDBC_DRIVER_CURSOR_RMV_DELAY"; /** + * Manages {@link OptimizedMarshaller} behavior of {@code serialVersionUID} computation for + * {@link Serializable} classes. + * */ + public static final String IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID = + "IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID"; + + /** * Enforces singleton. */ private IgniteSystemProperties() { http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index c02dc59..0865119 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -200,6 +200,7 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_JVM_PID; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_LANG_RUNTIME; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_DFLT_SUID; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_NODE_CONSISTENT_ID; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_PEER_CLASSLOADING; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_PHY_RAM; @@ -1267,6 +1268,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable { add(ATTR_BUILD_VER, VER_STR); add(ATTR_BUILD_DATE, BUILD_TSTAMP_STR); add(ATTR_MARSHALLER, cfg.getMarshaller().getClass().getName()); + add(ATTR_MARSHALLER_USE_DFLT_SUID, OptimizedMarshaller.USE_DFLT_SUID); add(ATTR_USER_NAME, System.getProperty("user.name")); add(ATTR_GRID_NAME, gridName); http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 10b8df0..b7d2910 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -34,6 +34,9 @@ public final class IgniteNodeAttributes { public static final String ATTR_MARSHALLER = ATTR_PREFIX + ".marshaller"; /** Internal attribute name constant. */ + public static final String ATTR_MARSHALLER_USE_DFLT_SUID = ATTR_PREFIX + ".marshaller.useDefaultSUID"; + + /** Internal attribute name constant. */ public static final String ATTR_JIT_NAME = ATTR_PREFIX + ".jit.name"; /** Internal attribute name constant. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java index 43bc5f3..c1d91a8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java @@ -117,6 +117,9 @@ public class GridFunc { /** */ private static final IgnitePredicate ALWAYS_TRUE = new P1() { + /** */ + private static final long serialVersionUID = 6101914246981105862L; + @Override public boolean apply(Object e) { return true; } @@ -1221,9 +1224,10 @@ public class GridFunc { if (isEmpty(nodeIds)) return alwaysFalse(); - assert nodeIds != null; - return new P1() { + /** */ + private static final long serialVersionUID = -5664060422647374863L; + @Override public boolean apply(ClusterNode e) { return nodeIds.contains(e.id()); } http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java index caccd99..b2c98b2 100644 --- a/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java +++ b/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshaller.java @@ -25,6 +25,7 @@ import java.io.Serializable; import java.util.concurrent.ConcurrentMap; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; +import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.marshaller.AbstractMarshaller; @@ -32,8 +33,11 @@ import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; import sun.misc.Unsafe; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID; + /** - * Optimized implementation of {@link org.apache.ignite.marshaller.Marshaller}. Unlike {@link org.apache.ignite.marshaller.jdk.JdkMarshaller}, + * Optimized implementation of {@link org.apache.ignite.marshaller.Marshaller}. + * Unlike {@link org.apache.ignite.marshaller.jdk.JdkMarshaller}, * which is based on standard {@link ObjectOutputStream}, this marshaller does not * enforce that all serialized objects implement {@link Serializable} interface. It is also * about 20 times faster as it removes lots of serialization overhead that exists in @@ -80,6 +84,10 @@ import sun.misc.Unsafe; * For information about Spring framework visit www.springframework.org */ public class OptimizedMarshaller extends AbstractMarshaller { + /** Use default {@code serialVersionUID} for {@link Serializable} classes. */ + public static final boolean USE_DFLT_SUID = + IgniteSystemProperties.getBoolean(IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID, false); + /** Default class loader. */ private final ClassLoader dfltClsLdr = getClass().getClassLoader(); http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/marshaller/optimized/OptimizedMarshallerUtils.java ---------------------------------------------------------------------- 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 584083c..4d6afe6 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 @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.ObjectStreamClass; import java.io.Serializable; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.nio.charset.Charset; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -42,10 +43,6 @@ class OptimizedMarshallerUtils { /** */ private static final Unsafe UNSAFE = GridUnsafe.unsafe(); - /** Use default {@code serialVersionUid} for {@link Serializable} classes. */ - private static final boolean USE_DFLT_SUID = - Boolean.valueOf(System.getProperty("ignite.marsh.optimized.useDefaultSUID", Boolean.TRUE.toString())); - /** */ static final long HASH_SET_MAP_OFF; @@ -277,8 +274,8 @@ class OptimizedMarshallerUtils { } /** - * Computes the serial version UID value for the given class. - * The code is taken from {@link ObjectStreamClass#computeDefaultSUID(Class)}. + * Computes the serial version UID value for the given class. The code is taken from {@link + * ObjectStreamClass#computeDefaultSUID(Class)}. * * @param cls A class. * @param fields Fields. @@ -287,8 +284,30 @@ class OptimizedMarshallerUtils { */ @SuppressWarnings("ForLoopReplaceableByForEach") static short computeSerialVersionUid(Class cls, List fields) throws IOException { - if (USE_DFLT_SUID && Serializable.class.isAssignableFrom(cls) && !Enum.class.isAssignableFrom(cls)) - return (short)ObjectStreamClass.lookup(cls).getSerialVersionUID(); + if (Serializable.class.isAssignableFrom(cls) && !Enum.class.isAssignableFrom(cls)) { + try { + Field field = cls.getDeclaredField("serialVersionUID"); + + if (field.getType() == long.class) { + int mod = field.getModifiers(); + + if (Modifier.isStatic(mod) && Modifier.isFinal(mod)) { + field.setAccessible(true); + + return (short)field.getLong(null); + } + } + } + catch (NoSuchFieldException e) { + // No-op. + } + catch (IllegalAccessException e) { + throw new IOException(e); + } + + if (OptimizedMarshaller.USE_DFLT_SUID) + return (short)ObjectStreamClass.lookup(cls).getSerialVersionUID(); + } MessageDigest md; http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java index d8ee953..b8df846 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java @@ -126,12 +126,14 @@ import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessa import org.jetbrains.annotations.Nullable; import org.jsr166.ConcurrentHashMap8; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID; import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; import static org.apache.ignite.events.EventType.EVT_NODE_JOINED; import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.events.EventType.EVT_NODE_METRICS_UPDATED; import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_DFLT_SUID; import static org.apache.ignite.spi.IgnitePortProtocol.TCP; import static org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.AUTH_FAILED; import static org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.CHECK_FAILED; @@ -2988,6 +2990,56 @@ class ServerImpl extends TcpDiscoveryImpl { return; } + // If node have no value for this attribute then we treat it as true. + Boolean locMarshUseDfltSuid = locNode.attribute(ATTR_MARSHALLER_USE_DFLT_SUID); + boolean locMarshUseDfltSuidBool = locMarshUseDfltSuid == null ? true : locMarshUseDfltSuid; + + Boolean rmtMarshUseDfltSuid = node.attribute(ATTR_MARSHALLER_USE_DFLT_SUID); + boolean rmtMarshUseDfltSuidBool = rmtMarshUseDfltSuid == null ? true : rmtMarshUseDfltSuid; + + if (locMarshUseDfltSuidBool != rmtMarshUseDfltSuidBool) { + String errMsg = "Local node's " + IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID + + " property value differs from remote node's value " + + "(to make sure all nodes in topology have identical marshaller settings, " + + "configure system property explicitly) " + + "[locMarshUseDfltSuid=" + locMarshUseDfltSuid + ", rmtMarshUseDfltSuid=" + rmtMarshUseDfltSuid + + ", locNodeAddrs=" + U.addressesAsString(locNode) + + ", rmtNodeAddrs=" + U.addressesAsString(node) + + ", locNodeId=" + locNode.id() + ", rmtNodeId=" + msg.creatorNodeId() + ']'; + + LT.warn(log, null, errMsg); + + // Always output in debug. + if (log.isDebugEnabled()) + log.debug(errMsg); + + try { + String sndMsg = "Local node's " + IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID + + " property value differs from remote node's value " + + "(to make sure all nodes in topology have identical marshaller settings, " + + "configure system property explicitly) " + + "[locMarshUseDfltSuid=" + locMarshUseDfltSuid + + ", rmtMarshUseDfltSuid=" + rmtMarshUseDfltSuid + + ", locNodeAddrs=" + U.addressesAsString(node) + ", locPort=" + node.discoveryPort() + + ", rmtNodeAddr=" + U.addressesAsString(locNode) + ", locNodeId=" + node.id() + + ", rmtNodeId=" + locNode.id() + ']'; + + trySendMessageDirectly(node, + new TcpDiscoveryCheckFailedMessage(locNodeId, sndMsg)); + } + catch (IgniteSpiException e) { + if (log.isDebugEnabled()) + log.debug("Failed to send marshaller check failed message to node " + + "[node=" + node + ", err=" + e.getMessage() + ']'); + + onException("Failed to send marshaller check failed message to node " + + "[node=" + node + ", err=" + e.getMessage() + ']', e); + } + + // Ignore join request. + return; + } + // Handle join. node.internalOrder(ring.nextNodeOrder()); http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java index dc73cff..6e2c635 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManagerAttributesSelfTest.java @@ -17,18 +17,15 @@ package org.apache.ignite.internal.managers.discovery; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.DeploymentMode; import org.apache.ignite.configuration.IgniteConfiguration; -import org.apache.ignite.internal.IgniteNodeAttributes; +import org.apache.ignite.marshaller.optimized.OptimizedMarshaller; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import static org.apache.ignite.configuration.DeploymentMode.CONTINUOUS; @@ -123,6 +120,43 @@ public abstract class GridDiscoveryManagerAttributesSelfTest extends GridCommonA /** * @throws Exception If failed. */ + public void testUseDefaultSuid() throws Exception { + doTestUseDefaultSuid(true, false, true); + doTestUseDefaultSuid(false, true, true); + doTestUseDefaultSuid(true, true, false); + doTestUseDefaultSuid(false, false, false); + } + + /** + * @throws Exception If failed. + */ + private void doTestUseDefaultSuid(Boolean first, Boolean second, boolean fail) throws Exception { + try { + GridTestUtils.setFieldValue(null, OptimizedMarshaller.class, "USE_DFLT_SUID", first); + + startGrid(0); + + GridTestUtils.setFieldValue(null, OptimizedMarshaller.class, "USE_DFLT_SUID", second); + + try { + startGrid(1); + + if (fail) + fail("Node should not join"); + } + catch (Exception e) { + if (!fail) + fail("Node should join"); + } + } + finally { + stopAllGrids(); + } + } + + /** + * @throws Exception If failed. + */ public void testDifferentDeploymentModes() throws Exception { startGrid(0); http://git-wip-us.apache.org/repos/asf/ignite/blob/e9aa4d10/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index be3f0e4..ea3bbe0 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -27,6 +27,7 @@ import java.lang.ref.SoftReference; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.net.InetAddress; import java.net.MulticastSocket; import java.nio.file.attribute.PosixFilePermission; @@ -1139,7 +1140,6 @@ public final class GridTestUtils { */ @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") public static void setFieldValue(Object obj, Class cls, String fieldName, Object val) throws IgniteException { - assert obj != null; assert fieldName != null; try { @@ -1149,16 +1149,33 @@ public final class GridTestUtils { // Backup accessible field state. boolean accessible = field.isAccessible(); + boolean isFinal = (field.getModifiers() & Modifier.FINAL) > 0; + + Field modifiersField = null; + + if (isFinal) + modifiersField = Field.class.getDeclaredField("modifiers"); + try { if (!accessible) field.setAccessible(true); + if (isFinal) { + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + } + field.set(obj, val); } finally { // Recover accessible field state. if (!accessible) field.setAccessible(false); + + if (isFinal) { + modifiersField.setInt(field, field.getModifiers() | Modifier.FINAL); + modifiersField.setAccessible(false); + } } } }