Skip to content

Commit fc1ff4d

Browse files
committed
Fix check whether data section can be moved as a contiguous block
1 parent 566180c commit fc1ff4d

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

src/drivers/ncmpio/ncmpio_enddef.c

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)