@@ -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+
385434void 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