You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by az...@apache.org on 2022/12/01 13:20:37 UTC
[shardingsphere] branch master updated: Refactor MySQLBinlogEventType.valueOf to support unknown event type (#22573)
This is an automated email from the ASF dual-hosted git repository.
azexin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new e4cb223a7df Refactor MySQLBinlogEventType.valueOf to support unknown event type (#22573)
e4cb223a7df is described below
commit e4cb223a7df5324e27ca3a875c4d7cb9fffc94a6
Author: Hongsheng Zhong <zh...@apache.org>
AuthorDate: Thu Dec 1 21:20:30 2022 +0800
Refactor MySQLBinlogEventType.valueOf to support unknown event type (#22573)
* Refactor MySQLBinlogEventType.valueOf to return Optional result
* Improve MySQLBinlogEventTypeTest
* Add more binlog event type
* Update binlog event type value from hexadecimal to decimal
---
.../mysql/constant/MySQLBinlogEventType.java | 94 ++++++++++++----------
.../mysql/constant/MySQLBinlogEventTypeTest.java | 21 ++++-
.../netty/MySQLBinlogEventPacketDecoder.java | 3 +-
3 files changed, 72 insertions(+), 46 deletions(-)
diff --git a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventType.java b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventType.java
index f52dc2efa59..faff6dc8dd2 100644
--- a/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventType.java
+++ b/db-protocol/mysql/src/main/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventType.java
@@ -17,93 +17,106 @@
package org.apache.shardingsphere.db.protocol.mysql.constant;
-import com.google.common.base.Preconditions;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
/**
* MySQL binlog event type.
*
* @see <a href="https://dev.mysql.com/doc/internals/en/binlog-event-type.html">Binlog Event Type</a>
+ * @see <a href="https://dev.mysql.com/doc/dev/mysql-server/latest/binlog__event_8h_source.html">binlog_event.h</a>
*/
@RequiredArgsConstructor
@Getter
public enum MySQLBinlogEventType {
- UNKNOWN_EVENT(0x00),
+ UNKNOWN_EVENT(0),
- START_EVENT_V3(0x01),
+ START_EVENT_V3(1),
- QUERY_EVENT(0x02),
+ QUERY_EVENT(2),
- STOP_EVENT(0x03),
+ STOP_EVENT(3),
- ROTATE_EVENT(0x04),
+ ROTATE_EVENT(4),
- INTVAR_EVENT(0x05),
+ INTVAR_EVENT(5),
- LOAD_EVENT(0x06),
+ LOAD_EVENT(6),
- SLAVE_EVENT(0x07),
+ SLAVE_EVENT(7),
- CREATE_FILE_EVENT(0x08),
+ CREATE_FILE_EVENT(8),
- APPEND_BLOCK_EVENT(0x09),
+ APPEND_BLOCK_EVENT(9),
- EXEC_LOAD_EVENT(0x0a),
+ EXEC_LOAD_EVENT(10),
- DELETE_FILE_EVENT(0x0b),
+ DELETE_FILE_EVENT(11),
- NEW_LOAD_EVENT(0x0c),
+ NEW_LOAD_EVENT(12),
- RAND_EVENT(0x0d),
+ RAND_EVENT(13),
- USER_VAR_EVENT(0x0e),
+ USER_VAR_EVENT(14),
- FORMAT_DESCRIPTION_EVENT(0x0f),
+ FORMAT_DESCRIPTION_EVENT(15),
- XID_EVENT(0x10),
+ XID_EVENT(16),
- BEGIN_LOAD_QUERY_EVENT(0x11),
+ BEGIN_LOAD_QUERY_EVENT(17),
- EXECUTE_LOAD_QUERY_EVENT(0x12),
+ EXECUTE_LOAD_QUERY_EVENT(18),
- TABLE_MAP_EVENT(0x13),
+ TABLE_MAP_EVENT(19),
- WRITE_ROWS_EVENTv0(0x14),
+ WRITE_ROWS_EVENTv0(20),
- UPDATE_ROWS_EVENTv0(0x15),
+ UPDATE_ROWS_EVENTv0(21),
- DELETE_ROWS_EVENTv0(0x16),
+ DELETE_ROWS_EVENTv0(22),
- WRITE_ROWS_EVENTv1(0x17),
+ WRITE_ROWS_EVENTv1(23),
- UPDATE_ROWS_EVENTv1(0x18),
+ UPDATE_ROWS_EVENTv1(24),
- DELETE_ROWS_EVENTv1(0x19),
+ DELETE_ROWS_EVENTv1(25),
- INCIDENT_EVENT(0x1a),
+ INCIDENT_EVENT(26),
- HEARTBEAT_EVENT(0x1b),
+ HEARTBEAT_LOG_EVENT(27),
- IGNORABLE_EVENT(0x1c),
+ IGNORABLE_LOG_EVENT(28),
- ROWS_QUERY_EVENT(0x1d),
+ ROWS_QUERY_LOG_EVENT(29),
- WRITE_ROWS_EVENTv2(0x1e),
+ WRITE_ROWS_EVENTv2(30),
- UPDATE_ROWS_EVENTv2(0x1f),
+ UPDATE_ROWS_EVENTv2(31),
- DELETE_ROWS_EVENTv2(0x20),
+ DELETE_ROWS_EVENTv2(32),
- GTID_EVENT(0x21),
+ GTID_LOG_EVENT(33),
- ANONYMOUS_GTID_EVENT(0x22),
+ ANONYMOUS_GTID_LOG_EVENT(34),
- PREVIOUS_GTIDS_EVENT(0x23);
+ PREVIOUS_GTIDS_LOG_EVENT(35),
+
+ TRANSACTION_CONTEXT_EVENT(36),
+
+ VIEW_CHANGE_EVENT(37),
+
+ XA_PREPARE_LOG_EVENT(38),
+
+ PARTIAL_UPDATE_ROWS_EVENT(39),
+
+ TRANSACTION_PAYLOAD_EVENT(40),
+
+ HEARTBEAT_LOG_EVENT_V2(41);
private static final Map<Integer, MySQLBinlogEventType> VALUE_AND_EVENT_TYPE_MAP = new HashMap<>(values().length, 1);
@@ -116,13 +129,12 @@ public enum MySQLBinlogEventType {
}
/**
- * Value of {@code MySQLBinlogEventType}.
+ * Get {@code MySQLBinlogEventType} by value.
*
* @param value value
* @return MySQL binlog event type
*/
- public static MySQLBinlogEventType valueOf(final int value) {
- Preconditions.checkArgument(VALUE_AND_EVENT_TYPE_MAP.containsKey(value), "Can not find value `%s` in binlog event type", value);
- return VALUE_AND_EVENT_TYPE_MAP.get(value);
+ public static Optional<MySQLBinlogEventType> valueOf(final int value) {
+ return Optional.ofNullable(VALUE_AND_EVENT_TYPE_MAP.get(value));
}
}
diff --git a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventTypeTest.java b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventTypeTest.java
index 964304764c6..fc29cb1f52d 100644
--- a/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventTypeTest.java
+++ b/db-protocol/mysql/src/test/java/org/apache/shardingsphere/db/protocol/mysql/constant/MySQLBinlogEventTypeTest.java
@@ -17,10 +17,14 @@
package org.apache.shardingsphere.db.protocol.mysql.constant;
+import org.junit.Test;
+
+import java.util.Optional;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
-
-import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
public final class MySQLBinlogEventTypeTest {
@@ -30,7 +34,16 @@ public final class MySQLBinlogEventTypeTest {
}
@Test
- public void assertValueOfByInt() {
- assertThat(MySQLBinlogEventType.valueOf(0x01), is(MySQLBinlogEventType.START_EVENT_V3));
+ public void assertValueOfValidType() {
+ for (MySQLBinlogEventType each : MySQLBinlogEventType.values()) {
+ Optional<MySQLBinlogEventType> eventType = MySQLBinlogEventType.valueOf(each.getValue());
+ assertTrue(eventType.isPresent());
+ assertThat(eventType.get().getValue(), is(each.getValue()));
+ }
+ }
+
+ @Test
+ public void assertValueOfInvalidType() {
+ assertFalse(MySQLBinlogEventType.valueOf(-1).isPresent());
}
}
diff --git a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/netty/MySQLBinlogEventPacketDecoder.java b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/netty/MySQLBinlogEventPacketDecoder.java
index 3cff626fac6..8da11701072 100644
--- a/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/netty/MySQLBinlogEventPacketDecoder.java
+++ b/kernel/data-pipeline/dialect/mysql/src/main/java/org/apache/shardingsphere/data/pipeline/mysql/ingest/client/netty/MySQLBinlogEventPacketDecoder.java
@@ -75,7 +75,8 @@ public final class MySQLBinlogEventPacketDecoder extends ByteToMessageDecoder {
}
private AbstractBinlogEvent decodeEvent(final MySQLPacketPayload payload, final MySQLBinlogEventHeader binlogEventHeader) {
- switch (MySQLBinlogEventType.valueOf(binlogEventHeader.getEventType())) {
+ MySQLBinlogEventType eventType = MySQLBinlogEventType.valueOf(binlogEventHeader.getEventType()).orElse(MySQLBinlogEventType.UNKNOWN_EVENT);
+ switch (eventType) {
case ROTATE_EVENT:
decodeRotateEvent(binlogEventHeader, payload);
return null;