|  | @@ -71,16 +71,17 @@ def platform_string():
 | 
	
		
			
				|  |  |  # SimpleConfig: just compile with CONFIG=config, and run the binary to test
 | 
	
		
			
				|  |  |  class SimpleConfig(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  def __init__(self, config, environ=None, timeout_seconds=5*60):
 | 
	
		
			
				|  |  | +  def __init__(self, config, environ=None, timeout_multiplier=1):
 | 
	
		
			
				|  |  |      if environ is None:
 | 
	
		
			
				|  |  |        environ = {}
 | 
	
		
			
				|  |  |      self.build_config = config
 | 
	
		
			
				|  |  |      self.allow_hashing = (config != 'gcov')
 | 
	
		
			
				|  |  |      self.environ = environ
 | 
	
		
			
				|  |  |      self.environ['CONFIG'] = config
 | 
	
		
			
				|  |  | -    self.timeout_seconds = timeout_seconds
 | 
	
		
			
				|  |  | +    self.timeout_multiplier = timeout_multiplier
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  def job_spec(self, cmdline, hash_targets, shortname=None, environ={}):
 | 
	
		
			
				|  |  | +  def job_spec(self, cmdline, hash_targets, timeout_seconds=5*60,
 | 
	
		
			
				|  |  | +               shortname=None, environ={}):
 | 
	
		
			
				|  |  |      """Construct a jobset.JobSpec for a test under this config
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |         Args:
 | 
	
	
		
			
				|  | @@ -98,7 +99,7 @@ class SimpleConfig(object):
 | 
	
		
			
				|  |  |      return jobset.JobSpec(cmdline=cmdline,
 | 
	
		
			
				|  |  |                            shortname=shortname,
 | 
	
		
			
				|  |  |                            environ=actual_environ,
 | 
	
		
			
				|  |  | -                          timeout_seconds=self.timeout_seconds,
 | 
	
		
			
				|  |  | +                          timeout_seconds=self.timeout_multiplier * timeout_seconds,
 | 
	
		
			
				|  |  |                            hash_targets=hash_targets
 | 
	
		
			
				|  |  |                                if self.allow_hashing else None,
 | 
	
		
			
				|  |  |                            flake_retries=5 if args.allow_flakes else 0)
 | 
	
	
		
			
				|  | @@ -248,6 +249,7 @@ class PythonLanguage(object):
 | 
	
		
			
				|  |  |          None,
 | 
	
		
			
				|  |  |          environ=environment,
 | 
	
		
			
				|  |  |          shortname='py.test',
 | 
	
		
			
				|  |  | +        timeout_seconds=15*60
 | 
	
		
			
				|  |  |      )]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def pre_build_steps(self):
 | 
	
	
		
			
				|  | @@ -431,11 +433,11 @@ class Build(object):
 | 
	
		
			
				|  |  |  _CONFIGS = {
 | 
	
		
			
				|  |  |      'dbg': SimpleConfig('dbg'),
 | 
	
		
			
				|  |  |      'opt': SimpleConfig('opt'),
 | 
	
		
			
				|  |  | -    'tsan': SimpleConfig('tsan', timeout_seconds=10*60, environ={
 | 
	
		
			
				|  |  | +    'tsan': SimpleConfig('tsan', timeout_multiplier=2, environ={
 | 
	
		
			
				|  |  |          'TSAN_OPTIONS': 'suppressions=tools/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1'}),
 | 
	
		
			
				|  |  | -    'msan': SimpleConfig('msan', timeout_seconds=7*60),
 | 
	
		
			
				|  |  | +    'msan': SimpleConfig('msan', timeout_multiplier=1.5),
 | 
	
		
			
				|  |  |      'ubsan': SimpleConfig('ubsan'),
 | 
	
		
			
				|  |  | -    'asan': SimpleConfig('asan', timeout_seconds=7*60, environ={
 | 
	
		
			
				|  |  | +    'asan': SimpleConfig('asan', timeout_multiplier=1.5, environ={
 | 
	
		
			
				|  |  |          'ASAN_OPTIONS': 'detect_leaks=1:color=always:suppressions=tools/tsan_suppressions.txt',
 | 
	
		
			
				|  |  |          'LSAN_OPTIONS': 'report_objects=1'}),
 | 
	
		
			
				|  |  |      'asan-noleaks': SimpleConfig('asan', environ={
 |