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

SessionManager provides most of the session management functionality for object hosts. More...

#include <SessionManager.hpp>

Inheritance diagram for Sirikata::SessionManager:
Collaboration diagram for Sirikata::SessionManager:

List of all members.

Classes

struct  ConnectingInfo
struct  ConnectionInfo
class  ObjectConnections

Public Types

enum  ConnectionEvent { Connected, Migrated, Disconnected }
typedef std::tr1::function
< void(const SpaceID &, const
ObjectReference &, const
ConnectionInfo &)> 
ConnectedCallback
typedef std::tr1::function
< void(const SpaceID &, const
ObjectReference &, ServerID)> 
MigratedCallback
typedef std::tr1::function
< void(const
SpaceObjectReference
&, ConnectionEvent after)> 
StreamCreatedCallback
typedef std::tr1::function
< void(const
SpaceObjectReference
&, Disconnect::Code)> 
DisconnectedCallback
typedef std::tr1::function
< void(const
Sirikata::Protocol::Object::ObjectMessage &)> 
ObjectMessageCallback
typedef std::tr1::function
< void(const
SpaceObjectReference
&, ServerID)> 
ObjectConnectedCallback
typedef std::tr1::function
< void(const
SpaceObjectReference
&, ServerID, ServerID)> 
ObjectMigratedCallback
typedef std::tr1::function
< void(const
SpaceObjectReference
&, Sirikata::Protocol::Object::ObjectMessage *) 
ObjectMessageHandlerCallback )
typedef std::tr1::function
< void(const
SpaceObjectReference
&, Disconnect::Code)> 
ObjectDisconnectedCallback
typedef SST::Stream
< SpaceObjectReference
SSTStream
typedef SSTStream::Ptr SSTStreamPtr
typedef SSTStream::EndpointType SSTEndpoint
typedef OHDPSST::Stream OHSSTStream
typedef OHSSTStream::Ptr OHSSTStreamPtr
typedef OHDPSST::Endpoint OHSSTEndpoint

Public Member Functions

 SessionManager (ObjectHostContext *ctx, const SpaceID &space, ServerIDMap *sidmap, ObjectConnectedCallback, ObjectMigratedCallback, ObjectMessageHandlerCallback, ObjectDisconnectedCallback)
 ~SessionManager ()
bool connect (const SpaceObjectReference &sporef_objid, const TimedMotionVector3f &init_loc, const TimedMotionQuaternion &init_orient, const BoundingSphere3f &init_bounds, const String &init_mesh, const String &init_phy, const String &init_query, const String &init_zernike, ConnectedCallback connect_cb, MigratedCallback migrate_cb, StreamCreatedCallback stream_cb, DisconnectedCallback disconnected_cb)
 Connect the object to the space with the given starting parameters.
void disconnect (const SpaceObjectReference &id)
 Disconnect the object from the space.
Duration serverTimeOffset () const
 Get offset of server time from client time for the given space.
Duration clientTimeOffset () const
 Get offset of client time from server time for the given space.
bool send (const SpaceObjectReference &sporef_objid, const ObjectMessagePort src_port, const UUID &dest, const ObjectMessagePort dest_port, const std::string &payload, ServerID dest_server=NullServerID)
SSTStreamPtr getSpaceStream (const ObjectReference &objectID)
virtual void start ()
 Start polling this service on this strand at the given maximum rate.
virtual void stop ()
 Stop scheduling this service.
virtual void poll ()
 Override this method to specify the work to be done when polling.

Private Types

typedef
std::tr1::unordered_map
< ServerID,
SpaceNodeConnection * > 
ServerConnectionMap
typedef std::tr1::function
< void(const SpaceID &, const
ObjectReference &, ServerID,
const ConnectingInfo &ci)> 
InternalConnectedCallback

Private Member Functions

