Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Minor fixes for Subfiling VFD tests #2633

Merged
merged 1 commit into from
Apr 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions testpar/CMakeTests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ set (test_par_CLEANFILES
test_subfiling_basic_create.h5
test_subfiling_config_file.h5
test_subfiling_stripe_sizes.h5
test_subfiling_selection_strategies.h5
test_subfiling_read_different_stripe_sizes.h5
test_subfiling_precreate_rank_0.h5
test_subfiling_write_many_read_one.h5
Expand Down
134 changes: 108 additions & 26 deletions testpar/t_subfiling_vfd.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@
#include "H5FDsubfiling.h"
#include "H5FDioc.h"

#define SUBFILING_TEST_DIR H5FD_SUBFILING_NAME

/* The smallest Subfiling stripe size used for testing */
#define SUBFILING_MIN_STRIPE_SIZE 128

Expand Down Expand Up @@ -897,6 +895,7 @@ test_selection_strategies(void)

case SELECT_IOC_ONE_PER_NODE:
case SELECT_IOC_WITH_CONFIG:
case ioc_selection_options:
default:
HDprintf("invalid IOC selection strategy\n");
MPI_Abort(comm_g, -1);
Expand Down Expand Up @@ -1718,16 +1717,20 @@ test_subfiling_write_many_read_few(void)
static void
test_subfiling_h5fuse(void)
{
hsize_t start[1];
hsize_t count[1];
hsize_t dset_dims[1];
size_t target_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
void *buf = NULL;
int skip_test = 0;
#if defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID)
h5_stat_t file_info;
uint64_t file_inode;
hsize_t start[1];
hsize_t count[1];
hsize_t dset_dims[1];
size_t target_size;
hid_t file_id = H5I_INVALID_HID;
hid_t fapl_id = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t fspace_id = H5I_INVALID_HID;
void *buf = NULL;
int skip_test = 0;
#endif

curr_nerrors = nerrors;

Expand Down Expand Up @@ -1769,6 +1772,22 @@ test_subfiling_h5fuse(void)
file_id = H5Fcreate(SUBF_FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
VRFY((file_id >= 0), "H5Fcreate succeeded");

/*
* Retrieve the HDF5 file's inode number before operating on
* it, since it might change after fusing
*/
HDcompile_assert(sizeof(uint64_t) >= sizeof(ino_t));
if (MAINPROCESS) {
VRFY((HDstat(SUBF_FILENAME, &file_info) >= 0), "HDstat succeeded");

file_inode = (uint64_t)file_info.st_ino;
}

if (mpi_size > 1) {
mpi_code_g = MPI_Bcast(&file_inode, 1, MPI_UINT64_T, 0, comm_g);
VRFY((mpi_code_g == MPI_SUCCESS), "MPI_Bcast succeeded");
}

/* Calculate target size for dataset to stripe it across available IOCs */
target_size = (stripe_size_g > 0) ? (size_t)stripe_size_g : H5FD_SUBFILING_DEFAULT_STRIPE_SIZE;

Expand Down Expand Up @@ -1818,10 +1837,9 @@ test_subfiling_h5fuse(void)
VRFY((H5Fclose(file_id) >= 0), "File close succeeded");

if (MAINPROCESS) {
h5_stat_t file_info;
pid_t pid = 0;
pid_t tmppid;
int status;
pid_t pid = 0;
pid_t tmppid;
int status;

pid = HDfork();
VRFY(pid >= 0, "HDfork succeeded");
Expand All @@ -1833,11 +1851,9 @@ test_subfiling_h5fuse(void)
tmp_filename = HDmalloc(PATH_MAX);
VRFY(tmp_filename, "HDmalloc succeeded");

VRFY((HDstat(SUBF_FILENAME, &file_info) >= 0), "HDstat succeeded");

/* Generate name for configuration file */
HDsnprintf(tmp_filename, PATH_MAX, "%s/" H5FD_SUBFILING_CONFIG_FILENAME_TEMPLATE, config_dir,
SUBF_FILENAME, (uint64_t)file_info.st_ino);
SUBF_FILENAME, file_inode);

args[0] = HDstrdup("env");
args[1] = HDstrdup("sh");
Expand Down Expand Up @@ -1904,14 +1920,59 @@ test_subfiling_h5fuse(void)
mpi_code_g = MPI_Barrier(comm_g);
VRFY((mpi_code_g == MPI_SUCCESS), "MPI_Barrier succeeded");

H5E_BEGIN_TRY
{
H5Fdelete(SUBF_FILENAME, fapl_id);
/*
* Since we've now fused the file back together, the Subfiling
* VFD will no longer be able to work with it. The main HDF5
* file should be able to be deleted using the sec2 VFD, but we
* have to delete the extra files manually.
*/
if (MAINPROCESS) {
char *filename_buf;
int num_subfiles = num_iocs_g;
int num_digits = (int)(HDlog10(num_subfiles) + 1);

/* Delete the regular HDF5 file */
H5Pset_fapl_sec2(fapl_id);

H5E_BEGIN_TRY
{
H5Fdelete(SUBF_FILENAME, fapl_id);
}
H5E_END_TRY;

filename_buf = HDmalloc(PATH_MAX);
VRFY(filename_buf, "HDmalloc succeeded");

/* Generate name for configuration file */
HDsnprintf(filename_buf, PATH_MAX, "%s/" H5FD_SUBFILING_CONFIG_FILENAME_TEMPLATE, config_dir,
SUBF_FILENAME, file_inode);

/* Delete the configuration file */
if (HDremove(filename_buf) < 0) {
HDprintf("couldn't remove Subfiling VFD configuration file '%s'\n", filename_buf);
nerrors++;
}

for (int i = 0; i < num_subfiles; i++) {
/* Generate name for each subfile */
HDsnprintf(filename_buf, PATH_MAX, H5FD_SUBFILING_FILENAME_TEMPLATE, SUBF_FILENAME, file_inode,
num_digits, i + 1, num_subfiles);

/* Delete the subfile */
if (HDremove(filename_buf) < 0) {
HDprintf("couldn't remove subfile '%s'\n", filename_buf);
nerrors++;
}
}

HDfree(filename_buf);
}
H5E_END_TRY;

VRFY((H5Pclose(fapl_id) >= 0), "FAPL close succeeded");

mpi_code_g = MPI_Barrier(comm_g);
VRFY((mpi_code_g == MPI_SUCCESS), "MPI_Barrier succeeded");

CHECK_PASSED();
#else
SKIPPED();
Expand Down Expand Up @@ -1971,9 +2032,13 @@ int
main(int argc, char **argv)
{
unsigned seed;
char *env_value = NULL;
int required = MPI_THREAD_MULTIPLE;
int provided = 0;
hbool_t must_unset_stripe_size_env = FALSE;
hbool_t must_unset_ioc_per_node_env = FALSE;
hbool_t must_unset_ioc_thread_count_env = FALSE;
hbool_t must_unset_config_dir_env = FALSE;
char *env_value = NULL;
int required = MPI_THREAD_MULTIPLE;
int provided = 0;

HDcompile_assert(SUBFILING_MIN_STRIPE_SIZE <= H5FD_SUBFILING_DEFAULT_STRIPE_SIZE);

Expand Down Expand Up @@ -2169,6 +2234,8 @@ main(int argc, char **argv)
nerrors++;
goto exit;
}

must_unset_stripe_size_env = TRUE;
}
if (ioc_per_node_g < 0) {
const char *ioc_per_node_str;
Expand All @@ -2184,6 +2251,8 @@ main(int argc, char **argv)
nerrors++;
goto exit;
}

must_unset_ioc_per_node_env = TRUE;
}
if (ioc_thread_pool_size_g < 0) {
if (HDsetenv(H5FD_IOC_THREAD_POOL_SIZE, "2", 1) < 0) {
Expand All @@ -2192,6 +2261,8 @@ main(int argc, char **argv)
nerrors++;
goto exit;
}

must_unset_ioc_thread_count_env = TRUE;
}

if (!(env_value = HDgetenv(H5FD_SUBFILING_CONFIG_FILE_PREFIX))) {
Expand Down Expand Up @@ -2243,6 +2314,8 @@ main(int argc, char **argv)
goto exit;
}
}

must_unset_config_dir_env = TRUE;
}

/* Grab values from environment variables */
Expand Down Expand Up @@ -2282,6 +2355,15 @@ main(int argc, char **argv)
HDputs("All Subfiling VFD tests passed\n");

exit:
if (must_unset_stripe_size_env)
HDunsetenv(H5FD_SUBFILING_STRIPE_SIZE);
if (must_unset_ioc_per_node_env)
HDunsetenv(H5FD_SUBFILING_IOC_PER_NODE);
if (must_unset_ioc_thread_count_env)
HDunsetenv(H5FD_IOC_THREAD_POOL_SIZE);
if (must_unset_config_dir_env)
HDunsetenv(H5FD_SUBFILING_CONFIG_FILE_PREFIX);

if (MAINPROCESS) {
if (HDrmdir(SUBFILING_CONFIG_FILE_DIR) < 0 && (errno != ENOENT)) {
HDprintf("couldn't remove temporary testing directory\n");
Expand Down