Speedup environment activation (#13557)
* Add a transaction around repeated calls to `spec.prefix` in the activation process * cache the computation of home in the python package to speed up setting deps * ensure that module-scope variables are only set *once* per module
This commit is contained in:
		 Massimiliano Culpo
					Massimiliano Culpo
				
			
				
					committed by
					
						 Todd Gamblin
						Todd Gamblin
					
				
			
			
				
	
			
			
			 Todd Gamblin
						Todd Gamblin
					
				
			
						parent
						
							1b624b9d45
						
					
				
				
					commit
					bca59f8d83
				
			| @@ -422,6 +422,11 @@ def set_build_environment_variables(pkg, env, dirty): | |||||||
| 
 | 
 | ||||||
| def _set_variables_for_single_module(pkg, module): | def _set_variables_for_single_module(pkg, module): | ||||||
|     """Helper function to set module variables for single module.""" |     """Helper function to set module variables for single module.""" | ||||||
|  |     # Put a marker on this module so that it won't execute the body of this | ||||||
|  |     # function again, since it is not needed | ||||||
|  |     marker = '_set_run_already_called' | ||||||
|  |     if getattr(module, marker, False): | ||||||
|  |         return | ||||||
| 
 | 
 | ||||||
|     jobs = spack.config.get('config:build_jobs') if pkg.parallel else 1 |     jobs = spack.config.get('config:build_jobs') if pkg.parallel else 1 | ||||||
|     jobs = min(jobs, multiprocessing.cpu_count()) |     jobs = min(jobs, multiprocessing.cpu_count()) | ||||||
| @@ -489,6 +494,10 @@ def static_to_shared_library(static_lib, shared_lib=None, **kwargs): | |||||||
| 
 | 
 | ||||||
|     m.static_to_shared_library = static_to_shared_library |     m.static_to_shared_library = static_to_shared_library | ||||||
| 
 | 
 | ||||||
|  |     # Put a marker on this module so that it won't execute the body of this | ||||||
|  |     # function again, since it is not needed | ||||||
|  |     setattr(m, marker, True) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def set_module_variables_for_package(pkg): | def set_module_variables_for_package(pkg): | ||||||
|     """Populate the module scope of install() with some useful functions. |     """Populate the module scope of install() with some useful functions. | ||||||
|   | |||||||
| @@ -159,7 +159,8 @@ def activate( | |||||||
|             cmds += 'export PS1="%s ${PS1}";\n' % prompt |             cmds += 'export PS1="%s ${PS1}";\n' % prompt | ||||||
| 
 | 
 | ||||||
|     if add_view and default_view_name in env.views: |     if add_view and default_view_name in env.views: | ||||||
|         cmds += env.add_default_view_to_shell(shell) |         with spack.store.db.read_transaction(): | ||||||
|  |             cmds += env.add_default_view_to_shell(shell) | ||||||
| 
 | 
 | ||||||
|     return cmds |     return cmds | ||||||
| 
 | 
 | ||||||
| @@ -207,7 +208,8 @@ def deactivate(shell='sh'): | |||||||
|         cmds += 'fi;\n' |         cmds += 'fi;\n' | ||||||
| 
 | 
 | ||||||
|     if default_view_name in _active_environment.views: |     if default_view_name in _active_environment.views: | ||||||
|         cmds += _active_environment.rm_default_view_from_shell(shell) |         with spack.store.db.read_transaction(): | ||||||
|  |             cmds += _active_environment.rm_default_view_from_shell(shell) | ||||||
| 
 | 
 | ||||||
|     tty.debug("Deactivated environmennt '%s'" % _active_environment.name) |     tty.debug("Deactivated environmennt '%s'" % _active_environment.name) | ||||||
|     _active_environment = None |     _active_environment = None | ||||||
|   | |||||||
| @@ -163,6 +163,9 @@ class Python(AutotoolsPackage): | |||||||
|     _DISTUTIL_CACHE_FILENAME = 'sysconfig.json' |     _DISTUTIL_CACHE_FILENAME = 'sysconfig.json' | ||||||
|     _distutil_vars = None |     _distutil_vars = None | ||||||
| 
 | 
 | ||||||
|  |     # Used to cache home locations, since computing them might be expensive | ||||||
|  |     _homes = {} | ||||||
|  | 
 | ||||||
|     # An in-source build with --enable-optimizations fails for python@3.X |     # An in-source build with --enable-optimizations fails for python@3.X | ||||||
|     build_directory = 'spack-build' |     build_directory = 'spack-build' | ||||||
| 
 | 
 | ||||||
| @@ -622,8 +625,11 @@ def home(self): | |||||||
|         ``packages.yaml`` unknowingly. Query the python executable to |         ``packages.yaml`` unknowingly. Query the python executable to | ||||||
|         determine exactly where it is installed.""" |         determine exactly where it is installed.""" | ||||||
| 
 | 
 | ||||||
|         prefix = self.get_config_var('prefix') |         dag_hash = self.spec.dag_hash() | ||||||
|         return Prefix(prefix) |         if dag_hash not in self._homes: | ||||||
|  |             prefix = self.get_config_var('prefix') | ||||||
|  |             self._homes[dag_hash] = Prefix(prefix) | ||||||
|  |         return self._homes[dag_hash] | ||||||
| 
 | 
 | ||||||
|     @property |     @property | ||||||
|     def libs(self): |     def libs(self): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user