void scheduleHandleServerMessages (SpaceNodeConnection *conn)
void handleServerMessages (Liveness::Token alive, SpaceNodeConnection *conn)
void handleServerMessage (ObjectMessage *msg, ServerID sid)
void handleSessionMessage (Sirikata::Protocol::Object::ObjectMessage *msg, ServerID from_server)
void handleSessionMessageConnectResponseSuccess (ServerID from_server, const SpaceObjectReference &sporef_obj, Sirikata::Protocol::Session::Container &session_msg)
void handleSessionMessageConnectResponseRedirect (ServerID from_server, const SpaceObjectReference &sporef_obj, Sirikata::Protocol::Session::Container &session_msg)
void handleSessionMessageConnectResponseError (ServerID from_server, const SpaceObjectReference &sporef_obj, Sirikata::Protocol::Session::Container &session_msg)
void handleSessionMessageInitMigration (ServerID from_server, const SpaceObjectReference &sporef_obj, Sirikata::Protocol::Session::Container &session_msg)
void handleObjectFullyConnected (const SpaceID &space, const ObjectReference &obj, ServerID server, const ConnectingInfo &ci, ConnectedCallback real_cb)
void handleObjectFullyMigrated (const SpaceID &space, const ObjectReference &obj, ServerID server, MigratedCallback real_cb)
void retryOpenConnection (const SpaceObjectReference &sporef_uuid, ServerID sid)
void sendConnectSuccessAck (const SpaceObjectReference &sporef, ServerID connected_to)
void sendDisconnectMessage (const SpaceObjectReference &sporef, ServerID connected_to, uint64 session_seqno)
void sendRetryingMessage (const SpaceObjectReference &sporef_src, const ObjectMessagePort src_port, const UUID &dest, const ObjectMessagePort dest_port, const std::string &payload, ServerID dest_server, Network::IOStrand *strand, const Duration &rate)
void getAnySpaceConnection (SpaceNodeConnection::GotSpaceConnectionCallback cb)
 SpaceNodeConnection initiation.
void getSpaceConnection (ServerID sid, SpaceNodeConnection::GotSpaceConnectionCallback cb)
bool getExistingSpaceConnection (ServerID sid, SpaceNodeConnection::GotSpaceConnectionCallback cb)
void setupSpaceConnection (ServerID server, SpaceNodeConnection::GotSpaceConnectionCallback cb)
void finishSetupSpaceConnection (ServerID server, ServerID resolved_server, Address4 addr)
void setupRandomSpaceConnection (ServerID resolved_server, Address4 addr, SpaceNodeConnection::GotSpaceConnectionCallback cb)
void registerSpaceNodeConnection (ServerID server, SpaceNodeConnection::GotSpaceConnectionCallback cb)
void handleSpaceConnection (const Sirikata::Network::Stream::ConnectionStatus status, const std::string &reason, ServerID sid)
void handleSpaceSession (ServerID sid, SpaceNodeConnection *conn)
void openConnectionStartSession (const SpaceObjectReference &sporef_uuid, SpaceNodeConnection *conn, bool is_retry)
 Object session initiation.
void checkConnectedAndRetry (const SpaceObjectReference &sporef_uuid, ServerID connTo)
void migrate (const SpaceObjectReference &sporef_obj_id, ServerID sid)
 Object session migration.
void openConnectionStartMigration (const SpaceObjectReference &sporef_uuid, ServerID sid, SpaceNodeConnection *conn)
OHDP::DelegatePortcreateDelegateOHDPPort (OHDP::DelegateService *, const OHDP::Endpoint &ept)
 Time Sync related utilities.
bool delegateOHDPPortSend (const OHDP::Endpoint &source_ep, const OHDP::Endpoint &dest_ep, MemoryReference payload)
void timeSyncUpdated ()
void spaceConnectCallback (int err, SSTStreamPtr s, SpaceObjectReference obj, ConnectionEvent after)

Private Attributes

OptionSetmStreamOptions
ObjectHostContextmContext
SpaceID mSpace
Network::IOStrandmIOStrand
ServerIDMapmServerIDMap
TimeProfiler::StagemHandleReadProfiler
TimeProfiler::StagemHandleMessageProfiler
Sirikata::SerializationCheck mSerialization
ObjectConnectedCallback mObjectConnectedCallback
ObjectMigratedCallback mObjectMigratedCallback
ObjectMessageHandlerCallback mObjectMessageHandlerCallback
ObjectDisconnectedCallback mObjectDisconnectedCallback
ServerConnectionMap mConnections
ServerConnectionMap mConnectingConnections
ObjectConnections mObjectConnections
TimeSyncClientmTimeSyncClient
bool mShuttingDown
std::map< ObjectReference,
SSTStreamPtr
mObjectToSpaceStreams

