From: degomme Date: Tue, 23 Apr 2019 12:49:51 +0000 (+0200) Subject: storage : Allow to write inside a file without reducing its final size (for parallel IO) X-Git-Tag: v3.22.2~63 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/649026e94f9b98cafdd7dcbb63dc0ed6f51cea25 storage : Allow to write inside a file without reducing its final size (for parallel IO) --- diff --git a/include/simgrid/plugins/file_system.h b/include/simgrid/plugins/file_system.h index 4d6190dd06..961331e8ad 100644 --- a/include/simgrid/plugins/file_system.h +++ b/include/simgrid/plugins/file_system.h @@ -102,7 +102,7 @@ public: sg_size_t read(sg_size_t size); /** Simulates a write action. Returns the size of data actually written. */ - sg_size_t write(sg_size_t size); + sg_size_t write(sg_size_t size, int write_inside=0); /** Allows to store user data on that host */ void set_userdata(void* data) { userdata_ = data; } diff --git a/src/plugins/file_system/s4u_FileSystem.cpp b/src/plugins/file_system/s4u_FileSystem.cpp index fab8c9528f..517ad41e62 100644 --- a/src/plugins/file_system/s4u_FileSystem.cpp +++ b/src/plugins/file_system/s4u_FileSystem.cpp @@ -120,7 +120,7 @@ sg_size_t File::read(sg_size_t size) * @param size of the file to write * @return the number of bytes successfully write or -1 if an error occurred */ -sg_size_t File::write(sg_size_t size) +sg_size_t File::write(sg_size_t size, int write_inside) { if (size == 0) /* Nothing to write, return */ return 0; @@ -143,13 +143,15 @@ sg_size_t File::write(sg_size_t size) if (sg_storage_get_size_used(local_storage_) >= sg_storage_get_size(local_storage_)) return 0; /* Substract the part of the file that might disappear from the used sized on the storage element */ - local_storage_->extension()->decr_used_size(size_ - current_position_); - sg_size_t write_size = local_storage_->write(size); - local_storage_->extension()->incr_used_size(write_size); - current_position_ += write_size; - size_ = current_position_; + if(write_inside==0){ + local_storage_->extension()->decr_used_size(size_ - current_position_); + local_storage_->extension()->incr_used_size(write_size); + size_ = current_position_; + }else if(current_position_>size_){ + size_ = current_position_; + } std::map* content = local_storage_->extension()->get_content(); content->erase(path_);