From efc4bf5a0a31211001642364585efa20d4de5e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Mon, 19 Dec 2022 11:59:29 +0800 Subject: [PATCH] =?UTF-8?q?update=20seata=201.5.2=20=3D>=201.6.0=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=8D=87=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apm-seata-skywalking-plugin-1.6.0.jar | Bin 0 -> 19388 bytes ruoyi-common/ruoyi-common-alibaba-bom/pom.xml | 8 +- ruoyi-common/ruoyi-common-seata/pom.xml | 12 +- ...acheDubboTransactionPropagationFilter.java | 107 ---------- ruoyi-visual/ruoyi-seata-server/pom.xml | 25 ++- .../server/AbstractTCInboundHandler.java | 20 +- .../java/io/seata/server/ParameterParser.java | 30 +-- .../src/main/java/io/seata/server/Server.java | 42 ++-- .../server/ServerApplicationListener.java | 20 +- .../java/io/seata/server/ServerRunner.java | 7 +- .../controller/BranchSessionController.java | 5 +- .../controller/GlobalLockController.java | 10 +- .../controller/GlobalSessionController.java | 10 +- .../impl/db/BranchSessionDBServiceImpl.java | 21 +- .../impl/db/GlobalLockDBServiceImpl.java | 21 +- .../impl/db/GlobalSessionDBServiceImpl.java | 27 ++- .../file/BranchSessionFileServiceImpl.java | 4 +- .../impl/file/GlobalLockFileServiceImpl.java | 29 ++- .../file/GlobalSessionFileServiceImpl.java | 16 +- .../redis/BranchSessionRedisServiceImpl.java | 11 +- .../redis/GlobalLockRedisServiceImpl.java | 30 +-- .../redis/GlobalSessionRedisServiceImpl.java | 16 +- .../server/console/param/GlobalLockParam.java | 8 +- .../console/param/GlobalSessionParam.java | 8 +- .../console/service/BranchSessionService.java | 2 +- .../console/service/GlobalLockService.java | 2 +- .../console/service/GlobalSessionService.java | 2 +- .../server/console/vo/BranchSessionVO.java | 6 +- .../seata/server/console/vo/GlobalLockVO.java | 10 +- .../server/console/vo/GlobalSessionVO.java | 6 +- .../server/coordinator/AbstractCore.java | 13 +- .../coordinator/DefaultCoordinator.java | 77 +++----- .../seata/server/coordinator/DefaultCore.java | 30 +-- .../java/io/seata/server/env/PortHelper.java | 16 +- .../server/lock/AbstractLockManager.java | 9 +- .../io/seata/server/lock/LockManager.java | 4 +- .../server/lock/LockerManagerFactory.java | 19 +- .../distributed/DistributedLockerFactory.java | 2 +- ...ndedWhitespaceThrowableProxyConverter.java | 3 +- .../appender/EnhancedLogstashEncoder.java | 4 +- .../server/metrics/MeterIdConstants.java | 2 +- .../seata/server/metrics/MetricsManager.java | 4 +- .../server/metrics/MetricsPublisher.java | 1 - .../server/metrics/MetricsSubscriber.java | 17 +- .../seata/server/session/BranchSession.java | 10 +- .../seata/server/session/GlobalSession.java | 23 +-- .../server/session/SessionCondition.java | 1 + .../seata/server/session/SessionHelper.java | 77 +++++--- .../seata/server/session/SessionHolder.java | 77 ++++---- .../seata/server/session/SessionManager.java | 6 +- .../session/SessionStatusValidator.java | 87 ++++++++ .../server/storage/SessionConverter.java | 11 +- .../db/lock/DataBaseDistributedLocker.java | 19 +- .../storage/db/lock/DataBaseLockManager.java | 3 +- .../storage/db/lock/DataBaseLocker.java | 7 +- .../storage/db/lock/LockStoreDataBaseDAO.java | 67 +++---- .../db/session/DataBaseSessionManager.java | 13 +- .../DataBaseTransactionStoreManager.java | 19 +- .../storage/db/store/LogStoreDataBaseDAO.java | 14 +- .../storage/file/TransactionWriteStore.java | 4 +- .../storage/file/lock/FileLockManager.java | 4 +- .../server/storage/file/lock/FileLocker.java | 13 +- .../file/session/FileSessionManager.java | 28 +-- .../store/FileTransactionStoreManager.java | 46 +++-- .../storage/redis/JedisPooledFactory.java | 18 +- .../redis/lock/RedisDistributedLocker.java | 15 +- .../storage/redis/lock/RedisLocker.java | 20 +- .../redis/session/RedisSessionManager.java | 25 +-- .../store/RedisTransactionStoreManager.java | 135 ++++++++----- .../AbstractTransactionStoreManager.java | 10 +- .../server/store/DruidDataSourceProvider.java | 2 + .../io/seata/server/store/StoreConfig.java | 187 +++++++++++++++++- .../server/store/TransactionStoreManager.java | 7 + .../seata/server/transaction/at/ATCore.java | 15 +- .../server/transaction/saga/SagaCore.java | 7 +- .../{lua => }/redislocker/redislock.lua | 0 76 files changed, 908 insertions(+), 778 deletions(-) create mode 100644 docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.0.jar delete mode 100644 ruoyi-common/ruoyi-common-seata/src/main/java/io/seata/integration/dubbo/ApacheDubboTransactionPropagationFilter.java create mode 100644 ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java rename ruoyi-visual/ruoyi-seata-server/src/main/resources/{lua => }/redislocker/redislock.lua (100%) diff --git a/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.0.jar b/docker/skywalking/agent/plugins/apm-seata-skywalking-plugin-1.6.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..9b64f6c3317166d20a5a07a81be9fb0338434813 GIT binary patch literal 19388 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 ACjbBd literal 0 HcmV?d00001 diff --git a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml index ccf74271..459ab49f 100644 --- a/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-alibaba-bom/pom.xml @@ -16,9 +16,8 @@ 2021.0.4.0 1.8.6 - 1.5.2 + 1.6.0 2.1.2 - 2.0.4 3.1.3 1.0.11 @@ -36,11 +35,6 @@ nacos-client ${nacos.client.version} - - com.alibaba.nacos - nacos-config - ${nacos.config.version} - com.alibaba.csp sentinel-core diff --git a/ruoyi-common/ruoyi-common-seata/pom.xml b/ruoyi-common/ruoyi-common-seata/pom.xml index d3419435..1e956ee1 100644 --- a/ruoyi-common/ruoyi-common-seata/pom.xml +++ b/ruoyi-common/ruoyi-common-seata/pom.xml @@ -17,16 +17,16 @@ - - org.apache.dubbo - dubbo - true - - com.alibaba.cloud spring-cloud-starter-alibaba-seata + + + org.apache.logging.log4j + * + + diff --git a/ruoyi-common/ruoyi-common-seata/src/main/java/io/seata/integration/dubbo/ApacheDubboTransactionPropagationFilter.java b/ruoyi-common/ruoyi-common-seata/src/main/java/io/seata/integration/dubbo/ApacheDubboTransactionPropagationFilter.java deleted file mode 100644 index 5fd05da3..00000000 --- a/ruoyi-common/ruoyi-common-seata/src/main/java/io/seata/integration/dubbo/ApacheDubboTransactionPropagationFilter.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 1999-2019 Seata.io Group. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.seata.integration.dubbo; - -import io.seata.common.util.StringUtils; -import io.seata.core.constants.DubboConstants; -import io.seata.core.context.RootContext; -import io.seata.core.model.BranchType; -import org.apache.dubbo.common.extension.Activate; -import org.apache.dubbo.rpc.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * The type Transaction propagation filter. - * - * @author sharajava - */ -@Activate(group = {DubboConstants.PROVIDER, DubboConstants.CONSUMER}, order = 100) -public class ApacheDubboTransactionPropagationFilter implements Filter { - - private static final Logger LOGGER = LoggerFactory.getLogger(ApacheDubboTransactionPropagationFilter.class); - - @Override - public Result invoke(Invoker invoker, Invocation invocation) throws RpcException { - String xid = RootContext.getXID(); - BranchType branchType = RootContext.getBranchType(); - - String rpcXid = getRpcXid(); - String rpcBranchType = RpcContext.getServiceContext().getAttachment(RootContext.KEY_BRANCH_TYPE); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("xid in RootContext[{}] xid in RpcContext[{}]", xid, rpcXid); - } - boolean bind = false; - if (xid != null) { - RpcContext.getServiceContext().setAttachment(RootContext.KEY_XID, xid); - RpcContext.getServiceContext().setAttachment(RootContext.KEY_BRANCH_TYPE, branchType.name()); - } else { - if (rpcXid != null) { - RootContext.bind(rpcXid); - if (StringUtils.equals(BranchType.TCC.name(), rpcBranchType)) { - RootContext.bindBranchType(BranchType.TCC); - } - bind = true; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("bind xid [{}] branchType [{}] to RootContext", rpcXid, rpcBranchType); - } - } - } - try { - return invoker.invoke(invocation); - } finally { - if (bind) { - BranchType previousBranchType = RootContext.getBranchType(); - String unbindXid = RootContext.unbind(); - if (BranchType.TCC == previousBranchType) { - RootContext.unbindBranchType(); - } - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("unbind xid [{}] branchType [{}] from RootContext", unbindXid, previousBranchType); - } - if (!rpcXid.equalsIgnoreCase(unbindXid)) { - LOGGER.warn("xid in change during RPC from {} to {},branchType from {} to {}", rpcXid, unbindXid, - rpcBranchType != null ? rpcBranchType : "AT", previousBranchType); - if (unbindXid != null) { - RootContext.bind(unbindXid); - LOGGER.warn("bind xid [{}] back to RootContext", unbindXid); - if (BranchType.TCC == previousBranchType) { - RootContext.bindBranchType(BranchType.TCC); - LOGGER.warn("bind branchType [{}] back to RootContext", previousBranchType); - } - } - } - } - RpcContext.getServiceContext().removeAttachment(RootContext.KEY_XID); - RpcContext.getServiceContext().removeAttachment(RootContext.KEY_BRANCH_TYPE); - RpcContext.getServerContext().removeAttachment(RootContext.KEY_XID); - RpcContext.getServerContext().removeAttachment(RootContext.KEY_BRANCH_TYPE); - } - } - - /** - * get rpc xid - * @return - */ - private String getRpcXid() { - String rpcXid = RpcContext.getServiceContext().getAttachment(RootContext.KEY_XID); - if (rpcXid == null) { - rpcXid = RpcContext.getServiceContext().getAttachment(RootContext.KEY_XID.toLowerCase()); - } - return rpcXid; - } - -} diff --git a/ruoyi-visual/ruoyi-seata-server/pom.xml b/ruoyi-visual/ruoyi-seata-server/pom.xml index e25eda45..578f8862 100644 --- a/ruoyi-visual/ruoyi-seata-server/pom.xml +++ b/ruoyi-visual/ruoyi-seata-server/pom.xml @@ -27,7 +27,7 @@ jar - 1.5.2 + 1.6.0 1.72 1.2.12 @@ -41,6 +41,13 @@ pom import + + io.seata + seata-dependencies + ${seata.version} + pom + import + @@ -49,6 +56,12 @@ org.springframework.boot spring-boot-starter-web + + + log4j-to-slf4j + org.apache.logging.log4j + + io.seata @@ -63,6 +76,12 @@ io.seata seata-config-all + + + log4j + log4j + + io.seata @@ -150,6 +169,10 @@ ch.qos.logback logback-classic + + ch.qos.logback + logback-core + net.logstash.logback diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java index 18a26990..fdf0d28c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/AbstractTCInboundHandler.java @@ -20,25 +20,7 @@ import io.seata.core.exception.AbstractExceptionHandler; import io.seata.core.exception.TransactionException; import io.seata.core.exception.TransactionExceptionCode; import io.seata.core.model.GlobalStatus; -import io.seata.core.protocol.transaction.AbstractGlobalEndRequest; -import io.seata.core.protocol.transaction.AbstractGlobalEndResponse; -import io.seata.core.protocol.transaction.BranchRegisterRequest; -import io.seata.core.protocol.transaction.BranchRegisterResponse; -import io.seata.core.protocol.transaction.BranchReportRequest; -import io.seata.core.protocol.transaction.BranchReportResponse; -import io.seata.core.protocol.transaction.GlobalBeginRequest; -import io.seata.core.protocol.transaction.GlobalBeginResponse; -import io.seata.core.protocol.transaction.GlobalCommitRequest; -import io.seata.core.protocol.transaction.GlobalCommitResponse; -import io.seata.core.protocol.transaction.GlobalLockQueryRequest; -import io.seata.core.protocol.transaction.GlobalLockQueryResponse; -import io.seata.core.protocol.transaction.GlobalReportRequest; -import io.seata.core.protocol.transaction.GlobalReportResponse; -import io.seata.core.protocol.transaction.GlobalRollbackRequest; -import io.seata.core.protocol.transaction.GlobalRollbackResponse; -import io.seata.core.protocol.transaction.GlobalStatusRequest; -import io.seata.core.protocol.transaction.GlobalStatusResponse; -import io.seata.core.protocol.transaction.TCInboundHandler; +import io.seata.core.protocol.transaction.*; import io.seata.core.rpc.RpcContext; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionHolder; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java index 1305fa99..55690fca 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ParameterParser.java @@ -21,10 +21,9 @@ import com.beust.jcommander.ParameterException; import io.seata.common.util.StringUtils; import io.seata.config.Configuration; import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; import io.seata.server.env.ContainerHelper; +import io.seata.server.store.StoreConfig; -import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE; import static io.seata.config.ConfigurationFactory.ENV_PROPERTY_KEY; /** @@ -67,6 +66,10 @@ public class ParameterParser { this.init(args); } + /** + * startup args > docker env + * @param args + */ private void init(String[] args) { try { getCommandParameters(args); @@ -74,15 +77,7 @@ public class ParameterParser { if (StringUtils.isNotBlank(seataEnv)) { System.setProperty(ENV_PROPERTY_KEY, seataEnv); } - if (StringUtils.isBlank(storeMode)) { - storeMode = CONFIG.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE); - } - if (StringUtils.isBlank(sessionStoreMode)) { - sessionStoreMode = CONFIG.getConfig(ConfigurationKeys.STORE_SESSION_MODE, storeMode); - } - if (StringUtils.isBlank(lockStoreMode)) { - lockStoreMode = CONFIG.getConfig(ConfigurationKeys.STORE_LOCK_MODE, storeMode); - } + StoreConfig.setStartupParameter(storeMode, sessionStoreMode, lockStoreMode); } catch (ParameterException e) { printError(e); } @@ -112,15 +107,6 @@ public class ParameterParser { if (serverNode == null) { serverNode = ContainerHelper.getServerNode(); } - if (StringUtils.isBlank(storeMode)) { - storeMode = ContainerHelper.getStoreMode(); - } - if (StringUtils.isBlank(sessionStoreMode)) { - sessionStoreMode = ContainerHelper.getSessionStoreMode(); - } - if (StringUtils.isBlank(lockStoreMode)) { - lockStoreMode = ContainerHelper.getLockStoreMode(); - } } private void printError(ParameterException e) { @@ -163,7 +149,7 @@ public class ParameterParser { * @return the store mode */ public String getLockStoreMode() { - return StringUtils.isNotEmpty(lockStoreMode) ? lockStoreMode : storeMode; + return lockStoreMode; } /** @@ -172,7 +158,7 @@ public class ParameterParser { * @return the store mode */ public String getSessionStoreMode() { - return StringUtils.isNotEmpty(sessionStoreMode) ? sessionStoreMode : storeMode; + return sessionStoreMode; } /** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java index 1603e9d9..81eb1119 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/Server.java @@ -15,24 +15,21 @@ */ package io.seata.server; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - import io.seata.common.XID; import io.seata.common.thread.NamedThreadFactory; import io.seata.common.util.NetUtil; import io.seata.common.util.StringUtils; import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; import io.seata.core.rpc.netty.NettyRemotingServer; import io.seata.core.rpc.netty.NettyServerConfig; import io.seata.server.coordinator.DefaultCoordinator; import io.seata.server.lock.LockerManagerFactory; import io.seata.server.metrics.MetricsManager; import io.seata.server.session.SessionHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; + +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import static io.seata.spring.boot.autoconfigure.StarterConstants.REGEX_SPLIT_CHAR; import static io.seata.spring.boot.autoconfigure.StarterConstants.REGISTRY_PREFERED_NETWORKS; @@ -49,9 +46,6 @@ public class Server { * @param args the input arguments */ public static void start(String[] args) { - // create logger - final Logger logger = LoggerFactory.getLogger(Server.class); - //initialize the parameter parser //Note that the parameter parser should always be the first line to execute. //Because, here we need to parse the parameters needed for startup. @@ -60,25 +54,11 @@ public class Server { //initialize the metrics MetricsManager.get().init(); - System.setProperty(ConfigurationKeys.STORE_MODE, parameterParser.getStoreMode()); - ThreadPoolExecutor workingThreads = new ThreadPoolExecutor(NettyServerConfig.getMinServerPoolSize(), NettyServerConfig.getMaxServerPoolSize(), NettyServerConfig.getKeepAliveTime(), TimeUnit.SECONDS, new LinkedBlockingQueue<>(NettyServerConfig.getMaxTaskQueueSize()), new NamedThreadFactory("ServerHandlerThread", NettyServerConfig.getMaxServerPoolSize()), new ThreadPoolExecutor.CallerRunsPolicy()); - NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads); - UUIDGenerator.init(parameterParser.getServerNode()); - //log store mode : file, db, redis - SessionHolder.init(parameterParser.getSessionStoreMode()); - LockerManagerFactory.init(parameterParser.getLockStoreMode()); - DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer); - coordinator.init(); - nettyRemotingServer.setHandler(coordinator); - - // let ServerRunner do destroy instead ShutdownHook, see https://github.com/seata/seata/issues/4028 - ServerRunner.addDisposable(coordinator); - //127.0.0.1 and 0.0.0.0 are not valid here. if (NetUtil.isValidIp(parameterParser.getHost(), false)) { XID.setIpAddress(parameterParser.getHost()); @@ -90,6 +70,20 @@ public class Server { XID.setIpAddress(NetUtil.getLocalIp()); } } + + NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(workingThreads); + XID.setPort(nettyRemotingServer.getListenPort()); + UUIDGenerator.init(parameterParser.getServerNode()); + //log store mode : file, db, redis + SessionHolder.init(); + LockerManagerFactory.init(); + DefaultCoordinator coordinator = DefaultCoordinator.getInstance(nettyRemotingServer); + coordinator.init(); + nettyRemotingServer.setHandler(coordinator); + + // let ServerRunner do destroy instead ShutdownHook, see https://github.com/seata/seata/issues/4028 + ServerRunner.addDisposable(coordinator); + nettyRemotingServer.init(); } } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerApplicationListener.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerApplicationListener.java index 79c54134..e26301d7 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerApplicationListener.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerApplicationListener.java @@ -15,11 +15,9 @@ */ package io.seata.server; -import java.util.Properties; import io.seata.common.holder.ObjectHolder; import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; +import io.seata.server.store.StoreConfig; import io.seata.spring.boot.autoconfigure.SeataCoreEnvironmentPostProcessor; import io.seata.spring.boot.autoconfigure.SeataServerEnvironmentPostProcessor; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; @@ -30,14 +28,11 @@ import org.springframework.core.ResolvableType; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; -import static io.seata.common.ConfigurationKeys.STORE_LOCK_MODE; -import static io.seata.common.ConfigurationKeys.STORE_MODE; -import static io.seata.common.ConfigurationKeys.STORE_SESSION_MODE; +import java.util.Properties; + import static io.seata.common.Constants.OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT; import static io.seata.common.DefaultValues.SERVICE_OFFSET_SPRING_BOOT; -import static io.seata.core.constants.ConfigurationKeys.ENV_SEATA_PORT_KEY; -import static io.seata.core.constants.ConfigurationKeys.SERVER_SERVICE_PORT_CAMEL; -import static io.seata.core.constants.ConfigurationKeys.SERVER_SERVICE_PORT_CONFIG; +import static io.seata.core.constants.ConfigurationKeys.*; /** * @author slievrly @@ -61,12 +56,9 @@ public class ServerApplicationListener implements GenericApplicationListener { ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT, environment); SeataCoreEnvironmentPostProcessor.init(); SeataServerEnvironmentPostProcessor.init(); - Configuration config = ConfigurationFactory.getInstance(); // Load by priority - System.setProperty("sessionMode", - config.getConfig(STORE_SESSION_MODE, config.getConfig(STORE_MODE, "file"))); - System.setProperty("lockMode", - config.getConfig(STORE_LOCK_MODE, config.getConfig(STORE_MODE, "file"))); + System.setProperty("sessionMode", StoreConfig.getSessionMode().getName()); + System.setProperty("lockMode", StoreConfig.getLockMode().getName()); String[] args = environmentPreparedEvent.getArgs(); diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java index 2d567df6..d19233a0 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/ServerRunner.java @@ -15,17 +15,16 @@ */ package io.seata.server; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - import io.seata.core.rpc.Disposable; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + /** * @author spilledyear@outlook.com diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java index b6980f42..f5e7a89d 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/BranchSessionController.java @@ -15,14 +15,15 @@ */ package io.seata.server.console.controller; -import javax.annotation.Resource; import io.seata.server.console.service.BranchSessionService; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + /** * Branch Session Controller - * @author: zhongxiang.wang + * @author zhongxiang.wang */ @RestController @RequestMapping("console/branchSession") diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java index 0be8fa41..d8ea221c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalLockController.java @@ -15,21 +15,21 @@ */ package io.seata.server.console.controller; -import javax.annotation.Resource; - -import io.seata.server.console.param.GlobalLockParam; import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalLockVO; +import io.seata.server.console.param.GlobalLockParam; import io.seata.server.console.service.GlobalLockService; +import io.seata.server.console.vo.GlobalLockVO; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + /** * Global Lock Controller - * @author: zhongxiang.wang + * @author zhongxiang.wang */ @RestController @RequestMapping("/api/v1/console/globalLock") diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java index cc5ceb11..db34ace8 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/controller/GlobalSessionController.java @@ -15,20 +15,20 @@ */ package io.seata.server.console.controller; -import javax.annotation.Resource; - -import io.seata.server.console.param.GlobalSessionParam; import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalSessionVO; +import io.seata.server.console.param.GlobalSessionParam; import io.seata.server.console.service.GlobalSessionService; +import io.seata.server.console.vo.GlobalSessionVO; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; + /** * Global Session Controller - * @author: zhongxiang.wang + * @author zhongxiang.wang */ @RestController @RequestMapping("/api/v1/console/globalSession") diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java index 367e71c5..963b273c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/BranchSessionDBServiceImpl.java @@ -15,15 +15,6 @@ */ package io.seata.server.console.impl.db; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -import javax.sql.DataSource; - import io.seata.common.ConfigurationKeys; import io.seata.common.exception.StoreException; import io.seata.common.loader.EnhancedServiceLoader; @@ -39,13 +30,21 @@ import io.seata.server.console.vo.BranchSessionVO; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE; /** * Branch Session DataBase ServiceImpl * - * @author: zhongxiang.wang - * @author: lvekee 734843455@qq.com + * @author zhongxiang.wang + * @author lvekee 734843455@qq.com */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java index 4a8a5a23..41d61efe 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalLockDBServiceImpl.java @@ -15,15 +15,6 @@ */ package io.seata.server.console.impl.db; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -import javax.sql.DataSource; - import io.seata.common.ConfigurationKeys; import io.seata.common.exception.StoreException; import io.seata.common.loader.EnhancedServiceLoader; @@ -41,14 +32,22 @@ import io.seata.server.console.vo.GlobalLockVO; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE; /** * Global Lock DB ServiceImpl * - * @author: zhongxiang.wang - * @author: lvekee 734843455@qq.com + * @author zhongxiang.wang + * @author lvekee 734843455@qq.com */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java index f5d720e8..31877347 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java @@ -15,18 +15,6 @@ */ package io.seata.server.console.impl.db; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.List; - -import javax.annotation.Resource; -import javax.sql.DataSource; - import io.seata.common.ConfigurationKeys; import io.seata.common.exception.StoreException; import io.seata.common.loader.EnhancedServiceLoader; @@ -46,13 +34,24 @@ import io.seata.server.console.vo.GlobalSessionVO; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.List; + import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE; /** * Global Session DataBase ServiceImpl * - * @author: zhongxiang.wang - * @author: lvekee 734843455@qq.com + * @author zhongxiang.wang + * @author lvekee 734843455@qq.com */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java index 8305484c..2f710d0e 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/BranchSessionFileServiceImpl.java @@ -16,16 +16,16 @@ package io.seata.server.console.impl.file; import io.seata.common.exception.NotSupportYetException; -import io.seata.server.console.vo.BranchSessionVO; import io.seata.console.result.PageResult; import io.seata.server.console.service.BranchSessionService; +import io.seata.server.console.vo.BranchSessionVO; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; /** * Branch Session File ServiceImpl * - * @author: zhongxiang.wang + * @author zhongxiang.wang */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java index edfdc633..59d91540 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalLockFileServiceImpl.java @@ -15,6 +15,20 @@ */ package io.seata.server.console.impl.file; +import io.seata.common.util.CollectionUtils; +import io.seata.common.util.StringUtils; +import io.seata.console.result.PageResult; +import io.seata.core.lock.RowLock; +import io.seata.server.console.param.GlobalLockParam; +import io.seata.server.console.service.GlobalLockService; +import io.seata.server.console.vo.GlobalLockVO; +import io.seata.server.lock.LockerManagerFactory; +import io.seata.server.session.BranchSession; +import io.seata.server.session.GlobalSession; +import io.seata.server.session.SessionHolder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Component; + import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -22,21 +36,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalLockVO; -import io.seata.core.lock.RowLock; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.lock.LockerManagerFactory; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionHolder; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; - import static io.seata.common.util.StringUtils.isBlank; import static io.seata.server.console.vo.GlobalLockVO.convert; import static java.util.Objects.isNull; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java index 0487aacc..51ece1d5 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java @@ -15,22 +15,22 @@ */ package io.seata.server.console.impl.file; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import io.seata.server.console.param.GlobalSessionParam; import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalSessionVO; +import io.seata.server.console.param.GlobalSessionParam; import io.seata.server.console.service.GlobalSessionService; +import io.seata.server.console.vo.GlobalSessionVO; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionHolder; import io.seata.server.storage.SessionConverter; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.Collectors; + import static io.seata.common.util.StringUtils.isBlank; import static java.util.Objects.isNull; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java index 0173f594..c8e9e91a 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java @@ -15,24 +15,25 @@ */ package io.seata.server.console.impl.redis; -import java.util.ArrayList; -import java.util.List; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; import io.seata.console.result.PageResult; -import io.seata.server.console.vo.BranchSessionVO; import io.seata.core.store.BranchTransactionDO; import io.seata.server.console.service.BranchSessionService; +import io.seata.server.console.vo.BranchSessionVO; import io.seata.server.storage.redis.store.RedisTransactionStoreManager; import org.springframework.beans.BeanUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; + /** * Branch Session Redis ServiceImpl * - * @author: zhongxiang.wang - * @author: doubleDimple + * @author zhongxiang.wang + * @author doubleDimple */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java index 91a53c9d..17f30b89 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java @@ -15,32 +15,32 @@ */ package io.seata.server.console.impl.redis; +import io.seata.common.util.BeanUtils; +import io.seata.common.util.CollectionUtils; +import io.seata.console.result.PageResult; +import io.seata.server.console.param.GlobalLockParam; +import io.seata.server.console.service.GlobalLockService; +import io.seata.server.console.vo.GlobalLockVO; +import io.seata.server.storage.redis.JedisPooledFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; + import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; -import io.seata.common.util.CollectionUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; -import org.springframework.stereotype.Component; -import io.seata.common.util.BeanUtils; -import io.seata.server.console.param.GlobalLockParam; -import io.seata.console.result.PageResult; -import io.seata.server.console.vo.GlobalLockVO; -import io.seata.server.console.service.GlobalLockService; -import io.seata.server.storage.redis.JedisPooledFactory; -import redis.clients.jedis.Jedis; + import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR; import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired; import static io.seata.common.util.StringUtils.isNotBlank; import static io.seata.console.result.PageResult.checkPage; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX; -import static io.seata.core.constants.RedisKeyConstants.SPLIT; +import static io.seata.core.constants.RedisKeyConstants.*; /** * Global Lock Redis Service Impl - * @author: zhongxiang.wang - * @author: doubleDimple + * @author zhongxiang.wang + * @author doubleDimple */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java index 779b8843..9ca2fdb7 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java @@ -15,15 +15,12 @@ */ package io.seata.server.console.impl.redis; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; import io.seata.common.util.CollectionUtils; import io.seata.console.result.PageResult; -import io.seata.server.console.param.GlobalSessionParam; -import io.seata.server.console.vo.GlobalSessionVO; import io.seata.core.model.GlobalStatus; +import io.seata.server.console.param.GlobalSessionParam; import io.seata.server.console.service.GlobalSessionService; +import io.seata.server.console.vo.GlobalSessionVO; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionCondition; import io.seata.server.storage.redis.store.RedisTransactionStoreManager; @@ -31,6 +28,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + import static io.seata.common.exception.FrameworkErrorCode.ParameterRequired; import static io.seata.common.util.StringUtils.isBlank; import static io.seata.common.util.StringUtils.isNotBlank; @@ -39,8 +41,8 @@ import static io.seata.server.storage.SessionConverter.convertToGlobalSessionVo; /** * Global Session Redis ServiceImpl - * @author: zhongxiang.wang - * @author: doubleDimple + * @author zhongxiang.wang + * @author doubleDimple */ @Component @org.springframework.context.annotation.Configuration diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java index 4cc16cc9..dcc43012 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalLockParam.java @@ -15,13 +15,13 @@ */ package io.seata.server.console.param; -import java.io.Serializable; - import io.seata.console.param.BaseParam; +import java.io.Serializable; + /** - * @description: Global lock param - * @author: zhongxiang.wang + * Global lock param + * @author zhongxiang.wang */ public class GlobalLockParam extends BaseParam implements Serializable { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java index a02563dc..88673039 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/param/GlobalSessionParam.java @@ -15,13 +15,13 @@ */ package io.seata.server.console.param; -import java.io.Serializable; - import io.seata.console.param.BaseParam; +import java.io.Serializable; + /** - * @description: Global session param - * @author: zhongxiang.wang + * Global session param + * @author zhongxiang.wang */ public class GlobalSessionParam extends BaseParam implements Serializable { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java index 0a8b3105..5f1b3fdc 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/BranchSessionService.java @@ -15,8 +15,8 @@ */ package io.seata.server.console.service; -import io.seata.server.console.vo.BranchSessionVO; import io.seata.console.result.PageResult; +import io.seata.server.console.vo.BranchSessionVO; /** * Branch session service diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java index 1b774919..87b3a790 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalLockService.java @@ -15,9 +15,9 @@ */ package io.seata.server.console.service; +import io.seata.console.result.PageResult; import io.seata.server.console.param.GlobalLockParam; import io.seata.server.console.vo.GlobalLockVO; -import io.seata.console.result.PageResult; /** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java index 2f700b67..45260538 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/service/GlobalSessionService.java @@ -15,9 +15,9 @@ */ package io.seata.server.console.service; +import io.seata.console.result.PageResult; import io.seata.server.console.param.GlobalSessionParam; import io.seata.server.console.vo.GlobalSessionVO; -import io.seata.console.result.PageResult; /** * Global session service diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java index 0980f6f4..fa1e7b87 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/BranchSessionVO.java @@ -15,16 +15,16 @@ */ package io.seata.server.console.vo; +import io.seata.core.constants.ServerTableColumnsName; + import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Objects; -import io.seata.core.constants.ServerTableColumnsName; - /** * BranchSessionVO - * @author: zhongxiang.wang + * @author zhongxiang.wang */ public class BranchSessionVO { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java index 4823f676..265cc77c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalLockVO.java @@ -15,6 +15,10 @@ */ package io.seata.server.console.vo; +import io.seata.common.util.CollectionUtils; +import io.seata.core.constants.ServerTableColumnsName; +import io.seata.core.lock.RowLock; + import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; @@ -22,13 +26,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import io.seata.common.util.CollectionUtils; -import io.seata.core.constants.ServerTableColumnsName; -import io.seata.core.lock.RowLock; - /** * GlobalLockVO - * @author: zhongxiang.wang + * @author zhongxiang.wang * @author miaoxueyu */ public class GlobalLockVO { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java index 05146a1d..b040cb5f 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/console/vo/GlobalSessionVO.java @@ -15,16 +15,16 @@ */ package io.seata.server.console.vo; +import io.seata.core.constants.ServerTableColumnsName; + import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.Set; -import io.seata.core.constants.ServerTableColumnsName; - /** * GlobalSessionVO - * @author: zhongxiang.wang + * @author zhongxiang.wang */ public class GlobalSessionVO { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java index 84ab8036..e5d0b3b8 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/AbstractCore.java @@ -15,9 +15,6 @@ */ package io.seata.server.coordinator; -import java.io.IOException; -import java.util.concurrent.TimeoutException; - import io.seata.core.context.RootContext; import io.seata.core.exception.BranchTransactionException; import io.seata.core.exception.GlobalTransactionException; @@ -41,12 +38,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; -import static io.seata.core.exception.TransactionExceptionCode.BranchTransactionNotExist; -import static io.seata.core.exception.TransactionExceptionCode.FailedToAddBranch; -import static io.seata.core.exception.TransactionExceptionCode.GlobalTransactionNotActive; -import static io.seata.core.exception.TransactionExceptionCode.GlobalTransactionStatusInvalid; -import static io.seata.core.exception.TransactionExceptionCode.FailedToSendBranchCommitRequest; -import static io.seata.core.exception.TransactionExceptionCode.FailedToSendBranchRollbackRequest; +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +import static io.seata.core.exception.TransactionExceptionCode.*; /** * The type abstract core. diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java index 22d42f0e..01223e82 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCoordinator.java @@ -15,14 +15,6 @@ */ package io.seata.server.coordinator; -import java.time.Duration; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - import io.netty.channel.Channel; import io.seata.common.thread.NamedThreadFactory; import io.seata.common.util.CollectionUtils; @@ -34,25 +26,7 @@ import io.seata.core.exception.TransactionException; import io.seata.core.model.GlobalStatus; import io.seata.core.protocol.AbstractMessage; import io.seata.core.protocol.AbstractResultMessage; -import io.seata.core.protocol.transaction.AbstractTransactionRequestToTC; -import io.seata.core.protocol.transaction.AbstractTransactionResponse; -import io.seata.core.protocol.transaction.BranchRegisterRequest; -import io.seata.core.protocol.transaction.BranchRegisterResponse; -import io.seata.core.protocol.transaction.BranchReportRequest; -import io.seata.core.protocol.transaction.BranchReportResponse; -import io.seata.core.protocol.transaction.GlobalBeginRequest; -import io.seata.core.protocol.transaction.GlobalBeginResponse; -import io.seata.core.protocol.transaction.GlobalCommitRequest; -import io.seata.core.protocol.transaction.GlobalCommitResponse; -import io.seata.core.protocol.transaction.GlobalLockQueryRequest; -import io.seata.core.protocol.transaction.GlobalLockQueryResponse; -import io.seata.core.protocol.transaction.GlobalReportRequest; -import io.seata.core.protocol.transaction.GlobalReportResponse; -import io.seata.core.protocol.transaction.GlobalRollbackRequest; -import io.seata.core.protocol.transaction.GlobalRollbackResponse; -import io.seata.core.protocol.transaction.GlobalStatusRequest; -import io.seata.core.protocol.transaction.GlobalStatusResponse; -import io.seata.core.protocol.transaction.UndoLogDeleteRequest; +import io.seata.core.protocol.transaction.*; import io.seata.core.rpc.Disposable; import io.seata.core.rpc.RemotingServer; import io.seata.core.rpc.RpcContext; @@ -61,20 +35,21 @@ import io.seata.core.rpc.netty.ChannelManager; import io.seata.core.rpc.netty.NettyRemotingServer; import io.seata.server.AbstractTCInboundHandler; import io.seata.server.metrics.MetricsPublisher; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionHelper; -import io.seata.server.session.SessionHolder; +import io.seata.server.session.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; -import static io.seata.common.Constants.ASYNC_COMMITTING; -import static io.seata.common.Constants.RETRY_COMMITTING; -import static io.seata.common.Constants.RETRY_ROLLBACKING; -import static io.seata.common.Constants.TX_TIMEOUT_CHECK; -import static io.seata.common.Constants.UNDOLOG_DELETE; +import java.time.Duration; +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import static io.seata.common.Constants.*; +import static io.seata.common.DefaultValues.*; /** * The type Default coordinator. @@ -89,30 +64,31 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran * The constant COMMITTING_RETRY_PERIOD. */ protected static final long COMMITTING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.COMMITING_RETRY_PERIOD, - 1000L); + DEFAULT_COMMITING_RETRY_PERIOD); /** * The constant ASYNC_COMMITTING_RETRY_PERIOD. */ protected static final long ASYNC_COMMITTING_RETRY_PERIOD = CONFIG.getLong( - ConfigurationKeys.ASYN_COMMITING_RETRY_PERIOD, 1000L); + ConfigurationKeys.ASYNC_COMMITING_RETRY_PERIOD, DEFAULT_ASYNC_COMMITTING_RETRY_PERIOD); /** * The constant ROLLBACKING_RETRY_PERIOD. */ protected static final long ROLLBACKING_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.ROLLBACKING_RETRY_PERIOD, - 1000L); + DEFAULT_ROLLBACKING_RETRY_PERIOD); /** * The constant TIMEOUT_RETRY_PERIOD. */ - protected static final long TIMEOUT_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.TIMEOUT_RETRY_PERIOD, 1000L); + protected static final long TIMEOUT_RETRY_PERIOD = CONFIG.getLong(ConfigurationKeys.TIMEOUT_RETRY_PERIOD, + DEFAULT_TIMEOUT_RETRY_PERIOD); /** * The Transaction undo log delete period. */ protected static final long UNDO_LOG_DELETE_PERIOD = CONFIG.getLong( - ConfigurationKeys.TRANSACTION_UNDO_LOG_DELETE_PERIOD, 24 * 60 * 60 * 1000); + ConfigurationKeys.TRANSACTION_UNDO_LOG_DELETE_PERIOD, DEFAULT_UNDO_LOG_DELETE_PERIOD); /** * The Transaction undo log delay delete period @@ -132,13 +108,13 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran private static final int BRANCH_ASYNC_POOL_SIZE = Runtime.getRuntime().availableProcessors(); private static final Duration MAX_COMMIT_RETRY_TIMEOUT = ConfigurationFactory.getInstance().getDuration( - ConfigurationKeys.MAX_COMMIT_RETRY_TIMEOUT, DurationUtil.DEFAULT_DURATION, 100); + ConfigurationKeys.MAX_COMMIT_RETRY_TIMEOUT, DurationUtil.DEFAULT_DURATION, DEFAULT_MAX_COMMIT_RETRY_TIMEOUT); private static final Duration MAX_ROLLBACK_RETRY_TIMEOUT = ConfigurationFactory.getInstance().getDuration( - ConfigurationKeys.MAX_ROLLBACK_RETRY_TIMEOUT, DurationUtil.DEFAULT_DURATION, 100); + ConfigurationKeys.MAX_ROLLBACK_RETRY_TIMEOUT, DurationUtil.DEFAULT_DURATION, DEFAULT_MAX_ROLLBACK_RETRY_TIMEOUT); private static final boolean ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE = ConfigurationFactory.getInstance().getBoolean( - ConfigurationKeys.ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE, false); + ConfigurationKeys.ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE, DEFAULT_ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE); private final ScheduledThreadPoolExecutor retryRollbacking = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory(RETRY_ROLLBACKING, 1)); @@ -357,7 +333,7 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran SessionHelper.forEach(rollbackingSessions, rollbackingSession -> { try { // prevent repeated rollback - if (rollbackingSession.getStatus().equals(GlobalStatus.Rollbacking) + if (rollbackingSession.getStatus() == GlobalStatus.Rollbacking && !rollbackingSession.isDeadSession()) { // The function of this 'return' is 'continue'. return; @@ -370,10 +346,7 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran SessionHolder.getRetryRollbackingSessionManager().removeGlobalSession(rollbackingSession); LOGGER.error("Global transaction rollback retry timeout and has removed [{}]", rollbackingSession.getXid()); - SessionHelper.endRollbackFailed(rollbackingSession, true); - - // rollback retry timeout event - MetricsPublisher.postSessionDoneEvent(rollbackingSession, GlobalStatus.RollbackRetryTimeout, true, false); + SessionHelper.endRollbackFailed(rollbackingSession, true, true); //The function of this 'return' is 'continue'. return; @@ -401,7 +374,7 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran SessionHelper.forEach(committingSessions, committingSession -> { try { // prevent repeated commit - if (committingSession.getStatus().equals(GlobalStatus.Committing) + if (committingSession.getStatus() == GlobalStatus.Committing && !committingSession.isDeadSession()) { // The function of this 'return' is 'continue'. return; @@ -412,7 +385,7 @@ public class DefaultCoordinator extends AbstractTCInboundHandler implements Tran LOGGER.error("Global transaction commit retry timeout and has removed [{}]", committingSession.getXid()); // commit retry timeout event - MetricsPublisher.postSessionDoneEvent(committingSession, GlobalStatus.CommitRetryTimeout, true, false); + SessionHelper.endCommitFailed(committingSession, true, true); //The function of this 'return' is 'continue'. return; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java index 42b88722..62fb0873 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/coordinator/DefaultCore.java @@ -15,10 +15,6 @@ */ package io.seata.server.coordinator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import io.seata.common.DefaultValues; import io.seata.common.exception.NotSupportYetException; import io.seata.common.loader.EnhancedServiceLoader; @@ -40,6 +36,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import static io.seata.core.constants.ConfigurationKeys.XAER_NOTA_RETRY_TIMEOUT; import static io.seata.server.session.BranchSessionHandler.CONTINUE; @@ -128,8 +128,7 @@ public class DefaultCore implements Core { @Override public String begin(String applicationId, String transactionServiceGroup, String name, int timeout) throws TransactionException { - GlobalSession session = GlobalSession.createGlobalSession(applicationId, transactionServiceGroup, name, - timeout); + GlobalSession session = GlobalSession.createGlobalSession(applicationId, transactionServiceGroup, name, timeout); MDC.put(RootContext.MDC_KEY_XID, session.getXid()); session.addSessionLifecycleListener(SessionHolder.getRootSessionManager()); @@ -141,12 +140,20 @@ public class DefaultCore implements Core { return session.getXid(); } + + @Override public GlobalStatus commit(String xid) throws TransactionException { GlobalSession globalSession = SessionHolder.findGlobalSession(xid); if (globalSession == null) { return GlobalStatus.Finished; } + + if (globalSession.isTimeout()) { + LOGGER.info("TC detected timeout, xid = {}", globalSession.getXid()); + return GlobalStatus.TimeoutRollbacking; + } + globalSession.addSessionLifecycleListener(SessionHolder.getRootSessionManager()); // just lock changeStatus @@ -251,14 +258,14 @@ public class DefaultCore implements Core { LOGGER.info("Committing global transaction is NOT done, xid = {}.", globalSession.getXid()); return false; } - if (!retrying) { - //contains not AT branch - globalSession.setStatus(GlobalStatus.Committed); - } } // if it succeeds and there is no branch, retrying=true is the asynchronous state when retrying. EndCommitted is // executed to improve concurrency performance, and the global transaction ends.. if (success && globalSession.getBranchSessions().isEmpty()) { + if (!retrying) { + //contains not AT branch + globalSession.setStatus(GlobalStatus.Committed); + } SessionHelper.endCommitted(globalSession, retrying); LOGGER.info("Committing global transaction is successfully done, xid = {}.", globalSession.getXid()); } @@ -284,7 +291,7 @@ public class DefaultCore implements Core { if (!shouldRollBack) { return globalSession.getStatus(); } - + boolean rollbackSuccess = doGlobalRollback(globalSession, false); return rollbackSuccess ? GlobalStatus.Rollbacked : globalSession.getStatus(); } @@ -388,5 +395,4 @@ public class DefaultCore implements Core { return false; } } - } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java index cb5968dc..e3c24733 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/env/PortHelper.java @@ -15,14 +15,6 @@ */ package io.seata.server.env; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; - import io.seata.common.util.CollectionUtils; import io.seata.common.util.MapUtil; import io.seata.common.util.NumberUtils; @@ -30,6 +22,10 @@ import io.seata.common.util.StringUtils; import org.springframework.util.ResourceUtils; import org.yaml.snakeyaml.Yaml; +import java.io.*; +import java.util.Map; +import java.util.Properties; + /** * @author wang.liang */ @@ -54,8 +50,8 @@ public class PortHelper { * get config from configFile * -Dspring.config.location > classpath:application.properties > classpath:application.yml * - * @return - * @throws IOException + * @return the port + * @throws IOException the io exception */ public static int getPortFromConfigFile() throws IOException { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java index 1334d39b..91bb7b6e 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/AbstractLockManager.java @@ -15,9 +15,6 @@ */ package io.seata.server.lock; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import io.seata.common.XID; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; @@ -29,6 +26,10 @@ import io.seata.server.session.BranchSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * The type Abstract lock manager. * @@ -188,7 +189,7 @@ public abstract class AbstractLockManager implements LockManager { } return locks; } - + @Override public void updateLockStatus(String xid, LockStatus lockStatus) { this.getLocker().updateLockStatus(xid, lockStatus); diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java index c35338e9..a655d93f 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockManager.java @@ -15,14 +15,14 @@ */ package io.seata.server.lock; -import java.util.List; - import io.seata.core.exception.TransactionException; import io.seata.core.lock.RowLock; import io.seata.core.model.LockStatus; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; +import java.util.List; + /** * The interface Lock manager. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java index 65303260..cec4f0da 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/LockerManagerFactory.java @@ -16,13 +16,10 @@ package io.seata.server.lock; import io.seata.common.loader.EnhancedServiceLoader; -import io.seata.common.util.StringUtils; import io.seata.config.Configuration; import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; -import io.seata.core.store.StoreMode; - -import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE; +import io.seata.server.store.StoreConfig; +import io.seata.server.store.StoreConfig.LockMode; /** * The type Lock manager factory. @@ -54,16 +51,16 @@ public class LockerManagerFactory { init(null); } - public static void init(String lockMode) { + public static void init(LockMode lockMode) { if (LOCK_MANAGER == null) { synchronized (LockerManagerFactory.class) { if (LOCK_MANAGER == null) { - if (StringUtils.isBlank(lockMode)) { - lockMode = CONFIG.getConfig(ConfigurationKeys.STORE_LOCK_MODE, - CONFIG.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE)); + if (null == lockMode) { + lockMode = StoreConfig.getLockMode(); } - if (StoreMode.contains(lockMode)) { - LOCK_MANAGER = EnhancedServiceLoader.load(LockManager.class, lockMode); + //if not exist the lock mode, throw exception + if (null != StoreConfig.StoreMode.get(lockMode.name())) { + LOCK_MANAGER = EnhancedServiceLoader.load(LockManager.class, lockMode.getName()); } } } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java index 1999b997..362d2132 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/lock/distributed/DistributedLockerFactory.java @@ -23,8 +23,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** + * Distributed locker factory * @author zhongxiang.wang - * @description Distributed locker factory */ public class DistributedLockerFactory { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java index 6995f6f3..c6bb4a10 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/ExtendedWhitespaceThrowableProxyConverter.java @@ -22,9 +22,8 @@ import ch.qos.logback.core.CoreConstants; /** * {@link ExtendedThrowableProxyConverter} that adds some additional whitespace around the * stack trace. - * + * Copied from spring-boot-xxx.jar by wang.liang * @author Phillip Webb - * @origin Copied from spring-boot-xxx.jar by wang.liang */ public class ExtendedWhitespaceThrowableProxyConverter extends ExtendedThrowableProxyConverter { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java index 665affe7..0b7689c1 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/logging/logback/appender/EnhancedLogstashEncoder.java @@ -15,12 +15,12 @@ */ package io.seata.server.logging.logback.appender; -import java.util.ArrayList; - import net.logstash.logback.composite.JsonProvider; import net.logstash.logback.composite.JsonProviders; import net.logstash.logback.encoder.LogstashEncoder; +import java.util.ArrayList; + /** * The type Enhanced logstash encoder * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java index 29d55af2..96f6ac5f 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MeterIdConstants.java @@ -15,8 +15,8 @@ */ package io.seata.server.metrics; -import io.seata.metrics.IdConstants; import io.seata.metrics.Id; +import io.seata.metrics.IdConstants; /** * Constants for meter id in tc diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java index 20e27276..bad1c27c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsManager.java @@ -25,6 +25,8 @@ import io.seata.server.event.EventBusManager; import java.util.List; +import static io.seata.common.DefaultValues.DEFAULT_METRICS_ENABLED; + /** * Metrics manager for init * @@ -47,7 +49,7 @@ public class MetricsManager { public void init() { boolean enabled = ConfigurationFactory.getInstance().getBoolean( - ConfigurationKeys.METRICS_PREFIX + ConfigurationKeys.METRICS_ENABLED, false); + ConfigurationKeys.METRICS_PREFIX + ConfigurationKeys.METRICS_ENABLED, DEFAULT_METRICS_ENABLED); if (enabled) { registry = RegistryFactory.getInstance(); if (registry != null) { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java index 393583c2..f0db1e52 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsPublisher.java @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package io.seata.server.metrics; import io.seata.core.event.EventBus; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java index 727b1993..277cee08 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/metrics/MetricsSubscriber.java @@ -15,11 +15,6 @@ */ package io.seata.server.metrics; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - import com.google.common.eventbus.Subscribe; import io.seata.core.event.GlobalTransactionEvent; import io.seata.core.model.GlobalStatus; @@ -28,10 +23,12 @@ import io.seata.server.event.EventBusManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static io.seata.metrics.IdConstants.APP_ID_KEY; -import static io.seata.metrics.IdConstants.GROUP_KEY; -import static io.seata.metrics.IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY; -import static io.seata.metrics.IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +import static io.seata.metrics.IdConstants.*; /** * Event subscriber for metrics @@ -208,7 +205,7 @@ public class MetricsSubscriber { /** * PMD check * SuppressWarnings("checkstyle:EqualsHashCode") - * @return + * @return the hash code */ @Override public int hashCode() { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java index 402701f4..4df48e0f 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/BranchSession.java @@ -15,11 +15,6 @@ */ package io.seata.server.session; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; import io.seata.common.util.CompressUtil; import io.seata.core.exception.TransactionException; import io.seata.core.model.BranchStatus; @@ -32,6 +27,11 @@ import io.seata.server.store.StoreConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import static io.seata.core.model.LockStatus.Locked; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java index 03445bd4..6019477b 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/GlobalSession.java @@ -15,17 +15,6 @@ */ package io.seata.server.session; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - import io.seata.common.Constants; import io.seata.common.DefaultValues; import io.seata.common.XID; @@ -46,9 +35,13 @@ import io.seata.server.store.StoreConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static io.seata.core.model.GlobalStatus.AsyncCommitting; -import static io.seata.core.model.GlobalStatus.CommitRetrying; -import static io.seata.core.model.GlobalStatus.Committing; +import java.nio.ByteBuffer; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import static io.seata.core.model.GlobalStatus.*; /** * The type Global session. @@ -756,7 +749,7 @@ public class GlobalSession implements SessionLifecycle, SessionStorable { public void queueToRetryRollback() throws TransactionException { this.addSessionLifecycleListener(SessionHolder.getRetryRollbackingSessionManager()); GlobalStatus currentStatus = this.getStatus(); - if (SessionHelper.isTimeoutGlobalStatus(currentStatus)) { + if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { this.setStatus(GlobalStatus.TimeoutRollbackRetrying); } else { this.setStatus(GlobalStatus.RollbackRetrying); diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java index 3b946ea7..6542a72c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionCondition.java @@ -89,6 +89,7 @@ public class SessionCondition { */ public void setStatus(GlobalStatus status) { this.status = status; + this.statuses = new GlobalStatus[] {status}; } /** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java index 4b2196e7..c8370f1f 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHelper.java @@ -15,12 +15,7 @@ */ package io.seata.server.session; -import java.util.Collection; -import java.util.List; -import java.util.Objects; - import io.seata.common.util.CollectionUtils; -import io.seata.common.util.StringUtils; import io.seata.config.Configuration; import io.seata.config.ConfigurationFactory; import io.seata.core.constants.ConfigurationKeys; @@ -28,15 +23,22 @@ import io.seata.core.context.RootContext; import io.seata.core.exception.TransactionException; import io.seata.core.model.BranchType; import io.seata.core.model.GlobalStatus; -import io.seata.core.store.StoreMode; import io.seata.metrics.IdConstants; import io.seata.server.UUIDGenerator; import io.seata.server.coordinator.DefaultCoordinator; import io.seata.server.metrics.MetricsPublisher; +import io.seata.server.store.StoreConfig; +import io.seata.server.store.StoreConfig.SessionMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +import static io.seata.common.DefaultValues.DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE; + /** * The type Session helper. * @@ -51,16 +53,14 @@ public class SessionHelper { private static final Configuration CONFIG = ConfigurationFactory.getInstance(); private static final Boolean ENABLE_BRANCH_ASYNC_REMOVE = CONFIG.getBoolean( - ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, false); + ConfigurationKeys.ENABLE_BRANCH_ASYNC_REMOVE, DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE); /** * The instance of DefaultCoordinator */ private static final DefaultCoordinator COORDINATOR = DefaultCoordinator.getInstance(); - private static final boolean DELAY_HANDLE_SESSION = - !StringUtils.equalsIgnoreCase(ConfigurationFactory.getInstance().getConfig(ConfigurationKeys.STORE_SESSION_MODE, - ConfigurationFactory.getInstance().getConfig(ConfigurationKeys.STORE_MODE)), StoreMode.FILE.getName()); + private static final boolean DELAY_HANDLE_SESSION = StoreConfig.getSessionMode() != SessionMode.FILE; private SessionHelper() { } @@ -146,7 +146,24 @@ public class SessionHelper { * @throws TransactionException the transaction exception */ public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { - globalSession.changeGlobalStatus(GlobalStatus.CommitFailed); + endCommitFailed(globalSession, retryGlobal, false); + } + + /** + * End commit failed. + * + * @param globalSession the global session + * @param retryGlobal the retry global + * @param isRetryTimeout is retry timeout + * @throws TransactionException the transaction exception + */ + public static void endCommitFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout) + throws TransactionException { + if (isRetryTimeout) { + globalSession.changeGlobalStatus(GlobalStatus.CommitRetryTimeout); + } else { + globalSession.changeGlobalStatus(GlobalStatus.CommitFailed); + } LOGGER.error("The Global session {} has changed the status to {}, need to be handled it manually.", globalSession.getXid(), globalSession.getStatus()); @@ -164,22 +181,27 @@ public class SessionHelper { public static void endRollbacked(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { if (retryGlobal || !DELAY_HANDLE_SESSION) { long beginTime = System.currentTimeMillis(); + boolean timeoutDone = false; GlobalStatus currentStatus = globalSession.getStatus(); + if (currentStatus == GlobalStatus.TimeoutRollbacking) { + MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.TimeoutRollbacked, false, false); + timeoutDone = true; + } boolean retryBranch = - currentStatus == GlobalStatus.TimeoutRollbackRetrying || currentStatus == GlobalStatus.RollbackRetrying; - if (isTimeoutGlobalStatus(currentStatus)) { + currentStatus == GlobalStatus.TimeoutRollbackRetrying || currentStatus == GlobalStatus.RollbackRetrying; + if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbacked); } else { globalSession.changeGlobalStatus(GlobalStatus.Rollbacked); } globalSession.end(); - if (!DELAY_HANDLE_SESSION) { + if (!DELAY_HANDLE_SESSION && !timeoutDone) { MetricsPublisher.postSessionDoneEvent(globalSession, false, false); } MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_ROLLBACKED_KEY, true, - beginTime, retryBranch); + beginTime, retryBranch); } else { - MetricsPublisher.postSessionDoneEvent(globalSession, false, false); + MetricsPublisher.postSessionDoneEvent(globalSession, GlobalStatus.Rollbacked, false, false); } } @@ -191,8 +213,22 @@ public class SessionHelper { * @throws TransactionException the transaction exception */ public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal) throws TransactionException { + endRollbackFailed(globalSession, retryGlobal, false); + } + + /** + * End rollback failed. + * + * @param globalSession the global session + * @param retryGlobal the retry global + * @param isRetryTimeout is retry timeout + * @throws TransactionException the transaction exception + */ + public static void endRollbackFailed(GlobalSession globalSession, boolean retryGlobal, boolean isRetryTimeout) throws TransactionException { GlobalStatus currentStatus = globalSession.getStatus(); - if (isTimeoutGlobalStatus(currentStatus)) { + if (isRetryTimeout) { + globalSession.changeGlobalStatus(GlobalStatus.RollbackRetryTimeout); + } else if (SessionStatusValidator.isTimeoutGlobalStatus(currentStatus)) { globalSession.changeGlobalStatus(GlobalStatus.TimeoutRollbackFailed); } else { globalSession.changeGlobalStatus(GlobalStatus.RollbackFailed); @@ -202,13 +238,6 @@ public class SessionHelper { MetricsPublisher.postSessionDoneEvent(globalSession, retryGlobal, false); } - public static boolean isTimeoutGlobalStatus(GlobalStatus status) { - return status == GlobalStatus.TimeoutRollbacked - || status == GlobalStatus.TimeoutRollbackFailed - || status == GlobalStatus.TimeoutRollbacking - || status == GlobalStatus.TimeoutRollbackRetrying; - } - /** * Foreach global sessions. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java index f22153cd..849a7896 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionHolder.java @@ -15,16 +15,7 @@ */ package io.seata.server.session; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.CompletableFuture; - import io.seata.common.ConfigurationKeys; -import io.seata.core.model.LockStatus; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import io.seata.common.XID; import io.seata.common.exception.ShouldNeverHappenException; import io.seata.common.exception.StoreException; @@ -35,12 +26,21 @@ import io.seata.config.Configuration; import io.seata.config.ConfigurationFactory; import io.seata.core.exception.TransactionException; import io.seata.core.model.GlobalStatus; +import io.seata.core.model.LockStatus; import io.seata.core.store.DistributedLockDO; import io.seata.core.store.DistributedLocker; import io.seata.server.lock.distributed.DistributedLockerFactory; -import io.seata.core.store.StoreMode; +import io.seata.server.store.StoreConfig; +import io.seata.server.store.StoreConfig.SessionMode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE; +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static io.seata.common.DefaultValues.DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME; /** * The type Session holder. @@ -80,7 +80,7 @@ public class SessionHolder { /** * The redis distributed lock expire time */ - private static long DISTRIBUTED_LOCK_EXPIRE_TIME = CONFIG.getLong(ConfigurationKeys.DISTRIBUTED_LOCK_EXPIRE_TIME, 10000); + private static long DISTRIBUTED_LOCK_EXPIRE_TIME = CONFIG.getLong(ConfigurationKeys.DISTRIBUTED_LOCK_EXPIRE_TIME, DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME); private static SessionManager ROOT_SESSION_MANAGER; private static SessionManager ASYNC_COMMITTING_SESSION_MANAGER; @@ -89,56 +89,57 @@ public class SessionHolder { private static DistributedLocker DISTRIBUTED_LOCKER; + public static void init() { + init(null); + } /** * Init. * - * @param mode the store mode: file, db, redis + * @param sessionMode the store mode: file, db, redis * @throws IOException the io exception */ - public static void init(String mode) { - if (StringUtils.isBlank(mode)) { - mode = CONFIG.getConfig(ConfigurationKeys.STORE_SESSION_MODE, - CONFIG.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE)); + public static void init(SessionMode sessionMode) { + if (null == sessionMode) { + sessionMode = StoreConfig.getSessionMode(); } - StoreMode storeMode = StoreMode.get(mode); - if (StoreMode.DB.equals(storeMode)) { - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.DB.getName()); - ASYNC_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.DB.getName(), + if (SessionMode.DB.equals(sessionMode)) { + ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName()); + ASYNC_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(), new Object[]{ASYNC_COMMITTING_SESSION_MANAGER_NAME}); - RETRY_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.DB.getName(), + RETRY_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(), new Object[]{RETRY_COMMITTING_SESSION_MANAGER_NAME}); - RETRY_ROLLBACKING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.DB.getName(), + RETRY_ROLLBACKING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.DB.getName(), new Object[]{RETRY_ROLLBACKING_SESSION_MANAGER_NAME}); - DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(StoreMode.DB.getName()); - } else if (StoreMode.FILE.equals(storeMode)) { + DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.DB.getName()); + } else if (SessionMode.FILE.equals(sessionMode)) { String sessionStorePath = CONFIG.getConfig(ConfigurationKeys.STORE_FILE_DIR, DEFAULT_SESSION_STORE_FILE_DIR); if (StringUtils.isBlank(sessionStorePath)) { throw new StoreException("the {store.file.dir} is empty."); } - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.FILE.getName(), + ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.FILE.getName(), new Object[]{ROOT_SESSION_MANAGER_NAME, sessionStorePath}); ASYNC_COMMITTING_SESSION_MANAGER = ROOT_SESSION_MANAGER; RETRY_COMMITTING_SESSION_MANAGER = ROOT_SESSION_MANAGER; RETRY_ROLLBACKING_SESSION_MANAGER = ROOT_SESSION_MANAGER; - DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(StoreMode.FILE.getName()); - } else if (StoreMode.REDIS.equals(storeMode)) { - ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, StoreMode.REDIS.getName()); + DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.FILE.getName()); + } else if (SessionMode.REDIS.equals(sessionMode)) { + ROOT_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, SessionMode.REDIS.getName()); ASYNC_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, - StoreMode.REDIS.getName(), new Object[]{ASYNC_COMMITTING_SESSION_MANAGER_NAME}); + SessionMode.REDIS.getName(), new Object[]{ASYNC_COMMITTING_SESSION_MANAGER_NAME}); RETRY_COMMITTING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, - StoreMode.REDIS.getName(), new Object[]{RETRY_COMMITTING_SESSION_MANAGER_NAME}); + SessionMode.REDIS.getName(), new Object[]{RETRY_COMMITTING_SESSION_MANAGER_NAME}); RETRY_ROLLBACKING_SESSION_MANAGER = EnhancedServiceLoader.load(SessionManager.class, - StoreMode.REDIS.getName(), new Object[]{RETRY_ROLLBACKING_SESSION_MANAGER_NAME}); + SessionMode.REDIS.getName(), new Object[]{RETRY_ROLLBACKING_SESSION_MANAGER_NAME}); - DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(StoreMode.REDIS.getName()); + DISTRIBUTED_LOCKER = DistributedLockerFactory.getDistributedLocker(SessionMode.REDIS.getName()); } else { // unknown store - throw new IllegalArgumentException("unknown store mode:" + mode); + throw new IllegalArgumentException("unknown store mode:" + sessionMode.getName()); } - reload(storeMode); + reload(sessionMode); } //region reload @@ -146,15 +147,15 @@ public class SessionHolder { /** * Reload. * - * @param storeMode the mode of store + * @param sessionMode the mode of store */ - protected static void reload(StoreMode storeMode) { + protected static void reload(SessionMode sessionMode) { if (ROOT_SESSION_MANAGER instanceof Reloadable) { ((Reloadable) ROOT_SESSION_MANAGER).reload(); } - if (storeMode == StoreMode.FILE) { + if (SessionMode.FILE.equals(sessionMode)) { Collection allSessions = ROOT_SESSION_MANAGER.allSessions(); if (CollectionUtils.isNotEmpty(allSessions)) { for (GlobalSession globalSession : allSessions) { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java index 6aaba67a..ac357eb9 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionManager.java @@ -15,13 +15,14 @@ */ package io.seata.server.session; -import java.util.Collection; -import java.util.List; import io.seata.core.exception.TransactionException; import io.seata.core.model.BranchStatus; import io.seata.core.model.GlobalStatus; import io.seata.core.rpc.Disposable; +import java.util.Collection; +import java.util.List; + /** * The interface Session manager. * @@ -119,6 +120,7 @@ public interface SessionManager extends SessionLifecycleListener, Disposable { * @param globalSession the global session * @param lockCallable the lock Callable * @return the value + * @throws TransactionException the transaction exception */ T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable lockCallable) throws TransactionException; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java new file mode 100644 index 00000000..20323a7e --- /dev/null +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/session/SessionStatusValidator.java @@ -0,0 +1,87 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.server.session; + +import io.seata.core.model.GlobalStatus; + +/** + * The type change status validator. + * + * @author Bughue + */ +public class SessionStatusValidator { + + /** + * is timeout global status + * + * @param status the global session + */ + public static boolean isTimeoutGlobalStatus(GlobalStatus status) { + return status == GlobalStatus.TimeoutRollbacked + || status == GlobalStatus.TimeoutRollbackFailed + || status == GlobalStatus.TimeoutRollbacking + || status == GlobalStatus.TimeoutRollbackRetrying; + } + + /** + * is rollback global status + * + * @param status the global session + */ + public static boolean isRollbackGlobalStatus(GlobalStatus status) { + return status == GlobalStatus.Rollbacking + || status == GlobalStatus.RollbackRetrying + || status == GlobalStatus.Rollbacked + || status == GlobalStatus.RollbackFailed + || status == GlobalStatus.RollbackRetryTimeout; + } + + /** + * is commit global status + * + * @param status the global session + */ + public static boolean isCommitGlobalStatus(GlobalStatus status) { + return status == GlobalStatus.Committing + || status == GlobalStatus.AsyncCommitting + || status == GlobalStatus.CommitRetrying + || status == GlobalStatus.Committed + || status == GlobalStatus.CommitFailed + || status == GlobalStatus.CommitRetryTimeout; + } + + /** + * check the relation of before status and after status + * + * @param before the global session + * @param after the global session + */ + public static boolean validateUpdateStatus(GlobalStatus before, GlobalStatus after) { + if (isTimeoutGlobalStatus(before) && isCommitGlobalStatus(after)) { + return false; + } + if (isCommitGlobalStatus(before) && isTimeoutGlobalStatus(after)) { + return false; + } + if (isRollbackGlobalStatus(before) && isCommitGlobalStatus(after)) { + return false; + } + if (isCommitGlobalStatus(before) && isRollbackGlobalStatus(after)) { + return false; + } + return true; + } +} diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java index 61170d03..b6b2f957 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/SessionConverter.java @@ -15,25 +15,22 @@ */ package io.seata.server.storage; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.Collections; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; -import io.seata.server.console.vo.BranchSessionVO; -import io.seata.server.console.vo.GlobalSessionVO; import io.seata.core.model.BranchStatus; import io.seata.core.model.BranchType; import io.seata.core.model.GlobalStatus; import io.seata.core.store.BranchTransactionDO; import io.seata.core.store.GlobalTransactionDO; +import io.seata.server.console.vo.BranchSessionVO; +import io.seata.server.console.vo.GlobalSessionVO; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; import io.seata.server.store.SessionStorable; import org.springframework.beans.BeanUtils; +import java.util.*; + /** * The session converter * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java index 0b39a012..1b68600d 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseDistributedLocker.java @@ -16,23 +16,13 @@ package io.seata.server.storage.db.lock; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Objects; -import javax.sql.DataSource; import io.seata.common.exception.ShouldNeverHappenException; import io.seata.common.loader.EnhancedServiceLoader; import io.seata.common.loader.LoadLevel; import io.seata.common.loader.Scope; import io.seata.common.util.IOUtil; import io.seata.common.util.StringUtils; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationCache; -import io.seata.config.ConfigurationChangeEvent; -import io.seata.config.ConfigurationChangeListener; -import io.seata.config.ConfigurationFactory; +import io.seata.config.*; import io.seata.core.constants.ConfigurationKeys; import io.seata.core.constants.ServerTableColumnsName; import io.seata.core.store.DistributedLockDO; @@ -42,6 +32,13 @@ import io.seata.core.store.db.sql.distributed.lock.DistributedLockSqlFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Objects; + import static io.seata.core.constants.ConfigurationKeys.DISTRIBUTED_LOCK_DB_TABLE; /** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java index 1e4736fb..f73df2f9 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLockManager.java @@ -15,7 +15,6 @@ */ package io.seata.server.storage.db.lock; -import javax.sql.DataSource; import io.seata.common.executor.Initialize; import io.seata.common.loader.EnhancedServiceLoader; import io.seata.common.loader.LoadLevel; @@ -28,6 +27,8 @@ import io.seata.server.lock.AbstractLockManager; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; +import javax.sql.DataSource; + /** * The type db lock manager. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java index 92d46cec..8355bc03 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/DataBaseLocker.java @@ -15,8 +15,6 @@ */ package io.seata.server.storage.db.lock; -import java.util.List; -import javax.sql.DataSource; import io.seata.common.exception.DataAccessException; import io.seata.common.exception.StoreException; import io.seata.common.util.CollectionUtils; @@ -25,6 +23,9 @@ import io.seata.core.lock.RowLock; import io.seata.core.model.LockStatus; import io.seata.core.store.LockStore; +import javax.sql.DataSource; +import java.util.List; + /** * The type Data base locker. * @@ -89,7 +90,7 @@ public class DataBaseLocker extends AbstractLocker { @Override public boolean releaseLock(String xid, Long branchId) { try { - return lockStore.unLock(xid, branchId); + return lockStore.unLock(branchId); } catch (StoreException e) { throw e; } catch (Exception t) { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java index f732fef4..21f5fa25 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/lock/LockStoreDataBaseDAO.java @@ -15,16 +15,6 @@ */ package io.seata.server.storage.db.lock; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import javax.sql.DataSource; import io.seata.common.exception.DataAccessException; import io.seata.common.exception.StoreException; import io.seata.common.util.CollectionUtils; @@ -43,6 +33,13 @@ import io.seata.core.store.db.sql.lock.LockStoreSqlFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.sql.DataSource; +import java.sql.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import static io.seata.common.DefaultValues.DEFAULT_LOCK_DB_TABLE; import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; @@ -239,27 +236,6 @@ public class LockStoreDataBaseDAO implements LockStore { return true; } - @Override - public boolean unLock(String xid, Long branchId) { - Connection conn = null; - PreparedStatement ps = null; - try { - conn = lockStoreDataSource.getConnection(); - conn.setAutoCommit(true); - //batch release lock by branch - String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByBranch(lockTable); - ps = conn.prepareStatement(batchDeleteSQL); - ps.setString(1, xid); - ps.setLong(2, branchId); - ps.executeUpdate(); - } catch (SQLException e) { - throw new StoreException(e); - } finally { - IOUtil.close(ps, conn); - } - return true; - } - @Override public boolean unLock(String xid) { Connection conn = null; @@ -280,6 +256,26 @@ public class LockStoreDataBaseDAO implements LockStore { return true; } + @Override + public boolean unLock(Long branchId) { + Connection conn = null; + PreparedStatement ps = null; + try { + conn = lockStoreDataSource.getConnection(); + conn.setAutoCommit(true); + //batch release lock by branchId + String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByBranchId(lockTable); + ps = conn.prepareStatement(batchDeleteSQL); + ps.setLong(1, branchId); + ps.executeUpdate(); + } catch (SQLException e) { + throw new StoreException(e); + } finally { + IOUtil.close(ps, conn); + } + return true; + } + @Override public boolean isLockable(List lockDOs) { Connection conn = null; @@ -335,6 +331,9 @@ public class LockStoreDataBaseDAO implements LockStore { ps.setInt(8, LockStatus.Locked.getCode()); return ps.executeUpdate() > 0; } catch (SQLException e) { + if (e instanceof SQLIntegrityConstraintViolationException) { + return false; + } throw new StoreException(e); } finally { IOUtil.close(ps); @@ -348,7 +347,7 @@ public class LockStoreDataBaseDAO implements LockStore { * @param lockDOs the lock do list * @return the boolean */ - protected boolean doAcquireLocks(Connection conn, List lockDOs) { + protected boolean doAcquireLocks(Connection conn, List lockDOs) throws SQLException { PreparedStatement ps = null; try { //insert @@ -366,10 +365,12 @@ public class LockStoreDataBaseDAO implements LockStore { ps.addBatch(); } return ps.executeBatch().length == lockDOs.size(); - } catch (SQLException e) { + } catch (SQLIntegrityConstraintViolationException e) { LOGGER.error("Global lock batch acquire error: {}", e.getMessage(), e); //return false,let the caller go to conn.rollabck() return false; + } catch (SQLException e) { + throw e; } finally { IOUtil.close(ps); } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java index 8bc10ad8..f93e3a9e 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/session/DataBaseSessionManager.java @@ -15,8 +15,6 @@ */ package io.seata.server.storage.db.session; -import java.util.Collection; -import java.util.List; import io.seata.common.exception.StoreException; import io.seata.common.executor.Initialize; import io.seata.common.loader.LoadLevel; @@ -25,16 +23,15 @@ import io.seata.common.util.StringUtils; import io.seata.core.exception.TransactionException; import io.seata.core.model.BranchStatus; import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionHolder; +import io.seata.server.session.*; import io.seata.server.storage.db.store.DataBaseTransactionStoreManager; import io.seata.server.store.TransactionStoreManager.LogOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collection; +import java.util.List; + /** * The Data base session manager. * @@ -108,7 +105,7 @@ public class DataBaseSessionManager extends AbstractSessionManager * 1. rootSessionManager remove normal globalSession * 2. retryCommitSessionManager and retryRollbackSessionManager remove retry expired globalSession * @param session the session - * @throws TransactionException + * @throws TransactionException the transaction exception */ @Override public void removeGlobalSession(GlobalSession session) throws TransactionException { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java index 16fac553..421a21f6 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/DataBaseTransactionStoreManager.java @@ -15,14 +15,6 @@ */ package io.seata.server.storage.db.store; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.sql.DataSource; - import io.seata.common.exception.StoreException; import io.seata.common.loader.EnhancedServiceLoader; import io.seata.common.util.CollectionUtils; @@ -37,10 +29,14 @@ import io.seata.core.store.LogStore; import io.seata.core.store.db.DataSourceProvider; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionCondition; +import io.seata.server.storage.SessionConverter; import io.seata.server.store.AbstractTransactionStoreManager; import io.seata.server.store.SessionStorable; import io.seata.server.store.TransactionStoreManager; -import io.seata.server.storage.SessionConverter; + +import javax.sql.DataSource; +import java.util.*; +import java.util.stream.Collectors; import static io.seata.core.constants.RedisKeyConstants.DEFAULT_LOG_QUERY_LIMIT; @@ -165,6 +161,11 @@ public class DataBaseTransactionStoreManager extends AbstractTransactionStoreMan return getGlobalSession(globalTransactionDO, branchTransactionDOs); } + @Override + public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { + return readSession(new GlobalStatus[] {GlobalStatus.Begin}, withBranchSessions); + } + /** * Read session list. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java index 3aa86db0..94baf8e3 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/db/store/LogStoreDataBaseDAO.java @@ -15,15 +15,6 @@ */ package io.seata.server.storage.db.store; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import javax.sql.DataSource; - import io.seata.common.exception.DataAccessException; import io.seata.common.exception.StoreException; import io.seata.common.util.IOUtil; @@ -39,6 +30,11 @@ import io.seata.core.store.db.sql.log.LogStoreSqlsFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.sql.DataSource; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_BRANCH_TABLE; import static io.seata.common.DefaultValues.DEFAULT_STORE_DB_GLOBAL_TABLE; diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java index 177d0e52..d5e4d3e2 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/TransactionWriteStore.java @@ -15,14 +15,14 @@ */ package io.seata.server.storage.file; -import java.nio.ByteBuffer; - import io.seata.common.exception.ShouldNeverHappenException; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; import io.seata.server.store.SessionStorable; import io.seata.server.store.TransactionStoreManager.LogOperation; +import java.nio.ByteBuffer; + /** * The type Transaction write store. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java index 37f8e2df..72e897e7 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLockManager.java @@ -15,8 +15,6 @@ */ package io.seata.server.storage.file.lock; -import java.util.List; - import io.seata.common.loader.LoadLevel; import io.seata.core.exception.TransactionException; import io.seata.core.lock.Locker; @@ -25,6 +23,8 @@ import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; import org.slf4j.MDC; +import java.util.List; + import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID; /** diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java index f3f40333..fe111022 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/lock/FileLocker.java @@ -15,12 +15,6 @@ */ package io.seata.server.storage.file.lock; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - import io.seata.common.exception.FrameworkException; import io.seata.common.exception.StoreException; import io.seata.common.util.CollectionUtils; @@ -31,6 +25,11 @@ import io.seata.core.lock.RowLock; import io.seata.core.model.LockStatus; import io.seata.server.session.BranchSession; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflictFailFast; @@ -196,7 +195,7 @@ public class FileLocker extends AbstractLocker { /** * Because bucket lock map will be key of HashMap(lockHolder), however {@link ConcurrentHashMap} overwrites - * {@link Object##hashCode()} and {@link Object##equals(Object)}, that leads to hash key conflict in lockHolder. + * {@link Object#hashCode()} and {@link Object#equals(Object)}, that leads to hash key conflict in lockHolder. * We define a {@link BucketLockMap} to hold the ConcurrentHashMap(bucketLockMap) and replace it as key of * HashMap(lockHolder). */ diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java index b5e1a0f9..504ec495 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/session/FileSessionManager.java @@ -15,19 +15,6 @@ */ package io.seata.server.storage.file.session; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Arrays; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; - import io.seata.common.exception.ShouldNeverHappenException; import io.seata.common.loader.LoadLevel; import io.seata.common.loader.Scope; @@ -37,11 +24,7 @@ import io.seata.config.ConfigurationFactory; import io.seata.core.constants.ConfigurationKeys; import io.seata.core.exception.TransactionException; import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.Reloadable; -import io.seata.server.session.SessionCondition; +import io.seata.server.session.*; import io.seata.server.storage.file.ReloadableStore; import io.seata.server.storage.file.TransactionWriteStore; import io.seata.server.storage.file.store.FileTransactionStoreManager; @@ -49,6 +32,13 @@ import io.seata.server.store.AbstractTransactionStoreManager; import io.seata.server.store.SessionStorable; import io.seata.server.store.TransactionStoreManager; +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +import static io.seata.common.DefaultValues.DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE; + /** * The type File based session manager. @@ -59,7 +49,7 @@ import io.seata.server.store.TransactionStoreManager; public class FileSessionManager extends AbstractSessionManager implements Reloadable { private static final int READ_SIZE = ConfigurationFactory.getInstance().getInt( - ConfigurationKeys.SERVICE_SESSION_RELOAD_READ_SIZE, 100); + ConfigurationKeys.SERVICE_SESSION_RELOAD_READ_SIZE, DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE); /** * The Session map. */ diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java index 69b6f4d1..6b3c1c77 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/file/store/FileTransactionStoreManager.java @@ -15,6 +15,24 @@ */ package io.seata.server.storage.file.store; +import io.seata.common.exception.StoreException; +import io.seata.common.thread.NamedThreadFactory; +import io.seata.common.util.CollectionUtils; +import io.seata.server.session.BranchSession; +import io.seata.server.session.GlobalSession; +import io.seata.server.session.SessionCondition; +import io.seata.server.session.SessionManager; +import io.seata.server.storage.file.FlushDiskMode; +import io.seata.server.storage.file.ReloadableStore; +import io.seata.server.storage.file.TransactionWriteStore; +import io.seata.server.store.AbstractTransactionStoreManager; +import io.seata.server.store.SessionStorable; +import io.seata.server.store.StoreConfig; +import io.seata.server.store.TransactionStoreManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -24,32 +42,10 @@ import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; -import io.seata.common.exception.StoreException; -import io.seata.common.thread.NamedThreadFactory; -import io.seata.common.util.CollectionUtils; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionManager; -import io.seata.server.store.AbstractTransactionStoreManager; -import io.seata.server.storage.file.FlushDiskMode; -import io.seata.server.storage.file.ReloadableStore; -import io.seata.server.store.SessionStorable; -import io.seata.server.store.StoreConfig; -import io.seata.server.store.TransactionStoreManager; -import io.seata.server.storage.file.TransactionWriteStore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; - import static io.seata.core.context.RootContext.MDC_KEY_BRANCH_ID; /** @@ -335,7 +331,9 @@ public class FileTransactionStoreManager extends AbstractTransactionStoreManager } } try { - currFileChannel.force(true); + if (currFileChannel.isOpen()) { + currFileChannel.force(true); + } } catch (IOException e) { LOGGER.error("fileChannel force error: {}", e.getMessage(), e); } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java index 6e580ca6..b0f6c61c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/JedisPooledFactory.java @@ -15,10 +15,6 @@ */ package io.seata.server.storage.redis; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - import io.seata.common.exception.RedisException; import io.seata.common.util.ConfigTools; import io.seata.common.util.StringUtils; @@ -27,11 +23,11 @@ import io.seata.config.ConfigurationFactory; import io.seata.core.constants.ConfigurationKeys; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolAbstract; -import redis.clients.jedis.JedisPoolConfig; -import redis.clients.jedis.JedisSentinelPool; +import redis.clients.jedis.*; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; /** * @author funkye @@ -62,7 +58,7 @@ public class JedisPooledFactory { /** * get the RedisPool instance (singleton) - * + * * @return redisPool */ public static JedisPoolAbstract getJedisPoolInstance(JedisPoolAbstract... jedisPools) { @@ -122,7 +118,7 @@ public class JedisPooledFactory { /** * get an instance of Jedis (connection) from the connection pool - * + * * @return jedis */ public static Jedis getJedisInstance() { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java index 4aa20e2b..ecd60cac 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisDistributedLocker.java @@ -27,7 +27,7 @@ import redis.clients.jedis.Transaction; import redis.clients.jedis.params.SetParams; /** - * @description Redis distributed lock + * Redis distributed lock * @author zhongxiang.wang */ @LoadLevel(name = "redis", scope = Scope.SINGLETON) @@ -39,18 +39,15 @@ public class RedisDistributedLocker implements DistributedLocker { /** * Acquire the distributed lock * - * @param distributedLockDO - * @return + * @param distributedLockDO the distributed lock info + * @return the distributed lock info */ @Override public boolean acquireLock(DistributedLockDO distributedLockDO) { try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { //Don't need retry,if can't acquire the lock,let the other get the lock String result = jedis.set(distributedLockDO.getLockKey(), distributedLockDO.getLockValue(), SetParams.setParams().nx().px(distributedLockDO.getExpireTime())); - if (SUCCESS.equalsIgnoreCase(result)) { - return true; - } - return false; + return SUCCESS.equalsIgnoreCase(result); } catch (Exception ex) { LOGGER.error("The {} acquired the {} distributed lock failed.", distributedLockDO.getLockValue(), distributedLockDO.getLockKey(), ex); return false; @@ -61,8 +58,8 @@ public class RedisDistributedLocker implements DistributedLocker { /** * Release the distributed lock * - * @param distributedLockDO - * @return + * @param distributedLockDO the distributed lock info + * @return the boolean */ @Override public boolean releaseLock(DistributedLockDO distributedLockDO) { diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java index 81260e6f..361b1624 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/lock/RedisLocker.java @@ -15,20 +15,6 @@ */ package io.seata.server.storage.redis.lock; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.StringJoiner; -import java.util.stream.Collectors; import com.google.common.collect.Lists; import io.seata.common.exception.StoreException; import io.seata.common.io.FileLoader; @@ -46,6 +32,10 @@ import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; + import static io.seata.common.Constants.ROW_LOCK_KEY_SPLIT_CHAR; import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_GLOBAL_LOCK_PREFIX; import static io.seata.core.constants.RedisKeyConstants.DEFAULT_REDIS_SEATA_ROW_LOCK_PREFIX; @@ -359,7 +349,7 @@ public class RedisLocker extends AbstractLocker { Map rowKeyMap = jedis.hgetAll(xidLockKey); rowKeyMap.forEach((branch, rowKey) -> rowKeys.add(rowKey)); } else { - rowKeys.addAll(jedis.hmget(xidLockKey, branchId.toString())); + rowKeys.add(jedis.hget(xidLockKey, branchId.toString())); } if (CollectionUtils.isNotEmpty(rowKeys)) { Pipeline pipelined = jedis.pipelined(); diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java index 7eecafd4..50120200 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/session/RedisSessionManager.java @@ -15,9 +15,6 @@ */ package io.seata.server.storage.redis.session; -import java.util.Collection; -import java.util.List; - import io.seata.common.exception.StoreException; import io.seata.common.executor.Initialize; import io.seata.common.loader.LoadLevel; @@ -26,16 +23,15 @@ import io.seata.common.util.StringUtils; import io.seata.core.exception.TransactionException; import io.seata.core.model.BranchStatus; import io.seata.core.model.GlobalStatus; -import io.seata.server.session.AbstractSessionManager; -import io.seata.server.session.BranchSession; -import io.seata.server.session.GlobalSession; -import io.seata.server.session.SessionCondition; -import io.seata.server.session.SessionHolder; +import io.seata.server.session.*; import io.seata.server.storage.redis.store.RedisTransactionStoreManager; import io.seata.server.store.TransactionStoreManager.LogOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collection; +import java.util.List; + /** * @author funkye */ @@ -167,16 +163,15 @@ public class RedisSessionManager extends AbstractSessionManager if (SessionHolder.ASYNC_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) { return findGlobalSessions(new SessionCondition(GlobalStatus.AsyncCommitting)); } else if (SessionHolder.RETRY_COMMITTING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) { - return findGlobalSessions(new SessionCondition(new GlobalStatus[] {GlobalStatus.CommitRetrying, GlobalStatus.Committing})); + return findGlobalSessions(new SessionCondition(GlobalStatus.CommitRetrying, GlobalStatus.Committing)); } else if (SessionHolder.RETRY_ROLLBACKING_SESSION_MANAGER_NAME.equalsIgnoreCase(taskName)) { - return findGlobalSessions(new SessionCondition(new GlobalStatus[] {GlobalStatus.RollbackRetrying, - GlobalStatus.Rollbacking, GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying})); + return findGlobalSessions(new SessionCondition(GlobalStatus.RollbackRetrying, GlobalStatus.Rollbacking, + GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying)); } else { // all data - return findGlobalSessions(new SessionCondition(new GlobalStatus[] {GlobalStatus.UnKnown, GlobalStatus.Begin, - GlobalStatus.Committing, GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, - GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking, GlobalStatus.TimeoutRollbackRetrying, - GlobalStatus.AsyncCommitting})); + return findGlobalSessions(new SessionCondition(GlobalStatus.UnKnown, GlobalStatus.Begin, GlobalStatus.Committing, + GlobalStatus.CommitRetrying, GlobalStatus.Rollbacking, GlobalStatus.RollbackRetrying, GlobalStatus.TimeoutRollbacking, + GlobalStatus.TimeoutRollbackRetrying, GlobalStatus.AsyncCommitting)); } } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java index d1510379..d680c462 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/storage/redis/store/RedisTransactionStoreManager.java @@ -15,21 +15,6 @@ */ package io.seata.server.storage.redis.store; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Date; -import java.util.Optional; -import java.util.Collections; -import java.util.function.Function; -import java.util.stream.Collectors; -import io.seata.config.Configuration; -import io.seata.config.ConfigurationFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableMap; import io.seata.common.XID; import io.seata.common.exception.RedisException; @@ -37,29 +22,32 @@ import io.seata.common.exception.StoreException; import io.seata.common.util.BeanUtils; import io.seata.common.util.CollectionUtils; import io.seata.common.util.StringUtils; -import io.seata.server.console.param.GlobalSessionParam; +import io.seata.config.Configuration; +import io.seata.config.ConfigurationFactory; import io.seata.core.model.GlobalStatus; import io.seata.core.store.BranchTransactionDO; import io.seata.core.store.GlobalTransactionDO; +import io.seata.server.console.param.GlobalSessionParam; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionCondition; +import io.seata.server.session.SessionStatusValidator; import io.seata.server.storage.SessionConverter; import io.seata.server.storage.redis.JedisPooledFactory; import io.seata.server.store.AbstractTransactionStoreManager; import io.seata.server.store.SessionStorable; import io.seata.server.store.TransactionStoreManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; import redis.clients.jedis.Transaction; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + import static io.seata.common.ConfigurationKeys.STORE_REDIS_QUERY_LIMIT; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_XID; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_XID; -import static io.seata.core.constants.RedisKeyConstants.DEFAULT_LOG_QUERY_LIMIT; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_STATUS; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_STATUS; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_GLOBAL_GMT_MODIFIED; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_GMT_MODIFIED; -import static io.seata.core.constants.RedisKeyConstants.REDIS_KEY_BRANCH_APPLICATION_DATA; +import static io.seata.core.constants.RedisKeyConstants.*; /** * The redis transaction store manager @@ -84,6 +72,9 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage /**the prefix of the global transaction status*/ private static final String REDIS_SEATA_STATUS_PREFIX = "SEATA_STATUS_"; + /**the key of global transaction status for begin*/ + private static final String REDIS_SEATA_BEGIN_TRANSACTIONS_KEY = "SEATA_BEGIN_TRANSACTIONS"; + private static volatile RedisTransactionStoreManager instance; private static final String OK = "OK"; @@ -120,13 +111,6 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage initGlobalMap(); initBranchMap(); logQueryLimit = CONFIG.getInt(STORE_REDIS_QUERY_LIMIT, DEFAULT_LOG_QUERY_LIMIT); - /** - * redis mode: if DEFAULT_LOG_QUERY_LIMIT < STORE_REDIS_QUERY_LIMIT get DEFAULT_LOG_QUERY_LIMIT if - * DEFAULT_LOG_QUERY_LIMIT >= STORE_REDIS_QUERY_LIMIT get STORE_REDIS_QUERY_LIMIT - */ - if (logQueryLimit > DEFAULT_LOG_QUERY_LIMIT) { - logQueryLimit = DEFAULT_LOG_QUERY_LIMIT; - } } /** @@ -143,7 +127,6 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage /** * init globalMap * - * @return void */ public void initGlobalMap() { if (CollectionUtils.isEmpty(branchMap)) { @@ -158,7 +141,6 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage /** * init branchMap * - * @return void */ public void initBranchMap() { if (CollectionUtils.isEmpty(branchMap)) { @@ -264,7 +246,10 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage globalTransactionDO.setGmtCreate(now); globalTransactionDO.setGmtModified(now); pipelined.hmset(globalKey, BeanUtils.objectToMap(globalTransactionDO)); - pipelined.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), globalTransactionDO.getXid()); + String xid = globalTransactionDO.getXid(); + pipelined.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid); + pipelined.zadd(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, + globalTransactionDO.getBeginTime() + globalTransactionDO.getTimeout(), globalKey); pipelined.sync(); return true; } catch (Exception ex) { @@ -293,6 +278,10 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage try (Pipeline pipelined = jedis.pipelined()) { pipelined.lrem(buildGlobalStatus(globalTransactionDO.getStatus()), 0, globalTransactionDO.getXid()); pipelined.del(globalKey); + if (GlobalStatus.Begin.getCode() == globalTransactionDO.getStatus() + || GlobalStatus.UnKnown.getCode() == globalTransactionDO.getStatus()) { + pipelined.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey); + } pipelined.sync(); } return true; @@ -326,15 +315,22 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage jedis.unwatch(); return true; } + GlobalStatus before = GlobalStatus.get(Integer.parseInt(previousStatus)); + GlobalStatus after = GlobalStatus.get(globalTransactionDO.getStatus()); + if (!SessionStatusValidator.validateUpdateStatus(before, after)) { + throw new StoreException("Illegal changing of global status, update global transaction failed." + + " beforeStatus[" + before.name() + "] cannot be changed to afterStatus[" + after.name() + "]"); + } String previousGmtModified = statusAndGmtModified.get(1); Transaction multi = jedis.multi(); Map map = new HashMap<>(2); map.put(REDIS_KEY_GLOBAL_STATUS,String.valueOf(globalTransactionDO.getStatus())); map.put(REDIS_KEY_GLOBAL_GMT_MODIFIED,String.valueOf((new Date()).getTime())); - multi.hmset(globalKey,map); - multi.lrem(buildGlobalStatus(Integer.valueOf(previousStatus)),0, xid); + multi.hmset(globalKey, map); + multi.lrem(buildGlobalStatus(Integer.valueOf(previousStatus)), 0, xid); multi.rpush(buildGlobalStatus(globalTransactionDO.getStatus()), xid); + multi.zrem(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, globalKey); List exec = multi.exec(); if (CollectionUtils.isEmpty(exec)) { //The data has changed by another tc, so we still think the modification is successful. @@ -362,10 +358,10 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage } } if (lrem > 0) { - jedis.rpush(buildGlobalStatus(Integer.valueOf(previousStatus)),xid); + jedis.rpush(buildGlobalStatus(Integer.valueOf(previousStatus)), xid); } if (rpush > 0) { - jedis.lrem(buildGlobalStatus(globalTransactionDO.getStatus()),0,xid); + jedis.lrem(buildGlobalStatus(globalTransactionDO.getStatus()), 0, xid); } return false; } @@ -420,10 +416,8 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage */ @Override public List readSession(GlobalStatus[] statuses, boolean withBranchSessions) { - List globalSessions = Collections.synchronizedList(new ArrayList<>()); List statusKeys = convertStatusKeys(statuses); - Map targetMap = calculateStatuskeysHasData(statusKeys); if (targetMap.size() == 0 || logQueryLimit <= 0) { return globalSessions; @@ -446,6 +440,45 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage return globalSessions; } + @Override + public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { + List list = Collections.emptyList(); + List statusKeys = convertStatusKeys(GlobalStatus.Begin); + Map targetMap = calculateStatuskeysHasData(statusKeys); + if (targetMap.size() == 0 || logQueryLimit <= 0) { + return list; + } + final long countGlobalSessions = targetMap.values().stream().collect(Collectors.summarizingInt(Integer::intValue)).getSum(); + // queryCount + final long queryCount = Math.min(logQueryLimit, countGlobalSessions); + try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { + Set values = + jedis.zrangeByScore(REDIS_SEATA_BEGIN_TRANSACTIONS_KEY, 0, System.currentTimeMillis(), 0, + (int) queryCount); + List> rep; + try (Pipeline pipeline = jedis.pipelined()) { + for (String value : values) { + pipeline.hgetAll(value); + } + rep = (List>) (List) pipeline.syncAndReturnAll(); + } + list = rep.stream().map(map -> { + GlobalTransactionDO globalTransactionDO = (GlobalTransactionDO) BeanUtils.mapToObject(map, + GlobalTransactionDO.class); + if (globalTransactionDO != null) { + String xid = globalTransactionDO.getXid(); + List branchTransactionDOs = new ArrayList<>(); + if (withBranchSessions) { + branchTransactionDOs = this.readBranchSessionByXid(jedis, xid); + } + return getGlobalSession(globalTransactionDO, branchTransactionDOs, withBranchSessions); + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + return list; + } + /** * get everyone keys limit * @@ -483,9 +516,11 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage } return globalSessions; } else if (CollectionUtils.isNotEmpty(sessionCondition.getStatuses())) { - return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch()); - } else if (sessionCondition.getStatus() != null) { - return readSession(new GlobalStatus[] {sessionCondition.getStatus()}, !sessionCondition.isLazyLoadBranch()); + if (sessionCondition.getStatuses().length == 1 && sessionCondition.getStatuses()[0] == GlobalStatus.Begin) { + return this.readSortByTimeoutBeginSessions(!sessionCondition.isLazyLoadBranch()); + } else { + return readSession(sessionCondition.getStatuses(), !sessionCondition.isLazyLoadBranch()); + } } return null; } @@ -657,7 +692,7 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage * @return */ private Map calculateStatuskeysHasData(List statusKeys) { - Map resultMap = Collections.synchronizedMap(new LinkedHashMap<>()); + Map resultMap = new LinkedHashMap<>(); Map keysMap = new HashMap<>(statusKeys.size()); try (Jedis jedis = JedisPooledFactory.getJedisInstance(); Pipeline pipelined = jedis.pipelined()) { statusKeys.forEach(key -> pipelined.llen(key)); @@ -699,7 +734,7 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage } } - private List convertStatusKeys(GlobalStatus[] statuses) { + private List convertStatusKeys(GlobalStatus... statuses) { List statusKeys = new ArrayList<>(); for (int i = 0; i < statuses.length; i++) { statusKeys.add(buildGlobalStatus(statuses[i].getCode())); @@ -725,7 +760,9 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage } try (Jedis jedis = JedisPooledFactory.getJedisInstance()) { - for (String key : targetMap.keySet()) { + Iterator> iterator = targetMap.entrySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next().getKey(); final long sum = listList.stream().mapToLong(List::size).sum(); final long diffCount = queryCount - sum; if (diffCount <= 0) { @@ -739,12 +776,10 @@ public class RedisTransactionStoreManager extends AbstractTransactionStoreManage list = jedis.lrange(key, start, end); } - if (list.size() > 0 && sum < queryCount) { + if (list.size() > 0) { listList.add(list); } else { - if (list.size() == 0) { - targetMap.remove(key); - } + iterator.remove(); } } } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java index a4b019f5..3595a72c 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/AbstractTransactionStoreManager.java @@ -19,6 +19,7 @@ import io.seata.core.model.GlobalStatus; import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionCondition; +import java.util.Collections; import java.util.List; /** @@ -38,14 +39,19 @@ public abstract class AbstractTransactionStoreManager implements TransactionStor return null; } + @Override + public List readSortByTimeoutBeginSessions(boolean withBranchSessions) { + return Collections.emptyList(); + } + @Override public List readSession(GlobalStatus[] statuses, boolean withBranchSessions) { - return null; + return Collections.emptyList(); } @Override public List readSession(SessionCondition sessionCondition) { - return null; + return Collections.emptyList(); } @Override diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java index 4a33d946..b18a8bbd 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/DruidDataSourceProvider.java @@ -50,6 +50,8 @@ public class DruidDataSourceProvider extends AbstractDataSourceProvider { ds.setMaxPoolPreparedStatementPerConnectionSize(20); ds.setValidationQuery(getValidationQuery(getDBType())); ds.setDefaultAutoCommit(true); + // fix issue 5030 + ds.setUseOracleImplicitCache(false); return ds; } } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java index 3903c4ad..362c7992 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/StoreConfig.java @@ -15,20 +15,44 @@ */ package io.seata.server.store; +import io.seata.common.util.StringUtils; import io.seata.config.Configuration; import io.seata.config.ConfigurationFactory; +import io.seata.core.constants.ConfigurationKeys; +import io.seata.server.env.ContainerHelper; import io.seata.server.storage.file.FlushDiskMode; +import static io.seata.common.DefaultValues.SERVER_DEFAULT_STORE_MODE; import static io.seata.core.constants.ConfigurationKeys.STORE_FILE_PREFIX; - /** * @author lizhao */ public class StoreConfig { private static final Configuration CONFIGURATION = ConfigurationFactory.getInstance(); + private static StoreMode storeMode; + private static SessionMode sessionMode; + private static LockMode lockMode; + /** + * set storeMode sessionMode lockMode from StartupParameter + * + * @param storeMode storeMode + * @param sessionMode sessionMode + * @param lockMode lockMode + */ + public static void setStartupParameter(String storeMode, String sessionMode, String lockMode) { + if (StringUtils.isNotBlank(storeMode)) { + StoreConfig.storeMode = StoreMode.get(storeMode); + } + if (StringUtils.isNotBlank(sessionMode)) { + StoreConfig.sessionMode = SessionMode.get(sessionMode); + } + if (StringUtils.isNotBlank(lockMode)) { + StoreConfig.lockMode = LockMode.get(lockMode); + } + } /** * Default 16kb. @@ -60,4 +84,165 @@ public class StoreConfig { public static FlushDiskMode getFlushDiskMode() { return FlushDiskMode.findDiskMode(CONFIGURATION.getConfig(STORE_FILE_PREFIX + "flushDiskMode")); } + + /** + * only for inner call + * + * @return + */ + private static StoreMode getStoreMode() { + //startup + if (null != storeMode) { + return storeMode; + } + //env + String storeModeEnv = ContainerHelper.getStoreMode(); + if (StringUtils.isNotBlank(storeModeEnv)) { + return StoreMode.get(storeModeEnv); + } + //config + String storeModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_MODE, SERVER_DEFAULT_STORE_MODE); + return StoreMode.get(storeModeConfig); + } + + public static SessionMode getSessionMode() { + //startup + if (null != sessionMode) { + return sessionMode; + } + //env + String sessionModeEnv = ContainerHelper.getSessionStoreMode(); + if (StringUtils.isNotBlank(sessionModeEnv)) { + return SessionMode.get(sessionModeEnv); + } + //config + String sessionModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_SESSION_MODE); + if (StringUtils.isNotBlank(sessionModeConfig)) { + return SessionMode.get(sessionModeConfig); + } + // complication old config + return SessionMode.get(getStoreMode().name()); + } + + public static LockMode getLockMode() { + //startup + if (null != lockMode) { + return lockMode; + } + //env + String lockModeEnv = ContainerHelper.getLockStoreMode(); + if (StringUtils.isNotBlank(lockModeEnv)) { + return LockMode.get(lockModeEnv); + } + //config + String lockModeConfig = CONFIGURATION.getConfig(ConfigurationKeys.STORE_LOCK_MODE); + if (StringUtils.isNotBlank(lockModeConfig)) { + return LockMode.get(lockModeConfig); + } + // complication old config + return LockMode.get(getStoreMode().name()); + } + + public enum StoreMode { + /** + * The File store mode. + */ + FILE("file"), + /** + * The Db store mode. + */ + DB("db"), + /** + * The Redis store mode. + */ + REDIS("redis"); + + private String name; + + StoreMode(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static StoreMode get(String name) { + for (StoreMode mode : StoreMode.values()) { + if (mode.getName().equalsIgnoreCase(name)) { + return mode; + } + } + throw new IllegalArgumentException("unknown store mode:" + name); + } + } + + public enum SessionMode { + /** + * The File store mode. + */ + FILE("file"), + /** + * The Db store mode. + */ + DB("db"), + /** + * The Redis store mode. + */ + REDIS("redis"); + + private String name; + + SessionMode(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static SessionMode get(String name) { + for (SessionMode mode : SessionMode.values()) { + if (mode.getName().equalsIgnoreCase(name)) { + return mode; + } + } + throw new IllegalArgumentException("unknown session mode:" + name); + } + } + + public enum LockMode { + /** + * The File store mode. + */ + FILE("file"), + /** + * The Db store mode. + */ + DB("db"), + /** + * The Redis store mode. + */ + REDIS("redis"); + + private String name; + + LockMode(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public static LockMode get(String name) { + for (LockMode mode : LockMode.values()) { + if (mode.getName().equalsIgnoreCase(name)) { + return mode; + } + } + throw new IllegalArgumentException("unknown lock mode:" + name); + } + } + } diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java index b71d7054..2fb6473b 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/store/TransactionStoreManager.java @@ -55,6 +55,13 @@ public interface TransactionStoreManager { */ GlobalSession readSession(String xid, boolean withBranchSessions); + /** + * Read session global session by sort by timeout begin status. + * + * @param withBranchSessions the withBranchSessions + * @return the global session + */ + List readSortByTimeoutBeginSessions(boolean withBranchSessions); /** * Read session global session. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java index d7b06ae7..f4713527 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/at/ATCore.java @@ -15,9 +15,6 @@ */ package io.seata.server.transaction.at; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import com.fasterxml.jackson.databind.ObjectMapper; import io.seata.common.exception.StoreException; import io.seata.common.util.StringUtils; @@ -29,6 +26,9 @@ import io.seata.server.coordinator.AbstractCore; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import static io.seata.common.Constants.AUTO_COMMIT; import static io.seata.common.Constants.SKIP_CHECK_LOCK; @@ -40,9 +40,9 @@ import static io.seata.core.exception.TransactionExceptionCode.LockKeyConflict; * @author ph3636 */ public class ATCore extends AbstractCore { - - private ObjectMapper objectMapper; - + + private final ObjectMapper objectMapper = new ObjectMapper(); + public ATCore(RemotingServer remotingServer) { super(remotingServer); } @@ -59,9 +59,6 @@ public class ATCore extends AbstractCore { boolean autoCommit = true; boolean skipCheckLock = false; if (StringUtils.isNotBlank(applicationData)) { - if (objectMapper == null) { - objectMapper = new ObjectMapper(); - } try { Map data = objectMapper.readValue(applicationData, HashMap.class); Object clientAutoCommit = data.get(AUTO_COMMIT); diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java index d9285d17..fb59c795 100644 --- a/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java +++ b/ruoyi-visual/ruoyi-seata-server/src/main/java/io/seata/server/transaction/saga/SagaCore.java @@ -15,9 +15,6 @@ */ package io.seata.server.transaction.saga; -import java.io.IOException; -import java.util.Map; -import java.util.concurrent.TimeoutException; import io.netty.channel.Channel; import io.seata.common.util.CollectionUtils; import io.seata.core.exception.GlobalTransactionException; @@ -37,6 +34,10 @@ import io.seata.server.session.GlobalSession; import io.seata.server.session.SessionHelper; import io.seata.server.session.SessionHolder; +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.TimeoutException; + /** * The type saga core. * diff --git a/ruoyi-visual/ruoyi-seata-server/src/main/resources/lua/redislocker/redislock.lua b/ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua similarity index 100% rename from ruoyi-visual/ruoyi-seata-server/src/main/resources/lua/redislocker/redislock.lua rename to ruoyi-visual/ruoyi-seata-server/src/main/resources/redislocker/redislock.lua