Friends

class ObjectConnections

Detailed Description

SessionManager provides most of the session management functionality for object hosts.

It uses internal object host IDs (UUIDs) to track objects requests and open sessions, and also handles migrating connections between space servers.

SessionManager is also an OHDP::Service, allowing communication with individual space servers (e.g. used internally for time sync). It is also exposed so other services can communicate directly with space servers.


Member Typedef Documentation

typedef std::tr1::function<void(const SpaceID&, const ObjectReference&, const ConnectionInfo&)> Sirikata::SessionManager::ConnectedCallback
typedef std::tr1::function<void(const SpaceID&, const ObjectReference&, ServerID, const ConnectingInfo& ci)> Sirikata::SessionManager::InternalConnectedCallback [private]
typedef std::tr1::function<void(const SpaceID&, const ObjectReference&, ServerID)> Sirikata::SessionManager::MigratedCallback
typedef std::tr1::function<void(const SpaceObjectReference&,ServerID)> Sirikata::SessionManager::ObjectConnectedCallback
typedef std::tr1::function<void(const Sirikata::Protocol::Object::ObjectMessage&)> Sirikata::SessionManager::ObjectMessageCallback
typedef std::tr1::function<void(const SpaceObjectReference&, Sirikata::Protocol::Object::ObjectMessage*) Sirikata::SessionManager::ObjectMessageHandlerCallback)
typedef std::tr1::function<void(const SpaceObjectReference&,ServerID,ServerID)> Sirikata::SessionManager::ObjectMigratedCallback
typedef std::tr1::unordered_map<ServerID, SpaceNodeConnection*> Sirikata::SessionManager::ServerConnectionMap [private]

Member Enumeration Documentation

Enumerator:
Connected 
Migrated 
Disconnected 

Constructor & Destructor Documentation

Sirikata::SessionManager::SessionManager ( ObjectHostContext ctx,
const SpaceID space,
ServerIDMap sidmap,
ObjectConnectedCallback  conn_cb,
ObjectMigratedCallback  mig_cb,
ObjectMessageHandlerCallback  msg_cb,
ObjectDisconnectedCallback  disconn_cb 
)
Sirikata::SessionManager::~SessionManager ( )

Member Function Documentation

void Sirikata::SessionManager::checkConnectedAndRetry ( const SpaceObjectReference sporef_uuid,
ServerID  connTo 
) [private]
Duration Sirikata::SessionManager::clientTimeOffset ( ) const

Get offset of client time from server time for the given space.

Should only be called by objects with an active connection to that space. This is just a utility, is always -serverTimeOffset().

References mTimeSyncClient, Sirikata::TimeSyncClient::offset(), and Sirikata::TimeSyncClient::valid().

bool Sirikata::SessionManager::connect ( const SpaceObjectReference sporef_objid,
const TimedMotionVector3f init_loc,
const TimedMotionQuaternion init_orient,
const BoundingSphere3f &  init_bounds,
const String &  init_mesh,
const String &  init_phy,
const String &  init_query,
const String &  init_zernike,
ConnectedCallback  connect_cb,
MigratedCallback  migrate_cb,
StreamCreatedCallback  stream_cb,
DisconnectedCallback  disconnected_cb 
)
OHDP::DelegatePort * Sirikata::SessionManager::createDelegateOHDPPort ( OHDP::DelegateService ,
const OHDP::Endpoint ept 
) [private]

Time Sync related utilities.

References delegateOHDPPortSend().

