From 0be1bf60cb7fb99227bdb8ed0845bcadf4b2f014 Mon Sep 17 00:00:00 2001 From: morningman Date: Sat, 23 May 2020 23:50:36 +0800 Subject: [PATCH] [Bug] Fix bug that runningTxnNum does not equal to the real running txn num. This is because the logic for modifying the number of things running is wrong. Because we did not persist the previous status(preStatus) of a transaction. Therefore, when replaying the metadata log, we cannot decide whether to modify the `runningTxnNum` value based on `preStatus`. This info is lost. --- .../transaction/DatabaseTransactionMgr.java | 45 +++++++------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java b/fe/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java index ac2764efb08863..8f10fa0348d1c3 100644 --- a/fe/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java +++ b/fe/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java @@ -814,16 +814,26 @@ protected void unprotectUpsertTransactionState(TransactionState transactionState editLog.logInsertTransactionState(transactionState); } } - // for commit transaction, there is nothing to do - if (transactionState.getTransactionStatus() == TransactionStatus.PREPARE) { - idToRunningTransactionState.put(transactionState.getTransactionId(), transactionState); - } else if (transactionState.getTransactionStatus().isFinalStatus()) { - idToRunningTransactionState.remove(transactionState.getTransactionId()); + if (!transactionState.getTransactionStatus().isFinalStatus()) { + if (idToRunningTransactionState.put(transactionState.getTransactionId(), transactionState) == null) { + if (transactionState.getSourceType() == TransactionState.LoadJobSourceType.ROUTINE_LOAD_TASK) { + runningRoutineLoadTxnNums++; + } else { + runningTxnNums++; + } + } + } else { + if (idToRunningTransactionState.remove(transactionState.getTransactionId()) != null) { + if (transactionState.getSourceType() == TransactionState.LoadJobSourceType.ROUTINE_LOAD_TASK) { + runningRoutineLoadTxnNums--; + } else { + runningTxnNums--; + } + } idToFinalStatusTransactionState.put(transactionState.getTransactionId(), transactionState); finalStatusTransactionStateDeque.add(transactionState); } updateTxnLabels(transactionState); - updateDbRunningTxnNum(transactionState.getPreStatus(), transactionState); } private void updateTxnLabels(TransactionState transactionState) { @@ -835,27 +845,6 @@ private void updateTxnLabels(TransactionState transactionState) { txnIds.add(transactionState.getTransactionId()); } - private void updateDbRunningTxnNum(TransactionStatus preStatus, TransactionState curTxnState) { - if (preStatus == null - && (curTxnState.getTransactionStatus() == TransactionStatus.PREPARE - || curTxnState.getTransactionStatus() == TransactionStatus.COMMITTED)) { - if (curTxnState.getSourceType() == TransactionState.LoadJobSourceType.ROUTINE_LOAD_TASK) { - runningRoutineLoadTxnNums++; - } else { - runningTxnNums++; - } - } else if ((preStatus == TransactionStatus.PREPARE - || preStatus == TransactionStatus.COMMITTED) - && (curTxnState.getTransactionStatus() == TransactionStatus.VISIBLE - || curTxnState.getTransactionStatus() == TransactionStatus.ABORTED)) { - if (curTxnState.getSourceType() == TransactionState.LoadJobSourceType.ROUTINE_LOAD_TASK) { - runningRoutineLoadTxnNums--; - } else { - runningTxnNums--; - } - } - } - public void abortTransaction(String label, String reason) throws UserException { Preconditions.checkNotNull(label); long transactionId = -1; @@ -1362,8 +1351,6 @@ public void replayUpsertTransactionState(TransactionState transactionState) { } } - - public List> getDbTransStateInfo() { List> infos = Lists.newArrayList(); readLock();