Browse Source

functional-tester: move checker logic to cluster

I move the checker logic from tester to cluster so that stressers and checkers can be initialized at the same time.
this is useful because some checker depends on stressers.
fanmin shi 9 years ago
parent
commit
7d86d1050e

+ 13 - 9
tools/functional-tester/etcd-tester/checks.go

@@ -24,14 +24,18 @@ type Checker interface {
 	Check() error
 	Check() error
 }
 }
 
 
+type hashAndRevGetter interface {
+	getRevisionHash() (revs map[string]int64, hashes map[string]int64, err error)
+}
+
 type hashChecker struct {
 type hashChecker struct {
-	tt *tester
+	hrg hashAndRevGetter
 }
 }
 
 
-func newHashChecker(tt *tester) Checker { return &hashChecker{tt} }
+func newHashChecker(hrg hashAndRevGetter) Checker { return &hashChecker{hrg} }
 
 
 func (hc *hashChecker) Check() (err error) {
 func (hc *hashChecker) Check() (err error) {
-	plog.Printf("%s fetching current revisions...", hc.tt.logPrefix())
+	plog.Printf("fetching current revisions...")
 	var (
 	var (
 		revs   map[string]int64
 		revs   map[string]int64
 		hashes map[string]int64
 		hashes map[string]int64
@@ -40,28 +44,28 @@ func (hc *hashChecker) Check() (err error) {
 	for i := 0; i < 7; i++ {
 	for i := 0; i < 7; i++ {
 		time.Sleep(time.Second)
 		time.Sleep(time.Second)
 
 
-		revs, hashes, err = hc.tt.cluster.getRevisionHash()
+		revs, hashes, err = hc.hrg.getRevisionHash()
 		if err != nil {
 		if err != nil {
-			plog.Printf("%s #%d failed to get current revisions (%v)", hc.tt.logPrefix(), i, err)
+			plog.Printf("#%d failed to get current revisions (%v)", i, err)
 			continue
 			continue
 		}
 		}
 		if _, ok = getSameValue(revs); ok {
 		if _, ok = getSameValue(revs); ok {
 			break
 			break
 		}
 		}
 
 
-		plog.Printf("%s #%d inconsistent current revisions %+v", hc.tt.logPrefix(), i, revs)
+		plog.Printf("#%d inconsistent current revisions %+v", i, revs)
 	}
 	}
 	if !ok || err != nil {
 	if !ok || err != nil {
 		return fmt.Errorf("checking current revisions failed [err: %v, revisions: %v]", err, revs)
 		return fmt.Errorf("checking current revisions failed [err: %v, revisions: %v]", err, revs)
 	}
 	}
-	plog.Printf("%s all members are consistent with current revisions [revisions: %v]", hc.tt.logPrefix(), revs)
+	plog.Printf("all members are consistent with current revisions [revisions: %v]", revs)
 
 
-	plog.Printf("%s checking current storage hashes...", hc.tt.logPrefix())
+	plog.Printf("checking current storage hashes...")
 	if _, ok = getSameValue(hashes); !ok {
 	if _, ok = getSameValue(hashes); !ok {
 		return fmt.Errorf("inconsistent hashes [%v]", hashes)
 		return fmt.Errorf("inconsistent hashes [%v]", hashes)
 	}
 	}
 
 
-	plog.Printf("%s all members are consistent with storage hashes", hc.tt.logPrefix())
+	plog.Printf("all members are consistent with storage hashes")
 	return nil
 	return nil
 }
 }
 
 

+ 12 - 10
tools/functional-tester/etcd-tester/cluster.go

@@ -41,19 +41,15 @@ type agentConfig struct {
 type cluster struct {
 type cluster struct {
 	agents []agentConfig
 	agents []agentConfig
 
 
-	v2Only bool // to be deprecated
+	v2Only           bool // to be deprecated
+	consistencyCheck bool
+	Size             int
 
 
-	stressQPS            int
-	stressKeyLargeSize   int
-	stressKeySize        int
-	stressKeySuffixRange int
-
-	Size      int
-	Stressers []Stresser
+	Stressers     []Stresser
+	stressBuilder stressBuilder
+	Checker       Checker
 
 
 	Members []*member
 	Members []*member
-
-	stressBuilder stressBuilder
 }
 }
 
 
 type ClusterStatus struct {
 type ClusterStatus struct {
@@ -109,6 +105,12 @@ func (c *cluster) bootstrap() error {
 		go c.Stressers[i].Stress()
 		go c.Stressers[i].Stress()
 	}
 	}
 
 
+	if c.consistencyCheck && !c.v2Only {
+		c.Checker = newHashChecker(hashAndRevGetter(c))
+	} else {
+		c.Checker = newNoChecker()
+	}
+
 	c.Size = size
 	c.Size = size
 	c.Members = members
 	c.Members = members
 	return nil
 	return nil

+ 4 - 8
tools/functional-tester/etcd-tester/main.go

@@ -74,9 +74,10 @@ func main() {
 	}
 	}
 
 
 	c := &cluster{
 	c := &cluster{
-		agents:        agents,
-		v2Only:        *isV2Only,
-		stressBuilder: newStressBuilder(*stresserType, sConfig),
+		agents:           agents,
+		v2Only:           *isV2Only,
+		stressBuilder:    newStressBuilder(*stresserType, sConfig),
+		consistencyCheck: *consistencyCheck,
 	}
 	}
 
 
 	if err := c.bootstrap(); err != nil {
 	if err := c.bootstrap(); err != nil {
@@ -116,11 +117,6 @@ func main() {
 		failures: schedule,
 		failures: schedule,
 		cluster:  c,
 		cluster:  c,
 		limit:    *limit,
 		limit:    *limit,
-		checker:  newNoChecker(),
-	}
-
-	if *consistencyCheck && !c.v2Only {
-		t.checker = newHashChecker(t)
 	}
 	}
 
 
 	sh := statusHandler{status: &t.status}
 	sh := statusHandler{status: &t.status}

+ 4 - 6
tools/functional-tester/etcd-tester/tester.go

@@ -20,11 +20,9 @@ import (
 )
 )
 
 
 type tester struct {
 type tester struct {
-	failures []failure
-	cluster  *cluster
-	limit    int
-	checker  Checker
-
+	failures        []failure
+	cluster         *cluster
+	limit           int
 	status          Status
 	status          Status
 	currentRevision int64
 	currentRevision int64
 }
 }
@@ -146,7 +144,7 @@ func (tt *tester) checkConsistency() (err error) {
 		}
 		}
 		err = tt.startStressers()
 		err = tt.startStressers()
 	}()
 	}()
-	if err = tt.checker.Check(); err != nil {
+	if err = tt.cluster.Checker.Check(); err != nil {
 		plog.Printf("%s %v", tt.logPrefix(), err)
 		plog.Printf("%s %v", tt.logPrefix(), err)
 	}
 	}
 	return err
 	return err