From 8dca19cb3bf0012c24756d890d7e1444f1864321 Mon Sep 17 00:00:00 2001 From: Adrian Knoth Date: Thu, 8 Nov 2007 12:44:10 +0000 Subject: [PATCH] upstream patch, provided by Jiri Polach. Re #733 This commit was SVN r16691. --- ompi/mca/io/romio/romio/adio/common/ad_open.c | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/ompi/mca/io/romio/romio/adio/common/ad_open.c b/ompi/mca/io/romio/romio/adio/common/ad_open.c index 58aa6eeb9f..1995590250 100644 --- a/ompi/mca/io/romio/romio/adio/common/ad_open.c +++ b/ompi/mca/io/romio/romio/adio/common/ad_open.c @@ -172,6 +172,37 @@ MPI_File ADIO_Open(MPI_Comm orig_comm, */ /* pvfs2 handles opens specially, so it is actually more efficent for that * file system if we skip this optimization */ + /* NFS handles opens especially poorly, so we cannot use this optimization + * on that FS */ + if (fd->file_system == ADIO_NFS) { + /* no optimizations for NFS: */ + if ((access_mode & ADIO_CREATE) && (access_mode & ADIO_EXCL)) { + /* the open should fail if the file exists. Only *1* process should + check this. Otherwise, if all processes try to check and the file + does not exist, one process will create the file and others who + reach later will return error. */ + if(rank == fd->hints->ranklist[0]) { + fd->access_mode = access_mode; + (*(fd->fns->ADIOI_xxx_Open))(fd, error_code); + MPI_Bcast(error_code, 1, MPI_INT, \ + fd->hints->ranklist[0], fd->comm); + /* if no error, close the file and reopen normally below */ + if (*error_code == MPI_SUCCESS) + (*(fd->fns->ADIOI_xxx_Close))(fd, error_code); + } + else MPI_Bcast(error_code, 1, MPI_INT, + fd->hints->ranklist[0], fd->comm); + if (*error_code != MPI_SUCCESS) { + goto fn_exit; + } + else { + /* turn off EXCL for real open */ + access_mode = access_mode ^ ADIO_EXCL; + } + } + } else { + + /* the actual optimized create on one, open on all */ if (access_mode & ADIO_CREATE && fd->file_system != ADIO_PVFS2) { if(rank == fd->hints->ranklist[0]) { /* remove delete_on_close flag if set */ @@ -201,6 +232,7 @@ MPI_File ADIO_Open(MPI_Comm orig_comm, access_mode ^= ADIO_EXCL; } } + } /* if we are doing deferred open, non-aggregators should return now */ if (fd->hints->deferred_open ) {