This is an automated email from the ASF dual-hosted git repository. penghui pushed a commit to branch branch-2.9 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit d6565a5d3dac9910a8c361a4a08a3a7faf101331 Author: Cong Zhao <[email protected]> AuthorDate: Wed Jun 1 16:58:48 2022 +0800 Fix avro conversion order of registration (#15863) ### Motivation Fixes #15858 The conversion that is registered first is a higher priority than the registered later, so `TimestampMillisConversion` should not be registered after `TimestampMicrosConversion`. ### Modifications Improve `avro` conversion order of registration. (cherry picked from commit 311fdb5dad09217c1706409feb3387d59285c51f) --- .../pulsar/client/impl/schema/AvroSchema.java | 3 ++- .../pulsar/client/impl/schema/AvroSchemaTest.java | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/AvroSchema.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/AvroSchema.java index b34017e20aa..cff3ccdf8f6 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/AvroSchema.java +++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/AvroSchema.java @@ -117,8 +117,8 @@ public class AvroSchema<T> extends AvroBaseStructSchema<T> { reflectData.addLogicalTypeConversion(new TimeConversions.DateConversion()); reflectData.addLogicalTypeConversion(new TimeConversions.TimeMillisConversion()); reflectData.addLogicalTypeConversion(new TimeConversions.TimeMicrosConversion()); - reflectData.addLogicalTypeConversion(new TimeConversions.TimestampMicrosConversion()); if (jsr310ConversionEnabled) { + // The conversion that is registered first is higher priority than the registered later. reflectData.addLogicalTypeConversion(new TimeConversions.TimestampMillisConversion()); } else { try { @@ -127,6 +127,7 @@ public class AvroSchema<T> extends AvroBaseStructSchema<T> { } catch (ClassNotFoundException e) { // Skip if have not provide joda-time dependency. } + reflectData.addLogicalTypeConversion(new TimeConversions.TimestampMicrosConversion()); } reflectData.addLogicalTypeConversion(new Conversions.UUIDConversion()); } diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/AvroSchemaTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/AvroSchemaTest.java index 9e707af8367..d69f8bf66ba 100644 --- a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/AvroSchemaTest.java +++ b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/AvroSchemaTest.java @@ -42,6 +42,7 @@ import org.apache.avro.Schema; import org.apache.avro.SchemaValidationException; import org.apache.avro.SchemaValidator; import org.apache.avro.SchemaValidatorBuilder; +import org.apache.avro.data.TimeConversions; import org.apache.avro.io.BinaryEncoder; import org.apache.avro.io.BufferedBinaryEncoder; import org.apache.avro.reflect.AvroDefault; @@ -459,4 +460,24 @@ public class AvroSchemaTest { assertEquals(pojo2.value1, myBigDecimalPojo.value1); assertEquals(pojo2.value2, myBigDecimalPojo.value2); } + + + @Data + private static class TimestampStruct { + Instant value; + } + + @Test + public void testTimestampWithJsr310Conversion() { + AvroSchema<TimestampStruct> schema = AvroSchema.of(TimestampStruct.class); + Assert.assertEquals( + schema.getAvroSchema().getFields().get(0).schema().getTypes().get(1).getLogicalType().getName(), + new TimeConversions.TimestampMicrosConversion().getLogicalTypeName()); + + AvroSchema<TimestampStruct> schema2 = AvroSchema.of(SchemaDefinition.<TimestampStruct>builder() + .withPojo(TimestampStruct.class).withJSR310ConversionEnabled(true).build()); + Assert.assertEquals( + schema2.getAvroSchema().getFields().get(0).schema().getTypes().get(1).getLogicalType().getName(), + new TimeConversions.TimestampMillisConversion().getLogicalTypeName()); + } }
