Sirikata
Public Member Functions | Private Member Functions | Private Attributes | Friends
Sirikata::DistributedCoordinateSegmentation Class Reference

Distributed kd-tree based implementation of CoordinateSegmentation. More...

#include <DistributedCoordinateSegmentation.hpp>

Inheritance diagram for Sirikata::DistributedCoordinateSegmentation:
Collaboration diagram for Sirikata::DistributedCoordinateSegmentation:

List of all members.

Public Member Functions

 DistributedCoordinateSegmentation (CSegContext *ctx, const BoundingBox3f &region, const Vector3ui32 &perdim, int, ServerIDMap *)
virtual ~DistributedCoordinateSegmentation ()
virtual BoundingBoxList serverRegionCached (const ServerID &server)
void getServerRegionUncached (const ServerID &server, boost::shared_ptr< tcp::socket > socket)
virtual BoundingBox3f region ()
virtual uint32 numServers ()
virtual void poll ()
 Override this method to specify the work to be done when polling.
virtual void stop ()
 Stop scheduling this service.
void handleSelfLookup (ServerID my_sid, Address4 my_addr)

Private Member Functions

void service ()
void csegChangeMessage (Sirikata::Protocol::CSeg::ChangeMessage *ccMsg)
void handleLoadReport (boost::shared_ptr< tcp::socket >, Sirikata::Protocol::CSeg::LoadReportMessage *message)
void notifySpaceServersOfChange (const std::vector< SegmentationInfo > segInfoVector)
void startAccepting ()
void startAcceptingLLRequests ()
void accept_handler ()
void acceptLLTreeRequestHandler ()
void generateHierarchicalTrees (SegmentedRegion *region, int depth, int &numLLTreesSoFar)
void subdivideTopLevelRegion (SegmentedRegion *region, Vector3ui32 perdim, int &numServersAssigned)
void callLowerLevelCSEGServer (boost::shared_ptr< tcp::socket > socket, ServerID, const Vector3f &searchVec, const BoundingBox3f &boundingBox, BoundingBox3f &returningBBox)
void callLowerLevelCSEGServersForServerRegions (boost::shared_ptr< tcp::socket > socket, ServerID server_id, BoundingBoxList &)
void sendLoadReportToLowerLevelCSEGServer (boost::shared_ptr< tcp::socket > socket, ServerID, const BoundingBox3f &boundingBox, Sirikata::Protocol::CSeg::LoadReportMessage *message)
void callLowerLevelCSEGServersForLookupBoundingBoxes (boost::shared_ptr< tcp::socket > socket, const BoundingBox3f &bbox, const std::map< ServerID, std::vector< SegmentedRegion * > > &, std::vector< ServerID > &)
void ioServicingLoop ()
void llIOServicingLoop ()
void sendToAllCSEGServers (Sirikata::Protocol::CSeg::CSegMessage &)
void sendOnAllSockets (Sirikata::Protocol::CSeg::CSegMessage csegMessage, std::map< ServerID, SocketContainer > socketList)
void sendToAllSpaceServers (Sirikata::Protocol::CSeg::CSegMessage &)
uint32 getAvailableServerIndex ()
void getRandomLeafParentSibling (SegmentedRegion **randomLeaf, SegmentedRegion **sibling, SegmentedRegion **parent)
void asyncRead (boost::shared_ptr< tcp::socket > socket, uint8 *asyncBufferArray, const boost::system::error_code &ec, std::size_t bytes_transferred)
void asyncLLRead (boost::shared_ptr< tcp::socket > socket, uint8 *asyncBufferArray, const boost::system::error_code &ec, std::size_t bytes_transferred)
void writeCSEGMessage (boost::shared_ptr< tcp::socket > socket, Sirikata::Protocol::CSeg::CSegMessage &csegMessage)
void readCSEGMessage (boost::shared_ptr< tcp::socket > socket, Sirikata::Protocol::CSeg::CSegMessage &csegMessage, uint8 *bufferSoFar, uint32 bufferSoFarSize)
void readCSEGMessage (boost::shared_ptr< tcp::socket > socket, Sirikata::Protocol::CSeg::CSegMessage &csegMessage)
void serializeBSPTree (SerializedBSPTree *serializedBSPTree)
void traverseAndStoreTree (SegmentedRegion *region, uint32 &idx, SerializedBSPTree *serializedTree)
SocketContainer getSocketToCSEGServer (ServerID server_id)
void doSocketCreation (ServerID server_id, std::vector< ServerID > server_id_List, std::map< ServerID, SocketContainer > *socketMapPtr, ResponseCompletionFunction func, ServerID resolved_id, Address4 addy)
void createSocketContainers (std::vector< ServerID > server_id_List, std::map< ServerID, SocketContainer > *socketMap, ResponseCompletionFunction func)
bool handleLookup (Vector3f vector, boost::shared_ptr< tcp::socket > socket)
void lookupOnSocket (boost::shared_ptr< tcp::socket > clientSocket, const Vector3f searchVec, const BoundingBox3f boundingBox, std::map< ServerID, SocketContainer > socketList)
void writeLookupResponse (boost::shared_ptr< tcp::socket > socket, BoundingBox3f &bbox, ServerID sid)
void requestServerRegionsOnSockets (boost::shared_ptr< tcp::socket > socket, ServerID server_id, BoundingBoxList bbList, std::map< ServerID, SocketContainer > socketList)
void writeServerRegionResponse (boost::shared_ptr< tcp::socket > socket, BoundingBoxList boundingBoxlist)
bool handleLookupBBox (const BoundingBox3f &bbox, boost::shared_ptr< tcp::socket > socket)
 Look up server IDs that cover the bounding region specified by bbox.
