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

close → open: use `compareAndSet` to update for `cut` attribute (changed to an `AtomicBoolean`)
This commit is contained in:
ATAXGT 2019-03-05 18:45:37 +08:00 committed by Eric Zhao
parent b7956c6bb4
commit 10d7c903cf
1 changed files with 12 additions and 17 deletions

View File

@ -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);
}
}
}