Browse Source

Allow negative paramIndex as reversed-order in ParamFlowRule (#549)

* Allow negative paramIndex in ParamFlowRule

Signed-off-by: Carpenter Lee <hooleeucas@163.com>
master
Carpenter Lee Eric Zhao 5 years ago
parent
commit
80797ae85e
3 changed files with 16 additions and 4 deletions
  1. +14
    -2
      sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowChecker.java
  2. +1
    -1
      sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleUtil.java
  3. +1
    -1
      sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleUtilTest.java

+ 14
- 2
sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowChecker.java View File

@@ -52,7 +52,7 @@ final class ParamFlowChecker {
} }


// Get parameter value. If value is null, then pass. // Get parameter value. If value is null, then pass.
Object value = args[paramIdx];
Object value = valueAt(args, paramIdx);
if (value == null) { if (value == null) {
return true; return true;
} }
@@ -64,6 +64,18 @@ final class ParamFlowChecker {
return passLocalCheck(resourceWrapper, rule, count, value); return passLocalCheck(resourceWrapper, rule, count, value);
} }


private static Object valueAt(Object[] args, int paramIdx) {
Object value = null;
if (paramIdx < 0) {
if (-paramIdx <= args.length) {
return args[args.length + paramIdx];
}
} else {
value = args[paramIdx];
}
return value;
}

private static boolean passLocalCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int count, private static boolean passLocalCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int count,
Object value) { Object value) {
try { try {
@@ -112,7 +124,7 @@ final class ParamFlowChecker {
int itemThreshold = rule.getParsedHotItems().get(value); int itemThreshold = rule.getParsedHotItems().get(value);
return ++threadCount <= itemThreshold; return ++threadCount <= itemThreshold;
} }
long threshold = (long) rule.getCount();
long threshold = (long)rule.getCount();
return ++threadCount <= threshold; return ++threadCount <= threshold;
} }




+ 1
- 1
sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleUtil.java View File

@@ -31,7 +31,7 @@ public final class ParamFlowRuleUtil {


public static boolean isValidRule(ParamFlowRule rule) { public static boolean isValidRule(ParamFlowRule rule) {
return rule != null && !StringUtil.isBlank(rule.getResource()) && rule.getCount() >= 0 return rule != null && !StringUtil.isBlank(rule.getResource()) && rule.getCount() >= 0
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && rule.getParamIdx() >= 0 && checkCluster(rule);
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && checkCluster(rule);
} }


private static boolean checkCluster(/*@PreChecked*/ ParamFlowRule rule) { private static boolean checkCluster(/*@PreChecked*/ ParamFlowRule rule) {


+ 1
- 1
sentinel-extension/sentinel-parameter-flow-control/src/test/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowRuleUtilTest.java View File

@@ -35,7 +35,7 @@ public class ParamFlowRuleUtilTest {
.setCount(1) .setCount(1)
.setParamIdx(-1); .setParamIdx(-1);
assertFalse(ParamFlowRuleUtil.isValidRule(rule4)); assertFalse(ParamFlowRuleUtil.isValidRule(rule4));
assertFalse(ParamFlowRuleUtil.isValidRule(rule5));
assertTrue(ParamFlowRuleUtil.isValidRule(rule5));


ParamFlowRule goodRule = new ParamFlowRule("abc") ParamFlowRule goodRule = new ParamFlowRule("abc")
.setCount(10) .setCount(10)


Loading…
Cancel
Save