2
2
import copy
3
3
import functools
4
4
import os
5
+ import re
5
6
import signal
6
7
import traceback
7
8
import yaml
@@ -83,6 +84,7 @@ def get_task_groups():
83
84
'task_ids' : stable_task_ids ,
84
85
'is_parallel' : suite .is_parallel (),
85
86
'fragile_retries' : 0 ,
87
+ 'fragile_checksums' : suite .fragile_checksums (),
86
88
'show_reproduce_content' : suite .show_reproduce_content (),
87
89
}
88
90
if fragile_task_ids :
@@ -91,6 +93,7 @@ def get_task_groups():
91
93
'task_ids' : fragile_task_ids ,
92
94
'is_parallel' : False ,
93
95
'fragile_retries' : suite .fragile_retries (),
96
+ 'fragile_checksums' : suite .fragile_checksums (),
94
97
'show_reproduce_content' : suite .show_reproduce_content (),
95
98
}
96
99
return res
@@ -315,7 +318,7 @@ def run_task(self, task_id):
315
318
raise
316
319
return short_status
317
320
318
- def run_loop (self , task_queue , result_queue , fragile_retries ):
321
+ def run_loop (self , task_queue , result_queue , fragile_retries , fragile_checksums ):
319
322
""" called from 'run_all' """
320
323
while True :
321
324
task_id = self .task_get (task_queue )
@@ -332,15 +335,17 @@ def run_loop(self, task_queue, result_queue, fragile_retries):
332
335
# 'fragile_retries' value comes from the suite configuration
333
336
retries_left = fragile_retries
334
337
while short_status != 'pass' and retries_left >= 0 :
335
- if short_status == ' fail' :
338
+ if re . match ( r'^ fail:.*' , short_status ) :
336
339
color_stdout (
337
340
'Test "%s", conf: "%s"\n '
338
- '\t from "fragile" list failed - rerunning ...\n '
339
- % (task_id [0 ], task_id [1 ]) , schema = 'error' )
341
+ '\t from "fragile" list failed, result file checksum "%s" rerunning ...\n '
342
+ % (task_id [0 ], task_id [1 ], short_status ) , schema = 'error' )
340
343
short_status = self .run_task (task_id )
344
+ fail_checksum = re .split (r'fail:' , short_status )
345
+ if fragile_checksums and not fail_checksum [1 ] in fragile_checksums :
346
+ break
341
347
retries_left = retries_left - 1
342
348
343
-
344
349
result_queue .put (self .wrap_result (task_id , short_status ))
345
350
if not lib .Options ().args .is_force and short_status == 'fail' :
346
351
color_stdout (
@@ -354,14 +359,14 @@ def run_loop(self, task_queue, result_queue, fragile_retries):
354
359
raise VoluntaryStopException ()
355
360
self .task_done (task_queue )
356
361
357
- def run_all (self , task_queue , result_queue , fragile_retries ):
362
+ def run_all (self , task_queue , result_queue , fragile_retries , fragile_checksums ):
358
363
if not self .initialized :
359
364
self .flush_all_tasks (task_queue , result_queue )
360
365
result_queue .put (self .done_marker ())
361
366
return
362
367
363
368
try :
364
- self .run_loop (task_queue , result_queue , fragile_retries )
369
+ self .run_loop (task_queue , result_queue , fragile_retries , fragile_checksums )
365
370
except (KeyboardInterrupt , Exception ) as e :
366
371
if not isinstance (e , KeyboardInterrupt ) and \
367
372
not isinstance (e , VoluntaryStopException ):
0 commit comments