You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@seata.apache.org by ji...@apache.org on 2024/07/31 08:33:02 UTC
(incubator-seata) branch 2.x updated: bugfix: undolog rollback info more than 64MB (#6483)
This is an automated email from the ASF dual-hosted git repository.
jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git
The following commit(s) were added to refs/heads/2.x by this push:
new 864348ae74 bugfix: undolog rollback info more than 64MB (#6483)
864348ae74 is described below
commit 864348ae747ea2a4ada6826a382c731ce0e72557
Author: jsbxyyx <js...@apache.org>
AuthorDate: Wed Jul 31 16:32:58 2024 +0800
bugfix: undolog rollback info more than 64MB (#6483)
---
changes/en-us/2.x.md | 3 +
changes/zh-cn/2.x.md | 3 +-
.../apache/seata/common/util/CollectionUtils.java | 4 +-
.../apache/seata/common/util}/UUIDGenerator.java | 7 +-
.../main/resources/error/ErrorCode_en.properties | 1 +
.../seata/rm/datasource/DataSourceProxy.java | 43 +++---
.../rm/datasource/undo/AbstractUndoExecutor.java | 11 +-
.../rm/datasource/undo/AbstractUndoLogManager.java | 145 +++++++++++++++++----
.../seata/rm/datasource/undo/UndoLogConstants.java | 8 ++
.../datasource/undo/mysql/MySQLUndoLogManager.java | 96 +++++++++++++-
.../rm/datasource/undo/UndoLogManagerTest.java | 18 +--
.../main/java/org/apache/seata/server/Server.java | 1 +
.../apache/seata/server/session/GlobalSession.java | 2 +-
.../apache/seata/server/session/SessionHelper.java | 2 +-
server/src/test/java/ServerTest.java | 2 +-
.../seata/server/UUIDGeneratorOverflowTest.java | 1 +
.../apache/seata/server/lock/LockManagerTest.java | 2 +-
.../server/lock/file/FileLockManagerImplTest.java | 2 +-
.../seata/server/session/BranchSessionTest.java | 2 +-
.../session/db/DataBaseSessionManagerTest.java | 2 +-
.../session/redis/RedisSessionManagerTest.java | 2 +-
.../file/FileTransactionStoreManagerTest.java | 2 +-
.../apache/seata/mockserver/MockCoordinator.java | 2 +-
.../org/apache/seata/mockserver/MockServer.java | 2 +-
.../apache/seata/at/mysql/MysqlUpdateJoinTest.java | 2 +-
.../seata/core/rpc/netty/TmNettyClientTest.java | 2 +-
.../seata/saga/engine/db/AbstractServerTest.java | 2 +-
.../engine/mock/MockSagaTransactionTemplate.java | 2 +-
28 files changed, 295 insertions(+), 76 deletions(-)
diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 838c1568e3..17be2ff15e 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -13,11 +13,13 @@ Add changes here for all PR submitted to the 2.x branch.
- [[#6626](https://github.com/apache/incubator-seata/pull/6626)] fix hsf ConsumerModel convert error
- [[#6642](https://github.com/apache/incubator-seata/pull/6642)] codecov token not found
- [[#6661](https://github.com/apache/incubator-seata/pull/6661)] fix `tableMeta` cache scheduled refresh issue
+- [[#6486](https://github.com/apache/incubator-seata/pull/6486)] fix mysql undo log update sql data more than max allowed packet
- [[#6668](https://github.com/apache/incubator-seata/pull/6668)] thread safety issue when adding and removing instances
- [[#6678](https://github.com/apache/incubator-seata/pull/6678)] fix the same record has different lowkeys due to mixed case of table names yesterday
- [[#6697](https://github.com/apache/incubator-seata/pull/6697)] v0 ByteBuf should not decode by super class
- [[#6707](https://github.com/apache/incubator-seata/pull/6707)] fix readonly branch commit errors in Oracle XA transactions
+
### optimize:
- [[#6499](https://github.com/apache/incubator-seata/pull/6499)] split the task thread pool for committing and rollbacking statuses
- [[#6208](https://github.com/apache/incubator-seata/pull/6208)] optimize : load SeataSerializer by version
@@ -63,6 +65,7 @@ Thanks to these contributors for their code commits. Please report an unintended
- [xjlgod](https://github.com/xjlgod)
- [xingfudeshi](https://github.com/xingfudeshi)
- [wuwen5](https://github.com/wuwen5)
+- [jsbxyyx](https://github.com/jsbxyyx)
- [iAmClever](https://github.com/iAmClever)
- [GoodBoyCoder](https://github.com/GoodBoyCoder)
- [liuqiufeng](https://github.com/liuqiufeng)
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index 63f9a01fd9..ac21a3cd7f 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -15,12 +15,12 @@
- [[#6640](https://github.com/apache/incubator-seata/pull/6640)] 优化codecov相关配置
- [[#6642](https://github.com/apache/incubator-seata/pull/6642)] 修复codecov token找不到导致无法提交单测覆盖度报告
- [[#6661](https://github.com/apache/incubator-seata/pull/6661)] 修复`tableMeta`缓存定时刷新失效问题
+- [[#6486](https://github.com/apache/incubator-seata/pull/6486)] 修复在mysql数据库下undo_log sql数据超过最大包大小错误
- [[#6668](https://github.com/apache/incubator-seata/pull/6668)] 解决namingserver同一个集群下instance添加和删除时的线程安全问题
- [[#6678](https://github.com/apache/incubator-seata/pull/6678)] 修复由于表名大小写问题导致的相同记录生成不同RowKey的问题
- [[#6697](https://github.com/apache/incubator-seata/pull/6697)] v0版本的ByteBuf不应由父类先解码
- [[#6707](https://github.com/apache/incubator-seata/pull/6707)] 修复Oracle XA事务中只读分支提交出错的问题
-
### optimize:
- [[#6499](https://github.com/apache/incubator-seata/pull/6499)] 拆分 committing 和 rollbacking 状态的任务线程池
- [[#6208](https://github.com/apache/incubator-seata/pull/6208)] 支持多版本的Seata序列化
@@ -69,6 +69,7 @@
- [xjlgod](https://github.com/xjlgod)
- [xingfudeshi](https://github.com/xingfudeshi)
- [wuwen5](https://github.com/wuwen5)
+- [jsbxyyx](https://github.com/jsbxyyx)
- [iAmClever](https://github.com/iAmClever)
- [GoodBoyCoder](https://github.com/GoodBoyCoder)
- [liuqiufeng](https://github.com/liuqiufeng)
diff --git a/common/src/main/java/org/apache/seata/common/util/CollectionUtils.java b/common/src/main/java/org/apache/seata/common/util/CollectionUtils.java
index 1c8c3b2b41..244b490006 100644
--- a/common/src/main/java/org/apache/seata/common/util/CollectionUtils.java
+++ b/common/src/main/java/org/apache/seata/common/util/CollectionUtils.java
@@ -203,9 +203,9 @@ public class CollectionUtils {
}
}
- private static final String KV_SPLIT = "=";
+ public static final String KV_SPLIT = "=";
- private static final String PAIR_SPLIT = "&";
+ public static final String PAIR_SPLIT = "&";
/**
* Encode map to string
diff --git a/server/src/main/java/org/apache/seata/server/UUIDGenerator.java b/common/src/main/java/org/apache/seata/common/util/UUIDGenerator.java
similarity index 94%
rename from server/src/main/java/org/apache/seata/server/UUIDGenerator.java
rename to common/src/main/java/org/apache/seata/common/util/UUIDGenerator.java
index 0cd316bbff..542de3ed1e 100644
--- a/server/src/main/java/org/apache/seata/server/UUIDGenerator.java
+++ b/common/src/main/java/org/apache/seata/common/util/UUIDGenerator.java
@@ -14,13 +14,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.seata.server;
-
-import org.apache.seata.common.util.IdWorker;
+package org.apache.seata.common.util;
/**
* The type Uuid generator.
- *
*/
public class UUIDGenerator {
@@ -28,6 +25,7 @@ public class UUIDGenerator {
/**
* generate UUID using snowflake algorithm
+ *
* @return UUID
*/
public static long generateUUID() {
@@ -43,6 +41,7 @@ public class UUIDGenerator {
/**
* init IdWorker
+ *
* @param serverNode the server node id, consider as machine id in snowflake
*/
public static void init(Long serverNode) {
diff --git a/common/src/main/resources/error/ErrorCode_en.properties b/common/src/main/resources/error/ErrorCode_en.properties
index 424ac23455..9019ccd185 100644
--- a/common/src/main/resources/error/ErrorCode_en.properties
+++ b/common/src/main/resources/error/ErrorCode_en.properties
@@ -14,6 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+
ERR_PREFIX=ERR-CODE: [Seata-{code}][{key}]
ERR_POSTFIX=More: [https://seata.apache.org/docs/next/overview/faq#{code}]
ERR_CONFIG=config error, {0}
diff --git a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/DataSourceProxy.java b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/DataSourceProxy.java
index e13b0b96dd..dfab706294 100644
--- a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/DataSourceProxy.java
+++ b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/DataSourceProxy.java
@@ -20,6 +20,8 @@ import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
import javax.sql.DataSource;
@@ -66,6 +68,8 @@ public class DataSourceProxy extends AbstractDataSourceProxy implements Resource
private String productVersion;
+ private final Map<String, String> variables = new HashMap<>();
+
/**
* POLARDB-X 1.X -> TDDL
* POLARDB-X 2.X & MySQL 5.6 -> PXC
@@ -399,27 +403,36 @@ public class DataSourceProxy extends AbstractDataSourceProxy implements Resource
return kernelVersion;
}
+ public String getVariableValue(String name) {
+ return variables.get(name);
+ }
+
private void validMySQLVersion(Connection connection) {
if (!JdbcConstants.MYSQL.equals(dbType)) {
return;
}
- try (PreparedStatement preparedStatement = connection.prepareStatement("SELECT VERSION()");
- ResultSet versionResult = preparedStatement.executeQuery()) {
- if (versionResult.next()) {
- String version = versionResult.getString("VERSION()");
- if (StringUtils.isBlank(version)) {
- return;
- }
- int dashIdx = version.indexOf('-');
- // in mysql: 5.6.45, in polardb-x: 5.6.45-TDDL-xxx
- if (dashIdx > 0) {
- kernelVersion = version.substring(0, dashIdx);
- productVersion = version.substring(dashIdx + 1);
- } else {
- kernelVersion = version;
- productVersion = version;
+ try (PreparedStatement preparedStatement = connection.prepareStatement("SHOW VARIABLES");
+ ResultSet rs = preparedStatement.executeQuery()) {
+ while (rs.next()) {
+ String name = rs.getString(1);
+ String value = rs.getString(2);
+ if (StringUtils.isNotBlank(name)) {
+ variables.put(name.toLowerCase(), value);
}
}
+ String version = variables.get("version");
+ if (StringUtils.isBlank(version)) {
+ return;
+ }
+ int dashIdx = version.indexOf('-');
+ // in mysql: 5.6.45, in polardb-x: 5.6.45-TDDL-xxx
+ if (dashIdx > 0) {
+ kernelVersion = version.substring(0, dashIdx);
+ productVersion = version.substring(dashIdx + 1);
+ } else {
+ kernelVersion = version;
+ productVersion = version;
+ }
} catch (Exception e) {
LOGGER.error("check mysql version fail error: {}", e.getMessage());
}
diff --git a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoExecutor.java b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoExecutor.java
index 1bfd90866b..d964c5469c 100644
--- a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoExecutor.java
+++ b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoExecutor.java
@@ -16,6 +16,7 @@
*/
package org.apache.seata.rm.datasource.undo;
+import java.io.ByteArrayInputStream;
import java.sql.Array;
import java.sql.Connection;
import java.sql.JDBCType;
@@ -33,7 +34,6 @@ import javax.sql.rowset.serial.SerialDatalink;
import com.alibaba.fastjson.JSON;
-import org.apache.seata.common.util.BlobUtils;
import org.apache.seata.common.util.IOUtil;
import org.apache.seata.common.util.StringUtils;
import org.apache.seata.config.ConfigurationFactory;
@@ -169,7 +169,14 @@ public abstract class AbstractUndoExecutor {
if (type == JDBCType.BLOB.getVendorTypeNumber()) {
SerialBlob serialBlob = (SerialBlob) value;
if (serialBlob != null) {
- undoPST.setBytes(undoIndex, BlobUtils.blob2Bytes(serialBlob));
+ undoPST.setObject(undoIndex, serialBlob.getBinaryStream());
+ } else {
+ undoPST.setObject(undoIndex, null);
+ }
+ } else if (type == JDBCType.LONGVARBINARY.getVendorTypeNumber()) {
+ if (value != null) {
+ byte[] bytes = (byte[]) value;
+ undoPST.setObject(undoIndex, new ByteArrayInputStream(bytes));
} else {
undoPST.setObject(undoIndex, null);
}
diff --git a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoLogManager.java b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoLogManager.java
index 69fc501a72..d9ba6bb3f3 100644
--- a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoLogManager.java
+++ b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/AbstractUndoLogManager.java
@@ -22,6 +22,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -30,6 +31,7 @@ import java.util.Set;
import org.apache.seata.common.Constants;
import org.apache.seata.common.util.CollectionUtils;
import org.apache.seata.common.util.SizeUtil;
+import org.apache.seata.common.util.StringUtils;
import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.compressor.CompressorFactory;
import org.apache.seata.core.compressor.CompressorType;
@@ -37,6 +39,7 @@ import org.apache.seata.core.constants.ClientTableColumnsName;
import org.apache.seata.core.constants.ConfigurationKeys;
import org.apache.seata.core.exception.BranchTransactionException;
import org.apache.seata.core.exception.TransactionException;
+import org.apache.seata.core.rpc.processor.Pair;
import org.apache.seata.rm.datasource.ConnectionContext;
import org.apache.seata.rm.datasource.ConnectionProxy;
import org.apache.seata.rm.datasource.DataSourceProxy;
@@ -80,22 +83,25 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
}
protected static final String UNDO_LOG_TABLE_NAME = ConfigurationFactory.getInstance().getConfig(
- ConfigurationKeys.TRANSACTION_UNDO_LOG_TABLE, DEFAULT_TRANSACTION_UNDO_LOG_TABLE);
+ ConfigurationKeys.TRANSACTION_UNDO_LOG_TABLE, DEFAULT_TRANSACTION_UNDO_LOG_TABLE);
private static final String CHECK_UNDO_LOG_TABLE_EXIST_SQL = "SELECT 1 FROM " + UNDO_LOG_TABLE_NAME + " LIMIT 1";
protected static final String SELECT_UNDO_LOG_SQL = "SELECT * FROM " + UNDO_LOG_TABLE_NAME + " WHERE "
- + ClientTableColumnsName.UNDO_LOG_BRANCH_XID + " = ? AND " + ClientTableColumnsName.UNDO_LOG_XID
- + " = ? FOR UPDATE";
+ + ClientTableColumnsName.UNDO_LOG_BRANCH_XID + " = ? AND " + ClientTableColumnsName.UNDO_LOG_XID
+ + " = ? FOR UPDATE";
protected static final String DELETE_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + " WHERE "
- + ClientTableColumnsName.UNDO_LOG_BRANCH_XID + " = ? AND " + ClientTableColumnsName.UNDO_LOG_XID + " = ?";
+ + ClientTableColumnsName.UNDO_LOG_BRANCH_XID + " = ? AND " + ClientTableColumnsName.UNDO_LOG_XID + " = ?";
+
+ protected static final String DELETE_SUB_UNDO_LOG_SQL = "DELETE FROM " + UNDO_LOG_TABLE_NAME + " WHERE "
+ + ClientTableColumnsName.UNDO_LOG_CONTEXT + " = ? AND " + ClientTableColumnsName.UNDO_LOG_XID + " = ?";
protected static final boolean ROLLBACK_INFO_COMPRESS_ENABLE = ConfigurationFactory.getInstance().getBoolean(
- ConfigurationKeys.CLIENT_UNDO_COMPRESS_ENABLE, DEFAULT_CLIENT_UNDO_COMPRESS_ENABLE);
+ ConfigurationKeys.CLIENT_UNDO_COMPRESS_ENABLE, DEFAULT_CLIENT_UNDO_COMPRESS_ENABLE);
protected static final CompressorType ROLLBACK_INFO_COMPRESS_TYPE = CompressorType.getByName(ConfigurationFactory.getInstance().getConfig(
- ConfigurationKeys.CLIENT_UNDO_COMPRESS_TYPE, DEFAULT_CLIENT_UNDO_COMPRESS_TYPE));
+ ConfigurationKeys.CLIENT_UNDO_COMPRESS_TYPE, DEFAULT_CLIENT_UNDO_COMPRESS_TYPE));
protected static final long ROLLBACK_INFO_COMPRESS_THRESHOLD = SizeUtil.size2Long(ConfigurationFactory.getInstance().getConfig(
ConfigurationKeys.CLIENT_UNDO_COMPRESS_THRESHOLD, DEFAULT_CLIENT_UNDO_COMPRESS_THRESHOLD));
@@ -124,10 +130,15 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
*/
@Override
public void deleteUndoLog(String xid, long branchId, Connection conn) throws SQLException {
- try (PreparedStatement deletePST = conn.prepareStatement(DELETE_UNDO_LOG_SQL)) {
+ try (PreparedStatement deletePST = conn.prepareStatement(DELETE_UNDO_LOG_SQL);
+ PreparedStatement deleteSubPST = conn.prepareStatement(DELETE_SUB_UNDO_LOG_SQL)) {
deletePST.setLong(1, branchId);
deletePST.setString(2, xid);
deletePST.executeUpdate();
+
+ deleteSubPST.setString(1, UndoLogConstants.BRANCH_ID_KEY + CollectionUtils.KV_SPLIT + branchId);
+ deleteSubPST.setString(2, xid);
+ deleteSubPST.executeUpdate();
} catch (Exception e) {
if (!(e instanceof SQLException)) {
e = new SQLException(e);
@@ -139,9 +150,9 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
/**
* batch Delete undo log.
*
- * @param xids xid
+ * @param xids xid
* @param branchIds branch Id
- * @param conn connection
+ * @param conn connection
*/
@Override
public void batchDeleteUndoLog(Set<String> xids, Set<Long> branchIds, Connection conn) throws SQLException {
@@ -151,18 +162,28 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
int xidSize = xids.size();
int branchIdSize = branchIds.size();
String batchDeleteSql = toBatchDeleteUndoLogSql(xidSize, branchIdSize);
- try (PreparedStatement deletePST = conn.prepareStatement(batchDeleteSql)) {
+ String batchDeleteSubSql = toBatchDeleteSubUndoLogSql(xidSize, branchIdSize);
+ try (PreparedStatement deletePST = conn.prepareStatement(batchDeleteSql);
+ PreparedStatement deleteSubPST = conn.prepareStatement(batchDeleteSubSql)) {
int paramsIndex = 1;
for (Long branchId : branchIds) {
- deletePST.setLong(paramsIndex++, branchId);
+ deletePST.setLong(paramsIndex, branchId);
+ deleteSubPST.setString(paramsIndex, UndoLogConstants.BRANCH_ID_KEY + CollectionUtils.KV_SPLIT + branchId);
+ paramsIndex++;
}
for (String xid : xids) {
- deletePST.setString(paramsIndex++, xid);
+ deletePST.setString(paramsIndex, xid);
+ deleteSubPST.setString(paramsIndex, xid);
+ paramsIndex++;
}
int deleteRows = deletePST.executeUpdate();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("batch delete undo log size {}", deleteRows);
}
+ int deleteSubRows = deleteSubPST.executeUpdate();
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("batch delete sub undo log size {}", deleteSubRows);
+ }
} catch (Exception e) {
if (!(e instanceof SQLException)) {
e = new SQLException(e);
@@ -174,7 +195,17 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
protected static String toBatchDeleteUndoLogSql(int xidSize, int branchIdSize) {
StringBuilder sqlBuilder = new StringBuilder(64);
sqlBuilder.append("DELETE FROM ").append(UNDO_LOG_TABLE_NAME).append(" WHERE ").append(
- ClientTableColumnsName.UNDO_LOG_BRANCH_XID).append(" IN ");
+ ClientTableColumnsName.UNDO_LOG_BRANCH_XID).append(" IN ");
+ appendInParam(branchIdSize, sqlBuilder);
+ sqlBuilder.append(" AND ").append(ClientTableColumnsName.UNDO_LOG_XID).append(" IN ");
+ appendInParam(xidSize, sqlBuilder);
+ return sqlBuilder.toString();
+ }
+
+ protected static String toBatchDeleteSubUndoLogSql(int xidSize, int branchIdSize) {
+ StringBuilder sqlBuilder = new StringBuilder(64);
+ sqlBuilder.append("DELETE FROM ").append(UNDO_LOG_TABLE_NAME).append(" WHERE ").append(
+ ClientTableColumnsName.UNDO_LOG_CONTEXT).append(" IN ");
appendInParam(branchIdSize, sqlBuilder);
sqlBuilder.append(" AND ").append(ClientTableColumnsName.UNDO_LOG_XID).append(" IN ");
appendInParam(xidSize, sqlBuilder);
@@ -196,10 +227,19 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
return state == State.Normal.getValue();
}
- protected String buildContext(String serializer, CompressorType compressorType) {
+ protected String buildContext(String serializer, CompressorType compressorType, String... others) {
Map<String, String> map = new HashMap<>(2, 1.01f);
map.put(UndoLogConstants.SERIALIZER_KEY, serializer);
map.put(UndoLogConstants.COMPRESSOR_TYPE_KEY, compressorType.name());
+ if (others != null && others.length > 0 && others.length % 2 == 0) {
+ for (int i = 0; i < others.length; ) {
+ String key = others[i++];
+ String value = others[i++];
+ if (key != null) {
+ map.put(key, value == null ? "" : value);
+ }
+ }
+ }
return CollectionUtils.encodeMap(map);
}
@@ -240,8 +280,15 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
compressorType = ROLLBACK_INFO_COMPRESS_TYPE;
undoLogContent = CompressorFactory.getCompressor(compressorType.getCode()).compress(undoLogContent);
}
-
- insertUndoLogWithNormal(xid, branchId, buildContext(parser.getName(), compressorType), undoLogContent, cp.getTargetConnection());
+ String maxAllowedPacket = getMaxAllowedPacket(cp.getDataSourceProxy());
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("resourceId: [{}] max_allowed_packet:[{}]", cp.getDataSourceProxy().getResourceId(), maxAllowedPacket);
+ }
+ String rollbackCtx = buildContext(
+ parser.getName(), compressorType,
+ UndoLogConstants.MAX_ALLOWED_PACKET, maxAllowedPacket
+ );
+ insertUndoLogWithNormal(xid, branchId, rollbackCtx, undoLogContent, cp.getTargetConnection());
}
/**
@@ -298,7 +345,7 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
String serializer = context == null ? null : context.get(UndoLogConstants.SERIALIZER_KEY);
UndoLogParser parser = serializer == null ? UndoLogParserFactory.getInstance()
- : UndoLogParserFactory.getInstance(serializer);
+ : UndoLogParserFactory.getInstance(serializer);
BranchUndoLog branchUndoLog = parser.decode(rollbackInfo);
try {
@@ -310,10 +357,10 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
}
for (SQLUndoLog sqlUndoLog : sqlUndoLogs) {
TableMeta tableMeta = TableMetaCacheFactory.getTableMetaCache(dataSourceProxy.getDbType()).getTableMeta(
- conn, sqlUndoLog.getTableName(), dataSourceProxy.getResourceId());
+ conn, sqlUndoLog.getTableName(), dataSourceProxy.getResourceId());
sqlUndoLog.setTableMeta(tableMeta);
AbstractUndoExecutor undoExecutor = UndoExecutorFactory.getUndoExecutor(
- dataSourceProxy.getDbType(), sqlUndoLog);
+ dataSourceProxy.getDbType(), sqlUndoLog);
undoExecutor.executeOn(connectionProxy);
}
} finally {
@@ -336,14 +383,14 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
conn.commit();
if (LOGGER.isInfoEnabled()) {
LOGGER.info("xid {} branch {}, undo_log deleted with {}", xid, branchId,
- State.GlobalFinished.name());
+ State.GlobalFinished.name());
}
} else {
insertUndoLogWithGlobalFinished(xid, branchId, UndoLogParserFactory.getInstance(), conn);
conn.commit();
if (LOGGER.isInfoEnabled()) {
LOGGER.info("xid {} branch {}, undo_log added with {}", xid, branchId,
- State.GlobalFinished.name());
+ State.GlobalFinished.name());
}
}
@@ -363,13 +410,13 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
}
if (e instanceof SQLUndoDirtyException) {
throw new BranchTransactionException(BranchRollbackFailed_Unretriable, String.format(
- "Branch session rollback failed because of dirty undo log, please delete the relevant undolog after manually calibrating the data. xid = %s branchId = %s",
- xid, branchId), e);
+ "Branch session rollback failed because of dirty undo log, please delete the relevant undolog after manually calibrating the data. xid = %s branchId = %s",
+ xid, branchId), e);
}
throw new BranchTransactionException(BranchRollbackFailed_Retriable,
- String.format("Branch session rollback failed and try again later xid = %s branchId = %s %s", xid,
- branchId, e.getMessage()),
- e);
+ String.format("Branch session rollback failed and try again later xid = %s branchId = %s %s", xid,
+ branchId, e.getMessage()),
+ e);
} finally {
try {
@@ -426,6 +473,16 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
protected abstract void insertUndoLogWithNormal(String xid, long branchId, String rollbackCtx, byte[] undoLogContent,
Connection conn) throws SQLException;
+ /**
+ * get database server max allowed packet
+ *
+ * @param dataSourceProxy the datasource proxy
+ * @return the max allowed packet value
+ */
+ protected String getMaxAllowedPacket(DataSourceProxy dataSourceProxy) {
+ return StringUtils.EMPTY;
+ }
+
/**
* RollbackInfo to bytes
*
@@ -433,18 +490,52 @@ public abstract class AbstractUndoLogManager implements UndoLogManager {
* @return rollback info
* @throws SQLException SQLException
*/
- protected byte[] getRollbackInfo(ResultSet rs) throws SQLException {
+ protected byte[] getRollbackInfo(ResultSet rs) throws SQLException {
byte[] rollbackInfo = rs.getBytes(ClientTableColumnsName.UNDO_LOG_ROLLBACK_INFO);
String rollbackInfoContext = rs.getString(ClientTableColumnsName.UNDO_LOG_CONTEXT);
Map<String, String> context = CollectionUtils.decodeMap(rollbackInfoContext);
+ String subIds = context.get(UndoLogConstants.SUB_ID_KEY);
+ if (StringUtils.isNotBlank(subIds)) {
+ Pair<Integer, List<byte[]>> pair = getSubRollbackInfo(rs.getStatement().getConnection(),
+ subIds, rs.getLong(ClientTableColumnsName.UNDO_LOG_BRANCH_XID),
+ rs.getString(ClientTableColumnsName.UNDO_LOG_XID));
+ int total = pair.getFirst();
+ byte[] rollbackInfoTotal = new byte[rollbackInfo.length + total];
+ System.arraycopy(rollbackInfo, 0, rollbackInfoTotal, 0, rollbackInfo.length);
+ int pos = rollbackInfo.length;
+ for (byte[] bytes : pair.getSecond()) {
+ System.arraycopy(bytes, 0, rollbackInfoTotal, pos, bytes.length);
+ pos += bytes.length;
+ }
+ rollbackInfo = rollbackInfoTotal;
+ }
CompressorType compressorType = CompressorType.getByName(context.getOrDefault(UndoLogConstants.COMPRESSOR_TYPE_KEY,
CompressorType.NONE.name()));
return CompressorFactory.getCompressor(compressorType.getCode()).decompress(rollbackInfo);
}
+ @Override
+ public int deleteUndoLogByLogCreated(Date logCreated, int limitRows, Connection conn) throws SQLException {
+ return 0;
+ }
+
+ /**
+ * get sub rollback info
+ * @param conn the database connection
+ * @param subIds sub rollback info id
+ * @param branchId the branch id
+ * @param xid the xid
+ * @return first: sub rollback info size, seconds: rollback info bytes
+ * @throws SQLException SQLException
+ */
+ protected Pair<Integer, List<byte[]>> getSubRollbackInfo(Connection conn, String subIds, Long branchId, String xid) throws SQLException {
+ throw new UnsupportedOperationException("getSubRollbackInfo is not implemented");
+ }
+
/**
* if the undoLogContent is big enough to be compress
+ *
* @param undoLogContent undoLogContent
* @return boolean
*/
diff --git a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/UndoLogConstants.java b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/UndoLogConstants.java
index e26fe99c34..1ae34682d6 100644
--- a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/UndoLogConstants.java
+++ b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/UndoLogConstants.java
@@ -30,4 +30,12 @@ public interface UndoLogConstants {
.getConfig(ConfigurationKeys.TRANSACTION_UNDO_LOG_SERIALIZATION, DEFAULT_TRANSACTION_UNDO_LOG_SERIALIZATION);
String COMPRESSOR_TYPE_KEY = "compressorType";
+
+ String SUB_ID_KEY = "subId";
+
+ String BRANCH_ID_KEY = "branchId";
+
+ String SUB_SPLIT_KEY = ",";
+
+ String MAX_ALLOWED_PACKET = "map";
}
diff --git a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManager.java b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManager.java
index 8e32511059..bc299af723 100644
--- a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManager.java
+++ b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/undo/mysql/MySQLUndoLogManager.java
@@ -16,15 +16,28 @@
*/
package org.apache.seata.rm.datasource.undo.mysql;
+import java.io.ByteArrayInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.lang.StringUtils;
import org.apache.seata.common.loader.LoadLevel;
+import org.apache.seata.common.util.CollectionUtils;
+import org.apache.seata.common.util.IOUtil;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.core.compressor.CompressorType;
import org.apache.seata.core.constants.ClientTableColumnsName;
+import org.apache.seata.core.rpc.processor.Pair;
+import org.apache.seata.rm.datasource.DataSourceProxy;
import org.apache.seata.rm.datasource.undo.AbstractUndoLogManager;
+import org.apache.seata.rm.datasource.undo.UndoLogConstants;
import org.apache.seata.rm.datasource.undo.UndoLogParser;
import org.apache.seata.sqlparser.util.JdbcConstants;
import org.slf4j.Logger;
@@ -67,10 +80,89 @@ public class MySQLUndoLogManager extends AbstractUndoLogManager {
}
}
+ @Override
+ protected Pair<Integer, List<byte[]>> getSubRollbackInfo(Connection conn, String subIds, Long branchId, String xid) throws SQLException {
+ if (StringUtils.isBlank(subIds)) {
+ return new Pair<>(0, Collections.emptyList());
+ }
+ StringBuilder sqlBuilder = new StringBuilder(64);
+ sqlBuilder.append("SELECT * FROM ").append(UNDO_LOG_TABLE_NAME).append(" WHERE ")
+ .append(ClientTableColumnsName.UNDO_LOG_BRANCH_XID).append(" IN ");
+ String[] split = StringUtils.split(subIds, UndoLogConstants.SUB_SPLIT_KEY);
+ appendInParam(split.length, sqlBuilder);
+ sqlBuilder.append(" AND ").append(ClientTableColumnsName.UNDO_LOG_XID).append(" = ?");
+
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+ try {
+ ps = conn.prepareStatement(sqlBuilder.toString());
+ int idx = 1;
+ for (String subId : split) {
+ ps.setLong(idx++, Long.parseLong(subId));
+ }
+ ps.setString(idx, xid);
+ rs = ps.executeQuery();
+ int total = 0;
+ List<byte[]> bytesList = new ArrayList<>();
+ while (rs.next()) {
+ byte[] bytes = rs.getBytes(ClientTableColumnsName.UNDO_LOG_ROLLBACK_INFO);
+ bytesList.add(bytes);
+ total += bytes.length;
+ }
+ return new Pair<>(total, bytesList);
+ } catch (Exception e) {
+ if (!(e instanceof SQLException)) {
+ e = new SQLException(e);
+ }
+ throw (SQLException) e;
+ } finally {
+ IOUtil.close(rs, ps);
+ }
+ }
+
+ @Override
+ protected String getMaxAllowedPacket(DataSourceProxy dataSourceProxy) {
+ return dataSourceProxy.getVariableValue("max_allowed_packet");
+ }
+
@Override
protected void insertUndoLogWithNormal(String xid, long branchId, String rollbackCtx, byte[] undoLogContent,
Connection conn) throws SQLException {
- insertUndoLog(xid, branchId, rollbackCtx, undoLogContent, State.Normal, conn);
+ Map<String, String> decodeMap = CollectionUtils.decodeMap(rollbackCtx);
+ String maxAllowedPacketStr = decodeMap.get(UndoLogConstants.MAX_ALLOWED_PACKET);
+ long maxAllowedPacket = 1024 * 1024; // 1MB -> mysql5.6 default value
+ if (StringUtils.isNotBlank(maxAllowedPacketStr)) {
+ maxAllowedPacket = Long.parseLong(maxAllowedPacketStr);
+ }
+
+ int limit = (int) (maxAllowedPacket * 0.8);
+ if (logger.isDebugEnabled()) {
+ logger.debug("undo log length : [{}] limit : [{}]", undoLogContent.length, limit);
+ }
+ if (undoLogContent.length > limit) {
+ final String subRollbackCtx = UndoLogConstants.BRANCH_ID_KEY + CollectionUtils.KV_SPLIT + branchId;
+ int pos = 0;
+ byte[] first = new byte[limit];
+ StringBuilder subIdBuilder = new StringBuilder(36);
+ while (pos < undoLogContent.length) {
+ if (pos == 0) {
+ System.arraycopy(undoLogContent, pos, first, 0, first.length);
+ pos += first.length;
+ } else {
+ byte[] bytes = new byte[Math.min(undoLogContent.length - pos, limit)];
+ System.arraycopy(undoLogContent, pos, bytes, 0, bytes.length);
+ long subId = UUIDGenerator.generateUUID();
+ subIdBuilder.append(subId).append(UndoLogConstants.SUB_SPLIT_KEY);
+ insertUndoLog(xid, subId, subRollbackCtx, bytes, State.Normal, conn);
+ pos += bytes.length;
+ }
+ }
+ decodeMap.put(UndoLogConstants.SUB_ID_KEY, subIdBuilder.toString());
+ String finalRollbackCtx = CollectionUtils.encodeMap(decodeMap);
+ insertUndoLog(xid, branchId, finalRollbackCtx, first, State.Normal, conn);
+ } else {
+ insertUndoLog(xid, branchId, rollbackCtx, undoLogContent, State.Normal, conn);
+ }
}
@Override
@@ -84,7 +176,7 @@ public class MySQLUndoLogManager extends AbstractUndoLogManager {
pst.setLong(1, branchId);
pst.setString(2, xid);
pst.setString(3, rollbackCtx);
- pst.setBytes(4, undoLogContent);
+ pst.setObject(4, new ByteArrayInputStream(undoLogContent));
pst.setInt(5, state.getValue());
pst.executeUpdate();
} catch (Exception e) {
diff --git a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/UndoLogManagerTest.java b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/UndoLogManagerTest.java
index f54fe929ae..d2ced9a32b 100644
--- a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/UndoLogManagerTest.java
+++ b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/undo/UndoLogManagerTest.java
@@ -30,6 +30,7 @@ import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -47,11 +48,11 @@ public class UndoLogManagerTest {
@Test
public void testBatchDeleteUndoLog() throws Exception {
Set<String> xids = new HashSet<>();
- for (int i = 0;i < APPEND_IN_SIZE;i++){
+ for (int i = 0; i < APPEND_IN_SIZE; i++) {
xids.add(UUID.randomUUID().toString());
}
Set<Long> branchIds = new HashSet<>();
- for (int i = 0;i < APPEND_IN_SIZE;i++){
+ for (int i = 0; i < APPEND_IN_SIZE; i++) {
branchIds.add((long) i);
}
Connection connection = mock(Connection.class);
@@ -60,18 +61,19 @@ public class UndoLogManagerTest {
UndoLogManagerFactory.getUndoLogManager(JdbcConstants.MYSQL).batchDeleteUndoLog(xids, branchIds, connection);
//verify
- for (int i = 1;i <= APPEND_IN_SIZE;i++){
- verify(preparedStatement).setLong(eq(i),anyLong());
+ for (int i = 1; i <= APPEND_IN_SIZE; i++) {
+ verify(preparedStatement).setLong(eq(i), anyLong());
+ verify(preparedStatement).setString(eq(i), anyString());
}
- for (int i = APPEND_IN_SIZE + 1;i <= APPEND_IN_SIZE * 2;i++){
- verify(preparedStatement).setString(eq(i),anyString());
+ for (int i = APPEND_IN_SIZE + 1; i <= APPEND_IN_SIZE * 2; i++) {
+ verify(preparedStatement, times(2)).setString(eq(i), anyString());
}
- verify(preparedStatement).executeUpdate();
+ verify(preparedStatement, times(2)).executeUpdate();
}
@Test
public void testToBatchDeleteUndoLogSql() {
- String expectedSqlString="DELETE FROM undo_log WHERE branch_id IN " +
+ String expectedSqlString = "DELETE FROM undo_log WHERE branch_id IN " +
THE_APPEND_IN_SIZE_PARAM_STRING +
" AND xid IN " +
THE_DOUBLE_APPEND_IN_SIZE_PARAM_STRING;
diff --git a/server/src/main/java/org/apache/seata/server/Server.java b/server/src/main/java/org/apache/seata/server/Server.java
index 40616914c5..bdf3bd5307 100644
--- a/server/src/main/java/org/apache/seata/server/Server.java
+++ b/server/src/main/java/org/apache/seata/server/Server.java
@@ -29,6 +29,7 @@ import org.apache.seata.common.metadata.namingserver.Instance;
import org.apache.seata.common.thread.NamedThreadFactory;
import org.apache.seata.common.util.NetUtil;
import org.apache.seata.common.util.StringUtils;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.config.ConfigurationFactory;
import org.apache.seata.core.rpc.netty.NettyRemotingServer;
import org.apache.seata.core.rpc.netty.NettyServerConfig;
diff --git a/server/src/main/java/org/apache/seata/server/session/GlobalSession.java b/server/src/main/java/org/apache/seata/server/session/GlobalSession.java
index 941c5babfe..0da8f0ff6e 100644
--- a/server/src/main/java/org/apache/seata/server/session/GlobalSession.java
+++ b/server/src/main/java/org/apache/seata/server/session/GlobalSession.java
@@ -41,7 +41,7 @@ import org.apache.seata.core.model.BranchStatus;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.core.model.LockStatus;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.cluster.raft.RaftServerManager;
import org.apache.seata.server.lock.LockerManagerFactory;
import org.apache.seata.server.store.SessionStorable;
diff --git a/server/src/main/java/org/apache/seata/server/session/SessionHelper.java b/server/src/main/java/org/apache/seata/server/session/SessionHelper.java
index 2ac9d52305..7ffab5f14b 100644
--- a/server/src/main/java/org/apache/seata/server/session/SessionHelper.java
+++ b/server/src/main/java/org/apache/seata/server/session/SessionHelper.java
@@ -37,7 +37,7 @@ import org.apache.seata.core.model.BranchStatus;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.metrics.IdConstants;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.cluster.raft.context.SeataClusterContext;
import org.apache.seata.server.coordinator.DefaultCoordinator;
import org.apache.seata.server.metrics.MetricsPublisher;
diff --git a/server/src/test/java/ServerTest.java b/server/src/test/java/ServerTest.java
index 57cc1de310..32624e3ae1 100644
--- a/server/src/test/java/ServerTest.java
+++ b/server/src/test/java/ServerTest.java
@@ -17,7 +17,7 @@
import org.apache.seata.common.XID;
import org.apache.seata.common.util.NetUtil;
import org.apache.seata.core.rpc.netty.NettyRemotingServer;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.coordinator.DefaultCoordinator;
import java.util.concurrent.LinkedBlockingQueue;
diff --git a/server/src/test/java/org/apache/seata/server/UUIDGeneratorOverflowTest.java b/server/src/test/java/org/apache/seata/server/UUIDGeneratorOverflowTest.java
index ca40dfc78d..65ca16f388 100644
--- a/server/src/test/java/org/apache/seata/server/UUIDGeneratorOverflowTest.java
+++ b/server/src/test/java/org/apache/seata/server/UUIDGeneratorOverflowTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.seata.server;
+import org.apache.seata.common.util.UUIDGenerator;
import org.junit.jupiter.api.Test;
/**
diff --git a/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java b/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
index ec7af1b326..6d6889c804 100644
--- a/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
@@ -30,7 +30,7 @@ import org.apache.seata.common.util.CollectionUtils;
import org.apache.seata.common.result.PageResult;
import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchType;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.console.param.GlobalLockParam;
import org.apache.seata.server.console.service.GlobalLockService;
import org.apache.seata.server.console.vo.GlobalLockVO;
diff --git a/server/src/test/java/org/apache/seata/server/lock/file/FileLockManagerImplTest.java b/server/src/test/java/org/apache/seata/server/lock/file/FileLockManagerImplTest.java
index 9cfaded45a..21e1f9042b 100644
--- a/server/src/test/java/org/apache/seata/server/lock/file/FileLockManagerImplTest.java
+++ b/server/src/test/java/org/apache/seata/server/lock/file/FileLockManagerImplTest.java
@@ -20,7 +20,7 @@ import java.util.stream.Stream;
import org.apache.seata.common.XID;
import org.apache.seata.core.model.BranchType;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.lock.LockManager;
import org.apache.seata.server.session.BranchSession;
import org.junit.jupiter.api.Assertions;
diff --git a/server/src/test/java/org/apache/seata/server/session/BranchSessionTest.java b/server/src/test/java/org/apache/seata/server/session/BranchSessionTest.java
index aeb0c9c66e..87bb61f2d0 100644
--- a/server/src/test/java/org/apache/seata/server/session/BranchSessionTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/BranchSessionTest.java
@@ -19,7 +19,7 @@ package org.apache.seata.server.session;
import java.util.stream.Stream;
import org.apache.seata.core.model.BranchType;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
diff --git a/server/src/test/java/org/apache/seata/server/session/db/DataBaseSessionManagerTest.java b/server/src/test/java/org/apache/seata/server/session/db/DataBaseSessionManagerTest.java
index 718dcfeb65..f4b45f4346 100644
--- a/server/src/test/java/org/apache/seata/server/session/db/DataBaseSessionManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/db/DataBaseSessionManagerTest.java
@@ -29,7 +29,7 @@ import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchStatus;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.session.BranchSession;
import org.apache.seata.server.session.GlobalSession;
import org.apache.seata.server.session.SessionCondition;
diff --git a/server/src/test/java/org/apache/seata/server/session/redis/RedisSessionManagerTest.java b/server/src/test/java/org/apache/seata/server/session/redis/RedisSessionManagerTest.java
index 7a75f60a77..e343114e99 100644
--- a/server/src/test/java/org/apache/seata/server/session/redis/RedisSessionManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/redis/RedisSessionManagerTest.java
@@ -27,7 +27,7 @@ import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchStatus;
import org.apache.seata.core.model.BranchType;
import org.apache.seata.core.model.GlobalStatus;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.session.BranchSession;
import org.apache.seata.server.session.GlobalSession;
import org.apache.seata.server.session.SessionCondition;
diff --git a/server/src/test/java/org/apache/seata/server/store/file/FileTransactionStoreManagerTest.java b/server/src/test/java/org/apache/seata/server/store/file/FileTransactionStoreManagerTest.java
index a2747354d6..d9c8ec0831 100644
--- a/server/src/test/java/org/apache/seata/server/store/file/FileTransactionStoreManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/store/file/FileTransactionStoreManagerTest.java
@@ -33,7 +33,7 @@ import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import org.apache.seata.common.util.BufferUtils;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.session.BranchSession;
import org.apache.seata.server.session.GlobalSession;
import org.apache.seata.server.session.SessionManager;
diff --git a/test-mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java b/test-mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
index eba654fa48..ac5d17fea8 100644
--- a/test-mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
+++ b/test-mock-server/src/main/java/org/apache/seata/mockserver/MockCoordinator.java
@@ -53,7 +53,7 @@ import org.apache.seata.core.rpc.RpcContext;
import org.apache.seata.core.rpc.TransactionMessageHandler;
import org.apache.seata.mockserver.call.CallRm;
import org.apache.seata.server.AbstractTCInboundHandler;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.session.BranchSession;
import org.apache.seata.server.session.GlobalSession;
import org.slf4j.Logger;
diff --git a/test-mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java b/test-mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
index 5f57b66985..535d6d3dd0 100644
--- a/test-mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
+++ b/test-mock-server/src/main/java/org/apache/seata/mockserver/MockServer.java
@@ -25,7 +25,7 @@ import org.apache.seata.common.XID;
import org.apache.seata.common.thread.NamedThreadFactory;
import org.apache.seata.common.util.NetUtil;
import org.apache.seata.server.ParameterParser;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
diff --git a/test/src/test/java/org/apache/seata/at/mysql/MysqlUpdateJoinTest.java b/test/src/test/java/org/apache/seata/at/mysql/MysqlUpdateJoinTest.java
index ecd8bc336d..65686885a7 100644
--- a/test/src/test/java/org/apache/seata/at/mysql/MysqlUpdateJoinTest.java
+++ b/test/src/test/java/org/apache/seata/at/mysql/MysqlUpdateJoinTest.java
@@ -33,7 +33,7 @@ import org.apache.seata.rm.datasource.DataSourceManager;
import org.apache.seata.rm.datasource.DataSourceProxy;
import org.apache.seata.rm.datasource.sql.struct.TableMetaCacheFactory;
import org.apache.seata.rm.datasource.sql.struct.TableRecords;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.sqlparser.struct.TableMeta;
import org.apache.seata.sqlparser.util.JdbcConstants;
import org.junit.jupiter.api.Assertions;
diff --git a/test/src/test/java/org/apache/seata/core/rpc/netty/TmNettyClientTest.java b/test/src/test/java/org/apache/seata/core/rpc/netty/TmNettyClientTest.java
index 9701862d7b..ae723d2380 100644
--- a/test/src/test/java/org/apache/seata/core/rpc/netty/TmNettyClientTest.java
+++ b/test/src/test/java/org/apache/seata/core/rpc/netty/TmNettyClientTest.java
@@ -26,7 +26,7 @@ import org.apache.seata.core.protocol.transaction.BranchRegisterRequest;
import org.apache.seata.core.protocol.transaction.BranchRegisterResponse;
import org.apache.seata.mockserver.MockServer;
import org.apache.seata.saga.engine.db.AbstractServerTest;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.coordinator.DefaultCoordinator;
import org.apache.seata.server.session.SessionHolder;
import org.junit.jupiter.api.AfterAll;
diff --git a/test/src/test/java/org/apache/seata/saga/engine/db/AbstractServerTest.java b/test/src/test/java/org/apache/seata/saga/engine/db/AbstractServerTest.java
index 670261d741..75b4ce873b 100644
--- a/test/src/test/java/org/apache/seata/saga/engine/db/AbstractServerTest.java
+++ b/test/src/test/java/org/apache/seata/saga/engine/db/AbstractServerTest.java
@@ -27,7 +27,7 @@ import org.apache.seata.core.rpc.ShutdownHook;
import org.apache.seata.core.rpc.netty.NettyRemotingServer;
import org.apache.seata.core.rpc.netty.NettyServerConfig;
import org.apache.seata.server.ParameterParser;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.server.coordinator.DefaultCoordinator;
import org.apache.seata.server.metrics.MetricsManager;
import org.apache.seata.server.session.SessionHolder;
diff --git a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
index 4a92fe39c5..1b0c68845d 100644
--- a/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
+++ b/test/src/test/java/org/apache/seata/saga/engine/mock/MockSagaTransactionTemplate.java
@@ -20,7 +20,7 @@ import org.apache.seata.core.exception.TransactionException;
import org.apache.seata.core.model.BranchStatus;
import org.apache.seata.core.model.GlobalStatus;
import org.apache.seata.saga.engine.tm.SagaTransactionalTemplate;
-import org.apache.seata.server.UUIDGenerator;
+import org.apache.seata.common.util.UUIDGenerator;
import org.apache.seata.tm.api.GlobalTransaction;
import org.apache.seata.tm.api.TransactionalExecutor.ExecutionException;
import org.apache.seata.tm.api.transaction.TransactionInfo;
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@seata.apache.org
For additional commands, e-mail: notifications-help@seata.apache.org