Components
Caller
Description
This component is responsible for orchestrating the rendezvous of nandos and data, and for initiating nando execution by appropriately notifying the target node’s Scheduler. This is the entry point into the runtime after a nando invocation.
External API
TODO
Implementation Notes
TODO (use this for internal implementation details, as well as the cutting room floor for what is excluded from the PoC)
Oracle
Description
This component is responsible for keeping track of (at least) object locations across the cluster and answering placement questions from the scheduler.
External API
input: list of object/code references. output: list of pairs (object/code references, location)
Implementation Notes
TODO (use this for internal implementation details, as well as the cutting room floor for what is excluded from the PoC)
Scheduler
Description
The scheduler is responsible for figuring out the appropriate activation site (i.e. target host) for a nando, based on the current locations and activity of the nando’s object dependencies and the present state of the cluster (resource availability, etc.).
External API
input: list of object/location pairs * ownership module * cluster state, output: location of executor NOTE no cluster state for initial cut
Implementation Notes
TODO (use this for internal implementation details, as well as the cutting room floor for what is excluded from the PoC)
Ownership Tracker
Description
This module is meant to track logical ownership. (NOTE(achilles) It remains to be seen if this needs to be an independent module or if it should somehow be merged into the scheduler and/or oracle).[f]
External API
Two APIs:
- check ownership =
- input: list of data references.
- output: list of (data references * owner) pairs
- change ownership =
- input: list of (data references * new owner pairs).
- output: bool
Implementation Notes
TODO (use this for internal implementation details, as well as the cutting room floor for what is excluded from the PoC)
To atomically transfer ownership of an object from one host to another will (probably; at least in v0) require synchronization with the Execution Engine. In particular, consider the following scenario:
Host A invokes "change ownership" to move ownership of object O to host B. Object C is the current owner, and is currently running a nando on O. There are also enqueued nandos for O on C. There are a number of options here (abort, block, long block (all enqueued items), work stealing, etc, etc). But it seems important that C communicates with the OT!
Another option would be to not bother, let all that fate-shared work continue, and "fence off" the result, but this requires additional mechanism and could waste arbitrary work under contention.
Execution Engine
Description
The nando execution engine. Block until we have the data and code, run the code, return result to continuation
External API
TODO
Implementation Notes
TODO (use this for internal implementation details, as well as the cutting room floor for what is excluded from the PoC)
Component Interaction
TODO: activity diagram
Evaluation
TODO