static surf_action_t storage_action_open(void *storage, const char* mount, const char* path, const char* mode)
{
XBT_DEBUG("\tOpen file '%s'",path);
- char *storage_type_id = xbt_lib_get_or_null(
- storage_lib,
- ((storage_t)storage)->generic_resource.name,
- ROUTING_STORAGE_LEVEL);
- storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, storage_type_id,ROUTING_STORAGE_TYPE_LEVEL);
xbt_dict_t content_dict = ((storage_t)storage)->content;
surf_stat_t content = xbt_dict_get(content_dict,path);
surf_stat_t content = stream->content;
XBT_DEBUG("\tWrite file '%s' size '%zu/%zu'",filename,size,content->stat.size);
+ // update file size
+ content->stat.size += size;
+ // update disk space
+ ((storage_t)storage)->used_size =+ size;
+
surf_action_t action = storage_action_execute(storage,size,WRITE);
- // if(used_size==size) {
- // storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
- // }
+ // If the storage is full
+ if(((storage_t)storage)->used_size==((storage_t)storage)->size) {
+ storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
+ }
return action;
}
surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model,
STORAGE->state_current != SURF_RESOURCE_ON);
+ // Save the storage on action
+ action->storage = storage;
GENERIC_LMM_ACTION(action).suspended = 0; /* Should be useless because of the
calloc but it seems to help valgrind... */
return (surf_action_t) action;
}
-static void* storage_create_resource(const char* id, const char* model,const char* type_id)
+static void* storage_create_resource(const char* id, const char* model,const char* type_id,const char* content_name)
{
storage_t storage = NULL;
surf_storage_model, id,NULL);
storage->state_current = SURF_RESOURCE_ON;
+ storage->used_size = 0;
+ storage->size = 0;
storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
double Bread = atof(xbt_dict_get(storage_type->properties,"Bread"));
storage->constraint = lmm_constraint_new(storage_maxmin_system, storage, Bconnection);
storage->constraint_read = lmm_constraint_new(storage_maxmin_system, storage, Bread);
storage->constraint_write = lmm_constraint_new(storage_maxmin_system, storage, Bwrite);
- storage->content = parse_storage_content(storage_type->content,&(storage->used_size));
+ storage->content = parse_storage_content((char*)content_name,&(storage->used_size));
storage->size = storage_type->size;
xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, storage);
xbt_swag_t running_actions = surf_storage_model->states.running_action_set;
// Update the disk usage
-// foreach disk {
-// rate = 0
-// foreach write_action in disk {
-// rate += value(variable(action))
-// }
-// used_size += delta * rate
-// }
+ // Foreach action of type write
+ xbt_swag_foreach_safe(action, next_action, running_actions) {
+ if(action->type == WRITE)
+ {
+ double rate = lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable);
+ ((storage_t)action->storage)->used_size += delta * rate;
+ }
+ }
+
xbt_swag_foreach_safe(action, next_action, running_actions) {
double_update(&(GENERIC_ACTION(action).remains),
lmm_variable_getvalue(GENERIC_LMM_ACTION(action).variable) * delta);
if (GENERIC_LMM_ACTION(action).generic_action.max_duration != NO_MAX_DURATION)
double_update(&(GENERIC_ACTION(action).max_duration), delta);
- // if(remains>0 and weight(variable(action))>0 && used_size == size) {
- // GENERIC_ACTION(action).finish = surf_get_clock();
- // storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
- // } else
+ if(GENERIC_ACTION(action).remains > 0 &&
+ lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0 &&
+ ((storage_t)action->storage)->used_size == ((storage_t)action->storage)->size) {
+ GENERIC_ACTION(action).finish = surf_get_clock();
+ storage_action_state_set((surf_action_t) action, SURF_ACTION_FAILED);
+ } else
if ((GENERIC_ACTION(action).remains <= 0) &&
(lmm_get_variable_weight(GENERIC_LMM_ACTION(action).variable) > 0)) {
GENERIC_ACTION(action).finish = surf_get_clock();
if(rate>0) {
min_completion = MIN(min_completion, (size-used_size)/rate);
}
- }
+ }*/
+
return min_completion;
-*/
}
static int storage_resource_used(void *resource_id)
storage->type_id,
ROUTING_STORAGE_TYPE_LEVEL);
if(!stype) xbt_die("No storage type '%s'",storage->type_id);
-// XBT_INFO("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' \n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tproperties '%p'\n",
-// storage->id,
-// ((storage_type_t) stype)->model,
-// ((storage_type_t) stype)->type_id,
-// ((storage_type_t) stype)->content,
-// ((storage_type_t) stype)->properties);
-
- storage_create_resource(storage->id,
+
+ // if storage content is not specified use the content of storage_type if exist
+ if(!strcmp(storage->content,"") && strcmp(((storage_type_t) stype)->content,"")){
+ storage->content = ((storage_type_t) stype)->content;
+ XBT_DEBUG("For disk '%s' content is empty, use the content of storage type '%s'",storage->id,((storage_type_t) stype)->type_id);
+ }
+
+ XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' \n\t\tmodel '%s' \n\t\tcontent '%s'\n\t\tproperties '%p'\n",
+ storage->id,
+ ((storage_type_t) stype)->model,
+ ((storage_type_t) stype)->type_id,
+ storage->content,
+ ((storage_type_t) stype)->properties);
+
+ storage_create_resource(storage->id,
((storage_type_t) stype)->model,
- ((storage_type_t) stype)->type_id);
+ ((storage_type_t) stype)->type_id,
+ storage->content);
}
static void parse_mstorage_init(sg_platf_mstorage_cbarg_t mstorage)
#endif
xbt_assert(storage_type,"Reading a storage, type id \"%s\" does not exists", storage->type_id);
- XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s'",
+ XBT_DEBUG("ROUTING Create a storage name '%s' with type_id '%s' and content '%s'",
storage->id,
- storage->type_id);
+ storage->type_id,
+ storage->content);
xbt_lib_set(storage_lib,
storage->id,