View Source Handoff (Handoff v0.1.0)
Handoff is a library for building and executing Directed Acyclic Graphs (DAGs) of functions.
It provides tools for defining computation graphs, managing resources, and executing the graphs in a distributed environment.
Link to this section Summary
Functions
Discovers and registers nodes in the cluster with their capabilities.
Executes all functions in a DAG, respecting dependencies.
Executes all functions in a DAG across multiple nodes, respecting dependencies.
Executes all functions in a DAG strictly on the local node, bypassing resource allocation
and ensuring all functions have node set to Node.self() and cost set to nil.
Retrieves a value from the local store only for a specific DAG.
Retrieves a result for a specific DAG, automatically fetching it from its origin node if necessary.
Retrieves a value for a specific DAG, with automatic remote fetching if needed.
Looks up where a data item (argument or result) is stored for a specific DAG.
Creates a new DAG instance.
Registers the location of a data item (argument or result) for a specific DAG.
Registers the local node with its capabilities for distributed execution.
Registers a node with its resource capabilities.
Checks if the specified node has the required resources available.
Starts the Handoff supervision tree.
Stores a function result locally on the origin node for a specific DAG and registers its location. The result is stored only on the node where it was produced, not broadcast.
Directly stores a value in the local store for a specific DAG.
Link to this section Functions
Discovers and registers nodes in the cluster with their capabilities.
returns
Returns
{:ok, discovered}with a map of node names to their capabilities
Executes all functions in a DAG, respecting dependencies.
parameters
Parameters
- dag: The DAG to execute
- opts: Optional execution settings
- :allocation_strategy - Strategy for allocating functions to nodes (:first_available or :load_balanced, defaults to :first_available)
returns
Returns
{:ok, %{dag_id: dag_id, results: results_map}}with the DAG ID and a map of function IDs to results on success{:error, reason}on failure
Executes all functions in a DAG across multiple nodes, respecting dependencies.
parameters
Parameters
- dag: The DAG to execute
- opts: Optional execution settings
- :allocation_strategy - Strategy for allocating functions to nodes (:first_available or :load_balanced, defaults to :first_available)
- :max_retries - Maximum number of times to retry failed functions (default: 3)
returns
Returns
{:ok, %{dag_id: dag_id, results: results_map}}with the DAG ID and a map of function IDs to results on success{:error, reason}on failure
Executes all functions in a DAG strictly on the local node, bypassing resource allocation
and ensuring all functions have node set to Node.self() and cost set to nil.
This is useful for ensuring local execution regardless of global configuration or function definitions.
parameters
Parameters
- dag: The DAG to execute
- opts: Optional execution settings (passed to
Handoff.DistributedExecutor)
returns
Returns
- Same as
Handoff.execute/2.
Retrieves a value from the local store only for a specific DAG.
parameters
Parameters
- dag_id: The ID of the DAG
- id: The ID of the value to retrieve
returns
Returns
{:ok, value}if found locally{:error, :not_found}if not found
Retrieves a result for a specific DAG, automatically fetching it from its origin node if necessary.
parameters
Parameters
- dag_id: The ID of the DAG
- id: The ID of the result/argument to retrieve
- timeout: Maximum time to wait in milliseconds, defaults to 5000
returns
Returns
{:ok, result}on success{:error, :timeout}if the result is not available within the timeout
Retrieves a value for a specific DAG, with automatic remote fetching if needed.
parameters
Parameters
dag_id: The ID of the DAGid: The ID of the value to retrievefrom_node: Optional specific node to fetch from
returns
Returns
{:ok, value}if found or successfully fetched{:error, reason}if retrieval failed
Looks up where a data item (argument or result) is stored for a specific DAG.
parameters
Parameters
dag_id: The ID of the DAGdata_id: The ID of the data to look up
returns
Returns
{:ok, node_id}if the data location is found{:error, :not_found}if the data location is not registered
Creates a new DAG instance.
Registers the location of a data item (argument or result) for a specific DAG.
parameters
Parameters
- dag_id: The ID of the DAG
- data_id: The ID of the data
- node_id: The node where the data is stored
Registers the local node with its capabilities for distributed execution.
parameters
Parameters
- caps: Map of capabilities provided by this node
example
Example
Handoff.register_local_node(%{cpu: 8, memory: 16000})
Registers a node with its resource capabilities.
parameters
Parameters
- node: The node to register
- caps: Map of capabilities/resources the node provides
example
Example
Handoff.register_node(Node.self(), %{cpu: 4, memory: 8000})
Checks if the specified node has the required resources available.
parameters
Parameters
- node: The node to check
- req: Map of resource requirements to check
returns
Returns
- true if resources are available
- false otherwise
example
Example
Handoff.resources_available?(Node.self(), %{cpu: 2, memory: 4000})
Starts the Handoff supervision tree.
Must be called before executing any DAGs.
store_result(dag_id, function_id, result, origin_node \\ Node.self())
View SourceStores a function result locally on the origin node for a specific DAG and registers its location. The result is stored only on the node where it was produced, not broadcast.
parameters
Parameters
- dag_id: The ID of the DAG
- function_id: The ID of the function
- result: The result to store
- origin_node: The node where the result was produced (defaults to current node)
Directly stores a value in the local store for a specific DAG.
parameters
Parameters
- dag_id: The ID of the DAG
- id: The ID of the value
- value: The value to store