Author: goodell Date: 2012-11-20 16:20:59 -0600 (Tue, 20 Nov 2012) New Revision: 10641 Modified: mpich2/trunk/src/mpi/romio/adio/common/ad_close.c mpich2/trunk/src/mpi/romio/adio/common/ad_delete.c mpich2/trunk/src/mpi/romio/adio/include/adioi.h Log: only one task should actually delete in ADIO_Close Contributed by IBM. Based on patch 0013 from code discussions. Modified: mpich2/trunk/src/mpi/romio/adio/common/ad_close.c =================================================================== --- mpich2/trunk/src/mpi/romio/adio/common/ad_close.c 2012-11-20 22:20:58 UTC (rev 10640) +++ mpich2/trunk/src/mpi/romio/adio/common/ad_close.c 2012-11-20 22:20:59 UTC (rev 10641) @@ -14,7 +14,8 @@ void ADIO_Close(ADIO_File fd, int *error_code) { - int i, j, k, combiner, myrank, err, is_contig; + int err = MPI_SUCCESS; + int i, j, k, combiner, myrank, is_contig; static char myname[] = "ADIO_CLOSE"; if (fd->async_count) { @@ -47,14 +48,21 @@ } if (fd->access_mode & ADIO_DELETE_ON_CLOSE) { + int is_agg_ldr = 0; + ADIOI_IS_AGG_LEADER(fd, &is_agg_ldr); /* if we are doing aggregation and deferred open, then it's possible * that rank 0 does not have access to the file. make sure only an * aggregator deletes the file.*/ MPI_Comm_rank(fd->comm, &myrank); - if (myrank == fd->hints->ranklist[0]) { - ADIO_Delete(fd->filename, &err); + if (is_agg_ldr) { + ADIO_Delete(fd->filename, &err); } MPI_Barrier(fd->comm); + MPI_Bcast(&err, 1, MPI_INT, fd->hints->ranklist[0], fd->comm); + if (err != MPI_SUCCESS) { + *error_code = err; + return; + } } if (fd->fortran_handle != -1) { Modified: mpich2/trunk/src/mpi/romio/adio/common/ad_delete.c =================================================================== --- mpich2/trunk/src/mpi/romio/adio/common/ad_delete.c 2012-11-20 22:20:58 UTC (rev 10640) +++ mpich2/trunk/src/mpi/romio/adio/common/ad_delete.c 2012-11-20 22:20:59 UTC (rev 10641) @@ -18,9 +18,7 @@ err = unlink(filename); if (err == -1) { - *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, - myname, __LINE__, MPI_ERR_IO, "**io", - "**io %s", strerror(errno)); + *error_code = ADIOI_Err_create_code(myname, filename, errno); return; } else *error_code = MPI_SUCCESS; Modified: mpich2/trunk/src/mpi/romio/adio/include/adioi.h =================================================================== --- mpich2/trunk/src/mpi/romio/adio/include/adioi.h 2012-11-20 22:20:58 UTC (rev 10640) +++ mpich2/trunk/src/mpi/romio/adio/include/adioi.h 2012-11-20 22:20:59 UTC (rev 10641) @@ -78,6 +78,13 @@ }; +#define ADIOI_IS_AGG_LEADER(fh_, is_agg_p_) \ + do { \ + int rank_; \ + MPI_Comm_rank((fh_)->comm, &rank_); \ + *(is_agg_p_) = ((fh_)->hints->ranklist[0] == 0); \ + } while (0) + typedef struct ADIOI_Datarep { char *name; void *state;
participants (1)
-
goodell@mcs.anl.gov