Skip to content

Commit 5c9aca5

Browse files
authored
fix: #434 熔断规则被删除后,不再进行状态机的轮转 (#436)
1 parent 48c7ef2 commit 5c9aca5

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/pojo/HalfOpenStatus.java

-4
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ public HalfOpenStatus(String circuitBreaker, long startTimeMs, int maxRequest) {
4343
this.calledResult = new ArrayList<>(maxRequest * 2);
4444
}
4545

46-
public int getMaxRequest() {
47-
return maxRequest;
48-
}
49-
5046
public boolean report(boolean success) {
5147
synchronized (lock) {
5248
calledResult.add(success);

polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/CircuitBreakerRuleContainer.java

+2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ public void run() {
100100
} else {
101101
ResourceCounters oldCounters = resourceResourceCounters.remove(resource);
102102
if (null != oldCounters) {
103+
LOG.info("start to destroyed counters {} for resource {}", oldCounters.getCurrentActiveRule().getName(), resource);
103104
// remove the old health check scheduler
105+
oldCounters.setDestroyed(true);
104106
scheduleHealthCheck();
105107
}
106108
}

polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite/ResourceCounters.java

+23
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.util.Objects;
6161
import java.util.concurrent.ScheduledExecutorService;
6262
import java.util.concurrent.TimeUnit;
63+
import java.util.concurrent.atomic.AtomicBoolean;
6364
import java.util.concurrent.atomic.AtomicReference;
6465
import java.util.function.Function;
6566
import java.util.regex.Pattern;
@@ -87,6 +88,8 @@ public class ResourceCounters implements StatusChangeHandler {
8788

8889
private Extensions extensions;
8990

91+
private final AtomicBoolean destroyed = new AtomicBoolean(false);
92+
9093
public ResourceCounters(Resource resource, CircuitBreakerRule currentActiveRule,
9194
ScheduledExecutorService stateChangeExecutors, PolarisCircuitBreaker polarisCircuitBreaker) {
9295
this.currentActiveRule = currentActiveRule;
@@ -158,6 +161,10 @@ public CircuitBreakerRule getCurrentActiveRule() {
158161
@Override
159162
public void closeToOpen(String circuitBreaker) {
160163
synchronized (this) {
164+
if (destroyed.get()) {
165+
LOG.info("counters {} for resource {} is destroyed, closeToOpen skipped", currentActiveRule.getName(), resource);
166+
return;
167+
}
161168
CircuitBreakerStatus circuitBreakerStatus = circuitBreakerStatusReference.get();
162169
if (circuitBreakerStatus.getStatus() == Status.CLOSE) {
163170
toOpen(circuitBreakerStatus, circuitBreaker);
@@ -185,6 +192,10 @@ public void run() {
185192
@Override
186193
public void openToHalfOpen() {
187194
synchronized (this) {
195+
if (destroyed.get()) {
196+
LOG.info("counters {} for resource {} is destroyed, openToHalfOpen skipped", currentActiveRule.getName(), resource);
197+
return;
198+
}
188199
CircuitBreakerStatus circuitBreakerStatus = circuitBreakerStatusReference.get();
189200
if (circuitBreakerStatus.getStatus() != Status.OPEN) {
190201
return;
@@ -203,6 +214,10 @@ public void openToHalfOpen() {
203214
@Override
204215
public void halfOpenToClose() {
205216
synchronized (this) {
217+
if (destroyed.get()) {
218+
LOG.info("counters {} for resource {} is destroyed, halfOpenToClose skipped", currentActiveRule.getName(), resource);
219+
return;
220+
}
206221
CircuitBreakerStatus circuitBreakerStatus = circuitBreakerStatusReference.get();
207222
if (circuitBreakerStatus.getStatus() == Status.HALF_OPEN) {
208223
CircuitBreakerStatus newStatus = new CircuitBreakerStatus(circuitBreakerStatus.getCircuitBreaker(),
@@ -222,6 +237,10 @@ public void halfOpenToClose() {
222237
@Override
223238
public void halfOpenToOpen() {
224239
synchronized (this) {
240+
if (destroyed.get()) {
241+
LOG.info("counters {} for resource {} is destroyed, halfOpenToOpen skipped", currentActiveRule.getName(), resource);
242+
return;
243+
}
225244
CircuitBreakerStatus circuitBreakerStatus = circuitBreakerStatusReference.get();
226245
if (circuitBreakerStatus.getStatus() == Status.HALF_OPEN) {
227246
toOpen(circuitBreakerStatus, circuitBreakerStatus.getCircuitBreaker());
@@ -345,4 +364,8 @@ public void reportCircuitStatus() {
345364
}
346365
}
347366
}
367+
368+
public void setDestroyed(boolean value) {
369+
destroyed.set(value);
370+
}
348371
}

polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/test/java/com/tencent/polaris/plugins/circuitbraker/composite/trigger/ResourceCountersTest.java

+23
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,27 @@ public void testParseStatus() {
142142
Assert.assertEquals(RetStatus.RetSuccess, nextStatus);
143143
}
144144

145+
@Test
146+
public void testDestroy() {
147+
CircuitBreakerRule.Builder builder = CircuitBreakerRule.newBuilder();
148+
builder.setName("test_cb_rule");
149+
builder.setEnable(true);
150+
builder.setLevel(Level.METHOD);
151+
builder.addErrorConditions(ErrorCondition.newBuilder().setCondition(MatchString.newBuilder().setValue(
152+
StringValue.newBuilder().setValue("500").build())).build());
153+
builder.addTriggerCondition(
154+
TriggerCondition.newBuilder().setTriggerType(TriggerType.CONSECUTIVE_ERROR).setErrorCount(5).build());
155+
builder.setRecoverCondition(RecoverCondition.newBuilder().setConsecutiveSuccess(1).setSleepWindow(5).build());
156+
Resource resource = new MethodResource(new ServiceKey("test", "TestSvc"), "foo");
157+
ResourceCounters resourceCounters = new ResourceCounters(resource, builder.build(), null, null);
158+
resourceCounters.setDestroyed(true);
159+
resourceCounters.report(new ResourceStat(resource, 500, 1000));
160+
resourceCounters.closeToOpen("cb_rule_status");
161+
resourceCounters.openToHalfOpen();
162+
resourceCounters.halfOpenToClose();
163+
resourceCounters.halfOpenToOpen();
164+
Assert.assertEquals(Status.CLOSE, resourceCounters.getCircuitBreakerStatus().getStatus());
165+
}
166+
167+
145168
}

0 commit comments

Comments
 (0)