Skip to content
Snippets Groups Projects
Commit 55f5afaf authored by Massimiliano Culpo's avatar Massimiliano Culpo Committed by Todd Gamblin
Browse files

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.
parent 6b559912
No related branches found
No related tags found
No related merge requests found
...@@ -1128,6 +1128,12 @@ def _remove(self, spec): ...@@ -1128,6 +1128,12 @@ def _remove(self, spec):
del self._data[key] del self._data[key]
for dep in rec.spec.dependencies(_tracked_deps): 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) self._decrement_ref_count(dep)
if rec.deprecated_for: if rec.deprecated_for:
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pytest import pytest
import llnl.util.tty as tty
import spack.store import spack.store
from spack.main import SpackCommand, SpackCommandError from spack.main import SpackCommand, SpackCommandError
...@@ -30,7 +31,7 @@ def test_multiple_matches(mutable_database): ...@@ -30,7 +31,7 @@ def test_multiple_matches(mutable_database):
@pytest.mark.db @pytest.mark.db
def test_installed_dependents(mutable_database): 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): with pytest.raises(SpackCommandError):
uninstall('-y', 'libelf') uninstall('-y', 'libelf')
...@@ -155,3 +156,16 @@ def db_specs(): ...@@ -155,3 +156,16 @@ def db_specs():
assert len(mpileaks_specs) == 3 assert len(mpileaks_specs) == 3
assert len(callpath_specs) == 3 # back to 3 assert len(callpath_specs) == 3 # back to 3
assert len(mpi_specs) == 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')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment