Unverified Commit 1aa67bee authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #62829 from MrHohn/e2e-inrgess-scale-race

Automatic merge from submit-queue (batch tested with PRs 62495, 63003, 62829, 62151, 62002). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. [e2e ingress-gce] Fix race condition for appending services and ingresses **What this PR does / why we need it**: From https://github.com/kubernetes/ingress-gce/issues/219, how the test appends services and ingresses is not thread-safe. This PR fixes it by using channel. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #https://github.com/kubernetes/ingress-gce/issues/219 **Special notes for your reviewer**: /assign @nicksardo I picked this up as it is fun :) Hoping you haven't worked on it yet. **Release note**: ```release-note NONE ```
parents b0fb2724 9a5ce379
...@@ -179,25 +179,27 @@ func (f *IngressScaleFramework) RunScaleTest() []error { ...@@ -179,25 +179,27 @@ func (f *IngressScaleFramework) RunScaleTest() []error {
} }
} }
// currentNum keeps track of how many ingresses have been created. // numIngsCreated keeps track of how many ingresses have been created.
currentNum := new(int) numIngsCreated := 0
prepareIngsFunc := func(goalNum int) { prepareIngsFunc := func(numIngsNeeded int) {
var ingWg sync.WaitGroup var ingWg sync.WaitGroup
numToCreate := goalNum - *currentNum numIngsToCreate := numIngsNeeded - numIngsCreated
ingWg.Add(numToCreate) ingWg.Add(numIngsToCreate)
errQueue := make(chan error, numToCreate) svcQueue := make(chan *v1.Service, numIngsToCreate)
latencyQueue := make(chan time.Duration, numToCreate) ingQueue := make(chan *extensions.Ingress, numIngsToCreate)
errQueue := make(chan error, numIngsToCreate)
latencyQueue := make(chan time.Duration, numIngsToCreate)
start := time.Now() start := time.Now()
for ; *currentNum < goalNum; *currentNum++ { for ; numIngsCreated < numIngsNeeded; numIngsCreated++ {
suffix := fmt.Sprintf("%d", *currentNum) suffix := fmt.Sprintf("%d", numIngsCreated)
go func() { go func() {
defer ingWg.Done() defer ingWg.Done()
start := time.Now() start := time.Now()
svcCreated, ingCreated, err := f.createScaleTestServiceIngress(suffix, f.EnableTLS) svcCreated, ingCreated, err := f.createScaleTestServiceIngress(suffix, f.EnableTLS)
f.ScaleTestSvcs = append(f.ScaleTestSvcs, svcCreated) svcQueue <- svcCreated
f.ScaleTestIngs = append(f.ScaleTestIngs, ingCreated) ingQueue <- ingCreated
if err != nil { if err != nil {
errQueue <- err errQueue <- err
return return
...@@ -214,11 +216,19 @@ func (f *IngressScaleFramework) RunScaleTest() []error { ...@@ -214,11 +216,19 @@ func (f *IngressScaleFramework) RunScaleTest() []error {
} }
// Wait until all ingress creations are complete. // Wait until all ingress creations are complete.
f.Logger.Infof("Waiting for %d ingresses to come up...", numToCreate) f.Logger.Infof("Waiting for %d ingresses to come up...", numIngsToCreate)
ingWg.Wait() ingWg.Wait()
close(svcQueue)
close(ingQueue)
close(errQueue) close(errQueue)
close(latencyQueue) close(latencyQueue)
elapsed := time.Since(start) elapsed := time.Since(start)
for svc := range svcQueue {
f.ScaleTestSvcs = append(f.ScaleTestSvcs, svc)
}
for ing := range ingQueue {
f.ScaleTestIngs = append(f.ScaleTestIngs, ing)
}
var createLatencies []time.Duration var createLatencies []time.Duration
for latency := range latencyQueue { for latency := range latencyQueue {
createLatencies = append(createLatencies, latency) createLatencies = append(createLatencies, latency)
...@@ -231,15 +241,15 @@ func (f *IngressScaleFramework) RunScaleTest() []error { ...@@ -231,15 +241,15 @@ func (f *IngressScaleFramework) RunScaleTest() []error {
} }
return return
} }
f.Logger.Infof("Spent %s for %d ingresses to come up", elapsed, numToCreate) f.Logger.Infof("Spent %s for %d ingresses to come up", elapsed, numIngsToCreate)
f.BatchDurations = append(f.BatchDurations, elapsed) f.BatchDurations = append(f.BatchDurations, elapsed)
} }
measureCreateUpdateFunc := func() { measureCreateUpdateFunc := func() {
f.Logger.Infof("Create one more ingress and wait for it to come up") f.Logger.Infof("Create one more ingress and wait for it to come up")
start := time.Now() start := time.Now()
svcCreated, ingCreated, err := f.createScaleTestServiceIngress(fmt.Sprintf("%d", *currentNum), f.EnableTLS) svcCreated, ingCreated, err := f.createScaleTestServiceIngress(fmt.Sprintf("%d", numIngsCreated), f.EnableTLS)
*currentNum = *currentNum + 1 numIngsCreated = numIngsCreated + 1
f.ScaleTestSvcs = append(f.ScaleTestSvcs, svcCreated) f.ScaleTestSvcs = append(f.ScaleTestSvcs, svcCreated)
f.ScaleTestIngs = append(f.ScaleTestIngs, ingCreated) f.ScaleTestIngs = append(f.ScaleTestIngs, ingCreated)
if err != nil { if err != nil {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment