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

w41ter 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 ab4d81a6761 [enhancement](Load)allow load data to the other partitions 
when some partitions are restoring (#39411)
ab4d81a6761 is described below

commit ab4d81a6761a6dea7bb6634bca2ae1f99c192bdb
Author: shouchengShen <50309488+johnny...@users.noreply.github.com>
AuthorDate: Mon Aug 26 15:22:47 2024 +0800

    [enhancement](Load)allow load data to the other partitions when some 
partitions are restoring (#39411)
    
    If broker load or stream load task execute in one table that is
    restoring data, load task will failed with Exception.
    Exception info :"Table [xxx] is under restore" or "Table [xxx] is in
    restore process, can't load into it".
    
    But mostly restoreJob only effects some partitions in this table, not
    all of them, so that the other partitions still need to load data
    successfully.
    To achieve this goal, before checking olap table state, check partition
    state first.
    
    ps: set restore status for partitions in this
    pr:https://github.com/apache/doris/pull/8245
    
    
    ## test case for this pr
    
    ### restore tbl's partition p202408
    $ RESTORE SNAPSHOT db.tbl_p202408_test
    FROM repo
    ON(
        `tbl` PARTITION (p202408)
    )
    PROPERTIES(
        "backup_timestamp"="2024-08-22-20-32-37",
        "replication_num" = "1"
    );
    
    ###  check restore job state\G
    $ SHOW RESTORE\G
    *************************** 1. row ***************************
    JobId: 21741
    Label: tbl_p202408_test
    Timestamp: 2024-08-22-20-32-37
    State: DOWNLOADING
    RestoreObjs: {
      "name": "tbl_p202408_test",
      "database": "db",
      "olap_table_list": [
          {
              "name": "tbl",
              "partition_names": ["p202408"]
          }
    ]
    
    ### load to partition p202408, failed with exception
     curl --location-trusted -u root:"" \
    >   -H "label:tbl_test_load_19" \
    >   -H "timeout:300" \
    >   -H "format: parquet" \
    >   -T data_for_p202408.parquet \
    >   -XPUT http://fe_ip:8030/api/db/tbl/_stream_load
    {
        "TxnId": 3042,
        "Label": "tbl_test_load_19",
        "Comment": "",
        "TwoPhaseCommit": "false",
        "Status": "Fail",
    "Message": "[ANALYSIS_ERROR]TStatus: errCode = 2, detailMessage = Table
    [zt_order_detail_v3], Partition [p202408] is in restore process. Can not
    load into it.etc.",
        "NumberTotalRows": 682,
        "NumberLoadedRows": 682,
        "NumberFilteredRows": 0,
        "NumberUnselectedRows": 0,
        "LoadBytes": 82025,
        "LoadTimeMs": 48,
        "BeginTxnTimeMs": 0,
        "StreamLoadPutTimeMs": 7,
        "ReadDataTimeMs": 0,
        "WriteDataTimeMs": 38,
        "CommitAndPublishTimeMs": 0
    }
    
    ### load to partition p202408, successfully
    $ curl --location-trusted -u root:"" \
    >   -H "timeout:300" \
    >   -H "format: json" \
    >   -H "read_json_by_line:true" \
    >   -T  data_for_p202407.json \
    >   -XPUT http://fe_ip:8030/api/db/tbl/_stream_load
    {
        "TxnId": 3043,
        "Label": "2f2dae38-a495-4c22-9492-419ea70b724e",
        "Comment": "",
        "TwoPhaseCommit": "false",
        "Status": "Success",
        "Message": "OK",
        "NumberTotalRows": 1,
        "NumberLoadedRows": 1,
        "NumberFilteredRows": 0,
        "NumberUnselectedRows": 0,
        "LoadBytes": 1128,
        "LoadTimeMs": 51,
        "BeginTxnTimeMs": 0,
        "StreamLoadPutTimeMs": 6,
        "ReadDataTimeMs": 0,
        "WriteDataTimeMs": 30,
        "CommitAndPublishTimeMs": 13
    }
    
    Co-authored-by: shenshoucheng <shenshouch...@jd.com>
---
 .../org/apache/doris/load/BrokerFileGroup.java     | 13 ++++++++++++-
 .../doris/transaction/DatabaseTransactionMgr.java  | 22 ++++++++++++++++------
 2 files changed, 28 insertions(+), 7 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 2b493eefb45..35bd0b8db7d 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
@@ -31,6 +31,7 @@ import org.apache.doris.catalog.KeysType;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.OlapTable.OlapTableState;
 import org.apache.doris.catalog.Partition;
+import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
@@ -181,11 +182,21 @@ public class BrokerFileGroup implements Writable {
                         throw new DdlException("Unknown partition '" + pName
                                 + "' in table '" + olapTable.getName() + "'");
                     }
+                    // partition which need load data
+                    if (partition.getState() == PartitionState.RESTORE) {
+                        throw new DdlException("Table [" + olapTable.getName()
+                                + "], Partition[" + partition.getName() + "] 
is under restore");
+                    }
                     partitionIds.add(partition.getId());
                 }
             }
 
-            if (olapTable.getState() == OlapTableState.RESTORE) {
+            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");
             }
 
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 d733d863f4e..d99f9ba60f6 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
@@ -22,7 +22,9 @@ import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.OlapTable;
+import org.apache.doris.catalog.OlapTable.OlapTableState;
 import org.apache.doris.catalog.Partition;
+import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.PartitionType;
 import org.apache.doris.catalog.Replica;
@@ -474,16 +476,24 @@ public class DatabaseTransactionMgr {
                 continue;
             }
 
-            if (tbl.getState() == OlapTable.OlapTableState.RESTORE) {
-                throw new LoadException("Table " + tbl.getName() + " is in 
restore process. "
-                        + "Can not load into it");
-            }
-
             long partitionId = tabletMeta.getPartitionId();
-            if (tbl.getPartition(partitionId) == null) {
+            Partition partition = tbl.getPartition(partitionId);
+            if (partition == 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
+                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");
             }
 
             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