diff options
author | vchoi <vchoi@jelly.ad.hdfgroup.org> | 2022-01-04 22:57:20 (GMT) |
---|---|---|
committer | vchoi <vchoi@jelly.ad.hdfgroup.org> | 2022-01-04 22:57:20 (GMT) |
commit | b12565b8151eae7c97f1a3cb2ed05e9c30cf6cf6 (patch) | |
tree | e79adb7ad13fde778af6eb6ea7821be448cdedb2 /src/H5Fvfd_swmr.c | |
parent | cdc93ea7faa30084c6399b1a7cc5347e5654f860 (diff) | |
download | hdf5-b12565b8151eae7c97f1a3cb2ed05e9c30cf6cf6.zip hdf5-b12565b8151eae7c97f1a3cb2ed05e9c30cf6cf6.tar.gz hdf5-b12565b8151eae7c97f1a3cb2ed05e9c30cf6cf6.tar.bz2 |
(A) Address issue #2 and issue #4 of the group test failures.
See Kent's documentation "Designed to Fail Tests and Issues".
(a) Fix for issue #2:
--Print out meaningful message about max_lag when there is
checksum error in loading an entry via H5C__load_entry().
--H5C.c: H5C_protect()
(b) Fix for issue #4:
--Allocate more space when the copy of the index read from the metadata file is
bigger than the existing size
--H5Fvfd_swmr.c: H5F_vfd_swmr_reader_end_of_tick()
(B) When putting the old index into the delayed free list, use the old
writer_index_offset instead of the current writer_index_offset
--H5Fvfd_swmr.c: vfd_swmr_enlarge_shadow_index()
(C) When there is error form calling H5F_vfd_swmr_process_eot_queue() in
VFD_SWMR_ENTER(err) and VFD_SWMR_LEAVE(err), should report
FAIL instead of "err"
--H5private.h: VFD_SWMR_ENTER and VFD_SWMR_LEAVE macros
(D) Add tests to verify issue #2 and issue #4 are fixed.
Diffstat (limited to 'src/H5Fvfd_swmr.c')
-rw-r--r-- | src/H5Fvfd_swmr.c | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/H5Fvfd_swmr.c b/src/H5Fvfd_swmr.c index 1a8f127..e25b529 100644 --- a/src/H5Fvfd_swmr.c +++ b/src/H5Fvfd_swmr.c @@ -1136,6 +1136,7 @@ H5F_vfd_swmr_reader_end_of_tick(H5F_t *f, hbool_t entering_api) uint32_t tmp_mdf_idx_len; uint32_t tmp_mdf_idx_entries_used; uint32_t mdf_idx_entries_used; + uint32_t vfd_entries; H5F_shared_t * shared = f->shared; struct { uint64_t pgno; @@ -1157,8 +1158,12 @@ H5F_vfd_swmr_reader_end_of_tick(H5F_t *f, hbool_t entering_api) * * If the tick reported has not increased since the last * call, do nothing and exit. + * + * Also retrieve the current number of entries in the index + * so as to detect the need to allocate more space for the + * index. */ - if (H5FD_vfd_swmr_get_tick_and_idx(file, TRUE, &tmp_tick_num, NULL, NULL) < 0) + if (H5FD_vfd_swmr_get_tick_and_idx(file, TRUE, &tmp_tick_num, &vfd_entries, NULL) < 0) HGOTO_ERROR(H5E_ARGS, H5E_CANTGET, FAIL, "error in retrieving tick_num from driver") @@ -1172,7 +1177,7 @@ H5F_vfd_swmr_reader_end_of_tick(H5F_t *f, hbool_t entering_api) * */ if (!entering_api && tmp_tick_num >= shared->tick_num + shared->vfd_swmr_config.max_lag) { HGOTO_ERROR(H5E_FILE, H5E_SYSTEM, FAIL, - "Reader's API time exceeds max_lag of ticks, may increase the value of max_lag."); + "Reader's API time exceeds max_lag ticks, suggest to increase the value of max_lag."); } #if 0 /* Kent */ /* The original code */ @@ -1207,6 +1212,33 @@ H5F_vfd_swmr_reader_end_of_tick(H5F_t *f, hbool_t entering_api) if (shared->mdf_idx == NULL && H5F__vfd_swmr_create_index(shared) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "unable to allocate metadata file index"); + /* Check if more space is needed for the index */ + if (shared->mdf_idx_len < vfd_entries) { + uint32_t inc_mdf_idx_len; + H5FD_vfd_swmr_idx_entry_t *new_idx; + H5FD_vfd_swmr_idx_entry_t *old_idx; + + HDassert(shared->old_mdf_idx_len <= shared->mdf_idx_len); + + /* Determine the size needed for the index */ + inc_mdf_idx_len = shared->mdf_idx_len * 2; + while (vfd_entries > inc_mdf_idx_len) + inc_mdf_idx_len *= 2; + + /* Allocate more space for shared->mdf_idx and shared->old_mdf_idx */ + new_idx = H5MM_realloc(shared->mdf_idx, inc_mdf_idx_len * sizeof(shared->mdf_idx[0])); + if(new_idx == NULL) + HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "new index null after H5MM_realloc()") + shared->mdf_idx = new_idx; + shared->mdf_idx_len = inc_mdf_idx_len; + + old_idx = H5MM_realloc(shared->old_mdf_idx, inc_mdf_idx_len * sizeof(shared->old_mdf_idx[0])); + if(old_idx == NULL) + HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "old index null after H5MM_realloc()") + shared->old_mdf_idx = old_idx; + shared->old_mdf_idx_len = inc_mdf_idx_len; + } + mdf_idx_entries_used = shared->mdf_idx_len; #if 0 /* JRM */ @@ -1887,6 +1919,7 @@ vfd_swmr_enlarge_shadow_index(H5F_t *f) H5F_shared_t * shared = f->shared; H5FD_vfd_swmr_idx_entry_t *ret_value = NULL; haddr_t idx_addr; + haddr_t old_writer_index_offset; hsize_t idx_size; H5FD_vfd_swmr_idx_entry_t *new_mdf_idx = NULL, *old_mdf_idx; uint32_t new_mdf_idx_len, old_mdf_idx_len; @@ -1924,6 +1957,7 @@ vfd_swmr_enlarge_shadow_index(H5F_t *f) */ H5MM_memcpy(new_mdf_idx, old_mdf_idx, sizeof(new_mdf_idx[0]) * old_mdf_idx_len); + old_writer_index_offset = shared->writer_index_offset; shared->writer_index_offset = idx_addr; ret_value = shared->mdf_idx = new_mdf_idx; shared->mdf_idx_len = new_mdf_idx_len; @@ -1939,7 +1973,8 @@ vfd_swmr_enlarge_shadow_index(H5F_t *f) * past what is strictly necessary, but it seems like a reasonable * trade-off for simplicity. */ - if (shadow_range_defer_free(shared, shared->writer_index_offset, H5FD_MD_INDEX_SIZE(old_mdf_idx_len)) == + /* Fix: use the saved old_writer_index_offset not the current one */ + if (shadow_range_defer_free(shared, old_writer_index_offset, H5FD_MD_INDEX_SIZE(old_mdf_idx_len)) == -1) { HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "could not schedule index reclamation"); } |