Skip to content

Commit 097108a

Browse files
authored
Support multiple Avro schema version in Pulsar SQL (#4847)
Support multiple Avro schema version in Pulsar SQL
1 parent d55bc00 commit 097108a

File tree

24 files changed

+466
-125
lines changed

24 files changed

+466
-125
lines changed

pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/SchemasResource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
import org.apache.pulsar.broker.admin.AdminResource;
5656
import org.apache.pulsar.broker.service.schema.exceptions.IncompatibleSchemaException;
57-
import org.apache.pulsar.broker.service.schema.LongSchemaVersion;
57+
import org.apache.pulsar.common.schema.LongSchemaVersion;
5858
import org.apache.pulsar.common.policies.data.Policies;
5959
import org.apache.pulsar.common.policies.data.SchemaCompatibilityStrategy;
6060
import org.apache.pulsar.broker.service.schema.SchemaRegistry.SchemaAndMetadata;

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/schema/BookkeeperSchemaStorage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.apache.pulsar.broker.ServiceConfiguration;
5353
import org.apache.pulsar.common.protocol.schema.SchemaStorage;
5454
import org.apache.pulsar.common.protocol.schema.SchemaVersion;
55+
import org.apache.pulsar.common.schema.LongSchemaVersion;
5556
import org.apache.pulsar.common.protocol.schema.StoredSchema;
5657
import org.apache.pulsar.zookeeper.ZooKeeperCache;
5758
import org.apache.zookeeper.CreateMode;

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/schema/SchemaRegistryServiceImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.apache.pulsar.common.policies.data.SchemaCompatibilityStrategy;
5151
import org.apache.pulsar.common.protocol.schema.SchemaData;
5252
import org.apache.pulsar.common.protocol.schema.SchemaHash;
53+
import org.apache.pulsar.common.schema.LongSchemaVersion;
5354
import org.apache.pulsar.common.protocol.schema.SchemaStorage;
5455
import org.apache.pulsar.common.protocol.schema.StoredSchema;
5556
import org.apache.pulsar.common.schema.SchemaType;

pulsar-broker/src/test/java/org/apache/pulsar/broker/service/schema/BookkeeperSchemaStorageTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.nio.ByteBuffer;
2222
import org.apache.bookkeeper.client.api.BKException;
2323
import org.apache.pulsar.broker.PulsarService;
24+
import org.apache.pulsar.common.schema.LongSchemaVersion;
2425
import org.apache.pulsar.zookeeper.LocalZooKeeperCache;
2526
import org.testng.annotations.Test;
2627

pulsar-broker/src/test/java/org/apache/pulsar/broker/service/schema/SchemaServiceTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.pulsar.broker.service.schema.SchemaRegistry.SchemaAndMetadata;
4242
import org.apache.pulsar.common.policies.data.SchemaCompatibilityStrategy;
4343
import org.apache.pulsar.common.protocol.schema.SchemaData;
44+
import org.apache.pulsar.common.schema.LongSchemaVersion;
4445
import org.apache.pulsar.common.schema.SchemaType;
4546
import org.apache.pulsar.common.protocol.schema.SchemaVersion;
4647
import org.testng.annotations.AfterMethod;

pulsar-broker/src/test/java/org/apache/pulsar/client/api/SimpleSchemaTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
import org.apache.avro.reflect.ReflectData;
3232
import org.apache.avro.Schema.Parser;
33-
import org.apache.pulsar.broker.service.schema.LongSchemaVersion;
33+
import org.apache.pulsar.common.schema.LongSchemaVersion;
3434
import org.apache.pulsar.client.admin.PulsarAdminException;
3535
import org.apache.pulsar.client.api.PulsarClientException.IncompatibleSchemaException;
3636
import org.apache.pulsar.client.api.PulsarClientException.InvalidMessageException;

pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/AbstractSchema.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.apache.pulsar.client.api.Schema;
2323
import org.apache.pulsar.client.api.SchemaSerializationException;
2424

25-
abstract class AbstractSchema<T> implements Schema<T> {
25+
public abstract class AbstractSchema<T> implements Schema<T> {
2626

2727
/**
2828
* Check if the message read able length length is a valid object for this schema.
@@ -47,7 +47,7 @@ void validate(ByteBuf byteBuf) {
4747
* the byte buffer to decode
4848
* @return the deserialized object
4949
*/
50-
abstract T decode(ByteBuf byteBuf);
50+
public abstract T decode(ByteBuf byteBuf);
5151
/**
5252
* Decode a byteBuf into an object using a given version.
5353
*
@@ -57,7 +57,7 @@ void validate(ByteBuf byteBuf) {
5757
* the schema version to decode the object. null indicates using latest version.
5858
* @return the deserialized object
5959
*/
60-
T decode(ByteBuf byteBuf, byte[] schemaVersion) {
60+
public T decode(ByteBuf byteBuf, byte[] schemaVersion) {
6161
// ignore version by default (most of the primitive schema implementations ignore schema version)
6262
return decode(byteBuf);
6363
}

pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/StructSchema.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ public T decode(byte[] bytes) {
103103
@Override
104104
public T decode(byte[] bytes, byte[] schemaVersion) {
105105
try {
106-
return readerCache.get(BytesSchemaVersion.of(schemaVersion)).read(bytes);
106+
return schemaVersion == null ? decode(bytes) :
107+
readerCache.get(BytesSchemaVersion.of(schemaVersion)).read(bytes);
107108
} catch (ExecutionException | AvroTypeException e) {
108109
if (e instanceof AvroTypeException) {
109110
throw new SchemaSerializationException(e);
@@ -122,7 +123,8 @@ public T decode(ByteBuf byteBuf) {
122123
@Override
123124
public T decode(ByteBuf byteBuf, byte[] schemaVersion) {
124125
try {
125-
return readerCache.get(BytesSchemaVersion.of(schemaVersion)).read(new ByteBufInputStream(byteBuf));
126+
return schemaVersion == null ? decode(byteBuf) :
127+
readerCache.get(BytesSchemaVersion.of(schemaVersion)).read(new ByteBufInputStream(byteBuf));
126128
} catch (ExecutionException e) {
127129
LOG.error("Can't get generic schema for topic {} schema version {}",
128130
schemaInfoProvider.getTopicName(), Hex.encodeHexString(schemaVersion), e);
@@ -180,7 +182,7 @@ protected static org.apache.avro.Schema parseAvroSchema(String schemaJson) {
180182
return parser.parse(schemaJson);
181183
}
182184

183-
protected static <T> SchemaInfo parseSchemaInfo(SchemaDefinition<T> schemaDefinition, SchemaType schemaType) {
185+
public static <T> SchemaInfo parseSchemaInfo(SchemaDefinition<T> schemaDefinition, SchemaType schemaType) {
184186
return SchemaInfo.builder()
185187
.schema(createAvroSchema(schemaDefinition).toString().getBytes(UTF_8))
186188
.properties(schemaDefinition.getProperties())

pulsar-common/src/main/java/org/apache/pulsar/common/api/raw/RawMessage.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,13 @@ public interface RawMessage {
102102
*/
103103
Optional<String> getKey();
104104

105+
/**
106+
* Get the schema verison of the message.
107+
*
108+
* @return the schema version of the message
109+
*/
110+
byte[] getSchemaVersion();
111+
105112
/**
106113
* Get byteBuf of the key.
107114
*
@@ -115,5 +122,4 @@ public interface RawMessage {
115122
* @return true if the key is base64 encoded, false otherwise
116123
*/
117124
boolean hasBase64EncodedKey();
118-
119125
}

pulsar-common/src/main/java/org/apache/pulsar/common/api/raw/RawMessageImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,14 @@ public Optional<String> getKey() {
143143
}
144144

145145
@Override
146+
public byte[] getSchemaVersion() {
147+
if (msgMetadata != null && msgMetadata.get().hasSchemaVersion()) {
148+
return msgMetadata.get().getSchemaVersion().toByteArray();
149+
} else {
150+
return null;
151+
}
152+
}
153+
146154
public Optional<ByteBuf> getKeyBytes() {
147155
if (getKey().isPresent()) {
148156
if (hasBase64EncodedKey()) {

0 commit comments

Comments
 (0)