summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2007-08-14 13:33:14 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2007-08-14 13:33:14 (GMT)
commit4dc989f28232245dbc2f52c1330346868099234e (patch)
treed063e00bd62d863f93e3ceed6f810c03c8b410a9 /src
parentabd36a6f6ed8a19c2253209dd2f2632c1df34a29 (diff)
downloadhdf5-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.c29
-rw-r--r--src/H5FSprivate.h3
-rw-r--r--src/H5FSsection.c1
-rw-r--r--src/H5HFpkg.h1
-rw-r--r--src/H5HFspace.c41
-rw-r--r--src/H5HFstat.c2
6 files changed, 50 insertions, 27 deletions
diff --git a/src/H5FS.c b/src/H5FS.c
index e34f176..1b8ef90 100644
--- a/src/H5FS.c
+++ b/src/H5FS.c
@@ -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: