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 7914899f2e18c8..ed404d559aa329 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 @@ -73,6 +73,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -659,24 +660,28 @@ public void finishTransaction(long transactionId, Set errorReplicaIds) thr db.writeLock(); try { boolean hasError = false; - for (TableCommitInfo tableCommitInfo : transactionState.getIdToTableCommitInfos().values()) { + Iterator tableCommitInfoIterator = transactionState.getIdToTableCommitInfos().values().iterator(); + while (tableCommitInfoIterator.hasNext()) { + TableCommitInfo tableCommitInfo = tableCommitInfoIterator.next(); long tableId = tableCommitInfo.getTableId(); OlapTable table = (OlapTable) db.getTable(tableId); // table maybe dropped between commit and publish, ignore this error if (table == null) { - transactionState.removeTable(tableId); + tableCommitInfoIterator.remove(); LOG.warn("table {} is dropped, skip version check and remove it from transaction state {}", tableId, transactionState); continue; } PartitionInfo partitionInfo = table.getPartitionInfo(); - for (PartitionCommitInfo partitionCommitInfo : tableCommitInfo.getIdToPartitionCommitInfo().values()) { + Iterator partitionCommitInfoIterator = tableCommitInfo.getIdToPartitionCommitInfo().values().iterator(); + while (partitionCommitInfoIterator.hasNext()) { + PartitionCommitInfo partitionCommitInfo = partitionCommitInfoIterator.next(); long partitionId = partitionCommitInfo.getPartitionId(); Partition partition = table.getPartition(partitionId); // partition maybe dropped between commit and publish version, ignore this error if (partition == null) { - tableCommitInfo.removePartition(partitionId); + partitionCommitInfoIterator.remove(); LOG.warn("partition {} is dropped, skip version check and remove it from transaction state {}", partitionId, transactionState); 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 bc31304a5f5e2b..a1116172734b89 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 @@ -228,7 +228,12 @@ private void publishVersion() throws UserException { } if (shouldFinishTxn) { - globalTransactionMgr.finishTransaction(transactionState.getDbId(), transactionState.getTransactionId(), publishErrorReplicaIds); + try { + // one transaction exception should not affect other transaction + globalTransactionMgr.finishTransaction(transactionState.getDbId(), transactionState.getTransactionId(), publishErrorReplicaIds); + } catch (Exception e) { + LOG.warn("error happends when finish transaction {} ", transactionState.getTransactionId(), e); + } if (transactionState.getTransactionStatus() != TransactionStatus.VISIBLE) { // if finish transaction state failed, then update publish version time, should check // to finish after some interval