database: maintain in-memory consistency on remove (#15777)
The performance improvements done in #14693 where leaving the DB in an inconsistent state when specs were removed from it. This PR updates the DB internal state whenever the DB is written to a file. Note that we still cannot properly enumerate installed dependents, so there is a TODO in this code. Fixing that will require the dependents dictionaries in specs to be re-keyed (either by hash, or not keyed at all -- a list would do). See #11983 for details.
This commit is contained in:
		 Massimiliano Culpo
					Massimiliano Culpo
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							9209af950a
						
					
				
				
					commit
					7e46da73dd
				
			| @@ -1128,6 +1128,12 @@ def _remove(self, spec): | ||||
| 
 | ||||
|         del self._data[key] | ||||
|         for dep in rec.spec.dependencies(_tracked_deps): | ||||
|             # FIXME: the two lines below needs to be updated once #11983 is | ||||
|             # FIXME: fixed. The "if" statement should be deleted and specs are | ||||
|             # FIXME: to be removed from dependents by hash and not by name. | ||||
|             # FIXME: See https://github.com/spack/spack/pull/15777#issuecomment-607818955 | ||||
|             if dep._dependents.get(spec.name): | ||||
|                 del dep._dependents[spec.name] | ||||
|             self._decrement_ref_count(dep) | ||||
| 
 | ||||
|         if rec.deprecated_for: | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
| # SPDX-License-Identifier: (Apache-2.0 OR MIT) | ||||
| 
 | ||||
| import pytest | ||||
| import llnl.util.tty as tty | ||||
| import spack.store | ||||
| from spack.main import SpackCommand, SpackCommandError | ||||
| 
 | ||||
| @@ -30,7 +31,7 @@ def test_multiple_matches(mutable_database): | ||||
| 
 | ||||
| @pytest.mark.db | ||||
| def test_installed_dependents(mutable_database): | ||||
|     """Test can't uninstall when ther are installed dependents.""" | ||||
|     """Test can't uninstall when there are installed dependents.""" | ||||
|     with pytest.raises(SpackCommandError): | ||||
|         uninstall('-y', 'libelf') | ||||
| 
 | ||||
| @@ -155,3 +156,16 @@ def db_specs(): | ||||
|     assert len(mpileaks_specs) == 3 | ||||
|     assert len(callpath_specs) == 3  # back to 3 | ||||
|     assert len(mpi_specs) == 3 | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.db | ||||
| @pytest.mark.regression('15773') | ||||
| def test_in_memory_consistency_when_uninstalling( | ||||
|         mutable_database, monkeypatch | ||||
| ): | ||||
|     """Test that uninstalling doesn't raise warnings""" | ||||
|     def _warn(*args, **kwargs): | ||||
|         raise RuntimeError('a warning was triggered!') | ||||
|     monkeypatch.setattr(tty, 'warn', _warn) | ||||
|     # Now try to uninstall and check this doesn't trigger warnings | ||||
|     uninstall('-y', '-a') | ||||
|   | ||||
		Reference in New Issue
	
	Block a user