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