@@ -383,7 +383,7 @@ PDC_Server_register_obj_region_by_pointer(data_server_region_t **new_obj_reg_ptr
383383 new_obj_reg -> close_flag = close_flag ;
384384 // FIXME: (Noah)
385385 new_obj_reg -> storage_location [region_index ] = (char * )malloc (sizeof (char ) * ADDR_MAX );
386- new_obj_reg -> original_region_size = -1 ;
386+ new_obj_reg -> region_size_elements = UNITIALIZED_DATA_SERVER_REGION_SIZE_ELEMENTS ;
387387 new_obj_reg -> fd =
388388 server_open_storage (new_obj_reg -> storage_location [region_index ], obj_id , region_index );
389389
@@ -4491,6 +4491,8 @@ _setup_zfp(struct pdc_region_info *region_info, zfp_stream **zfp)
44914491}
44924492#endif
44934493
4494+ #define PRINT_DATA
4495+
44944496perr_t
44954497PDC_Server_data_write_out_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
44964498 size_t unit )
@@ -4506,49 +4508,108 @@ PDC_Server_data_write_out_region_per_file(uint64_t obj_id, struct pdc_region_inf
45064508 LOG_JUST_PRINT ("\tbuf: %p\n" , buf );
45074509 LOG_JUST_PRINT ("\tunit: %zu\n" , unit );
45084510
4509- // compute total write size in bytes
4510- uint64_t write_size_bytes = region_info -> size [0 ];
4511- for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4512- write_size_bytes *= region_info -> size [i ];
4511+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4512+ printf ("\tregion_info->offset[%d] = %d\n" , i , region_info -> offset [i ]);
45134513 }
4514- write_size_bytes *= unit ;
4515- if (write_size_bytes <= 0 ) {
4516- PGOTO_ERROR (FAIL , "Write size was <= 0" );
4514+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4515+ printf ("\tregion_info->size[%d] = %d\n" , i , region_info -> size [i ]);
45174516 }
45184517
4519- // compute the total offset in bytes
4520- uint64_t offset_size_bytes = region_info -> offset [0 ];
4518+ // compute total write size in bytes/elements
4519+ uint64_t write_size_elements = region_info -> size [0 ];
45214520 for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4522- offset_size_bytes *= region_info -> offset [i ];
4521+ write_size_elements *= region_info -> size [i ];
45234522 }
4524- offset_size_bytes *= unit ;
4523+ uint64_t write_size_bytes = write_size_elements * unit ;
45254524
4526- // FIXME: (Noah) not sure if this is a good way to do this... compute region index
4527- uint64_t region_index = offset_size_bytes / write_size_bytes ;
4528- LOG_JUST_PRINT ("\tregion index: %lu\n" , region_index );
4525+ if (write_size_bytes == 0 ) {
4526+ PGOTO_ERROR (FAIL , "Write size was 0" );
4527+ }
4528+
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 ];
4535+ }
45294536
4530- // get storage location
45314537 data_server_region_t * region = PDC_Server_get_obj_region (obj_id );
4532- PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
45334538
4534- if (!region ) {
4535- LOG_ERROR ("Failed to find region with obj_id: %d\n" , obj_id );
4536- PGOTO_ERROR (FAIL , "Failed to find region" );
4539+ // compute region index
4540+ uint64_t region_index ;
4541+ if (region == NULL ) {
4542+ region_index = write_offset_size_elements / write_size_elements ;
4543+ }
4544+ else {
4545+ region_index = write_offset_size_elements / region -> region_size_elements ;
45374546 }
45384547
4539- // FIXME: (Noah)
4540- LOG_JUST_PRINT ("Write information:\n" );
4541- LOG_JUST_PRINT ("\tstorage location: %s\n" , region -> storage_location [region_index ]);
4542- LOG_JUST_PRINT ("\tsize bytes: %lu\n" , write_size_bytes );
4543- LOG_JUST_PRINT ("\toffset bytes: %lu\n" , offset_size_bytes );
4544- LOG_JUST_PRINT ("\tfd: %d\n" , region -> fd );
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+
4552+ PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
4553+
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" );
4561+ }
4562+
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 ;
4566+ }
4567+
4568+ // get offset remainder of current region write
4569+ uint64_t remainder_elements = write_offset_size_elements % region -> region_size_elements ;
4570+
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 );
4574+
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 );
4578+ } else {
4579+ LOG_JUST_PRINT ("No shift\n" );
4580+ lseek (region -> fd , 0 , SEEK_SET );
4581+ }
4582+
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" );
4595+ }
4596+ LOG_JUST_PRINT ("\n" );
4597+ #endif
4598+
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" );
4602+ }
4603+
4604+ PDC_Server_unregister_obj_region_by_pointer (region , 0 );
45454605
4546- perr_t write_stat = PDC_Server_posix_write (region -> fd , buf , write_size_bytes );
4547- if (write_stat != SUCCEED ) {
4548- PGOTO_ERROR (FAIL , "Failed to posix write region\n" );
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 ;
45494611 }
45504612
4551- PDC_Server_unregister_obj_region_by_pointer (region , 0 );
45524613 LOG_JUST_PRINT ("===============================================\n" );
45534614
45544615done :
@@ -4557,63 +4618,116 @@ PDC_Server_data_write_out_region_per_file(uint64_t obj_id, struct pdc_region_inf
45574618
45584619perr_t
45594620PDC_Server_data_read_from_region_per_file (uint64_t obj_id , struct pdc_region_info * region_info , void * buf ,
4560- size_t unit )
4621+ size_t unit )
45614622{
45624623 int ret_value = SUCCEED ;
45634624
45644625 FUNC_ENTER (NULL );
45654626
45664627 LOG_JUST_PRINT ("===============================================\n" );
4567- LOG_JUST_PRINT ("Called with parameters:\n" );
4628+ LOG_JUST_PRINT ("READ called with parameters:\n" );
45684629 LOG_JUST_PRINT ("\tobj_id: %" PRIu64 "\n" , obj_id );
45694630 LOG_JUST_PRINT ("\tregion_info: %p\n" , (void * )region_info );
45704631 LOG_JUST_PRINT ("\tbuf: %p\n" , buf );
45714632 LOG_JUST_PRINT ("\tunit: %zu\n" , unit );
45724633
4573- // compute total write size in bytes
4574- uint64_t read_size_bytes = region_info -> size [0 ];
4575- for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4576- read_size_bytes *= region_info -> size [i ];
4634+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4635+ printf ("\tregion_info->offset[%d] = %d\n" , i , region_info -> offset [i ]);
45774636 }
4578- read_size_bytes *= unit ;
4579- if (read_size_bytes <= 0 ) {
4580- PGOTO_ERROR (FAIL , "Read size was <= 0" );
4637+ for (int i = 0 ; i < region_info -> ndim ; i ++ ) {
4638+ printf ("\tregion_info->size[%d] = %d\n" , i , region_info -> size [i ]);
45814639 }
45824640
4583- // compute the total offset in bytes
4584- uint64_t offset_size_bytes = region_info -> offset [0 ];
4641+ // compute total read size in bytes/elements
4642+ uint64_t read_size_elements = region_info -> size [0 ];
45854643 for (int i = 1 ; i < region_info -> ndim ; i ++ ) {
4586- offset_size_bytes *= region_info -> offset [i ];
4644+ read_size_elements *= region_info -> size [i ];
45874645 }
4588- offset_size_bytes *= unit ;
4646+ uint64_t read_size_bytes = read_size_elements * unit ;
45894647
4590- // FIXME: (Noah) not sure if this is a good way to do this... compute region index
4591- uint64_t region_index = offset_size_bytes / read_size_bytes ;
4592- LOG_JUST_PRINT ("\tregion index: %lu\n" , region_index );
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+ }
45934659
4594- // get storage location
45954660 data_server_region_t * region = PDC_Server_get_obj_region (obj_id );
4596- PDC_Server_register_obj_region_by_pointer (& region , obj_id , 0 , region_index );
45974661
4598- if (!region ) {
4599- LOG_ERROR ("Failed to find region with obj_id: %d\n" , obj_id );
4600- PGOTO_ERROR (FAIL , "Failed to find region" );
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 ;
46014668 }
46024669
4603- // FIXME: (Noah)
4604- LOG_JUST_PRINT ("Read information:\n" );
4605- LOG_JUST_PRINT ("\tstorage location: %s\n" , region -> storage_location [region_index ]);
4606- LOG_JUST_PRINT ("\tsize bytes: %lu\n" , read_size_bytes );
4607- LOG_JUST_PRINT ("\toffset bytes: %lu\n" , offset_size_bytes );
4608- LOG_JUST_PRINT ("\tfd: %d\n" , region -> fd );
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+ }
46094683
4610- // region index acts as the offset so the offset here is 0
4611- ssize_t bytes_read = pread (region -> fd , buf , read_size_bytes , 0 );
4612- if (bytes_read != read_size_bytes ) {
4613- PGOTO_ERROR (FAIL , "Failed to posix read region\n" );
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 ;
46144729 }
46154730
4616- PDC_Server_unregister_obj_region_by_pointer (region , 0 );
46174731 LOG_JUST_PRINT ("===============================================\n" );
46184732
46194733done :
0 commit comments