void lookupBBoxOnSocket (boost::shared_ptr< tcp::socket > clientSocket, const BoundingBox3f boundingBox, std::vector< ServerID > server_ids, std::map< ServerID, std::vector< SegmentedRegion * > > otherCSEGServers, std::map< ServerID, SocketContainer > socketList)
void writeLookupBBoxResponse (boost::shared_ptr< tcp::socket > clientSocket, std::vector< ServerID >)
void sendLoadReportOnSocket (boost::shared_ptr< tcp::socket > clientSocket, BoundingBox3f boundingBox, Sirikata::Protocol::CSeg::LoadReportMessage message, std::map< ServerID, SocketContainer > socketList)

Private Attributes

CSegContextmContext
SegmentedRegion mTopLevelRegion
Time mLastUpdateTime
LoadBalancer mLoadBalancer
std::vector
< SegmentationChangeListener
mSpacePeers
boost::asio::io_service mIOService
boost::asio::io_service mLLIOService
boost::shared_ptr< tcp::acceptor > mAcceptor
boost::shared_ptr< tcp::socket > mSocket
boost::shared_ptr< tcp::acceptor > mLLTreeAcceptor
boost::shared_ptr< tcp::socket > mLLTreeAcceptorSocket
std::map< String,
SegmentedRegion * > 
mHigherLevelTrees
std::map< String,
SegmentedRegion * > 
mLowerLevelTrees
int mAvailableCSEGServers
int mUpperTreeCSEGServers
ServerIDMapmSidMap
std::map< ServerID,
BoundingBoxList > 
mWholeTreeServerRegionMap
std::map< ServerID,
BoundingBoxList > 
mLowerTreeServerRegionMap
boost::shared_mutex mCSEGReadWriteMutex
boost::shared_mutex mSocketsToCSEGServersMutex
std::map< ServerID,
SocketQueuePtr
mLeasedSocketsToCSEGServers

Friends

class LoadBalancer

Detailed Description

Distributed kd-tree based implementation of CoordinateSegmentation.


Constructor & Destructor Documentation

Sirikata::DistributedCoordinateSegmentation::DistributedCoordinateSegmentation ( CSegContext ctx,
const BoundingBox3f &  region,
const Vector3ui32 &  perdim,
int  nservers,
ServerIDMap sidmap 
)
Sirikata::DistributedCoordinateSegmentation::~DistributedCoordinateSegmentation ( ) [virtual]

Member Function Documentation

void Sirikata::DistributedCoordinateSegmentation::accept_handler ( ) [private]

References asyncRead(), mSocket, and startAccepting().

Referenced by startAccepting().

