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


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

commit e4d543f06050af37b1b9ada7773bbd639030bfa9
Author: zclllhhjj <[email protected]>
AuthorDate: Fri Aug 30 10:34:43 2024 +0800

    [branch-2.1](load) fix commit txn timeout when loading to table with many 
tablet (#40031) (#40139)
    
    pick https://github.com/apache/doris/pull/40031
---
 .../org/apache/doris/load/BrokerFileGroup.java     | 16 +++++----
 .../doris/transaction/DatabaseTransactionMgr.java  | 40 +++++++++++++++-------
 2 files changed, 38 insertions(+), 18 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 ff27acadcac..6676e0a2a1f 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
@@ -149,12 +149,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 636fe582ed1..38514aff8d6 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
@@ -504,7 +504,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;
@@ -513,29 +515,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();
             if (tbl.getPartition(partitionId) == null) {
-                // this can happen when partitionId == -1 (tablet being 
dropping)
-                // or partition really not exist.
+                // this can happen when partitionId == -1 (tablet being 
dropping) or partition really not exist.
                 continue;
-            } else if (tbl.getPartition(partitionId).getState() == 
PartitionState.RESTORE) {
+            }
+            if (tbl.getPartition(partitionId).getState() == 
PartitionState.RESTORE) {
                 // partition in restore process which can not load data
                 throw new LoadException("Table [" + tbl.getName() + "], 
Partition ["
                         + tbl.getPartition(partitionId).getName() + "] is in 
restore process. Can not load into it");
             }
 
-            boolean isPartitionRestoring = 
tbl.getPartitions().stream().anyMatch(
-                    partition -> partition.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");
+            // 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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to