diff options
author | jhendersonHDF <jhenderson@hdfgroup.org> | 2022-03-25 21:31:06 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-25 21:31:06 (GMT) |
commit | 15971fbd160ab061725f238379cc638ed37f05ef (patch) | |
tree | 1be26bd1be27c67ba674ddc39611d68959c3c207 /src/H5Dio.c | |
parent | f73b4c618cb680f8be9b2f2510c34442ec24d713 (diff) | |
download | hdf5-15971fbd160ab061725f238379cc638ed37f05ef.zip hdf5-15971fbd160ab061725f238379cc638ed37f05ef.tar.gz hdf5-15971fbd160ab061725f238379cc638ed37f05ef.tar.bz2 |
Hdf5 1 12 merges (#1528)
* Use internal version of H5Eprint2 to avoid possible stack overflow (#661)
* Add support for parallel filters to h5repack (#832)
* Allow parallel filters feature for comm size of 1 (#840)
* Avoid popping API context when one wasn't pushed (#848)
* Fix several warnings (#720)
* Don't allow H5Pset(get)_all_coll_metadata_ops for DXPLs (#1201)
* Fix free list tracking and cleanup cast alignment warnings (#1288)
* Fix free list tracking and cleanup cast alignment warnings
* Add free list tracking code to H5FL 'arr' routines
* Fix usage of several HDfprintf format specifiers after HDfprintf removal (#1324)
* Use appropriate printf format specifiers for haddr_t and hsize_t types directly (#1340)
* Fix H5ACmpio dirty bytes creation debugging (#1357)
* Fix documentation for H5D_space_status_t enum values (#1372)
* Parallel rank0 deadlock fixes (#1183)
* Fix several places where rank 0 can skip past collective MPI operations on failure
* Committing clang-format changes
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
* Fix a few issues noted by LGTM (#1421)
* Fix cache sanity checking code by moving functions to wider scope (#1435)
* Fix metadata cache bug when resizing a pinned/protected entry (v2) (#1463)
* Disable memory alloc sanity checks by default for Autotools debug builds (#1468)
* Committing clang-format changes
Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Diffstat (limited to 'src/H5Dio.c')
-rw-r--r-- | src/H5Dio.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/src/H5Dio.c b/src/H5Dio.c index 355aec1..beea547 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -1097,11 +1097,19 @@ H5D__ioinfo_adjust(H5D_io_info_t *io_info, const H5D_t *dset, const H5S_t *file_ io_info->io_ops.single_write = H5D__mpio_select_write; } /* end if */ else { + int comm_size = 0; + + /* Retrieve size of MPI communicator used for file */ + if ((comm_size = H5F_shared_mpi_get_size(io_info->f_sh)) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't get MPI communicator size") + /* Check if there are any filters in the pipeline. If there are, - * we cannot break to independent I/O if this is a write operation; - * otherwise there will be metadata inconsistencies in the file. + * we cannot break to independent I/O if this is a write operation + * with multiple ranks involved; otherwise, there will be metadata + * inconsistencies in the file. */ - if (io_info->op_type == H5D_IO_OP_WRITE && io_info->dset->shared->dcpl_cache.pline.nused > 0) { + if (comm_size > 1 && io_info->op_type == H5D_IO_OP_WRITE && + io_info->dset->shared->dcpl_cache.pline.nused > 0) { H5D_mpio_no_collective_cause_t cause; uint32_t local_no_collective_cause; uint32_t global_no_collective_cause; @@ -1135,28 +1143,40 @@ H5D__ioinfo_adjust(H5D_io_info_t *io_info, const H5D_t *dset, const H5S_t *file_ for (cause = 1, idx = 0; (cause < H5D_MPIO_NO_COLLECTIVE_MAX_CAUSE) && (idx < cause_strings_len); cause <<= 1, idx++) { - size_t cause_strlen = HDstrlen(cause_strings[idx]); - if (cause & local_no_collective_cause) { + size_t local_buffer_space = sizeof(local_no_collective_cause_string) - + HDstrlen(local_no_collective_cause_string) - 1; + /* Check if there were any previous error messages included. If so, prepend a * semicolon to separate the messages. */ - if (local_error_message_previously_written) - HDstrncat(local_no_collective_cause_string, "; ", 2); + if (local_buffer_space && local_error_message_previously_written) { + HDstrncat(local_no_collective_cause_string, "; ", local_buffer_space); + local_buffer_space -= MIN(local_buffer_space, 2); + } - HDstrncat(local_no_collective_cause_string, cause_strings[idx], cause_strlen); + if (local_buffer_space) + HDstrncat(local_no_collective_cause_string, cause_strings[idx], + local_buffer_space); local_error_message_previously_written = TRUE; } /* end if */ if (cause & global_no_collective_cause) { + size_t global_buffer_space = sizeof(global_no_collective_cause_string) - + HDstrlen(global_no_collective_cause_string) - 1; + /* Check if there were any previous error messages included. If so, prepend a * semicolon to separate the messages. */ - if (global_error_message_previously_written) - HDstrncat(global_no_collective_cause_string, "; ", 2); - - HDstrncat(global_no_collective_cause_string, cause_strings[idx], cause_strlen); + if (global_buffer_space && global_error_message_previously_written) { + HDstrncat(global_no_collective_cause_string, "; ", global_buffer_space); + global_buffer_space -= MIN(global_buffer_space, 2); + } + + if (global_buffer_space) + HDstrncat(global_no_collective_cause_string, cause_strings[idx], + global_buffer_space); global_error_message_previously_written = TRUE; } /* end if */ |