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 <jsbx...@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-unsubscr...@seata.apache.org For additional commands, e-mail: notifications-h...@seata.apache.org