You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2023/05/21 10:25:22 UTC

[shardingsphere] branch master updated: Refactor XAStatement (#25821)

This is an automated email from the ASF dual-hosted git repository.

panjuan 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 482e30c51f0 Refactor XAStatement (#25821)
482e30c51f0 is described below

commit 482e30c51f0e9de4bef4615a6f7754852b1ccdcf
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun May 21 18:25:13 2023 +0800

    Refactor XAStatement (#25821)
---
 .github/workflows/ci.yml                             |  2 +-
 .../client/netty/MySQLBinlogEventPacketDecoder.java  |  2 ++
 .../src/main/antlr4/imports/mysql/TCLStatement.g4    | 20 ++++++++++----------
 .../statement/type/MySQLTCLStatementVisitor.java     |  7 +------
 .../mysql/visitor/statement/MySQLXAVisitorTest.java  |  2 +-
 .../parser/sql/common/statement/tcl/XAStatement.java |  8 ++++----
 .../statement/mysql/tcl/MySQLXAStatement.java        |  4 ++++
 .../handler/transaction/TransactionXAHandler.java    | 11 +++++------
 .../prepare/MySQLComStmtPrepareCheckerTest.java      |  2 +-
 9 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3fc296c953c..c956b1af9b6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -51,7 +51,7 @@ concurrency:
   cancel-in-progress: true
 
 env:
-  MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Dmaven.javadoc.skip=true -Djacoco.skip=true
+  MAVEN_OPTS: -XX:+UseStringDeduplication -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3 -Dcheckstyle.skip=true -Dspotless.apply.skip=true -Dmaven.javadoc.skip=true -Djacoco.skip=true
   REPOSITORY_NAME: shardingsphere
 
 jobs:
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 ffe36f12b28..98079fc3c97 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
@@ -66,6 +66,8 @@ public final class MySQLBinlogEventPacketDecoder extends ByteToMessageDecoder {
             if (checkEventIntegrity(in, binlogEventHeader)) {
                 decodeEvent(binlogEventHeader, payload).ifPresent(out::add);
                 skipChecksum(binlogEventHeader.getEventType(), in);
+            } else {
+                break;
             }
         }
     }
diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/TCLStatement.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
index 9e8393a1c2a..00bb7524553 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
@@ -63,16 +63,6 @@ releaseSavepoint
     : RELEASE SAVEPOINT identifier
     ;
 
-xa
-    : XA ((START | BEGIN) xid (JOIN | RESUME)?
-        | END xid (SUSPEND (FOR MIGRATE)?)?
-        | PREPARE xid
-        | COMMIT xid (ONE PHASE)?
-        | ROLLBACK xid
-        | RECOVER (CONVERT XID)?
-    )
-    ;
-
 optionChain
     : AND NO? CHAIN
     ;
@@ -89,6 +79,16 @@ lockOption
     : READ LOCAL? | LOW_PRIORITY? WRITE
     ;
 
+xa
+    : XA ((START | BEGIN) xid (JOIN | RESUME)?
+        | END xid (SUSPEND (FOR MIGRATE)?)?
+        | PREPARE xid
+        | COMMIT xid (ONE PHASE)?
+        | ROLLBACK xid
+        | RECOVER (CONVERT XID)?
+    )
+    ;
+
 xid
     : gtrid=textString (COMMA_ bqual=textString (COMMA_ formatID=NUMBER_)?)?
     ;
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
index df637c937bc..35cf1303a8d 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
@@ -143,12 +143,7 @@ public final class MySQLTCLStatementVisitor extends MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitXa(final XaContext ctx) {
-        MySQLXAStatement result = new MySQLXAStatement();
-        result.setOp(ctx.getChild(1).getText().toUpperCase());
-        if (null != ctx.xid()) {
-            result.setXid(ctx.xid().getText());
-        }
-        return result;
+        return new MySQLXAStatement(ctx.getChild(1).getText().toUpperCase(), null == ctx.xid() ? null : ctx.xid().getText());
     }
     
     @Override
diff --git a/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLXAVisitorTest.java b/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLXAVisitorTest.java
index dc11e5883a3..90a1c465867 100644
--- a/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLXAVisitorTest.java
+++ b/parser/sql/dialect/mysql/src/test/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLXAVisitorTest.java
@@ -47,7 +47,7 @@ class MySQLXAVisitorTest {
         MySQLTCLStatementVisitor visitor = new MySQLTCLStatementVisitor();
         MySQLXAStatement xaStatement = (MySQLXAStatement) visitor.visitXa(parser.xa());
         assertThat("XA parse error.", parser.getNumberOfSyntaxErrors(), is(0));
-        assertThat("XA operation error.", xaStatement.getOp(), is(operation));
+        assertThat("XA operation error.", xaStatement.getOperator(), is(operation));
         assertThat("XA xid error.", xaStatement.getXid(), is(xid));
     }
     
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/tcl/XAStatement.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/tcl/XAStatement.java
index 8381e8d27d8..94b8992143e 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/tcl/XAStatement.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/tcl/XAStatement.java
@@ -18,17 +18,17 @@
 package org.apache.shardingsphere.sql.parser.sql.common.statement.tcl;
 
 import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
 
 /**
  * XA statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
 public abstract class XAStatement extends AbstractSQLStatement implements TCLStatement {
     
-    private String op;
+    private final String operator;
     
-    private String xid;
+    private final String xid;
 }
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/tcl/MySQLXAStatement.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/tcl/MySQLXAStatement.java
index f6e4f242bc3..c897c671c73 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/tcl/MySQLXAStatement.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/tcl/MySQLXAStatement.java
@@ -24,4 +24,8 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLSta
  * MySQL XA statement.
  */
 public final class MySQLXAStatement extends XAStatement implements MySQLStatement {
+    
+    public MySQLXAStatement(final String operator, final String xid) {
+        super(operator, xid);
+    }
 }
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java
index 7db34e8564c..0882e56836c 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/transaction/TransactionXAHandler.java
@@ -56,17 +56,17 @@ public final class TransactionXAHandler implements ProxyBackendHandler {
     
     @Override
     public boolean next() throws SQLException {
-        return "RECOVER".equals(tclStatement.getOp()) && backendHandler.next();
+        return "RECOVER".equals(tclStatement.getOperator()) && backendHandler.next();
     }
     
     @Override
     public QueryResponseRow getRowData() throws SQLException {
-        return "RECOVER".equals(tclStatement.getOp()) ? backendHandler.getRowData() : new QueryResponseRow(Collections.emptyList());
+        return "RECOVER".equals(tclStatement.getOperator()) ? backendHandler.getRowData() : new QueryResponseRow(Collections.emptyList());
     }
     
     @Override
     public ResponseHeader execute() throws SQLException {
-        switch (tclStatement.getOp()) {
+        switch (tclStatement.getOperator()) {
             case "START":
             case "BEGIN":
                 return begin();
@@ -78,13 +78,12 @@ public final class TransactionXAHandler implements ProxyBackendHandler {
             case "ROLLBACK":
                 return finish();
             default:
-                throw new SQLFeatureNotSupportedException(String.format("unrecognized XA statement `%s`", tclStatement.getOp()));
+                throw new SQLFeatureNotSupportedException(String.format("unrecognized XA statement `%s`", tclStatement.getOperator()));
         }
     }
     
     /*
-     * We have to let session occupy the thread when doing xa transaction.
-     * According to https://dev.mysql.com/doc/refman/5.7/en/xa-states.html XA and local transactions are mutually exclusive.
+     * We have to let session occupy the thread when doing xa transaction. According to https://dev.mysql.com/doc/refman/5.7/en/xa-states.html XA and local transactions are mutually exclusive.
      */
     private ResponseHeader begin() throws SQLException {
         ShardingSpherePreconditions.checkState(!connectionSession.getTransactionStatus().isInTransaction(), XATransactionNestedBeginException::new);
diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java
index da86fcf2541..c5d01dd7839 100644
--- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java
+++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java
@@ -91,7 +91,7 @@ class MySQLComStmtPrepareCheckerTest {
                 new MySQLShowErrorsStatement(), new MySQLShowBinlogEventsStatement(), new MySQLShowCreateProcedureStatement(), new MySQLShowCreateFunctionStatement(),
                 new MySQLShowCreateEventStatement(),
                 new MySQLShowCreateTableStatement(), new MySQLShowCreateViewStatement(), new MySQLShowBinaryLogsStatement(), new MySQLShowStatusStatement(), new MySQLStartSlaveStatement(),
-                new MySQLStopSlaveStatement(), new MySQLTruncateStatement(), new MySQLUninstallPluginStatement(), new MySQLUpdateStatement(), new MySQLXAStatement());
+                new MySQLStopSlaveStatement(), new MySQLTruncateStatement(), new MySQLUninstallPluginStatement(), new MySQLUpdateStatement(), new MySQLXAStatement("END", null));
         for (SQLStatement each : sqlStatements) {
             assertTrue(MySQLComStmtPrepareChecker.isStatementAllowed(each));
         }