Sirikata
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes
Sirikata::Forwarder Class Reference

#include <Forwarder.hpp>

Inheritance diagram for Sirikata::Forwarder:
Collaboration diagram for Sirikata::Forwarder:

List of all members.

Classes

struct  UniqueObjConn

Public Member Functions

 Forwarder (SpaceContext *ctx)
 ~Forwarder ()
void initialize (ObjectSegmentation *oseg, ServerMessageQueue *smq, ServerMessageReceiver *smr, LocationService *loc)
void setODPService (ODP::DelegateService *odp)
void setLocalForwarder (LocalForwarder *lf)
void start ()
void stop ()
virtual Router< Message * > * createServerMessageService (const String &name)
WARN_UNUSED bool tryCacheForward (Sirikata::Protocol::Object::ObjectMessage *msg)
void routeObjectHostMessage (Sirikata::Protocol::Object::ObjectMessage *obj_msg)
void addObjectConnection (const UUID &dest_obj, ObjectConnection *conn)
void enableObjectConnection (const UUID &dest_obj)
ObjectConnectionremoveObjectConnection (const UUID &dest_obj)
ObjectConnectiongetObjectConnection (const UUID &dest_obj)
ObjectConnectiongetObjectConnection (const UUID &dest_obj, uint64 &uniqueconnid)

Private Types

typedef
std::tr1::unordered_map< UUID,
UniqueObjConn, UUID::Hasher
ObjectConnectionMap
typedef std::vector< ServerID > ListServersUpdate
typedef
std::tr1::unordered_map< UUID,
ListServersUpdate,
UUID::Hasher
ObjectServerUpdateMap
typedef std::map< String,
ForwarderServiceQueue::ServiceID
ServiceMap
typedef
std::tr1::unordered_map
< ServerID, ODPFlowScheduler * > 
ODPRouterMap

Private Member Functions

void reportStats ()
void addODPServerMessageService (LocationService *loc)
ODPFlowSchedulercreateODPFlowScheduler (LocationService *loc, ServerID remote_server, uint32 max_size)
void updateServerWeights ()
void receiveMessage (Message *msg)
void receiveObjectRoutingMessage (Message *msg)
void receiveWeightUpdateMessage (Message *msg)
WARN_UNUSED bool forward (Sirikata::Protocol::Object::ObjectMessage *msg, ServerID forwardFrom=NullServerID)
 Try to forward a message to get it closer to the destination object.
void routeObjectMessageToServerNoReturn (Sirikata::Protocol::Object::ObjectMessage *msg, const OSegEntry &dest_serv, OSegLookupQueue::ResolvedFrom resolved_from, ServerID forwardFrom=NullServerID)
WARN_UNUSED bool routeObjectMessageToServer (Sirikata::Protocol::Object::ObjectMessage *msg, const OSegEntry &dest_serv, OSegLookupQueue::ResolvedFrom resolved_from, ServerID forwardFrom=NullServerID)
void dispatchMessage (Sirikata::Protocol::Object::ObjectMessage *msg) const
void handleObjectMessageLoop (Sirikata::Protocol::Object::ObjectMessage *msg) const
virtual MessageserverMessagePull (ServerID dest)
 Invoked when the ServerMessageQueue is ready to accept a message from the sender, destined for the specified server.
virtual bool serverMessageEmpty (ServerID dest)
virtual void serverConnectionReceived (ServerID sid)
virtual void serverMessageReceived (Message *msg)
void scheduleProcessReceivedServerMessages ()
void processReceivedServerMessages ()
virtual void forwarderServiceMessageReady (ServerID dest_server)

Private Attributes

SpaceContextmContext
ForwarderServiceQueuemOutgoingMessages
ServerMessageQueuemServerMessageQueue
ServerMessageReceivermServerMessageReceiver
LocalForwardermLocalForwarder
OSegLookupQueuemOSegLookups
ODP::DelegateServicemDelegateODPService
SST::BaseDatagramLayer
< SpaceObjectReference >::Ptr 
mSSTDatagramLayer
uint64 mUniqueConnIDs
ObjectConnectionMap mObjectConnections
OSegLookupQueue::LookupCallback mNullServerIDOSegCallback
ObjectServerUpdateMap mServersToUpdate
ForwarderServiceQueue::ServiceID mServiceIDSource
ServiceMap mServiceIDMap
Router< Message * > * mOSegCacheUpdateRouter
Router< Message * > * mForwarderWeightRouter
boost::recursive_mutex mODPRouterMapMutex
ODPRouterMap mODPRouters
Poller mServerWeightPoller
boost::mutex mReceivedMessagesMutex
Sirikata::SizedThreadSafeQueue
< Message * > 
mReceivedMessages
Poller mTimeSeriesPoller
Time mLastStatsTime
const String mTimeSeriesForwardedPerSecondName
AtomicValue< uint32 > mForwardedPerSecond
const String mTimeSeriesDroppedPerSecondName
AtomicValue< uint32 > mDroppedPerSecond

Member Typedef Documentation

typedef std::vector<ServerID> Sirikata::Forwarder::ListServersUpdate [private]
typedef std::tr1::unordered_map<UUID, UniqueObjConn, UUID::Hasher> Sirikata::Forwarder::ObjectConnectionMap [private]
typedef std::tr1::unordered_map<ServerID, ODPFlowScheduler*> Sirikata::Forwarder::ODPRouterMap [private]

Constructor & Destructor Documentation

Sirikata::Forwarder::Forwarder ( SpaceContext ctx)
Sirikata::Forwarder::~Forwarder ( )

Member Function Documentation

