summaryrefslogtreecommitdiffstats
path: root/src/H5Dint.c
diff options
context:
space:
mode:
authorJordan Henderson <jhenderson@hdfgroup.org>2017-07-05 13:05:02 (GMT)
committerJordan Henderson <jhenderson@hdfgroup.org>2017-07-05 13:05:02 (GMT)
commit34fac7abb0c48f3118572176902d92c739973ca3 (patch)
treec6a301af857292b1de3828c0131b1437e187b913 /src/H5Dint.c
parent92759cc3b9f67f0ca913f190bd9bc5a5249455be (diff)
parent6428a637752753cc8a9007c0c3c38b9ea9cc97fd (diff)
downloadhdf5-34fac7abb0c48f3118572176902d92c739973ca3.zip
hdf5-34fac7abb0c48f3118572176902d92c739973ca3.tar.gz
hdf5-34fac7abb0c48f3118572176902d92c739973ca3.tar.bz2
Merging in latest from upstream (HDFFV/hdf5:refs/heads/develop)
* commit '6428a637752753cc8a9007c0c3c38b9ea9cc97fd': (165 commits) Skip HDFFV-10160 filenotclosed test for split/multi driver Temporary skip this test for split/multi driver. Further investigation to resolve the failure is needed. Please enter the commit message for your changes. Lines starting More minor whitespace cleanup Fixed a minor comment typo in H5R.c * Reverted removal of H5I_REFERENCE to avoid breaking binary compatibility. * Added a quick H5I_REFERENCE smoke check to test_misc19() in tmisc.c. Added missing free() call to test_misc19(). Purged the unused H5I_REFERENCE from the library. Added a test for VFD IDs to testhdf5. Revert "Partial removal of NDEBUG ifdefs from the library." Partial removal of NDEBUG ifdefs from the library. Removed compiler flag cleanup since Solaris chokes on it. Fix for HDFFV-10160 Modifications to fix the assertion/abort failure when the application does not close the file. Fixed a bug in autotools Fortran processing where a test for the presence of a C long double type always returned true. Updated the --enable-debug/production handling in configure.ac so that it more reliably indicates that the configure option can no longer be used. Previously, using --enable-debug="", etc. would not trigger an error (even though such usage is unlikely). Added awk processing to remove extraneous whitespace from H5_ flags in configure. Fixed a comment in configure.ac HDFFV-10219 another mode change HDFFV-10219 change subset to use BINARY mode for h5dump HDFFV-10219 default input binary to NATIVE Set default of var to NATIVE HDFFV-10219 - disable h5dump tests until h5import NATIVE is fixed ...
Diffstat (limited to 'src/H5Dint.c')
-rw-r--r--src/H5Dint.c210
1 files changed, 107 insertions, 103 deletions
diff --git a/src/H5Dint.c b/src/H5Dint.c
index c9bf953..0928afe 100644
--- a/src/H5Dint.c
+++ b/src/H5Dint.c
@@ -5,12 +5,10 @@
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
+ * the COPYING file, which can be found at the root of the source code *
+ * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
+ * If you do not have access to either file, you may request a copy from *
+ * help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/****************/
@@ -3002,10 +3000,10 @@ H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
{
H5D_chk_idx_info_t new_idx_info; /* Index info for the new layout */
H5D_chk_idx_info_t idx_info; /* Index info for the current layout */
- H5O_layout_t newlayout; /* The new layout */
- hbool_t init_new_index = FALSE; /* Indicate that the new chunk index is initialized */
+ H5O_layout_t *newlayout = NULL; /* The new layout */
+ hbool_t init_new_index = FALSE; /* Indicate that the new chunk index is initialized */
hbool_t delete_old_layout = FALSE; /* Indicate that the old layout message is deleted */
- hbool_t add_new_layout = FALSE; /* Indicate that the new layout message is added */
+ hbool_t add_new_layout = FALSE; /* Indicate that the new layout message is added */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
@@ -3015,121 +3013,127 @@ H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
switch(dataset->shared->layout.type) {
case H5D_CHUNKED:
- HDassert(dataset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE);
-
- /* Set up the current index info */
- idx_info.f = dataset->oloc.file;
- idx_info.dxpl_id = dxpl_id;
- idx_info.pline = &dataset->shared->dcpl_cache.pline;
- idx_info.layout = &dataset->shared->layout.u.chunk;
- idx_info.storage = &dataset->shared->layout.storage.u.chunk;
-
- /* Copy the current layout info to the new layout */
- HDmemcpy(&newlayout, &dataset->shared->layout, sizeof(H5O_layout_t));
-
- /* Set up info for version 1 B-tree in the new layout */
- newlayout.version = H5O_LAYOUT_VERSION_3;
- newlayout.storage.u.chunk.idx_type = H5D_CHUNK_IDX_BTREE;
- newlayout.storage.u.chunk.idx_addr = HADDR_UNDEF;
- newlayout.storage.u.chunk.ops = H5D_COPS_BTREE;
- newlayout.storage.u.chunk.u.btree.shared = NULL;
-
- /* Set up the index info to version 1 B-tree */
- new_idx_info.f = dataset->oloc.file;
- new_idx_info.dxpl_id = dxpl_id;
- new_idx_info.pline = &dataset->shared->dcpl_cache.pline;
- new_idx_info.layout = &newlayout.u.chunk;
- new_idx_info.storage = &newlayout.storage.u.chunk;
-
- /* Initialize version 1 B-tree */
- if(new_idx_info.storage->ops->init &&
- (new_idx_info.storage->ops->init)(&new_idx_info, dataset->shared->space, dataset->oloc.addr) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
- init_new_index = TRUE;
-
- /* If the current chunk index exists */
- if(H5F_addr_defined(idx_info.storage->idx_addr)) {
-
- /* Create v1 B-tree chunk index */
- if((new_idx_info.storage->ops->create)(&new_idx_info) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create chunk index")
-
- /* Iterate over the chunks in the current index and insert the chunk addresses
- * into the version 1 B-tree chunk index */
- if(H5D__chunk_format_convert(dataset, &idx_info, &new_idx_info) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate/convert chunk index")
- } /* end if */
+ HDassert(dataset->shared->layout.u.chunk.idx_type != H5D_CHUNK_IDX_BTREE);
+
+ if(NULL == (newlayout = (H5O_layout_t *)H5MM_calloc(sizeof(H5O_layout_t))))
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate buffer")
+
+ /* Set up the current index info */
+ idx_info.f = dataset->oloc.file;
+ idx_info.dxpl_id = dxpl_id;
+ idx_info.pline = &dataset->shared->dcpl_cache.pline;
+ idx_info.layout = &dataset->shared->layout.u.chunk;
+ idx_info.storage = &dataset->shared->layout.storage.u.chunk;
+
+ /* Copy the current layout info to the new layout */
+ HDmemcpy(newlayout, &dataset->shared->layout, sizeof(H5O_layout_t));
+
+ /* Set up info for version 1 B-tree in the new layout */
+ newlayout->version = H5O_LAYOUT_VERSION_3;
+ newlayout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_BTREE;
+ newlayout->storage.u.chunk.idx_addr = HADDR_UNDEF;
+ newlayout->storage.u.chunk.ops = H5D_COPS_BTREE;
+ newlayout->storage.u.chunk.u.btree.shared = NULL;
+
+ /* Set up the index info to version 1 B-tree */
+ new_idx_info.f = dataset->oloc.file;
+ new_idx_info.dxpl_id = dxpl_id;
+ new_idx_info.pline = &dataset->shared->dcpl_cache.pline;
+ new_idx_info.layout = &(newlayout->u).chunk;
+ new_idx_info.storage = &(newlayout->storage).u.chunk;
+
+ /* Initialize version 1 B-tree */
+ if(new_idx_info.storage->ops->init && (new_idx_info.storage->ops->init)(&new_idx_info, dataset->shared->space, dataset->oloc.addr) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
+ init_new_index = TRUE;
+
+ /* If the current chunk index exists */
+ if(H5F_addr_defined(idx_info.storage->idx_addr)) {
+
+ /* Create v1 B-tree chunk index */
+ if((new_idx_info.storage->ops->create)(&new_idx_info) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create chunk index")
+
+ /* Iterate over the chunks in the current index and insert the chunk addresses
+ * into the version 1 B-tree chunk index
+ */
+ if(H5D__chunk_format_convert(dataset, &idx_info, &new_idx_info) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate/convert chunk index")
+ } /* end if */
- /* Delete the old "current" layout message */
- if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
- HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
+ /* Delete the old "current" layout message */
+ if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
- delete_old_layout = TRUE;
+ delete_old_layout = TRUE;
- /* Append the new layout message to the object header */
- if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &newlayout, dxpl_id) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout header message")
+ /* Append the new layout message to the object header */
+ if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, newlayout, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout header message")
- add_new_layout = TRUE;
+ add_new_layout = TRUE;
- /* Release the old (current) chunk index */
- if(idx_info.storage->ops->dest && (idx_info.storage->ops->dest)(&idx_info) < 0)
- HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+ /* Release the old (current) chunk index */
+ if(idx_info.storage->ops->dest && (idx_info.storage->ops->dest)(&idx_info) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
- /* Copy the new layout to the dataset's layout */
- HDmemcpy(&dataset->shared->layout, &newlayout, sizeof(H5O_layout_t));
+ /* Copy the new layout to the dataset's layout */
+ HDmemcpy(&dataset->shared->layout, newlayout, sizeof(H5O_layout_t));
- break;
+ break;
- case H5D_CONTIGUOUS:
+ case H5D_CONTIGUOUS:
case H5D_COMPACT:
- HDassert(dataset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT);
- dataset->shared->layout.version = H5O_LAYOUT_VERSION_DEFAULT;
- if(H5O_msg_write(&(dataset->oloc), H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &(dataset->shared->layout), dxpl_id) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message")
- break;
+ HDassert(dataset->shared->layout.version > H5O_LAYOUT_VERSION_DEFAULT);
+ dataset->shared->layout.version = H5O_LAYOUT_VERSION_DEFAULT;
+ if(H5O_msg_write(&(dataset->oloc), H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &(dataset->shared->layout), dxpl_id) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update layout message")
+ break;
- case H5D_VIRTUAL:
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "virtual dataset layout not supported")
+ case H5D_VIRTUAL:
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "virtual dataset layout not supported")
case H5D_LAYOUT_ERROR:
case H5D_NLAYOUTS:
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset layout type")
- default:
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
+ default:
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unknown dataset layout type")
} /* end switch */
done:
if(ret_value < 0 && dataset->shared->layout.type == H5D_CHUNKED) {
- /* Remove new layout message */
- if(add_new_layout)
- if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
- HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
-
- /* Add back old layout message */
- if(delete_old_layout)
- if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &dataset->shared->layout, dxpl_id) < 0)
- HDONE_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to add layout header message")
-
- /* Clean up v1 b-tree chunk index */
- if(init_new_index) {
- if(H5F_addr_defined(new_idx_info.storage->idx_addr)) {
- /* Check for valid address i.e. tag */
- if(!H5F_addr_defined(dataset->oloc.addr))
- HDONE_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "address undefined")
-
- /* Expunge from cache all v1 B-tree type entries associated with tag */
- if(H5AC_expunge_tag_type_metadata(dataset->oloc.file, dxpl_id, dataset->oloc.addr, H5AC_BT_ID, H5AC__NO_FLAGS_SET))
- HDONE_ERROR(H5E_DATASET, H5E_CANTEXPUNGE, FAIL, "unable to expunge index metadata")
- } /* end if */
+ /* Remove new layout message */
+ if(add_new_layout)
+ if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, FALSE, dxpl_id) < 0)
+ HDONE_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
+
+ /* Add back old layout message */
+ if(delete_old_layout)
+ if(H5O_msg_create(&dataset->oloc, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &dataset->shared->layout, dxpl_id) < 0)
+ HDONE_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to add layout header message")
+
+ /* Clean up v1 b-tree chunk index */
+ if(init_new_index) {
+ if(H5F_addr_defined(new_idx_info.storage->idx_addr)) {
+ /* Check for valid address i.e. tag */
+ if(!H5F_addr_defined(dataset->oloc.addr))
+ HDONE_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "address undefined")
+
+ /* Expunge from cache all v1 B-tree type entries associated with tag */
+ if(H5AC_expunge_tag_type_metadata(dataset->oloc.file, dxpl_id, dataset->oloc.addr, H5AC_BT_ID, H5AC__NO_FLAGS_SET))
+ HDONE_ERROR(H5E_DATASET, H5E_CANTEXPUNGE, FAIL, "unable to expunge index metadata")
+ } /* end if */
- /* Delete v1 B-tree chunk index */
- if(new_idx_info.storage->ops->dest && (new_idx_info.storage->ops->dest)(&new_idx_info) < 0)
- HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
- } /* end if */
+ /* Delete v1 B-tree chunk index */
+ if(new_idx_info.storage->ops->dest && (new_idx_info.storage->ops->dest)(&new_idx_info) < 0)
+ HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+ } /* end if */
} /* end if */
+ if(newlayout != NULL)
+ newlayout = (H5O_layout_t *)H5MM_xfree(newlayout);
+
FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
} /* end H5D__format_convert() */