@@ -115,7 +115,6 @@ class DetailsPanel extends React.Component {
115
115
116
116
this . setState (
117
117
{
118
- jobDetails : [ ] ,
119
118
suggestions : [ ] ,
120
119
jobDetailLoading : true ,
121
120
jobArtifactsLoading : true ,
@@ -167,26 +166,96 @@ class DetailsPanel extends React.Component {
167
166
this . selectJobController . signal ,
168
167
) ;
169
168
170
- const phSeriesPromise = PerfSeriesModel . getSeriesData (
169
+ const performancePromise = PerfSeriesModel . getSeriesData (
171
170
currentRepo . name ,
172
171
{
173
172
job_id : selectedJob . id ,
174
173
} ,
175
- ) ;
174
+ ) . then ( async ( phSeriesResult ) => {
175
+ const performanceData = Object . values ( phSeriesResult ) . reduce (
176
+ ( a , b ) => [ ...a , ...b ] ,
177
+ [ ] ,
178
+ ) ;
179
+ let perfJobDetail = [ ] ;
180
+
181
+ if ( performanceData . length ) {
182
+ const signatureIds = [
183
+ ...new Set ( performanceData . map ( ( perf ) => perf . signature_id ) ) ,
184
+ ] ;
185
+ const seriesListList = await Promise . all (
186
+ chunk ( signatureIds , 20 ) . map ( ( signatureIdChunk ) =>
187
+ PerfSeriesModel . getSeriesList ( currentRepo . name , {
188
+ id : signatureIdChunk ,
189
+ } ) ,
190
+ ) ,
191
+ ) ;
192
+ const mappedFrameworks = { } ;
193
+ frameworks . forEach ( ( element ) => {
194
+ mappedFrameworks [ element . id ] = element . name ;
195
+ } ) ;
196
+
197
+ const seriesList = seriesListList
198
+ . map ( ( item ) => item . data )
199
+ . reduce ( ( a , b ) => [ ...a , ...b ] , [ ] ) ;
200
+
201
+ perfJobDetail = performanceData
202
+ . map ( ( d ) => ( {
203
+ series : seriesList . find ( ( s ) => d . signature_id === s . id ) ,
204
+ ...d ,
205
+ } ) )
206
+ . map ( ( d ) => ( {
207
+ url : `/perfherder/graphs?series=${ [
208
+ currentRepo . name ,
209
+ d . signature_id ,
210
+ 1 ,
211
+ d . series . frameworkId ,
212
+ ] } &selected=${ [ d . signature_id , d . id ] } `,
213
+ shouldAlert : d . series . should_alert ,
214
+ value : d . value ,
215
+ measurementUnit : d . series . measurementUnit ,
216
+ lowerIsBetter : d . series . lowerIsBetter ,
217
+ title : d . series . name ,
218
+ suite : d . series . suite ,
219
+ options : d . series . options . join ( ' ' ) ,
220
+ frameworkName : mappedFrameworks [ d . series . frameworkId ] ,
221
+ perfdocs : new Perfdocs (
222
+ mappedFrameworks [ d . series . frameworkId ] ,
223
+ d . series . suite ,
224
+ d . series . platform ,
225
+ d . series . name ,
226
+ ) ,
227
+ } ) ) ;
228
+ }
229
+ perfJobDetail . sort ( ( a , b ) => {
230
+ // Sort perfJobDetails by value of shouldAlert in a particular order:
231
+ // first true values, after that null values and then false.
232
+ if ( a . shouldAlert === true ) {
233
+ return - 1 ;
234
+ }
235
+ if ( a . shouldAlert === false ) {
236
+ return 1 ;
237
+ }
238
+ if ( a . shouldAlert === null && b . shouldAlert === true ) {
239
+ return 1 ;
240
+ }
241
+ if ( a . shouldAlert === null && b . shouldAlert === false ) {
242
+ return - 1 ;
243
+ }
244
+ return 0 ;
245
+ } ) ;
246
+ this . setState ( {
247
+ perfJobDetail,
248
+ } ) ;
249
+ } ) ;
176
250
177
251
Promise . all ( [
178
252
jobPromise ,
179
253
jobLogUrlPromise ,
180
- phSeriesPromise ,
181
254
builtFromArtifactPromise ,
255
+ this . updateClassifications ( ) ,
182
256
] )
183
257
. then (
184
- async ( [
185
- jobResult ,
186
- jobLogUrlResult ,
187
- phSeriesResult ,
188
- builtFromArtifactResult ,
189
- ] ) => {
258
+ async ( [ jobResult , jobLogUrlResult , builtFromArtifactResult ] ) => {
190
259
// This version of the job has more information than what we get in the main job list. This
191
260
// is what we'll pass to the rest of the details panel.
192
261
// Don't update the job instance in the greater job field so as to not add the memory overhead
@@ -242,93 +311,31 @@ class DetailsPanel extends React.Component {
242
311
currentRepo . name ,
243
312
) ;
244
313
const logViewerFullUrl = `${ window . location . origin } ${ logViewerUrl } ` ;
245
- const performanceData = Object . values ( phSeriesResult ) . reduce (
246
- ( a , b ) => [ ...a , ...b ] ,
247
- [ ] ,
248
- ) ;
249
- let perfJobDetail = [ ] ;
250
-
251
- if ( performanceData . length ) {
252
- const signatureIds = [
253
- ...new Set ( performanceData . map ( ( perf ) => perf . signature_id ) ) ,
254
- ] ;
255
- const seriesListList = await Promise . all (
256
- chunk ( signatureIds , 20 ) . map ( ( signatureIdChunk ) =>
257
- PerfSeriesModel . getSeriesList ( currentRepo . name , {
258
- id : signatureIdChunk ,
259
- } ) ,
260
- ) ,
261
- ) ;
262
- const mappedFrameworks = { } ;
263
- frameworks . forEach ( ( element ) => {
264
- mappedFrameworks [ element . id ] = element . name ;
265
- } ) ;
266
-
267
- const seriesList = seriesListList
268
- . map ( ( item ) => item . data )
269
- . reduce ( ( a , b ) => [ ...a , ...b ] , [ ] ) ;
270
-
271
- perfJobDetail = performanceData
272
- . map ( ( d ) => ( {
273
- series : seriesList . find ( ( s ) => d . signature_id === s . id ) ,
274
- ...d ,
275
- } ) )
276
- . map ( ( d ) => ( {
277
- url : `/perfherder/graphs?series=${ [
278
- currentRepo . name ,
279
- d . signature_id ,
280
- 1 ,
281
- d . series . frameworkId ,
282
- ] } &selected=${ [ d . signature_id , d . id ] } `,
283
- shouldAlert : d . series . should_alert ,
284
- value : d . value ,
285
- measurementUnit : d . series . measurementUnit ,
286
- lowerIsBetter : d . series . lowerIsBetter ,
287
- title : d . series . name ,
288
- suite : d . series . suite ,
289
- options : d . series . options . join ( ' ' ) ,
290
- frameworkName : mappedFrameworks [ d . series . frameworkId ] ,
291
- perfdocs : new Perfdocs (
292
- mappedFrameworks [ d . series . frameworkId ] ,
293
- d . series . suite ,
294
- d . series . platform ,
295
- d . series . name ,
296
- ) ,
297
- } ) ) ;
314
+
315
+ const newState = {
316
+ selectedJobFull,
317
+ jobLogUrls,
318
+ logParseStatus,
319
+ logViewerUrl,
320
+ logViewerFullUrl,
321
+ jobRevision,
322
+ } ;
323
+
324
+ // Only wait for the performance data before setting
325
+ // jobDetailLoading to false if we will not be showing
326
+ // the Failure Summary panel by default.
327
+ if (
328
+ ! [ 'busted' , 'testfailed' , 'exception' ] . includes (
329
+ selectedJobFull . resultStatus ,
330
+ )
331
+ ) {
332
+ this . setState ( newState ) ;
333
+ await performancePromise ;
334
+ this . setState ( { jobDetailLoading : false } ) ;
335
+ } else {
336
+ newState . jobDetailLoading = false ;
337
+ this . setState ( newState ) ;
298
338
}
299
- perfJobDetail . sort ( ( a , b ) => {
300
- // Sort perfJobDetails by value of shouldAlert in a particular order:
301
- // first true values, after that null values and then false.
302
- if ( a . shouldAlert === true ) {
303
- return - 1 ;
304
- }
305
- if ( a . shouldAlert === false ) {
306
- return 1 ;
307
- }
308
- if ( a . shouldAlert === null && b . shouldAlert === true ) {
309
- return 1 ;
310
- }
311
- if ( a . shouldAlert === null && b . shouldAlert === false ) {
312
- return - 1 ;
313
- }
314
- return 0 ;
315
- } ) ;
316
-
317
- this . setState (
318
- {
319
- selectedJobFull,
320
- jobLogUrls,
321
- logParseStatus,
322
- logViewerUrl,
323
- logViewerFullUrl,
324
- perfJobDetail,
325
- jobRevision,
326
- } ,
327
- async ( ) => {
328
- await this . updateClassifications ( ) ;
329
- this . setState ( { jobDetailLoading : false } ) ;
330
- } ,
331
- ) ;
332
339
} ,
333
340
)
334
341
. finally ( ( ) => {
@@ -346,6 +353,7 @@ class DetailsPanel extends React.Component {
346
353
classificationMap,
347
354
classificationTypes,
348
355
isPinBoardVisible,
356
+ selectedJob,
349
357
} = this . props ;
350
358
const {
351
359
selectedJobFull,
@@ -403,6 +411,7 @@ class DetailsPanel extends React.Component {
403
411
/>
404
412
< span className = "job-tabs-divider" />
405
413
< TabsPanel
414
+ selectedJob = { selectedJob }
406
415
selectedJobFull = { selectedJobFull }
407
416
currentRepo = { currentRepo }
408
417
jobDetails = { jobDetails }
0 commit comments