[ONOS-6642] Disable versioned field serializer by default
Change-Id: I63aba4f56fbce786f1b965f7a9c133d17aeb3ad7
diff --git a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
index 8217b28..a0cecae 100644
--- a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
@@ -190,16 +190,19 @@
StoreSerializer serializer1 = StoreSerializer.using(KryoNamespace.newBuilder()
.register(KryoNamespaces.BASIC)
.register(Versioned1.class)
+ .setCompatible(true)
.build());
StoreSerializer serializer2 = StoreSerializer.using(KryoNamespace.newBuilder()
.register(KryoNamespaces.BASIC)
.register(Versioned2.class)
+ .setCompatible(true)
.build());
StoreSerializer serializer3 = StoreSerializer.using(KryoNamespace.newBuilder()
.register(KryoNamespaces.BASIC)
.register(Versioned3.class)
+ .setCompatible(true)
.build());
Versioned1 versioned1 = new Versioned1();
diff --git a/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java b/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
index ed4b066..afd6978 100644
--- a/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
+++ b/utils/misc/src/main/java/org/onlab/util/KryoNamespace.java
@@ -27,6 +27,7 @@
import com.esotericsoftware.kryo.pool.KryoPool;
import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer;
import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import org.apache.commons.lang3.tuple.Pair;
import org.objenesis.strategy.StdInstantiatorStrategy;
@@ -71,14 +72,13 @@
private static final Logger log = getLogger(KryoNamespace.class);
-
-
private final KryoPool pool = new KryoPool.Builder(this)
.softReferences()
.build();
private final ImmutableList<RegistrationBlock> registeredBlocks;
+ private final boolean compatible;
private final boolean registrationRequired;
private final String friendlyName;
@@ -87,11 +87,22 @@
*/
//@NotThreadSafe
public static final class Builder {
+ private static final String ISSU_PROPERTY_NAME = "onos.cluster.issu.enabled";
+ private static final boolean DEFAULT_ISSU_ENABLED = false;
+
+ private static final boolean DEFAULT_COMPATIBLE_SERIALIZATION;
+
+ static {
+ String issuEnabled = System.getProperty(ISSU_PROPERTY_NAME);
+ DEFAULT_COMPATIBLE_SERIALIZATION = Strings.isNullOrEmpty(issuEnabled)
+ ? DEFAULT_ISSU_ENABLED : Boolean.parseBoolean(issuEnabled);
+ }
private int blockHeadId = INITIAL_ID;
private List<Pair<Class<?>[], Serializer<?>>> types = new ArrayList<>();
private List<RegistrationBlock> blocks = new ArrayList<>();
private boolean registrationRequired = true;
+ private boolean compatible = DEFAULT_COMPATIBLE_SERIALIZATION;
/**
* Builds a {@link KryoNamespace} instance.
@@ -112,7 +123,7 @@
if (!types.isEmpty()) {
blocks.add(new RegistrationBlock(this.blockHeadId, types));
}
- return new KryoNamespace(blocks, registrationRequired, friendlyName).populate(1);
+ return new KryoNamespace(blocks, registrationRequired, compatible, friendlyName).populate(1);
}
/**
@@ -204,6 +215,20 @@
}
/**
+ * Sets whether backwards/forwards compatible versioned serialization is enabled.
+ * <p>
+ * When compatible serialization is enabled, the {@link CompatibleFieldSerializer} will be set as the
+ * default serializer for types that do not otherwise explicitly specify a serializer.
+ *
+ * @param compatible whether versioned serialization is enabled
+ * @return this
+ */
+ public Builder setCompatible(boolean compatible) {
+ this.compatible = compatible;
+ return this;
+ }
+
+ /**
* Sets the registrationRequired flag.
*
* @param registrationRequired Kryo's registrationRequired flag
@@ -230,14 +255,17 @@
* Creates a Kryo instance pool.
*
* @param registeredTypes types to register
- * @param registrationRequired
+ * @param registrationRequired whether registration is required
+ * @param compatible whether compatible serialization is enabled
* @param friendlyName friendly name for the namespace
*/
private KryoNamespace(final List<RegistrationBlock> registeredTypes,
boolean registrationRequired,
+ boolean compatible,
String friendlyName) {
this.registeredBlocks = ImmutableList.copyOf(registeredTypes);
this.registrationRequired = registrationRequired;
+ this.compatible = compatible;
this.friendlyName = checkNotNull(friendlyName);
}
@@ -422,7 +450,11 @@
log.trace("Creating Kryo instance for {}", this);
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(registrationRequired);
- kryo.setDefaultSerializer(CompatibleFieldSerializer::new);
+
+ // If compatible serialization is enabled, override the default serializer.
+ if (compatible) {
+ kryo.setDefaultSerializer(CompatibleFieldSerializer::new);
+ }
// TODO rethink whether we want to use StdInstantiatorStrategy
kryo.setInstantiatorStrategy(