void Sirikata::Forwarder::addObjectConnection ( const UUID dest_obj,
ObjectConnection conn 
)
void Sirikata::Forwarder::addODPServerMessageService ( LocationService loc) [private]
ODPFlowScheduler * Sirikata::Forwarder::createODPFlowScheduler ( LocationService loc,
ServerID  remote_server,
uint32  max_size 
) [private]
Router< Message * > * Sirikata::Forwarder::createServerMessageService ( const String &  name) [virtual]
void Sirikata::Forwarder::dispatchMessage ( Sirikata::Protocol::Object::ObjectMessage *  msg) const [private]
void Sirikata::Forwarder::enableObjectConnection ( const UUID dest_obj)
bool Sirikata::Forwarder::forward ( Sirikata::Protocol::Object::ObjectMessage *  msg,
ServerID  forwardFrom = NullServerID 
) [private]

Try to forward a message to get it closer to the destination object.

This checks if we have a direct connection to the object, then does an OSeg lookup if necessary.

References Sirikata::Trace::FORWARDING_STARTED, Sirikata::OSegLookupQueue::lookup(), mNullServerIDOSegCallback, mOSegLookups, Sirikata::Trace::OSEG_LOOKUP_STARTED, routeObjectMessageToServerNoReturn(), TIMESTAMP_END, and TIMESTAMP_START.

Referenced by receiveObjectRoutingMessage(), and routeObjectHostMessage().

void Sirikata::Forwarder::forwarderServiceMessageReady ( ServerID  dest_server) [private, virtual]
ObjectConnection * Sirikata::Forwarder::getObjectConnection ( const UUID dest_obj,
uint64 &  uniqueconnid 
)

References mObjectConnections.

ObjectConnection * Sirikata::Forwarder::getObjectConnection ( const UUID dest_obj)
void Sirikata::Forwarder::handleObjectMessageLoop ( Sirikata::Protocol::Object::ObjectMessage *  msg) const [private]

References dispatchMessage().

Referenced by routeObjectMessageToServer().

void Sirikata::Forwarder::initialize ( ObjectSegmentation oseg,
ServerMessageQueue smq,
ServerMessageReceiver smr,
LocationService loc 
)
void Sirikata::Forwarder::processReceivedServerMessages ( ) [private]
void Sirikata::Forwarder::receiveMessage ( Message msg) [private, virtual]
void Sirikata::Forwarder::receiveObjectRoutingMessage ( Message msg) [private]
void Sirikata::Forwarder::receiveWeightUpdateMessage ( Message msg) [private]
ObjectConnection * Sirikata::Forwarder::removeObjectConnection ( const UUID dest_obj)
void Sirikata::Forwarder::reportStats ( ) [private]
void Sirikata::Forwarder::routeObjectHostMessage ( Sirikata::Protocol::Object::ObjectMessage *  obj_msg)
bool Sirikata::Forwarder::routeObjectMessageToServer ( Sirikata::Protocol::Object::ObjectMessage *  msg,
const OSegEntry dest_serv,
OSegLookupQueue::ResolvedFrom  resolved_from,
ServerID  forwardFrom = NullServerID 
) [private]
void Sirikata::Forwarder::routeObjectMessageToServerNoReturn ( Sirikata::Protocol::Object::ObjectMessage *  msg,
const OSegEntry dest_serv,
OSegLookupQueue::ResolvedFrom  resolved_from,
ServerID  forwardFrom = NullServerID 
) [private]

References routeObjectMessageToServer().

Referenced by forward(), and Forwarder().

void Sirikata::Forwarder::scheduleProcessReceivedServerMessages ( ) [private]
void Sirikata::Forwarder::serverConnectionReceived ( ServerID  sid) [private, virtual]

need to take the lock because createODPFlowScheduler will want the lock later but an intervening lock will be taken

Implements Sirikata::ServerMessageReceiver::Listener.

References mODPRouterMapMutex, mOutgoingMessages, and Sirikata::ForwarderServiceQueue::prePush().

bool Sirikata::Forwarder::serverMessageEmpty ( ServerID  dest) [private, virtual]
Message * Sirikata::Forwarder::serverMessagePull ( ServerID  dest) [private, virtual]

Invoked when the ServerMessageQueue is ready to accept a message from the sender, destined for the specified server.

Return NULL if no elements are available.

Implements Sirikata::ServerMessageQueue::Sender.

References CONTEXT_SPACETRACE, Sirikata::Message::dest_server(), Sirikata::Message::id(), mOutgoingMessages, Sirikata::ForwarderServiceQueue::pop(), and Sirikata::Message::serializedSize().

void Sirikata::Forwarder::serverMessageReceived ( Message msg) [private, virtual]
void Sirikata::Forwarder::setLocalForwarder ( LocalForwarder lf) [inline]

References mLocalForwarder.

Referenced by Sirikata::Server::Server().

void Sirikata::Forwarder::setODPService ( ODP::DelegateService odp)
void Sirikata::Forwarder::start ( ) [virtual]
void Sirikata::Forwarder::stop ( ) [virtual]
WARN_UNUSED bool Sirikata::Forwarder::tryCacheForward ( Sirikata::Protocol::Object::ObjectMessage *  msg)
void Sirikata::Forwarder::updateServerWeights ( ) [private]

Member Data Documentation

Referenced by dispatchMessage(), and setODPService().

Referenced by reportStats().

Referenced by forward(), and Forwarder().

boost::recursive_mutex Sirikata::Forwarder::mODPRouterMapMutex [private]

Referenced by start(), and stop().

Referenced by setODPService().

Referenced by reportStats().

Referenced by reportStats().

Referenced by start(), and stop().

Referenced by addObjectConnection().


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