X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/73662a7c0b0d1e462f2b99322183295be3a24a5a..25a96b792825bb9a06f72a72d56583940aecaaf1:/src/surf/storage_n11.cpp diff --git a/src/surf/storage_n11.cpp b/src/surf/storage_n11.cpp index e384fb8a4b..832cc03314 100644 --- a/src/surf/storage_n11.cpp +++ b/src/surf/storage_n11.cpp @@ -6,7 +6,7 @@ #include "storage_n11.hpp" #include "surf_private.h" - +#include /*ceil*/ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_storage); static int storage_selective_update = 0; @@ -68,7 +68,7 @@ static void parse_storage_init(sg_platf_storage_cbarg_t storage) storage->content_type, storage->properties); - surf_storage_model->createResource(storage->id, + surf_storage_model->createStorage(storage->id, ((storage_type_t) stype)->type_id, storage->content, storage->content_type, @@ -234,7 +234,7 @@ StorageN11Model::~StorageN11Model(){ storage_running_action_set_that_does_not_need_being_checked = NULL; } -StoragePtr StorageN11Model::createResource(const char* id, const char* type_id, +StoragePtr StorageN11Model::createStorage(const char* id, const char* type_id, const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach) { @@ -252,7 +252,7 @@ StoragePtr StorageN11Model::createResource(const char* id, const char* type_id, Bread, Bwrite, Bconnection, type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size, (char *) attach); - xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast(storage)); + xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, storage); XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s'\n\t\tproperties '%p'\n\t\tBread '%f'\n", id, @@ -305,17 +305,34 @@ void StorageN11Model::updateActionsState(double /*now*/, double delta) ; it != itend ; it=itNext) { ++itNext; action = static_cast(&*it); + if(action->m_type == WRITE) { // Update the disk usage - // Update the file size - // For each action of type write - double rate = lmm_variable_getvalue(action->getVariable()); - /* Hack to avoid rounding differences between x86 and x86_64 - * (note that the next sizes are of type sg_size_t). */ - long incr = delta * rate + MAXMIN_PRECISION; + // Update the file size + // For each action of type write + double current_progress = + delta * lmm_variable_getvalue(action->getVariable()); + long int incr = current_progress; + + XBT_DEBUG("%s:\n\t progress = %.2f, current_progress = %.2f, " + "incr = %ld, lrint(1) = %ld, lrint(2) = %ld", + action->p_file->name, + action->progress, current_progress, incr, + lrint(action->progress + current_progress), + lrint(action->progress)+ incr); + + /* Take care of rounding error accumulation */ + if (lrint(action->progress + current_progress) > + lrint(action->progress)+ incr) + incr++; + + action->progress +=current_progress; + action->p_storage->m_usedSize += incr; // disk usage - action->p_file->size += incr; // file size + action->p_file->current_position+= incr; // current_position + // which becomes the new file size + action->p_file->size = action->p_file->current_position ; sg_size_t *psize = xbt_new(sg_size_t,1); *psize = action->p_file->size; @@ -361,52 +378,7 @@ StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t prope XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size); } -StorageActionPtr StorageN11::ls(const char* path) -{ - StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, LS); - - action->p_lsDict = NULL; - xbt_dict_t ls_dict = xbt_dict_new_homogeneous(xbt_free); - - char* key; - sg_size_t size = 0; - xbt_dict_cursor_t cursor = NULL; - - xbt_dynar_t dyn = NULL; - char* file = NULL; - - // for each file in the storage content - xbt_dict_foreach(p_content,cursor,key,size){ - // Search if file start with the prefix 'path' - if(xbt_str_start_with(key,path)){ - file = &key[strlen(path)]; - - // Split file with '/' - dyn = xbt_str_split(file,"/"); - file = xbt_dynar_get_as(dyn,0,char*); - - // file - if(xbt_dynar_length(dyn) == 1){ - sg_size_t *psize = xbt_new(sg_size_t, 1); - *psize=size; - xbt_dict_set(ls_dict, file, psize, NULL); - } - // Directory - else - { - // if directory does not exist yet in the dictionary - if(!xbt_dict_get_or_null(ls_dict,file)) - xbt_dict_set(ls_dict,file,NULL,NULL); - } - xbt_dynar_free(&dyn); - } - } - - action->p_lsDict = ls_dict; - return action; -} - -StorageActionPtr StorageN11::open(const char* mount, char* path) +StorageActionPtr StorageN11::open(const char* mount, const char* path) { XBT_DEBUG("\tOpen file '%s'",path); @@ -416,7 +388,7 @@ StorageActionPtr StorageN11::open(const char* mount, char* path) if(psize) size = *psize; else { - psize = xbt_new(sg_size_t,1); + psize = xbt_new(sg_size_t,1); size = 0; *psize = size; xbt_dict_set(p_content, path, psize, NULL); @@ -443,7 +415,7 @@ StorageActionPtr StorageN11::close(surf_file_t fd) StorageActionPtr write_action; unsigned int i; xbt_dynar_foreach(p_writeActions, i, _write_action) { - write_action = static_cast(static_cast(_write_action)); + write_action = static_cast(_write_action); if ((write_action->p_file) == fd) { xbt_dynar_cursor_rm(p_writeActions, &i); write_action->unref(); @@ -458,12 +430,12 @@ StorageActionPtr StorageN11::close(surf_file_t fd) StorageActionPtr StorageN11::read(surf_file_t fd, sg_size_t size) { - if(size > fd->size){ - size = fd->size; + if(fd->current_position + size > fd->size){ + size = fd->size - fd->current_position; fd->current_position = fd->size; } else - fd->current_position += size; + fd->current_position += size; StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, READ); return action; @@ -476,29 +448,16 @@ StorageActionPtr StorageN11::write(surf_file_t fd, sg_size_t size) StorageActionPtr action = new StorageN11Action(getModel(), size, getState() != SURF_RESOURCE_ON, this, WRITE); action->p_file = fd; - fd->current_position += size; - // If the storage is full + /* Substract the part of the file that might disappear from the used sized on + * the storage element */ + m_usedSize -= (fd->size - fd->current_position); + // If the storage is full before even starting to write if(m_usedSize==m_size) { action->setState(SURF_ACTION_FAILED); } return action; } -void StorageN11::rename(const char *src, const char *dest) -{ - sg_size_t *psize, *new_psize; - psize = (sg_size_t*) xbt_dict_get_or_null(p_content,src); - new_psize = xbt_new(sg_size_t, 1); - *new_psize = *psize; - if (psize){// src file exists - xbt_dict_remove(p_content, src); - xbt_dict_set(p_content, dest, new_psize,NULL); - XBT_DEBUG("Change file name from %s to %s, size '%llu'",src, dest, *psize); - } - else - XBT_DEBUG("File %s doesn't exist",src); -} - /********** * Action * **********/ @@ -515,15 +474,14 @@ StorageN11Action::StorageN11Action(ModelPtr model, double cost, bool failed, Sto case OPEN: case CLOSE: case STAT: - case LS: break; case READ: lmm_expand(model->getMaxminSystem(), storage->p_constraintRead, - getVariable(), 1.0); + getVariable(), 1.0); break; case WRITE: lmm_expand(model->getMaxminSystem(), storage->p_constraintWrite, - getVariable(), 1.0); + getVariable(), 1.0); ActionPtr action = this; xbt_dynar_push(storage->p_writeActions, &action); ref();