diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java index 2068b93755..52c7ca8786 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletInvertedIndex.java @@ -21,6 +21,7 @@ import org.apache.doris.catalog.Replica.ReplicaState; import org.apache.doris.common.Config; import org.apache.doris.common.Pair; import org.apache.doris.cooldown.CooldownConf; +import org.apache.doris.task.PublishVersionTask; import org.apache.doris.thrift.TPartitionVersionInfo; import org.apache.doris.thrift.TStorageMedium; import org.apache.doris.thrift.TTablet; @@ -248,6 +249,48 @@ public class TabletInvertedIndex { map.put(transactionId, versionInfo); } } + } else if (transactionState.getTransactionStatus() == TransactionStatus.COMMITTED) { + // for some reasons, transaction pushlish succeed replica num less than quorum, + // this transaction's status can not to be VISIBLE, and this publish task of + // this replica of this tablet on this backend need retry publish success to + // make transaction VISIBLE when last publish failed. + Map publishVersionTask = + transactionState.getPublishVersionTasks(); + PublishVersionTask task = publishVersionTask.get(backendId); + if (task != null && task.isFinished()) { + List errorTablets = task.getErrorTablets(); + if (errorTablets != null) { + for (int i = 0; i < errorTablets.size(); i++) { + if (tabletId == errorTablets.get(i)) { + TableCommitInfo tableCommitInfo + = transactionState.getTableCommitInfo( + tabletMeta.getTableId()); + PartitionCommitInfo partitionCommitInfo = + tableCommitInfo == null ? null : + tableCommitInfo.getPartitionCommitInfo(partitionId); + if (partitionCommitInfo != null) { + TPartitionVersionInfo versionInfo + = new TPartitionVersionInfo( + tabletMeta.getPartitionId(), + partitionCommitInfo.getVersion(), 0); + synchronized (transactionsToPublish) { + ListMultimap map + = transactionsToPublish.get( + transactionState.getDbId()); + if (map == null) { + map = ArrayListMultimap.create(); + transactionsToPublish.put( + transactionState.getDbId(), map); + } + map.put(transactionId, versionInfo); + } + } + break; + } + } + } + } + } } } // end for txn id