X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/c1b3e440de2150420b08c0bc55a125a0c9eb86bc..2438e2b51884fd93b9a429b4302b1edb4fd0161c:/src/plugins/file_system/s4u_FileSystem.cpp diff --git a/src/plugins/file_system/s4u_FileSystem.cpp b/src/plugins/file_system/s4u_FileSystem.cpp index 57c5b40022..b32fd5137e 100644 --- a/src/plugins/file_system/s4u_FileSystem.cpp +++ b/src/plugins/file_system/s4u_FileSystem.cpp @@ -23,9 +23,9 @@ namespace s4u { simgrid::xbt::Extension FileSystemStorageExt::EXTENSION_ID; simgrid::xbt::Extension FileDescriptorHostExt::EXTENSION_ID; -File::File(std::string fullpath, void* userdata) : File(std::move(fullpath), Host::current(), userdata){}; +File::File(const std::string& fullpath, void* userdata) : File(fullpath, Host::current(), userdata){}; -File::File(std::string fullpath, sg_host_t host, void* userdata) : fullpath_(std::move(fullpath)), userdata_(userdata) +File::File(const std::string& fullpath, sg_host_t host, void* userdata) : fullpath_(fullpath), userdata_(userdata) { // this cannot fail because we get a xbt_die if the mountpoint does not exist Storage* st = nullptr; @@ -53,7 +53,7 @@ File::File(std::string fullpath, sg_host_t host, void* userdata) : fullpath_(std // assign a file descriptor id to the newly opened File FileDescriptorHostExt* ext = host->extension(); if (ext->file_descriptor_table == nullptr) { - ext->file_descriptor_table = new std::vector(sg_storage_max_file_descriptors); + ext->file_descriptor_table.reset(new std::vector(sg_storage_max_file_descriptors)); std::iota(ext->file_descriptor_table->rbegin(), ext->file_descriptor_table->rend(), 0); // Fill with ..., 1, 0. } xbt_assert(not ext->file_descriptor_table->empty(), "Too much files are opened! Some have to be closed."); @@ -102,14 +102,10 @@ sg_size_t File::read(sg_size_t size) sg_size_t read_size = local_storage_->read(std::min(size, size_ - current_position_)); current_position_ += read_size; - if (strcmp(host->get_cname(), Host::current()->get_cname())) { + if (host->get_name() != Host::current()->get_name() && read_size > 0) { /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */ XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", host->get_cname(), read_size); - std::vector m_host_list = {Host::current(), host}; - std::vector flops_amount = {0., 0.}; - std::vector bytes_amount = {0., 0., static_cast(read_size), 0.}; - - this_actor::parallel_execute(m_host_list, flops_amount, bytes_amount); + host->send_to(Host::current(), read_size); } return read_size; @@ -120,7 +116,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; @@ -128,28 +124,30 @@ sg_size_t File::write(sg_size_t size) /* Find the host where the file is physically located (remote or local)*/ Host* host = local_storage_->get_host(); - if (strcmp(host->get_cname(), Host::current()->get_cname())) { + if (host->get_name() != Host::current()->get_name()) { /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */ XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", host->get_cname(), size); - std::vector m_host_list = {Host::current(), host}; - std::vector flops_amount = {0, 0}; - std::vector bytes_amount = {0, static_cast(size), 0, 0}; - - this_actor::parallel_execute(m_host_list, flops_amount, bytes_amount); + Host::current()->send_to(host, size); } - XBT_DEBUG("WRITE %s on disk '%s'. size '%llu/%llu'", get_path(), local_storage_->get_cname(), size, size_); + XBT_DEBUG("WRITE %s on disk '%s'. size '%llu/%llu' '%llu:%llu'", get_path(), local_storage_->get_cname(), size, size_, sg_storage_get_size_used(local_storage_), sg_storage_get_size(local_storage_)); // If the storage is full before even starting to write - 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 (sg_storage_get_size_used(local_storage_) >= sg_storage_get_size(local_storage_)) + return 0; + sg_size_t write_size=0; + if(write_inside==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_); + write_size = local_storage_->write(size); + local_storage_->extension()->incr_used_size(write_size); + current_position_ += write_size; + size_ = current_position_; + }else { + write_size = local_storage_->write(size); + current_position_ += write_size; + if(current_position_>size_) + size_ = current_position_; + } std::map* content = local_storage_->extension()->get_content(); content->erase(path_); @@ -190,10 +188,10 @@ sg_size_t File::tell() return current_position_; } -void File::move(std::string fullpath) +void File::move(const std::string& fullpath) { /* Check if the new full path is on the same mount point */ - if (not strncmp(mount_point_.c_str(), fullpath.c_str(), mount_point_.length())) { + if (fullpath.compare(0, mount_point_.length(), mount_point_) == 0) { std::map* content = local_storage_->extension()->get_content(); auto sz = content->find(path_); if (sz != content->end()) { // src file exists @@ -264,11 +262,7 @@ int File::remote_copy(sg_host_t host, const char* fullpath) XBT_DEBUG("Initiate data transfer of %llu bytes between %s and %s.", read_size, src_host->get_cname(), storage_dest->get_host()->get_cname()); - std::vector m_host_list = {src_host, dst_host}; - std::vector flops_amount = {0, 0}; - std::vector bytes_amount = {0, static_cast(read_size), 0, 0}; - - this_actor::parallel_execute(m_host_list, flops_amount, bytes_amount); + src_host->send_to(dst_host, read_size); /* Create file on remote host, write it and close it */ File* fd = new File(fullpath, dst_host, nullptr); @@ -288,16 +282,11 @@ int File::remote_move(sg_host_t host, const char* fullpath) FileSystemStorageExt::FileSystemStorageExt(simgrid::s4u::Storage* ptr) { - content_ = parse_content(ptr->get_impl()->content_name); + content_.reset(parse_content(ptr->get_impl()->content_name_)); size_ = ptr->get_impl()->size_; } -FileSystemStorageExt::~FileSystemStorageExt() -{ - delete content_; -} - -std::map* FileSystemStorageExt::parse_content(std::string filename) +std::map* FileSystemStorageExt::parse_content(const std::string& filename) { if (filename.empty()) return nullptr;