@@ -1270,10 +1270,14 @@ ncmpio__enddef(void *ncdp,
12701270 /* ncp->numrecs has already sync-ed in ncmpi_redef */
12711271
12721272 if (ncp -> begin_var > ncp -> old -> begin_var &&
1273- ncp -> begin_rec > ncp -> old -> begin_rec &&
1274- ncp -> vars .ndefined == ncp -> old -> vars .ndefined ) {
1275- /* Data section grows and no new variable has been added. The
1276- * entire data section must be moved to a higher file offset.
1273+ ncp -> begin_rec - ncp -> begin_var ==
1274+ ncp -> old -> begin_rec - ncp -> old -> begin_var &&
1275+ ncp -> vars .num_rec_vars == ncp -> old -> vars .num_rec_vars ) {
1276+ /* When header extent grows, if the distance between the starting
1277+ * offsets of fix-sized and record variable sections remains the
1278+ * same, and no new record variable has been added, then the entire
1279+ * data section can be moved as a single contiguous block to a
1280+ * higher file offset.
12771281 */
12781282 /* amount of data section to be moved */
12791283 nbytes = ncp -> old -> begin_rec - ncp -> old -> begin_var
@@ -1290,8 +1294,11 @@ ncmpio__enddef(void *ncdp,
12901294 * record variable section must be moved to a higher file
12911295 * offset.
12921296 */
1293- if (ncp -> recsize == ncp -> old -> recsize ) {
1294- /* no new record variable has been added */
1297+ if (ncp -> vars .num_rec_vars == ncp -> old -> vars .num_rec_vars ) {
1298+ /* no new record variable has been added, then the entire
1299+ * record variable section can be moved as a single
1300+ * contiguous block
1301+ */
12951302
12961303 /* amount of data to be moved */
12971304 nbytes = ncp -> old -> recsize * ncp -> old -> numrecs ;
@@ -1302,7 +1309,8 @@ ncmpio__enddef(void *ncdp,
13021309 }
13031310 else {
13041311 /* new record variables have been added. Must move one
1305- * record at a time
1312+ * record at a time, because all records of record
1313+ * variables are stored interleaved in the file.
13061314 */
13071315 err = move_record_vars (ncp , ncp -> old );
13081316 if (status == NC_NOERR ) status = err ;
@@ -1311,15 +1319,25 @@ ncmpio__enddef(void *ncdp,
13111319 }
13121320
13131321 if (ncp -> begin_var > ncp -> old -> begin_var ) {
1314- /* beginning of fix-sized variable section grows. The
1315- * fix-sized variable section must be moved to a higher
1316- * file offset.
1322+ /* beginning of fix-sized variable section grows. The fix-sized
1323+ * variable section must be moved to a higher file offset.
13171324 */
1318- /* amount of data to be moved. Note there may be some free
1319- * space at the end of fix-sized variable section that need not
1320- * be moved.
1325+
1326+ /* First, find the size of fix-sized variable section, i.e.
1327+ * from the last fix-sized variable's begin and len. Note there
1328+ * may be some free space at the end of fix-sized variable
1329+ * section that need not be moved.
13211330 */
1322- nbytes = ncp -> old -> begin_rec - ncp -> old -> begin_var ;
1331+ MPI_Offset end_var = ncp -> old -> begin_var ;
1332+ for (i = ncp -> old -> vars .ndefined - 1 ; i >=0 ; i -- ) {
1333+ if (!IS_RECVAR (ncp -> old -> vars .value [i ])) {
1334+ end_var = ncp -> old -> vars .value [i ]-> begin
1335+ + ncp -> old -> vars .value [i ]-> len ;
1336+ break ;
1337+ }
1338+ }
1339+ /* amount of data to be moved */
1340+ nbytes = end_var - ncp -> old -> begin_var ;
13231341
13241342 err = move_file_block (ncp , ncp -> begin_var , ncp -> old -> begin_var ,
13251343 nbytes );
0 commit comments