@@ -324,13 +324,21 @@ function getRepoPath(name) {
324324function startJobTimer ( job , kill_children = false ) {
325325 const timeout = config . timeout || 8 * 60000 ; // How long to wait for the tests to run
326326 return setTimeout ( ( ) => {
327+ let log = _log . extend ( 'job_timer' ) ;
327328 console . log ( 'Max test time exceeded' ) ;
328329 log ( kill_children ? 'Killing all processes' : 'Ending test process' ) ;
329330 let pid = job . _child . pid ;
331+ log ( 'Killing process(es) for job #%g, pid = %d' , job . id , pid ) ;
330332 job . _child . kill ( ) ;
331- if ( kill_children ) {
332- kill ( pid ) ;
333- }
333+ if ( kill_children ) kill ( pid ) ;
334+ // Give the processes 1 minute before sending a more aggressive signal
335+ return setTimeout ( ( ) => {
336+ if ( job . _child && job . _child . exitCode == null ) {
337+ log ( 'Failed to kill job process(es); sending SIGKILL (job #%g, pid = %d)' , job . id , pid ) ;
338+ job . _child . kill ( 'SIGKILL' ) ;
339+ if ( kill_children ) kill ( pid , 'SIGKILL' ) ;
340+ }
341+ } , 60000 )
334342 } , timeout ) ;
335343}
336344
@@ -534,10 +542,10 @@ async function buildRoutine(job) {
534542 */
535543function computeCoverage ( job ) {
536544 if ( typeof job . data . coverage !== 'undefined' && job . data . coverage ) {
537- console . log ( 'Coverage already computed for job #' + job . id ) ;
545+ console . log ( 'Coverage already computed for job #%g' , job . id ) ;
538546 return ;
539547 }
540- console . log ( 'Updating coverage for job #' + job . id ) ;
548+ console . log ( 'Updating coverage for job #%g' , job . id ) ;
541549 const xmlPath = path . join ( config . dataPath , 'reports' , job . data . sha , 'CoverageResults.xml' ) ;
542550 const modules = listSubmodules ( process . env . REPO_PATH ) ;
543551 return Coverage ( xmlPath , job . data . repo , job . data . sha , modules ) . then ( obj => {
0 commit comments