Skip to content

Commit 317a941

Browse files
fix:fix circuit breaker rule wrong update when using tsf consul. (#586)
1 parent bd069d2 commit 317a941

File tree

3 files changed

+62
-13
lines changed

3 files changed

+62
-13
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ private ResourceCounters getOrInitResourceCounters(Resource resource) throws Exe
149149
Resource ruleResource = getActualResource(resource, false);
150150
Optional<ResourceCounters> resourceCounters = getResourceCounters(ruleResource);
151151
boolean reloadFaultDetect = false;
152+
/*
153+
这里不判断!resourceCounters.isPresent(),因为在初始化的时候,
154+
如果没有对应的资源,就会生成Optional.empty进行资源占位,防止每次请求都去后端获取熔断规则。
155+
如果有对应的资源,但是没有熔断规则,也会生成Optional.empty进行资源占位。如果后续新增熔断规则,会等到资源过期清理后,再创建熔断器。
156+
如果有对应的资源,且有熔断规则,就会正常获取到熔断器。
157+
*/
152158
if (null == resourceCounters) {
153159
synchronized (countersCache) {
154160
resourceCounters = getResourceCounters(ruleResource);

polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/authority/AuthorityService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import com.fasterxml.jackson.core.type.TypeReference;
2626
import com.fasterxml.jackson.databind.ObjectMapper;
2727
import com.google.common.collect.Lists;
28-
import com.google.gson.Gson;
29-
import com.google.gson.GsonBuilder;
3028
import com.google.protobuf.StringValue;
3129
import com.google.protobuf.UInt32Value;
3230
import com.tencent.polaris.api.exception.ErrorCode;
@@ -70,8 +68,6 @@ public class AuthorityService extends ConsulService {
7068

7169
private static final Logger LOG = LoggerFactory.getLogger(AuthorityService.class);
7270

73-
private final Gson gson = new GsonBuilder().disableHtmlEscaping().create();
74-
7571
private final Map<AuthorityKey, Long> authorityConsulIndexMap = new ConcurrentHashMap<>();
7672

7773
public AuthorityService(ConsulClient consulClient, ConsulRawClient consulRawClient, ConsulContext consulContext,

polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/circuitbreaker/CircuitBreakingService.java

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class CircuitBreakingService extends ConsulService {
6666

6767
private static final Logger LOG = LoggerFactory.getLogger(CircuitBreakingService.class);
6868

69-
private final Map<CircuitBreakingKey, Long> circuitBreakingConsulIndexMap = new ConcurrentHashMap<>();
69+
private final Map<CircuitBreakingKey, CircuitBreakingValue> circuitBreakingConsulIndexMap = new ConcurrentHashMap<>();
7070

7171
public CircuitBreakingService(ConsulClient consulClient, ConsulRawClient consulRawClient, ConsulContext consulContext,
7272
String threadName, ObjectMapper mapper) {
@@ -83,6 +83,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
8383
circuitBreakingKey.setNamespace(namespace);
8484
circuitBreakingKey.setService(service);
8585
Long currentIndex = getCircuitBreakingConsulIndex(circuitBreakingKey);
86+
CircuitBreakingValue currentCircuitBreakingValue = getCircuitBreakingValue(circuitBreakingKey);
8687
QueryParams queryParams = new QueryParams(consulContext.getWaitTime(), currentIndex);
8788
int code = ServerCodes.DATA_NO_CHANGE;
8889
try {
@@ -100,6 +101,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
100101
}
101102

102103
Long newIndex = response.getConsulIndex();
104+
boolean is404 = false;
103105
// create service.
104106
ServiceProto.Service.Builder newServiceBuilder = ServiceProto.Service.newBuilder();
105107
newServiceBuilder.setNamespace(StringValue.of(namespace));
@@ -130,9 +132,16 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
130132
}
131133
}
132134
} else {
135+
if (currentCircuitBreakingValue != null && currentCircuitBreakingValue.isLast404) {
136+
code = ServerCodes.DATA_NO_CHANGE;
137+
}
138+
is404 = true;
133139
LOG.info("empty circuit breaker rule: {}", response);
134140
}
135141
} else {
142+
if (currentCircuitBreakingValue != null && currentCircuitBreakingValue.isLast404) {
143+
is404 = true;
144+
}
136145
LOG.debug("[TSF CIRCUIT BREAKER] Consul data is not changed");
137146
}
138147
} else {
@@ -146,7 +155,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
146155
ServerEvent serverEvent = new ServerEvent(serviceUpdateTask.getServiceEventKey(), newDiscoverResponseBuilder.build(), null, SERVER_CONNECTOR_CONSUL);
147156
boolean svcDeleted = serviceUpdateTask.notifyServerEvent(serverEvent);
148157
if (newIndex != null) {
149-
setCircuitBreakingConsulIndex(circuitBreakingKey, currentIndex, newIndex);
158+
setCircuitBreakingConsulIndex(circuitBreakingKey, currentIndex, newIndex, is404);
150159
}
151160
if (!svcDeleted) {
152161
serviceUpdateTask.addUpdateTaskSet();
@@ -244,17 +253,21 @@ private List<CircuitBreakerProto.CircuitBreakerRule> parseResponse(String decode
244253
}
245254

246255
private Long getCircuitBreakingConsulIndex(CircuitBreakingKey circuitBreakingKey) {
247-
Long index = circuitBreakingConsulIndexMap.get(circuitBreakingKey);
248-
if (index != null) {
249-
return index;
256+
CircuitBreakingValue circuitBreakingValue = circuitBreakingConsulIndexMap.get(circuitBreakingKey);
257+
if (circuitBreakingValue != null && circuitBreakingValue.getIndex() != null) {
258+
return circuitBreakingValue.getIndex();
250259
}
251-
setCircuitBreakingConsulIndex(circuitBreakingKey, null, -1L);
260+
setCircuitBreakingConsulIndex(circuitBreakingKey, null, -1L, false);
252261
return -1L;
253262
}
254263

255-
private void setCircuitBreakingConsulIndex(CircuitBreakingKey circuitBreakingKey, Long lastIndex, Long newIndex) {
256-
LOG.debug("CircuitBreakingKey: {}; lastIndex: {}; newIndex: {}", circuitBreakingKey, lastIndex, newIndex);
257-
circuitBreakingConsulIndexMap.put(circuitBreakingKey, newIndex);
264+
private CircuitBreakingValue getCircuitBreakingValue(CircuitBreakingKey circuitBreakingKey) {
265+
return circuitBreakingConsulIndexMap.get(circuitBreakingKey);
266+
}
267+
268+
private void setCircuitBreakingConsulIndex(CircuitBreakingKey circuitBreakingKey, Long lastIndex, Long newIndex, Boolean is404) {
269+
LOG.debug("CircuitBreakingKey: {}; lastIndex: {}; newIndex: {}, is404: {}", circuitBreakingKey, lastIndex, newIndex, is404);
270+
circuitBreakingConsulIndexMap.put(circuitBreakingKey, new CircuitBreakingValue(newIndex, is404));
258271
}
259272

260273
static class CircuitBreakingKey {
@@ -309,6 +322,40 @@ public String toString() {
309322
}
310323
}
311324

325+
static class CircuitBreakingValue {
326+
private Long index;
327+
private Boolean isLast404 = false;
328+
329+
public CircuitBreakingValue(Long index, Boolean isLast404) {
330+
this.index = index;
331+
this.isLast404 = isLast404;
332+
}
333+
334+
public Long getIndex() {
335+
return index;
336+
}
337+
338+
public void setIndex(Long index) {
339+
this.index = index;
340+
}
341+
342+
public Boolean getLast404() {
343+
return isLast404;
344+
}
345+
346+
public void setLast404(Boolean last404) {
347+
isLast404 = last404;
348+
}
349+
350+
@Override
351+
public String toString() {
352+
return "CircuitBreakingValue{" +
353+
"index=" + index +
354+
", isLast404=" + isLast404 +
355+
'}';
356+
}
357+
}
358+
312359
private CircuitBreakerProto.Level parseLevel(TsfCircuitBreakerIsolationLevelEnum isolationLevel) {
313360
switch (isolationLevel) {
314361
case INSTANCE:

0 commit comments

Comments
 (0)