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

jensdeppe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 973750e  ByteArrayWrapper now implementes DataSerializableFixedID 
which should save us 40 bytes each time it is serialized. (#5180)
973750e is described below

commit 973750e9cb7e3511a8c7b77a23a4d20f8f4fd1f6
Author: Darrel Schneider <[email protected]>
AuthorDate: Fri May 29 06:55:33 2020 -0700

    ByteArrayWrapper now implementes DataSerializableFixedID which should save 
us 40 bytes each time it is serialized. (#5180)
    
    - It no longer caches its "hash" and "string" form which will cut down its 
memory overhead by over 70%.
    - When we convert a sequence of bytes to a String, the Coder no longer 
calls intern which will also save some memory and time.
---
 .../codeAnalysis/sanctionedDataSerializables.txt   |  2 +-
 .../geode/redis/internal/ByteArrayWrapper.java     | 64 ++++++++++------------
 .../org/apache/geode/redis/internal/Coder.java     |  2 +-
 .../org/apache/geode/redis/internal/Command.java   |  3 +-
 .../geode/redis/internal/GeodeRedisService.java    | 10 ++++
 .../serialization/DataSerializableFixedID.java     |  2 +-
 6 files changed, 43 insertions(+), 40 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 2c9e2c4..5a8b568 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
@@ -3,7 +3,7 @@ fromData,12
 toData,12
 
 org/apache/geode/redis/internal/ByteArrayWrapper,2
-fromData,20
+fromData,9
 toData,9
 
 org/apache/geode/redis/internal/DoubleWrapper,2
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/ByteArrayWrapper.java
 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/ByteArrayWrapper.java
index 72b0231..37ca334 100755
--- 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/ByteArrayWrapper.java
+++ 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/ByteArrayWrapper.java
@@ -19,33 +19,24 @@ import java.io.DataOutput;
 import java.io.IOException;
 import java.util.Arrays;
 
-import org.apache.geode.DataSerializable;
 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.SerializationContext;
+import org.apache.geode.internal.serialization.Version;
 
 /**
  * This class is a wrapper for the any Regions that need to store a byte[]. 
The only data this an
  * instance will store is a byte[] for the data but it is also serializable 
and comparable so it is
  * able to be used in querying
  */
-public class ByteArrayWrapper implements DataSerializable, 
Comparable<ByteArrayWrapper> {
-  /**
-   * Generated serialVerionUID
-   */
-  private static final long serialVersionUID = 9066391742266642992L;
-
+public class ByteArrayWrapper implements DataSerializableFixedID, 
Comparable<ByteArrayWrapper> {
   /**
    * The data portion of ValueWrapper
    */
   protected byte[] value;
 
   /**
-   * Hash of {@link #value}, this value is cached for performance
-   */
-  private transient int hashCode;
-
-  private transient String toString;
-
-  /**
    * Empty constructor for serialization
    */
   public ByteArrayWrapper() {}
@@ -55,26 +46,11 @@ public class ByteArrayWrapper implements DataSerializable, 
Comparable<ByteArrayW
    */
   public ByteArrayWrapper(byte[] value) {
     this.value = value;
-    this.hashCode = Arrays.hashCode(value);
-  }
-
-  @Override
-  public void toData(DataOutput out) throws IOException {
-    DataSerializer.writeByteArray(value, out);
-  }
-
-  @Override
-  public void fromData(DataInput in) throws IOException, 
ClassNotFoundException {
-    this.value = DataSerializer.readByteArray(in);
-    this.hashCode = Arrays.hashCode(this.value);
   }
 
   @Override
   public String toString() {
-    if (toString == null) {
-      toString = Coder.bytesToString(this.value);
-    }
-    return toString;
+    return Coder.bytesToString(value);
   }
 
   public byte[] toBytes() {
@@ -83,8 +59,6 @@ public class ByteArrayWrapper implements DataSerializable, 
Comparable<ByteArrayW
 
   public void setBytes(byte[] bytes) {
     this.value = bytes;
-    this.toString = null;
-    this.hashCode = Arrays.hashCode(bytes);
   }
 
   /**
@@ -97,12 +71,11 @@ public class ByteArrayWrapper implements DataSerializable, 
Comparable<ByteArrayW
   }
 
   /**
-   * Hash code for byte[] wrapped by this object, the actual hashcode is 
determined by
-   * Arrays.hashCode(byte[])
+   * Hash code for byte[] wrapped by this object
    */
   @Override
   public int hashCode() {
-    return this.hashCode;
+    return Arrays.hashCode(value);
   }
 
 
@@ -183,4 +156,25 @@ public class ByteArrayWrapper implements DataSerializable, 
Comparable<ByteArrayW
   public void append(byte[] appendBytes) {
     setBytes(concatArrays(value, appendBytes));
   }
+
+  @Override
+  public int getDSFID() {
+    return DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER;
+  }
+
+  @Override
+  public void toData(DataOutput out, SerializationContext context) throws 
IOException {
+    DataSerializer.writeByteArray(value, out);
+  }
+
+  @Override
+  public void fromData(DataInput in, DeserializationContext context)
+      throws IOException, ClassNotFoundException {
+    value = DataSerializer.readByteArray(in);
+  }
+
+  @Override
+  public Version[] getSerializationVersions() {
+    return null;
+  }
 }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/Coder.java 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/Coder.java
index 3c83e2d..4b254d4 100644
--- a/geode-redis/src/main/java/org/apache/geode/redis/internal/Coder.java
+++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/Coder.java
@@ -301,7 +301,7 @@ public class Coder {
       return null;
     }
     try {
-      return new String(bytes, CHARSET).intern();
+      return new String(bytes, CHARSET);
     } catch (UnsupportedEncodingException e) {
       throw new RuntimeException(e);
     }
diff --git 
a/geode-redis/src/main/java/org/apache/geode/redis/internal/Command.java 
b/geode-redis/src/main/java/org/apache/geode/redis/internal/Command.java
index 30f4149..b44d814 100755
--- a/geode-redis/src/main/java/org/apache/geode/redis/internal/Command.java
+++ b/geode-redis/src/main/java/org/apache/geode/redis/internal/Command.java
@@ -47,10 +47,9 @@ public class Command {
     this.response = null;
 
     RedisCommandType type;
-    String commandName = null;
     try {
       byte[] charCommand = commandElems.get(0);
-      commandName = Coder.bytesToString(charCommand).toUpperCase();
+      String commandName = Coder.bytesToString(charCommand).toUpperCase();
       type = RedisCommandType.valueOf(commandName);
     } catch (Exception e) {
       type = RedisCommandType.UNKNOWN;
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 fe71c05..ddf5922 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
@@ -21,8 +21,10 @@ import 
org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ResourceEvent;
 import org.apache.geode.distributed.internal.ResourceEventsListener;
+import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.cache.CacheService;
 import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.serialization.DataSerializableFixedID;
 import org.apache.geode.logging.internal.log4j.api.LogService;
 import org.apache.geode.management.internal.beans.CacheServiceMBeanBase;
 
@@ -35,10 +37,18 @@ public class GeodeRedisService implements CacheService, 
ResourceEventsListener {
   public boolean init(Cache cache) {
     this.cache = (InternalCache) cache;
     this.cache.getInternalDistributedSystem().addResourceListener(this);
+    registerDataSerializables();
 
     return 
this.cache.getInternalDistributedSystem().getConfig().getRedisEnabled();
   }
 
+  private void registerDataSerializables() {
+    InternalDataSerializer.getDSFIDSerializer().registerDSFID(
+        DataSerializableFixedID.REDIS_BYTE_ARRAY_WRAPPER,
+        ByteArrayWrapper.class);
+
+  }
+
   @Override
   public void close() {
     stopRedisServer();
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 7a2cd57..bf4dd99 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
@@ -336,7 +336,7 @@ public interface DataSerializableFixedID extends 
SerializationVersions, BasicSer
   byte PR_INDEX_CREATION_REPLY_MSG = 68;
   byte PR_MANAGE_BUCKET_REPLY_MESSAGE = 69;
 
-  // 70 unused
+  byte REDIS_BYTE_ARRAY_WRAPPER = 70;
 
   byte UPDATE_MESSAGE = 71;
   byte REPLY_MESSAGE = 72;

Reply via email to