Bläddra i källkod

fix(rule): rule start/stop should always send signal regardless of the current state

Signed-off-by: Jiyong Huang <huangjy@emqx.io>
Jiyong Huang 2 år sedan
förälder
incheckning
f194b6b8e5
2 ändrade filer med 21 tillägg och 28 borttagningar
  1. 20 27
      internal/topo/rule/ruleState.go
  2. 1 1
      test/change_rule_status.jmx

+ 20 - 27
internal/topo/rule/ruleState.go

@@ -169,7 +169,7 @@ func (rs *RuleState) runTopo(ctx context.Context) {
 					return nil
 				}
 			}
-			if count <= option.Attempts {
+			if count < option.Attempts {
 				if d > option.MaxDelay {
 					d = option.MaxDelay
 				}
@@ -211,42 +211,35 @@ func (rs *RuleState) runTopo(ctx context.Context) {
 func (rs *RuleState) Start() error {
 	rs.Lock()
 	defer rs.Unlock()
-	switch rs.triggered {
-	case 1:
-		return fmt.Errorf("Rule %s is already starting", rs.RuleId)
-	case -1:
-		return fmt.Errorf("Rule %s is already deleted", rs.RuleId)
-	default:
-		// Start from stop
-		if rs.Topology == nil {
-			if tp, err := planner.Plan(rs.Rule); err != nil {
-				return err
-			} else {
-				rs.Topology = tp
-			}
-		} // else start after create
-		rs.triggered = 1
-		rs.ActionCh <- ActionSignalStart
-		return nil
+	if rs.triggered == -1 {
+		return fmt.Errorf("rule %s is already deleted", rs.RuleId)
 	}
+	if rs.Topology == nil {
+		if tp, err := planner.Plan(rs.Rule); err != nil {
+			return err
+		} else {
+			rs.Topology = tp
+		}
+	} // else start after create
+	rs.triggered = 1
+	rs.ActionCh <- ActionSignalStart
+	return nil
 }
 
 // Stop remove the Topology
 func (rs *RuleState) Stop() error {
 	rs.Lock()
 	defer rs.Unlock()
-	switch rs.triggered {
-	case 0:
-		return fmt.Errorf("Rule %s is already stopping", rs.RuleId)
-	case -1:
-		return fmt.Errorf("Rule %s is already deleted", rs.RuleId)
-	default:
-		rs.triggered = 0
+	if rs.triggered == -1 {
+		return fmt.Errorf("rule %s is already deleted", rs.RuleId)
+	}
+	rs.triggered = 0
+	if rs.Topology != nil {
 		rs.Topology.Cancel()
 		rs.Topology = nil
-		rs.ActionCh <- ActionSignalStop
-		return nil
 	}
+	rs.ActionCh <- ActionSignalStop
+	return nil
 }
 
 func (rs *RuleState) Close() error {

+ 1 - 1
test/change_rule_status.jmx

@@ -241,7 +241,7 @@
           <hashTree>
             <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
               <collectionProp name="Asserion.test_strings">
-                <stringProp name="-652969125">Rule rule1 is already starting</stringProp>
+                <stringProp name="-652969125">Rule rule1 was started</stringProp>
               </collectionProp>
               <stringProp name="Assertion.custom_message"></stringProp>
               <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>