Skip to content

Commit d7a40f2

Browse files
authored
Merge pull request #30 from SidoShiro/dump-dump-all
Dump dump all
2 parents ab5a6a1 + 7c2f64c commit d7a40f2

1 file changed

Lines changed: 84 additions & 29 deletions

File tree

src/network/leader.c

Lines changed: 84 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,20 @@ void get_command(struct leader_resources *l_r, unsigned short user) {
209209
n_command->data = d_s;
210210
l_r->leader_command_queue = push_command(l_r->leader_command_queue, n_command);
211211
break;
212+
case OP_DUMP:
213+
debug("Leader recv OP DUMP from User", l_r->id);
214+
n_command->command = m->op;
215+
n_command->data = NULL;
216+
struct data_address *d_a = generate_data_address(m->address);
217+
n_command->data = d_a;
218+
l_r->leader_command_queue = push_command(l_r->leader_command_queue, n_command);
219+
break;
220+
case OP_DUMP_ALL:
221+
debug("Leader recv OP DUMP ALL from User", l_r->id);
222+
n_command->command = m->op;
223+
n_command->data = NULL;
224+
l_r->leader_command_queue = push_command(l_r->leader_command_queue, n_command);
225+
break;
212226
default:
213227
debug("Leader recv ANY OP from User", l_r->id);
214228
break;
@@ -274,28 +288,28 @@ void execute_read(struct leader_resources *l_r) {
274288
size_t x = d_r->size;
275289
size_t offset = 0;
276290
for (size_t i = part_s; x > 0 && i < c_a->number_parts; i++) {
277-
// TODO handle size overflow
278291
struct block *b = c_a->parts[i];
279-
// compute size to read for this block
280-
size_t to_read_size = 0;
281-
if (x <= b->size) {
282-
to_read_size = x;
283-
x = 0;
284-
} else {
285-
x -= b->size;
286-
to_read_size = b->size;
287-
}
288292

289293
// compute local address to write
290294
size_t local_address = 0;
291295
if (b->virtual_address == to_write_address_v) {
292-
local_address = 0;
293-
to_write_address_v += to_read_size;
296+
local_address = b->node_address;
297+
} else {
298+
local_address += to_write_address_v - b->virtual_address + b->node_address;
299+
}
300+
301+
// compute size to write for this block
302+
size_t to_read_size = 0;
303+
size_t b_size_with_offset = b->size - (local_address - b->node_address);
304+
if (x <= b_size_with_offset) {
305+
to_read_size = x;
306+
x = 0;
294307
} else {
295-
local_address += to_write_address_v - b->virtual_address;
296-
to_write_address_v += to_read_size;
308+
x -= b_size_with_offset;
309+
to_read_size = b_size_with_offset;
297310
}
298311

312+
to_write_address_v += to_read_size;
299313
nb_read_size += to_read_size;
300314
// 3 Send READ OP to each node (Warning to the local address of the node, not the virtual)
301315
struct message *m = generate_message(l_r->id, b->id, b->id, local_address, to_read_size, OP_READ);
@@ -304,7 +318,7 @@ void execute_read(struct leader_resources *l_r) {
304318
void *buff = malloc(sizeof(char) * (to_read_size + 1));
305319
MPI_Status st;
306320
MPI_Recv(buff, to_read_size, MPI_BYTE, b->id, 4, MPI_COMM_WORLD, &st);
307-
memcpy((void*)(read_buff + (offset * sizeof(char))), buff, to_read_size);
321+
memcpy((void *) (read_buff + (offset * sizeof(char))), buff, to_read_size);
308322
offset += to_read_size;
309323
nb_read++;
310324
free(m);
@@ -336,27 +350,28 @@ void execute_write(struct leader_resources *l_r) {
336350
size_t x = d_w->size;
337351
size_t offset = 0;
338352
for (size_t i = part_s; x > 0 && i < c_a->number_parts; i++) {
339-
// TODO handle size overflow
340353
struct block *b = c_a->parts[i];
354+
355+
// compute local address to write
356+
size_t local_address = 0;
357+
if (b->virtual_address == to_write_address_v) {
358+
local_address = b->node_address;
359+
} else {
360+
local_address += to_write_address_v - b->virtual_address + b->node_address;
361+
}
362+
341363
// compute size to write for this block
342364
size_t to_write_size = 0;
343-
if (x <= b->size) {
365+
size_t b_size_with_offset = b->size - (local_address - b->node_address);
366+
if (x <= b_size_with_offset) {
344367
to_write_size = x;
345368
x = 0;
346369
} else {
347-
x -= b->size;
348-
to_write_size = b->size;
370+
x -= b_size_with_offset;
371+
to_write_size = b_size_with_offset;
349372
}
350373

351-
// compute local address to write
352-
size_t local_address = 0;
353-
if (b->virtual_address == to_write_address_v) {
354-
local_address = 0;
355-
to_write_address_v += to_write_size;
356-
} else {
357-
local_address += to_write_address_v - b->virtual_address;
358-
to_write_address_v += to_write_size;
359-
}
374+
to_write_address_v += to_write_size;
360375

361376
// struct queue *q = queue_init();
362377
// printf("Size to send for Write %zu\n\n", to_write_size);
@@ -369,7 +384,7 @@ void execute_write(struct leader_resources *l_r) {
369384
MPI_Recv(&m2, sizeof(struct message), MPI_BYTE, b->id, 3, MPI_COMM_WORLD, &st);
370385
debug("Send Data", l_r->id);
371386
// debug_n(d_w->data, l_r->id, d_w->size);
372-
MPI_Send((void*)((char*)d_w->data + offset), to_write_size, MPI_BYTE, b->id, 4, MPI_COMM_WORLD);
387+
MPI_Send((void *) ((char *) d_w->data + offset), to_write_size, MPI_BYTE, b->id, 4, MPI_COMM_WORLD);
373388
offset += to_write_size;
374389
}
375390

@@ -382,6 +397,40 @@ void execute_write(struct leader_resources *l_r) {
382397
// MPI_Isend()
383398
}
384399

400+
void execute_dump(struct leader_resources *l_r) {
401+
struct data_address *d_a;
402+
d_a = peek_command(l_r->leader_command_queue);
403+
// 1 Get correct allocation (Handle notFound)
404+
size_t part_s = 0;
405+
struct allocation *c_a = give_for_v_address(l_r, d_a->address, &part_s);
406+
if (c_a == NULL) {
407+
debug("Seg Fault: requested dump to a not allocated address", l_r->id);
408+
return;
409+
}
410+
size_t offset = 0;
411+
size_t a_size = size_of_allocation(c_a);
412+
char *dump = malloc(sizeof(char) * (a_size + 2));
413+
for (size_t i = 0; i < c_a->number_parts; i++) {
414+
struct block *b = c_a->parts[i];
415+
struct message *m = generate_message(l_r->id, b->id, b->id, b->node_address, b->size, OP_READ);
416+
debug("Send Read OP", l_r->id);
417+
MPI_Send(m, sizeof(struct message), MPI_BYTE, b->id, 3, MPI_COMM_WORLD);
418+
void *buff = malloc(sizeof(char) * (b->size + 1));
419+
MPI_Status st;
420+
MPI_Recv(buff, b->size, MPI_BYTE, b->id, 4, MPI_COMM_WORLD, &st);
421+
memcpy((void *) (dump + (offset * sizeof(char))), buff, b->size);
422+
offset += b->size;
423+
}
424+
425+
// Dump done
426+
debug("Dump :", l_r->id);
427+
debug_n(dump, l_r->id, a_size + 1);
428+
}
429+
430+
void execute_dump_all(struct leader_resources *l_r) {
431+
(void) l_r;
432+
}
433+
385434
void execute_command(struct leader_resources *l_r) {
386435
if (peek_user_command(l_r->leader_command_queue) != OP_NONE) {
387436

@@ -402,6 +451,12 @@ void execute_command(struct leader_resources *l_r) {
402451
execute_read(l_r);
403452
break;
404453
case OP_DUMP:
454+
debug("EXECUTE OP DUMP, LEADER", l_r->id);
455+
execute_dump(l_r);
456+
break;
457+
case OP_DUMP_ALL:
458+
debug("EXECUTE OP DUMP ALL, LEADER", l_r->id);
459+
execute_dump_all(l_r);
405460
break;
406461
case OP_SNAP:
407462
break;

0 commit comments

Comments
 (0)