bool Sirikata::SessionManager::delegateOHDPPortSend ( const OHDP::Endpoint source_ep,
const OHDP::Endpoint dest_ep,
MemoryReference  payload 
) [private]
void Sirikata::SessionManager::disconnect ( const SpaceObjectReference id)
void Sirikata::SessionManager::finishSetupSpaceConnection ( ServerID  server,
ServerID  resolved_server,
Address4  addr 
) [private]
void Sirikata::SessionManager::getAnySpaceConnection ( SpaceNodeConnection::GotSpaceConnectionCallback  cb) [private]
bool Sirikata::SessionManager::getExistingSpaceConnection ( ServerID  sid,
SpaceNodeConnection::GotSpaceConnectionCallback  cb 
) [private]
void Sirikata::SessionManager::getSpaceConnection ( ServerID  sid,
SpaceNodeConnection::GotSpaceConnectionCallback  cb 
) [private]
SessionManager::SSTStreamPtr Sirikata::SessionManager::getSpaceStream ( const ObjectReference objectID)

References mObjectToSpaceStreams.

void Sirikata::SessionManager::handleObjectFullyConnected ( const SpaceID space,
const ObjectReference obj,
ServerID  server,
const ConnectingInfo ci,
ConnectedCallback  real_cb 
) [private]
void Sirikata::SessionManager::handleObjectFullyMigrated ( const SpaceID space,
const ObjectReference obj,
ServerID  server,
MigratedCallback  real_cb 
) [private]
void Sirikata::SessionManager::handleServerMessage ( ObjectMessage msg,
ServerID  sid 
) [private]
void Sirikata::SessionManager::handleServerMessages ( Liveness::Token  alive,
SpaceNodeConnection conn 
) [private]
void Sirikata::SessionManager::handleSessionMessage ( Sirikata::Protocol::Object::ObjectMessage *  msg,
ServerID  from_server 
) [private]
void Sirikata::SessionManager::handleSessionMessageConnectResponseError ( ServerID  from_server,
const SpaceObjectReference sporef_obj,
Sirikata::Protocol::Session::Container &  session_msg 
) [private]
void Sirikata::SessionManager::handleSessionMessageConnectResponseRedirect ( ServerID  from_server,
const SpaceObjectReference sporef_obj,
Sirikata::Protocol::Session::Container &  session_msg 
) [private]
void Sirikata::SessionManager::handleSessionMessageConnectResponseSuccess ( ServerID  from_server,
const SpaceObjectReference sporef_obj,
Sirikata::Protocol::Session::Container &  session_msg 
) [private]
void Sirikata::SessionManager::handleSessionMessageInitMigration ( ServerID  from_server,
const SpaceObjectReference sporef_obj,
Sirikata::Protocol::Session::Container &  session_msg 
) [private]
void Sirikata::SessionManager::handleSpaceConnection ( const Sirikata::Network::Stream::ConnectionStatus  status,
const std::string &  reason,
ServerID  sid 
) [private]
void Sirikata::SessionManager::handleSpaceSession ( ServerID  sid,
SpaceNodeConnection conn 
) [private]
void Sirikata::SessionManager::migrate ( const SpaceObjectReference sporef_obj_id,
ServerID  sid 
) [private]
void Sirikata::SessionManager::openConnectionStartMigration ( const SpaceObjectReference sporef_uuid,
ServerID  sid,
SpaceNodeConnection conn 
) [private]
void Sirikata::SessionManager::openConnectionStartSession ( const SpaceObjectReference sporef_uuid,
SpaceNodeConnection conn,
bool  is_retry 
) [private]

Object session initiation.

