Bladeren bron

fix(rule): nil check for state change by error

Signed-off-by: Jiyong Huang <huangjy@emqx.io>
Jiyong Huang 2 jaren geleden
bovenliggende
commit
b7dc96b48e
2 gewijzigde bestanden met toevoegingen van 10 en 4 verwijderingen
  1. 3 1
      internal/topo/rule/ruleState.go
  2. 7 3
      internal/topo/rule/ruleState_test.go

+ 3 - 1
internal/topo/rule/ruleState.go

@@ -200,7 +200,9 @@ func (rs *RuleState) runTopo(ctx context.Context) {
 		rs.Lock()
 		rs.Lock()
 		// The only change the state by error
 		// The only change the state by error
 		rs.triggered = 0
 		rs.triggered = 0
-		rs.topoGraph = rs.Topology.GetTopo()
+		if rs.Topology != nil {
+			rs.topoGraph = rs.Topology.GetTopo()
+		}
 		rs.Topology = nil
 		rs.Topology = nil
 		rs.Unlock()
 		rs.Unlock()
 	}
 	}

+ 7 - 3
internal/topo/rule/ruleState_test.go

@@ -21,8 +21,8 @@ import (
 	"github.com/lf-edge/ekuiper/internal/testx"
 	"github.com/lf-edge/ekuiper/internal/testx"
 	"github.com/lf-edge/ekuiper/pkg/api"
 	"github.com/lf-edge/ekuiper/pkg/api"
 	"reflect"
 	"reflect"
+	"sync"
 	"testing"
 	"testing"
-	"time"
 )
 )
 
 
 var defaultOption = &api.RuleOption{
 var defaultOption = &api.RuleOption{
@@ -210,22 +210,26 @@ func TestMultipleAccess(t *testing.T) {
 		t.Error(err)
 		t.Error(err)
 		return
 		return
 	}
 	}
+	var wg sync.WaitGroup
+	wg.Add(10)
 	for i := 0; i < 10; i++ {
 	for i := 0; i < 10; i++ {
 		if i%3 == 0 {
 		if i%3 == 0 {
 			go func(i int) {
 			go func(i int) {
 				rs.Stop()
 				rs.Stop()
 				fmt.Printf("%d:%d\n", i, rs.triggered)
 				fmt.Printf("%d:%d\n", i, rs.triggered)
+				wg.Done()
 			}(i)
 			}(i)
 		} else {
 		} else {
 			go func(i int) {
 			go func(i int) {
 				rs.Start()
 				rs.Start()
 				fmt.Printf("%d:%d\n", i, rs.triggered)
 				fmt.Printf("%d:%d\n", i, rs.triggered)
+				wg.Done()
 			}(i)
 			}(i)
 		}
 		}
 	}
 	}
-	time.Sleep(1 * time.Millisecond)
+	wg.Wait()
 	rs.Start()
 	rs.Start()
-	time.Sleep(10 * time.Millisecond)
+	fmt.Printf("%d:%d\n", 10, rs.triggered)
 	if rs.triggered != 1 {
 	if rs.triggered != 1 {
 		t.Errorf("triggered mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", 1, rs.triggered)
 		t.Errorf("triggered mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", 1, rs.triggered)
 	}
 	}