From 0ea6e75d9ff6a62b5e5590dec84df88b781a6e85 Mon Sep 17 00:00:00 2001 From: David Young Date: Wed, 23 Oct 2019 10:47:14 -0500 Subject: [PATCH] VFD SWMR sparse readers failed to open the .h5 file because the sparse writer had finished its work and closed the .h5 file, thus removing the shadow file. Make the sparse writer wait to close the .h5 file for a signal from testvfdswmr.sh. In testvfdswmr.sh, send the signal when the readers have all finished. --- test/testvfdswmr.sh.in | 4 ++- test/vfd_swmr_sparse_writer.c | 46 +++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/test/testvfdswmr.sh.in b/test/testvfdswmr.sh.in index 6cb296009a..39f6931060 100644 --- a/test/testvfdswmr.sh.in +++ b/test/testvfdswmr.sh.in @@ -464,7 +464,9 @@ fi $IFDEBUG ps # Wait for the readers and the writer to finish. - wait + wait $pid_readers + kill -USR1 $pid_writer + wait $pid_writer # Collect exit codes of the readers n=0 diff --git a/test/vfd_swmr_sparse_writer.c b/test/vfd_swmr_sparse_writer.c index 2411c1f6f8..409970b3cb 100644 --- a/test/vfd_swmr_sparse_writer.c +++ b/test/vfd_swmr_sparse_writer.c @@ -28,6 +28,8 @@ /***********/ /* Headers */ /***********/ +#include +#include #include "h5test.h" #include "vfd_swmr_common.h" @@ -383,6 +385,48 @@ error: return -1; } /* add_records() */ +static volatile sig_atomic_t got_sigusr1 = 0; + +static void +sigusr1_handler(int H5_ATTR_UNUSED signo) +{ + got_sigusr1 = 1; +} + +static void +await_signal(void) +{ + sigset_t sleepset, fullset, oldset; + struct sigaction sa, osa; + + memset(&sa, '\0', sizeof(sa)); + sa.sa_handler = sigusr1_handler; + if (sigemptyset(&sa.sa_mask) == -1 || + sigfillset(&fullset) == -1 || + sigemptyset(&sleepset) == -1) { + err(EXIT_FAILURE, "%s.%d: could not initialize signal masks", + __func__, __LINE__); + } + + if (sigprocmask(SIG_BLOCK, &fullset, &oldset) == -1) + err(EXIT_FAILURE, "%s.%d: sigprocmask", __func__, __LINE__); + + if (sigaction(SIGUSR1, &sa, &osa) == -1) + err(EXIT_FAILURE, "%s.%d: sigaction", __func__, __LINE__); + + if (sigsuspend(&sleepset) == -1 && errno != EINTR) + err(EXIT_FAILURE, "%s.%d: sigsuspend", __func__, __LINE__); + + if (got_sigusr1 != 0) + printf("Cancelled by SIGUSR1.\n"); + + if (sigaction(SIGUSR1, &osa, NULL) == -1) + err(EXIT_FAILURE, "%s.%d: sigaction", __func__, __LINE__); + + if (sigprocmask(SIG_SETMASK, &oldset, NULL) == -1) + err(EXIT_FAILURE, "%s.%d: sigprocmask", __func__, __LINE__); +} + static void usage(void) { @@ -499,6 +543,8 @@ int main(int argc, const char *argv[]) HDexit(1); } /* end if */ + await_signal(); + /* Emit informational message */ if(verbose) HDfprintf(stderr, "WRITER: Closing objects/file\n");