Skip to content

Commit 6f04521

Browse files
authored
fix: 熔断插件中,事件回调线程与业务线程出现死锁问题 (#553)
1 parent 6fbbb71 commit 6f04521

File tree

1 file changed

+31
-37
lines changed
  • polaris-plugins/polaris-plugins-circuitbreaker/circuitbreaker-composite/src/main/java/com/tencent/polaris/plugins/circuitbreaker/composite

1 file changed

+31
-37
lines changed

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

+31-37
Original file line numberDiff line numberDiff line change
@@ -479,40 +479,36 @@ public String getName() {
479479

480480
void onCircuitBreakerRuleChanged(ServiceKey serviceKey) {
481481
circuitBreakerRuleDictionary.onServiceChanged(serviceKey);
482-
synchronized (countersCache) {
483-
LOG.info("onCircuitBreakerRuleChanged: clear service {} from ResourceCounters", serviceKey);
484-
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
485-
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
486-
for (Resource resource : cacheValue.asMap().keySet()) {
487-
if (Objects.equals(resource.getService(), serviceKey)) {
488-
cacheValue.invalidate(resource);
489-
}
482+
LOG.info("onCircuitBreakerRuleChanged: clear service {} from ResourceCounters", serviceKey);
483+
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
484+
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
485+
for (Resource resource : cacheValue.asMap().keySet()) {
486+
if (Objects.equals(resource.getService(), serviceKey)) {
487+
cacheValue.invalidate(resource);
490488
}
491489
}
492-
HealthCheckContainer healthCheckContainer = healthCheckCache.get(serviceKey);
493-
if (null != healthCheckContainer) {
494-
for (Map.Entry<Resource, ResourceWrap> entry : resourceMapping.entrySet()) {
495-
Resource resource = entry.getKey();
496-
if (Objects.equals(resource.getService(), serviceKey)) {
497-
LOG.info("onCircuitBreakerRuleChanged: clear resource {} from healthCheckContainer", resource);
498-
healthCheckContainer.removeResource(resource);
499-
}
490+
}
491+
HealthCheckContainer healthCheckContainer = healthCheckCache.get(serviceKey);
492+
if (null != healthCheckContainer) {
493+
for (Map.Entry<Resource, ResourceWrap> entry : resourceMapping.entrySet()) {
494+
Resource resource = entry.getKey();
495+
if (Objects.equals(resource.getService(), serviceKey)) {
496+
LOG.info("onCircuitBreakerRuleChanged: clear resource {} from healthCheckContainer", resource);
497+
healthCheckContainer.removeResource(resource);
500498
}
501499
}
502500
}
503501
}
504502

505503
void onCircuitBreakerRuleAdded(ServiceKey serviceKey) {
506504
circuitBreakerRuleDictionary.onServiceChanged(serviceKey);
507-
synchronized (countersCache) {
508-
LOG.info("onCircuitBreakerRuleChanged: clear service {} from ResourceCounters", serviceKey);
509-
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
510-
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
511-
for (Map.Entry<Resource, Optional<ResourceCounters>> entryCache: cacheValue.asMap().entrySet()) {
512-
Resource resource = entryCache.getKey();
513-
if (Objects.equals(resource.getService(), serviceKey) && !entryCache.getValue().isPresent()) {
514-
cacheValue.invalidate(resource);
515-
}
505+
LOG.info("onCircuitBreakerRuleAdded: clear service {} from ResourceCounters", serviceKey);
506+
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
507+
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
508+
for (Map.Entry<Resource, Optional<ResourceCounters>> entryCache: cacheValue.asMap().entrySet()) {
509+
Resource resource = entryCache.getKey();
510+
if (Objects.equals(resource.getService(), serviceKey) && !entryCache.getValue().isPresent()) {
511+
cacheValue.invalidate(resource);
516512
}
517513
}
518514
}
@@ -533,19 +529,17 @@ public HealthCheckContainer apply(ServiceKey serviceKey, HealthCheckContainer he
533529
return null;
534530
}
535531
});
536-
synchronized (countersCache) {
537-
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
538-
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
539-
for (Map.Entry<Resource, Optional<ResourceCounters>> entryCache : cacheValue.asMap().entrySet()) {
540-
Resource resource = entryCache.getKey();
541-
if (Objects.equals(resource.getService(), svcKey)) {
542-
if (entryCache.getValue().isPresent()) {
543-
LOG.info("onFaultDetectRuleChanged: ResourceCounters {} setReloadFaultDetect true", svcKey);
544-
ResourceCounters resourceCounters = entryCache.getValue().get();
545-
resourceCounters.setReloadFaultDetect(true);
546-
}
547-
532+
for (Map.Entry<Level, Cache<Resource, Optional<ResourceCounters>>> entry : countersCache.entrySet()) {
533+
Cache<Resource, Optional<ResourceCounters>> cacheValue = entry.getValue();
534+
for (Map.Entry<Resource, Optional<ResourceCounters>> entryCache : cacheValue.asMap().entrySet()) {
535+
Resource resource = entryCache.getKey();
536+
if (Objects.equals(resource.getService(), svcKey)) {
537+
if (entryCache.getValue().isPresent()) {
538+
LOG.info("onFaultDetectRuleChanged: ResourceCounters {} setReloadFaultDetect true", svcKey);
539+
ResourceCounters resourceCounters = entryCache.getValue().get();
540+
resourceCounters.setReloadFaultDetect(true);
548541
}
542+
549543
}
550544
}
551545
}

0 commit comments

Comments
 (0)