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;