hdf5/test/testvdsswmr.sh.in
2019-09-18 11:04:09 -05:00

236 lines
7.7 KiB
Bash

#! /bin/bash
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5. The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the COPYING file, which can be found at the root of the source code
# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#
# Tests for the swmr feature using virtual datasets.
#
# Created:
# Dana Robinson, November 2015
srcdir=@srcdir@
###############################################################################
## test parameters
###############################################################################
Nwriters=6 # number of writers (1 per source dataset)
Nreaders=5 # number of readers to launch
nerrors=0
###############################################################################
## definitions for message file to coordinate test runs
###############################################################################
WRITER_MESSAGE=SWMR_WRITER_MESSAGE # The message file created by writer that the open is complete
# This should be the same as the define in "./swmr_common.h"
MESSAGE_TIMEOUT=300 # Message timeout length in secs
# This should be the same as the define in "./h5test.h"
###############################################################################
## short hands and function definitions
###############################################################################
DPRINT=: # Set to "echo Debug:" for debugging printing,
# else ":" for noop.
IFDEBUG=: # Set to null to turn on debugging, else ":" for noop.
# Print a line-line message left justified in a field of 70 characters
# beginning with the word "Testing".
#
TESTING() {
SPACES=" "
echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
}
# To wait for the writer message file or till the maximum # of seconds is reached
# $1 is the message file to wait for
# This performs similar function as the routine h5_wait_message() in test/h5test.c
WAIT_MESSAGE() {
message=$1 # Get the name of the message file to wait for
t0=`date +%s` # Get current time in seconds
difft=0 # Initialize the time difference
mexist=0 # Indicate whether the message file is found
while [ $difft -lt $MESSAGE_TIMEOUT ] ; # Loop till message times out
do
t1=`date +%s` # Get current time in seconds
difft=`expr $t1 - $t0` # Calculate the time difference
if [ -e $message ]; then # If message file is found:
mexist=1 # indicate the message file is found
rm $message # remove the message file
break # get out of the while loop
fi
done;
if test $mexist -eq 0; then
# Issue warning that the writer message file is not found, continue with launching the reader(s)
echo warning: $WRITER_MESSAGE is not found after waiting $MESSAGE_TIMEOUT seconds
else
echo $WRITER_MESSAGE is found
fi
}
###############################################################################
## Main
###############################################################################
# The build (current) directory might be different than the source directory.
if test -z "$srcdir"; then
srcdir=.
fi
# Check to see if the VFD specified by the HDF5_DRIVER environment variable
# supports SWMR.
./swmr_check_compat_vfd
rc=$?
if [ $rc -ne 0 ] ; then
echo
echo "The VFD specified by the HDF5_DRIVER environment variable"
echo "does not support SWMR."
echo
echo "SWMR acceptance tests skipped"
echo
exit 0
fi
# Parse options (none accepted at this time)
while [ $# -gt 0 ]; do
case "$1" in
*) # unknown option
echo "$0: Unknown option ($1)"
exit 1
;;
esac
done
# HDF5 has several tests that create and delete signal files to communicate
# between processes, and it seems that even though the names of the files are
# different, occasionally the wrong file is deleted, interrupting the flow of
# the test. Running each of these tests in its own directory should eliminate
# the problem.
mkdir vds_swmr_test
for FILE in vds_swmr*; do
case "$FILE" in
*.o) continue ;; ## don't copy the .o files
esac
if test -f "$FILE" ; then
cp $FILE vds_swmr_test
fi
done
# With the --disable-shared option, swmr program files are built in the test
# directory, otherwise they are in test/.libs with a corresponding wrapper
# script in the test directory. The programs or wrapper scripts in test should
# always be copied, swmr files in .libs should be copied only if they exists.
if [ -f .libs/vds_swmr_writer ]; then
mkdir vds_swmr_test/.libs
for FILE in .libs/vds_swmr*; do
case "$FILE" in
*.o) continue ;; ## don't copy the .o files
esac
if test -f "$FILE" ; then
cp $FILE vds_swmr_test/.libs
fi
done
fi
cd vds_swmr_test
echo
echo "###############################################################################"
echo "## Basic VDS SWMR test - writing to a tiled plane"
echo "###############################################################################"
# Launch the file generator
echo launch the generator
./vds_swmr_gen
if test $? -ne 0; then
echo generator had error
nerrors=`expr $nerrors + 1`
fi
# Check for error and exit if one occured
$DPRINT nerrors=$nerrors
if test $nerrors -ne 0 ; then
echo "VDS SWMR tests failed with $nerrors errors."
exit 1
fi
# Launch the writers
echo "launch the $Nwriters SWMR VDS writers (1 per source)"
pid_writers=""
n=0
while [ $n -lt $Nwriters ]; do
./vds_swmr_writer $n &
pid_writers="$pid_writers $!"
n=`expr $n + 1`
done
$DPRINT pid_writers=$pid_writers
$IFDEBUG ps
# Sleep to ensure that the writers have started
sleep 3
# Launch the readers
echo launch $Nreaders SWMR readers
pid_readers=""
n=0
while [ $n -lt $Nreaders ]; do
./vds_swmr_reader &
pid_readers="$pid_readers $!"
n=`expr $n + 1`
done
$DPRINT pid_readers=$pid_readers
$IFDEBUG ps
# Collect exit code of the writers
for xpid in $pid_writers; do
$DPRINT checked writer $xpid
wait $xpid
if test $? -ne 0; then
echo writer had error
nerrors=`expr $nerrors + 1`
fi
done
# Collect exit code of the readers
# (they usually finish after the writers)
for xpid in $pid_readers; do
$DPRINT checked reader $xpid
wait $xpid
if test $? -ne 0; then
echo reader had error
nerrors=`expr $nerrors + 1`
fi
done
# Check for error and exit if one occured
$DPRINT nerrors=$nerrors
if test $nerrors -ne 0 ; then
echo "VDS SWMR tests failed with $nerrors errors."
exit 1
fi
###############################################################################
## Report and exit
###############################################################################
cd ..
$DPRINT nerrors=$nerrors
if test $nerrors -eq 0 ; then
echo "VDS SWMR tests passed."
if test -z "$HDF5_NOCLEANUP"; then
# delete the test directory
rm -rf vds_swmr_test
fi
exit 0
else
echo "VDS SWMR tests failed with $nerrors errors."
exit 1
fi