Expand description

Implementation of the unary RPC protocol as per AptosNet wire protocol v1.

Design:

The unary RPC protocol is implemented here as two independent async completion queues: InboundRpcs and OutboundRpcs.

The InboundRpcs queue is responsible for handling inbound rpc requests off-the-wire, forwarding the request to the application layer, waiting for the application layer’s response, and then enqueuing the rpc response to-be written over-the-wire.

Likewise, the OutboundRpcs queue is responsible for handling outbound rpc requests from the application layer, enqueuing the request for writing onto the wire, waiting for a corresponding rpc response, and then notifying the requestor of the arrived response message.

Both InboundRpcs and OutboundRpcs are owned and driven by the Peer actor. This has a few implications. First, it means that each connection has its own pair of local rpc completion queues; the queues are not shared across connections. Second, the queues don’t do any IO work. They’re purely driven by the owning Peer actor, who calls handle_ methods on new NetworkMessage arrivals and polls for completed rpc requests. The queues also do not write to the wire directly; instead, they’re given a reference to the Peer actor’s write queue, which they can enqueue a new outbound NetworkMessage onto.

Timeouts:

Both inbound and outbound requests have mandatory timeouts. The tasks in the async completion queues are each wrapped in a timeout future, which causes the task to complete with an error if the task isn’t fulfilled before the deadline.

Limits:

We limit the number of pending inbound and outbound RPC tasks to ensure that resource usage is bounded.

Modules

Rpc protocol errors

Structs

A wrapper struct for an inbound rpc request and its associated context.

InboundRpcs handles new inbound rpc requests off the wire, notifies the PeerManager of the new request, and stores the pending response on a queue. If the response eventually completes, InboundRpc records some metrics and enqueues the response message onto the outbound write queue.

A wrapper struct for an outbound rpc request and its associated context.

OutboundRpcs handles new outbound rpc requests made from the application layer.