Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Change the file API, remove the mount point in each file function.
[simgrid.git] / src / surf / storage.c
index 7ee05ee..acf02e6 100644 (file)
@@ -50,7 +50,7 @@ static surf_action_t storage_action_stat(void *storage, surf_file_t stream)
   return action;
 }
 
-static surf_action_t storage_action_open(void *storage, const char* path, const char* mode)
+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(
@@ -64,6 +64,7 @@ static surf_action_t storage_action_open(void *storage, const char* path, const
   surf_file_t file = xbt_new0(s_surf_file_t,1);
   file->name = xbt_strdup(path);
   file->content = content;
+  file->storage = mount;
 
   surf_action_t action = storage_action_execute(storage,0, OPEN);
   action->file = (void *)file;
@@ -85,7 +86,7 @@ static surf_action_t storage_action_read(void *storage, void* ptr, size_t size,
 {
   char *filename = stream->name;
   surf_stat_t content = stream->content;
-  XBT_DEBUG("\tRead file '%s' size '%Zu/%Zu'",filename,size,content->stat.size);
+  XBT_DEBUG("\tRead file '%s' size '%zu/%zu'",filename,size,content->stat.size);
   if(size > content->stat.size)
     size = content->stat.size;
   surf_action_t action = storage_action_execute(storage,size,READ);
@@ -96,7 +97,7 @@ static surf_action_t storage_action_write(void *storage, const void* ptr, size_t
 {
   char *filename = stream->name;
   surf_stat_t content = stream->content;
-  XBT_DEBUG("\tWrite file '%s' size '%Zu/%Zu'",filename,size,content->stat.size);
+  XBT_DEBUG("\tWrite file '%s' size '%zu/%zu'",filename,size,content->stat.size);
 
   surf_action_t action = storage_action_execute(storage,size,WRITE);
   content->stat.size += size;
@@ -108,7 +109,7 @@ static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_
   surf_action_storage_t action = NULL;
   storage_t STORAGE = storage;
 
-  XBT_IN("(%s,%Zu)", surf_resource_name(STORAGE), size);
+  XBT_IN("(%s,%zu)", surf_resource_name(STORAGE), size);
   action =
       surf_action_new(sizeof(s_surf_action_storage_t), size, surf_storage_model,
           STORAGE->state_current != SURF_RESOURCE_ON);
@@ -119,12 +120,14 @@ static surf_action_t storage_action_execute (void *storage, size_t size, e_surf_
   GENERIC_LMM_ACTION(action).variable =
       lmm_variable_new(storage_maxmin_system, action, 1.0, -1.0 , 3);
 
+  // Must be less than the max bandwidth for all actions
+  lmm_expand(storage_maxmin_system, STORAGE->constraint,
+             GENERIC_LMM_ACTION(action).variable, 1.0);
+
   switch(type) {
   case OPEN:
   case CLOSE:
   case STAT:
-    lmm_expand(storage_maxmin_system, STORAGE->constraint,
-               GENERIC_LMM_ACTION(action).variable, 1.0);
     break;
   case READ:
     lmm_expand(storage_maxmin_system, STORAGE->constraint_read,
@@ -153,17 +156,17 @@ static void* storage_create_resource(const char* id, const char* model,const cha
   storage->state_current = SURF_RESOURCE_ON;
 
   storage_type_t storage_type = xbt_lib_get_or_null(storage_type_lib, type_id,ROUTING_STORAGE_TYPE_LEVEL);
-  size_t Bread  = atof(xbt_dict_get(storage_type->properties,"Bread"));
-  size_t Bwrite = atof(xbt_dict_get(storage_type->properties,"Bwrite"));
-  size_t Bconnection   = atof(xbt_dict_get(storage_type->properties,"Bconnection"));
-  XBT_INFO("Create resource with Bconnection '%Zu' Bread '%Zu' Bwrite '%Zu'",Bconnection,Bread,Bwrite);
+  double Bread  = atof(xbt_dict_get(storage_type->properties,"Bread"));
+  double Bwrite = atof(xbt_dict_get(storage_type->properties,"Bwrite"));
+  double Bconnection   = atof(xbt_dict_get(storage_type->properties,"Bconnection"));
+  XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%ld'",Bconnection,Bread,Bwrite,storage_type->size);
   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);
 
   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\tmodel '%s' \n\t\tproperties '%p'\n\t\tBread '%Zu'\n",
+  XBT_DEBUG("SURF storage create resource\n\t\tid '%s'\n\t\ttype '%s' \n\t\tmodel '%s' \n\t\tproperties '%p'\n\t\tBread '%f'\n",
       id,
       model,
       type_id,
@@ -414,8 +417,9 @@ static void free_storage_content(void *p)
   free(content);
 }
 
-static xbt_dict_t parse_storage_content(const char *filename)
+static xbt_dict_t parse_storage_content(const char *filename, unsigned long *used_size)
 {
+  *used_size = 0;
   if ((!filename) || (strcmp(filename, "") == 0))
     return NULL;
 
@@ -435,19 +439,21 @@ static xbt_dict_t parse_storage_content(const char *filename)
   char date[12];
   char time[12];
   char path[1024];
-  int nb, size;
+  int nb;
+  long size;
 
   surf_stat_t content;
 
   while ((read = getline(&line, &len, file)) != -1) {
     content = xbt_new0(s_surf_stat_t,1);
-    if(sscanf(line,"%s %d %s %s %d %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) {
+    if(sscanf(line,"%s %d %s %s %ld %s %s %s",user_rights,&nb,user,group,&size,date,time,path)==8) {
       content->stat.date = xbt_strdup(date);
       content->stat.group = xbt_strdup(group);
       content->stat.size = size;
       content->stat.time = xbt_strdup(time);
       content->stat.user = xbt_strdup(user);
       content->stat.user_rights = xbt_strdup(user_rights);
+      *used_size += content->stat.size;
       xbt_dict_set(parse_content,path,content,NULL);
     } else {
       xbt_die("Be sure of passing a good format for content file.\n");
@@ -457,7 +463,6 @@ static xbt_dict_t parse_storage_content(const char *filename)
   }
   if (line)
       free(line);
-
   fclose(file);
   return parse_content;
 }
@@ -470,14 +475,14 @@ static void storage_parse_storage_type(sg_platf_storage_type_cbarg_t storage_typ
   storage_type_t stype = xbt_new0(s_storage_type_t, 1);
   stype->model = xbt_strdup(storage_type->model);
   stype->properties = storage_type->properties;
-  stype->content = parse_storage_content(storage_type->content);
+  stype->content = parse_storage_content(storage_type->content,&(stype->used_size));
   stype->type_id = xbt_strdup(storage_type->id);
+  stype->size = storage_type->size * 1000000000; /* storage_type->size is in Gbytes and stype->sizeis in bytes */
 
-  XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s' content '%s' and properties '%p'",
+  XBT_DEBUG("ROUTING Create a storage type id '%s' with model '%s' content '%s'",
       stype->type_id,
       stype->model,
-      storage_type->content,
-      stype->properties);
+      storage_type->content);
 
   xbt_lib_set(storage_type_lib,
       stype->type_id,