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