mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-17 13:24:15 -05:00
switched random chunk strategy to true random
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@3777 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
50024e3f5e
commit
c00e11ed2b
@ -392,32 +392,40 @@ uint32_t ChunkMap::getAvailableChunk(const std::string& peer_id,bool& map_is_too
|
|||||||
else
|
else
|
||||||
map_is_too_old = false ;// the map is not too old
|
map_is_too_old = false ;// the map is not too old
|
||||||
|
|
||||||
uint32_t start_location = (_strategy == FileChunksInfo::CHUNK_STRATEGY_STREAMING)?0:(rand()%_map.size()) ;
|
uint32_t available_chunks = 0 ;
|
||||||
|
|
||||||
for(unsigned int i=0;i<_map.size();++i)
|
for(unsigned int i=0;i<_map.size();++i)
|
||||||
{
|
if(_map[i] == FileChunksInfo::CHUNK_OUTSTANDING && (peer_chunks->is_full || peer_chunks->cmap[i]))
|
||||||
uint32_t j = (start_location+i)%(int)_map.size() ; // index of the chunk
|
|
||||||
|
|
||||||
if(_map[j] == FileChunksInfo::CHUNK_OUTSTANDING && (peer_chunks->is_full || peer_chunks->cmap[j]))
|
|
||||||
{
|
{
|
||||||
if(_strategy == FileChunksInfo::CHUNK_STRATEGY_STREAMING)
|
if(_strategy == FileChunksInfo::CHUNK_STRATEGY_STREAMING)
|
||||||
return j ;
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
// reserve a series of available chunks
|
|
||||||
//
|
|
||||||
uint32_t k=0 ;
|
|
||||||
|
|
||||||
for(;k+j<_map.size() && (_map[k+j] == FileChunksInfo::CHUNK_OUTSTANDING && (peer_chunks->is_full || peer_chunks->cmap[k+j]));++k) ;
|
|
||||||
|
|
||||||
#ifdef DEBUG_FTCHUNK
|
#ifdef DEBUG_FTCHUNK
|
||||||
std::cerr << "ChunkMap::getAvailableChunk: returning chunk " << j+k << " for peer " << peer_id << std::endl;
|
std::cerr << "ChunkMap::getAvailableChunk: returning chunk " << i << " for peer " << peer_id << std::endl;
|
||||||
#endif
|
#endif
|
||||||
// ...and select one randomly
|
return i ;
|
||||||
//
|
|
||||||
return (rand()%k) + j ;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
++available_chunks ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(available_chunks > 0)
|
||||||
|
{
|
||||||
|
uint32_t chosen_chunk_number = rand() % available_chunks ;
|
||||||
|
uint32_t j=0 ;
|
||||||
|
|
||||||
|
for(uint32_t i=0;i<_map.size();++i)
|
||||||
|
if(_map[i] == FileChunksInfo::CHUNK_OUTSTANDING && (peer_chunks->is_full || peer_chunks->cmap[i]))
|
||||||
|
{
|
||||||
|
if(j == chosen_chunk_number)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_FTCHUNK
|
||||||
|
std::cerr << "ChunkMap::getAvailableChunk: returning chunk " << i << " for peer " << peer_id << std::endl;
|
||||||
|
#endif
|
||||||
|
return i ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++j ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_FTCHUNK
|
#ifdef DEBUG_FTCHUNK
|
||||||
|
@ -1194,9 +1194,7 @@ bool ftController::FileRequest(const std::string& fname, const std::string& has
|
|||||||
destination = mDownloadPath + "/" + fname;
|
destination = mDownloadPath + "/" + fname;
|
||||||
} /******* UNLOCKED ********/
|
} /******* UNLOCKED ********/
|
||||||
|
|
||||||
// We check that flags are consistent. In particular, for know
|
// We check that flags are consistent.
|
||||||
// we can't send chunkmaps through normal traffic, so availability must be assumed whenever the traffic is not
|
|
||||||
// a turtle traffic:
|
|
||||||
|
|
||||||
if(flags & RS_FILE_HINTS_NETWORK_WIDE)
|
if(flags & RS_FILE_HINTS_NETWORK_WIDE)
|
||||||
mTurtle->monitorFileTunnels(fname,hash,size) ;
|
mTurtle->monitorFileTunnels(fname,hash,size) ;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user