References Sirikata::SessionManager::ConnectingInfo::bounds, checkConnectedAndRetry(), Sirikata::SessionManager::ObjectConnections::connectingTo(), Sirikata::Logging::detailed, Sirikata::ObjectReference::getAsUUID(), Sirikata::SessionManager::ObjectConnections::getConnectCallback(), Sirikata::SessionManager::ObjectConnections::getSeqno(), Sirikata::SessionManager::ConnectingInfo::loc, Sirikata::Context::mainStrand, mContext, Sirikata::SessionManager::ConnectingInfo::mesh, mObjectConnections, mSerialization, mSpace, Sirikata::UUID::null(), Sirikata::ObjectReference::null(), Sirikata::SpaceObjectReference::object(), OBJECT_PORT_SESSION, Sirikata::SessionManager::ConnectingInfo::orient, Sirikata::SessionManager::ConnectingInfo::physics, Sirikata::TimedMotionQuaternion::position(), Sirikata::TimedMotionVector< MotionVectorType >::position(), Sirikata::Network::IOStrand::post(), Sirikata::SessionManager::ConnectingInfo::query, retryOpenConnection(), send(), Sirikata::serializePBJMessage(), Sirikata::SpaceNodeConnection::server(), SESSION_LOG, Sirikata::SessionManager::ObjectConnections::updateSeqno(), Sirikata::TimedMotionQuaternion::updateTime(), Sirikata::TimedMotionVector< MotionVectorType >::updateTime(), Sirikata::TimedMotionQuaternion::velocity(), Sirikata::TimedMotionVector< MotionVectorType >::velocity(), Sirikata::Logging::warn, and Sirikata::SessionManager::ConnectingInfo::zernike.

Referenced by checkConnectedAndRetry(), connect(), handleSessionMessageConnectResponseRedirect(), and retryOpenConnection().

void Sirikata::SessionManager::poll ( ) [virtual]

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

Implements Sirikata::PollingService.

References mContext, Sirikata::Trace::TimeSeries::report(), and Sirikata::Context::timeSeries.

void Sirikata::SessionManager::registerSpaceNodeConnection ( ServerID  server,
SpaceNodeConnection::GotSpaceConnectionCallback  cb 
) [private]
void Sirikata::SessionManager::retryOpenConnection ( const SpaceObjectReference sporef_uuid,
ServerID  sid 
) [private]
void Sirikata::SessionManager::scheduleHandleServerMessages ( SpaceNodeConnection conn) [private]
bool Sirikata::SessionManager::send ( const SpaceObjectReference sporef_objid,
const ObjectMessagePort  src_port,
const UUID dest,
const ObjectMessagePort  dest_port,
const std::string &  payload,
ServerID  dest_server = NullServerID 
)
void Sirikata::SessionManager::sendConnectSuccessAck ( const SpaceObjectReference sporef,
ServerID  connected_to 
) [private]
void Sirikata::SessionManager::sendDisconnectMessage ( const SpaceObjectReference sporef,
ServerID  connected_to,
uint64  session_seqno 
) [private]
void Sirikata::SessionManager::sendRetryingMessage ( const SpaceObjectReference sporef_src,
const ObjectMessagePort  src_port,
const UUID dest,
const ObjectMessagePort  dest_port,
const std::string &  payload,
ServerID  dest_server,
Network::IOStrand strand,
const Duration rate 
) [private]
Duration Sirikata::SessionManager::serverTimeOffset ( ) const

Get offset of server time from client time for the given space.

Should only be called by objects with an active connection to that space.

References mTimeSyncClient, Sirikata::TimeSyncClient::offset(), and Sirikata::TimeSyncClient::valid().

void Sirikata::SessionManager::setupRandomSpaceConnection ( ServerID  resolved_server,
Address4  addr,
SpaceNodeConnection::GotSpaceConnectionCallback  cb 
) [private]
void Sirikata::SessionManager::setupSpaceConnection ( ServerID  server,
SpaceNodeConnection::GotSpaceConnectionCallback  cb 
) [private]
void Sirikata::SessionManager::spaceConnectCallback ( int  err,
SSTStreamPtr  s,
SpaceObjectReference  obj,
ConnectionEvent  after 
) [private]
void Sirikata::SessionManager::start ( ) [virtual]

Start polling this service on this strand at the given maximum rate.

Reimplemented from Sirikata::PollingService.

Referenced by Sirikata::ObjectHost::addServerIDMap().

void Sirikata::SessionManager::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 mConnections, mShuttingDown, and Sirikata::SpaceNodeConnection::shutdown().

Referenced by Sirikata::ObjectHost::stop().

void Sirikata::SessionManager::timeSyncUpdated ( ) [private]

Friends And Related Function Documentation

friend class ObjectConnections [friend]

Member Data Documentation

Referenced by handleServerMessage().


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