瀏覽代碼

fix(rule): handle crash when call createState

Signed-off-by: Jianxiang Ran <rxan_embedded@163.com>
Signed-off-by: Jiyong Huang <huangjy@emqx.io>
Jianxiang Ran 1 年之前
父節點
當前提交
539a55609a
共有 1 個文件被更改,包括 17 次插入6 次删除
  1. 17 6
      internal/server/rule_manager.go

+ 17 - 6
internal/server/rule_manager.go

@@ -70,6 +70,9 @@ func (rr *RuleRegistry) Delete(key string) (*rule.RuleState, bool) {
 }
 
 func createRule(name, ruleJson string) (string, error) {
+	var rs *rule.RuleState = nil
+	var err error = nil
+
 	// Validate the rule json
 	r, err := ruleProcessor.GetRuleByJson(name, ruleJson)
 	if err != nil {
@@ -82,14 +85,16 @@ func createRule(name, ruleJson string) (string, error) {
 	}
 
 	// Validate the topo
-	rs, err := createRuleState(r)
-	if err != nil {
+	panicOrError := infra.SafeRun(func() error {
+		rs, err = createRuleState(r)
+		return err
+	})
+	if panicOrError != nil {
 		// Do not store to registry so also delete the KV
 		deleteRule(r.Id)
 		_, _ = ruleProcessor.ExecDrop(r.Id)
-		return r.Id, fmt.Errorf("create rule topo error: %v", err)
+		return r.Id, fmt.Errorf("create rule topo error: %v", panicOrError)
 	}
-
 	// Start the rule asyncly
 	if r.Triggered {
 		go func() {
@@ -118,9 +123,15 @@ func createRuleState(r *api.Rule) (*rule.RuleState, error) {
 }
 
 func recoverRule(r *api.Rule) string {
+	var rs *rule.RuleState = nil
+	var err error = nil
 	// Validate the topo
-	rs, err := createRuleState(r)
-	if err != nil { // when recovering rules, assume the rules are valid, so always add it to the registry
+	panicOrError := infra.SafeRun(func() error {
+		rs, err = createRuleState(r)
+		return err
+	})
+
+	if panicOrError != nil { // when recovering rules, assume the rules are valid, so always add it to the registry
 		conf.Log.Errorf("Create rule topo error: %v", err)
 		r.Triggered = false
 		registry.Store(r.Id, rs)