static int builtin_posix_module_element_open_basic (builtin_posix_module_t *posix_module, builtin_posix_module_dataset_t *posix_dataset, hio_element_t element) { const char *element_name = hioi_object_identifier(element); char *path; int rc; if (HIO_SET_ELEMENT_UNIQUE == posix_dataset->base.ds_mode) { rc = asprintf (&path, "%s/element_data.%s.%05d", posix_dataset->base_path, element_name, element->e_rank); } else { rc = asprintf (&path, "%s/element_data.%s", posix_dataset->base_path, element_name); } if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } rc = builtin_posix_open_file (posix_module, posix_dataset, path, &element->e_file); free (path); if (HIO_SUCCESS != rc) { return rc; } fseek (element->e_file.f_hndl, 0, SEEK_END); element->e_size = ftell (element->e_file.f_hndl); fseek (element->e_file.f_hndl, 0, SEEK_SET); return HIO_SUCCESS; }
static int builtin_posix_element_translate_strided (builtin_posix_module_t *posix_module, hio_element_t element, uint64_t offset, size_t *size, hio_file_t **file_out) { builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) hioi_element_dataset (element); size_t block_id, block_base, block_bound, block_offset, file_id, file_block; hio_context_t context = hioi_object_context (&element->e_object); hio_file_t *file; int32_t file_index; char *path; int rc; block_id = offset / posix_dataset->ds_bs; file_id = block_id % posix_dataset->ds_fcount; file_block = block_id / posix_dataset->ds_fcount; block_base = block_id * posix_dataset->ds_bs; block_bound = block_base + posix_dataset->ds_bs; block_offset = file_block * posix_dataset->ds_bs + offset - block_base; hioi_log (context, HIO_VERBOSE_DEBUG_LOW, "builtin_posix_element_translate_strided: element: %s, offset: %" PRIu64 ", file_id: %lu, file_block: %lu, block_offset: %lu, block_size: %" PRIu64, hioi_object_identifier(element), offset, file_id, file_id, block_offset, posix_dataset->ds_bs); if (offset + *size > block_bound) { *size = block_bound - offset; } rc = asprintf (&path, "%s/data/%s_block.%08lu", posix_dataset->base_path, hioi_object_identifier(element), (unsigned long) file_id); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } /* use crc as a hash to pick a file index to use */ file_index = file_id % HIO_POSIX_MAX_OPEN_FILES; file = posix_dataset->files + file_index; if (file_id != file->f_bid || file->f_element != element) { if (file->f_bid >= 0) { POSIX_TRACE_CALL(posix_dataset, hioi_file_close (file), "file_close", file->f_bid, 0); } file->f_bid = -1; file->f_element = element; POSIX_TRACE_CALL(posix_dataset, rc = builtin_posix_open_file (posix_module, posix_dataset, path, file), "file_open", file_id, 0); if (HIO_SUCCESS != rc) { return rc; } file->f_bid = file_id; } POSIX_TRACE_CALL(posix_dataset, hioi_file_seek (file, block_offset, SEEK_SET), "file_seek", file->f_bid, block_offset); *file_out = file; return HIO_SUCCESS; }
static int builtin_posix_module_element_open_basic (builtin_posix_module_t *posix_module, builtin_posix_module_dataset_t *posix_dataset, hio_element_t element) { const char *element_name = hioi_object_identifier(element); char *path; int rc; if (HIO_SET_ELEMENT_UNIQUE == posix_dataset->base.ds_mode) { rc = asprintf (&path, "%s/data/element_data.%s.%08d", posix_dataset->base_path, element_name, element->e_rank); } else { rc = asprintf (&path, "%s/data/element_data.%s", posix_dataset->base_path, element_name); } if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } if (access (path, R_OK)) { /* fall back on old naming scheme */ if (HIO_SET_ELEMENT_UNIQUE == posix_dataset->base.ds_mode) { rc = asprintf (&path, "%s/element_data.%s.%08d", posix_dataset->base_path, element_name, element->e_rank); } else { rc = asprintf (&path, "%s/element_data.%s", posix_dataset->base_path, element_name); } if (0 > rc) { return hioi_err_errno (errno); } } POSIX_TRACE_CALL(posix_dataset, rc = builtin_posix_open_file (posix_module, posix_dataset, path, &element->e_file), "file_open", 0, 0); free (path); if (HIO_SUCCESS != rc) { return rc; } #if BUILTIN_POSIX_USE_STDIO fseek (element->e_file.f_hndl, 0, SEEK_END); element->e_size = ftell (element->e_file.f_hndl); fseek (element->e_file.f_hndl, 0, SEEK_SET); #else element->e_size = lseek (element->e_file.f_fd, 0, SEEK_END); lseek (element->e_file.f_fd, 0, SEEK_SET); #endif return HIO_SUCCESS; }
static int builtin_posix_element_translate_opt (builtin_posix_module_t *posix_module, hio_element_t element, off_t offset, size_t *size, hio_file_t **file_out, bool reading) { builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) hioi_element_dataset (element); hio_context_t context = hioi_object_context (&element->e_object); builtin_posix_file_t *file; uint64_t file_offset; int file_index; char *path; int rc; hioi_log (context, HIO_VERBOSE_DEBUG_MED, "translating element %s offset %ld size %lu", hioi_object_identifier (&element->e_object), offset, *size); rc = hioi_element_translate_offset (element, offset, &file_index, &file_offset, size); if (HIO_SUCCESS != rc) { if (reading) { hioi_log (context, HIO_VERBOSE_DEBUG_MED, "offset not found"); /* not found */ return rc; } if (hioi_context_using_mpi (context)) { rc = asprintf (&path, "%s/data.%x", posix_dataset->base_path, posix_dataset->base.ds_shared_control->s_master); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } } else { rc = asprintf (&path, "%s/data", posix_dataset->base_path); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } } file_offset = builtin_posix_reserve (posix_dataset, size); file_index = hioi_dataset_add_file (&posix_dataset->base, strrchr (path, '/') + 1); hioi_element_add_segment (element, file_index, file_offset, offset, *size); } else { hioi_log (context, HIO_VERBOSE_DEBUG_MED, "offset found in file @ index %d, offset %lu, size %lu", file_index, file_offset, *size); rc = asprintf (&path, "%s/%s", posix_dataset->base_path, posix_dataset->base.ds_flist[file_index].f_name); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } } /* use crc as a hash to pick a file index to use */ int internal_index = file_index % HIO_POSIX_MAX_OPEN_FILES; file = posix_dataset->files + internal_index; if (internal_index != file->f_bid) { if (NULL != file->f_file.f_hndl) { fclose (file->f_file.f_hndl); file->f_file.f_hndl = NULL; file->f_bid = -1; } rc = builtin_posix_open_file (posix_module, posix_dataset, path, &file->f_file); if (HIO_SUCCESS != rc) { free (path); return rc; } file->f_bid = file_index; } free (path); if (file_offset != file->f_file.f_offset) { fseek (file->f_file.f_hndl, file_offset, SEEK_SET); file->f_file.f_offset = file_offset; } *file_out = &file->f_file; return HIO_SUCCESS; }
static int builtin_posix_element_translate_opt_old (builtin_posix_module_t *posix_module, hio_element_t element, off_t offset, size_t *size, hio_file_t **file_out) { builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) hioi_element_dataset (element); hio_context_t context = hioi_object_context (&element->e_object); size_t block_id, block_base, block_bound, block_offset; builtin_posix_file_t *file; int32_t file_index; char *path; int rc, foo; block_id = offset / posix_dataset->base.ds_bs; block_base = block_id * posix_dataset->base.ds_bs; block_bound = block_base + posix_dataset->base.ds_bs; block_offset = offset - block_base; hioi_log (context, HIO_VERBOSE_DEBUG_LOW, "builtin_posix_element_translate: element: %s, offset: %lu, block_id: %lu, " "block_offset: %lu, block_size: %lu", hioi_object_identifier(element), (unsigned long) offset, block_id, block_offset, posix_dataset->base.ds_bs); if (offset + *size > block_bound) { *size = block_bound - offset; } rc = asprintf (&path, "%s_block.%lu", hioi_object_identifier(element), (unsigned long) block_id); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } if (HIO_FLAG_WRITE & posix_dataset->base.ds_flags) { foo = hioi_dataset_add_file (&posix_dataset->base, path); } char *tmp = path; rc = asprintf (&path, "%s/%s", posix_dataset->base_path, tmp); free (tmp); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } /* use crc as a hash to pick a file index to use */ file_index = hioi_crc32 ((uint8_t *) path, strlen (path)) % HIO_POSIX_MAX_OPEN_FILES; file = posix_dataset->files + file_index; if (block_id != file->f_bid || file->f_element != element) { if (file->f_file.f_hndl != NULL) { fclose (file->f_file.f_hndl); file->f_file.f_hndl = NULL; file->f_bid = -1; } file->f_element = element; rc = builtin_posix_open_file (posix_module, posix_dataset, path, &file->f_file); if (HIO_SUCCESS != rc) { return rc; } file->f_bid = block_id; } if (block_offset != file->f_file.f_offset) { fseek (file->f_file.f_hndl, block_offset, SEEK_SET); file->f_file.f_offset = block_offset; } if (HIO_FLAG_WRITE & posix_dataset->base.ds_flags) { hioi_element_add_segment (element, foo, block_offset, offset, *size); } *file_out = &file->f_file; return HIO_SUCCESS; }
static int builtin_posix_element_translate_opt (builtin_posix_module_t *posix_module, hio_element_t element, uint64_t offset, size_t *size, hio_file_t **file_out, bool reading) { builtin_posix_module_dataset_t *posix_dataset = (builtin_posix_module_dataset_t *) hioi_element_dataset (element); hio_context_t context = hioi_object_context (&element->e_object); hio_file_t *file; uint64_t file_offset; int file_index = 0; char *path; int rc; hioi_log (context, HIO_VERBOSE_DEBUG_MED, "translating element %s offset %" PRIu64 " size %lu", hioi_object_identifier (&element->e_object), offset, *size); POSIX_TRACE_CALL(posix_dataset, rc = hioi_element_translate_offset (element, offset, &file_index, &file_offset, size), "translate_offset", offset, *size); #if HIO_MPI_HAVE(3) if (HIO_SUCCESS != rc && reading) { POSIX_TRACE_CALL(posix_dataset, rc = hioi_dataset_map_translate_offset (element, offset, &file_index, &file_offset, size), "map_translate_offset", offset, *size); } #endif if (HIO_SUCCESS != rc) { if (reading) { hioi_log (context, HIO_VERBOSE_DEBUG_MED, "offset %" PRIu64 " not found", offset); /* not found */ return rc; } file_offset = builtin_posix_reserve (posix_dataset, size); if (hioi_context_using_mpi (context)) { file_index = posix_dataset->base.ds_shared_control->s_master; } else { file_index = 0; } rc = asprintf (&path, "%s/data/data.%x", posix_dataset->base_path, file_index); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } hioi_element_add_segment (element, file_index, file_offset, offset, *size); } else { hioi_log (context, HIO_VERBOSE_DEBUG_MED, "offset found in file @ rank %d, offset %" PRIu64 ", size %lu", file_index, file_offset, *size); rc = asprintf (&path, "%s/data/data.%x", posix_dataset->base_path, file_index); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } if (access (path, R_OK)) { free (path); rc = asprintf (&path, "%s/data.%x", posix_dataset->base_path, file_index); if (0 > rc) { return HIO_ERR_OUT_OF_RESOURCE; } } } /* use crc as a hash to pick a file index to use */ int internal_index = file_index % HIO_POSIX_MAX_OPEN_FILES; file = posix_dataset->files + internal_index; if (file_index != file->f_bid) { if (file->f_bid >= 0) { POSIX_TRACE_CALL(posix_dataset, hioi_file_close (file), "file_close", file->f_bid, 0); } file->f_bid = -1; POSIX_TRACE_CALL(posix_dataset, rc = builtin_posix_open_file (posix_module, posix_dataset, path, file), "file_open", file_index, 0); if (HIO_SUCCESS != rc) { free (path); return rc; } file->f_bid = file_index; } free (path); POSIX_TRACE_CALL(posix_dataset, hioi_file_seek (file, file_offset, SEEK_SET), "file_seek", file->f_bid, file_offset); *file_out = file; return HIO_SUCCESS; }