@@ -162,6 +162,52 @@ func (e *RealE2ETester) getGCSResult(j cache.Job, n cache.Number) (*cache.Result
162162 return r , nil
163163}
164164
165+ func (e * RealE2ETester ) checkPassFail (job string , number int ) (stable , ignorableFlakes bool ) {
166+ if e .resolutionTracker .Resolved (cache .Job (job ), cache .Number (number )) {
167+ e .setBuildStatus (job , "Problem Resolved" , strconv .Itoa (number ))
168+ return true , true
169+ }
170+
171+ thisResult , err := e .GetBuildResult (job , number )
172+ if err != nil || thisResult .Status == cache .ResultFailed {
173+ glog .V (4 ).Infof ("Found unstable job: %v, build number: %v: (err: %v) %#v" , job , number , err , thisResult )
174+ e .setBuildStatus (job , "Not Stable" , strconv .Itoa (number ))
175+ return false , false
176+ }
177+
178+ if thisResult .Status == cache .ResultStable {
179+ e .setBuildStatus (job , "Stable" , strconv .Itoa (number ))
180+ return true , false
181+ }
182+
183+ lastResult , err := e .GetBuildResult (job , number - 1 )
184+ if err != nil || lastResult .Status == cache .ResultFailed {
185+ glog .V (4 ).Infof ("prev job doesn't help: %v, build number: %v (the previous build); (err %v) %#v" , job , number - 1 , err , lastResult )
186+ e .setBuildStatus (job , "Not Stable" , strconv .Itoa (number ))
187+ return true , false
188+ }
189+
190+ if lastResult .Status == cache .ResultStable {
191+ e .setBuildStatus (job , "Ignorable flake" , strconv .Itoa (number ))
192+ return true , true
193+ }
194+
195+ intersection := sets .NewString ()
196+ for testName := range thisResult .Flakes {
197+ if _ , ok := lastResult .Flakes [testName ]; ok {
198+ intersection .Insert (string (testName ))
199+ }
200+ }
201+ if len (intersection ) == 0 {
202+ glog .V (2 ).Infof ("Ignoring failure of %v/%v since it didn't happen the previous run this run = %v; prev run = %v." , job , number , thisResult .Flakes , lastResult .Flakes )
203+ e .setBuildStatus (job , "Ignorable flake" , strconv .Itoa (number ))
204+ return true , true
205+ }
206+ glog .V (2 ).Infof ("Failure of %v/%v is legit. Tests that failed multiple times in a row: %v" , job , number , intersection )
207+ e .setBuildStatus (job , "Not Stable" , strconv .Itoa (number ))
208+ return false , false
209+ }
210+
165211// GCSBasedStable is a version of Stable function that depends on files stored in GCS instead of Jenkis
166212func (e * RealE2ETester ) GCSBasedStable () (allStable , ignorableFlakes bool ) {
167213 allStable = true
@@ -175,53 +221,9 @@ func (e *RealE2ETester) GCSBasedStable() (allStable, ignorableFlakes bool) {
175221 continue
176222 }
177223
178- if e .resolutionTracker .Resolved (cache .Job (job ), cache .Number (lastBuildNumber )) {
179- e .setBuildStatus (job , "Problem Resolved" , strconv .Itoa (lastBuildNumber ))
180- continue
181- }
182-
183- thisResult , err := e .GetBuildResult (job , lastBuildNumber )
184- if err != nil || thisResult .Status == cache .ResultFailed {
185- glog .V (4 ).Infof ("Found unstable job: %v, build number: %v: (err: %v) %#v" , job , lastBuildNumber , err , thisResult )
186- e .setBuildStatus (job , "Not Stable" , strconv .Itoa (lastBuildNumber ))
187- allStable = false
188- continue
189- }
190-
191- if thisResult .Status == cache .ResultStable {
192- e .setBuildStatus (job , "Stable" , strconv .Itoa (lastBuildNumber ))
193- continue
194- }
195-
196- lastResult , err := e .GetBuildResult (job , lastBuildNumber - 1 )
197- if err != nil || lastResult .Status == cache .ResultFailed {
198- glog .V (4 ).Infof ("prev job doesn't help: %v, build number: %v (the previous build); (err %v) %#v" , job , lastBuildNumber - 1 , err , lastResult )
199- allStable = false
200- e .setBuildStatus (job , "Not Stable" , strconv .Itoa (lastBuildNumber ))
201- continue
202- }
203-
204- if lastResult .Status == cache .ResultStable {
205- ignorableFlakes = true
206- e .setBuildStatus (job , "Ignorable flake" , strconv .Itoa (lastBuildNumber ))
207- continue
208- }
209-
210- intersection := sets .NewString ()
211- for testName := range thisResult .Flakes {
212- if _ , ok := lastResult .Flakes [testName ]; ok {
213- intersection .Insert (string (testName ))
214- }
215- }
216- if len (intersection ) == 0 {
217- glog .V (2 ).Infof ("Ignoring failure of %v/%v since it didn't happen the previous run this run = %v; prev run = %v." , job , lastBuildNumber , thisResult .Flakes , lastResult .Flakes )
218- ignorableFlakes = true
219- e .setBuildStatus (job , "Ignorable flake" , strconv .Itoa (lastBuildNumber ))
220- continue
221- }
222- glog .V (2 ).Infof ("Failure of %v/%v is legit. Tests that failed multiple times in a row: %v" , job , lastBuildNumber , intersection )
223- allStable = false
224- e .setBuildStatus (job , "Not Stable" , strconv .Itoa (lastBuildNumber ))
224+ stable , flakes := e .checkPassFail (job , lastBuildNumber )
225+ allStable = allStable && stable
226+ ignorableFlakes = ignorableFlakes || flakes
225227 }
226228
227229 // Also get status for non-blocking jobs
0 commit comments