Skip to content

Commit 8c851ea

Browse files
committed
all tests pass
1 parent e371ee9 commit 8c851ea

File tree

3 files changed

+108
-196
lines changed

3 files changed

+108
-196
lines changed

src/server/pdc_server_region/pdc_server_data.c

Lines changed: 102 additions & 191 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
46194635
perr_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

47374649
perr_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);

src/tests/region_transfer_2D_partial.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ main(int argc, char **argv)
181181

182182
memset(data_read, 0, BUF_LEN);
183183

184+
LOG_INFO("Sleeping for 1 s\n");
185+
sleep(2);
186+
184187
transfer_request = PDCregion_transfer_create(data_read, PDC_READ, obj1, reg, reg_global);
185188

186189
PDCregion_transfer_start(transfer_request);
@@ -191,10 +194,8 @@ main(int argc, char **argv)
191194
for (i = 0; i < BUF_LEN / 2; ++i) {
192195
if (data_read[i] != i * 2 + 1) {
193196
LOG_JUST_PRINT("wrong value %d!=%d\n", data_read[i], i * 2 + 1);
194-
//ret_value = 1;
195-
//break;
196-
} else {
197-
LOG_JUST_PRINT("right value %d!=%d\n", data_read[i], i * 2 + 1);
197+
ret_value = 1;
198+
break;
198199
}
199200
}
200201

src/tests/sandbox.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
#include <unistd.h>
2929
#include "pdc.h"
3030

31-
#define NPARTICLES 100
31+
#define NPARTICLES 10
3232
#define PARTICLE_VAL 5.5f
3333

3434
#define CHECK_AND_PRINT_GT(condition, success_msg, fail_msg) \

0 commit comments

Comments
 (0)