void VersionedSlaveCM::_unpackOneVersion( ObjectDataIStream* is ) { LBASSERT( is ); LBASSERTINFO( _version == is->getVersion() - 1, "Expected version " << _version + 1 << ", got " << is->getVersion() << " for " << *_object ); if( is->hasInstanceData( )) _object->applyInstanceData( *is ); else _object->unpack( *is ); _version = is->getVersion(); _sendAck(); LBASSERT( _version != VERSION_INVALID ); LBASSERT( _version != VERSION_NONE ); LBASSERTINFO( is->getRemainingBufferSize()==0 && is->nRemainingBuffers()==0, "Object " << typeid( *_object ).name() << " did not unpack all data" ); #if 0 LBLOG( LOG_OBJECTS ) << "applied v" << _version << ", id " << _object->getID() << "." << _object->getInstanceID() << std::endl; #endif _releaseStream( is ); }
void VersionedSlaveCM::applyMapData( const uint128_t& version ) { while( true ) { ObjectDataIStream* is = _queuedVersions.pop(); if( is->getVersion() == version ) { LBASSERTINFO( is->hasInstanceData(), *_object ); if( is->hasData( )) // not VERSION_NONE _object->applyInstanceData( *is ); _version = is->getVersion(); LBASSERT( _version != VERSION_INVALID ); //oleg /* LBASSERTINFO( !is->hasData(), lunchbox::className( _object ) << " did not unpack all data, " << is->getRemainingBufferSize() << " bytes, " << is->nRemainingBuffers() << " buffer(s)" ); */ _releaseStream( is ); #if 0 LBLOG( LOG_OBJECTS ) << "Mapped initial data of " << _object << std::endl; #endif return; } else { // Found the following case: // - p1, t1 calls commit // - p1, t2 calls mapObject // - p1, cmd commits new version // - p1, cmd subscribes object // - p1, rcv attaches object // - p1, cmd receives commit data // -> newly attached object recv new commit data before map data, // ignore it LBASSERTINFO( is->getVersion() > version, is->getVersion() << " <= " << version ); _releaseStream( is ); } } }