Added conservative locking to the spack commands that access the database at _index

This commit is contained in:
Gregory Becker 2015-09-03 09:21:19 -07:00
parent c3246ee8ba
commit 9c8e46dc22
8 changed files with 105 additions and 87 deletions

View File

@ -28,6 +28,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.lang import attr_setdefault from llnl.util.lang import attr_setdefault
from llnl.util.lock import *
import spack import spack
import spack.spec import spack.spec
@ -124,6 +125,7 @@ def elide_list(line_list, max_num=10):
def disambiguate_spec(spec): def disambiguate_spec(spec):
with Read_Lock_Instance(spack.installed_db.lock,1800):
matching_specs = spack.installed_db.get_installed(spec) matching_specs = spack.installed_db.get_installed(spec)
if not matching_specs: if not matching_specs:
tty.die("Spec '%s' matches no installed packages." % spec) tty.die("Spec '%s' matches no installed packages." % spec)

View File

@ -24,6 +24,7 @@
############################################################################## ##############################################################################
from external import argparse from external import argparse
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.lock import *
import spack import spack
import spack.cmd import spack.cmd
@ -54,6 +55,7 @@ def deactivate(parser, args):
if args.all: if args.all:
if pkg.extendable: if pkg.extendable:
tty.msg("Deactivating all extensions of %s" % pkg.spec.short_spec) tty.msg("Deactivating all extensions of %s" % pkg.spec.short_spec)
with Read_Lock_Instance(spack.installed_db.lock,1800):
ext_pkgs = spack.installed_db.installed_extensions_for(spec) ext_pkgs = spack.installed_db.installed_extensions_for(spec)
for ext_pkg in ext_pkgs: for ext_pkg in ext_pkgs:

View File

@ -27,6 +27,7 @@
from external import argparse from external import argparse
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.lock import *
import spack import spack
import spack.cmd import spack.cmd
@ -54,6 +55,7 @@ def diy(self, args):
if not args.spec: if not args.spec:
tty.die("spack diy requires a package spec argument.") tty.die("spack diy requires a package spec argument.")
with Write_Lock_Instance(spack.installed_db.lock,1800):
specs = spack.cmd.parse_specs(args.spec) specs = spack.cmd.parse_specs(args.spec)
if len(specs) > 1: if len(specs) > 1:
tty.die("spack diy only takes one spec.") tty.die("spack diy only takes one spec.")

View File

@ -27,6 +27,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
from llnl.util.lock import *
import spack import spack
import spack.cmd import spack.cmd
@ -80,6 +81,7 @@ def extensions(parser, args):
colify(ext.name for ext in extensions) colify(ext.name for ext in extensions)
# List specs of installed extensions. # List specs of installed extensions.
with Read_Lock_Instance(spack.installed_db.lock,1800):
installed = [s.spec for s in spack.installed_db.installed_extensions_for(spec)] installed = [s.spec for s in spack.installed_db.installed_extensions_for(spec)]
print print
if not installed: if not installed:

View File

@ -32,6 +32,7 @@
from llnl.util.tty.colify import * from llnl.util.tty.colify import *
from llnl.util.tty.color import * from llnl.util.tty.color import *
from llnl.util.lang import * from llnl.util.lang import *
from llnl.util.lock import *
import spack import spack
import spack.spec import spack.spec
@ -138,8 +139,10 @@ def find(parser, args):
# Get all the specs the user asked for # Get all the specs the user asked for
if not query_specs: if not query_specs:
with Read_Lock_Instance(spack.installed_db.lock,1800):
specs = set(spack.installed_db.installed_package_specs()) specs = set(spack.installed_db.installed_package_specs())
else: else:
with Read_Lock_Instance(spack.installed_db.lock,1800):
results = [set(spack.installed_db.get_installed(qs)) for qs in query_specs] results = [set(spack.installed_db.get_installed(qs)) for qs in query_specs]
specs = set.union(*results) specs = set.union(*results)

View File

@ -25,6 +25,7 @@
from external import argparse from external import argparse
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.lock import *
import spack import spack
import spack.cmd import spack.cmd
@ -68,6 +69,7 @@ def install(parser, args):
if args.no_checksum: if args.no_checksum:
spack.do_checksum = False # TODO: remove this global. spack.do_checksum = False # TODO: remove this global.
with Write_Lock_Instance(spack.installed_db.lock,1800):
specs = spack.cmd.parse_specs(args.packages, concretize=True) specs = spack.cmd.parse_specs(args.packages, concretize=True)
for spec in specs: for spec in specs:
package = spack.db.get(spec) package = spack.db.get(spec)

View File

@ -27,6 +27,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
from llnl.util.lock import *
import spack import spack
import spack.cmd import spack.cmd
@ -53,6 +54,7 @@ def uninstall(parser, args):
if not args.packages: if not args.packages:
tty.die("uninstall requires at least one package argument.") tty.die("uninstall requires at least one package argument.")
with Write_Lock_Instance(spack.installed_db.lock,1800):
specs = spack.cmd.parse_specs(args.packages) specs = spack.cmd.parse_specs(args.packages)
# For each spec provided, make sure it refers to only one package. # For each spec provided, make sure it refers to only one package.

View File

@ -158,12 +158,12 @@ def write(self):
within the same lock, so there is no need to refresh within the same lock, so there is no need to refresh
the database within write() the database within write()
""" """
temp_name = os.getpid() + socket.getfqdn() + ".temp" temp_name = str(os.getpid()) + socket.getfqdn() + ".temp"
temp_file = path.join(self._root,temp_name) temp_file = join_path(self._root,temp_name)
with open(self.temp_path,'w') as f: with open(temp_file,'w') as f:
self._last_write_time = int(time.time()) self._last_write_time = int(time.time())
self._write_database_to_yaml(f) self._write_database_to_yaml(f)
os.rename(temp_name,self._file_path) os.rename(temp_file,self._file_path)
def is_dirty(self): def is_dirty(self):
""" """
@ -184,6 +184,7 @@ def add(self, spec, path):
sph['path']=path sph['path']=path
sph['hash']=spec.dag_hash() sph['hash']=spec.dag_hash()
#Should always already be locked
with Write_Lock_Instance(self.lock,60): with Write_Lock_Instance(self.lock,60):
self.read_database() self.read_database()
self._data.append(sph) self._data.append(sph)
@ -197,6 +198,7 @@ def remove(self, spec):
Searches for and removes the specified spec Searches for and removes the specified spec
Writes the database back to memory Writes the database back to memory
""" """
#Should always already be locked
with Write_Lock_Instance(self.lock,60): with Write_Lock_Instance(self.lock,60):
self.read_database() self.read_database()
@ -237,6 +239,7 @@ def installed_package_specs(self):
Read installed package names from the database Read installed package names from the database
and return their specs and return their specs
""" """
#Should always already be locked
with Read_Lock_Instance(self.lock,60): with Read_Lock_Instance(self.lock,60):
self.read_database() self.read_database()