uint32_t ObjectStore::mapObjectNB( Object* object, const base::UUID& id, const uint128_t& version, NodePtr master ) { if( !master || !master->isConnected( )) { EQWARN << "Mapping of object " << id << " failed, invalid master node" << std::endl; return EQ_UNDEFINED_UINT32; } NodeMapObjectPacket packet; packet.requestID = _localNode->registerRequest( object ); packet.objectID = id; packet.requestedVersion = version; packet.instanceID = _genNextID( _instanceIDs ); if( _instanceCache ) { const InstanceCache::Data& cached = (*_instanceCache)[ id ]; if( cached != InstanceCache::Data::NONE ) { const ObjectDataIStreamDeque& versions = cached.versions; EQASSERT( !cached.versions.empty( )); packet.useCache = true; packet.masterInstanceID = cached.masterInstanceID; packet.minCachedVersion = versions.front()->getVersion(); packet.maxCachedVersion = versions.back()->getVersion(); EQLOG( LOG_OBJECTS ) << "Object " << id << " have v" << packet.minCachedVersion << ".." << packet.maxCachedVersion << std::endl; } } master->send( packet ); return packet.requestID; }
void ObjectStore::_attach( Object* object, const uint128_t& id, const uint32_t inInstanceID ) { LBASSERT( object ); LB_TS_THREAD( _receiverThread ); uint32_t instanceID = inInstanceID; if( inInstanceID == CO_INSTANCE_INVALID ) instanceID = _genNextID( _instanceIDs ); object->attach( id, instanceID ); { lunchbox::ScopedFastWrite mutex( _objects ); Objects& objects = _objects.data[ id ]; LBASSERTINFO( !object->isMaster() || objects.empty(), "Attaching master " << *object << ", " << objects.size() << " attached objects with same ID, " << "first is " << ( objects[0]->isMaster() ? "master " : "slave " ) << *objects[0] ); objects.push_back( object ); } _localNode->flushCommands(); // redispatch pending commands LBLOG( LOG_OBJECTS ) << "attached " << *object << " @" << static_cast< void* >( object ) << std::endl; }
void ObjectStore::_attachObject( Object* object, const base::UUID& id, const uint32_t inInstanceID ) { EQASSERT( object ); EQ_TS_THREAD( _receiverThread ); uint32_t instanceID = inInstanceID; if( inInstanceID == EQ_INSTANCE_INVALID ) instanceID = _genNextID( _instanceIDs ); object->attach( id, instanceID ); { base::ScopedMutex< base::SpinLock > mutex( _objects ); Objects& objects = _objects.data[ id ]; EQASSERTINFO( !object->isMaster() || objects.empty(), "Attaching master " << *object << ", " << objects.size() << " attached objects with same ID, first is: " << *objects[0] ); objects.push_back( object ); } _localNode->flushCommands(); // redispatch pending commands EQLOG( LOG_OBJECTS ) << "attached " << *object << " @" << static_cast< void* >( object ) << std::endl; }
uint32_t ObjectStore::mapNB( Object* object, const uint128_t& id, const uint128_t& version, NodePtr master ) { LB_TS_NOT_THREAD( _receiverThread ); LBLOG( LOG_OBJECTS ) << "Mapping " << lunchbox::className( object ) << " to id " << id << " version " << version << std::endl; LBASSERT( object ); LBASSERTINFO( id.isUUID(), id ); if( !master ) master = _localNode->connectObjectMaster( id ); if( !master || !master->isReachable( )) { LBWARN << "Mapping of object " << id << " failed, invalid master node" << std::endl; return LB_UNDEFINED_UINT32; } if( !object || !id.isUUID( )) { LBWARN << "Invalid object " << object << " or id " << id << std::endl; return LB_UNDEFINED_UINT32; } const bool isAttached = object->isAttached(); const bool isMaster = object->isMaster(); LBASSERTINFO( !isAttached, *object ); LBASSERT( !isMaster ) ; if( isAttached || isMaster ) { LBWARN << "Invalid object state: attached " << isAttached << " master " << isMaster << std::endl; return LB_UNDEFINED_UINT32; } const uint32_t request = _localNode->registerRequest( object ); uint128_t minCachedVersion = VERSION_HEAD; uint128_t maxCachedVersion = VERSION_NONE; uint32_t masterInstanceID = 0; const bool useCache = _checkInstanceCache( id, minCachedVersion, maxCachedVersion, masterInstanceID ); object->notifyAttach(); master->send( CMD_NODE_MAP_OBJECT ) << version << minCachedVersion << maxCachedVersion << id << object->getMaxVersions() << request << _genNextID( _instanceIDs ) << masterInstanceID << useCache; return request; }