summaryrefslogtreecommitdiffstats
path: root/src/H5MF.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5MF.c')
-rw-r--r--src/H5MF.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/H5MF.c b/src/H5MF.c
index 3be5e0a..f64a27a 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -3579,6 +3579,7 @@ H5MF_tidy_self_referential_fsm_hack(H5F_t *f)
H5F_mem_page_t sm_fssinfo_fs_type; /* Small fs sinfo fsm */
H5F_mem_page_t lg_fshdr_fs_type; /* Large fs hdr fsm */
H5F_mem_page_t lg_fssinfo_fs_type; /* Large fs sinfo fsm */
+ H5PB_t *saved_pb_ptr = NULL; /* Pointer to page buffer */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_TAG(H5AC__FREESPACE_TAG, FAIL)
@@ -3636,6 +3637,18 @@ H5MF_tidy_self_referential_fsm_hack(H5F_t *f)
HDassert(NULL == f->shared->fs_man[sm_fshdr_fs_type]);
HDassert(NULL == f->shared->fs_man[sm_fssinfo_fs_type]);
+ /* Disable page buffering when paged aggregation strategy with
+ * persistent FS and page buffering are used.
+ * This is in response to an assertion failure in H5PB.c when
+ * running test/fheap.c.
+ * This is due to header/section info got loaded into the page buffer
+ * when freeing them via H5FS_free() called in this routine.
+ */
+ if(H5F_PAGED_AGGR(f) && f->shared->pb_ptr) {
+ saved_pb_ptr = f->shared->pb_ptr;
+ f->shared->pb_ptr = NULL;
+ }
+
if(H5F_addr_defined(f->shared->fs_addr[sm_fshdr_fs_type])) {
first_srfsm_hdr = f->shared->fs_addr[sm_fshdr_fs_type];
@@ -3790,6 +3803,12 @@ H5MF_tidy_self_referential_fsm_hack(H5F_t *f)
HDassert((!H5F_PAGED_AGGR(f)) || (0 == (eoa % f->shared->fs_page_size)));
done:
+ /* Enable page buffering as needed */
+ if(H5F_PAGED_AGGR(f) && saved_pb_ptr) {
+ HDassert(f->shared->pb_ptr == NULL);
+ f->shared->pb_ptr = saved_pb_ptr;
+ }
+
/* Reset the ring in the API context */
if(orig_ring != H5AC_RING_INV)
H5AC_set_ring(orig_ring, NULL);