This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
Gentlemen: You have reported problems with netcdf data corruption after calling nc_redef/nc_endef. Attached find a patch which I hope fixes the problem. Please let me know if this works for you or not, so we may proceed to roll this into a general release. I apologise that this has taken so long. We were unable to get a small example which demostrated the problem. Thank you. -glenn
Index: posixio.c =================================================================== RCS file: /upc/share/CVS/netcdf-3/libsrc/posixio.c,v retrieving revision 1.66 retrieving revision 1.67 diff -c -r1.66 -r1.67 *** posixio.c 1997/12/18 20:34:16 1.66 --- posixio.c 1999/04/23 23:02:41 1.67 *************** *** 2,8 **** * Copyright 1996, University Corporation for Atmospheric Research * See netcdf/COPYRIGHT file for copying and redistribution conditions. */ ! /* $Id: posixio.c,v 1.66 1997/12/18 20:34:16 davis Exp $ */ #include "ncconfig.h" #include <assert.h> --- 2,8 ---- * Copyright 1996, University Corporation for Atmospheric Research * See netcdf/COPYRIGHT file for copying and redistribution conditions. */ ! /* $Id: posixio.c,v 1.67 1999/04/23 23:02:41 davis Exp $ */ #include "ncconfig.h" #include <assert.h> *************** *** 95,101 **** struct stat sb; if (fstat(fd, &sb) > -1) { ! return (size_t) sb.st_blksize; } /* else, silent in the face of error */ #endif --- 95,103 ---- struct stat sb; if (fstat(fd, &sb) > -1) { ! if(sb.st_blksize >= 8192) ! return (size_t) sb.st_blksize; ! return 8192; } /* else, silent in the face of error */ #endif *************** *** 501,508 **** void *src; void *dest; ! #if 0 ! fprintf(stderr, "double_buffr %ld %ld %ld\n", (long)to, (long)from, (long)nbytes); #endif status = px_get(nciop, pxp, to, nbytes, RGN_WRITE, --- 503,510 ---- void *src; void *dest; ! #if INSTRUMENT ! fprintf(stderr, "\tdouble_buffr %ld %ld %ld\n", (long)to, (long)from, (long)nbytes); #endif status = px_get(nciop, pxp, to, nbytes, RGN_WRITE, *************** *** 585,593 **** --- 587,622 ---- diff = (size_t)(upper - lower); extent = diff + nbytes; + #if INSTRUMENT + fprintf(stderr, "ncio_px_move %ld %ld %ld %ld %ld\n", + (long)to, (long)from, (long)nbytes, (long)lower, (long)extent); + #endif if(extent > pxp->blksz) { size_t remaining = nbytes; + + if(to > from) + { + off_t frm = from + nbytes; + off_t toh = to + nbytes; + for(;;) + { + size_t loopextent = MIN(remaining, pxp->blksz); + frm -= loopextent; + toh -= loopextent; + + status = px_double_buffer(nciop, toh, frm, + loopextent, rflags) ; + if(status != ENOERR) + return status; + remaining -= loopextent; + + if(remaining == 0) + break; /* normal loop exit */ + } + } + else + { for(;;) { size_t loopextent = MIN(remaining, pxp->blksz); *************** *** 603,614 **** to += loopextent; from += loopextent; } return ENOERR; } ! #if 0 ! fprintf(stderr, "ncio_px_move %ld %ld %ld %ld %ld\n", ! (long)to, (long)from, (long)nbytes, (long)lower, (long)extent); #endif status = px_get(nciop, pxp, lower, extent, RGN_WRITE|rflags, (void **)&base); --- 632,643 ---- to += loopextent; from += loopextent; } + } return ENOERR; } ! #if INSTRUMENT ! fprintf(stderr, "\tncio_px_move small\n"); #endif status = px_get(nciop, pxp, lower, extent, RGN_WRITE|rflags, (void **)&base);