void ChunkManagerTargeter::noteStaleResponse( const ShardEndpoint& endpoint, const BSONObj& staleInfo ) { dassert( !_needsTargetingRefresh ); ChunkVersion remoteShardVersion; if ( staleInfo["vWanted"].eoo() ) { // If we don't have a vWanted sent, assume the version is higher than our current // version. remoteShardVersion = getShardVersion( endpoint.shardName, _manager, _primary ); remoteShardVersion.incMajor(); } else { remoteShardVersion = ChunkVersion::fromBSON( staleInfo, "vWanted" ); } ShardVersionMap::iterator it = _remoteShardVersions.find( endpoint.shardName ); if ( it == _remoteShardVersions.end() ) { _remoteShardVersions.insert( make_pair( endpoint.shardName, remoteShardVersion ) ); } else { ChunkVersion& previouslyNotedVersion = it->second; if ( previouslyNotedVersion.hasCompatibleEpoch( remoteShardVersion )) { if ( previouslyNotedVersion.isOlderThan( remoteShardVersion )) { remoteShardVersion.cloneTo( &previouslyNotedVersion ); } } else { // Epoch changed midway while applying the batch so set the version to // something unique and non-existent to force a reload when // refreshIsNeeded is called. ChunkVersion::IGNORED().cloneTo( &previouslyNotedVersion ); } } }
void BatchedInsertRequest::setShardVersion(const ChunkVersion& shardVersion) { auto_ptr<ChunkVersion> temp(new ChunkVersion); shardVersion.cloneTo(temp.get()); _shardVersion.reset(temp.release()); }