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

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 6ef819d49d2 [enhance](branch-3.0)support show-transaction (#41797)
6ef819d49d2 is described below

commit 6ef819d49d2fa3212067962cfd6afb4782df63c2
Author: kkop <2449402...@qq.com>
AuthorDate: Mon Oct 14 22:17:34 2024 +0800

    [enhance](branch-3.0)support show-transaction (#41797)
---
 .../transaction/CloudGlobalTransactionMgr.java     | 19 +++++-
 .../doris/transaction/DatabaseTransactionMgr.java  | 61 ++---------------
 .../apache/doris/transaction/TransactionUtil.java  | 77 ++++++++++++++++++++++
 .../cloud_p0/conf/regression-conf-custom.groovy    |  1 -
 .../query_p0/show/test_show_transaction.groovy     |  7 +-
 5 files changed, 104 insertions(+), 61 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java
index 78f39de3957..748642272cf 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/cloud/transaction/CloudGlobalTransactionMgr.java
@@ -112,6 +112,7 @@ import org.apache.doris.transaction.TransactionState;
 import org.apache.doris.transaction.TransactionState.LoadJobSourceType;
 import org.apache.doris.transaction.TransactionState.TxnCoordinator;
 import org.apache.doris.transaction.TransactionStatus;
+import org.apache.doris.transaction.TransactionUtil;
 import org.apache.doris.transaction.TxnCommitAttachment;
 import org.apache.doris.transaction.TxnStateCallbackFactory;
 import org.apache.doris.transaction.TxnStateChangeCallback;
@@ -1507,7 +1508,14 @@ public class CloudGlobalTransactionMgr implements 
GlobalTransactionMgrIface {
 
     @Override
     public Long getTransactionId(Long dbId, String label) throws 
AnalysisException {
-        throw new AnalysisException(NOT_SUPPORTED_MSG);
+        try {
+            TransactionStatus labelState = getLabelState(dbId, label);
+            List<TransactionStatus> statusList = 
Lists.newArrayList(labelState);
+            return getTransactionIdByLabel(dbId, label, statusList);
+        } catch (UserException e) {
+            LOG.warn("Get transaction id by label " + label + " failed", e);
+            return null;
+        }
     }
 
     @Override
@@ -1688,7 +1696,14 @@ public class CloudGlobalTransactionMgr implements 
GlobalTransactionMgrIface {
 
     @Override
     public List<List<String>> getSingleTranInfo(long dbId, long txnId) throws 
AnalysisException {
-        throw new AnalysisException(NOT_SUPPORTED_MSG);
+        List<List<String>> infos = new ArrayList<List<String>>();
+        TransactionState txnState = this.getTransactionState(dbId, txnId);
+        if (txnState == null) {
+            throw new AnalysisException("transaction with id " + txnId + " 
does not exist");
+        }
+        TransactionUtil.checkAuth(dbId, txnState);
+        infos.add(TransactionUtil.getTxnStateInfo(txnState, 
Lists.newArrayList()));
+        return infos;
     }
 
     @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
index a236bea0625..39ecbfd30a8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
@@ -36,8 +36,6 @@ import org.apache.doris.catalog.TabletMeta;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DuplicatedRequestException;
-import org.apache.doris.common.ErrorCode;
-import org.apache.doris.common.ErrorReport;
 import org.apache.doris.common.FeNameFormat;
 import org.apache.doris.common.LabelAlreadyUsedException;
 import org.apache.doris.common.LoadException;
@@ -50,12 +48,9 @@ import org.apache.doris.common.util.DebugPointUtil;
 import org.apache.doris.common.util.DebugUtil;
 import org.apache.doris.common.util.InternalDatabaseUtil;
 import org.apache.doris.common.util.MetaLockUtils;
-import org.apache.doris.common.util.TimeUtils;
-import org.apache.doris.datasource.InternalCatalog;
 import org.apache.doris.event.DataChangeEvent;
 import org.apache.doris.metric.MetricRepo;
 import org.apache.doris.mtmv.MTMVUtil;
-import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.persist.BatchRemoveTransactionsOperationV2;
 import org.apache.doris.persist.CleanLabelOperationLog;
 import org.apache.doris.persist.EditLog;
@@ -249,9 +244,7 @@ public class DatabaseTransactionMgr {
                     .sorted(TransactionState.TXN_ID_COMPARATOR)
                     .limit(limit)
                     .forEach(t -> {
-                        List<String> info = Lists.newArrayList();
-                        getTxnStateInfo(t, info);
-                        infos.add(info);
+                        infos.add(TransactionUtil.getTxnStateInfo(t, 
Lists.newArrayList()));
                     });
         } finally {
             readUnlock();
@@ -287,9 +280,7 @@ public class DatabaseTransactionMgr {
                     .filter(transactionState -> 
(transactionState.getTransactionStatus() == status))
                     .sorted(TransactionState.TXN_ID_COMPARATOR)
                     .forEach(t -> {
-                        List<String> info = Lists.newArrayList();
-                        getTxnStateInfo(t, info);
-                        infos.add(info);
+                        infos.add(TransactionUtil.getTxnStateInfo(t, 
Lists.newArrayList()));
                     });
         } finally {
             readUnlock();
@@ -309,9 +300,7 @@ public class DatabaseTransactionMgr {
                     .filter(transactionState -> 
(transactionState.getLabel().matches(labelRegex)))
                     .sorted(TransactionState.TXN_ID_COMPARATOR)
                     .forEach(t -> {
-                        List<String> info = Lists.newArrayList();
-                        getTxnStateInfo(t, info);
-                        infos.add(info);
+                        infos.add(TransactionUtil.getTxnStateInfo(t, 
Lists.newArrayList()));
                     });
         } finally {
             readUnlock();
@@ -319,23 +308,6 @@ public class DatabaseTransactionMgr {
         return infos;
     }
 
-    private void getTxnStateInfo(TransactionState txnState, List<String> info) 
{
-        info.add(String.valueOf(txnState.getTransactionId()));
-        info.add(txnState.getLabel());
-        info.add(txnState.getCoordinator().toString());
-        info.add(txnState.getTransactionStatus().name());
-        info.add(txnState.getSourceType().name());
-        info.add(TimeUtils.longToTimeString(txnState.getPrepareTime()));
-        info.add(TimeUtils.longToTimeString(txnState.getPreCommitTime()));
-        info.add(TimeUtils.longToTimeString(txnState.getCommitTime()));
-        
info.add(TimeUtils.longToTimeString(txnState.getLastPublishVersionTime()));
-        info.add(TimeUtils.longToTimeString(txnState.getFinishTime()));
-        info.add(txnState.getReason());
-        info.add(String.valueOf(txnState.getErrorReplicas().size()));
-        info.add(String.valueOf(txnState.getCallbackId()));
-        info.add(String.valueOf(txnState.getTimeoutMs()));
-        info.add(txnState.getErrMsg());
-    }
 
     public long beginTransaction(List<Long> tableIdList, String label, 
TUniqueId requestId,
             TransactionState.TxnCoordinator coordinator, 
TransactionState.LoadJobSourceType sourceType,
@@ -2069,35 +2041,12 @@ public class DatabaseTransactionMgr {
         List<List<String>> infos = new ArrayList<List<String>>();
         readLock();
         try {
-            Database db = 
Env.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
             TransactionState txnState = unprotectedGetTransactionState(txnId);
             if (txnState == null) {
                 throw new AnalysisException("transaction with id " + txnId + " 
does not exist");
             }
-
-            if (ConnectContext.get() != null) {
-                // check auth
-                Set<Long> tblIds = txnState.getIdToTableCommitInfos().keySet();
-                for (Long tblId : tblIds) {
-                    Table tbl = db.getTableNullable(tblId);
-                    if (tbl != null) {
-                        if (!Env.getCurrentEnv().getAccessManager()
-                                .checkTblPriv(ConnectContext.get(), 
InternalCatalog.INTERNAL_CATALOG_NAME,
-                                        db.getFullName(),
-                                        tbl.getName(), PrivPredicate.SHOW)) {
-                            
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR,
-                                    "SHOW TRANSACTION",
-                                    ConnectContext.get().getQualifiedUser(),
-                                    ConnectContext.get().getRemoteIP(),
-                                    db.getFullName() + ": " + tbl.getName());
-                        }
-                    }
-                }
-            }
-
-            List<String> info = Lists.newArrayList();
-            getTxnStateInfo(txnState, info);
-            infos.add(info);
+            TransactionUtil.checkAuth(dbId, txnState);
+            infos.add(TransactionUtil.getTxnStateInfo(txnState, 
Lists.newArrayList()));
         } finally {
             readUnlock();
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionUtil.java 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionUtil.java
new file mode 100644
index 00000000000..0a5fa0de5c8
--- /dev/null
+++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionUtil.java
@@ -0,0 +1,77 @@
+// 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.doris.transaction;
+
+import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.Table;
+import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.util.TimeUtils;
+import org.apache.doris.datasource.InternalCatalog;
+import org.apache.doris.mysql.privilege.PrivPredicate;
+import org.apache.doris.qe.ConnectContext;
+
+import java.util.List;
+import java.util.Set;
+
+public class TransactionUtil {
+
+    public static List<String> getTxnStateInfo(TransactionState txnState, 
List<String> info) {
+        info.add(String.valueOf(txnState.getTransactionId()));
+        info.add(txnState.getLabel());
+        info.add(txnState.getCoordinator().toString());
+        info.add(txnState.getTransactionStatus().name());
+        info.add(txnState.getSourceType().name());
+        info.add(TimeUtils.longToTimeString(txnState.getPrepareTime()));
+        info.add(TimeUtils.longToTimeString(txnState.getPreCommitTime()));
+        info.add(TimeUtils.longToTimeString(txnState.getCommitTime()));
+        
info.add(TimeUtils.longToTimeString(txnState.getLastPublishVersionTime()));
+        info.add(TimeUtils.longToTimeString(txnState.getFinishTime()));
+        info.add(txnState.getReason());
+        info.add(String.valueOf(txnState.getErrorReplicas().size()));
+        info.add(String.valueOf(txnState.getCallbackId()));
+        info.add(String.valueOf(txnState.getTimeoutMs()));
+        info.add(txnState.getErrMsg());
+        return info;
+    }
+
+    public static void checkAuth(long dbId, TransactionState txnState) throws 
AnalysisException {
+        Database db = 
Env.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
+        if (ConnectContext.get() != null) {
+            // check auth
+            Set<Long> tblIds = txnState.getIdToTableCommitInfos().keySet();
+            for (Long tblId : tblIds) {
+                Table tbl = db.getTableNullable(tblId);
+                if (tbl != null) {
+                    if (!Env.getCurrentEnv().getAccessManager()
+                            .checkTblPriv(ConnectContext.get(), 
InternalCatalog.INTERNAL_CATALOG_NAME,
+                            db.getFullName(),
+                            tbl.getName(), PrivPredicate.SHOW)) {
+                        
ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR,
+                                "SHOW TRANSACTION",
+                                ConnectContext.get().getQualifiedUser(),
+                                ConnectContext.get().getRemoteIP(),
+                                db.getFullName() + ": " + tbl.getName());
+                    }
+                }
+            }
+        }
+    }
+}
diff --git 
a/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy 
b/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy
index 8d6b265a54b..2d9c6ad6978 100644
--- a/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy
+++ b/regression-test/pipeline/cloud_p0/conf/regression-conf-custom.groovy
@@ -37,7 +37,6 @@ excludeSuites = "000_the_start_sentinel_do_not_touch," + // 
keep this line as th
     "test_refresh_mtmv," + // not supported yet
     "test_report_version_missing," +
     "test_set_partition_version," +
-    "test_show_transaction," + // not supported yet
     "test_spark_load," +
     "test_index_lowercase_fault_injection," +
     "test_index_compaction_failure_injection," +
diff --git a/regression-test/suites/query_p0/show/test_show_transaction.groovy 
b/regression-test/suites/query_p0/show/test_show_transaction.groovy
index fa7f0ddbdc9..79540d475b4 100644
--- a/regression-test/suites/query_p0/show/test_show_transaction.groovy
+++ b/regression-test/suites/query_p0/show/test_show_transaction.groovy
@@ -36,7 +36,10 @@ suite("test_show_transaction", "p0") {
     def uuid = UUID.randomUUID().toString().replaceAll("-", "");
     sql """ INSERT INTO ${testTable} WITH LABEL 
label_test_show_transaction_${uuid} VALUES(100, 'doris')  """
     def res = sql_return_maparray """ show transaction where label = 
'label_test_show_transaction_${uuid}'  """
+    assertTrue(res.size() != 0)
     print("show transaction result : " + res)
-    def reslike = sql_return_maparray """ show transaction where label like 
'label_test_show_transaction_${uuid}%'  """
-    assertTrue(res.equals(reslike))
+    if (!isCloudMode()) {
+        def reslike = sql_return_maparray """ show transaction where label 
like 'label_test_show_transaction_${uuid}%'  """
+        assertTrue(res.equals(reslike))
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to