diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2007-08-14 13:33:14 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2007-08-14 13:33:14 (GMT) |
commit | 4dc989f28232245dbc2f52c1330346868099234e (patch) | |
tree | d063e00bd62d863f93e3ceed6f810c03c8b410a9 /src | |
parent | abd36a6f6ed8a19c2253209dd2f2632c1df34a29 (diff) | |
download | hdf5-4dc989f28232245dbc2f52c1330346868099234e.zip hdf5-4dc989f28232245dbc2f52c1330346868099234e.tar.gz hdf5-4dc989f28232245dbc2f52c1330346868099234e.tar.bz2 |
[svn-r14083] Description:
Correct problem with fractal heap's free space size usage gathering
routine, which was "poisoning the cache" by loading an incorrectly initialized
piece of metadata from the file.
Tested on:
FreeBSD/32 6.2 (duty)
Mac OS X/32 6.2 (amazon)
Diffstat (limited to 'src')
-rw-r--r-- | src/H5FS.c | 29 | ||||
-rw-r--r-- | src/H5FSprivate.h | 3 | ||||
-rw-r--r-- | src/H5FSsection.c | 1 | ||||
-rw-r--r-- | src/H5HFpkg.h | 1 | ||||
-rw-r--r-- | src/H5HFspace.c | 41 | ||||
-rw-r--r-- | src/H5HFstat.c | 2 |
6 files changed, 50 insertions, 27 deletions
@@ -167,7 +167,7 @@ H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, size_t nclasses, FUNC_ENTER_NOAPI(H5FS_open, NULL) #ifdef QAK -HDfprintf(stderr, "%s: Opening free space manager\n", FUNC); +HDfprintf(stderr, "%s: Opening free space manager, nclasses = %Zu\n", FUNC, nclasses); #endif /* QAK */ /* Check arguments. */ @@ -467,40 +467,21 @@ done: *------------------------------------------------------------------------- */ herr_t -H5FS_size(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, hsize_t *meta_size) +H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size) { - H5FS_t *fspace = NULL; /* Free space header info */ - H5FS_prot_t fs_prot; /* Information for protecting free space manager */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5FS_size, FAIL) + FUNC_ENTER_NOAPI_NOFUNC(H5FS_size) /* * Check arguments. */ HDassert(f); - HDassert(H5F_addr_defined(fs_addr)); + HDassert(fspace); HDassert(meta_size); - /* Initialize user data for protecting the free space manager */ - fs_prot.nclasses = 0; - fs_prot.classes = NULL; - fs_prot.cls_init_udata = NULL; - - /* - * Load the free space header. - */ - if(NULL == (fspace = H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &fs_prot, NULL, H5AC_READ))) - HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header") - /* Get the free space size info */ *meta_size += H5FS_HEADER_SIZE(f) + fspace->alloc_sect_size; -done: - if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__NO_FLAGS_SET) < 0) - HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header") - - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5FS_size() */ #ifdef H5FS_DEBUG diff --git a/src/H5FSprivate.h b/src/H5FSprivate.h index 16f2df6..bf24b8a 100644 --- a/src/H5FSprivate.h +++ b/src/H5FSprivate.h @@ -158,8 +158,7 @@ H5_DLL H5FS_t *H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr, const H5FS_section_class_t *classes[], void *cls_init_udata); H5_DLL H5FS_t *H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, size_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata); -H5_DLL herr_t H5FS_size(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, - hsize_t *meta_size); +H5_DLL herr_t H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size); H5_DLL herr_t H5FS_delete(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr); H5_DLL herr_t H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace); diff --git a/src/H5FSsection.c b/src/H5FSsection.c index c4c30bc..505223a 100644 --- a/src/H5FSsection.c +++ b/src/H5FSsection.c @@ -1205,6 +1205,7 @@ HDfprintf(stderr, "%s: request = %Hu\n", FUNC, request); /* Check arguments. */ HDassert(fspace); + HDassert(fspace->nclasses); HDassert(request); HDassert(node); diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h index 5bc1f14..461cba7 100644 --- a/src/H5HFpkg.h +++ b/src/H5HFpkg.h @@ -697,6 +697,7 @@ H5_DLL herr_t H5HF_space_add(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *node, unsigned flags); H5_DLL htri_t H5HF_space_find(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t request, H5HF_free_section_t **node); +H5_DLL herr_t H5HF_space_size(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t *fs_size); H5_DLL herr_t H5HF_space_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *node); H5_DLL herr_t H5HF_space_close(H5HF_hdr_t *hdr, hid_t dxpl_id); diff --git a/src/H5HFspace.c b/src/H5HFspace.c index 83551ba..16eae51 100644 --- a/src/H5HFspace.c +++ b/src/H5HFspace.c @@ -234,6 +234,47 @@ done: /*------------------------------------------------------------------------- + * Function: H5HF_space_size + * + * Purpose: Query the size of the heap's free space info on disk + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * August 14 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5HF_space_size(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t *fs_size) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5HF_space_size) + + /* + * Check arguments. + */ + HDassert(hdr); + HDassert(fs_size); + + /* Check if the free space for the heap has been initialized */ + if(!hdr->fspace) + if(H5HF_space_start(hdr, dxpl_id) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize heap free space") + + /* Get free space metadata size */ + if(H5FS_size(hdr->f, hdr->fspace, fs_size) < 0) + HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't retrieve FS meta storage info") + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5HF_space_size() */ + + +/*------------------------------------------------------------------------- * Function: H5HF_space_remove * * Purpose: Remove a section from the free space for the heap diff --git a/src/H5HFstat.c b/src/H5HFstat.c index 4971394..b2f45df 100644 --- a/src/H5HFstat.c +++ b/src/H5HFstat.c @@ -175,7 +175,7 @@ H5HF_size(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr, hsize_t *heap_size) /* Get storage for free-space tracking info */ if(H5F_addr_defined(hdr->fs_addr)) - if(H5FS_size(f, dxpl_id, hdr->fs_addr, heap_size) < 0) + if(H5HF_space_size(hdr, dxpl_id, heap_size) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't retrieve FS meta storage info") done: |