瀏覽代碼

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.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;


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


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


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


private AtomicLong passCount = new AtomicLong(0); private AtomicLong passCount = new AtomicLong(0);


private final Object lock = new Object();

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


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


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


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


@Override @Override
public boolean passCheck(Context context, DefaultNode node, int acquireCount, Object... args) { public boolean passCheck(Context context, DefaultNode node, int acquireCount, Object... args) {
if (cut) {
if (cut.get()) {
return false; 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 @Override
@@ -240,7 +235,7 @@ public class DegradeRule extends AbstractRule {
@Override @Override
public void run() { public void run() {
rule.getPassCount().set(0); rule.getPassCount().set(0);
rule.setCut(false);
rule.cut.set(false);
} }
} }
} }


Loading…
取消
儲存