Skip to content

Commit ecd35e9

Browse files
committed
bugfix: fix thread pool full experiment cannot be stopped when uninstall directly
1 parent df8d449 commit ecd35e9

File tree

10 files changed

+68
-6
lines changed

10 files changed

+68
-6
lines changed

chaosblade-exec-bootstrap/chaosblade-exec-bootstrap-jvmsandbox/src/main/java/com/alibaba/chaosblade/exec/bootstrap/jvmsandbox/SandboxModule.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,10 @@ public void onLoad() throws Throwable {
8787
@Override
8888
public void onUnload() throws Throwable {
8989
LOGGER.info("unload chaosblade module");
90-
watchIds.clear();
9190
dispatchService.unload();
9291
ManagerFactory.unload();
92+
watchIds.clear();
93+
LOGGER.info("unload chaosblade module successfully");
9394
}
9495

9596
@Override

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/center/DefaultStatusManager.java

+12
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package com.alibaba.chaosblade.exec.common.center;
1818

1919
import java.util.Collections;
20+
import java.util.Enumeration;
2021
import java.util.HashMap;
22+
import java.util.HashSet;
2123
import java.util.LinkedList;
2224
import java.util.List;
2325
import java.util.Map;
@@ -165,6 +167,16 @@ public StatusMetric getStatusMetricByUid(String uid) {
165167
return metricMap.get(identifier);
166168
}
167169

170+
@Override
171+
public Set<String> getAllUids() {
172+
Enumeration<String> keys = experiments.keys();
173+
HashSet<String> uids = new HashSet<String>();
174+
while (keys.hasMoreElements()) {
175+
uids.add(keys.nextElement());
176+
}
177+
return uids;
178+
}
179+
168180
@Override
169181
public void load() {
170182
closed = false;

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/center/ManagerFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public static void load() {
5656
* Close manager service
5757
*/
5858
public static void unload() {
59+
statusManager.unload();
5960
modelSpecManager.unload();
6061
listenerManager.unload();
61-
statusManager.unload();
6262
}
6363
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/center/StatusManager.java

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020
import java.util.Map;
21+
import java.util.Set;
2122

2223
import com.alibaba.chaosblade.exec.common.model.Model;
2324

@@ -80,4 +81,9 @@ public interface StatusManager extends ManagerService {
8081
*/
8182
StatusMetric getStatusMetricByUid(String uid);
8283

84+
/**
85+
* @return all running experiment uids
86+
*/
87+
Set<String> getAllUids();
88+
8389
}

chaosblade-exec-common/src/main/java/com/alibaba/chaosblade/exec/common/transport/Response.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ public enum Code {
146146
NOT_FOUND(404, "request handler not found"),
147147
ILLEGAL_PARAMETER(405, "illegal parameter"),
148148
DUPLICATE_INJECTION(406, "duplicate injection"),
149-
SERVER_ERROR(500, "server error");
150-
149+
SERVER_ERROR(500, "server error"),
150+
ILLEGAL_STATE(504, "illegal state");
151151
private int code;
152152
private String msg;
153153

chaosblade-exec-service/src/main/java/com/alibaba/chaosblade/exec/service/handler/CreateHandler.java

+9
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class CreateHandler implements RequestHandler {
4444

4545
private ModelSpecManager modelSpecManager;
4646
private StatusManager statusManager;
47+
private volatile boolean unloaded;
4748

4849
public CreateHandler() {
4950
this.modelSpecManager = ManagerFactory.getModelSpecManager();
@@ -63,6 +64,9 @@ public String getHandlerName() {
6364
*/
6465
@Override
6566
public Response handle(Request request) {
67+
if (unloaded) {
68+
return Response.ofFailure(Code.ILLEGAL_STATE, "the agent is uninstalling");
69+
}
6670
// check necessary arguments
6771
String suid = request.getParam("suid");
6872
if (StringUtil.isBlank(suid)) {
@@ -98,6 +102,11 @@ public Response handle(Request request) {
98102
return handleInjection(suid, model, modelSpec);
99103
}
100104

105+
@Override
106+
public void unload() {
107+
unloaded = true;
108+
}
109+
101110
/**
102111
* Set log level to debug if debug parameter is true
103112
*

chaosblade-exec-service/src/main/java/com/alibaba/chaosblade/exec/service/handler/DefaultDispatchService.java

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.alibaba.chaosblade.exec.service.handler;
1818

19+
import java.util.Map.Entry;
20+
import java.util.Set;
1921
import java.util.concurrent.ConcurrentHashMap;
2022

2123
import com.alibaba.chaosblade.exec.common.transport.Request;
@@ -71,6 +73,10 @@ public void load() {
7173

7274
@Override
7375
public void unload() {
76+
Set<Entry<String, RequestHandler>> entries = handles.entrySet();
77+
for (Entry<String, RequestHandler> entry : entries) {
78+
entry.getValue().unload();
79+
}
7480
handles.clear();
7581
}
7682
}

chaosblade-exec-service/src/main/java/com/alibaba/chaosblade/exec/service/handler/DestroyHandler.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.alibaba.chaosblade.exec.service.handler;
1818

19+
import java.util.Set;
20+
1921
import com.alibaba.chaosblade.exec.common.center.ManagerFactory;
2022
import com.alibaba.chaosblade.exec.common.center.ModelSpecManager;
2123
import com.alibaba.chaosblade.exec.common.center.StatusManager;
@@ -28,11 +30,14 @@
2830
import com.alibaba.chaosblade.exec.common.transport.Response.Code;
2931
import com.alibaba.chaosblade.exec.common.util.StringUtil;
3032

33+
import org.slf4j.Logger;
34+
import org.slf4j.LoggerFactory;
35+
3136
/**
3237
* @author Changjun Xiao
3338
*/
3439
public class DestroyHandler implements RequestHandler {
35-
40+
private static final Logger LOGGER = LoggerFactory.getLogger(DestroyHandler.class);
3641
private ModelSpecManager modelSpecManager;
3742
private StatusManager statusManager;
3843

@@ -52,6 +57,10 @@ public Response handle(Request request) {
5257
if (StringUtil.isBlank(uid)) {
5358
return Response.ofFailure(Code.ILLEGAL_PARAMETER, "less experiment uid");
5459
}
60+
return destroy(uid);
61+
}
62+
63+
private Response destroy(String uid) {
5564
Model model = statusManager.removeExp(uid);
5665

5766
if (model == null) {
@@ -64,11 +73,24 @@ public Response handle(Request request) {
6473
try {
6574
applyPreDestroyInjectionModelHandler(uid, modelSpec, model);
6675
} catch (ExperimentException ex) {
67-
return Response.ofFailure(Response.Code.SERVER_ERROR, ex.getMessage());
76+
return Response.ofFailure(Code.SERVER_ERROR, ex.getMessage());
6877
}
6978
return Response.ofSuccess("success");
7079
}
7180

81+
@Override
82+
public void unload() {
83+
Set<String> uids = statusManager.getAllUids();
84+
for (String uid : uids) {
85+
Response response = destroy(uid);
86+
if (response.isSuccess()) {
87+
LOGGER.debug("destroy {} successfully when unload", uid);
88+
} else {
89+
LOGGER.warn("destroy {} failed because of {} when unload", uid, response.getError());
90+
}
91+
}
92+
}
93+
7294
private void applyPreDestroyInjectionModelHandler(String uid, ModelSpec modelSpec, Model model)
7395
throws ExperimentException {
7496
if (modelSpec instanceof PreDestroyInjectionModelHandler) {

chaosblade-exec-service/src/main/java/com/alibaba/chaosblade/exec/service/handler/RequestHandler.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ public interface RequestHandler {
2626
String getHandlerName();
2727

2828
Response handle(Request paramRequest);
29+
30+
void unload();
2931
}

chaosblade-exec-service/src/main/java/com/alibaba/chaosblade/exec/service/handler/StatusHandler.java

+4
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,8 @@ public Response handle(Request request) {
5151
}
5252
return Response.ofSuccess(String.valueOf(statusMetric.getCount()));
5353
}
54+
55+
@Override
56+
public void unload() {
57+
}
5458
}

0 commit comments

Comments
 (0)