From 56989fffed9185ab9275829b6af4518d2fb43bce Mon Sep 17 00:00:00 2001 From: Thomas Jahns <jahns@dkrz.de> Date: Mon, 4 Oct 2021 03:16:54 +0200 Subject: [PATCH] Prevent overwrites when unnecessary. --- src/pio_server.c | 21 +++++++++++++++++++-- src/stream.c | 6 +++--- src/stream_cdf.h | 2 +- src/stream_cdf_time.c | 8 ++++---- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/pio_server.c b/src/pio_server.c index 9dd29db3c..c4131969b 100644 --- a/src/pio_server.c +++ b/src/pio_server.c @@ -2153,19 +2153,27 @@ cdiPioServerStreamClose(stream_t *streamptr, int recordBufIsToBeDeleted) = (void (*)(int))conf->callbacks[CDIPIO_CALLBACK_POSTSTREAMCLOSE]; streamCloseCallBack(streamptr->self); } +#if defined HAVE_NC4HDF5 && defined HAVE_PARALLEL_NC4 +bool parH5ZeroCountProblem = false; +#endif #ifdef HAVE_LIBNETCDF static void -cdiPioCdfDefTimestep(stream_t *streamptr, int tsID) +cdiPioCdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int streamID = streamptr->self, rankOpen = cdiPioStream2Owner(streamID); +#ifdef HAVE_PARALLEL_NC4 + valCount = rankOpen != CDI_PIO_COLLECTIVE_OPEN + || parH5ZeroCountProblem + || commInqRankColl() == 0; +#endif if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || commInqRankColl() == rankOpen) - cdfDefTimestep(streamptr, tsID); + cdfDefTimestep(streamptr, tsID, valCount); } #endif @@ -2380,6 +2388,15 @@ void cdiPioCollectorMessageLoop() cdiPioEnableNetCDFParAccess(); numPioPrimes = PPM_prime_factorization_32((uint32_t)commInqSizeColl(), &pioPrimes); +# ifdef HAVE_NC4HDF5 + { + unsigned majnum, minnum, relnum; + extern int H5get_libversion(unsigned *, unsigned *, unsigned *); + H5get_libversion(&majnum, &minnum, &relnum); + parH5ZeroCountProblem = (majnum == 1 && ((minnum == 8 && relnum <= 8) + || (minnum < 8))); + } +# endif #endif #ifdef HAVE_LIBNETCDF cdiSerialOpenFileCount = Calloc(sizeof (cdiSerialOpenFileCount[0]), diff --git a/src/stream.c b/src/stream.c index 1f45c1aca..47558b368 100644 --- a/src/stream.c +++ b/src/stream.c @@ -1200,10 +1200,10 @@ int cdiStreamDefTimestep_(stream_t *streamptr, int tsID) /* usually points to cdfDefTimestep in serial mode but * to cdiPioCdfDefTimestep on servers and to a null-op on * clients in client/server mode */ - void (*myCdfDefTimestep)(stream_t *streamptr, int tsID) - = (void (*)(stream_t *, int)) + void (*myCdfDefTimestep)(stream_t *streamptr, int tsID, size_t) + = (void (*)(stream_t *, int, size_t)) namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func; - myCdfDefTimestep(streamptr, tsID); + myCdfDefTimestep(streamptr, tsID, 1); } #endif diff --git a/src/stream_cdf.h b/src/stream_cdf.h index 55bb99d09..38084d2ce 100644 --- a/src/stream_cdf.h +++ b/src/stream_cdf.h @@ -19,7 +19,7 @@ enum { int cdfDefVar(stream_t *streamptr, int varID); void cdfDefVars(stream_t *streamptr); -void cdfDefTimestep(stream_t *streamptr, int tsID); +void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount); int cdfInqTimestep(stream_t *streamptr, int tsID); int cdfInqContents(stream_t *streamptr); void cdfDefHistory(stream_t *streamptr, int size, const char *history); diff --git a/src/stream_cdf_time.c b/src/stream_cdf_time.c index c249ec7fa..56f1aaf4d 100644 --- a/src/stream_cdf_time.c +++ b/src/stream_cdf_time.c @@ -256,7 +256,7 @@ void cdfDefTime(stream_t* streamptr) static void -cdfDefTimeValue(stream_t *streamptr, int tsID) +cdfDefTimeValue(stream_t *streamptr, int tsID, size_t valCount) { int fileID = streamptr->fileID; @@ -272,7 +272,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID) } const size_t start[2] = { [0] = (size_t)tsID, [1] = 0 }, - count[2] = { [0] = 1, [1] = 2 }; + count[2] = { [0] = valCount, [1] = 2 * valCount }; double timevalue[2] = { cdiEncodeTimeval(taxis->vdate, taxis->vtime, &streamptr->tsteps[0].taxis) @@ -298,7 +298,7 @@ cdfDefTimeValue(stream_t *streamptr, int tsID) } -void cdfDefTimestep(stream_t *streamptr, int tsID) +void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int vlistID = streamptr->vlistID; @@ -319,7 +319,7 @@ void cdfDefTimestep(stream_t *streamptr, int tsID) */ } } - cdfDefTimeValue(streamptr, tsID); + cdfDefTimeValue(streamptr, tsID, valCount); } #endif -- GitLab