void Sirikata::DistributedCoordinateSegmentation::acceptLLTreeRequestHandler ( ) [private]
void Sirikata::DistributedCoordinateSegmentation::asyncLLRead ( boost::shared_ptr< tcp::socket >  socket,
uint8 *  asyncBufferArray,
const boost::system::error_code &  ec,
std::size_t  bytes_transferred 
) [private]
void Sirikata::DistributedCoordinateSegmentation::asyncRead ( boost::shared_ptr< tcp::socket >  socket,
uint8 *  asyncBufferArray,
const boost::system::error_code &  ec,
std::size_t  bytes_transferred 
) [private]
void Sirikata::DistributedCoordinateSegmentation::callLowerLevelCSEGServer ( boost::shared_ptr< tcp::socket >  socket,
ServerID  server_id,
const Vector3f &  searchVec,
const BoundingBox3f &  boundingBox,
BoundingBox3f &  returningBBox 
) [private]
void Sirikata::DistributedCoordinateSegmentation::callLowerLevelCSEGServersForLookupBoundingBoxes ( boost::shared_ptr< tcp::socket >  socket,
const BoundingBox3f &  bbox,
const std::map< ServerID, std::vector< SegmentedRegion * > > &  csegServers,
std::vector< ServerID > &  spaceServers 
) [private]
void Sirikata::DistributedCoordinateSegmentation::callLowerLevelCSEGServersForServerRegions ( boost::shared_ptr< tcp::socket >  socket,
ServerID  server_id,
BoundingBoxList &  bbList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::createSocketContainers ( std::vector< ServerID >  server_id_List,
std::map< ServerID, SocketContainer > *  socketMap,
ResponseCompletionFunction  func 
) [private]
void Sirikata::DistributedCoordinateSegmentation::csegChangeMessage ( Sirikata::Protocol::CSeg::ChangeMessage *  ccMsg) [private]
void Sirikata::DistributedCoordinateSegmentation::doSocketCreation ( ServerID  server_id,
std::vector< ServerID >  server_id_List,
std::map< ServerID, SocketContainer > *  socketMapPtr,
ResponseCompletionFunction  func,
ServerID  resolved_id,
Address4  addy 
) [private]
void Sirikata::DistributedCoordinateSegmentation::generateHierarchicalTrees ( SegmentedRegion region,
int  depth,
int &  numLLTreesSoFar 
) [private]
uint32 Sirikata::DistributedCoordinateSegmentation::getAvailableServerIndex ( ) [private]
void Sirikata::DistributedCoordinateSegmentation::getRandomLeafParentSibling ( SegmentedRegion **  randomLeaf,
SegmentedRegion **  sibling,
SegmentedRegion **  parent 
) [private]
void Sirikata::DistributedCoordinateSegmentation::getServerRegionUncached ( const ServerID &  server,
boost::shared_ptr< tcp::socket >  socket 
)
SocketContainer Sirikata::DistributedCoordinateSegmentation::getSocketToCSEGServer ( ServerID  server_id) [private]
void Sirikata::DistributedCoordinateSegmentation::handleLoadReport ( boost::shared_ptr< tcp::socket >  socket,
Sirikata::Protocol::CSeg::LoadReportMessage *  message 
) [private]
bool Sirikata::DistributedCoordinateSegmentation::handleLookup ( Vector3f  vector,
boost::shared_ptr< tcp::socket >  socket 
) [private]
bool Sirikata::DistributedCoordinateSegmentation::handleLookupBBox ( const BoundingBox3f &  bbox,
boost::shared_ptr< tcp::socket >  clientSocket 
) [private]

Look up server IDs that cover the bounding region specified by bbox.

The resulting list will eventually be written to the socket specified.

References callLowerLevelCSEGServersForLookupBoundingBoxes(), Sirikata::CSegContext::id(), Sirikata::SegmentedRegion::lookupBoundingBox(), Sirikata::SegmentedRegion::mBoundingBox, mContext, mHigherLevelTrees, mLowerLevelTrees, Sirikata::SegmentedRegion::mServer, mTopLevelRegion, and writeLookupBBoxResponse().

Referenced by asyncRead().

void Sirikata::DistributedCoordinateSegmentation::handleSelfLookup ( ServerID  my_sid,
Address4  my_addr 
)
void Sirikata::DistributedCoordinateSegmentation::ioServicingLoop ( ) [private]

References mIOService.

Referenced by handleSelfLookup().

void Sirikata::DistributedCoordinateSegmentation::llIOServicingLoop ( ) [private]

References mLLIOService.

Referenced by handleSelfLookup().

void Sirikata::DistributedCoordinateSegmentation::lookupBBoxOnSocket ( boost::shared_ptr< tcp::socket >  clientSocket,
const BoundingBox3f  boundingBox,
std::vector< ServerID >  server_ids,
std::map< ServerID, std::vector< SegmentedRegion * > >  otherCSEGServers,
std::map< ServerID, SocketContainer socketList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::lookupOnSocket ( boost::shared_ptr< tcp::socket >  clientSocket,
const Vector3f  searchVec,
const BoundingBox3f  boundingBox,
std::map< ServerID, SocketContainer socketList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::notifySpaceServersOfChange ( const std::vector< SegmentationInfo >  segInfoVector) [private]
uint32 Sirikata::DistributedCoordinateSegmentation::numServers ( ) [virtual]
void Sirikata::DistributedCoordinateSegmentation::poll ( ) [virtual]

Override this method to specify the work to be done when polling.

Implements Sirikata::PollingService.

References service().

void Sirikata::DistributedCoordinateSegmentation::readCSEGMessage ( boost::shared_ptr< tcp::socket >  socket,
Sirikata::Protocol::CSeg::CSegMessage &  csegMessage 
) [private]

References readCSEGMessage().

void Sirikata::DistributedCoordinateSegmentation::readCSEGMessage ( boost::shared_ptr< tcp::socket >  socket,
Sirikata::Protocol::CSeg::CSegMessage &  csegMessage,
uint8 *  bufferSoFar,
uint32  bufferSoFarSize 
) [private]
BoundingBox3f Sirikata::DistributedCoordinateSegmentation::region ( ) [virtual]
void Sirikata::DistributedCoordinateSegmentation::requestServerRegionsOnSockets ( boost::shared_ptr< tcp::socket >  socket,
ServerID  server_id,
BoundingBoxList  bbList,
std::map< ServerID, SocketContainer socketList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::sendLoadReportOnSocket ( boost::shared_ptr< tcp::socket >  clientSocket,
BoundingBox3f  boundingBox,
Sirikata::Protocol::CSeg::LoadReportMessage  message,
std::map< ServerID, SocketContainer socketList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::sendLoadReportToLowerLevelCSEGServer ( boost::shared_ptr< tcp::socket >  socket,
ServerID  cseg_server_id,
const BoundingBox3f &  boundingBox,
Sirikata::Protocol::CSeg::LoadReportMessage *  message 
) [private]
void Sirikata::DistributedCoordinateSegmentation::sendOnAllSockets ( Sirikata::Protocol::CSeg::CSegMessage  csegMessage,
std::map< ServerID, SocketContainer socketList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::sendToAllCSEGServers ( Sirikata::Protocol::CSeg::CSegMessage &  csegMessage) [private]
void Sirikata::DistributedCoordinateSegmentation::sendToAllSpaceServers ( Sirikata::Protocol::CSeg::CSegMessage &  csegMessage) [private]
void Sirikata::DistributedCoordinateSegmentation::serializeBSPTree ( SerializedBSPTree serializedBSPTree) [private]
BoundingBoxList Sirikata::DistributedCoordinateSegmentation::serverRegionCached ( const ServerID &  server) [virtual]
void Sirikata::DistributedCoordinateSegmentation::service ( ) [private]
void Sirikata::DistributedCoordinateSegmentation::startAccepting ( ) [private]
void Sirikata::DistributedCoordinateSegmentation::startAcceptingLLRequests ( ) [private]
void Sirikata::DistributedCoordinateSegmentation::stop ( ) [virtual]

Stop scheduling this service.

Note that this does not immediately stop the service, it simply guarantees the service will not be scheduled again. This allows outstanding events to be handled properly.

Reimplemented from Sirikata::PollingService.

References mIOService, and mLLIOService.

void Sirikata::DistributedCoordinateSegmentation::subdivideTopLevelRegion ( SegmentedRegion region,
Vector3ui32  perdim,
int &  numServersAssigned 
) [private]
void Sirikata::DistributedCoordinateSegmentation::traverseAndStoreTree ( SegmentedRegion region,
uint32 &  idx,
SerializedBSPTree serializedTree 
) [private]
void Sirikata::DistributedCoordinateSegmentation::writeCSEGMessage ( boost::shared_ptr< tcp::socket >  socket,
Sirikata::Protocol::CSeg::CSegMessage &  csegMessage 
) [private]
void Sirikata::DistributedCoordinateSegmentation::writeLookupBBoxResponse ( boost::shared_ptr< tcp::socket >  clientSocket,
std::vector< ServerID >  serverList 
) [private]
void Sirikata::DistributedCoordinateSegmentation::writeLookupResponse ( boost::shared_ptr< tcp::socket >  socket,
BoundingBox3f &  bbox,
ServerID  sid 
) [private]

References writeCSEGMessage().

Referenced by handleLookup(), and lookupOnSocket().

void Sirikata::DistributedCoordinateSegmentation::writeServerRegionResponse ( boost::shared_ptr< tcp::socket >  socket,
BoundingBoxList  boundingBoxlist 
) [private]

Friends And Related Function Documentation

friend class LoadBalancer [friend]

Member Data Documentation

boost::shared_ptr<tcp::acceptor> Sirikata::DistributedCoordinateSegmentation::mAcceptor [private]
boost::shared_ptr<tcp::acceptor> Sirikata::DistributedCoordinateSegmentation::mLLTreeAcceptor [private]
std::map<ServerID, BoundingBoxList > Sirikata::DistributedCoordinateSegmentation::mLowerTreeServerRegionMap [private]

Referenced by createSocketContainers().

boost::shared_ptr<tcp::socket> Sirikata::DistributedCoordinateSegmentation::mSocket [private]

Referenced by accept_handler(), and startAccepting().

Referenced by asyncRead(), and sendToAllSpaceServers().

std::map<ServerID, BoundingBoxList > Sirikata::DistributedCoordinateSegmentation::mWholeTreeServerRegionMap [private]

The documentation for this class was generated from the following files: