You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/10/27 11:55:08 UTC
[5/6] 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-1607
Commit: e9aa4d101506a6d9bc93dc9133c1d1c5aac0996f
Parents: df931bd
Author: Andrey Gura <ag...@gridgain.com>
Authored: Tue Oct 27 12:52:06 2015 +0300
Committer: Denis Magda <dm...@gridgain.com>
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<Object> ALWAYS_TRUE = new P1<Object>() {
+ /** */
+ 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<T>() {
+ /** */
+ 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 <a href="http://www.springframework.org/">www.springframework.org</a>
*/
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<Field> 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);
+ }
}
}
}