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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 93c8129804c [branch-2.0](transaction) Fix publish txn wait too long 
when not meet quorum #26659 (#26759)
93c8129804c is described below

commit 93c8129804c32209fe1482fc6a8938ca2869b294
Author: yujun <[email protected]>
AuthorDate: Sat Nov 11 15:21:23 2023 +0800

    [branch-2.0](transaction) Fix publish txn wait too long when not meet 
quorum #26659 (#26759)
---
 .../doris/transaction/DatabaseTransactionMgr.java  | 16 +++-------
 .../doris/transaction/PublishVersionDaemon.java    |  4 +--
 .../apache/doris/transaction/TransactionState.java | 36 +++++++++++-----------
 3 files changed, 24 insertions(+), 32 deletions(-)

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 afa3c9aec80..d8918368fa9 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
@@ -294,7 +294,7 @@ public class DatabaseTransactionMgr {
         info.add(TimeUtils.longToTimeString(txnState.getPrepareTime()));
         info.add(TimeUtils.longToTimeString(txnState.getPreCommitTime()));
         info.add(TimeUtils.longToTimeString(txnState.getCommitTime()));
-        info.add(TimeUtils.longToTimeString(txnState.getPublishVersionTime()));
+        
info.add(TimeUtils.longToTimeString(txnState.getLastPublishVersionTime()));
         info.add(TimeUtils.longToTimeString(txnState.getFinishTime()));
         info.add(txnState.getReason());
         info.add(String.valueOf(txnState.getErrorReplicas().size()));
@@ -917,10 +917,10 @@ public class DatabaseTransactionMgr {
         Map<Long, PublishVersionTask> publishTasks = 
transactionState.getPublishVersionTasks();
 
         long now = System.currentTimeMillis();
-        long firstPublishOneSuccTime = 
transactionState.getFirstPublishOneSuccTime();
+        long firstPublishVersionTime = 
transactionState.getFirstPublishVersionTime();
         boolean allowPublishOneSucc = false;
-        if (Config.publish_wait_time_second > 0 && firstPublishOneSuccTime > 0
-                && now >= firstPublishOneSuccTime + 
Config.publish_wait_time_second * 1000L) {
+        if (Config.publish_wait_time_second > 0 && firstPublishVersionTime > 0
+                && now >= firstPublishVersionTime + 
Config.publish_wait_time_second * 1000L) {
             allowPublishOneSucc = true;
         }
 
@@ -943,7 +943,6 @@ public class DatabaseTransactionMgr {
         tableList = MetaLockUtils.writeLockTablesIfExist(tableList);
         PublishResult publishResult = PublishResult.QUORUM_SUCC;
         try {
-            boolean allTabletsLeastOneSucc = true;
             Iterator<TableCommitInfo> tableCommitInfoIterator
                     = 
transactionState.getIdToTableCommitInfos().values().iterator();
             while (tableCommitInfoIterator.hasNext()) {
@@ -1031,10 +1030,6 @@ public class DatabaseTransactionMgr {
                                 continue;
                             }
 
-                            if (healthReplicaNum == 0) {
-                                allTabletsLeastOneSucc = false;
-                            }
-
                             String writeDetail = 
getTabletWriteDetail(tabletSuccReplicas, tabletWriteFailedReplicas,
                                     tabletVersionFailedReplicas);
                             if (allowPublishOneSucc && healthReplicaNum > 0) {
@@ -1073,9 +1068,6 @@ public class DatabaseTransactionMgr {
                     }
                 }
             }
-            if (allTabletsLeastOneSucc && firstPublishOneSuccTime <= 0) {
-                transactionState.setFirstPublishOneSuccTime(now);
-            }
             if (publishResult == PublishResult.FAILED) {
                 return;
             }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
index 747508d2118..cc53893c408 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
@@ -117,7 +117,7 @@ public class PublishVersionDaemon extends MasterDaemon {
                 batchTask.addTask(task);
                 transactionState.addPublishVersionTask(backendId, task);
             }
-            transactionState.setHasSendTask(true);
+            transactionState.setSendedTask();
             LOG.info("send publish tasks for transaction: {}, db: {}", 
transactionState.getTransactionId(),
                     transactionState.getDbId());
         }
@@ -169,7 +169,7 @@ public class PublishVersionDaemon extends MasterDaemon {
                     AgentTaskQueue.removeTask(task.getBackendId(), 
TTaskType.PUBLISH_VERSION, task.getSignature());
                 }
                 if (MetricRepo.isInit) {
-                    long publishTime = 
transactionState.getPublishVersionTime() - transactionState.getCommitTime();
+                    long publishTime = 
transactionState.getLastPublishVersionTime() - transactionState.getCommitTime();
                     MetricRepo.HISTO_TXN_PUBLISH_LATENCY.update(publishTime);
                 }
             }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionState.java 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionState.java
index 2b01a612534..17e9f53d609 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionState.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/transaction/TransactionState.java
@@ -220,13 +220,14 @@ public class TransactionState implements Writable {
     // this state need not be serialized
     private Map<Long, PublishVersionTask> publishVersionTasks;
     private boolean hasSendTask;
-    private long publishVersionTime = -1;
     private TransactionStatus preStatus = null;
 
     // When publish txn, if every tablet has at least 1 replica published 
succ, but not quorum replicas succ,
-    // and time since firstPublishOneSuccTime has exceeds 
Config.publish_wait_time_second,
+    // and time since firstPublishVersionTime has exceeds 
Config.publish_wait_time_second,
     // then this transaction will become visible.
-    private long firstPublishOneSuccTime = -1;
+    private long firstPublishVersionTime = -1;
+
+    private long lastPublishVersionTime = -1;
 
     @SerializedName(value = "callbackId")
     private long callbackId = -1;
@@ -339,17 +340,24 @@ public class TransactionState implements Writable {
         this.publishVersionTasks.put(backendId, task);
     }
 
-    public void setHasSendTask(boolean hasSendTask) {
-        this.hasSendTask = hasSendTask;
-        this.publishVersionTime = System.currentTimeMillis();
+    public void setSendedTask() {
+        this.hasSendTask = true;
+        updateSendTaskTime();
     }
 
     public void updateSendTaskTime() {
-        this.publishVersionTime = System.currentTimeMillis();
+        this.lastPublishVersionTime = System.currentTimeMillis();
+        if (this.firstPublishVersionTime <= 0) {
+            this.firstPublishVersionTime = lastPublishVersionTime;
+        }
+    }
+
+    public long getFirstPublishVersionTime() {
+        return firstPublishVersionTime;
     }
 
-    public long getPublishVersionTime() {
-        return this.publishVersionTime;
+    public long getLastPublishVersionTime() {
+        return this.lastPublishVersionTime;
     }
 
     public boolean hasSendTask() {
@@ -420,14 +428,6 @@ public class TransactionState implements Writable {
         return errorLogUrl;
     }
 
-    public long getFirstPublishOneSuccTime() {
-        return firstPublishOneSuccTime;
-    }
-
-    public void setFirstPublishOneSuccTime(long firstPublishOneSuccTime) {
-        this.firstPublishOneSuccTime = firstPublishOneSuccTime;
-    }
-
     public void setTransactionStatus(TransactionStatus transactionStatus) {
         // status changed
         this.preStatus = this.transactionStatus;
@@ -646,7 +646,7 @@ public class TransactionState implements Writable {
         if (prolongPublishTimeout) {
             timeoutMillis *= 2;
         }
-        return System.currentTimeMillis() - publishVersionTime > timeoutMillis;
+        return System.currentTimeMillis() - lastPublishVersionTime > 
timeoutMillis;
     }
 
     public void prolongPublishTimeout() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to