From b01ca57cc605121a587f5844ffb0d1defa86ac53 Mon Sep 17 00:00:00 2001 From: Pierre Veyre Date: Tue, 25 Mar 2014 15:21:46 +0100 Subject: [PATCH] Finalises MSG_file_rcopy() and MSG_file_rmove() --- include/msg/msg.h | 1 + src/msg/msg_io.c | 20 +++++++++- src/surf/workstation_interface.cpp | 62 ++++++++++++++++++++++++++---- 3 files changed, 74 insertions(+), 9 deletions(-) diff --git a/include/msg/msg.h b/include/msg/msg.h index a625c26909..ec4eca8226 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -98,6 +98,7 @@ XBT_PUBLIC(void) __MSG_file_priv_free(msg_file_priv_t priv); XBT_PUBLIC(const char *) MSG_file_get_name(msg_file_t storage); XBT_PUBLIC(msg_error_t) MSG_file_move(msg_file_t fd, const char* fullpath); XBT_PUBLIC(msg_error_t) MSG_file_rcopy(msg_file_t fd, msg_host_t host, const char* fullpath); +XBT_PUBLIC(msg_error_t) MSG_file_rmove(msg_file_t fd, msg_host_t host, const char* fullpath); /************************** Storage handling ***********************************/ XBT_PUBLIC(msg_host_t) MSG_get_storage_by_name(const char *name); XBT_PUBLIC(const char *) MSG_storage_get_name(msg_storage_t storage); diff --git a/src/msg/msg_io.c b/src/msg/msg_io.c index 0b88c8a3d2..2c2adca044 100644 --- a/src/msg/msg_io.c +++ b/src/msg/msg_io.c @@ -255,9 +255,9 @@ msg_error_t MSG_file_move (msg_file_t fd, const char* fullpath) /** * \ingroup msg_file_management - * \brief Move a file to another location on a remote host. + * \brief Copy a file to another location on a remote host. * \param fd : the file to move - * \param host : the remote host where the file has to be moved + * \param host : the remote host where the file has to be copied * \param fullpath : the complete path destination on the remote host * \return If successful, the function returns MSG_OK. Otherwise, it returns * MSG_TASK_CANCELED. @@ -268,6 +268,22 @@ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpa return simcall_file_rcopy(file_priv->simdata->smx_file, host, fullpath); } +/** + * \ingroup msg_file_management + * \brief Move a file to another location on a remote host. + * \param fd : the file to move + * \param host : the remote host where the file has to be moved + * \param fullpath : the complete path destination on the remote host + * \return If successful, the function returns MSG_OK. Otherwise, it returns + * MSG_TASK_CANCELED. + */ +msg_error_t MSG_file_rmove (msg_file_t file, msg_host_t host, const char* fullpath) +{ + msg_file_priv_t file_priv = MSG_file_priv(file); + msg_error_t res = simcall_file_rcopy(file_priv->simdata->smx_file, host, fullpath); + simcall_file_unlink(file_priv->simdata->smx_file); + return res; +} /** * \brief Destroys a file (internal call only) diff --git a/src/surf/workstation_interface.cpp b/src/surf/workstation_interface.cpp index 9783d2a69a..7149daf2ee 100644 --- a/src/surf/workstation_interface.cpp +++ b/src/surf/workstation_interface.cpp @@ -9,6 +9,8 @@ #include "cpu_cas01.hpp" #include "simgrid/sg_config.h" +#include "network_interface.hpp" + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_workstation, surf, "Logging specific to the SURF workstation module"); @@ -369,22 +371,26 @@ int Workstation::fileMove(surf_file_t fd, const char* fullpath){ int Workstation::fileRcopy(surf_file_t fd, surf_resource_t host_dest, const char* fullpath){ - XBT_INFO("FILE %s WKS %s FULLPATH %s",fd->name, host_dest->key, fullpath); + XBT_DEBUG("Rcopy file %s on %s to %s",fd->name, host_dest->key, fullpath); /* Find the host src where the file is located */ StoragePtr storage = findStorageOnMountList(fd->mount); const char* host_name_src = (const char*)storage->p_attach; - /* Find the host dest where the file will be stored */ + /* Find the real host dest where the file will be stored */ s_mount_t mnt; unsigned int cursor; StoragePtr storage_dest = NULL; const char* host_name_dest; - char *file_mount_name = NULL; + char *file_mount_name; size_t longest_prefix_length = 0; - xbt_dynar_foreach(((WorkstationPtr)host_dest)->p_storage,cursor,mnt) + WorkstationPtr dest_ws, src_ws; + + dest_ws = static_cast(surf_workstation_resource_priv(host_dest)); + + xbt_dynar_foreach(dest_ws->p_storage,cursor,mnt) { - file_mount_name = (char *) xbt_malloc ((strlen(mnt.name)+1)); + file_mount_name = (char *) xbt_malloc ((strlen(mnt.name)+1)); strncpy(file_mount_name,fullpath,strlen(mnt.name)+1); file_mount_name[strlen(mnt.name)] = '\0'; @@ -396,7 +402,7 @@ int Workstation::fileRcopy(surf_file_t fd, surf_resource_t host_dest, const char free(file_mount_name); } if(longest_prefix_length>0) - { /* Mount point found */ + { /* Mount point found, retrieve the host the storage is attached to */ host_name_dest = storage_dest->p_attach; } else @@ -404,8 +410,50 @@ int Workstation::fileRcopy(surf_file_t fd, surf_resource_t host_dest, const char XBT_WARN("Can't find mount point for '%s' on destination host '%s'", fullpath, host_dest->key); return MSG_TASK_CANCELED; } + + /* Check that there is a route between src and dest workstations */ + xbt_dynar_t route = NULL; + dest_ws = static_cast(surf_workstation_resource_priv(xbt_lib_get_elm_or_null(host_lib, host_name_dest))); + src_ws = static_cast(surf_workstation_resource_priv(xbt_lib_get_elm_or_null(host_lib, host_name_src))); + + routing_get_route_and_latency(src_ws->p_netElm, dest_ws->p_netElm, &route, NULL); + if(!xbt_dynar_length (route)) + { + XBT_WARN("There is no route between %s and %s. Action has been canceled", src_ws->getName(), dest_ws->getName()); + return MSG_TASK_CANCELED; + } + else + {/* There is a route between src and dest, let's copy the file */ + + /* Read the file on the src side */ + src_ws->read(fd, fd->size); + + /* Send a message from src to dest to simulate data transfer */ + surf_network_model->communicate(src_ws->p_netElm, dest_ws->p_netElm, fd->size, -1.0); + + /* Create the file on the dest side and write data into it*/ + char *mount_name, *path; + path = (char *) xbt_malloc ((strlen(fullpath)-longest_prefix_length+1)); + mount_name = (char *) xbt_malloc ((longest_prefix_length+1)); + /* deduce mount_name and path from fullpath */ + strncpy(mount_name, fullpath, longest_prefix_length+1); + strncpy(path, fullpath+longest_prefix_length, strlen(fullpath)-longest_prefix_length+1); + path[strlen(fullpath)-longest_prefix_length] = '\0'; + mount_name[longest_prefix_length] = '\0'; + /* create the file */ + ActionPtr open_action = storage_dest->open((const char*)mount_name, (const char*)path); + /* write data */ + dest_ws->write(static_cast(open_action)->p_file, fd->size); + dest_ws->close(static_cast(open_action)->p_file); + free(path); + free(mount_name); + XBT_DEBUG("File %s has been copied on %s to %s",fd->name, host_dest->key, fullpath); + return MSG_OK; + } + + XBT_INFO("SRC %s DEST %s", host_name_src, host_name_dest); - return MSG_OK; + // /* Check that file to copy is local to the src workstation (storage is attached to src workstation) */ -- 2.20.1