uint128_t VersionedSlaveCM::sync( const uint128_t& v ) { #if 0 LBLOG( LOG_OBJECTS ) << "sync to v" << v << ", id " << _object->getID() << "." << _object->getInstanceID() << std::endl; #endif if( _version == v ) return _version; if( v == VERSION_HEAD ) { _syncToHead(); return _version; } const uint128_t version = ( v == VERSION_NEXT ) ? _version + 1 : v; LBASSERTINFO( version.high() == 0, "Not a master version: " << version ) LBASSERTINFO( _version <= version, "can't sync to older version of object " << lunchbox::className( _object ) << " " << _object->getID() << " (" << _version << ", " << version <<")" ); while( _version < version ) _unpackOneVersion( _queuedVersions.pop( )); LocalNodePtr node = _object->getLocalNode(); if( node.isValid( )) node->flushCommands(); return _version; }
uint128_t VersionedMasterCM::sync( const uint128_t& inVersion ) { LBASSERTINFO( inVersion.high() != 0 || inVersion == VERSION_NEXT || inVersion == VERSION_HEAD, inVersion ); #if 0 LBLOG( LOG_OBJECTS ) << "sync to v" << inVersion << ", id " << _object->getID() << "." << _object->getInstanceID() << std::endl; #endif if( inVersion == VERSION_NEXT ) return _apply( _slaveCommits.pop( )); if( inVersion == VERSION_HEAD ) { uint128_t version = VERSION_NONE; for( ObjectDataIStream* is = _slaveCommits.tryPop(); is; is = _slaveCommits.tryPop( )) { version = _apply( is ); } return version; } // else apply only concrete slave commit return _apply( _slaveCommits.pull( inVersion )); }
bool RequestHandler::waitRequest( const uint32_t requestID, uint128_t& rUint128, const uint32_t timeout ) { Request::Result result; if( !_impl->waitRequest( requestID, result, timeout )) return false; rUint128.high() = result.rUint128.high; rUint128.low() = result.rUint128.low; return true; }
::zeroeq::Event serializeRequest( const uint128_t& eventType ) { ::zeroeq::Event event( ::zeroeq::vocabulary::EVENT_REQUEST ); flatbuffers::FlatBufferBuilder& fbb = event.getFBB(); RequestBuilder builder( fbb ); builder.add_eventHigh( eventType.high( )); builder.add_eventLow( eventType.low( )); fbb.Finish( builder.Finish( )); return event; }
void RequestHandler::serveRequest( const uint32_t requestID, const uint128_t& result ) { Request* request = 0; { ScopedFastWrite mutex( _impl->lock ); RequestHashCIter i = _impl->requests.find( requestID ); if( i != _impl->requests.end( )) request = i->second; } if( request ) { request->result.rUint128.low = result.low(); request->result.rUint128.high = result.high(); request->lock.unset(); } }
uint128_t MasterCM::sync( const uint128_t& version ) { EQASSERTINFO( version.high() != 0 || version == VERSION_NEXT || version == VERSION_HEAD, version ); #if 0 EQLOG( LOG_OBJECTS ) << "sync to v" << version << ", id " << _object->getID() << "." << _object->getInstanceID() << std::endl; #endif if( version == VERSION_NEXT ) { ObjectDataIStream* is = _queuedDeltas.pop(); _apply( is ); return _version; } // else if( version == VERSION_HEAD ) { ObjectDataIStream* is = 0; while( _queuedDeltas.tryPop( is )) _apply( is ); return _version; } // else apply only concrete slave commit ObjectDataIStream* is = 0; ObjectDataIStreams unusedStreams; while( !is ) { ObjectDataIStream* candidate = _queuedDeltas.pop(); if( candidate->getVersion() == version ) is = candidate; else unusedStreams.push_back( candidate ); } _apply( is ); _queuedDeltas.pushFront( unusedStreams ); return version; }
template<> ZEROBUF_INL void toJSON( const uint128_t& value, Json::Value& json ) { json[ "high" ] = Json::UInt64( value.high( )); json[ "low" ] = Json::UInt64( value.low( )); }