Work in progress.. Do not read..

High-level overview

Here is a simple diagram that shows the flow of data in the code.

Finding the Right Master

The client first has to find the right master to talk to - the master that holds the required data. To do this, RamCloud::read() invokes ObjectFinder::lookup(). It checks client's tabletMap - which is a cache of coordinator's tablet map. If that tablet is recovering or if the object was not found in any tablet, then the cache is refreshed. This is done by refresher(tabletMap) which is hardwired to CoordinatorClient::getTabletMap in the constructor.

Finally, lookup() returns the SessionRef. SessionRef is a reference to a Session object on which we send client RPC requests. RamCloud::read() uses this to create an instance of the right master and invoking read().

Sending RPC Request

MasterClient::read() creates the RPC Request. The structure for all RPCs is defined in Rpc.h. For Read request, the RPC contains the following fields:

Call to sendRecv() sends request over session and later gets response. sendRecv() is defined in Client.h.

Master Processing

<lookup in HT
Data is at fixed offset from SEH
Length is calculated
Forming response Buffer>

On the other hand:

BUFFER contains:

Client Request Processing

<truncating response>

(TODO: sort / remove)
Other random code-related stuff

RamCloud.cc -> read()

MasterClient.cc -> read()

MasterServer.cc

NOTE about code flow:
When xClient - sendRecv,   ?where x is Coordinator or Master
then xServer - handleRpc<>() -> dispatch() -> callHandler<>() -> ..

Client.h -> sendRecv()

EndNode: What? Why? How?

What: A simple introduction to understanding how a "read" works in RAMCloud based on my current understanding.

Why: For me to refer to later on, and hopefully to serve as a good starting point to other new comers to RAMCloud system.

How: Information deduced from reading code, and asking lot of silly questions to Diego, Ryan; and a few to Stephen, Nandu and Christian.