@@ -4491,247 +4491,159 @@ _setup_zfp(struct pdc_region_info *region_info, zfp_stream **zfp)
44914491}
44924492#endif
44934493
4494- #define PRINT_DATA
4494+ typedef enum {
4495+ IO_READ ,
4496+ IO_WRITE
4497+ } IO_TYPE ;
44954498
4496- perr_t
4497- PDC_Server_data_write_out_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4498- size_t unit )
4499+ static perr_t
4500+ PDC_Server_data_io_from_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4501+ size_t unit , IO_TYPE io_type )
44994502{
45004503 int ret_value = SUCCEED ;
45014504
45024505 FUNC_ENTER (NULL );
45034506
45044507 LOG_JUST_PRINT ("===============================================\n" );
4505- LOG_JUST_PRINT ("Called with parameters:\n" );
4508+ LOG_JUST_PRINT ("IO (%s) called with parameters:\n" , io_type == IO_READ ? "READ" : "WRITE " );
45064509 LOG_JUST_PRINT ("\tobj_id: %" PRIu64 "\n" , obj_id );
45074510 LOG_JUST_PRINT ("\tregion_info: %p\n" , (void * )region_info );
45084511 LOG_JUST_PRINT ("\tbuf: %p\n" , buf );
45094512 LOG_JUST_PRINT ("\tunit: %zu\n" , unit );
45104513
4511- for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4512- printf ("\tregion_info->offset[%d] = %d\n" , i , region_info -> offset [i ]);
4513- }
4514- for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4515- printf ("\tregion_info->size[%d] = %d\n" , i , region_info -> size [i ]);
4514+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4515+ printf ("\tregion_info->offset[%d] = %" PRIu64 "\n" , i , region_info -> offset [i ]);
4516+ printf ("\tregion_info->size[%d] = %" PRIu64 "\n" , i , region_info -> size [i ]);
45164517 }
45174518
4518- // compute total write size in bytes/ elements
4519- uint64_t write_size_elements = region_info -> size [ 0 ] ;
4520- for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4521- write_size_elements *= region_info -> size [i ];
4519+ // Compute total number of elements
4520+ uint64_t num_elements = 1 ;
4521+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4522+ num_elements *= region_info -> size [i ];
45224523 }
4523- uint64_t write_size_bytes = write_size_elements * unit ;
45244524
4525- if (write_size_bytes == 0 ) {
4526- PGOTO_ERROR (FAIL , "Write size was 0 " );
4525+ if (num_elements == 0 || unit == 0 ) {
4526+ PGOTO_ERROR (FAIL , "Requested I/O with 0 size " );
45274527 }
45284528
4529- // compute total write offset in bytes/elements
4530- uint64_t write_offset_size_elements = 0 ;
4531- uint64_t stride = 1 ;
4532- for (int i = region_info -> ndim - 1 ; i >= 0 ; i -- ) {
4533- write_offset_size_elements += region_info -> offset [i ] * stride ;
4534- stride *= region_info -> size [i ];
4529+ pdc_metadata_t * obj_meta = PDC_Server_get_obj_metadata (obj_id );
4530+ if (obj_meta == NULL ) {
4531+ PGOTO_ERROR (FAIL , "Object metadata not found" );
45354532 }
45364533
45374534 data_server_region_t * region = PDC_Server_get_obj_region (obj_id );
4535+ uint64_t * global_size = obj_meta -> dims ;
4536+ uint64_t * offset = region_info -> offset ;
4537+ int ndim = region_info -> ndim ;
45384538
4539- // compute region index
4540- uint64_t region_index ;
4541- if (region == NULL ) {
4542- region_index = write_offset_size_elements / write_size_elements ;
4539+ printf ("\tobj meta ndim: %d\n" , ndim );
4540+ for (int i = 0 ; i < ndim ; i ++ ) {
4541+ printf ("\tobj meta dims[%d] = %" PRIu64 "\n" , i , global_size [i ]);
45434542 }
4544- else {
4545- region_index = write_offset_size_elements / region -> region_size_elements ;
4543+
4544+ // Compute flat offset from global start
4545+ uint64_t flat_offset = 0 , stride = 1 ;
4546+ for (int i = ndim - 1 ; i >= 0 ; i -- ) {
4547+ flat_offset += offset [i ] * stride ;
4548+ stride *= global_size [i ];
45464549 }
45474550
4548- // loop through file regions and update/create if necessary
4549- while (write_size_elements > 0 ) {
4550- LOG_JUST_PRINT ("\tregion index: %lu\n" , region_index );
4551+ // Determine initial region index
4552+ uint64_t region_index = 0 ;
4553+ if (region == NULL ) {
4554+ region_index = 0 ;
4555+ } else {
4556+ region_index = flat_offset / region -> region_size_elements ;
4557+ }
45514558
4552- PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
4559+ // Register the initial region
4560+ PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
45534561
4554- if (!region ) {
4555- LOG_ERROR ("Failed to find region with obj_id: %" PRIu64 "\n" , obj_id );
4556- PGOTO_ERROR (FAIL , "Failed to find region" );
4557- }
4558- if (region -> storage_location [region_index ] == NULL ) {
4559- LOG_ERROR ("Storage location was NULL\n" );
4560- PGOTO_ERROR (FAIL , "Storage location was null" );
4562+ // Allocate indices for iteration
4563+ uint64_t * indices = (uint64_t * )calloc (ndim , sizeof (uint64_t ));
4564+ if (indices == NULL ) {
4565+ PGOTO_ERROR (FAIL , "calloc failed for indices" );
4566+ }
4567+
4568+ for (uint64_t count = 0 ; count < num_elements ; count ++ ) {
4569+ // Compute flat index
4570+ uint64_t flat_index = 0 ;
4571+ uint64_t temp_stride = 1 ;
4572+ for (int i = ndim - 1 ; i >= 0 ; i -- ) {
4573+ flat_index += (offset [i ] + indices [i ]) * temp_stride ;
4574+ temp_stride *= global_size [i ];
45614575 }
45624576
4563- // update region size if it has not been initialized
4564- if (region -> region_size_elements == UNITIALIZED_DATA_SERVER_REGION_SIZE_ELEMENTS ) {
4565- region -> region_size_elements = write_size_elements ;
4577+ // Determine region
4578+ uint64_t new_region_index = flat_index / region -> region_size_elements ;
4579+ if (new_region_index != region_index ) {
4580+ if (region ) {
4581+ PDC_Server_unregister_obj_region_by_pointer (region , 0 );
4582+ region = NULL ;
4583+ }
4584+ region_index = new_region_index ;
4585+ PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
45664586 }
45674587
4568- // get offset remainder of current region write
4569- uint64_t remainder_elements = write_offset_size_elements % region -> region_size_elements ;
4588+ if (region == NULL || region -> region_size_elements == 0 ) {
4589+ PGOTO_ERROR (FAIL , "Region not properly initialized" );
4590+ }
45704591
4571- // compute current region write size
4572- uint64_t cur_write_size_elements =
4573- PDC_MIN (region -> region_size_elements - remainder_elements , write_size_elements );
4592+ // Compute offset within region
4593+ uint64_t offset_region = flat_index % region -> region_size_elements ;
4594+ void * target_buf = (char * )buf + (count * unit );
4595+ off_t file_offset = offset_region * unit ;
45744596
4575- if ( remainder_elements != 0 ) {
4576- LOG_JUST_PRINT ( "Shifted by %d\n" , remainder_elements * unit );
4577- lseek (region -> fd , remainder_elements * unit , SEEK_SET );
4597+ ssize_t res ;
4598+ if ( io_type == IO_READ ) {
4599+ res = pread (region -> fd , target_buf , unit , file_offset );
45784600 } else {
4579- LOG_JUST_PRINT ("No shift\n" );
4580- lseek (region -> fd , 0 , SEEK_SET );
4601+ res = pwrite (region -> fd , target_buf , unit , file_offset );
45814602 }
45824603
4583- LOG_JUST_PRINT ("Write information:\n" );
4584- LOG_JUST_PRINT ("\tstorage location: %s\n" , region -> storage_location [region_index ]);
4585- LOG_JUST_PRINT ("\tsize bytes: %lu\n" , cur_write_size_elements * unit );
4586- LOG_JUST_PRINT ("\toffset bytes: %lu\n" , remainder_elements * unit );
4587- LOG_JUST_PRINT ("\tfd: %d\n" , region -> fd );
4588-
4589- #ifdef PRINT_DATA
4590- for (int i = 0 ; i < cur_write_size_elements ; i ++ ) {
4591- int * data = (int * )buf ;
4592- LOG_JUST_PRINT ("[%3d]=%12d " , i , data [i ]);
4593- if ((i + 1 ) % 5 == 0 )
4594- LOG_JUST_PRINT ("\n" );
4604+ if (res != (ssize_t )unit ) {
4605+ perror (io_type == IO_READ ? "pread" : "pwrite" );
4606+ PGOTO_ERROR (FAIL , "I/O operation failed" );
45954607 }
4596- LOG_JUST_PRINT ("\n" );
4597- #endif
45984608
4599- perr_t write_stat = PDC_Server_posix_write (region -> fd , buf , cur_write_size_elements * unit );
4600- if (write_stat != SUCCEED ) {
4601- PGOTO_ERROR (FAIL , "Failed to posix write region\n" );
4609+ // Advance indices
4610+ for (int d = ndim - 1 ; d >= 0 ; d -- ) {
4611+ indices [d ]++ ;
4612+ if (indices [d ] < region_info -> size [d ]) {
4613+ break ;
4614+ } else {
4615+ indices [d ] = 0 ;
4616+ }
46024617 }
4618+ }
46034619
4620+ done :
4621+ if (region ) {
46044622 PDC_Server_unregister_obj_region_by_pointer (region , 0 );
4605-
4606- // Advance state for next region (if needed)
4607- buf = (char * )buf + cur_write_size_elements * unit ;
4608- write_size_elements -= cur_write_size_elements ;
4609- write_offset_size_elements += cur_write_size_elements ;
4610- region_index = write_offset_size_elements / region -> region_size_elements ;
4623+ region = NULL ;
46114624 }
46124625
4626+ if (indices )
4627+ free (indices );
4628+
46134629 LOG_JUST_PRINT ("===============================================\n" );
46144630
4615- done :
46164631 FUNC_LEAVE (ret_value );
46174632}
46184633
4634+
46194635perr_t
4620- PDC_Server_data_read_from_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4621- size_t unit )
4636+ PDC_Server_data_write_out_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4637+ size_t unit )
46224638{
4623- int ret_value = SUCCEED ;
4624-
4625- FUNC_ENTER (NULL );
4626-
4627- LOG_JUST_PRINT ("===============================================\n" );
4628- LOG_JUST_PRINT ("READ called with parameters:\n" );
4629- LOG_JUST_PRINT ("\tobj_id: %" PRIu64 "\n" , obj_id );
4630- LOG_JUST_PRINT ("\tregion_info: %p\n" , (void * )region_info );
4631- LOG_JUST_PRINT ("\tbuf: %p\n" , buf );
4632- LOG_JUST_PRINT ("\tunit: %zu\n" , unit );
4633-
4634- for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4635- printf ("\tregion_info->offset[%d] = %d\n" , i , region_info -> offset [i ]);
4636- }
4637- for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4638- printf ("\tregion_info->size[%d] = %d\n" , i , region_info -> size [i ]);
4639- }
4640-
4641- // compute total read size in bytes/elements
4642- uint64_t read_size_elements = region_info -> size [0 ];
4643- for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4644- read_size_elements *= region_info -> size [i ];
4645- }
4646- uint64_t read_size_bytes = read_size_elements * unit ;
4647-
4648- if (read_size_bytes == 0 ) {
4649- PGOTO_ERROR (FAIL , "Read size was 0" );
4650- }
4651-
4652- // compute total read offset size bytes/elements
4653- uint64_t read_offset_elements = 0 ;
4654- uint64_t stride = 1 ;
4655- for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4656- read_offset_elements += region_info -> offset [i ] * stride ;
4657- stride *= region_info -> size [i ];
4658- }
4659-
4660- data_server_region_t * region = PDC_Server_get_obj_region (obj_id );
4661-
4662- // compute region index
4663- uint64_t region_index ;
4664- if (region == NULL ) {
4665- region_index = read_offset_elements / read_size_elements ;
4666- } else {
4667- region_index = read_offset_elements / region -> region_size_elements ;
4668- }
4669-
4670- // loop through file regions and update/create if necessary
4671- while (read_size_elements > 0 ) {
4672- LOG_JUST_PRINT ("\tregion index: %lu\n" , region_index );
4673-
4674- PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
4675- if (!region ) {
4676- LOG_ERROR ("Failed to find region with obj_id: %" PRIu64 "\n" , obj_id );
4677- PGOTO_ERROR (FAIL , "Failed to find region" );
4678- }
4679- if (region -> storage_location [region_index ] == NULL ) {
4680- LOG_ERROR ("Storage location was NULL\n" );
4681- PGOTO_ERROR (FAIL , "Storage location was null" );
4682- }
4683-
4684- // get current region offset
4685- uint64_t remainder_elements = read_offset_elements % region -> region_size_elements ;
4686-
4687- // calculate how much to read from this region
4688- uint64_t cur_read_size_elements =
4689- PDC_MIN (region -> region_size_elements - remainder_elements , read_size_elements );
4690-
4691- // seek to correct offset
4692- if (remainder_elements != 0 ) {
4693- LOG_JUST_PRINT ("Shifted by %d\n" , remainder_elements * unit );
4694- lseek (region -> fd , remainder_elements * unit , SEEK_SET );
4695- } else {
4696- LOG_JUST_PRINT ("No shift\n" );
4697- lseek (region -> fd , 0 , SEEK_SET );
4698- }
4699-
4700- LOG_JUST_PRINT ("Read information:\n" );
4701- LOG_JUST_PRINT ("\tstorage location: %s\n" , region -> storage_location [region_index ]);
4702- LOG_JUST_PRINT ("\tsize bytes: %lu\n" , cur_read_size_elements * unit );
4703- LOG_JUST_PRINT ("\toffset bytes: %lu\n" , remainder_elements * unit );
4704- LOG_JUST_PRINT ("\tfd: %d\n" , region -> fd );
4705-
4706- // read from file
4707- ssize_t bytes_read = read (region -> fd , buf , cur_read_size_elements * unit );
4708- if (bytes_read < 0 || (size_t )bytes_read != cur_read_size_elements * unit ) {
4709- PGOTO_ERROR (FAIL , "Failed to read from region file" );
4710- }
4711-
4712- #ifdef PRINT_DATA
4713- for (int i = 0 ; i < cur_read_size_elements ; i ++ ) {
4714- int * data = (int * )buf ;
4715- LOG_JUST_PRINT ("[%3d]=%12d " , i , data [i ]);
4716- if ((i + 1 ) % 5 == 0 )
4717- LOG_JUST_PRINT ("\n" );
4718- }
4719- LOG_JUST_PRINT ("\n" );
4720- #endif
4721-
4722- PDC_Server_unregister_obj_region_by_pointer (region , 0 );
4723-
4724- // advance
4725- buf = (char * )buf + cur_read_size_elements * unit ;
4726- read_offset_elements += cur_read_size_elements ;
4727- read_size_elements -= cur_read_size_elements ;
4728- region_index = read_offset_elements / region -> region_size_elements ;
4729- }
4730-
4731- LOG_JUST_PRINT ("===============================================\n" );
4639+ return PDC_Server_data_io_from_region_per_file (obj_id , region_info , buf , unit , IO_WRITE );
4640+ }
47324641
4733- done :
4734- FUNC_LEAVE (ret_value );
4642+ perr_t
4643+ PDC_Server_data_read_from_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4644+ size_t unit )
4645+ {
4646+ return PDC_Server_data_io_from_region_per_file (obj_id , region_info , buf , unit , IO_READ );
47354647}
47364648
47374649perr_t
@@ -4760,7 +4672,6 @@ PDC_Server_data_write_out(uint64_t obj_id, struct pdc_region_info *region_info,
47604672 write_size = unit * region_info -> size [0 ];
47614673 if (region_info -> ndim >= 2 )
47624674 write_size *= region_info -> size [1 ];
4763-
47644675 if (region_info -> ndim >= 3 )
47654676 write_size *= region_info -> size [2 ];
47664677 region = PDC_Server_get_obj_region (obj_id );
0 commit comments