This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 1617866a2c4 [fix](load) fix commit txn timeout when loading to table 
with many tablet (#40031) (#40140)
1617866a2c4 is described below

commit 1617866a2c48ed9391a7c91b9db10044c8777eb1
Author: zclllhhjj <zhaochan...@selectdb.com>
AuthorDate: Wed Sep 11 09:28:16 2024 +0800

    [fix](load) fix commit txn timeout when loading to table with many tablet 
(#40031) (#40140)
---
 .../org/apache/doris/load/BrokerFileGroup.java     | 17 +++++---
 .../doris/transaction/DatabaseTransactionMgr.java  | 50 ++++++++++++++--------
 2 files changed, 43 insertions(+), 24 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java 
b/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
index 35bd0b8db7d..01e46012e66 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/BrokerFileGroup.java
@@ -191,13 +191,16 @@ public class BrokerFileGroup implements Writable {
                 }
             }
 
-            boolean isPartitionRestoring = 
olapTable.getPartitions().stream().anyMatch(
-                    partition -> partition.getState() == PartitionState.RESTORE
-            );
-
-            // restore table
-            if (!isPartitionRestoring && olapTable.getState() == 
OlapTableState.RESTORE) {
-                throw new DdlException("Table [" + olapTable.getName() + "] is 
under restore");
+            // only do check when here's restore on this table now
+            if (olapTable.getState() == OlapTableState.RESTORE) {
+                boolean hasPartitionRestoring = 
olapTable.getPartitions().stream()
+                        .anyMatch(partition -> partition.getState() == 
PartitionState.RESTORE);
+                // tbl RESTORE && all partition NOT RESTORE -> whole table 
restore
+                // tbl RESTORE && some partition RESTORE -> just partitions 
restore, NOT WHOLE TABLE
+                // so check wether the whole table restore here
+                if (!hasPartitionRestoring) {
+                    throw new DdlException("Table [" + olapTable.getName() + 
"] is under restore");
+                }
             }
 
             if (olapTable.getKeysType() != KeysType.AGG_KEYS && 
dataDescription.isNegative()) {
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 b83d4c9c98b..cf4bed28e5b 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
@@ -462,7 +462,9 @@ public class DatabaseTransactionMgr {
         List<Long> tabletIds = tabletCommitInfos.stream()
                 
.map(TabletCommitInfo::getTabletId).collect(Collectors.toList());
         List<TabletMeta> tabletMetaList = 
tabletInvertedIndex.getTabletMetaList(tabletIds);
+        HashMap<Long, Boolean> tableIdtoRestoring = new HashMap<>();
         for (int i = 0; i < tabletMetaList.size(); i++) {
+            // get partition and table of this tablet
             TabletMeta tabletMeta = tabletMetaList.get(i);
             if (tabletMeta == TabletInvertedIndex.NOT_EXIST_TABLET_META) {
                 continue;
@@ -471,29 +473,43 @@ public class DatabaseTransactionMgr {
             long tableId = tabletMeta.getTableId();
             OlapTable tbl = (OlapTable) idToTable.get(tableId);
             if (tbl == null) {
-                // this can happen when tableId == -1 (tablet being dropping)
-                // or table really not exist.
+                // this can happen when tableId == -1 (tablet being dropping) 
or table really not exist.
                 continue;
             }
 
+            // check relative partition restore here
             long partitionId = tabletMeta.getPartitionId();
-            Partition partition = tbl.getPartition(partitionId);
-            if (partition == null) {
-                // this can happen when partitionId == -1 (tablet being 
dropping)
-                // or partition really not exist.
+            if (tbl.getPartition(partitionId) == null) {
+                // this can happen when partitionId == -1 (tablet being 
dropping) or partition really not exist.
                 continue;
-            } else if (partition.getState() == PartitionState.RESTORE) {
-                // partition which need load data
+            }
+            if (tbl.getPartition(partitionId).getState() == 
PartitionState.RESTORE) {
+                // partition in restore process which can not load data
                 throw new LoadException("Table [" + tbl.getName() + "], 
Partition ["
-                        + partition.getName() + "] is in restore process. Can 
not load into it");
-            }
-            boolean isPartitionRestoring = 
tbl.getPartitions().stream().anyMatch(
-                    curPartition -> curPartition.getState() == 
PartitionState.RESTORE
-            );
-            // restore table
-            if (!isPartitionRestoring && tbl.getState() == 
OlapTableState.RESTORE) {
-                throw new LoadException("Table " + tbl.getName() + " is in 
restore process. "
-                    + "Can not load into it");
+                        + tbl.getPartition(partitionId).getName() + "] is in 
restore process. Can not load into it");
+            }
+
+            // only do check when here's restore on this table now
+            if (tbl.getState() == OlapTableState.RESTORE) {
+                boolean hasPartitionRestoring = false;
+                if (tableIdtoRestoring.containsKey(tableId)) {
+                    hasPartitionRestoring = tableIdtoRestoring.get(tableId);
+                } else {
+                    for (Partition partition : tbl.getPartitions()) {
+                        if (partition.getState() == PartitionState.RESTORE) {
+                            hasPartitionRestoring = true;
+                            break;
+                        }
+                    }
+                    tableIdtoRestoring.put(tableId, hasPartitionRestoring);
+                }
+                // tbl RESTORE && all partition NOT RESTORE -> whole table 
restore
+                // tbl RESTORE && some partition RESTORE -> just partitions 
restore, NOT WHOLE TABLE
+                // so check wether the whole table restore here
+                if (!hasPartitionRestoring) {
+                    throw new LoadException(
+                            "Table " + tbl.getName() + " is in restore 
process. " + "Can not load into it");
+                }
             }
 
             if (!tableToPartition.containsKey(tableId)) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to