X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/b8df87e176f27b25534f27d7e240defa32ca35bc..6d50895ca70f5e7bfe97c5dbaad4d506207e20fd:/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 6f3d43a6ac..1c3d3c0372 100644 --- a/src/plugins/file_system/s4u_FileSystem.cpp +++ b/src/plugins/file_system/s4u_FileSystem.cpp @@ -23,18 +23,18 @@ namespace s4u { simgrid::xbt::Extension FileSystemStorageExt::EXTENSION_ID; simgrid::xbt::Extension FileDescriptorHostExt::EXTENSION_ID; -File::File(std::string fullpath, void* userdata) : File(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_(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; size_t longest_prefix_length = 0; - XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath.c_str(), host->get_cname()); + XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath_.c_str(), host->get_cname()); for (auto const& mnt : host->get_mounted_storages()) { XBT_DEBUG("See '%s'", mnt.first.c_str()); - mount_point_ = fullpath.substr(0, mnt.first.length()); + mount_point_ = fullpath_.substr(0, mnt.first.length()); if (mount_point_ == mnt.first && mnt.first.length() > longest_prefix_length) { /* The current mount name is found in the full path and is bigger than the previous*/ @@ -42,18 +42,18 @@ File::File(std::string fullpath, sg_host_t host, void* userdata) : fullpath_(ful st = mnt.second; } } - if (longest_prefix_length > 0) { /* Mount point found, split fullpath into mount_name and path+filename*/ - mount_point_ = fullpath.substr(0, longest_prefix_length); - path_ = fullpath.substr(longest_prefix_length, fullpath.length()); + if (longest_prefix_length > 0) { /* Mount point found, split fullpath_ into mount_name and path+filename*/ + mount_point_ = fullpath_.substr(0, longest_prefix_length); + path_ = fullpath_.substr(longest_prefix_length, fullpath_.length()); } else - xbt_die("Can't find mount point for '%s' on '%s'", fullpath.c_str(), host->get_cname()); + xbt_die("Can't find mount point for '%s' on '%s'", fullpath_.c_str(), host->get_cname()); local_storage_ = st; // 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,7 +102,7 @@ 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}; @@ -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; @@ -128,7 +128,7 @@ 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}; @@ -138,18 +138,20 @@ sg_size_t File::write(sg_size_t size) this_actor::parallel_execute(m_host_list, flops_amount, bytes_amount); } - 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; + 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_); @@ -190,10 +192,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 @@ -288,16 +290,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;