Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
remove a now unused parameter
[simgrid.git] / src / surf / HostImpl.cpp
1 /* Copyright (c) 2013-2016. The SimGrid Team. All rights reserved.          */
2
3 /* This program is free software; you can redistribute it and/or modify it
4  * under the terms of the license (GNU LGPL) which comes with this package. */
5
6 #include "src/surf/HostImpl.hpp"
7 #include "src/plugins/vm/VirtualMachineImpl.hpp"
8
9 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_host, surf, "Logging specific to the SURF host module");
10
11 simgrid::surf::HostModel *surf_host_model = nullptr;
12
13 /*************
14  * Callbacks *
15  *************/
16
17 namespace simgrid {
18 namespace surf {
19
20 /*********
21  * Model *
22  *********/
23
24 /* Each VM has a dummy CPU action on the PM layer. This CPU action works as the
25  * constraint (capacity) of the VM in the PM layer. If the VM does not have any
26  * active task, the dummy CPU action must be deactivated, so that the VM does
27  * not get any CPU share in the PM layer. */
28 void HostModel::adjustWeightOfDummyCpuActions()
29 {
30   /* iterate for all virtual machines */
31   for (s4u::VirtualMachine* ws_vm : vm::VirtualMachineImpl::allVms_) {
32
33     Cpu* cpu = ws_vm->pimpl_cpu;
34
35     int is_active = lmm_constraint_used(cpu->getModel()->getMaxminSystem(), cpu->getConstraint());
36
37     if (is_active) {
38       /* some tasks exist on this VM */
39       XBT_DEBUG("set the weight of the dummy CPU action on PM to 1");
40
41       /* FIXME: we should use lmm_update_variable_weight() ? */
42       /* FIXME: If we assign 1.05 and 0.05, the system makes apparently wrong values. */
43       ws_vm->pimpl_vm_->action_->setPriority(1);
44
45     } else {
46       /* no task exits on this VM */
47       XBT_DEBUG("set the weight of the dummy CPU action on PM to 0");
48
49       ws_vm->pimpl_vm_->action_->setPriority(0);
50     }
51   }
52 }
53
54 Action* HostModel::executeParallelTask(int host_nb, simgrid::s4u::Host** host_list, double* flops_amount,
55                                        double* bytes_amount, double rate)
56 {
57 #define cost_or_zero(array,pos) ((array)?(array)[pos]:0.0)
58   Action* action = nullptr;
59   if ((host_nb == 1) && (cost_or_zero(bytes_amount, 0) == 0.0)) {
60     action = host_list[0]->pimpl_cpu->execution_start(flops_amount[0]);
61   } else if ((host_nb == 1) && (cost_or_zero(flops_amount, 0) == 0.0)) {
62     action = surf_network_model->communicate(host_list[0], host_list[0], bytes_amount[0], rate);
63   } else if ((host_nb == 2) && (cost_or_zero(flops_amount, 0) == 0.0) && (cost_or_zero(flops_amount, 1) == 0.0)) {
64     int i, nb = 0;
65     double value = 0.0;
66
67     for (i = 0; i < host_nb * host_nb; i++) {
68       if (cost_or_zero(bytes_amount, i) > 0.0) {
69         nb++;
70         value = cost_or_zero(bytes_amount, i);
71       }
72     }
73     if (nb == 1) {
74       action = surf_network_model->communicate(host_list[0], host_list[1], value, rate);
75     } else if (nb == 0) {
76       xbt_die("Cannot have a communication with no flop to exchange in this model. You should consider using the "
77               "ptask model");
78     } else {
79       xbt_die("Cannot have a communication that is not a simple point-to-point in this model. You should consider "
80               "using the ptask model");
81     }
82   } else
83     xbt_die("This model only accepts one of the following. You should consider using the ptask model for the other "
84             "cases.\n - execution with one host only and no communication\n - Self-comms with one host only\n - "
85             "Communications with two hosts and no computation");
86 #undef cost_or_zero
87   xbt_free(host_list);
88   return action;
89 }
90
91 /************
92  * Resource *
93  ************/
94 HostImpl::HostImpl(s4u::Host* host) : piface_(host)
95 {
96   piface_->pimpl_ = this;
97 }
98
99 /** @brief use destroy() instead of this destructor */
100 HostImpl::~HostImpl() = default;
101
102 simgrid::surf::Storage* HostImpl::findStorageOnMountList(const char* mount)
103 {
104   simgrid::surf::Storage* st = nullptr;
105   s_mount_t mnt;
106   unsigned int cursor;
107
108   XBT_DEBUG("Search for storage name '%s' on '%s'", mount, piface_->cname());
109   xbt_dynar_foreach (storage_, cursor, mnt) {
110     XBT_DEBUG("See '%s'", mnt.name);
111     if (!strcmp(mount, mnt.name)) {
112       st = static_cast<simgrid::surf::Storage*>(mnt.storage);
113       break;
114     }
115   }
116   if (!st)
117     xbt_die("Can't find mount '%s' for '%s'", mount, piface_->cname());
118   return st;
119 }
120
121 xbt_dict_t HostImpl::getMountedStorageList()
122 {
123   s_mount_t mnt;
124   unsigned int i;
125   xbt_dict_t storage_list = xbt_dict_new_homogeneous(nullptr);
126   char* storage_name      = nullptr;
127
128   xbt_dynar_foreach (storage_, i, mnt) {
129     storage_name = (char*)static_cast<simgrid::surf::Storage*>(mnt.storage)->getName();
130     xbt_dict_set(storage_list, mnt.name, storage_name, nullptr);
131   }
132   return storage_list;
133 }
134
135 xbt_dynar_t HostImpl::getAttachedStorageList()
136 {
137   xbt_lib_cursor_t cursor;
138   char* key;
139   void** data;
140   xbt_dynar_t result = xbt_dynar_new(sizeof(void*), nullptr);
141   xbt_lib_foreach(storage_lib, cursor, key, data)
142   {
143     if (xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != nullptr) {
144       simgrid::surf::Storage* storage = static_cast<simgrid::surf::Storage*>(
145           xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL));
146       if (!strcmp((const char*)storage->attach_, piface_->cname())) {
147         xbt_dynar_push_as(result, void*, (void*)storage->getName());
148       }
149     }
150   }
151   return result;
152     }
153
154     Action* HostImpl::open(const char* fullpath)
155     {
156
157       simgrid::surf::Storage* st = nullptr;
158       s_mount_t mnt;
159       unsigned int cursor;
160       size_t longest_prefix_length = 0;
161       char* path                   = nullptr;
162       char* file_mount_name        = nullptr;
163       char* mount_name             = nullptr;
164
165       XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath, piface_->cname());
166       xbt_dynar_foreach (storage_, cursor, mnt) {
167         XBT_DEBUG("See '%s'", mnt.name);
168         file_mount_name = (char*)xbt_malloc((strlen(mnt.name) + 1));
169         strncpy(file_mount_name, fullpath, strlen(mnt.name) + 1);
170         file_mount_name[strlen(mnt.name)] = '\0';
171
172         if (!strcmp(file_mount_name, mnt.name) &&
173             strlen(mnt.name) > longest_prefix_length) { /* The current mount name is found in the full path and is
174                                                            bigger than the previous*/
175           longest_prefix_length = strlen(mnt.name);
176           st                    = static_cast<simgrid::surf::Storage*>(mnt.storage);
177         }
178         free(file_mount_name);
179       }
180       if (longest_prefix_length > 0) { /* Mount point found, split fullpath into mount_name and path+filename*/
181         path       = (char*)xbt_malloc((strlen(fullpath) - longest_prefix_length + 1));
182         mount_name = (char*)xbt_malloc((longest_prefix_length + 1));
183         strncpy(mount_name, fullpath, longest_prefix_length + 1);
184         strncpy(path, fullpath + longest_prefix_length, strlen(fullpath) - longest_prefix_length + 1);
185         path[strlen(fullpath) - longest_prefix_length] = '\0';
186         mount_name[longest_prefix_length]              = '\0';
187       } else
188         xbt_die("Can't find mount point for '%s' on '%s'", fullpath, piface_->cname());
189
190       XBT_DEBUG("OPEN %s on disk '%s'", path, st->getName());
191       Action* action = st->open((const char*)mount_name, (const char*)path);
192       free((char*)path);
193       free((char*)mount_name);
194       return action;
195     }
196
197     Action* HostImpl::close(surf_file_t fd)
198     {
199       simgrid::surf::Storage* st = findStorageOnMountList(fd->mount);
200       XBT_DEBUG("CLOSE %s on disk '%s'", fd->name, st->getName());
201       return st->close(fd);
202     }
203
204     Action* HostImpl::read(surf_file_t fd, sg_size_t size)
205     {
206       simgrid::surf::Storage* st = findStorageOnMountList(fd->mount);
207       XBT_DEBUG("READ %s on disk '%s'", fd->name, st->getName());
208       return st->read(fd, size);
209     }
210
211     Action* HostImpl::write(surf_file_t fd, sg_size_t size)
212     {
213       simgrid::surf::Storage* st = findStorageOnMountList(fd->mount);
214       XBT_DEBUG("WRITE %s on disk '%s'", fd->name, st->getName());
215       return st->write(fd, size);
216     }
217
218     int HostImpl::unlink(surf_file_t fd)
219     {
220       if (!fd) {
221         XBT_WARN("No such file descriptor. Impossible to unlink");
222         return -1;
223       } else {
224
225         simgrid::surf::Storage* st = findStorageOnMountList(fd->mount);
226         /* Check if the file is on this storage */
227         if (!xbt_dict_get_or_null(st->content_, fd->name)) {
228           XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name, st->getName());
229           return -1;
230         } else {
231           XBT_DEBUG("UNLINK %s on disk '%s'", fd->name, st->getName());
232           st->usedSize_ -= fd->size;
233
234           // Remove the file from storage
235           xbt_dict_remove(st->content_, fd->name);
236
237           xbt_free(fd->name);
238           xbt_free(fd->mount);
239           xbt_free(fd);
240           return 0;
241         }
242       }
243     }
244
245     sg_size_t HostImpl::getSize(surf_file_t fd)
246     {
247       return fd->size;
248     }
249
250     xbt_dynar_t HostImpl::getInfo(surf_file_t fd)
251     {
252       simgrid::surf::Storage* st = findStorageOnMountList(fd->mount);
253       sg_size_t* psize           = xbt_new(sg_size_t, 1);
254       *psize                     = fd->size;
255       xbt_dynar_t info           = xbt_dynar_new(sizeof(void*), nullptr);
256       xbt_dynar_push_as(info, sg_size_t*, psize);
257       xbt_dynar_push_as(info, void*, fd->mount);
258       xbt_dynar_push_as(info, void*, (void*)st->getName());
259       xbt_dynar_push_as(info, void*, st->typeId_);
260       xbt_dynar_push_as(info, void*, st->contentType_);
261
262       return info;
263     }
264
265     sg_size_t HostImpl::fileTell(surf_file_t fd)
266     {
267       return fd->current_position;
268     }
269
270     int HostImpl::fileSeek(surf_file_t fd, sg_offset_t offset, int origin)
271     {
272
273       switch (origin) {
274         case SEEK_SET:
275           fd->current_position = offset;
276           return 0;
277         case SEEK_CUR:
278           fd->current_position += offset;
279           return 0;
280         case SEEK_END:
281           fd->current_position = fd->size + offset;
282           return 0;
283         default:
284           return -1;
285       }
286     }
287
288     int HostImpl::fileMove(surf_file_t fd, const char* fullpath)
289     {
290       /* Check if the new full path is on the same mount point */
291       if (!strncmp((const char*)fd->mount, fullpath, strlen(fd->mount))) {
292         sg_size_t* psize = (sg_size_t*)xbt_dict_get_or_null(findStorageOnMountList(fd->mount)->content_, fd->name);
293         if (psize) { // src file exists
294           sg_size_t* new_psize = xbt_new(sg_size_t, 1);
295           *new_psize           = *psize;
296           xbt_dict_remove(findStorageOnMountList(fd->mount)->content_, fd->name);
297           char* path = (char*)xbt_malloc((strlen(fullpath) - strlen(fd->mount) + 1));
298           strncpy(path, fullpath + strlen(fd->mount), strlen(fullpath) - strlen(fd->mount) + 1);
299           xbt_dict_set(findStorageOnMountList(fd->mount)->content_, path, new_psize, nullptr);
300           XBT_DEBUG("Move file from %s to %s, size '%llu'", fd->name, fullpath, *psize);
301           free(path);
302           return 0;
303         } else {
304           XBT_WARN("File %s doesn't exist", fd->name);
305           return -1;
306         }
307       } else {
308         XBT_WARN("New full path %s is not on the same mount point: %s. Action has been canceled.", fullpath, fd->mount);
309         return -1;
310       }
311     }
312
313     }
314     }