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

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 7e9f410b624 [improvement](replica) set replica drop write editlog 
(#30345)
7e9f410b624 is described below

commit 7e9f410b6241c35d141024714f95a02eba515f3f
Author: yujun <yu.jun.re...@gmail.com>
AuthorDate: Thu Jan 25 15:32:56 2024 +0800

    [improvement](replica) set replica drop write editlog (#30345)
    
    * set replica drop write editlog
    
    * update test
---
 .../main/java/org/apache/doris/catalog/Env.java    | 30 ++++++++++++----------
 .../java/org/apache/doris/catalog/Replica.java     | 20 ++++++---------
 .../persist/SetReplicaStatusOperationLog.java      |  9 ++++++-
 .../org/apache/doris/catalog/AdminStmtTest.java    |  3 ++-
 4 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
index dd12db7c251..fbb4db00b6e 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java
@@ -5577,18 +5577,17 @@ public class Env {
         long tabletId = stmt.getTabletId();
         long backendId = stmt.getBackendId();
         ReplicaStatus status = stmt.getStatus();
-        setReplicaStatusInternal(tabletId, backendId, status, false);
-    }
-
-    public void setReplicaStatus(long tabletId, long backendId, ReplicaStatus 
status) throws MetaNotFoundException {
-        setReplicaStatusInternal(tabletId, backendId, status, false);
+        long userDropTime = status == ReplicaStatus.DROP ? 
System.currentTimeMillis() : -1L;
+        setReplicaStatusInternal(tabletId, backendId, status, userDropTime, 
false);
     }
 
     public void replaySetReplicaStatus(SetReplicaStatusOperationLog log) 
throws MetaNotFoundException {
-        setReplicaStatusInternal(log.getTabletId(), log.getBackendId(), 
log.getReplicaStatus(), true);
+        setReplicaStatusInternal(log.getTabletId(), log.getBackendId(), 
log.getReplicaStatus(),
+                log.getUserDropTime(), true);
     }
 
-    private void setReplicaStatusInternal(long tabletId, long backendId, 
ReplicaStatus status, boolean isReplay)
+    private void setReplicaStatusInternal(long tabletId, long backendId, 
ReplicaStatus status, long userDropTime,
+            boolean isReplay)
             throws MetaNotFoundException {
         try {
             TabletMeta meta = tabletInvertedIndex.getTabletMeta(tabletId);
@@ -5603,22 +5602,25 @@ public class Env {
                 if (replica == null) {
                     throw new MetaNotFoundException("replica does not exist on 
backend, beId=" + backendId);
                 }
+                boolean updated = false;
                 if (status == ReplicaStatus.BAD || status == ReplicaStatus.OK) 
{
-                    replica.setUserDrop(false);
+                    replica.setUserDropTime(-1L);
                     if (replica.setBad(status == ReplicaStatus.BAD)) {
-                        if (!isReplay) {
-                            SetReplicaStatusOperationLog log = new 
SetReplicaStatusOperationLog(backendId, tabletId,
-                                    status);
-                            getEditLog().logSetReplicaStatus(log);
-                        }
+                        updated = true;
                         LOG.info("set replica {} of tablet {} on backend {} as 
{}. is replay: {}", replica.getId(),
                                 tabletId, backendId, status, isReplay);
                     }
                 } else if (status == ReplicaStatus.DROP) {
-                    replica.setUserDrop(true);
+                    replica.setUserDropTime(userDropTime);
+                    updated = true;
                     LOG.info("set replica {} of tablet {} on backend {} as 
{}.", replica.getId(),
                             tabletId, backendId, status);
                 }
+                if (updated && !isReplay) {
+                    SetReplicaStatusOperationLog log = new 
SetReplicaStatusOperationLog(backendId, tabletId,
+                            status, userDropTime);
+                    getEditLog().logSetReplicaStatus(log);
+                }
             } finally {
                 table.writeUnlock();
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
index 2dae370e4c5..b3d790d3b0a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Replica.java
@@ -763,18 +763,8 @@ public class Replica implements Writable {
         return postWatermarkTxnId;
     }
 
-    public void setUserDrop(boolean isDrop) {
-        if (isDrop) {
-            userDropTime = System.currentTimeMillis();
-        } else {
-            userDropTime = -1;
-        }
-    }
-
-    public boolean isAlive() {
-        return getState() != ReplicaState.CLONE
-                && getState() != ReplicaState.DECOMMISSION
-                && !isBad();
+    public void setUserDropTime(long userDropTime) {
+        this.userDropTime = userDropTime;
     }
 
     public boolean isUserDrop() {
@@ -788,6 +778,12 @@ public class Replica implements Writable {
         return false;
     }
 
+    public boolean isAlive() {
+        return getState() != ReplicaState.CLONE
+                && getState() != ReplicaState.DECOMMISSION
+                && !isBad();
+    }
+
     public boolean isScheduleAvailable() {
         return 
Env.getCurrentSystemInfo().checkBackendScheduleAvailable(backendId)
             && !isUserDrop();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/persist/SetReplicaStatusOperationLog.java
 
b/fe/fe-core/src/main/java/org/apache/doris/persist/SetReplicaStatusOperationLog.java
index 32343ba026f..94ded28aeae 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/persist/SetReplicaStatusOperationLog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/persist/SetReplicaStatusOperationLog.java
@@ -36,11 +36,14 @@ public class SetReplicaStatusOperationLog implements 
Writable {
     private long tabletId;
     @SerializedName(value = "replicaStatus")
     private ReplicaStatus replicaStatus;
+    @SerializedName(value = "userDropTime")
+    private long userDropTime;
 
-    public SetReplicaStatusOperationLog(long backendId, long tabletId, 
ReplicaStatus replicaStatus) {
+    public SetReplicaStatusOperationLog(long backendId, long tabletId, 
ReplicaStatus replicaStatus, long userDropTime) {
         this.backendId = backendId;
         this.tabletId = tabletId;
         this.replicaStatus = replicaStatus;
+        this.userDropTime = userDropTime;
     }
 
     public long getTabletId() {
@@ -55,6 +58,10 @@ public class SetReplicaStatusOperationLog implements 
Writable {
         return replicaStatus;
     }
 
+    public long getUserDropTime() {
+        return userDropTime;
+    }
+
     public static SetReplicaStatusOperationLog read(DataInput in) throws 
IOException {
         String json = Text.readString(in);
         return GsonUtils.GSON.fromJson(json, 
SetReplicaStatusOperationLog.class);
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
index 94e7c6477a7..2e214d67ea3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
@@ -228,7 +228,7 @@ public class AdminStmtTest extends TestWithFeService {
             Files.createFile(path);
             DataOutputStream out = new 
DataOutputStream(Files.newOutputStream(path));
 
-            SetReplicaStatusOperationLog log = new 
SetReplicaStatusOperationLog(10000, 100001, ReplicaStatus.BAD);
+            SetReplicaStatusOperationLog log = new 
SetReplicaStatusOperationLog(10000, 100001, ReplicaStatus.BAD, 100L);
             log.write(out);
             out.flush();
             out.close();
@@ -240,6 +240,7 @@ public class AdminStmtTest extends TestWithFeService {
             Assertions.assertEquals(log.getBackendId(), 
readLog.getBackendId());
             Assertions.assertEquals(log.getTabletId(), readLog.getTabletId());
             Assertions.assertEquals(log.getReplicaStatus(), 
readLog.getReplicaStatus());
+            Assertions.assertEquals(log.getUserDropTime(), 
readLog.getUserDropTime());
 
             in.close();
         } finally {


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

Reply via email to