瀏覽代碼

Optimize circuit breaking state transformation using CAS in DegradeRule (#538)

close → open: use `compareAndSet` to update for `cut` attribute (changed to an `AtomicBoolean`)
master
ATAXGT Eric Zhao 6 年之前
父節點
當前提交
10d7c903cf
共有 1 個文件被更改,包括 12 次插入17 次删除
  1. +12
    -17
      sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java

+ 12
- 17
sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java 查看文件

@@ -18,6 +18,7 @@ package com.alibaba.csp.sentinel.slots.block.degrade;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;

import com.alibaba.csp.sentinel.concurrent.NamedThreadFactory;
@@ -80,7 +81,7 @@ public class DegradeRule extends AbstractRule {
*/
private int grade = RuleConstant.DEGRADE_GRADE_RT;

private volatile boolean cut = false;
private final AtomicBoolean cut = new AtomicBoolean(false);

public int getGrade() {
return grade;
@@ -93,8 +94,6 @@ public class DegradeRule extends AbstractRule {

private AtomicLong passCount = new AtomicLong(0);

private final Object lock = new Object();

public double getCount() {
return count;
}
@@ -104,12 +103,12 @@ public class DegradeRule extends AbstractRule {
return this;
}

public boolean isCut() {
return cut;
private boolean isCut() {
return cut.get();
}

private void setCut(boolean cut) {
this.cut = cut;
this.cut.set(cut);
}

public AtomicLong getPassCount() {
@@ -162,7 +161,7 @@ public class DegradeRule extends AbstractRule {

@Override
public boolean passCheck(Context context, DefaultNode node, int acquireCount, Object... args) {
if (cut) {
if (cut.get()) {
return false;
}

@@ -206,16 +205,12 @@ public class DegradeRule extends AbstractRule {
}
}

synchronized (lock) {
if (!cut) {
// Automatically degrade.
cut = true;
ResetTask resetTask = new ResetTask(this);
pool.schedule(resetTask, timeWindow, TimeUnit.SECONDS);
}

return false;
if (cut.compareAndSet(false, true)) {
ResetTask resetTask = new ResetTask(this);
pool.schedule(resetTask, timeWindow, TimeUnit.SECONDS);
}

return false;
}

@Override
@@ -240,7 +235,7 @@ public class DegradeRule extends AbstractRule {
@Override
public void run() {
rule.getPassCount().set(0);
rule.setCut(false);
rule.cut.set(false);
}
}
}


Loading…
取消
儲存