summaryrefslogtreecommitdiffstats
path: root/test/vfd_swmr_gfail_writer.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/vfd_swmr_gfail_writer.c')
-rw-r--r--test/vfd_swmr_gfail_writer.c179
1 files changed, 105 insertions, 74 deletions
diff --git a/test/vfd_swmr_gfail_writer.c b/test/vfd_swmr_gfail_writer.c
index 8b8f00e..8662c11 100644
--- a/test/vfd_swmr_gfail_writer.c
+++ b/test/vfd_swmr_gfail_writer.c
@@ -138,15 +138,6 @@ typedef struct {
int np_verify;
} state_t;
-#define ALL_HID_INITIALIZER \
- (state_t) \
- { \
- .file = H5I_INVALID_HID, .one_by_one_sid = H5I_INVALID_HID, .filename = "", \
- .filetype = H5T_NATIVE_UINT32, .nsteps = 10000, .use_vfd_swmr = true, .old_style_grp = false, \
- .use_named_pipes = true, .w_sleep_len = 112, .tick_len = 4, .max_lag = 7, .ps = 4096, .pbs = 4096, \
- .del_grp = false, .np_fd_w_to_r = -1, .np_fd_r_to_w = -1, .np_notify = 0, .np_verify = 0 \
- }
-
/*
* Operator function to be called by H5Literate.
*/
@@ -189,7 +180,26 @@ state_init(state_t *s, int argc, char **argv)
char * tfile = NULL;
char * end;
- *s = ALL_HID_INITIALIZER;
+ s->file = H5I_INVALID_HID;
+ s->one_by_one_sid = H5I_INVALID_HID;
+ s->filetype = H5T_NATIVE_UINT32;
+ s->nsteps = 1000;
+ s->use_vfd_swmr = true;
+ s->old_style_grp = false;
+ s->use_named_pipes = true;
+ s->w_sleep_len = 112;
+ s->tick_len = 4;
+ s->max_lag = 7;
+ s->ps = 4096;
+ s->pbs = 4096;
+ s->del_grp = false;
+ s->np_fd_w_to_r = -1;
+ s->np_fd_r_to_w = -1;
+ s->np_notify = 0;
+ s->np_verify = 0;
+
+ HDmemset(s->filename, 0, PATH_MAX);
+ HDmemset(s->progname, 0, PATH_MAX);
if (H5_basename(argv[0], &tfile) < 0) {
HDprintf("H5_basename failed\n");
@@ -280,8 +290,8 @@ state_init(state_t *s, int argc, char **argv)
return true;
error:
- if (tfile)
- HDfree(tfile);
+ HDfree(tfile);
+
return false;
}
@@ -409,16 +419,24 @@ np_rd_send(state_t *s)
* A boolean input parameter is used to choose
* either reader or writer.
* Return:
- * None
+ * True if succeed
+ * False if an error occurs in sending the message.
*/
-static void
+static bool
np_send_error(state_t *s, bool writer)
{
+ int fd = writer ? s->np_fd_w_to_r : s->np_fd_r_to_w;
+
s->np_notify = -1;
- if (writer)
- HDwrite(s->np_fd_w_to_r, &(s->np_notify), sizeof(int));
+
+ if (HDwrite(fd, &(s->np_notify), sizeof(int)) < 0) {
+ H5_FAILED();
+ AT();
+ HDprintf("HDwrite failed\n");
+ return false;
+ }
else
- HDwrite(s->np_fd_r_to_w, &(s->np_notify), sizeof(int));
+ return true;
}
/*-------------------------------------------------------------------------
@@ -513,27 +531,33 @@ error:
int
main(int argc, char **argv)
{
- hid_t fapl = H5I_INVALID_HID, fcpl = H5I_INVALID_HID;
- unsigned step;
- bool writer = false;
- state_t s;
- const char * personality;
- H5F_vfd_swmr_config_t config;
- const char * fifo_writer_to_reader = "./fifo_group_writer_to_reader";
- const char * fifo_reader_to_writer = "./fifo_group_reader_to_writer";
- int fd_writer_to_reader = -1, fd_reader_to_writer = -1;
- int notify = 0, verify = 0;
- bool wg_ret = false;
+ hid_t fapl = H5I_INVALID_HID;
+ hid_t fcpl = H5I_INVALID_HID;
+ unsigned step;
+ bool writer = false;
+ state_t * s = NULL;
+ const char * personality;
+ H5F_vfd_swmr_config_t *config = NULL;
+ const char * fifo_writer_to_reader = "./fifo_group_writer_to_reader";
+ const char * fifo_reader_to_writer = "./fifo_group_reader_to_writer";
+ int fd_writer_to_reader = -1, fd_reader_to_writer = -1;
+ int notify = 0, verify = 0;
+ bool wg_ret = false;
struct timespec start_time, end_time;
double temp_time;
- if (!state_init(&s, argc, argv)) {
+ if (NULL == (s = HDcalloc(1, sizeof(state_t))))
+ TEST_ERROR;
+ if (NULL == (config = HDcalloc(1, sizeof(H5F_vfd_swmr_config_t))))
+ TEST_ERROR;
+
+ if (!state_init(s, argc, argv)) {
HDprintf("state_init failed\n");
TEST_ERROR;
}
- personality = HDstrstr(s.progname, "vfd_swmr_gfail_");
+ personality = HDstrstr(s->progname, "vfd_swmr_gfail_");
if (personality != NULL && HDstrcmp(personality, "vfd_swmr_gfail_writer") == 0)
writer = true;
@@ -547,7 +571,7 @@ main(int argc, char **argv)
/* config, tick_len, max_lag, presume_posix_semantics, writer,
* maintain_metadata_file, generate_updater_files, flush_raw_data, md_pages_reserved,
* md_file_path, md_file_name, updater_file_path */
- init_vfd_swmr_config(&config, s.tick_len, s.max_lag, FALSE, writer, TRUE, FALSE, TRUE, 128, "./",
+ init_vfd_swmr_config(config, s->tick_len, s->max_lag, FALSE, writer, TRUE, FALSE, TRUE, 128, "./",
"group-shadow", NULL);
/* If old-style option is chosen, use the earliest file format(H5F_LIBVER_EARLIEST)
@@ -555,23 +579,23 @@ main(int argc, char **argv)
* vfd_swmr_create_fapl. Otherwise, the latest file format(H5F_LIBVER_LATEST)
* should be used as the second parameter of H5Pset_libver_bound().
* Also pass the use_vfd_swmr, only_meta_page, page_buf_size, config to vfd_swmr_create_fapl().*/
- if ((fapl = vfd_swmr_create_fapl(!s.old_style_grp, s.use_vfd_swmr, true, s.pbs, &config)) < 0) {
+ if ((fapl = vfd_swmr_create_fapl(!s->old_style_grp, s->use_vfd_swmr, true, s->pbs, config)) < 0) {
HDprintf("vfd_swmr_create_fapl failed\n");
TEST_ERROR;
}
/* Set fs_strategy (file space strategy) and fs_page_size (file space page size) */
- if ((fcpl = vfd_swmr_create_fcpl(H5F_FSPACE_STRATEGY_PAGE, s.ps)) < 0) {
+ if ((fcpl = vfd_swmr_create_fcpl(H5F_FSPACE_STRATEGY_PAGE, s->ps)) < 0) {
HDprintf("vfd_swmr_create_fcpl() failed");
TEST_ERROR;
}
if (writer)
- s.file = H5Fcreate(s.filename, H5F_ACC_TRUNC, fcpl, fapl);
+ s->file = H5Fcreate(s->filename, H5F_ACC_TRUNC, fcpl, fapl);
else
- s.file = H5Fopen(s.filename, H5F_ACC_RDONLY, fapl);
+ s->file = H5Fopen(s->filename, H5F_ACC_RDONLY, fapl);
- if (s.file < 0) {
+ if (s->file < 0) {
HDprintf("H5Fcreate/open failed\n");
TEST_ERROR;
}
@@ -580,7 +604,7 @@ main(int argc, char **argv)
* two-way communication.
* One is for the writer to write to the reader.
* The other one is for the reader to signal the writer. */
- if (s.use_named_pipes && writer) {
+ if (s->use_named_pipes && writer) {
/* Writer creates two named pipes(FIFO) */
if (HDmkfifo(fifo_writer_to_reader, 0600) < 0) {
HDprintf("HDmkfifo failed\n");
@@ -594,74 +618,74 @@ main(int argc, char **argv)
}
/* Both the writer and reader open the pipes */
- if (s.use_named_pipes && (fd_writer_to_reader = HDopen(fifo_writer_to_reader, O_RDWR)) < 0) {
+ if (s->use_named_pipes && (fd_writer_to_reader = HDopen(fifo_writer_to_reader, O_RDWR)) < 0) {
HDprintf("HDopen failed\n");
TEST_ERROR;
}
- if (s.use_named_pipes && (fd_reader_to_writer = HDopen(fifo_reader_to_writer, O_RDWR)) < 0) {
+ if (s->use_named_pipes && (fd_reader_to_writer = HDopen(fifo_reader_to_writer, O_RDWR)) < 0) {
HDprintf("HDopen failed\n");
TEST_ERROR;
}
/* Pass the named pipe information to the struct of state_t s, for attribute tests.*/
- if (s.use_named_pipes) {
- s.np_fd_w_to_r = fd_writer_to_reader;
- s.np_fd_r_to_w = fd_reader_to_writer;
- s.np_notify = notify;
- s.np_verify = verify;
+ if (s->use_named_pipes) {
+ s->np_fd_w_to_r = fd_writer_to_reader;
+ s->np_fd_r_to_w = fd_reader_to_writer;
+ s->np_notify = notify;
+ s->np_verify = verify;
}
if (writer) {
- for (step = 0; step < s.nsteps; step++) {
+ for (step = 0; step < s->nsteps; step++) {
dbgf(2, "writer: step %d\n", step);
- wg_ret = create_group(&s, step);
+ wg_ret = create_group(s, step);
if (wg_ret == false) {
- if (s.use_named_pipes)
- np_send_error(&s, true);
+ if (s->use_named_pipes && !np_send_error(s, true))
+ HDprintf("Error message send failed\n");
HDprintf("create groups failed\n");
TEST_ERROR;
}
}
- if (s.use_named_pipes && np_wr_send_receive(&s) == false) {
+ if (s->use_named_pipes && np_wr_send_receive(s) == false) {
HDprintf("writer: write group - verification failed.\n");
TEST_ERROR;
}
/* Delete 1000 groups if the del_grp option is true. */
- if (s.del_grp && s.nsteps > 1000) {
+ if (s->del_grp && s->nsteps > 1000) {
HDprintf("Deleting groups. \n");
- for (step = s.nsteps - 1; step >= (s.nsteps - 1000); step--) {
+ for (step = s->nsteps - 1; step >= (s->nsteps - 1000); step--) {
dbgf(2, "writer: deleting step %d\n", step);
- wg_ret = delete_group(&s, step);
+ wg_ret = delete_group(s, step);
if (wg_ret == false) {
HDprintf("delete group_operations failed\n");
TEST_ERROR;
}
}
/* end tick,may be not necessary. */
- if (H5Fvfd_swmr_end_tick(s.file) < 0)
+ if (H5Fvfd_swmr_end_tick(s->file) < 0)
TEST_ERROR;
}
/* May be necessary for the writer to wait a longer time before
- closing the file.
- The default value is 112 tenths of a second(4*s.tick_len*s.max_lag)
- if tick_len is 4 and max_lag is 7.
- */
- decisleep(s.w_sleep_len);
- }
- else { /*Reader */
- if (s.use_named_pipes) {
- if (false == np_rd_receive(&s)) {
+ * closing the file.
+ * The default value is 112 tenths of a second(4*s.tick_len*s.max_lag)
+ * if tick_len is 4 and max_lag is 7.
+ */
+ decisleep(s->w_sleep_len);
+ }
+ else { /* Reader */
+ if (s->use_named_pipes) {
+ if (false == np_rd_receive(s)) {
TEST_ERROR;
}
dbgf(2, "reader receives the message.\n");
- if (np_rd_send(&s) == false) {
+ if (np_rd_send(s) == false) {
TEST_ERROR;
}
dbgf(2, "reader sends the message.\n ");
@@ -673,7 +697,7 @@ main(int argc, char **argv)
}
HDprintf("Reader: call back function: check group names.\n");
- if (H5Literate(s.file, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, op_func, NULL) < 0) {
+ if (H5Literate(s->file, H5_INDEX_NAME, H5_ITER_NATIVE, NULL, op_func, NULL) < 0) {
HDprintf("H5Literate failed \n");
TEST_ERROR;
}
@@ -695,29 +719,29 @@ main(int argc, char **argv)
TEST_ERROR;
}
- if (H5Sclose(s.one_by_one_sid) < 0) {
+ if (H5Sclose(s->one_by_one_sid) < 0) {
HDprintf("H5Sclose failed\n");
TEST_ERROR;
}
- if (H5Fclose(s.file) < 0) {
+ if (H5Fclose(s->file) < 0) {
HDprintf("H5Fclose failed\n");
TEST_ERROR;
}
/* Both the writer and reader close the named pipes */
- if (s.use_named_pipes && HDclose(fd_writer_to_reader) < 0) {
+ if (s->use_named_pipes && HDclose(fd_writer_to_reader) < 0) {
HDprintf("HDclose failed\n");
TEST_ERROR;
}
- if (s.use_named_pipes && HDclose(fd_reader_to_writer) < 0) {
+ if (s->use_named_pipes && HDclose(fd_reader_to_writer) < 0) {
HDprintf("HDclose failed\n");
TEST_ERROR;
}
/* Reader finishes last and deletes the named pipes */
- if (s.use_named_pipes && !writer) {
+ if (s->use_named_pipes && !writer) {
if (HDremove(fifo_writer_to_reader) != 0) {
HDprintf("HDremove failed\n");
TEST_ERROR;
@@ -729,6 +753,9 @@ main(int argc, char **argv)
}
}
+ HDfree(s);
+ HDfree(config);
+
return EXIT_SUCCESS;
error:
@@ -736,24 +763,28 @@ error:
{
H5Pclose(fapl);
H5Pclose(fcpl);
- H5Sclose(s.one_by_one_sid);
- H5Fclose(s.file);
+ H5Sclose(s->one_by_one_sid);
+ H5Fclose(s->file);
}
H5E_END_TRY;
- if (s.use_named_pipes && fd_writer_to_reader >= 0)
+ if (s->use_named_pipes && fd_writer_to_reader >= 0)
HDclose(fd_writer_to_reader);
- if (s.use_named_pipes && fd_reader_to_writer >= 0)
+ if (s->use_named_pipes && fd_reader_to_writer >= 0)
HDclose(fd_reader_to_writer);
- if (s.use_named_pipes && !writer) {
+ if (s->use_named_pipes && !writer) {
HDremove(fifo_writer_to_reader);
HDremove(fifo_reader_to_writer);
}
+ HDfree(s);
+ HDfree(config);
+
return EXIT_FAILURE;
}
+
/************************************************************
Operator function. Prints the name and type of the object