This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit c1d42eaa8629c6747a987ace1e9f45225964f7d3 Author: zhangdong <[email protected]> AuthorDate: Thu Mar 21 14:53:10 2024 +0800 [fix](mtmv)resolve the issue of table version updates in concurrent situations (#32487) Move the logic for version+1 from `unprotectedCommitTransaction `to`FinishTransaction`, as the write lock for the table was obtained in `FinishTransaction` --- .../doris/transaction/DatabaseTransactionMgr.java | 21 +++++++++++++++++---- .../apache/doris/transaction/TableCommitInfo.java | 4 +--- 2 files changed, 18 insertions(+), 7 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 68105aad372..363c4b91c31 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 @@ -1033,6 +1033,7 @@ public class DatabaseTransactionMgr { transactionState.setFinishTime(System.currentTimeMillis()); transactionState.clearErrorMsg(); transactionState.setTransactionStatus(TransactionStatus.VISIBLE); + setTableVersion(transactionState, db); unprotectUpsertTransactionState(transactionState, false); txnOperated = true; // TODO(cmy): We found a very strange problem. When delete-related transactions are processed here, @@ -1063,6 +1064,20 @@ public class DatabaseTransactionMgr { transactionState, transactionState.getPublishCount(), publishResult.name()); } + private void setTableVersion(TransactionState transactionState, Database db) { + Map<Long, TableCommitInfo> idToTableCommitInfos = transactionState.getIdToTableCommitInfos(); + for (Entry<Long, TableCommitInfo> entry : idToTableCommitInfos.entrySet()) { + OlapTable table = (OlapTable) db.getTableNullable(entry.getKey()); + if (table == null) { + LOG.warn("table {} does not exist when setTableVersion. transaction: {}, db: {}", + entry.getKey(), transactionState.getTransactionId(), db.getId()); + continue; + } + entry.getValue().setVersion(table.getNextVersion()); + entry.getValue().setVersionTime(System.currentTimeMillis()); + } + } + private boolean finishCheckPartitionVersion(TransactionState transactionState, Database db, List<Pair<OlapTable, Partition>> relatedTblPartitions) { Iterator<TableCommitInfo> tableCommitInfoIterator @@ -1316,8 +1331,7 @@ public class DatabaseTransactionMgr { transactionState.setErrorReplicas(errorReplicaIds); for (long tableId : tableToPartition.keySet()) { OlapTable table = (OlapTable) db.getTableNullable(tableId); - TableCommitInfo tableCommitInfo = new TableCommitInfo(tableId, table.getNextVersion(), - System.currentTimeMillis()); + TableCommitInfo tableCommitInfo = new TableCommitInfo(tableId); PartitionInfo tblPartitionInfo = table.getPartitionInfo(); for (long partitionId : tableToPartition.get(tableId)) { String partitionRange = ""; @@ -1357,8 +1371,7 @@ public class DatabaseTransactionMgr { transactionState.setErrorReplicas(errorReplicaIds); for (long tableId : tableToPartition.keySet()) { OlapTable table = (OlapTable) db.getTableNullable(tableId); - TableCommitInfo tableCommitInfo = new TableCommitInfo(tableId, table.getNextVersion(), - System.currentTimeMillis()); + TableCommitInfo tableCommitInfo = new TableCommitInfo(tableId); PartitionInfo tblPartitionInfo = table.getPartitionInfo(); for (long partitionId : tableToPartition.get(tableId)) { Partition partition = table.getPartition(partitionId); diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/TableCommitInfo.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/TableCommitInfo.java index b8d968f3ca0..dbe8bdd68d0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/transaction/TableCommitInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/TableCommitInfo.java @@ -46,11 +46,9 @@ public class TableCommitInfo implements Writable { } - public TableCommitInfo(long tableId, long version, long visibleTime) { + public TableCommitInfo(long tableId) { this.tableId = tableId; idToPartitionCommitInfo = Maps.newHashMap(); - this.version = version; - this.versionTime = visibleTime; } @Override --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
