diff --git a/libretroshare/src/ft/ftchunkmap.h b/libretroshare/src/ft/ftchunkmap.h index e5ddd6789..4db591226 100644 --- a/libretroshare/src/ft/ftchunkmap.h +++ b/libretroshare/src/ft/ftchunkmap.h @@ -197,10 +197,10 @@ class ChunkMap /// gets lost when force checking the file. void updateTotalDownloaded() ; - protected: /// handles what size the last chunk has. uint32_t sizeOfChunk(uint32_t chunk_number) const ; + protected: /// Returns a chunk available for this peer_id, depending on the chunk strategy. // uint32_t getAvailableChunk(const std::string& peer_id,bool& chunk_map_too_old) ; diff --git a/libretroshare/src/ft/ftcontroller.cc b/libretroshare/src/ft/ftcontroller.cc index 9d3005576..a9d12e84e 100644 --- a/libretroshare/src/ft/ftcontroller.cc +++ b/libretroshare/src/ft/ftcontroller.cc @@ -1040,7 +1040,6 @@ bool ftController::handleAPendingRequest() std::cerr << "Hash " << req.mHash << " is in downloads" << std::endl ; std::cerr << " setting chunk strategy to " << rsft->chunk_strategy << std::endl; #endif - //(fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map) ; (fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map,rsft->data_chunk_ids) ; (fit->second)->mCreator->setChunkStrategy((FileChunksInfo::ChunkStrategy)(rsft->chunk_strategy)) ; } @@ -2030,6 +2029,7 @@ bool ftController::saveList(bool &cleanup, std::list& saveData) fit->second->mCreator->getAvailabilityMap(rft->compressed_chunk_map) ; rft->chunk_strategy = fit->second->mCreator->getChunkStrategy() ; + rft->data_chunk_ids = fit->second->mCreator->getMappedChunks() ; saveData.push_back(rft); } @@ -2145,7 +2145,6 @@ bool ftController::loadList(std::list& load) } else { - //(fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map) ; (fit->second)->mCreator->setAvailabilityMap(rsft->compressed_chunk_map,rsft->data_chunk_ids) ; (fit->second)->mCreator->setChunkStrategy((FileChunksInfo::ChunkStrategy)(rsft->chunk_strategy)) ; } diff --git a/libretroshare/src/ft/ftfilecreator.cc b/libretroshare/src/ft/ftfilecreator.cc index 7995f8fc4..1929742c7 100644 --- a/libretroshare/src/ft/ftfilecreator.cc +++ b/libretroshare/src/ft/ftfilecreator.cc @@ -507,6 +507,8 @@ void ftFileCreator::getChunkMap(FileChunksInfo& info) info.pending_slices[n].push_back(si) ; } + + info.chunks_on_disk = getMappedChunks() ; } bool ftFileCreator::locked_printChunkMap() @@ -611,7 +613,11 @@ void ftFileCreator::forceCheck() { RsStackMutex stack(ftcMutex); /********** STACK LOCKED MTX ******/ - chunkMap.forceCheck(); + std::cerr << "WARNING: forceCheck() for mapped files is not yet implemented." << std::endl; + return ; + + forceCheckPartialFile() ; // calls ftFileMapper, to ask for re-hashing the partial file + chunkMap.forceCheck(); // sets all chunk to checking mode. } void ftFileCreator::getSourcesList(uint32_t chunk_num,std::vector& sources) @@ -635,11 +641,10 @@ bool ftFileCreator::verifyChunk(uint32_t chunk_number,const Sha1CheckSum& sum) if(!locked_initializeFileAttrs() ) return false ; - static const uint32_t chunk_size = ChunkMap::CHUNKMAP_FIXED_CHUNK_SIZE ; - unsigned char *buff = new unsigned char[chunk_size] ; - uint32_t len ; + uint32_t len = chunkMap.sizeOfChunk(chunk_number); + unsigned char *buff = new unsigned char[len] ; - if(fseeko64(fd,(uint64_t)chunk_number * (uint64_t)chunk_size,SEEK_SET)==0 && (len = fread(buff,1,chunk_size,fd)) > 0) + if(retrieveData(buff,len,(uint64_t)chunk_number * (uint64_t)ChunkMap::CHUNKMAP_FIXED_CHUNK_SIZE,fd)) // if(fseeko64(fd,(uint64_t)chunk_number * (uint64_t)chunk_size,SEEK_SET)==0 && (len = fread(buff,1,chunk_size,fd)) > 0) { Sha1CheckSum comp = RsDirUtil::sha1sum(buff,len) ; diff --git a/libretroshare/src/ft/ftfilemapper.cc b/libretroshare/src/ft/ftfilemapper.cc index 9fbe28608..6554e3bd5 100644 --- a/libretroshare/src/ft/ftfilemapper.cc +++ b/libretroshare/src/ft/ftfilemapper.cc @@ -269,7 +269,7 @@ void ftFileMapper::initMappedChunks(uint64_t file_size,const CompressedChunkMap& // 0 - retro-compatibility. First check that the number of chunks in both maps co-incide. - if(data_chunk_ids.size() != count) + if(data_chunk_ids.size() < count) { std::cerr << "(II) ftFileMapper::initMappedChunks(): file has " << count << " chunks on disk, but no mapping. Assuming it's an unfragmented file (backward compatibility)!" << std::endl; _data_chunk_ids.resize(numck) ; diff --git a/libretroshare/src/ft/ftfilemapper.h b/libretroshare/src/ft/ftfilemapper.h index 606336128..8cbdb1a67 100644 --- a/libretroshare/src/ft/ftfilemapper.h +++ b/libretroshare/src/ft/ftfilemapper.h @@ -80,9 +80,14 @@ class ftFileMapper // bool retrieveData(void *data, uint32_t data_size, uint64_t offset,FILE *fd) ; + // Returns the number of each chunk that is mapped to place 0,1,2,... on the disk. + // + const std::vector& getMappedChunks() const { return _data_chunk_ids ; } + // debug void print() const ; + virtual void forceCheckPartialFile() {} private: uint64_t _file_size ; // size of the file uint32_t _chunk_size ; // size of chunks diff --git a/libretroshare/src/retroshare/rstypes.h b/libretroshare/src/retroshare/rstypes.h index d8810746f..c15827f71 100644 --- a/libretroshare/src/retroshare/rstypes.h +++ b/libretroshare/src/retroshare/rstypes.h @@ -337,6 +337,9 @@ class FileChunksInfo // The list of pending requests, chunk per chunk (by chunk id) // std::map > pending_slices ; + + // chunk order on the disk + std::vector chunks_on_disk ; }; class CompressedChunkMap diff --git a/libretroshare/src/tests/ft/ftfilemappertest.cc b/libretroshare/src/tests/ft/ftfilemappertest.cc index 73af63f7d..10fd55676 100644 --- a/libretroshare/src/tests/ft/ftfilemappertest.cc +++ b/libretroshare/src/tests/ft/ftfilemappertest.cc @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,7 @@ int main(int argc,char *argv[]) argstream as(argc,argv) ; int random_seed = 0 ; + int nb_virtual_peers = 5 ; uint64_t size = 1024*1024*12+234;//4357283 ; // some size. Not an integer number of chunks as >> parameter('r',"random-seed",random_seed,"Random seed for the test. Use the same seed to get the same behavior.",false) @@ -40,15 +42,10 @@ int main(int argc,char *argv[]) void *membuf = malloc(size) ; CHECK(membuf != NULL) ; - for(int i=0;i virtual_peers(nb_virtual_peers) ; + + for(uint32_t i=0;i