Skip to content

Commit 80797ae

Browse files
CarpenterLeesczyh30
authored andcommitted
Allow negative paramIndex as reversed-order in ParamFlowRule (#549)
* Allow negative paramIndex in ParamFlowRule Signed-off-by: Carpenter Lee <[email protected]>
1 parent d05a603 commit 80797ae

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

sentinel-extension/sentinel-parameter-flow-control/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/param/ParamFlowChecker.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static boolean passCheck(ResourceWrapper resourceWrapper, /*@Valid*/ ParamFlowRu
5252
}
5353

5454
// Get parameter value. If value is null, then pass.
55-
Object value = args[paramIdx];
55+
Object value = valueAt(args, paramIdx);
5656
if (value == null) {
5757
return true;
5858
}
@@ -64,6 +64,18 @@ static boolean passCheck(ResourceWrapper resourceWrapper, /*@Valid*/ ParamFlowRu
6464
return passLocalCheck(resourceWrapper, rule, count, value);
6565
}
6666

67+
private static Object valueAt(Object[] args, int paramIdx) {
68+
Object value = null;
69+
if (paramIdx < 0) {
70+
if (-paramIdx <= args.length) {
71+
return args[args.length + paramIdx];
72+
}
73+
} else {
74+
value = args[paramIdx];
75+
}
76+
return value;
77+
}
78+
6779
private static boolean passLocalCheck(ResourceWrapper resourceWrapper, ParamFlowRule rule, int count,
6880
Object value) {
6981
try {
@@ -112,7 +124,7 @@ static boolean passSingleValueCheck(ResourceWrapper resourceWrapper, ParamFlowRu
112124
int itemThreshold = rule.getParsedHotItems().get(value);
113125
return ++threadCount <= itemThreshold;
114126
}
115-
long threshold = (long) rule.getCount();
127+
long threshold = (long)rule.getCount();
116128
return ++threadCount <= threshold;
117129
}
118130

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public final class ParamFlowRuleUtil {
3131

3232
public static boolean isValidRule(ParamFlowRule rule) {
3333
return rule != null && !StringUtil.isBlank(rule.getResource()) && rule.getCount() >= 0
34-
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && rule.getParamIdx() >= 0 && checkCluster(rule);
34+
&& rule.getGrade() >= 0 && rule.getParamIdx() != null && checkCluster(rule);
3535
}
3636

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

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void testCheckValidHotParamRule() {
3535
.setCount(1)
3636
.setParamIdx(-1);
3737
assertFalse(ParamFlowRuleUtil.isValidRule(rule4));
38-
assertFalse(ParamFlowRuleUtil.isValidRule(rule5));
38+
assertTrue(ParamFlowRuleUtil.isValidRule(rule5));
3939

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

0 commit comments

Comments
 (0)