performance: spack spec
should use a read transacction with -I
`spack spec -I` queries the database for installation status and should use a read transaction around calls to `Spec.tree()`.
This commit is contained in:
parent
cbf8553406
commit
5bdba98837
@ -6,6 +6,7 @@
|
|||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
import contextlib
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import llnl.util.tty as tty
|
import llnl.util.tty as tty
|
||||||
@ -14,6 +15,7 @@
|
|||||||
import spack.cmd
|
import spack.cmd
|
||||||
import spack.cmd.common.arguments as arguments
|
import spack.cmd.common.arguments as arguments
|
||||||
import spack.spec
|
import spack.spec
|
||||||
|
import spack.store
|
||||||
import spack.hash_types as ht
|
import spack.hash_types as ht
|
||||||
|
|
||||||
description = "show what would be installed, given a spec"
|
description = "show what would be installed, given a spec"
|
||||||
@ -45,6 +47,14 @@ def setup_parser(subparser):
|
|||||||
'specs', nargs=argparse.REMAINDER, help="specs of packages")
|
'specs', nargs=argparse.REMAINDER, help="specs of packages")
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def nullcontext():
|
||||||
|
"""Empty context manager.
|
||||||
|
TODO: replace with contextlib.nullcontext() if we ever require python 3.7.
|
||||||
|
"""
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
def spec(parser, args):
|
def spec(parser, args):
|
||||||
name_fmt = '{namespace}.{name}' if args.namespaces else '{name}'
|
name_fmt = '{namespace}.{name}' if args.namespaces else '{name}'
|
||||||
fmt = '{@version}{%compiler}{compiler_flags}{variants}{arch=architecture}'
|
fmt = '{@version}{%compiler}{compiler_flags}{variants}{arch=architecture}'
|
||||||
@ -57,6 +67,12 @@ def spec(parser, args):
|
|||||||
'status_fn': install_status_fn if args.install_status else None
|
'status_fn': install_status_fn if args.install_status else None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# use a read transaction if we are getting install status for every
|
||||||
|
# spec in the DAG. This avoids repeatedly querying the DB.
|
||||||
|
tree_context = nullcontext
|
||||||
|
if args.install_status:
|
||||||
|
tree_context = spack.store.db.read_transaction
|
||||||
|
|
||||||
if not args.specs:
|
if not args.specs:
|
||||||
tty.die("spack spec requires at least one spec")
|
tty.die("spack spec requires at least one spec")
|
||||||
|
|
||||||
@ -73,13 +89,14 @@ def spec(parser, args):
|
|||||||
print(spec.to_json(hash=ht.build_hash))
|
print(spec.to_json(hash=ht.build_hash))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
kwargs['hashes'] = False # Always False for input spec
|
with tree_context():
|
||||||
print("Input spec")
|
kwargs['hashes'] = False # Always False for input spec
|
||||||
print("--------------------------------")
|
print("Input spec")
|
||||||
print(spec.tree(**kwargs))
|
print("--------------------------------")
|
||||||
|
print(spec.tree(**kwargs))
|
||||||
|
|
||||||
kwargs['hashes'] = args.long or args.very_long
|
kwargs['hashes'] = args.long or args.very_long
|
||||||
print("Concretized")
|
print("Concretized")
|
||||||
print("--------------------------------")
|
print("--------------------------------")
|
||||||
spec.concretize()
|
spec.concretize()
|
||||||
print(spec.tree(**kwargs))
|
print(spec.tree(**kwargs))
|
||||||
|
Loading…
Reference in New Issue
Block a user