Remove DB reindex during a read operation (#26601)

The DB should be what is trusted for certain operations.
If it is not present when read we should assume the
corresponding store is empty, rather than trying a
write operation during a read.

* Add a unit test
* Document what needs to be there in tests
This commit is contained in:
Massimiliano Culpo 2021-10-09 00:35:23 +02:00 committed by GitHub
parent 21ce23816e
commit 2386630e10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 12 deletions

View File

@ -1024,12 +1024,7 @@ def _write(self, type, value, traceback):
raise
def _read(self):
"""Re-read Database from the data in the set location.
This does no locking, with one exception: it will automatically
try to regenerate a missing DB if local. This requires taking a
write lock.
"""
"""Re-read Database from the data in the set location. This does no locking."""
if os.path.isfile(self._index_path):
current_verifier = ''
if _use_uuid:
@ -1049,12 +1044,6 @@ def _read(self):
"No database index file is present, and upstream"
" databases cannot generate an index file")
# The file doesn't exist, try to traverse the directory.
# reindex() takes its own write lock, so no lock here.
with lk.WriteTransaction(self.lock):
self._write(None, None, None)
self.reindex(spack.store.layout)
def _add(
self,
spec,

View File

@ -894,3 +894,18 @@ def _raise(db, spec):
with pytest.raises(Exception):
with spack.store.db.prefix_write_lock(s):
assert False
@pytest.mark.regression('26600')
def test_database_works_with_empty_dir(tmpdir):
# Create the lockfile and failures directory otherwise
# we'll get a permission error on Database creation
db_dir = tmpdir.ensure_dir('.spack-db')
db_dir.ensure('lock')
db_dir.ensure_dir('failures')
tmpdir.chmod(mode=0o555, rec=1)
db = spack.database.Database(str(tmpdir))
with db.read_transaction():
db.query()
# Check that reading an empty directory didn't create a new index.json
assert not os.path.exists(db._index_path)