This is an automated email from the ASF dual-hosted git repository.

nnag pushed a commit to branch support/1.14
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.14 by this push:
     new 4b9ec55  GEODE-9019: Serialization improvements in geode-redis (#6115) 
(#6122)
4b9ec55 is described below

commit 4b9ec55fb2339d93e61a60201c878c0f4fa11763
Author: Nabarun Nag <[email protected]>
AuthorDate: Wed Mar 17 14:53:50 2021 -0700

    GEODE-9019: Serialization improvements in geode-redis (#6115) (#6122)
    
       * DataSerializable classes were converted in DataSerializableFixedID
       * serialVersionID were added to the unavoidable Serializable classes
    
    (cherry picked from commit 7aae7b8158a0c8aecc15468a81a421bd6ffdc05e)
---
 .../codeAnalysis/sanctionedDataSerializables.txt   | 20 +++++----
 .../geode/redis/internal/GeodeRedisService.java    | 21 +++++++++-
 .../redis/internal/data/AbstractRedisData.java     | 11 +++--
 .../redis/internal/data/ByteArrayWrapper.java      |  5 +--
 .../geode/redis/internal/data/NullRedisData.java   | 22 +++++++---
 .../geode/redis/internal/data/RedisData.java       |  4 +-
 .../geode/redis/internal/data/RedisHash.java       | 22 ++++++++--
 .../apache/geode/redis/internal/data/RedisSet.java | 35 +++++++++++-----
 .../geode/redis/internal/data/RedisString.java     | 30 +++++++++-----
 .../redis/internal/executor/CommandFunction.java   |  1 +
 .../executor/SingleResultRedisFunction.java        |  1 +
 .../internal/executor/key/RenameFunction.java      |  1 +
 .../redis/internal/executor/string/SetOptions.java | 47 +++++++++++++++++++---
 .../redis/internal/gfsh/RedisCommandFunction.java  |  2 +
 .../sanctioned-geode-redis-serializables.txt       |  9 ++---
 .../geode/redis/internal/data/RedisHashTest.java   | 14 +++++++
 .../geode/redis/internal/data/RedisSetTest.java    | 14 +++++++
 .../geode/redis/internal/data/RedisStringTest.java | 16 +++++++-
 .../serialization/DataSerializableFixedID.java     |  6 ++-
 19 files changed, 223 insertions(+), 58 deletions(-)

diff --git 
a/geode-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
 
b/geode-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
index 68fb673..6e96a2c 100644
--- 
a/geode-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
+++ 
b/geode-redis/src/integrationTest/resources/org/apache/geode/codeAnalysis/sanctionedDataSerializables.txt
@@ -1,6 +1,6 @@
 org/apache/geode/redis/internal/data/AbstractRedisData,2
-fromData,12
-toData,12
+fromData,11
+toData,11
 
 org/apache/geode/redis/internal/data/ByteArrayWrapper,2
 fromData,9
@@ -11,14 +11,18 @@ fromData,8
 toData,8
 
 org/apache/geode/redis/internal/data/RedisHash,2
-toData,14
-fromData,14
+toData,15
+fromData,15
 
 org/apache/geode/redis/internal/data/RedisSet,2
-toData,14
-fromData,14
+toData,15
+fromData,15
 
 org/apache/geode/redis/internal/data/RedisString,2
-fromData,29
-toData,25
+toData,26
+fromData,30
+
+org/apache/geode/redis/internal/executor/string/SetOptions,2
+fromData,34
+toData,29
 
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java
index b6d3238..8957731 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/GeodeRedisService.java
@@ -29,6 +29,11 @@ import 
org.apache.geode.internal.serialization.DataSerializableFixedID;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.management.internal.beans.CacheServiceMBeanBase;
 import org.apache.geode.redis.internal.data.ByteArrayWrapper;
+import org.apache.geode.redis.internal.data.NullRedisData;
+import org.apache.geode.redis.internal.data.RedisHash;
+import org.apache.geode.redis.internal.data.RedisSet;
+import org.apache.geode.redis.internal.data.RedisString;
+import org.apache.geode.redis.internal.executor.string.SetOptions;
 
 public class GeodeRedisService implements CacheService, ResourceEventsListener 
{
   private static final Logger logger = LogService.getLogger();
@@ -52,7 +57,21 @@ public class GeodeRedisService implements CacheService, 
ResourceEventsListener {
     InternalDataSerializer.getDSFIDSerializer().registerDSFID(
         DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER,
         ByteArrayWrapper.class);
-
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_SET_ID,
+        RedisSet.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_STRING_ID,
+        RedisString.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_HASH_ID,
+        RedisHash.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_NULL_DATA_ID,
+        NullRedisData.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_SET_OPTIONS_ID,
+        SetOptions.class);
   }
 
   @Override
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
index a07f652..99fbb0f 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/AbstractRedisData.java
@@ -27,6 +27,8 @@ import org.apache.geode.InvalidDeltaException;
 import org.apache.geode.cache.EntryNotFoundException;
 import org.apache.geode.cache.Region;
 import org.apache.geode.internal.cache.BucketRegion;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.redis.internal.delta.AddsDeltaInfo;
 import org.apache.geode.redis.internal.delta.AppendDeltaInfo;
 import org.apache.geode.redis.internal.delta.DeltaInfo;
@@ -158,13 +160,14 @@ public abstract class AbstractRedisData implements 
RedisData {
   }
 
   @Override
-  public void toData(DataOutput out) throws IOException {
-    DataSerializer.writeLong(expirationTimestamp, out);
+  public void toData(DataOutput out, SerializationContext context) throws 
IOException {
+    out.writeLong(expirationTimestamp);
   }
 
   @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
-    expirationTimestamp = (DataSerializer.readLong(in));
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    expirationTimestamp = in.readLong();
   }
 
   private void setDelta(DeltaInfo deltaInfo) {
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/ByteArrayWrapper.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/ByteArrayWrapper.java
index a225e66..162cf46 100755
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/ByteArrayWrapper.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/ByteArrayWrapper.java
@@ -22,7 +22,6 @@ import static 
org.apache.geode.redis.internal.RegionProvider.REDIS_SLOTS_PER_BUC
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.Arrays;
 
 import org.apache.geode.DataSerializer;
@@ -40,7 +39,7 @@ import org.apache.geode.redis.internal.netty.Coder;
  * able to be used in querying. Class is also marked as Serializable for test 
support.
  */
 public class ByteArrayWrapper
-    implements DataSerializableFixedID, Serializable, 
Comparable<ByteArrayWrapper> {
+    implements DataSerializableFixedID, Comparable<ByteArrayWrapper> {
   /**
    * The data portion of ValueWrapper
    */
@@ -214,7 +213,7 @@ public class ByteArrayWrapper
 
   @Override
   public void fromData(DataInput in, DeserializationContext context)
-      throws IOException, ClassNotFoundException {
+      throws IOException {
     value = DataSerializer.readByteArray(in);
   }
 
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisData.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisData.java
index fbe79b2..e810cb9 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisData.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/NullRedisData.java
@@ -18,10 +18,12 @@ package org.apache.geode.redis.internal.data;
 
 import java.io.DataInput;
 import java.io.DataOutput;
-import java.io.IOException;
 
 import org.apache.geode.InvalidDeltaException;
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.internal.serialization.SerializationContext;
 
 /**
  * Implements behaviour for when no instance of RedisData exists.
@@ -90,27 +92,37 @@ public class NullRedisData implements RedisData {
   }
 
   @Override
-  public void toData(DataOutput out) throws IOException {
+  public int getDSFID() {
+    return REDIS_NULL_DATA_ID;
+  }
+
+  @Override
+  public void toData(DataOutput out, SerializationContext context) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
+  public void fromData(DataInput in, DeserializationContext context) {
     throw new UnsupportedOperationException();
   }
 
   @Override
+  public KnownVersion[] getSerializationVersions() {
+    return null;
+  }
+
+  @Override
   public boolean hasDelta() {
     return false;
   }
 
   @Override
-  public void toDelta(DataOutput out) throws IOException {
+  public void toDelta(DataOutput out) {
     throw new UnsupportedOperationException();
   }
 
   @Override
-  public void fromDelta(DataInput in) throws IOException, 
InvalidDeltaException {
+  public void fromDelta(DataInput in) throws InvalidDeltaException {
     throw new UnsupportedOperationException();
   }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisData.java 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisData.java
index c5ff8e4..b51459b 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisData.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisData.java
@@ -17,11 +17,11 @@
 package org.apache.geode.redis.internal.data;
 
 
-import org.apache.geode.DataSerializable;
 import org.apache.geode.Delta;
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.serialization.DataSerializableFixedID;
 
-public interface RedisData extends Delta, DataSerializable {
+public interface RedisData extends Delta, DataSerializableFixedID {
   NullRedisData NULL_REDIS_DATA = new NullRedisData();
 
   /**
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisHash.java 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisHash.java
index 1a938fb..489f5be 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisHash.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisHash.java
@@ -45,6 +45,9 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.redis.internal.delta.AddsDeltaInfo;
 import org.apache.geode.redis.internal.delta.DeltaInfo;
 import org.apache.geode.redis.internal.delta.RemsDeltaInfo;
@@ -141,8 +144,8 @@ public class RedisHash extends AbstractRedisData {
    * to be thread safe with toData.
    */
   @Override
-  public synchronized void toData(DataOutput out) throws IOException {
-    super.toData(out);
+  public synchronized void toData(DataOutput out, SerializationContext 
context) throws IOException {
+    super.toData(out, context);
     DataSerializer.writeHashMap(hash, out);
   }
 
@@ -160,8 +163,9 @@ public class RedisHash extends AbstractRedisData {
   }
 
   @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
-    super.fromData(in);
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    super.fromData(in, context);
     hash = DataSerializer.readHashMap(in);
   }
 
@@ -499,4 +503,14 @@ public class RedisHash extends AbstractRedisData {
   public String toString() {
     return "RedisHash{" + super.toString() + ", " + "hash=" + hash + '}';
   }
+
+  @Override
+  public int getDSFID() {
+    return REDIS_HASH_ID;
+  }
+
+  @Override
+  public KnownVersion[] getSerializationVersions() {
+    return null;
+  }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
index 16d871a..880edcd 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisSet.java
@@ -35,9 +35,12 @@ import java.util.regex.Pattern;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 
-import org.apache.geode.DataSerializer;
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.InternalDataSerializer;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.redis.internal.delta.AddsDeltaInfo;
 import org.apache.geode.redis.internal.delta.DeltaInfo;
 import org.apache.geode.redis.internal.delta.RemsDeltaInfo;
@@ -192,10 +195,23 @@ public class RedisSet extends AbstractRedisData {
    * are modifying this object, the striped executor will not protect toData.
    * So any methods that modify "members" needs to be thread safe with toData.
    */
+
+  @Override
+  public synchronized void toData(DataOutput out, SerializationContext 
context) throws IOException {
+    super.toData(out, context);
+    InternalDataSerializer.writeHashSet(members, out);
+  }
+
+  @Override
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    super.fromData(in, context);
+    members = InternalDataSerializer.readHashSet(in);
+  }
+
   @Override
-  public synchronized void toData(DataOutput out) throws IOException {
-    super.toData(out);
-    DataSerializer.writeHashSet(members, out);
+  public int getDSFID() {
+    return REDIS_SET_ID;
   }
 
   private synchronized boolean membersAdd(ByteArrayWrapper memberToAdd) {
@@ -214,11 +230,7 @@ public class RedisSet extends AbstractRedisData {
     return members.removeAll(remsDeltaInfo.getRemoves());
   }
 
-  @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
-    super.fromData(in);
-    members = DataSerializer.readHashSet(in);
-  }
+
 
   /**
    * @param membersToAdd members to add to this set; NOTE this list may by
@@ -301,4 +313,9 @@ public class RedisSet extends AbstractRedisData {
   public String toString() {
     return "RedisSet{" + super.toString() + ", " + "members=" + members + '}';
   }
+
+  @Override
+  public KnownVersion[] getSerializationVersions() {
+    return null;
+  }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisString.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisString.java
index fc14814..695b1a3 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisString.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/data/RedisString.java
@@ -25,6 +25,9 @@ import java.util.Objects;
 
 import org.apache.geode.DataSerializer;
 import org.apache.geode.cache.Region;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.redis.internal.RedisConstants;
 import org.apache.geode.redis.internal.delta.AppendDeltaInfo;
 import org.apache.geode.redis.internal.delta.DeltaInfo;
@@ -604,24 +607,28 @@ public class RedisString extends AbstractRedisData {
   /**
    * Since GII (getInitialImage) can come in and call toData while other 
threads
    * are modifying this object, the striped executor will not protect toData.
-   * So any methods that modify "value" need to be thread safe with toData.
-   * But currently all of them are because we never modify the existing byte
-   * array owned by "value" in place. Instead we create a new byte array
-   * and call setBytes. So toData will see either the old or new value but
-   * not a mix of both.
+   * So any methods that modify "value", "appendSequence" need to be thread 
safe with toData.
    */
+
   @Override
-  public void toData(DataOutput out) throws IOException {
-    super.toData(out);
+  public synchronized void toData(DataOutput out, SerializationContext 
context) throws IOException {
+    super.toData(out, context);
     DataSerializer.writePrimitiveInt(appendSequence, out);
     DataSerializer.writeByteArray(value.toBytes(), out);
   }
 
   @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
-    super.fromData(in);
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    super.fromData(in, context);
     appendSequence = DataSerializer.readPrimitiveInt(in);
     value = new ByteArrayWrapper(DataSerializer.readByteArray(in));
+
+  }
+
+  @Override
+  public int getDSFID() {
+    return REDIS_STRING_ID;
   }
 
   @Override
@@ -721,4 +728,9 @@ public class RedisString extends AbstractRedisData {
   protected void valueSetBytes(byte[] bytes) {
     value.setBytes(bytes);
   }
+
+  @Override
+  public KnownVersion[] getSerializationVersions() {
+    return null;
+  }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
index e19f8b8..c19b6eb 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/CommandFunction.java
@@ -40,6 +40,7 @@ import org.apache.geode.redis.internal.statistics.RedisStats;
 public class CommandFunction extends SingleResultRedisFunction {
 
   public static final String ID = "REDIS_COMMAND_FUNCTION";
+  private static final long serialVersionUID = -1302506316316454732L;
 
   private final transient RedisKeyCommandsFunctionExecutor keyCommands;
   private final transient RedisHashCommandsFunctionExecutor hashCommands;
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java
index 6eb3e98..fc18392 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/SingleResultRedisFunction.java
@@ -25,6 +25,7 @@ import org.apache.geode.redis.internal.data.RedisData;
 
 public abstract class SingleResultRedisFunction implements 
InternalFunction<Object[]> {
 
+  private static final long serialVersionUID = 3239452234149879302L;
   private final transient PartitionedRegion partitionedRegion;
 
   public SingleResultRedisFunction(Region<ByteArrayWrapper, RedisData> 
dataRegion) {
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/key/RenameFunction.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/key/RenameFunction.java
index 13eb8fd..b11c095 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/key/RenameFunction.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/key/RenameFunction.java
@@ -40,6 +40,7 @@ import org.apache.geode.redis.internal.statistics.RedisStats;
 public class RenameFunction implements InternalFunction {
 
   public static final String ID = "REDIS_RENAME_FUNCTION";
+  private static final long serialVersionUID = 7047473969356686453L;
 
   private final transient PartitionedRegion partitionedRegion;
   private final transient CommandHelper commandHelper;
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetOptions.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetOptions.java
index 14492e6..de43564 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetOptions.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/executor/string/SetOptions.java
@@ -16,16 +16,24 @@
 
 package org.apache.geode.redis.internal.executor.string;
 
-import java.io.Serializable;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+import org.apache.geode.DataSerializer;
+import org.apache.geode.internal.serialization.DataSerializableFixedID;
+import org.apache.geode.internal.serialization.DeserializationContext;
+import org.apache.geode.internal.serialization.KnownVersion;
+import org.apache.geode.internal.serialization.SerializationContext;
 
 /**
  * Class representing different options that can be used with Redis string SET 
command.
  */
-public class SetOptions implements Serializable {
+public class SetOptions implements DataSerializableFixedID {
 
-  private final Exists exists;
-  private final long expirationMillis;
-  private final boolean keepTTL;
+  private Exists exists;
+  private long expirationMillis;
+  private boolean keepTTL;
 
   public SetOptions(Exists exists, long expiration, boolean keepTTL) {
     this.exists = exists;
@@ -33,6 +41,8 @@ public class SetOptions implements Serializable {
     this.keepTTL = keepTTL;
   }
 
+  public SetOptions() {}
+
   public boolean isNX() {
     return exists.equals(Exists.NX);
   }
@@ -53,6 +63,31 @@ public class SetOptions implements Serializable {
     return keepTTL;
   }
 
+  @Override
+  public int getDSFID() {
+    return REDIS_SET_OPTIONS_ID;
+  }
+
+  @Override
+  public void toData(DataOutput out, SerializationContext context) throws 
IOException {
+    DataSerializer.writeEnum(exists, out);
+    out.writeLong(expirationMillis);
+    out.writeBoolean(keepTTL);
+  }
+
+  @Override
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException {
+    exists = DataSerializer.readEnum(SetOptions.Exists.class, in);
+    expirationMillis = in.readLong();
+    keepTTL = in.readBoolean();
+  }
+
+  @Override
+  public KnownVersion[] getSerializationVersions() {
+    return null;
+  }
+
   public enum Exists {
     NONE,
 
@@ -64,6 +99,6 @@ public class SetOptions implements Serializable {
     /**
      * Only set if key already exists
      */
-    XX;
+    XX
   }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/gfsh/RedisCommandFunction.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/gfsh/RedisCommandFunction.java
index 58ed73f..a1f5fa2 100644
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/gfsh/RedisCommandFunction.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/gfsh/RedisCommandFunction.java
@@ -23,6 +23,8 @@ import org.apache.geode.redis.internal.GeodeRedisService;
 
 public class RedisCommandFunction extends CliFunction<Boolean> {
 
+  private static final long serialVersionUID = -6607122865046807926L;
+
   public static void register() {
     FunctionService.registerFunction(new RedisCommandFunction());
   }
diff --git 
a/geode-redis/src/main/resources/org/apache/geode/redis/internal/sanctioned-geode-redis-serializables.txt
 
b/geode-redis/src/main/resources/org/apache/geode/redis/internal/sanctioned-geode-redis-serializables.txt
index 3d91f76..4a5a511 100755
--- 
a/geode-redis/src/main/resources/org/apache/geode/redis/internal/sanctioned-geode-redis-serializables.txt
+++ 
b/geode-redis/src/main/resources/org/apache/geode/redis/internal/sanctioned-geode-redis-serializables.txt
@@ -6,12 +6,11 @@ 
org/apache/geode/redis/internal/data/NullRedisString$BitOp,false
 
org/apache/geode/redis/internal/data/RedisDataType,false,toStringValue:java/lang/String
 
org/apache/geode/redis/internal/data/RedisDataTypeMismatchException,true,-2451663685348513870
 org/apache/geode/redis/internal/delta/DeltaType,false
-org/apache/geode/redis/internal/executor/CommandFunction,false
-org/apache/geode/redis/internal/executor/SingleResultRedisFunction,false
-org/apache/geode/redis/internal/executor/key/RenameFunction,false
-org/apache/geode/redis/internal/executor/string/SetOptions,false,exists:org/apache/geode/redis/internal/executor/string/SetOptions$Exists,expirationMillis:long,keepTTL:boolean
+org/apache/geode/redis/internal/executor/CommandFunction,true,-1302506316316454732
+org/apache/geode/redis/internal/executor/SingleResultRedisFunction,true,3239452234149879302
+org/apache/geode/redis/internal/executor/key/RenameFunction,true,7047473969356686453
 org/apache/geode/redis/internal/executor/string/SetOptions$Exists,false
-org/apache/geode/redis/internal/gfsh/RedisCommandFunction,false
+org/apache/geode/redis/internal/gfsh/RedisCommandFunction,true,-6607122865046807926
 org/apache/geode/redis/internal/netty/CoderException,true,4707944288714910949
 
org/apache/geode/redis/internal/netty/RedisCommandParserException,true,4707944288714910949
 
org/apache/geode/redis/internal/pubsub/PubSubImpl$1,false,this$0:org/apache/geode/redis/internal/pubsub/PubSubImpl
diff --git 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
index d78081b..190ca50 100644
--- 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
+++ 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisHashTest.java
@@ -20,7 +20,9 @@ import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
+import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -37,6 +39,7 @@ import org.apache.geode.internal.HeapDataOutputStream;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.DataSerializableFixedID;
+import org.apache.geode.internal.serialization.SerializationContext;
 import org.apache.geode.redis.internal.netty.Coder;
 import org.apache.geode.test.awaitility.GeodeAwaitility;
 
@@ -47,6 +50,9 @@ public class RedisHashTest {
     InternalDataSerializer
         .getDSFIDSerializer()
         .registerDSFID(DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER, 
ByteArrayWrapper.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_HASH_ID,
+        RedisHash.class);
   }
 
   @Test
@@ -60,6 +66,14 @@ public class RedisHashTest {
     assertThat(o2).isEqualTo(o1);
   }
 
+  @Test
+  public void confirmToDataIsSynchronized() throws NoSuchMethodException {
+    assertThat(Modifier
+        .isSynchronized(RedisHash.class
+            .getMethod("toData", DataOutput.class, 
SerializationContext.class).getModifiers()))
+                .isTrue();
+  }
+
   private RedisHash createRedisHash(String k1, String v1, String k2, String 
v2) {
     ArrayList<ByteArrayWrapper> elements = new ArrayList<>();
     elements.add(createByteArrayWrapper(k1));
diff --git 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
index d9aba1f..9be2258 100644
--- 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
+++ 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisSetTest.java
@@ -19,7 +19,9 @@ package org.apache.geode.redis.internal.data;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
+import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -33,6 +35,7 @@ import org.apache.geode.internal.HeapDataOutputStream;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.DataSerializableFixedID;
+import org.apache.geode.internal.serialization.SerializationContext;
 
 public class RedisSetTest {
 
@@ -41,6 +44,9 @@ public class RedisSetTest {
     InternalDataSerializer
         .getDSFIDSerializer()
         .registerDSFID(DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER, 
ByteArrayWrapper.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_SET_ID,
+        RedisSet.class);
   }
 
   @Test
@@ -54,6 +60,14 @@ public class RedisSetTest {
     assertThat(o2).isEqualTo(o1);
   }
 
+  @Test
+  public void confirmToDataIsSynchronized() throws NoSuchMethodException {
+    assertThat(Modifier
+        .isSynchronized(RedisSet.class
+            .getMethod("toData", DataOutput.class, 
SerializationContext.class).getModifiers()))
+                .isTrue();
+  }
+
   private RedisSet createRedisSet(int m1, int m2) {
     return new RedisSet(Arrays.asList(
         new ByteArrayWrapper(new byte[] {(byte) m1}),
diff --git 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
index 73f3302..1c2ffbc 100644
--- 
a/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
+++ 
b/geode-redis/src/test/java/org/apache/geode/redis/internal/data/RedisStringTest.java
@@ -20,7 +20,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 
+import java.io.DataOutput;
 import java.io.IOException;
+import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
 
 import org.junit.BeforeClass;
@@ -32,6 +34,7 @@ import org.apache.geode.internal.HeapDataOutputStream;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.serialization.ByteArrayDataInput;
 import org.apache.geode.internal.serialization.DataSerializableFixedID;
+import org.apache.geode.internal.serialization.SerializationContext;
 
 public class RedisStringTest {
 
@@ -40,6 +43,9 @@ public class RedisStringTest {
     InternalDataSerializer
         .getDSFIDSerializer()
         .registerDSFID(DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER, 
ByteArrayWrapper.class);
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_STRING_ID,
+        RedisString.class);
   }
 
   @Test
@@ -105,7 +111,7 @@ public class RedisStringTest {
   }
 
   @Test
-  public void serializationIsStable() throws IOException, 
ClassNotFoundException {
+  public void confirmSerializationIsStable() throws IOException, 
ClassNotFoundException {
     RedisString o1 = new RedisString(new ByteArrayWrapper(new byte[] {0, 1, 2, 
3}));
     o1.setExpirationTimestampNoDelta(1000);
     HeapDataOutputStream outputStream = new HeapDataOutputStream(100);
@@ -116,6 +122,14 @@ public class RedisStringTest {
   }
 
   @Test
+  public void confirmToDataIsSynchronized() throws NoSuchMethodException {
+    assertThat(Modifier
+        .isSynchronized(RedisString.class
+            .getMethod("toData", DataOutput.class, 
SerializationContext.class).getModifiers()))
+                .isTrue();
+  }
+
+  @Test
   public void incrThrowsArithmeticErrorWhenNotALong() {
     // allows unchecked cast of mock to Region<ByteArrayWrapper, RedisData>
     @SuppressWarnings("unchecked")
diff --git 
a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
 
b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
index ff1571c..3d78610 100644
--- 
a/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
+++ 
b/geode-serialization/src/main/java/org/apache/geode/internal/serialization/DataSerializableFixedID.java
@@ -680,7 +680,11 @@ public interface DataSerializableFixedID extends 
SerializationVersions, BasicSer
   short ABORT_BACKUP_REQUEST = 2183;
   short MEMBER_IDENTIFIER = 2184;
   short HOST_AND_PORT = 2185;
-
+  short REDIS_SET_ID = 2186;
+  short REDIS_STRING_ID = 2187;
+  short REDIS_HASH_ID = 2188;
+  short REDIS_NULL_DATA_ID = 2189;
+  short REDIS_SET_OPTIONS_ID = 2190;
   // NOTE, codes > 65535 will take 4 bytes to serialize
 
   /**

Reply via email to