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:
parent
b7956c6bb4
commit
10d7c903cf
|
|
@ -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…
Reference in New Issue