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]