Skip to content

Commit

Permalink
Address issue #1 and issue #3 of the group test failures.
Browse files Browse the repository at this point in the history
See Kent's documentation "Designed to Fail Tests and Issues".
(A) Fix for issue #1: HDassert the < and = cases between old and new
entry length.  John will take care of the > case.
(B) Fix for issue #3:  set the cache copy of page_size again if different
    from f->shared->fs_page_size.
  • Loading branch information
vchoi committed Dec 21, 2021
1 parent a30ca5a commit cdc93ea
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 2 deletions.
31 changes: 31 additions & 0 deletions src/H5AC.c
Original file line number Diff line number Diff line change
Expand Up @@ -2777,3 +2777,34 @@ H5AC_get_mdc_image_info(const H5AC_t *cache_ptr, haddr_t *image_addr, hsize_t *i
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5AC_get_mdc_image_info() */

/*-------------------------------------------------------------------------
* Function: H5AC_set_vfd_swmr_reader
*
* Purpose: Wrapper function for H5C_set_vfd_swmr_reader().
*
* Return: SUCCEED on success, and FAIL on failure.
*
* Programmer: Vailin Choi; Dec 2021
*
*-------------------------------------------------------------------------
*/
herr_t
H5AC_set_vfd_swmr_reader(H5AC_t *cache_ptr, hbool_t vfd_swmr_reader, hsize_t page_size)
{
herr_t ret_value = SUCCEED; /* Return value */

FUNC_ENTER_NOAPI(FAIL)

/* Sanity checks */
HDassert(cache_ptr);

if(cache_ptr->page_size != page_size) {

if (H5C_set_vfd_swmr_reader((H5C_t *)cache_ptr, vfd_swmr_reader, page_size) < 0)
HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't set page_size for VFD SWMR reader")
}

done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5AC_set_vfd_swmr_reader() */
1 change: 1 addition & 0 deletions src/H5ACprivate.h
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,7 @@ H5_DLL herr_t H5AC_unsettle_ring(H5F_t *f, H5AC_ring_t ring);
H5_DLL herr_t H5AC_expunge_tag_type_metadata(H5F_t *f, haddr_t tag, int type_id, unsigned flags,
hbool_t type_match);
H5_DLL herr_t H5AC_get_tag(const void *thing, /*OUT*/ haddr_t *tag);
H5_DLL herr_t H5AC_set_vfd_swmr_reader(H5AC_t *cache_ptr, hbool_t vfd_swmr_reader, hsize_t page_size);

/* Virtual entry routines */
H5_DLL H5AC_proxy_entry_t *H5AC_proxy_entry_create(void);
Expand Down
25 changes: 24 additions & 1 deletion src/H5Fvfd_swmr.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ H5FL_DEFINE(eot_queue_entry_t);
* Return: Success: SUCCEED
* Failure: FAIL
*
* Programmer: Vailin Choi -- 11/??/18
* Programmer: Vailin Choi -- 10/??/18
*
* Changes: None.
*
Expand Down Expand Up @@ -252,6 +252,21 @@ H5F_vfd_swmr_init(H5F_t *f, hbool_t file_create)

HDassert(!shared->vfd_swmr_config.writer);

HDassert(shared->fs_page_size > 0);
/* This is a bug uncovered by issue #3 of the group test failures.
* See Kent's documentation "Designed to Fail Tests and Issues".
* The file opening process in H5F__new() initializes the cache copy of
* page_size via H5AC_create(). However, later on H5F__super_read()
* may change page size due to non-default setting of
* 'free-space manager info' in superblock extension.
* Fix: set the cache copy of page_size again if different from
* f->shared->fs_page_size.
*/
if(shared->cache) {
if (H5AC_set_vfd_swmr_reader(shared->cache, TRUE, shared->fs_page_size) < 0)
HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't set page size in cache for VFD SWMR reader");
}

shared->vfd_swmr_writer = FALSE;
shared->max_jump_ticks = 0;

Expand Down Expand Up @@ -1258,6 +1273,14 @@ H5F_vfd_swmr_reader_end_of_tick(H5F_t *f, hbool_t entering_api)
#if 0 /*Kent*/
HDassert(oent->length == nent->length);
#endif
/* This is a bug uncovered by issue #1 of the
* group test failures. See Kent's documentation
* "Designed to Fail Tests and Issues".
* nent->length can be <, =, > to oent->length.
* Fix: HDassert the 1st two cases: < and =.
* John will address the > case.
*/
HDassert(nent->length <= oent->length);

/* the page has been altered -- evict it and
* any contained metadata cache entries.
Expand Down
122 changes: 121 additions & 1 deletion test/testvfdswmr.sh.in
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/usr/bin/env bash
#!/us/bin/env bash
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
Expand Down Expand Up @@ -74,6 +74,13 @@ DSETOPS_FIFO_READER_TO_WRITER=fifo_dsetops_reader_to_writer
DSETCHKS_FIFO_WRITER_TO_READER=fifo_dsetchks_writer_to_reader
DSETCHKS_FIFO_READER_TO_WRITER=fifo_dsetchks_reader_to_writer

###############################################################################
## For gfail{1,2,3,4} test: definitions for fifo files to coordinate test runs
###############################################################################
#
GFAIL_FIFO_WRITER_TO_READER=fifo_group_writer_to_reader
GFAIL_FIFO_READER_TO_WRITER=fifo_group_reader_to_writer

###############################################################################
## short hands and function definitions
###############################################################################
Expand Down Expand Up @@ -147,6 +154,7 @@ all_tests="${all_tests} groups groups_attrs groups_ops few_big many_small attrds
# For exhaustive run, add: os_groups_attrs, os_groups_ops, os_groups_seg, dsetops, dsetchks,independ_wr
if [[ "$HDF5TestExpress" -eq 0 ]] ; then # exhaustive run
all_tests="${all_tests} os_groups_attrs os_groups_ops os_groups_seg dsetops dsetchks independ_wr"
all_tests="${all_tests} gfail_entry_length gfail_page_size"
fi

tests=${all_tests}
Expand Down Expand Up @@ -1387,6 +1395,118 @@ if [ ${do_independ_wr:-no} = yes ]; then
fi


###############################################################################
#
# "gfail_entry_length" test
#
# Only for exhaustive run
#
# Verify that the assertion failure for old and new entry length is fixed.
# (See issue #1 in Kent's documentation "Designed to Fail Tests and Issues".
#
###############################################################################
#
#
if [ ${do_gfail_entry_length:-no} = yes ]; then
#
# Clean up any existing fifo files from previous runs
if [ -e ./$GFAIL_FIFO_WRITER_TO_READER ]; then # If writer fifo file is found
rm -f ./$GFAIL_FIFO_WRITER_TO_READER
fi
if [ -e ./$GFAIL_FIFO_READER_TO_WRITER ]; then # If reader fifo file is found
rm -f ./$GFAIL_FIFO_READER_TO_WRITER
fi
#
echo launch vfd_swmr_gfail_writer -q -m 10 -n 340000
catch_out_err_and_rc vfd_swmr_gfail_entry_length_writer \
../vfd_swmr_gfail_writer -q -m 10 -n 340000 &
pid_writer=$!

echo launch vfd_swmr_gfail_reader -m 10 -n 340000
catch_out_err_and_rc vfd_swmr_gfail_entry_length_reader \
../vfd_swmr_gfail_reader -m 10 -n 340000 &
pid_reader=$!

# Wait for the reader to finish before signaling the
# writer to quit: the writer holds the file open so that the
# reader will find the shadow file when it opens
# the .h5 file.
wait $pid_reader
wait $pid_writer

# Collect exit code of the reader
if [ $(cat vfd_swmr_gfail_entry_length_reader.rc) -ne 0 ]; then
echo reader had error
nerrors=$((nerrors + 1))
fi

# Collect exit code of the writer
if [ $(cat vfd_swmr_gfail_entry_length_writer.rc) -ne 0 ]; then
echo writer had error
nerrors=$((nerrors + 1))
fi

# Clean up output files
rm -f vfd_swmr_gfail_entry_length_writer.{out,rc}
rm -f vfd_swmr_gfail_entry_length_reader.*.{out,rc}
fi

###############################################################################
#
# "gfail_page_size" test
#
# Only for exhaustive run
#
# Verify that the assertion failure is fixed when non-default page size is set.
# (See issue #3 in Kent's documentation "Designed to Fail Tests and Issues".
#
###############################################################################
#
#
if [ ${do_gfail_page_size:-no} = yes ]; then
#
# Clean up any existing fifo files from previous runs
if [ -e ./$GFAIL_FIFO_WRITER_TO_READER ]; then # If writer fifo file is found
rm -f ./$GFAIL_FIFO_WRITER_TO_READER
fi
if [ -e ./$GFAIL_FIFO_READER_TO_WRITER ]; then # If reader fifo file is found
rm -f ./$GFAIL_FIFO_READER_TO_WRITER
fi
#
echo launch vfd_swmr_gfail_writer -q -m 10 -B 8192 -s 8192 -n 320000
catch_out_err_and_rc vfd_swmr_gfail_page_size_writer \
../vfd_swmr_gfail_writer -q -m 10 -B 8192 -s 8192 -n 320000 &
pid_writer=$!

echo launch vfd_swmr_gfail_reader -m 10 -B 8192 -s 8192 -n 320000
catch_out_err_and_rc vfd_swmr_gfail_page_size_reader \
../vfd_swmr_gfail_reader -m 10 -B 8192 -s 8192 -n 320000 &
pid_reader=$!

# Wait for the reader to finish before signaling the
# writer to quit: the writer holds the file open so that the
# reader will find the shadow file when it opens
# the .h5 file.
wait $pid_reader
wait $pid_writer

# Collect exit code of the reader
if [ $(cat vfd_swmr_gfail_page_size_reader.rc) -ne 0 ]; then
echo reader had error
nerrors=$((nerrors + 1))
fi

# Collect exit code of the writer
if [ $(cat vfd_swmr_gfail_page_size_writer.rc) -ne 0 ]; then
echo writer had error
nerrors=$((nerrors + 1))
fi

# Clean up output files
rm -f vfd_swmr_gfail_page_size_writer.{out,rc}
rm -f vfd_swmr_gfail_page_size_reader.*.{out,rc}
fi

###############################################################################
## Report and exit
###############################################################################
Expand Down

0 comments on commit cdc93ea

Please sign in to comment.