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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]