Skip to content

Commit

Permalink
Differentiate TransitiveHydratedTargets from HydratedTargets, and req…
Browse files Browse the repository at this point in the history
…uest the latter in the SourceMapper
  • Loading branch information
stuhood committed Mar 13, 2018
1 parent d5c5bcf commit f719dd6
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
7 changes: 4 additions & 3 deletions src/python/pants/bin/engine_initializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
from pants.engine.fs import create_fs_rules
from pants.engine.isolated_process import create_process_rules
from pants.engine.legacy.address_mapper import LegacyAddressMapper
from pants.engine.legacy.graph import HydratedTargets, LegacyBuildGraph, create_legacy_graph_tasks
from pants.engine.legacy.graph import (LegacyBuildGraph, TransitiveHydratedTargets,
create_legacy_graph_tasks)
from pants.engine.legacy.parser import LegacyPythonCallbacksParser
from pants.engine.legacy.structs import (GoTargetAdaptor, JavaLibraryAdaptor, JunitTestsAdaptor,
JvmAppAdaptor, PythonLibraryAdaptor, PythonTargetAdaptor,
Expand Down Expand Up @@ -75,7 +76,7 @@ class LegacyGraphHelper(namedtuple('LegacyGraphHelper', ['scheduler', 'symbol_ta
"""A container for the components necessary to construct a legacy BuildGraph facade."""

def warm_product_graph(self, target_roots):
"""Warm the scheduler's `ProductGraph` with `HydratedTargets` products.
"""Warm the scheduler's `ProductGraph` with `TransitiveHydratedTargets` products.
:param TargetRoots target_roots: The targets root of the request.
"""
Expand All @@ -86,7 +87,7 @@ def warm_product_graph(self, target_roots):
subjects = target_roots.specs
else:
raise ValueError('Unexpected TargetRoots type: `{}`.'.format(target_roots))
request = self.scheduler.execution_request([HydratedTargets], subjects)
request = self.scheduler.execution_request([TransitiveHydratedTargets], subjects)
result = self.scheduler.execute(request)
if result.error:
raise result.error
Expand Down
38 changes: 28 additions & 10 deletions src/python/pants/engine/legacy/graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class _DestWrapper(datatype('DestWrapper', ['target_types'])):
class LegacyBuildGraph(BuildGraph):
"""A directed acyclic graph of Targets and dependencies. Not necessarily connected.
This implementation is backed by a Scheduler that is able to resolve HydratedTargets.
This implementation is backed by a Scheduler that is able to resolve TransitiveHydratedTargets.
"""

class InvalidCommandLineSpecError(AddressLookupError):
Expand All @@ -67,7 +67,7 @@ def create(cls, scheduler, symbol_table):
def __init__(self, scheduler, target_types):
"""Construct a graph given a Scheduler, Engine, and a SymbolTable class.
:param scheduler: A Scheduler that is configured to be able to resolve HydratedTargets.
:param scheduler: A Scheduler that is configured to be able to resolve TransitiveHydratedTargets.
:param symbol_table: A SymbolTable instance used to instantiate Target objects. Must match
the symbol table installed in the scheduler (TODO: see comment in `_instantiate_target`).
"""
Expand All @@ -89,7 +89,7 @@ def _index(self, roots):

# Index the ProductGraph.
for product in roots:
# We have a successful HydratedTargets value (for a particular input Spec).
# We have a successful TransitiveHydratedTargets value (for a particular input Spec).
for hydrated_target in product.dependencies:
target_adaptor = hydrated_target.adaptor
address = target_adaptor.address
Expand Down Expand Up @@ -256,7 +256,7 @@ def _inject_addresses(self, subjects):
logger.debug('Injecting addresses to %s: %s', self, subjects)
with self._resolve_context():
addresses = tuple(subjects)
hydrated_targets = self._scheduler.product_request(HydratedTargets,
hydrated_targets = self._scheduler.product_request(TransitiveHydratedTargets,
[BuildFileAddresses(addresses)])

self._index(hydrated_targets)
Expand All @@ -274,10 +274,10 @@ def _inject_specs(self, subjects):
"""
logger.debug('Injecting specs to %s: %s', self, subjects)
with self._resolve_context():
product_results = self._scheduler.products_request([HydratedTargets, BuildFileAddresses],
product_results = self._scheduler.products_request([TransitiveHydratedTargets, BuildFileAddresses],
subjects)

self._index(product_results[HydratedTargets])
self._index(product_results[TransitiveHydratedTargets])

yielded_addresses = set()
for subject, product in zip(subjects, product_results[BuildFileAddresses]):
Expand All @@ -293,7 +293,7 @@ def _inject_specs(self, subjects):
class HydratedTarget(datatype('HydratedTarget', ['address', 'adaptor', 'dependencies'])):
"""A wrapper for a fully hydrated TargetAdaptor object.
Transitive graph walks collect ordered sets of HydratedTargets which involve a huge amount
Transitive graph walks collect ordered sets of TransitiveHydratedTargets which involve a huge amount
of hashing: we implement eq/hash via direct usage of an Address field to speed that up.
"""

Expand All @@ -313,12 +313,29 @@ def __hash__(self):
return hash(self.address)


HydratedTargets = Collection.of(HydratedTarget)
class TransitiveHydratedTargets(Collection.of(HydratedTarget)):
"""A transitive set of HydratedTarget objects."""


@rule(HydratedTargets, [SelectTransitive(HydratedTarget, BuildFileAddresses, field_types=(Address,), field='addresses')])
class HydratedTargets(Collection.of(HydratedTarget)):
"""An intransitive set of HydratedTarget objects."""


@rule(TransitiveHydratedTargets, [SelectTransitive(HydratedTarget,
BuildFileAddresses,
field_types=(Address,),
field='addresses')])
def transitive_hydrated_targets(targets):
"""Recursively requests HydratedTargets, which will result in an eager, transitive graph walk."""
"""Recursively requests HydratedTarget instances, which will result in an eager, transitive graph walk."""
return TransitiveHydratedTargets(targets)


@rule(HydratedTargets, [SelectDependencies(HydratedTarget,
BuildFileAddresses,
field_types=(Address,),
field='addresses')])
def hydrated_targets(targets):
"""Requests HydratedTarget instances."""
return HydratedTargets(targets)


Expand Down Expand Up @@ -391,6 +408,7 @@ def create_legacy_graph_tasks(symbol_table):
symbol_table_constraint = symbol_table.constraint()
return [
transitive_hydrated_targets,
hydrated_targets,
TaskRule(
HydratedTarget,
[Select(symbol_table_constraint),
Expand Down

0 comments on commit f719dd6

Please sign in to comment.