...
Code Block |
---|
title | Listing 2: Aggregation using a callback in MasterServer.cc that gets invoked via objectMap.forEach() |
---|
|
/**
* Aggregation Callback
*/
void
aggregateCallback(LogEntryHandle handle, uint8_t type,
void *cookie)
{
const Object* obj = handle->userData<Object>();
MasterServer *server = reinterpret_cast<MasterServer*>(cookie);
int *p;
p = (int*) obj->data;
server->sum += (uint64_t)*p;
}
|
Code Block |
---|
title | Listing 2: Aggregation via Log Traversal |
---|
|
//**
* Aggregation via traversing all SegmentEntries throughout the entire Log
*/
uint64_t
Log::aggregate()
{
uint64_t sum = 0;
//Iterate over all Segments in the Log
foreach (ActiveIdMap::value_type& idSegmentPair, activeIdMap) {
Segment* segment = idSegmentPair.second;
//Iterate over all SegmentEntries in a Segment
for (SegmentIterator i(segment); !i.isDone(); i.next()) {
SegmentEntryHandle seh = i.getHandle();
//Check that it is an Object
if (seh->type()==560620143) {
const Object* obj = seh->userData<Object>();
int *p;
p = (int*) obj->data;
sum += *p;
}
}
}
return sum;
}
|
Benchmarking
The benchmarks below have been executed using separate machines (out of the Stanford RAMCloud cluster) for client and server which are connected via Infiniband. After each run, the equality of the client-side and server-side calculated sum has been checked. This particular benchmark allows the following conclusions:
...