@@ -855,51 +855,49 @@ register_metadata(pdc_transfer_request_start_all_pkg **transfer_request_input, i
855855 remain_size = input_size - size ;
856856 output_size = 0 ;
857857
858- index = 0 ;
859858 qsort (transfer_requests , size , sizeof (pdc_transfer_request_start_all_pkg * ),
860859 sort_by_metadata_server_start_all );
861- for (i = 1 ; i < size ; ++ i ) {
862- if (transfer_requests [i ]-> transfer_request -> metadata_server_id !=
863- transfer_requests [i - 1 ]-> transfer_request -> metadata_server_id ) {
864- n_objs = i - index ;
865- pack_region_metadata_query (transfer_requests + index , n_objs , & buf , & total_buf_size );
866- PDC_Client_transfer_request_metadata_query (
867- & bulk_handle , buf , total_buf_size , n_objs ,
868- transfer_requests [index ]-> transfer_request -> metadata_server_id , is_write , & output_buf_size ,
869- & query_id );
870- PDCregion_transfer_add_bulk_handle (transfer_requests [index ]-> transfer_request , bulk_handle );
871- buf = (char * )PDC_free (buf );
872- if (query_id ) {
873- output_buf = (char * )PDC_malloc (output_buf_size );
874- PDC_Client_transfer_request_metadata_query2 (
875- & bulk_handle , output_buf , output_buf_size , query_id ,
876- transfer_requests [index ]-> transfer_request -> metadata_server_id );
877- PDCregion_transfer_add_bulk_handle (transfer_requests [index ]-> transfer_request , bulk_handle );
878- unpack_region_metadata_query (output_buf , transfer_requests + index , & transfer_request_head ,
879- & transfer_request_end , & output_size );
880- output_buf = (char * )PDC_free (output_buf );
881- if (transfer_request_front_head ) {
882- previous -> next = transfer_request_head ;
883- }
884- else {
885- transfer_request_front_head = transfer_request_head ;
886- }
887- previous = transfer_request_end ;
888- }
889- index = i ;
860+
861+ // Each iteration finds the first transfer that has a target meta server different from the previous one
862+ // index is the first transfer index
863+ int current_unique_idx = 0 ;
864+ int * unique_server_xfer_idx = NULL ;
865+ int * unique_server_nboj = NULL ;
866+ if (size > 0 ) {
867+ unique_server_xfer_idx = (int * )PDC_calloc (size , sizeof (int ));
868+ unique_server_nboj = (int * )PDC_calloc (size , sizeof (int ));
869+ }
870+
871+ // Iterate through the input array
872+ for (i = 0 ; i < size ; ++ i ) {
873+ if (i == 0 || transfer_requests [i ]-> transfer_request -> metadata_server_id !=
874+ transfer_requests [i - 1 ]-> transfer_request -> metadata_server_id ) {
875+ // Check if the current element is different from the previous one
876+ // or if it's the first element
877+ unique_server_xfer_idx [current_unique_idx ] = i ;
878+ unique_server_nboj [current_unique_idx ] = 1 ;
879+
880+ current_unique_idx ++ ;
881+ }
882+ else {
883+ unique_server_nboj [current_unique_idx - 1 ]++ ;
890884 }
891885 }
886+ int num_unique_server_ids = current_unique_idx ;
887+
888+ // Now we will try to distribute the metadata requests to different servers across clients
889+ for (i = 0 ; i < num_unique_server_ids ; i ++ ) {
890+ int current_index = (pdc_client_mpi_rank_g + i ) % num_unique_server_ids ;
891+ index = unique_server_xfer_idx [current_index ];
892+ n_objs = unique_server_nboj [current_index ];
892893
893- if (size ) {
894- n_objs = size - index ;
895894 pack_region_metadata_query (transfer_requests + index , n_objs , & buf , & total_buf_size );
896895 PDC_Client_transfer_request_metadata_query (
897896 & bulk_handle , buf , total_buf_size , n_objs ,
898897 transfer_requests [index ]-> transfer_request -> metadata_server_id , is_write , & output_buf_size ,
899898 & query_id );
900899 PDCregion_transfer_add_bulk_handle (transfer_requests [index ]-> transfer_request , bulk_handle );
901900 buf = (char * )PDC_free (buf );
902- // If it is a valid query ID, then it means regions are overlapping.
903901 if (query_id ) {
904902 output_buf = (char * )PDC_malloc (output_buf_size );
905903 PDC_Client_transfer_request_metadata_query2 (
@@ -909,16 +907,21 @@ register_metadata(pdc_transfer_request_start_all_pkg **transfer_request_input, i
909907 unpack_region_metadata_query (output_buf , transfer_requests + index , & transfer_request_head ,
910908 & transfer_request_end , & output_size );
911909 output_buf = (char * )PDC_free (output_buf );
912- if (transfer_request_front_head ) {
910+
911+ if (transfer_request_front_head )
913912 previous -> next = transfer_request_head ;
914- }
915- else {
913+ else
916914 transfer_request_front_head = transfer_request_head ;
917- }
915+
918916 previous = transfer_request_end ;
919917 }
920918 }
921919
920+ if (unique_server_xfer_idx )
921+ free (unique_server_xfer_idx );
922+ if (unique_server_nboj )
923+ free (unique_server_nboj );
924+
922925 if (output_size ) {
923926 transfer_request_output = (pdc_transfer_request_start_all_pkg * * )PDC_malloc (
924927 sizeof (pdc_transfer_request_start_all_pkg * ) * (output_size + remain_size ));
0 commit comments