You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@seata.apache.org by ji...@apache.org on 2025/03/16 12:25:16 UTC

(incubator-seata) branch 2.x updated: optimize: in raft mode add the vgroup field to global lock (#7222)

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

jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git


The following commit(s) were added to refs/heads/2.x by this push:
     new e0dc0c379f optimize: in raft mode add the vgroup field to global lock (#7222)
e0dc0c379f is described below

commit e0dc0c379fab845d0685565ca543427f193578d0
Author: funkye <ji...@apache.org>
AuthorDate: Sun Mar 16 20:25:12 2025 +0800

    optimize: in raft mode add the vgroup field to global lock (#7222)
---
 changes/en-us/2.x.md                               |  6 +--
 changes/zh-cn/2.x.md                               |  5 +-
 .../console-fe/src/components/Header/Header.tsx    |  2 +-
 .../src/pages/GlobalLockInfo/GlobalLockInfo.tsx    |  2 +
 .../console-fe/src/service/globalLockInfo.ts       |  4 +-
 .../namingserver/filter/ConsoleRemotingFilter.java |  5 +-
 .../seata/namingserver/manager/NamingManager.java  |  2 +-
 .../server/cluster/raft/RaftStateMachine.java      |  2 +
 .../raft/serializer/CustomDeserializer.java        | 22 +++++---
 .../raft/snapshot/vgroup/VGroupSnapshotFile.java   |  2 +-
 .../server/config/SeataNamingserverWebConfig.java  | 22 +++-----
 .../controller/BranchSessionController.java        |  1 -
 .../console/controller/GlobalLockController.java   |  5 +-
 .../controller/GlobalSessionController.java        |  4 +-
 .../console/entity/bo/GlobalLockQueryBO.java       | 48 ++++++++++++++++++
 .../{ => entity}/param/GlobalLockParam.java        |  2 +-
 .../{ => entity}/param/GlobalSessionParam.java     |  2 +-
 .../console/{ => entity}/vo/BranchSessionVO.java   |  2 +-
 .../console/{ => entity}/vo/GlobalLockVO.java      | 52 ++++++++++++-------
 .../console/{ => entity}/vo/GlobalSessionVO.java   |  2 +-
 .../server/console/impl/AbstractLockService.java   |  2 +-
 .../impl/db/BranchSessionDBServiceImpl.java        |  2 +-
 .../console/impl/db/GlobalLockDBServiceImpl.java   |  4 +-
 .../impl/db/GlobalSessionDBServiceImpl.java        |  6 +--
 .../impl/file/BranchSessionFileServiceImpl.java    |  2 +-
 .../impl/file/GlobalLockFileServiceImpl.java       | 50 +++++++++---------
 .../impl/file/GlobalSessionFileServiceImpl.java    |  4 +-
 .../impl/redis/BranchSessionRedisServiceImpl.java  |  2 +-
 .../impl/redis/GlobalLockRedisServiceImpl.java     |  4 +-
 .../impl/redis/GlobalSessionRedisServiceImpl.java  |  4 +-
 .../console/service/BranchSessionService.java      |  2 +-
 .../server/console/service/GlobalLockService.java  |  4 +-
 .../console/service/GlobalSessionService.java      |  4 +-
 .../seata/server/filter/RaftGroupFilter.java       | 59 ----------------------
 ...aderWriteFilter.java => RaftRequestFilter.java} | 37 +++++++++-----
 .../seata/server/storage/SessionConverter.java     |  4 +-
 .../redis/store/RedisTransactionStoreManager.java  |  2 +-
 .../apache/seata/server/lock/LockManagerTest.java  |  4 +-
 .../server/session/FileSessionManagerTest.java     |  5 +-
 .../server/session/redis/RedisQueryConsolTest.java |  8 +--
 .../redis/RedisTransactionStoreManagerTest.java    |  6 +--
 41 files changed, 217 insertions(+), 190 deletions(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 5af0d464d8..ab12f46ba5 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -54,7 +54,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#7179](https://github.com/apache/incubator-seata/pull/7179)] Use shared EventLoop for TM and RM clients to reduce thread overhead and improve performance
 - [[#7194](https://github.com/apache/incubator-seata/pull/7194)] automatically skipping proxy for datasource of type AbstractRoutingDataSource
 - [[#7215](https://github.com/apache/incubator-seata/pull/7215)] intercept non-leader write requests of the console trx operation
-- [[#7214](https://github.com/apache/incubator-seata/pull/7214)] upgrade jackson to 2.18.3
+- [[#7222](https://github.com/apache/incubator-seata/pull/7222)] in raft mode add the vgroup field to global lock
 
 
 ### security:
@@ -63,8 +63,8 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#6144](https://github.com/apache/incubator-seata/pull/6144)] upgrade nacos client to 1.4.6
 - [[#6147](https://github.com/apache/incubator-seata/pull/6147)] upgrade kafka-clients to 3.6.1
 - [[#6338](https://github.com/apache/incubator-seata/pull/6338)] upgrade jackson version
-- [[#7201](https://github.com/apache/incubator-seata/issues/7201)] upgrade protobuf.version to 3.25.5
-
+- [[#7201](https://github.com/apache/incubator-seata/pull/7202)] upgrade protobuf.version to 3.25.5
+- [[#7214](https://github.com/apache/incubator-seata/pull/7214)] upgrade jackson to 2.18.3
 
 ### test:
 
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index 32e0f4aca0..a794a5c153 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -54,7 +54,7 @@
 - [[#7179](https://github.com/apache/incubator-seata/pull/7179)] 使用共享的 EventLoop 来减少 TM 和 RM 客户端的线程开销并提高性能
 - [[#7194](https://github.com/apache/incubator-seata/pull/7194)] 自动跳过对AbstractRoutingDataSource类型数据源的代理
 - [[#7215](https://github.com/apache/incubator-seata/pull/7215)] 拦截控制台写操作的非leader的raft请求
-- [[#7214](https://github.com/apache/incubator-seata/pull/7214)] 升级 jackson 至 2.18.3 版本
+- [[#7222](https://github.com/apache/incubator-seata/pull/7222)] raft模式下控制台接口响应全局锁信息时增加vgroup字段
 
 
 ### security:
@@ -63,7 +63,8 @@
 - [[#6145](https://github.com/apache/incubator-seata/pull/6145)] 升级 jettison依赖版本至1.5.4
 - [[#6147](https://github.com/apache/incubator-seata/pull/6147)] 升级 kafka-clients依赖至3.6.1
 - [[#6338](https://github.com/apache/incubator-seata/pull/6338)] 升级 jackson 依赖版本
-- [[#7201](https://github.com/apache/incubator-seata/issues/7201)] 升级 protobuf 版本到 3.25.5
+- [[#7201](https://github.com/apache/incubator-seata/pull/7202)] 升级 protobuf 版本到 3.25.5
+- [[#7214](https://github.com/apache/incubator-seata/pull/7214)] 升级 jackson 至 2.18.3 版本
 
 
 ### test:
diff --git a/console/src/main/resources/static/console-fe/src/components/Header/Header.tsx b/console/src/main/resources/static/console-fe/src/components/Header/Header.tsx
index 4703a58944..175c225b01 100644
--- a/console/src/main/resources/static/console-fe/src/components/Header/Header.tsx
+++ b/console/src/main/resources/static/console-fe/src/components/Header/Header.tsx
@@ -74,7 +74,7 @@ class Header extends React.Component<PropsType, StateType> {
 
   getUsername = () => {
     const token = window.localStorage.getItem(AUTHORIZATION_HEADER);
-    if (token) {
+    if (token && token !== "null") {
       const base64Url = token.split('.')[1];
       const base64 = base64Url.replace('-', '+').replace('_', '/');
       const parsedToken = JSON.parse(window.atob(base64));
diff --git a/console/src/main/resources/static/console-fe/src/pages/GlobalLockInfo/GlobalLockInfo.tsx b/console/src/main/resources/static/console-fe/src/pages/GlobalLockInfo/GlobalLockInfo.tsx
index 46a3ff2507..1e45540023 100644
--- a/console/src/main/resources/static/console-fe/src/pages/GlobalLockInfo/GlobalLockInfo.tsx
+++ b/console/src/main/resources/static/console-fe/src/pages/GlobalLockInfo/GlobalLockInfo.tsx
@@ -158,6 +158,8 @@ class GlobalLockInfo extends React.Component<GlobalProps, GlobalLockInfoState> {
       }
       // format time
       data.data.forEach((element: any) => {
+        element.cluster = this.state.globalLockParam.cluster;
+        element.namespace = this.state.globalLockParam.namespace;
         element.gmtCreate = (element.gmtCreate == null || element.gmtCreate === '') ? null : moment(Number(element.gmtCreate)).format('YYYY-MM-DD HH:mm:ss');
         element.gmtModified = (element.gmtModified == null || element.gmtModified === '') ? null : moment(Number(element.gmtModified)).format('YYYY-MM-DD HH:mm:ss');
       });
diff --git a/console/src/main/resources/static/console-fe/src/service/globalLockInfo.ts b/console/src/main/resources/static/console-fe/src/service/globalLockInfo.ts
index 2f98304b16..fa59b8e776 100644
--- a/console/src/main/resources/static/console-fe/src/service/globalLockInfo.ts
+++ b/console/src/main/resources/static/console-fe/src/service/globalLockInfo.ts
@@ -67,12 +67,14 @@ export async function deleteData(params: GlobalLockParam): Promise<any> {
 export async function checkData(params: GlobalLockParam): Promise<any> {
   const xid = params.xid
   const branchId = params.branchId
+  const vgroup = params.vgroup
 
   let result = await request('/console/globalLock/check', {
     method: 'get',
     params: {
       xid,
-      branchId
+      branchId,
+      vgroup: vgroup
     },
     headers: {
       'x-seata-namespace': params.namespace,
diff --git a/namingserver/src/main/java/org/apache/seata/namingserver/filter/ConsoleRemotingFilter.java b/namingserver/src/main/java/org/apache/seata/namingserver/filter/ConsoleRemotingFilter.java
index d47d9bdcd5..0de0aff0f5 100644
--- a/namingserver/src/main/java/org/apache/seata/namingserver/filter/ConsoleRemotingFilter.java
+++ b/namingserver/src/main/java/org/apache/seata/namingserver/filter/ConsoleRemotingFilter.java
@@ -35,6 +35,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.apache.seata.common.metadata.ClusterRole;
 import org.apache.seata.common.metadata.Node;
+import org.apache.seata.common.metadata.namingserver.NamingServerNode;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.namingserver.manager.NamingManager;
@@ -88,7 +89,7 @@ public class ConsoleRemotingFilter implements Filter {
                     }
                     if (CollectionUtils.isNotEmpty(list)) {
                         // Randomly select a node from the list
-                        Node node = list.get(ThreadLocalRandom.current().nextInt(list.size()));
+                        NamingServerNode node = (NamingServerNode) list.get(ThreadLocalRandom.current().nextInt(list.size()));
                         Node.Endpoint controlEndpoint = node.getControl();
                         if (controlEndpoint != null) {
                             // Construct the target URL
@@ -99,7 +100,7 @@ public class ConsoleRemotingFilter implements Filter {
                             // Copy headers from the original request
                             HttpHeaders headers = new HttpHeaders();
                             if (node.getRole() == ClusterRole.LEADER) {
-                                headers.add(RAFT_GROUP_HEADER, node.getGroup());
+                                headers.add(RAFT_GROUP_HEADER, node.getUnit());
                             }
                             Collections.list(request.getHeaderNames())
                                 .forEach(headerName -> headers.add(headerName, request.getHeader(headerName)));
diff --git a/namingserver/src/main/java/org/apache/seata/namingserver/manager/NamingManager.java b/namingserver/src/main/java/org/apache/seata/namingserver/manager/NamingManager.java
index 3656710b37..0474b9bcc4 100644
--- a/namingserver/src/main/java/org/apache/seata/namingserver/manager/NamingManager.java
+++ b/namingserver/src/main/java/org/apache/seata/namingserver/manager/NamingManager.java
@@ -215,7 +215,7 @@ public class NamingManager {
         try {
             ClusterBO clusterBO = vGroupMap.get(vGroup, k -> new ConcurrentHashMap<>())
                 .computeIfAbsent(namespace, k -> new NamespaceBO()).getCluster(clusterName);
-            if (clusterBO != null /**&& !clusterBO.getUnitNames().contains(unitName)**/) {
+            if (clusterBO != null) {
                 boolean needNotify = !clusterBO.getUnitNames().contains(unitName);
                 NamespaceBO namespaceBO = vGroupMap.getIfPresent(vGroup).get(namespace);
                 namespaceBO.removeOldCluster(clusterName);
diff --git a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java
index 10d18e9f31..f7198713ae 100644
--- a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java
+++ b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java
@@ -73,6 +73,7 @@ import org.apache.seata.server.cluster.raft.execute.global.UpdateGlobalSessionEx
 import org.apache.seata.server.cluster.raft.execute.lock.BranchReleaseLockExecute;
 import org.apache.seata.server.cluster.raft.execute.lock.GlobalReleaseLockExecute;
 import org.apache.seata.server.cluster.listener.ClusterChangeEvent;
+import org.apache.seata.server.cluster.raft.snapshot.vgroup.VGroupSnapshotFile;
 import org.apache.seata.server.cluster.raft.sync.RaftSyncMessageSerializer;
 import org.apache.seata.server.cluster.raft.sync.msg.RaftBaseMsg;
 import org.apache.seata.server.cluster.raft.sync.msg.RaftClusterMetadataMsg;
@@ -148,6 +149,7 @@ public class RaftStateMachine extends StateMachineAdapter {
         registryStoreSnapshotFile(new LeaderMetadataSnapshotFile(group));
         if (StoreMode.RAFT.getName().equalsIgnoreCase(mode)) {
             registryStoreSnapshotFile(new SessionSnapshotFile(group));
+            registryStoreSnapshotFile(new VGroupSnapshotFile(group));
             EXECUTES.put(ADD_GLOBAL_SESSION, new AddGlobalSessionExecute());
             EXECUTES.put(ADD_BRANCH_SESSION, new AddBranchSessionExecute());
             EXECUTES.put(REMOVE_BRANCH_SESSION, new RemoveBranchSessionExecute());
diff --git a/server/src/main/java/org/apache/seata/server/cluster/raft/serializer/CustomDeserializer.java b/server/src/main/java/org/apache/seata/server/cluster/raft/serializer/CustomDeserializer.java
index 533f5c3d67..389a192798 100644
--- a/server/src/main/java/org/apache/seata/server/cluster/raft/serializer/CustomDeserializer.java
+++ b/server/src/main/java/org/apache/seata/server/cluster/raft/serializer/CustomDeserializer.java
@@ -17,6 +17,8 @@
 package org.apache.seata.server.cluster.raft.serializer;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.JsonDeserializer;
@@ -29,7 +31,13 @@ public class CustomDeserializer extends JsonDeserializer<Class<?>> {
 
     String currentPackage = "org.apache.seata.server";
 
-    String permitPackage = "org.apache.seata";
+    private static final List<String> PERMIT_PACKAGES = new ArrayList<>();
+
+    static {
+        PERMIT_PACKAGES.add("org.apache.seata");
+        // The storage structure of vgroup is a map.
+        PERMIT_PACKAGES.add("java.util.HashMap");
+    }
 
     @Override
     public Class<?> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
@@ -38,11 +46,13 @@ public class CustomDeserializer extends JsonDeserializer<Class<?>> {
         if (className.startsWith(oldPackage)) {
             className = className.replaceFirst(oldPackage, currentPackage);
         }
-        if (className.startsWith(permitPackage)) {
-            try {
-                return Class.forName(className);
-            } catch (ClassNotFoundException e) {
-                throw new RuntimeException(e.getMessage(), e);
+        for (String permitPackage : PERMIT_PACKAGES) {
+            if (className.startsWith(permitPackage)) {
+                try {
+                    return Class.forName(className);
+                } catch (ClassNotFoundException e) {
+                    throw new RuntimeException(e.getMessage(), e);
+                }
             }
         }
         throw new SeataRuntimeException(ErrorCode.ERR_DESERIALIZATION_SECURITY,
diff --git a/server/src/main/java/org/apache/seata/server/cluster/raft/snapshot/vgroup/VGroupSnapshotFile.java b/server/src/main/java/org/apache/seata/server/cluster/raft/snapshot/vgroup/VGroupSnapshotFile.java
index 229eeada58..3cd27053ae 100644
--- a/server/src/main/java/org/apache/seata/server/cluster/raft/snapshot/vgroup/VGroupSnapshotFile.java
+++ b/server/src/main/java/org/apache/seata/server/cluster/raft/snapshot/vgroup/VGroupSnapshotFile.java
@@ -36,7 +36,7 @@ public class VGroupSnapshotFile implements Serializable, StoreSnapshotFile {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(VGroupSnapshotFile.class);
 
-    public static final String ROOT_MAPPING_MANAGER_NAME = "vgroup_mapping.json";
+    public static final String ROOT_MAPPING_MANAGER_NAME = "vgroup_mapping";
 
     String group;
 
diff --git a/server/src/main/java/org/apache/seata/server/config/SeataNamingserverWebConfig.java b/server/src/main/java/org/apache/seata/server/config/SeataNamingserverWebConfig.java
index 8a173fd10a..62062d742d 100644
--- a/server/src/main/java/org/apache/seata/server/config/SeataNamingserverWebConfig.java
+++ b/server/src/main/java/org/apache/seata/server/config/SeataNamingserverWebConfig.java
@@ -17,8 +17,7 @@
 package org.apache.seata.server.config;
 
 import org.apache.seata.server.filter.RaftCondition;
-import org.apache.seata.server.filter.RaftGroupFilter;
-import org.apache.seata.server.filter.RaftLeaderWriteFilter;
+import org.apache.seata.server.filter.RaftRequestFilter;
 import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Conditional;
@@ -28,21 +27,14 @@ import org.springframework.context.annotation.DependsOn;
 @Configuration
 public class SeataNamingserverWebConfig {
 
-    @Bean
-    public FilterRegistrationBean<RaftGroupFilter> raftGroupFilter() {
-        FilterRegistrationBean<RaftGroupFilter> registrationBean = new FilterRegistrationBean<>();
-        registrationBean.setFilter(new RaftGroupFilter());
-        registrationBean.addUrlPatterns("/vgroup/v1/*");
-        return registrationBean;
-    }
-
     @Bean
     @Conditional(RaftCondition.class)
-    @DependsOn("raftLeaderWriteFilter")
-    public FilterRegistrationBean<RaftLeaderWriteFilter> raftLeaderWriteServletFilter(RaftLeaderWriteFilter raftLeaderWriteFilter) {
-        FilterRegistrationBean<RaftLeaderWriteFilter> registrationBean = new FilterRegistrationBean<>();
-        registrationBean.setFilter(raftLeaderWriteFilter);
-        registrationBean.addUrlPatterns("/api/v1/console/*");
+    @DependsOn("raftRequestFilter")
+    public FilterRegistrationBean<RaftRequestFilter> raftRequestServletFilter(RaftRequestFilter raftRequestFilter) {
+        FilterRegistrationBean<RaftRequestFilter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(raftRequestFilter);
+        registrationBean.addUrlPatterns("/api/v1/console/*", "/vgroup/v1/*");
         return registrationBean;
     }
+
 }
diff --git a/server/src/main/java/org/apache/seata/server/console/controller/BranchSessionController.java b/server/src/main/java/org/apache/seata/server/console/controller/BranchSessionController.java
index 1dce5caf16..fd649a0898 100644
--- a/server/src/main/java/org/apache/seata/server/console/controller/BranchSessionController.java
+++ b/server/src/main/java/org/apache/seata/server/console/controller/BranchSessionController.java
@@ -34,7 +34,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/v1/console/branchSession")
 public class BranchSessionController {
     private static final Logger LOGGER = LoggerFactory.getLogger(BranchSessionController.class);
-
     @Resource(type = BranchSessionService.class)
     private BranchSessionService branchSessionService;
 
diff --git a/server/src/main/java/org/apache/seata/server/console/controller/GlobalLockController.java b/server/src/main/java/org/apache/seata/server/console/controller/GlobalLockController.java
index 9eaeaa2499..1e9e2c61b9 100644
--- a/server/src/main/java/org/apache/seata/server/console/controller/GlobalLockController.java
+++ b/server/src/main/java/org/apache/seata/server/console/controller/GlobalLockController.java
@@ -20,8 +20,8 @@ import javax.annotation.Resource;
 
 import org.apache.seata.common.result.PageResult;
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.param.GlobalLockParam;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.apache.seata.server.console.service.GlobalLockService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,4 +78,5 @@ public class GlobalLockController {
     public SingleResult<Boolean> check(String xid, String branchId) {
         return globalLockService.check(xid, branchId);
     }
+
 }
diff --git a/server/src/main/java/org/apache/seata/server/console/controller/GlobalSessionController.java b/server/src/main/java/org/apache/seata/server/console/controller/GlobalSessionController.java
index 9ee3af9a4c..228745cd1f 100644
--- a/server/src/main/java/org/apache/seata/server/console/controller/GlobalSessionController.java
+++ b/server/src/main/java/org/apache/seata/server/console/controller/GlobalSessionController.java
@@ -19,9 +19,9 @@ package org.apache.seata.server.console.controller;
 import javax.annotation.Resource;
 
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.common.result.PageResult;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.server.console.service.GlobalSessionService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/server/src/main/java/org/apache/seata/server/console/entity/bo/GlobalLockQueryBO.java b/server/src/main/java/org/apache/seata/server/console/entity/bo/GlobalLockQueryBO.java
new file mode 100644
index 0000000000..12b4a7b821
--- /dev/null
+++ b/server/src/main/java/org/apache/seata/server/console/entity/bo/GlobalLockQueryBO.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.seata.server.console.entity.bo;
+
+import org.apache.seata.core.lock.RowLock;
+import org.apache.seata.server.session.GlobalSession;
+
+public class GlobalLockQueryBO {
+
+    private RowLock rowLock;
+
+    private GlobalSession globalSession;
+
+    public GlobalLockQueryBO(RowLock rowLock, GlobalSession globalSession) {
+        this.rowLock = rowLock;
+        this.globalSession = globalSession;
+    }
+
+    public RowLock getRowLock() {
+        return rowLock;
+    }
+
+    public void setRowLock(RowLock rowLock) {
+        this.rowLock = rowLock;
+    }
+
+    public GlobalSession getGlobalSession() {
+        return globalSession;
+    }
+
+    public void setGlobalSession(GlobalSession globalSession) {
+        this.globalSession = globalSession;
+    }
+}
diff --git a/server/src/main/java/org/apache/seata/server/console/param/GlobalLockParam.java b/server/src/main/java/org/apache/seata/server/console/entity/param/GlobalLockParam.java
similarity index 98%
rename from server/src/main/java/org/apache/seata/server/console/param/GlobalLockParam.java
rename to server/src/main/java/org/apache/seata/server/console/entity/param/GlobalLockParam.java
index ecf289558b..41f8be5075 100644
--- a/server/src/main/java/org/apache/seata/server/console/param/GlobalLockParam.java
+++ b/server/src/main/java/org/apache/seata/server/console/entity/param/GlobalLockParam.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.server.console.param;
+package org.apache.seata.server.console.entity.param;
 
 import org.apache.seata.common.result.BaseParam;
 
diff --git a/server/src/main/java/org/apache/seata/server/console/param/GlobalSessionParam.java b/server/src/main/java/org/apache/seata/server/console/entity/param/GlobalSessionParam.java
similarity index 98%
rename from server/src/main/java/org/apache/seata/server/console/param/GlobalSessionParam.java
rename to server/src/main/java/org/apache/seata/server/console/entity/param/GlobalSessionParam.java
index 88e61aef8b..19d1551b5f 100644
--- a/server/src/main/java/org/apache/seata/server/console/param/GlobalSessionParam.java
+++ b/server/src/main/java/org/apache/seata/server/console/entity/param/GlobalSessionParam.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.server.console.param;
+package org.apache.seata.server.console.entity.param;
 
 import org.apache.seata.common.result.BaseParam;
 
diff --git a/server/src/main/java/org/apache/seata/server/console/vo/BranchSessionVO.java b/server/src/main/java/org/apache/seata/server/console/entity/vo/BranchSessionVO.java
similarity index 99%
rename from server/src/main/java/org/apache/seata/server/console/vo/BranchSessionVO.java
rename to server/src/main/java/org/apache/seata/server/console/entity/vo/BranchSessionVO.java
index 17db0aef52..9e3f71ecda 100644
--- a/server/src/main/java/org/apache/seata/server/console/vo/BranchSessionVO.java
+++ b/server/src/main/java/org/apache/seata/server/console/entity/vo/BranchSessionVO.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.server.console.vo;
+package org.apache.seata.server.console.entity.vo;
 
 import java.sql.Date;
 import java.sql.ResultSet;
diff --git a/server/src/main/java/org/apache/seata/server/console/vo/GlobalLockVO.java b/server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalLockVO.java
similarity index 77%
rename from server/src/main/java/org/apache/seata/server/console/vo/GlobalLockVO.java
rename to server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalLockVO.java
index b46bc20f34..dd0a79e9e0 100644
--- a/server/src/main/java/org/apache/seata/server/console/vo/GlobalLockVO.java
+++ b/server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalLockVO.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.server.console.vo;
+package org.apache.seata.server.console.entity.vo;
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.core.constants.ServerTableColumnsName;
 import org.apache.seata.core.lock.RowLock;
+import org.apache.seata.server.console.entity.bo.GlobalLockQueryBO;
 
 /**
  * GlobalLockVO
@@ -46,6 +47,11 @@ public class GlobalLockVO {
 
     private String rowKey;
 
+    /**
+     * the vgroup
+     */
+    private String vgroup;
+
     private Long gmtCreate;
 
     private Long gmtModified;
@@ -55,13 +61,13 @@ public class GlobalLockVO {
      * @param rowLocks the RowLock list
      * @return the GlobalLockVO list
      */
-    public static List<GlobalLockVO> convert(List<RowLock> rowLocks) {
-        if (CollectionUtils.isEmpty(rowLocks)) {
+    public static List<GlobalLockVO> convert(List<GlobalLockQueryBO> globalLockQueryBOS) {
+        if (CollectionUtils.isEmpty(globalLockQueryBOS)) {
             return Collections.emptyList();
         }
-        final List<GlobalLockVO> result = new ArrayList<>(rowLocks.size());
-        for (RowLock rowLock : rowLocks) {
-            result.add(convert(rowLock));
+        final List<GlobalLockVO> result = new ArrayList<>(globalLockQueryBOS.size());
+        for (GlobalLockQueryBO globalLockQueryBO : globalLockQueryBOS) {
+            result.add(convert(globalLockQueryBO.getRowLock(), globalLockQueryBO.getGlobalSession().getTransactionServiceGroup()));
         }
 
         return result;
@@ -73,7 +79,7 @@ public class GlobalLockVO {
      * @param rowLock the RowLock
      * @return the GlobalLockVO
      */
-    public static GlobalLockVO convert(RowLock rowLock) {
+    public static GlobalLockVO convert(RowLock rowLock, String vgroup) {
         final GlobalLockVO globalLockVO = new GlobalLockVO();
         globalLockVO.setXid(rowLock.getXid());
         globalLockVO.setTransactionId(rowLock.getTransactionId());
@@ -82,6 +88,7 @@ public class GlobalLockVO {
         globalLockVO.setTableName(rowLock.getTableName());
         globalLockVO.setPk(rowLock.getPk());
         globalLockVO.setRowKey(rowLock.getRowKey());
+        globalLockVO.setVgroup(vgroup);
         return globalLockVO;
     }
 
@@ -180,16 +187,25 @@ public class GlobalLockVO {
 
     @Override
     public String toString() {
-        return "GlobalLockVO{" +
-                "xid='" + xid + '\'' +
-                ", transactionId=" + transactionId +
-                ", branchId=" + branchId +
-                ", resourceId='" + resourceId + '\'' +
-                ", tableName='" + tableName + '\'' +
-                ", pk='" + pk + '\'' +
-                ", rowKey='" + rowKey + '\'' +
-                ", gmtCreate=" + gmtCreate +
-                ", gmtModified=" + gmtModified +
-                '}';
+        return "GlobalLockVO{" + "xid='" + xid + '\'' + ", transactionId='" + transactionId + '\'' + ", branchId='"
+            + branchId + '\'' + ", resourceId='" + resourceId + '\'' + ", tableName='" + tableName + '\'' + ", pk='"
+            + pk + '\'' + ", rowKey='" + rowKey + '\'' + ", vgroup='" + vgroup + '\'' + ", gmtCreate=" + gmtCreate
+            + ", gmtModified=" + gmtModified + '}';
+    }
+
+    public void setTransactionId(String transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    public void setBranchId(String branchId) {
+        this.branchId = branchId;
+    }
+
+    public String getVgroup() {
+        return vgroup;
+    }
+
+    public void setVgroup(String vgroup) {
+        this.vgroup = vgroup;
     }
 }
diff --git a/server/src/main/java/org/apache/seata/server/console/vo/GlobalSessionVO.java b/server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalSessionVO.java
similarity index 99%
rename from server/src/main/java/org/apache/seata/server/console/vo/GlobalSessionVO.java
rename to server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalSessionVO.java
index ddb4a43fb1..2770c11709 100644
--- a/server/src/main/java/org/apache/seata/server/console/vo/GlobalSessionVO.java
+++ b/server/src/main/java/org/apache/seata/server/console/entity/vo/GlobalSessionVO.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.seata.server.console.vo;
+package org.apache.seata.server.console.entity.vo;
 
 import java.sql.ResultSet;
 import java.sql.SQLException;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/AbstractLockService.java b/server/src/main/java/org/apache/seata/server/console/impl/AbstractLockService.java
index 3b3f7634ae..f87e4304f2 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/AbstractLockService.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/AbstractLockService.java
@@ -18,7 +18,7 @@ package org.apache.seata.server.console.impl;
 
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
 import org.apache.seata.server.console.service.GlobalLockService;
 
 public abstract class AbstractLockService extends AbstractService implements GlobalLockService {
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/db/BranchSessionDBServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/db/BranchSessionDBServiceImpl.java
index 375503445d..1d8cb91f00 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/db/BranchSessionDBServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/db/BranchSessionDBServiceImpl.java
@@ -37,7 +37,7 @@ import org.apache.seata.core.store.db.DataSourceProvider;
 import org.apache.seata.core.store.db.sql.log.LogStoreSqlsFactory;
 import org.apache.seata.server.console.impl.AbstractBranchService;
 import org.apache.seata.server.console.service.BranchSessionService;
-import org.apache.seata.server.console.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.stereotype.Component;
 
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalLockDBServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalLockDBServiceImpl.java
index b1ec8d40d9..e19d9c5aad 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalLockDBServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalLockDBServiceImpl.java
@@ -39,9 +39,9 @@ import org.apache.seata.core.store.db.DataSourceProvider;
 import org.apache.seata.core.store.db.sql.lock.LockStoreSqlFactory;
 import org.apache.seata.server.console.exception.ConsoleException;
 import org.apache.seata.server.console.impl.AbstractLockService;
-import org.apache.seata.server.console.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
 import org.apache.seata.server.console.service.GlobalLockService;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java
index 4bc5b16969..fcc38870db 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/db/GlobalSessionDBServiceImpl.java
@@ -39,11 +39,11 @@ import org.apache.seata.common.result.PageResult;
 import org.apache.seata.core.store.db.DataSourceProvider;
 import org.apache.seata.core.store.db.sql.log.LogStoreSqlsFactory;
 import org.apache.seata.server.console.impl.AbstractGlobalService;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.server.console.service.BranchSessionService;
 import org.apache.seata.server.console.service.GlobalSessionService;
-import org.apache.seata.server.console.vo.BranchSessionVO;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.stereotype.Component;
 
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/file/BranchSessionFileServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/file/BranchSessionFileServiceImpl.java
index efd2337d15..cb96b8ecb8 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/file/BranchSessionFileServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/file/BranchSessionFileServiceImpl.java
@@ -18,7 +18,7 @@ package org.apache.seata.server.console.impl.file;
 
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.server.console.impl.AbstractBranchService;
-import org.apache.seata.server.console.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
 import org.apache.seata.common.result.PageResult;
 import org.apache.seata.server.console.service.BranchSessionService;
 import org.apache.seata.server.session.GlobalSession;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalLockFileServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalLockFileServiceImpl.java
index 2c745ee78a..b9cd5b3f34 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalLockFileServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalLockFileServiceImpl.java
@@ -18,7 +18,6 @@ package org.apache.seata.server.console.impl.file;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -27,12 +26,13 @@ import org.apache.seata.common.result.SingleResult;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.core.exception.TransactionException;
+import org.apache.seata.server.console.entity.bo.GlobalLockQueryBO;
 import org.apache.seata.server.console.exception.ConsoleException;
 import org.apache.seata.server.console.impl.AbstractLockService;
 import org.apache.seata.server.console.impl.redis.GlobalLockRedisServiceImpl;
-import org.apache.seata.server.console.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
 import org.apache.seata.common.result.PageResult;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.apache.seata.core.lock.RowLock;
 import org.apache.seata.server.console.service.GlobalLockService;
 import org.apache.seata.server.lock.LockerManagerFactory;
@@ -46,7 +46,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.stereotype.Component;
 
 import static org.apache.seata.common.util.StringUtils.isBlank;
-import static org.apache.seata.server.console.vo.GlobalLockVO.convert;
+import static org.apache.seata.server.console.entity.vo.GlobalLockVO.convert;
 import static java.util.Objects.isNull;
 
 /**
@@ -65,14 +65,13 @@ public class GlobalLockFileServiceImpl extends AbstractLockService implements Gl
 
         final Collection<GlobalSession> allSessions = SessionHolder.getRootSessionManager().allSessions();
 
-        final AtomicInteger total = new AtomicInteger();
-        List<RowLock> result = allSessions
-                .parallelStream()
+
+        List<GlobalLockQueryBO> result = allSessions.parallelStream()
                 .filter(obtainGlobalSessionPredicate(param))
-                .flatMap(globalSession -> globalSession.getBranchSessions().stream())
-                .filter(obtainBranchSessionPredicate(param))
-                .flatMap(branchSession -> filterAndMap(param, branchSession))
-                .peek(globalSession -> total.incrementAndGet())
+                .flatMap(globalSession -> globalSession.getBranchSessions().stream()
+                        .filter(obtainBranchSessionPredicate(param))
+                        .flatMap(branchSession -> filterAndMap(param, branchSession)
+                                .map(lock -> new GlobalLockQueryBO(lock, globalSession))))
                 .collect(Collectors.toList());
 
         return PageResult.build(convert(result), param.getPageNum(), param.getPageSize());
@@ -86,21 +85,22 @@ public class GlobalLockFileServiceImpl extends AbstractLockService implements Gl
             LOGGER.debug("start to delete global lock,xid:{} branchId:{}",
                     param.getXid(), param.getBranchId());
         }
+        GlobalSession globalSession = SessionHolder.getRootSessionManager().findGlobalSession(param.getXid(), true);
+        if (globalSession != null) {
+            List<BranchSession> branchSessions = globalSession.getBranchSessions().stream()
+                .filter(branchSession -> branchSession.getBranchId() == Long.parseLong(param.getBranchId()))
+                .collect(Collectors.toList());
 
-        List<BranchSession> branchSessions = SessionHolder.getRootSessionManager().findGlobalSession(param.getXid(),
-                true).getBranchSessions().stream().filter(branchSession ->
-                branchSession.getBranchId() == Long.parseLong(param.getBranchId())).collect(Collectors.toList());
-
-        if (branchSessions.size() != 1) {
-            throw new ConsoleException(new UnsupportedOperationException("branch session size is not one"),
-                    String.format("delete global lock," +
-                    "xid:%s ,branchId:%s", param.getXid(), param.getBranchId()));
-        }
-        try {
-            lockManager.releaseLock(branchSessions.get(0));
-        } catch (TransactionException e) {
-            throw new ConsoleException(e, String.format("delete global lock," +
-                    "xid:%s ,branchId:%s", param.getXid(), param.getBranchId()));
+            if (branchSessions.size() != 1) {
+                throw new ConsoleException(new UnsupportedOperationException("branch session size is not one"),
+                    String.format("delete global lock," + "xid:%s ,branchId:%s", param.getXid(), param.getBranchId()));
+            }
+            try {
+                lockManager.releaseLock(branchSessions.get(0));
+            } catch (TransactionException e) {
+                throw new ConsoleException(e,
+                    String.format("delete global lock," + "xid:%s ,branchId:%s", param.getXid(), param.getBranchId()));
+            }
         }
         return SingleResult.success();
     }
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java
index c3c9308201..ff02849af7 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/file/GlobalSessionFileServiceImpl.java
@@ -23,9 +23,9 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 import org.apache.seata.server.console.impl.AbstractGlobalService;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.common.result.PageResult;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.server.console.service.GlobalSessionService;
 import org.apache.seata.server.session.GlobalSession;
 import org.apache.seata.server.session.SessionHolder;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java
index ca52abc0c7..df67d0fe30 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/redis/BranchSessionRedisServiceImpl.java
@@ -22,7 +22,7 @@ import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.common.result.PageResult;
 import org.apache.seata.server.console.impl.AbstractBranchService;
-import org.apache.seata.server.console.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
 import org.apache.seata.core.store.BranchTransactionDO;
 import org.apache.seata.server.console.service.BranchSessionService;
 import org.apache.seata.server.storage.redis.store.RedisTransactionStoreManager;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java
index e6a46bde47..b5964a9653 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalLockRedisServiceImpl.java
@@ -32,9 +32,9 @@ import org.slf4j.LoggerFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.stereotype.Component;
 import org.apache.seata.common.util.BeanUtils;
-import org.apache.seata.server.console.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
 import org.apache.seata.common.result.PageResult;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.apache.seata.server.console.service.GlobalLockService;
 import org.apache.seata.server.storage.redis.JedisPooledFactory;
 import redis.clients.jedis.Jedis;
diff --git a/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java b/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java
index 81563f2897..f38dc150c5 100644
--- a/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java
+++ b/server/src/main/java/org/apache/seata/server/console/impl/redis/GlobalSessionRedisServiceImpl.java
@@ -22,8 +22,8 @@ import java.util.stream.Collectors;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.result.PageResult;
 import org.apache.seata.server.console.impl.AbstractGlobalService;
-import org.apache.seata.server.console.param.GlobalSessionParam;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.core.model.GlobalStatus;
 import org.apache.seata.server.console.service.GlobalSessionService;
 import org.apache.seata.server.session.GlobalSession;
diff --git a/server/src/main/java/org/apache/seata/server/console/service/BranchSessionService.java b/server/src/main/java/org/apache/seata/server/console/service/BranchSessionService.java
index 677a742386..cd73aafbca 100644
--- a/server/src/main/java/org/apache/seata/server/console/service/BranchSessionService.java
+++ b/server/src/main/java/org/apache/seata/server/console/service/BranchSessionService.java
@@ -17,7 +17,7 @@
 package org.apache.seata.server.console.service;
 
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
 import org.apache.seata.common.result.PageResult;
 
 /**
diff --git a/server/src/main/java/org/apache/seata/server/console/service/GlobalLockService.java b/server/src/main/java/org/apache/seata/server/console/service/GlobalLockService.java
index 328f41006a..29b2ea0379 100644
--- a/server/src/main/java/org/apache/seata/server/console/service/GlobalLockService.java
+++ b/server/src/main/java/org/apache/seata/server/console/service/GlobalLockService.java
@@ -18,8 +18,8 @@ package org.apache.seata.server.console.service;
 
 import org.apache.seata.common.result.PageResult;
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.param.GlobalLockParam;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 
 
 /**
diff --git a/server/src/main/java/org/apache/seata/server/console/service/GlobalSessionService.java b/server/src/main/java/org/apache/seata/server/console/service/GlobalSessionService.java
index 5093d57158..2efcf80d0a 100644
--- a/server/src/main/java/org/apache/seata/server/console/service/GlobalSessionService.java
+++ b/server/src/main/java/org/apache/seata/server/console/service/GlobalSessionService.java
@@ -17,8 +17,8 @@
 package org.apache.seata.server.console.service;
 
 import org.apache.seata.common.result.SingleResult;
-import org.apache.seata.server.console.param.GlobalSessionParam;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.common.result.PageResult;
 
 /**
diff --git a/server/src/main/java/org/apache/seata/server/filter/RaftGroupFilter.java b/server/src/main/java/org/apache/seata/server/filter/RaftGroupFilter.java
deleted file mode 100644
index 02a730c29b..0000000000
--- a/server/src/main/java/org/apache/seata/server/filter/RaftGroupFilter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.seata.server.filter;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import org.apache.seata.common.util.StringUtils;
-import org.apache.seata.server.cluster.raft.context.SeataClusterContext;
-
-
-import static org.apache.seata.common.Constants.RAFT_GROUP_HEADER;
-
-public class RaftGroupFilter implements Filter {
-
-    @Override
-    public void init(FilterConfig filterConfig) throws ServletException {}
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
-        throws IOException, ServletException {
-        HttpServletRequest httpRequest = (HttpServletRequest)request;
-        String unit = httpRequest.getParameter("unit");
-        if (StringUtils.isBlank(unit)) {
-            unit = httpRequest.getHeader(RAFT_GROUP_HEADER);
-        }
-        if (unit != null) {
-            SeataClusterContext.bindGroup(unit);
-        }
-        try {
-            chain.doFilter(request, response);
-        } finally {
-            SeataClusterContext.unbindGroup();
-        }
-    }
-
-    @Override
-    public void destroy() {}
-
-}
diff --git a/server/src/main/java/org/apache/seata/server/filter/RaftLeaderWriteFilter.java b/server/src/main/java/org/apache/seata/server/filter/RaftRequestFilter.java
similarity index 70%
rename from server/src/main/java/org/apache/seata/server/filter/RaftLeaderWriteFilter.java
rename to server/src/main/java/org/apache/seata/server/filter/RaftRequestFilter.java
index 6365468208..925f9061de 100644
--- a/server/src/main/java/org/apache/seata/server/filter/RaftLeaderWriteFilter.java
+++ b/server/src/main/java/org/apache/seata/server/filter/RaftRequestFilter.java
@@ -17,6 +17,7 @@
 package org.apache.seata.server.filter;
 
 import org.apache.seata.common.store.SessionMode;
+import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.exception.TransactionExceptionCode;
 import org.apache.seata.server.cluster.listener.ClusterChangeEvent;
@@ -40,12 +41,14 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
+import static org.apache.seata.common.Constants.RAFT_GROUP_HEADER;
+
 /**
  * Raft Leader Write Filter
  */
 @Component
 @Conditional(RaftCondition.class)
-public class RaftLeaderWriteFilter implements Filter, ApplicationListener<ClusterChangeEvent> {
+public class RaftRequestFilter implements Filter, ApplicationListener<ClusterChangeEvent> {
 
     private static final Map<String, Boolean> GROUP_PREVENT = new ConcurrentHashMap<>();
 
@@ -53,20 +56,30 @@ public class RaftLeaderWriteFilter implements Filter, ApplicationListener<Cluste
     public void init(FilterConfig filterConfig) throws ServletException {}
 
     @Override
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
-                         FilterChain filterChain) throws IOException, ServletException {
-        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
-        String method = httpRequest.getMethod();
-        if (!HttpMethod.GET.name().equalsIgnoreCase(method)) {
-            String group = SeataClusterContext.getGroup();
-            if (!isPass(group)) {
-                throw new ConsoleException(new TransactionException(TransactionExceptionCode.NotRaftLeader,
-                        " The current TC is not a leader node, interrupt processing of transactions!"),
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+        throws IOException, ServletException {
+        HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
+        String group = httpRequest.getParameter("unit");
+        if (StringUtils.isBlank(group)) {
+            group = httpRequest.getHeader(RAFT_GROUP_HEADER);
+        }
+        if (group != null) {
+            SeataClusterContext.bindGroup(group);
+        }
+        try {
+            String method = httpRequest.getMethod();
+            if (!HttpMethod.GET.name().equalsIgnoreCase(method)) {
+                if (!isPass(group)) {
+                    throw new ConsoleException(
+                        new TransactionException(TransactionExceptionCode.NotRaftLeader,
+                            " The current TC is not a leader node, interrupt processing of transactions!"),
                         " The current TC is not a leader node, interrupt processing of transactions!");
+                }
             }
+            filterChain.doFilter(servletRequest, servletResponse);
+        } finally {
+            SeataClusterContext.unbindGroup();
         }
-
-        filterChain.doFilter(servletRequest, servletResponse);
     }
 
     @Override
diff --git a/server/src/main/java/org/apache/seata/server/storage/SessionConverter.java b/server/src/main/java/org/apache/seata/server/storage/SessionConverter.java
index 4b90905a85..92245d70ba 100644
--- a/server/src/main/java/org/apache/seata/server/storage/SessionConverter.java
+++ b/server/src/main/java/org/apache/seata/server/storage/SessionConverter.java
@@ -24,8 +24,8 @@ import java.util.Collections;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.common.util.StringUtils;
 import org.apache.seata.server.cluster.raft.sync.msg.dto.BranchTransactionDTO;
-import org.apache.seata.server.console.vo.BranchSessionVO;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.BranchSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.core.model.BranchStatus;
 import org.apache.seata.core.model.BranchType;
 import org.apache.seata.core.model.GlobalStatus;
diff --git a/server/src/main/java/org/apache/seata/server/storage/redis/store/RedisTransactionStoreManager.java b/server/src/main/java/org/apache/seata/server/storage/redis/store/RedisTransactionStoreManager.java
index de41a2b5d9..b8c9d33e2a 100644
--- a/server/src/main/java/org/apache/seata/server/storage/redis/store/RedisTransactionStoreManager.java
+++ b/server/src/main/java/org/apache/seata/server/storage/redis/store/RedisTransactionStoreManager.java
@@ -43,7 +43,7 @@ import org.apache.seata.config.ConfigurationFactory;
 import org.apache.seata.core.model.GlobalStatus;
 import org.apache.seata.core.store.BranchTransactionDO;
 import org.apache.seata.core.store.GlobalTransactionDO;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.server.session.GlobalSession;
 import org.apache.seata.server.session.SessionCondition;
 import org.apache.seata.server.session.SessionStatusValidator;
diff --git a/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java b/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
index 6dc3f04016..133a516199 100644
--- a/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/lock/LockManagerTest.java
@@ -32,9 +32,9 @@ import org.apache.seata.common.result.PageResult;
 import org.apache.seata.core.exception.TransactionException;
 import org.apache.seata.core.model.BranchType;
 import org.apache.seata.common.util.UUIDGenerator;
-import org.apache.seata.server.console.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
 import org.apache.seata.server.console.service.GlobalLockService;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.apache.seata.server.lock.file.FileLockManagerForTest;
 import org.apache.seata.server.session.BranchSession;
 import org.apache.seata.server.session.GlobalSession;
diff --git a/server/src/test/java/org/apache/seata/server/session/FileSessionManagerTest.java b/server/src/test/java/org/apache/seata/server/session/FileSessionManagerTest.java
index dc0d742a3e..e3056ee32c 100644
--- a/server/src/test/java/org/apache/seata/server/session/FileSessionManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/FileSessionManagerTest.java
@@ -38,12 +38,11 @@ import org.apache.seata.core.model.BranchStatus;
 import org.apache.seata.core.model.BranchType;
 import org.apache.seata.core.model.GlobalStatus;
 import org.apache.seata.core.model.LockStatus;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.server.console.service.BranchSessionService;
 import org.apache.seata.server.console.service.GlobalSessionService;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.server.storage.file.session.FileSessionManager;
-import org.apache.seata.server.store.StoreConfig;
 import org.apache.seata.server.util.StoreUtil;
 import org.apache.commons.lang.time.DateUtils;
 import org.junit.jupiter.api.Assertions;
diff --git a/server/src/test/java/org/apache/seata/server/session/redis/RedisQueryConsolTest.java b/server/src/test/java/org/apache/seata/server/session/redis/RedisQueryConsolTest.java
index 0e4a8e90f5..63f3491acd 100644
--- a/server/src/test/java/org/apache/seata/server/session/redis/RedisQueryConsolTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/redis/RedisQueryConsolTest.java
@@ -20,12 +20,12 @@ import javax.annotation.Resource;
 
 import com.alibaba.fastjson.JSON;
 import org.apache.seata.common.result.PageResult;
-import org.apache.seata.server.console.param.GlobalLockParam;
-import org.apache.seata.server.console.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.param.GlobalLockParam;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
 import org.apache.seata.server.console.service.GlobalLockService;
 import org.apache.seata.server.console.service.GlobalSessionService;
-import org.apache.seata.server.console.vo.GlobalLockVO;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
 import org.springframework.boot.test.context.SpringBootTest;
diff --git a/server/src/test/java/org/apache/seata/server/session/redis/RedisTransactionStoreManagerTest.java b/server/src/test/java/org/apache/seata/server/session/redis/RedisTransactionStoreManagerTest.java
index 25755fe1cf..d2deccae9b 100644
--- a/server/src/test/java/org/apache/seata/server/session/redis/RedisTransactionStoreManagerTest.java
+++ b/server/src/test/java/org/apache/seata/server/session/redis/RedisTransactionStoreManagerTest.java
@@ -27,10 +27,10 @@ import org.apache.seata.common.loader.EnhancedServiceLoader;
 import org.apache.seata.common.util.BeanUtils;
 import org.apache.seata.common.util.CollectionUtils;
 import org.apache.seata.core.exception.TransactionException;
-import org.apache.seata.server.console.param.GlobalSessionParam;
-import org.apache.seata.server.console.vo.GlobalLockVO;
+import org.apache.seata.server.console.entity.param.GlobalSessionParam;
+import org.apache.seata.server.console.entity.vo.GlobalLockVO;
 import org.apache.seata.core.model.GlobalStatus;
-import org.apache.seata.server.console.vo.GlobalSessionVO;
+import org.apache.seata.server.console.entity.vo.GlobalSessionVO;
 import org.apache.seata.server.session.GlobalSession;
 import org.apache.seata.server.session.SessionCondition;
 import org.apache.seata.server.session.SessionManager;


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@seata.apache.org
For additional commands, e-mail: notifications-help@seata.apache.org