-
Bug
-
Resolution: Done
-
Minor
-
1.5.2.Final, 1.6.0.Beta2
-
None
-
False
-
False
-
Undefined
-
When resolveColumn method invoked with row data including korean or other utf-8 characters, it returns StringIndexOutOfBoundsException like below.
2021-06-09 17:07:11.761 [debezium-vitessconnector-vitess-change-event-source-coordinator] ERROR i.d.c.v.VitessStreamingChangeEventSource:execute:74 - Error during streaming io.grpc.StatusRuntimeException: CANCELLED: Failed to read message. at io.grpc.Status.asRuntimeException(Status.java:533) at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onClose(ClientCalls.java:478) at io.grpc.internal.DelayedClientCall$DelayedListener$3.run(DelayedClientCall.java:463) at io.grpc.internal.DelayedClientCall$DelayedListener.delayOrExecute(DelayedClientCall.java:427) at io.grpc.internal.DelayedClientCall$DelayedListener.onClose(DelayedClientCall.java:460) at io.grpc.internal.ClientCallImpl.closeObserver(ClientCallImpl.java:616) at io.grpc.internal.ClientCallImpl.access$300(ClientCallImpl.java:69) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal(ClientCallImpl.java:802) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext(ClientCallImpl.java:781) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 14 at java.lang.String.substring(String.java:1963) at io.debezium.connector.vitess.connection.VStreamOutputMessageDecoder.resolveColumns(VStreamOutputMessageDecoder.java:299) at io.debezium.connector.vitess.connection.VStreamOutputMessageDecoder.decodeUpdate(VStreamOutputMessageDecoder.java:219) at io.debezium.connector.vitess.connection.VStreamOutputMessageDecoder.decodeRows(VStreamOutputMessageDecoder.java:148) at io.debezium.connector.vitess.connection.VStreamOutputMessageDecoder.processMessage(VStreamOutputMessageDecoder.java:62) at io.debezium.connector.vitess.connection.VitessReplicationConnection$1.onNext(VitessReplicationConnection.java:101) at io.debezium.connector.vitess.connection.VitessReplicationConnection$1.onNext(VitessReplicationConnection.java:79) at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onMessage(ClientCalls.java:465) at io.grpc.internal.DelayedClientCall$DelayedListener.onMessage(DelayedClientCall.java:447) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:715) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:700) ... 5 common frames omittedio.debezium.connector.vitess.connection.VStreamOutputMessageDecoder.resolveColumns(VStreamOutputMessageDecoder.java:299)
It can be reproduced by modifying the test case VitessReplicationConnectionIT as below.
public class VitessReplicationConnectionIT { private static final Logger LOGGER = LoggerFactory.getLogger(VitessReplicationConnectionIT.class); private static final String INSERT_STMT = "INSERT INTO t1 (ko, ja, emoji, en)" + " VALUES ('상품 명1', 'リンゴ', '\uD83D\uDE00', 'prod_name');"; private static final List<String> SETUP_TABLES_STMT = Arrays.asList( "DROP TABLE IF EXISTS t1;", "CREATE TABLE t1 (id BIGINT NOT NULL AUTO_INCREMENT, " + "ko VARCHAR(20), ja VARCHAR(20), emoji VARCHAR(20), en VARCHAR(20), PRIMARY KEY (id));");