This is an automated email from the ASF dual-hosted git repository. bschuchardt pushed a commit to branch feature/GEODE-4989 in repository https://gitbox.apache.org/repos/asf/geode.git
commit d611cfa52cca69a6e1b4b094b05178429c99b069 Author: Bruce Schuchardt <[email protected]> AuthorDate: Mon Apr 2 16:19:26 2018 -0700 GEODE-4989 CQ reply message fromData method deserializes query results CqEntry was using DataSerializer.readObject() to read the entry's value instead of InternalDataSerializer.readUserObject(). The latter is needed to respect the setting of pdx-read-serialized in the query service's StreamingReplyMessage. --- .../apache/geode/cache/query/internal/CqEntry.java | 2 +- .../internal/streaming/StreamingOperation.java | 8 +++--- .../apache/geode/pdx/internal/TypeRegistry.java | 6 +++++ .../QueryObjectSerializationJUnitTest.java | 30 +++++++++++++++++++++- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/cache/query/internal/CqEntry.java b/geode-core/src/main/java/org/apache/geode/cache/query/internal/CqEntry.java index fb01a07..9b09682 100644 --- a/geode-core/src/main/java/org/apache/geode/cache/query/internal/CqEntry.java +++ b/geode-core/src/main/java/org/apache/geode/cache/query/internal/CqEntry.java @@ -92,7 +92,7 @@ public class CqEntry implements DataSerializableFixedID { public void fromData(DataInput in) throws IOException, ClassNotFoundException { this.key = InternalDataSerializer.readUserObject(in); - this.value = DataSerializer.readObject(in); + this.value = InternalDataSerializer.readUserObject(in); } diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/streaming/StreamingOperation.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/streaming/StreamingOperation.java index 391c366..4cfba1d 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/streaming/StreamingOperation.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/streaming/StreamingOperation.java @@ -554,17 +554,17 @@ public abstract class StreamingOperation { lowMemoryDetected = true; break; } - Object o = InternalDataSerializer.readUserObject(in); + Object theObject = DataSerializer.readObject(in); if (isQueryMessageProcessor && elementType != null && elementType.isStructType()) { boolean convertToStruct = isSenderAbove_8_1; if (convertToStruct && i == 0) { - convertToStruct = !(o instanceof PRQueryTraceInfo); + convertToStruct = !(theObject instanceof PRQueryTraceInfo); } if (convertToStruct) { - o = new StructImpl((StructTypeImpl) elementType, (Object[]) o); + theObject = new StructImpl((StructTypeImpl) elementType, (Object[]) theObject); } } - this.objectList.add(o); + this.objectList.add(theObject); } if (lowMemoryDetected) { isCanceled = true; diff --git a/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java b/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java index 76aed3e..00a64b3 100644 --- a/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java +++ b/geode-core/src/main/java/org/apache/geode/pdx/internal/TypeRegistry.java @@ -95,6 +95,12 @@ public class TypeRegistry { } } + /** + * When this returns true pdx-read-serialized should be respected, which is the + * default. Setting this to false disables pdx-read-serialized while deserializing + * objects. This takes precendence over setPdxReadSerializedOverride, which affects + * the cache's setting of that attribute. + */ public static boolean getPdxReadSerialized() { return disablePdxReadSerialized.get() == null; } diff --git a/geode-core/src/test/java/org/apache/geode/cache/query/internal/QueryObjectSerializationJUnitTest.java b/geode-core/src/test/java/org/apache/geode/cache/query/internal/QueryObjectSerializationJUnitTest.java index bf36757..e0dff0a 100644 --- a/geode-core/src/test/java/org/apache/geode/cache/query/internal/QueryObjectSerializationJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/cache/query/internal/QueryObjectSerializationJUnitTest.java @@ -14,7 +14,7 @@ */ package org.apache.geode.cache.query.internal; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -32,9 +32,14 @@ import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.DataSerializer; +import org.apache.geode.cache.Cache; +import org.apache.geode.cache.CacheFactory; import org.apache.geode.cache.query.QueryService; import org.apache.geode.cache.query.types.ObjectType; +import org.apache.geode.distributed.ConfigurationProperties; import org.apache.geode.internal.cache.CachePerfStats; +import org.apache.geode.pdx.PdxSerializableDUnitTest; +import org.apache.geode.pdx.internal.PdxInstanceImpl; import org.apache.geode.test.junit.categories.UnitTest; /** @@ -132,6 +137,29 @@ public class QueryObjectSerializationJUnitTest implements Serializable { // checkRoundTrip(sssWithoutData); } + /** + * Ensure that a CqEntry respects pdx-read-serialized=true + */ + @Test + public void testPdxReadSerializedWithCQEntry() throws IOException, ClassNotFoundException { + Cache cache = new CacheFactory().set(ConfigurationProperties.LOCATORS, "") + .set(ConfigurationProperties.MCAST_PORT, "0").setPdxReadSerialized(true).create(); + + try { + Object key = "APdxSerializableObject"; + Object value = new PdxSerializableDUnitTest.TestPdxObject(); + CqEntry entry = new CqEntry(key, value); + DataOutputStream out = getDataOutput(); + DataSerializer.writeObject(entry, out); + out.flush(); + DataInput in = getDataInput(); + CqEntry newEntry = DataSerializer.readObject(in); + assertEquals(PdxInstanceImpl.class, newEntry.getValue().getClass()); + } finally { + cache.close(); + } + } + private static class SimpleObjectType implements ObjectType { public SimpleObjectType() {} -- To stop receiving notification emails like this one, please contact [email protected].
