From 517643f146678574693ee13a4857d55c1893f02b Mon Sep 17 00:00:00 2001
From: Quincey Koziol <koziol@hdfgroup.org>
Date: Sun, 1 Feb 2004 22:58:29 -0500
Subject: [svn-r8144] Purpose:     Bug fix.

Description:
    Revert the optimization to the MPI-I/O VFD from earlier this week that
eliminated calling MPI_File_set_size() when a file was truncated.  This doesn't
work because of the way we track the 'eoa' (end of allocated space) in the
file: we just advance the eoa value when space is allocated in the file and we
don't zero out the space in the file.  This causes a problem where we assume
that all "newly allocated" space in the file contains zero bytes, but if we
don't call MPI_File_set_size(), the file can contain the previous data (if the
file previously existed) and not zeros.
    Unfortunately, because we allow independent raw data parallel I/O, there
is no way to address this issue. :-(

Solution:
    Revert to previous method of retrieving the file's size, etc. from before
the optimization.

Platforms tested:
    FreeBSD 4.9 (sleipnir) w/parallel
    too minor to require h5committest.
---
 src/H5FDmpio.c | 82 +++++++++++++---------------------------------------------
 1 file changed, 18 insertions(+), 64 deletions(-)

diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c
index 3a56e0e..4d550a3 100644
--- a/src/H5FDmpio.c
+++ b/src/H5FDmpio.c
@@ -57,7 +57,6 @@ typedef struct H5FD_mpio_t {
     MPI_Info	info;		/*file information			*/
     int         mpi_rank;       /* This process's rank                  */
     int         mpi_size;       /* Total number of processes            */
-    hbool_t	truncate_pending; /* Whether a file truncation is pending */
     haddr_t	eof;		/*end-of-file marker			*/
     haddr_t	eoa;		/*end-of-address marker			*/
     haddr_t	last_eoa;	/* Last known end-of-address marker	*/
@@ -796,52 +795,29 @@ H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
     file->mpi_rank = mpi_rank;
     file->mpi_size = mpi_size;
 
-    /* Determine if the file should be truncated */
-    if(flags & H5F_ACC_TRUNC) {
-#ifdef H5_MPI_FILE_SET_SIZE_BIG
-        /* Indicate that a 'truncate' operation is pending on the file */
-        file->truncate_pending=TRUE;
-
-        /* File is treated as zero size now */
-        size=0;
-#else /* H5_MPI_FILE_SET_SIZE_BIG */
-        /* Only processor p0 will get the filesize and broadcast it. */
-        if (mpi_rank == 0) {
-            /* Get current file size */
-            if (MPI_SUCCESS != (mpi_code=MPI_File_get_size(fh, &size)))
-                HMPI_GOTO_ERROR(NULL, "MPI_File_get_size failed", mpi_code)
-        } /* end if */
+    /* Only processor p0 will get the filesize and broadcast it. */
+    if (mpi_rank == 0) {
+        /* Get current file size */
+        if (MPI_SUCCESS != (mpi_code=MPI_File_get_size(fh, &size)))
+            HMPI_GOTO_ERROR(NULL, "MPI_File_get_size failed", mpi_code)
+    } /* end if */
 
-        /* Broadcast file-size */
-        if (MPI_SUCCESS != (mpi_code=MPI_Bcast(&size, sizeof(MPI_Offset), MPI_BYTE, 0, comm_dup)))
-            HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
+    /* Broadcast file size */
+    if (MPI_SUCCESS != (mpi_code=MPI_Bcast(&size, sizeof(MPI_Offset), MPI_BYTE, 0, comm_dup)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
 
-        /* Only truncate the file if it is non-zero length */
-        if(size) {
-            if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(fh, (MPI_Offset)0)))
-                HMPI_GOTO_ERROR(NULL, "MPI_File_set_size failed", mpi_code)
+    /* Determine if the file should be truncated */
+    if(size && (flags & H5F_ACC_TRUNC)) {
+        if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(fh, (MPI_Offset)0)))
+            HMPI_GOTO_ERROR(NULL, "MPI_File_set_size failed", mpi_code)
 
-            /* Don't let any proc return until all have truncated the file. */
-            if (MPI_SUCCESS!= (mpi_code=MPI_Barrier(comm_dup)))
-                HMPI_GOTO_ERROR(NULL, "MPI_Barrier failed", mpi_code)
+        /* Don't let any proc return until all have truncated the file. */
+        if (MPI_SUCCESS!= (mpi_code=MPI_Barrier(comm_dup)))
+            HMPI_GOTO_ERROR(NULL, "MPI_Barrier failed", mpi_code)
 
-            /* File is zero size now */
-            size = 0;
-        } /* end if */
-#endif /* H5_MPI_FILE_SET_SIZE_BIG */
+        /* File is zero size now */
+        size = 0;
     } /* end if */
-    else {
-        /* Only processor p0 will get the filesize and broadcast it. */
-        if (mpi_rank == 0) {
-            /* Get current file size */
-            if (MPI_SUCCESS != (mpi_code=MPI_File_get_size(fh, &size)))
-                HMPI_GOTO_ERROR(NULL, "MPI_File_get_size failed", mpi_code)
-        } /* end if */
-
-        /* Broadcast file size */
-        if (MPI_SUCCESS != (mpi_code=MPI_Bcast(&size, sizeof(MPI_Offset), MPI_BYTE, 0, comm_dup)))
-            HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
-    } /* end else */
 
     /* Set the size of the file (from library's perspective) */
     file->eof = H5FD_mpi_MPIOff_to_haddr(size);
@@ -908,25 +884,6 @@ H5FD_mpio_close(H5FD_t *_file)
     assert(file);
     assert(H5FD_MPIO==file->pub.driver_id);
 
-#ifdef H5_MPI_FILE_SET_SIZE_BIG
-    /* Check if we should truncate the file */
-    if(file->truncate_pending) {
-        MPI_Offset 	mpi_off;        /* Offset to write test data at */
-
-        /* Some numeric conversions */
-        assert(file->eoa>0);
-        if (H5FD_mpi_haddr_to_MPIOff(file->eoa, &mpi_off)<0)
-            HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
-
-        /* Truncate the extra data off the end */
-        /* (Don't worry about a barrier after the call, since we are closing) */
-        if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(file->f, mpi_off)))
-            HMPI_DONE_ERROR(NULL, "MPI_File_set_size failed", mpi_code)
-    } /* end if */
-#else /* H5_MPI_FILE_SET_SIZE_BIG */
-    assert(!file->truncate_pending);
-#endif /* H5_MPI_FILE_SET_SIZE_BIG */
-
     /* MPI_File_close sets argument to MPI_FILE_NULL */
     if (MPI_SUCCESS != (mpi_code=MPI_File_close(&(file->f)/*in,out*/)))
         HMPI_GOTO_ERROR(FAIL, "MPI_File_close failed", mpi_code)
@@ -1714,9 +1671,6 @@ H5FD_mpio_flush(H5FD_t *_file, hid_t UNUSED dxpl_id, unsigned closing)
         /* Extend the file's size */
         if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(file->f, mpi_off)))
             HMPI_GOTO_ERROR(FAIL, "MPI_File_set_size failed", mpi_code)
-
-        /* File does not need to be truncated now */
-        file->truncate_pending=FALSE;
 #else /* H5_MPI_FILE_SET_SIZE_BIG */
         if (0==file->mpi_rank) {
             uint8_t             byte=0;
-- 
cgit v0.12