Adjust flush/refresh tests to allow more time
for completion, and fix a bug that caused a
race condition between the test script and a
process it invokes.
Description:
Flush/refresh testing slows down considerably
with multiple (other) processes running in the
background, such as the case when -j option is
supplied to gmake when running the test suite.
I've extended the amount of time before the test
times out due to not receiving a signal, and
modified the script so that the timer now resets
after receiving a signal so it is not a cumulative
timer for the entire test, but rather only per
verification process that the script needs to spawn.
Additionally, I changed the way the test script
detected that a signal from a process was ready by
changing detection from 'file exists' to 'non-empty
file exists'.
This test may need to undergo further tweaking once
we get a feeling for how well it currently runs in
a number of different scenarios, particularly with
regards to how the script and the processes it spawns
communicate with each other.
Tested:
amani, using 'gmake -j 8 check'.
h5committest
161 lines
5.1 KiB
Bash
Executable File
161 lines
5.1 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# 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 files COPYING and Copyright.html. COPYING can be found at the root
|
|
# of the source code distribution tree; Copyright.html can be found at the
|
|
# root level of an installed copy of the electronic HDF5 document set and
|
|
# is linked from the top-level documents page. It can also be found at
|
|
# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
|
|
# access to either file, you may request a copy from help@hdfgroup.org.
|
|
#
|
|
#
|
|
# Test script for the flush/evict single objects feature.
|
|
#
|
|
# This test file doesn't actually perform any tests, rather, it acts
|
|
# as a process manager for the 'flushrefresh' test file, which is where
|
|
# the tests are actually housed. The reason this script exists is because
|
|
# the verification of this feature needs to occur in separate processes
|
|
# from the one in which the file is being manipulated in. (i.e., we have
|
|
# a single writer process, and various reader processes spawning off
|
|
# and doing the verification that individual objects are being
|
|
# correctly flushed).
|
|
#
|
|
# Programmer:
|
|
# Mike McGreevy
|
|
# Tuesday, July 20, 2010
|
|
|
|
###############################################################################
|
|
## test variables
|
|
###############################################################################
|
|
|
|
nerrors=0
|
|
|
|
###############################################################################
|
|
## Main
|
|
###############################################################################
|
|
# The build (current) directory might be different than the source directory.
|
|
if test -z "$srcdir"; then
|
|
srcdir=.
|
|
fi
|
|
|
|
# ========================
|
|
# Launch the Test Program.
|
|
# ========================
|
|
./flushrefresh &
|
|
pid_main=$!
|
|
|
|
# =================================================
|
|
# Set up/initialize some variables to be used later
|
|
# =================================================
|
|
startsignal=flushrefresh_VERIFICATION_START
|
|
endsignal=flushrefresh_VERIFICATION_DONE
|
|
timeout_length=300
|
|
timedout=0
|
|
verification_done=0
|
|
|
|
# =======================================
|
|
# Run flush verification on test program.
|
|
# =======================================
|
|
|
|
until [ $verification_done -eq 1 ]; do
|
|
|
|
# Wait for signal from test program that verification routine can run.
|
|
before=`date +%s`
|
|
until [ -s $startsignal ]; do
|
|
after=`date +%s`
|
|
timediff=`expr $after - $before`
|
|
if [ $timediff -gt $timeout_length ]; then
|
|
nerrors=`expr $nerrors + 1`
|
|
timedout=1
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Check to see if we timed out looking for the signal before continuing.
|
|
if [ $timedout -gt 0 ]; then
|
|
echo timed out waiting for signal from test program.
|
|
break
|
|
fi
|
|
|
|
# Read in test routine parameters from signal file, then delete signal file.
|
|
param1=`head -n 1 $startsignal`
|
|
param2=`tail -n 1 $startsignal`
|
|
rm $startsignal
|
|
|
|
# Check if we're done with verifications, otherwise run the specified verification.
|
|
if [ "$param1" = "VERIFICATION_DONE" ]; then
|
|
verification_done=1
|
|
echo "all flush verification complete" > $endsignal
|
|
else
|
|
./flushrefresh $param1 $param2
|
|
echo "verification flush process done" > $endsignal
|
|
fi
|
|
|
|
done
|
|
|
|
# =========================================
|
|
# Run refresh verification on test program.
|
|
# =========================================
|
|
if [ $timedout -eq 0 ]; then
|
|
until [ $verification_done -eq 2 ]; do
|
|
|
|
# Wait for signal from test program that verification routine can run.
|
|
before=`date +%s`
|
|
until [ -s $startsignal ]; do
|
|
after=`date +%s`
|
|
timediff=`expr $after - $before`
|
|
if [ $timediff -gt $timeout_length ]; then
|
|
nerrors=`expr $nerrors + 1`
|
|
timedout=1
|
|
break
|
|
fi
|
|
done
|
|
|
|
# Check to see if we timed out looking for the signal before continuing.
|
|
if [ $timedout -gt 0 ]; then
|
|
echo timed out waiting for signal from test program.
|
|
break
|
|
fi
|
|
|
|
# Read in test routine parameter from signal file, then delete signal file.
|
|
param1=`head -n 1 $startsignal`
|
|
rm $startsignal
|
|
|
|
# Check if we're done with verifications, otherwise run the specified verification.
|
|
if [ "$param1" = "VERIFICATION_DONE" ]; then
|
|
verification_done=2
|
|
echo "all refresh verification complete" > $endsignal
|
|
else
|
|
./flushrefresh $param1
|
|
echo "refresh verifiction process done" > $endsignal
|
|
fi
|
|
|
|
done
|
|
fi
|
|
|
|
# ============================================
|
|
# Wait for main to finish up, and end testing.
|
|
# ============================================
|
|
wait $pid_main
|
|
if test $? -ne 0; then
|
|
echo flushrefresh had error
|
|
nerrors=`expr $nerrors + 1`
|
|
fi
|
|
|
|
###############################################################################
|
|
## Report and exit
|
|
###############################################################################
|
|
|
|
if test $nerrors -eq 0 ; then
|
|
echo "flush/refresh objects tests passed."
|
|
exit 0
|
|
else
|
|
echo "flush/refresh objects tests failed with $nerrors errors."
|
|
exit 1
|
|
fi
|