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

dataroaring 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 d085c5ea715 [fix](fe) Add check editlog size mechanism for backupJob 
(#35653) (#37628)
d085c5ea715 is described below

commit d085c5ea7155a3911e43113a172663c917072f8b
Author: Lei Zhang <27994433+swjtu-zhang...@users.noreply.github.com>
AuthorDate: Fri Jul 12 15:49:45 2024 +0800

    [fix](fe) Add check editlog size mechanism for backupJob (#35653) (#37628)
    
    * When creating a backupJob with huge of tables in a database, it can
    cause backupJob editlog size over 2GB and bdbje will throw exception
    because of ByteBuffer overflow
    
    ## Proposed changes
    
    Issue Number: close #xxx
    
    <!--Describe your changes.-->
---
 .../java/org/apache/doris/backup/BackupJob.java    |  7 +++++++
 .../java/org/apache/doris/journal/Journal.java     |  2 ++
 .../apache/doris/journal/bdbje/BDBJEJournal.java   | 23 ++++++++++++++++++++++
 .../apache/doris/journal/local/LocalJournal.java   |  5 +++++
 .../java/org/apache/doris/persist/EditLog.java     | 13 ++++++++++++
 5 files changed, 50 insertions(+)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java 
b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java
index b6f031ab7d4..ec22d6eafc7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java
@@ -568,6 +568,13 @@ public class BackupJob extends AbstractJob {
 
     private void waitingAllSnapshotsFinished() {
         if (unfinishedTaskIds.isEmpty()) {
+
+            if (env.getEditLog().exceedMaxJournalSize(this)) {
+                status = new Status(ErrCode.COMMON_ERROR, "backupJob is too 
large ");
+                return;
+            }
+
+
             snapshotFinishedTime = System.currentTimeMillis();
             state = BackupJobState.UPLOAD_SNAPSHOT;
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/journal/Journal.java 
b/fe/fe-core/src/main/java/org/apache/doris/journal/Journal.java
index 8fca299df19..b0929818eed 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/journal/Journal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/journal/Journal.java
@@ -61,4 +61,6 @@ public interface Journal {
     // Get all the dbs' name
     public List<Long> getDatabaseNames();
 
+    public boolean exceedMaxJournalSize(short op, Writable writable) throws 
IOException;
+
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/journal/bdbje/BDBJEJournal.java 
b/fe/fe-core/src/main/java/org/apache/doris/journal/bdbje/BDBJEJournal.java
index 85e577058be..3c4662e2017 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/journal/bdbje/BDBJEJournal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/journal/bdbje/BDBJEJournal.java
@@ -586,4 +586,27 @@ public class BDBJEJournal implements Journal { // 
CHECKSTYLE IGNORE THIS LINE: B
     public BDBEnvironment getBDBEnvironment() {
         return this.bdbEnvironment;
     }
+
+    @Override
+    public boolean exceedMaxJournalSize(short op, Writable writable) throws 
IOException {
+        JournalEntity entity = new JournalEntity();
+        entity.setOpCode(op);
+        entity.setData(writable);
+
+        DataOutputBuffer buffer = new 
DataOutputBuffer(OUTPUT_BUFFER_INIT_SIZE);
+        entity.write(buffer);
+
+        DatabaseEntry theData = new DatabaseEntry(buffer.getData());
+
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("opCode = {}, journal size = {}", op, theData.getSize());
+        }
+
+        // 1GB
+        if (theData.getSize() > (1 << 30)) {
+            return true;
+        }
+
+        return false;
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/journal/local/LocalJournal.java 
b/fe/fe-core/src/main/java/org/apache/doris/journal/local/LocalJournal.java
index 9ba3274e0f0..4467c53a368 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/journal/local/LocalJournal.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/journal/local/LocalJournal.java
@@ -198,4 +198,9 @@ public class LocalJournal implements Journal {
     public List<Long> getDatabaseNames() {
         throw new RuntimeException("Not Support");
     }
+
+    @Override
+    public boolean exceedMaxJournalSize(short op, Writable writable) throws 
IOException  {
+        return false;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java 
b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
index 79dde3e5874..a1e033d6d1f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
@@ -1905,4 +1905,17 @@ public class EditLog {
     public void logDeleteTableStats(TableStatsDeletionLog log) {
         logEdit(OperationType.OP_DELETE_TABLE_STATS, log);
     }
+
+    public boolean exceedMaxJournalSize(BackupJob job) {
+        try {
+            return exceedMaxJournalSize(OperationType.OP_BACKUP_JOB, job);
+        } catch (Exception e) {
+            LOG.warn("exceedMaxJournalSize exception:", e);
+        }
+        return true;
+    }
+
+    private boolean exceedMaxJournalSize(short op, Writable writable) throws 
IOException {
+        return journal.exceedMaxJournalSize(op, writable);
+    }
 }


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

Reply via email to