You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/08/13 19:14:24 UTC
[2/3] ignite git commit: Wired up write-replace semantics.
Wired up write-replace semantics.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/71e9ec04
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/71e9ec04
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/71e9ec04
Branch: refs/heads/ignite-3681
Commit: 71e9ec04f05e38addc0a4512a7b286015015fc00
Parents: bc33643
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Sat Aug 13 21:38:21 2016 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Sat Aug 13 21:38:21 2016 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 7 +++++++
.../internal/binary/BinaryClassDescriptor.java | 7 ++++++-
.../ignite/internal/binary/BinaryUtils.java | 22 ++++++++++++++++++++
3 files changed, 35 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/71e9ec04/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 0c22c9d..3d455b4 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -452,6 +452,13 @@ public final class IgniteSystemProperties {
public static final String IGNITE_SERVICES_COMPATIBILITY_MODE = "IGNITE_SERVICES_COMPATIBILITY_MODE";
/**
+ * When set to {@code true} tree-based data structures - {@code TreeMap} and {@code TreeSet} - will not be
+ * wrapped into special holders introduced to overcome serialization issue caused by missing {@code Comparable}
+ * interface on {@code BinaryObject}.
+ */
+ public static final String IGNITE_BINARY_DONT_WRAP_TREE_STRUCTURES = "IGNITE_BINARY_DONT_WRAP_TREE_STRUCTURES";
+
+ /**
* Enforces singleton.
*/
private IgniteSystemProperties() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/71e9ec04/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryClassDescriptor.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 2588f59..c00a211 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
@@ -317,6 +317,8 @@ public class BinaryClassDescriptor {
throw new BinaryObjectException("Invalid mode: " + mode);
}
+ BinaryWriteReplacer writeReplacer0 = BinaryUtils.writeReplacer(cls);
+
Method writeReplaceMthd;
if (mode == BinaryWriteMode.BINARY || mode == BinaryWriteMode.OBJECT) {
@@ -329,7 +331,10 @@ public class BinaryClassDescriptor {
writeReplaceMthd = null;
}
- writeReplacer = writeReplaceMthd == null ? null : new BinaryMethodWriteReplacer(writeReplaceMthd);
+ if (writeReplaceMthd != null && writeReplacer0 == null)
+ writeReplacer0 = new BinaryMethodWriteReplacer(writeReplaceMthd);
+
+ writeReplacer = writeReplacer0;
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/71e9ec04/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java
----------------------------------------------------------------------
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 76e5b31..a963840 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
@@ -82,6 +82,9 @@ public class BinaryUtils {
public static final boolean USE_STR_SERIALIZATION_VER_2 = IgniteSystemProperties.getBoolean(
IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2, false);
+ /** Map from class to associated write replacer. */
+ public static final Map<Class, BinaryWriteReplacer> CLS_TO_WRITE_REPLACER = new HashMap<>();
+
/** {@code true} if serialized value of this type cannot contain references to objects. */
private static final boolean[] PLAIN_TYPE_FLAG = new boolean[102];
@@ -127,6 +130,10 @@ public class BinaryUtils {
/** FNV1 hash prime. */
private static final int FNV1_PRIME = 0x01000193;
+ /** Whether to skip TreeMap/TreeSet wrapping. */
+ private static final boolean WRAP_TREES =
+ !IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_BINARY_DONT_WRAP_TREE_STRUCTURES);
+
/**
* Static class initializer.
*/
@@ -244,6 +251,11 @@ public class BinaryUtils {
FIELD_TYPE_NAMES[GridBinaryMarshaller.TIMESTAMP_ARR] = "Timestamp[]";
FIELD_TYPE_NAMES[GridBinaryMarshaller.OBJ_ARR] = "Object[]";
FIELD_TYPE_NAMES[GridBinaryMarshaller.ENUM_ARR] = "Enum[]";
+
+ if (WRAP_TREES) {
+ CLS_TO_WRITE_REPLACER.put(TreeMap.class, new BinaryTreeMapWriteReplacer());
+ CLS_TO_WRITE_REPLACER.put(TreeSet.class, new BinaryTreeSetWriteReplacer());
+ }
}
/**
@@ -2214,6 +2226,16 @@ public class BinaryUtils {
}
/**
+ * Get predefined write-replacer associated with class.
+ *
+ * @param cls Class.
+ * @return Write replacer.
+ */
+ public static BinaryWriteReplacer writeReplacer(Class cls) {
+ return cls != null ? CLS_TO_WRITE_REPLACER.get(cls) : null;
+ }
+
+ /**
* Enum type.
*/
private static class EnumType {