X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/325a6bb78259a0e6835f69ca6fc2341dc620418d..5089a0a98b27f5eeee62321dff4f025f1648f025:/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 9c3812d8f3..5ab8307f9f 100644 --- a/src/plugins/file_system/s4u_FileSystem.cpp +++ b/src/plugins/file_system/s4u_FileSystem.cpp @@ -17,7 +17,7 @@ #include #include -XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_file, "S4U files"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_file, s4u, "S4U files"); int sg_storage_max_file_descriptors = 1024; namespace simgrid { @@ -28,8 +28,9 @@ simgrid::xbt::Extension FileDescriptorHostExt::EXTE File::File(const std::string& fullpath, void* userdata) : File(fullpath, Host::current(), userdata){}; -File::File(const 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) { + this->set_data(userdata); // this cannot fail because we get a xbt_die if the mountpoint does not exist if (not host->get_mounted_storages().empty()) { Storage* st = nullptr; @@ -93,7 +94,7 @@ File::File(const std::string& fullpath, sg_host_t host, void* userdata) : fullpa ext->file_descriptor_table->pop_back(); XBT_DEBUG("\tOpen file '%s'", path_.c_str()); - std::map* content; + std::map* content = nullptr; if (local_storage_) content = local_storage_->extension()->get_content(); @@ -101,13 +102,15 @@ File::File(const std::string& fullpath, sg_host_t host, void* userdata) : fullpa content = local_disk_->extension()->get_content(); // if file does not exist create an empty file - auto sz = content->find(path_); - if (sz != content->end()) { - size_ = sz->second; - } else { - size_ = 0; - content->insert({path_, size_}); - XBT_DEBUG("File '%s' was not found, file created.", path_.c_str()); + if (content) { + auto sz = content->find(path_); + if (sz != content->end()) { + size_ = sz->second; + } else { + size_ = 0; + content->insert({path_, size_}); + XBT_DEBUG("File '%s' was not found, file created.", path_.c_str()); + } } } @@ -163,7 +166,7 @@ sg_size_t File::read(sg_size_t size) current_position_ += read_size; } - if (host->get_name() != Host::current()->get_name() && read_size > 0) { + if (host && 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); host->send_to(Host::current(), read_size); @@ -190,7 +193,7 @@ sg_size_t File::write(sg_size_t size, int write_inside) if (local_disk_) host = local_disk_->get_host(); - if (host->get_name() != Host::current()->get_name()) { + if (host && 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); Host::current()->send_to(host, size); @@ -203,7 +206,7 @@ sg_size_t File::write(sg_size_t size, int write_inside) if (sg_storage_get_size_used(local_storage_) >= sg_storage_get_size(local_storage_)) return 0; if (write_inside == 0) { - /* Substract the part of the file that might disappear from the used sized on the storage element */ + /* Subtract 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); @@ -228,7 +231,7 @@ sg_size_t File::write(sg_size_t size, int write_inside) if (sg_disk_get_size_used(local_disk_) >= sg_disk_get_size(local_disk_)) return 0; if (write_inside == 0) { - /* Substract the part of the file that might disappear from the used sized on the storage element */ + /* Subtract the part of the file that might disappear from the used sized on the storage element */ local_disk_->extension()->decr_used_size(size_ - current_position_); write_size = local_disk_->write(size); local_disk_->extension()->incr_used_size(write_size); @@ -284,20 +287,22 @@ void File::move(const std::string& fullpath) { /* Check if the new full path is on the same mount point */ if (fullpath.compare(0, mount_point_.length(), mount_point_) == 0) { - std::map* content; + std::map* content = nullptr; if (local_storage_) content = local_storage_->extension()->get_content(); if (local_disk_) content = local_disk_->extension()->get_content(); - auto sz = content->find(path_); - if (sz != content->end()) { // src file exists - sg_size_t new_size = sz->second; - content->erase(path_); - std::string path = fullpath.substr(mount_point_.length(), fullpath.length()); - content->insert({path.c_str(), new_size}); - XBT_DEBUG("Move file from %s to %s, size '%llu'", path_.c_str(), fullpath.c_str(), new_size); - } else { - XBT_WARN("File %s doesn't exist", path_.c_str()); + if (content) { + auto sz = content->find(path_); + if (sz != content->end()) { // src file exists + sg_size_t new_size = sz->second; + content->erase(path_); + std::string path = fullpath.substr(mount_point_.length(), fullpath.length()); + content->insert({path.c_str(), new_size}); + XBT_DEBUG("Move file from %s to %s, size '%llu'", path_.c_str(), fullpath.c_str(), new_size); + } else { + XBT_WARN("File %s doesn't exist", path_.c_str()); + } } } else { XBT_WARN("New full path %s is not on the same mount point: %s.", fullpath.c_str(), mount_point_.c_str()); @@ -307,8 +312,8 @@ void File::move(const std::string& fullpath) int File::unlink() { /* Check if the file is on local storage */ - std::map* content; - const char* name = nullptr; + std::map* content = nullptr; + const char* name = ""; if (local_storage_) { content = local_storage_->extension()->get_content(); name = local_storage_->get_cname(); @@ -318,7 +323,7 @@ int File::unlink() name = local_disk_->get_cname(); } - if (content->find(path_) == content->end()) { + if (not content || content->find(path_) == content->end()) { XBT_WARN("File %s is not on disk %s. Impossible to unlink", path_.c_str(), name); return -1; } else { @@ -340,7 +345,7 @@ int File::unlink() int File::remote_copy(sg_host_t host, const char* fullpath) { /* Find the host where the file is physically located and read it */ - Host* src_host; + Host* src_host = nullptr; if (local_storage_) { src_host = local_storage_->get_host(); XBT_DEBUG("READ %s on disk '%s'", get_path(), local_storage_->get_cname()); @@ -405,9 +410,11 @@ 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(), - dst_host->get_cname()); - src_host->send_to(dst_host, read_size); + if (src_host) { + XBT_DEBUG("Initiate data transfer of %llu bytes between %s and %s.", read_size, src_host->get_cname(), + dst_host->get_cname()); + 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); @@ -634,12 +641,12 @@ void sg_file_dump(sg_file_t fd) void* sg_file_get_data(sg_file_t fd) { - return fd->get_userdata(); + return fd->get_data(); } void sg_file_set_data(sg_file_t fd, void* data) { - fd->set_userdata(data); + fd->set_data(data); } /** @@ -741,7 +748,7 @@ xbt_dict_t sg_storage_get_content(sg_storage_t storage) for (auto const& entry : *content) { sg_size_t* psize = new sg_size_t; *psize = entry.second; - xbt_dict_set(content_as_dict, entry.first.c_str(), psize, nullptr); + xbt_dict_set(content_as_dict, entry.first.c_str(), psize); } return content_as_dict; } @@ -751,7 +758,7 @@ xbt_dict_t sg_host_get_storage_content(sg_host_t host) xbt_assert((host != nullptr), "Invalid parameters"); xbt_dict_t contents = xbt_dict_new_homogeneous(nullptr); for (auto const& elm : host->get_mounted_storages()) - xbt_dict_set(contents, elm.first.c_str(), sg_storage_get_content(elm.second), nullptr); + xbt_dict_set(contents, elm.first.c_str(), sg_storage_get_content(elm.second)); return contents; }