[fix](publish) add retry publish when succeed replica num less than quorum and transaction not VISIBLE (#17453)

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.
Signed-off-by: nextdreamblue <zxw520blue1@163.com>
This commit is contained in:
xueweizhang
2023-03-10 12:02:15 +08:00
committed by GitHub
parent a79b8ede88
commit 739e043c8d

View File

@ -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<Long, PublishVersionTask> publishVersionTask =
transactionState.getPublishVersionTasks();
PublishVersionTask task = publishVersionTask.get(backendId);
if (task != null && task.isFinished()) {
List<Long> 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<Long, TPartitionVersionInfo> 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