From ffabe55a25d189d9320ea6117a05328011b20c9b Mon Sep 17 00:00:00 2001 From: Gyuho Lee Date: Sat, 31 Mar 2018 18:15:40 -0700 Subject: [PATCH] functional-tester/tester: clean up stress, fix stress closing Signed-off-by: Gyuho Lee --- tools/functional-tester/tester/stress.go | 77 ------------------ .../tester/stress_composite.go | 79 +++++++++++++++++++ tools/functional-tester/tester/stress_nop.go | 31 ++++++++ 3 files changed, 110 insertions(+), 77 deletions(-) create mode 100644 tools/functional-tester/tester/stress_composite.go create mode 100644 tools/functional-tester/tester/stress_nop.go diff --git a/tools/functional-tester/tester/stress.go b/tools/functional-tester/tester/stress.go index 155320aab..d23a88e9b 100644 --- a/tools/functional-tester/tester/stress.go +++ b/tools/functional-tester/tester/stress.go @@ -16,7 +16,6 @@ package tester import ( "fmt" - "sync" "time" "go.uber.org/zap" @@ -35,82 +34,6 @@ type Stresser interface { Checker() Checker } -// nopStresser implements Stresser that does nothing -type nopStresser struct { - start time.Time - qps int -} - -func (s *nopStresser) Stress() error { return nil } -func (s *nopStresser) Pause() {} -func (s *nopStresser) Close() {} -func (s *nopStresser) ModifiedKeys() int64 { - return 0 -} -func (s *nopStresser) Checker() Checker { return nil } - -// compositeStresser implements a Stresser that runs a slice of -// stressing clients concurrently. -type compositeStresser struct { - stressers []Stresser -} - -func (cs *compositeStresser) Stress() error { - for i, s := range cs.stressers { - if err := s.Stress(); err != nil { - for j := 0; j < i; j++ { - cs.stressers[i].Close() - } - return err - } - } - return nil -} - -func (cs *compositeStresser) Pause() { - var wg sync.WaitGroup - wg.Add(len(cs.stressers)) - for i := range cs.stressers { - go func(s Stresser) { - defer wg.Done() - s.Pause() - }(cs.stressers[i]) - } - wg.Wait() -} - -func (cs *compositeStresser) Close() { - var wg sync.WaitGroup - wg.Add(len(cs.stressers)) - for i := range cs.stressers { - go func(s Stresser) { - defer wg.Done() - s.Close() - }(cs.stressers[i]) - } - wg.Wait() -} - -func (cs *compositeStresser) ModifiedKeys() (modifiedKey int64) { - for _, stress := range cs.stressers { - modifiedKey += stress.ModifiedKeys() - } - return modifiedKey -} - -func (cs *compositeStresser) Checker() Checker { - var chks []Checker - for _, s := range cs.stressers { - if chk := s.Checker(); chk != nil { - chks = append(chks, chk) - } - } - if len(chks) == 0 { - return nil - } - return newCompositeChecker(chks) -} - // newStresser creates stresser from a comma separated list of stresser types. func newStresser(clus *Cluster, idx int) Stresser { stressers := make([]Stresser, len(clus.Tester.StressTypes)) diff --git a/tools/functional-tester/tester/stress_composite.go b/tools/functional-tester/tester/stress_composite.go new file mode 100644 index 000000000..367954bfe --- /dev/null +++ b/tools/functional-tester/tester/stress_composite.go @@ -0,0 +1,79 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tester + +import "sync" + +// compositeStresser implements a Stresser that runs a slice of +// stressing clients concurrently. +type compositeStresser struct { + stressers []Stresser +} + +func (cs *compositeStresser) Stress() error { + for i, s := range cs.stressers { + if err := s.Stress(); err != nil { + for j := 0; j < i; j++ { + cs.stressers[j].Close() + } + return err + } + } + return nil +} + +func (cs *compositeStresser) Pause() { + var wg sync.WaitGroup + wg.Add(len(cs.stressers)) + for i := range cs.stressers { + go func(s Stresser) { + defer wg.Done() + s.Pause() + }(cs.stressers[i]) + } + wg.Wait() +} + +func (cs *compositeStresser) Close() { + var wg sync.WaitGroup + wg.Add(len(cs.stressers)) + for i := range cs.stressers { + go func(s Stresser) { + defer wg.Done() + s.Close() + }(cs.stressers[i]) + } + wg.Wait() +} + +func (cs *compositeStresser) ModifiedKeys() (modifiedKey int64) { + for _, stress := range cs.stressers { + modifiedKey += stress.ModifiedKeys() + } + return modifiedKey +} + +func (cs *compositeStresser) Checker() Checker { + var chks []Checker + for _, s := range cs.stressers { + if chk := s.Checker(); chk != nil { + chks = append(chks, chk) + } + } + if len(chks) == 0 { + return nil + } + return newCompositeChecker(chks) +} diff --git a/tools/functional-tester/tester/stress_nop.go b/tools/functional-tester/tester/stress_nop.go new file mode 100644 index 000000000..8254a12d7 --- /dev/null +++ b/tools/functional-tester/tester/stress_nop.go @@ -0,0 +1,31 @@ +// Copyright 2018 The etcd Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tester + +import "time" + +// nopStresser implements Stresser that does nothing +type nopStresser struct { + start time.Time + qps int +} + +func (s *nopStresser) Stress() error { return nil } +func (s *nopStresser) Pause() {} +func (s *nopStresser) Close() {} +func (s *nopStresser) ModifiedKeys() int64 { + return 0 +} +func (s *nopStresser) Checker() Checker { return nil }