mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-12 17:31:09 +08:00
Fix for HDFFV-9277: update the ainfo message after removing an attribute.
This commit is contained in:
parent
32d5a3be1c
commit
ad317226ea
@ -110,6 +110,16 @@ Bug Fixes since HDF5-1.10.2 release
|
||||
|
||||
Library
|
||||
-------
|
||||
- H5Adelete
|
||||
|
||||
H5Adelete failed when deleting the last "large" attribute that
|
||||
is stored densely via fractal heap/v2 b-tree.
|
||||
|
||||
After removing the attribute, update the ainfo message. If the
|
||||
number of attributes goes to zero, remove the message.
|
||||
|
||||
(VC - 2018/07/20, HDFFV-9277)
|
||||
|
||||
- Error checks in h5stat and when decoding messages
|
||||
|
||||
h5stat exited with seg fault/core dumped when
|
||||
|
@ -1448,6 +1448,12 @@ H5O_attr_remove_update(const H5O_loc_t *loc, H5O_t *oh, H5O_ainfo_t *ainfo)
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
|
||||
/* Update the message after removing the attribute */
|
||||
/* This is particularly needed when removing the last attribute that is
|
||||
accessed via fractal heap/v2 B-tree (HDFFV-9277) */
|
||||
if(H5O__msg_write_real(loc->file, oh, H5O_MSG_AINFO, H5O_MSG_FLAG_DONTSHARE, 0, ainfo) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info message")
|
||||
|
||||
/* Check if we have deleted all the attributes and the attribute info
|
||||
* message should be deleted itself.
|
||||
*/
|
||||
@ -1455,9 +1461,6 @@ H5O_attr_remove_update(const H5O_loc_t *loc, H5O_t *oh, H5O_ainfo_t *ainfo)
|
||||
if(H5O__msg_remove_real(loc->file, oh, H5O_MSG_AINFO, H5O_ALL, NULL, NULL, TRUE) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute info")
|
||||
} /* end if */
|
||||
else
|
||||
if(H5O__msg_write_real(loc->file, oh, H5O_MSG_AINFO, H5O_MSG_FLAG_DONTSHARE, 0, ainfo) < 0)
|
||||
HGOTO_ERROR(H5E_ATTR, H5E_CANTUPDATE, FAIL, "unable to update attribute info message")
|
||||
|
||||
done:
|
||||
/* Release resources */
|
||||
|
94
test/tattr.c
94
test/tattr.c
@ -136,6 +136,13 @@ float attr_data5=-5.123F; /* Test data for 5th attribute */
|
||||
#define BUG3_DT_NAME "dt"
|
||||
#define BUG3_ATTR_NAME "attr"
|
||||
|
||||
/* Used by test_attr_delete_last_dense() */
|
||||
#define GRPNAME "grp"
|
||||
#define ATTRNAME "attr"
|
||||
#define DIM0 100
|
||||
#define DIM1 100
|
||||
#define RANK 2
|
||||
|
||||
/* Attribute iteration struct */
|
||||
typedef struct {
|
||||
H5_iter_order_t order; /* Direction of iteration */
|
||||
@ -10670,6 +10677,92 @@ test_attr_bug9(hid_t fcpl, hid_t fapl)
|
||||
CHECK(ret, FAIL, "H5Sclose");
|
||||
} /* test_attr_bug9() */
|
||||
|
||||
/****************************************************************
|
||||
**
|
||||
** test_attr_delete_dense():
|
||||
** This is to verify the error as described in HDFFV-9277
|
||||
** is fixed when deleting the last "large" attribute that
|
||||
** is stored densely.
|
||||
**
|
||||
****************************************************************/
|
||||
static void
|
||||
test_attr_delete_last_dense(hid_t fcpl, hid_t fapl)
|
||||
{
|
||||
hid_t fid; /* File ID */
|
||||
hid_t gid; /* Group ID */
|
||||
hid_t aid; /* Attribute ID */
|
||||
hid_t sid; /* Dataspace ID */
|
||||
hsize_t dim2[2] = {DIM0, DIM1}; /* Dimension sizes */
|
||||
int i, j; /* Local index variables */
|
||||
double *data = NULL; /* Pointer to the data buffer */
|
||||
herr_t ret; /* Generic return status */
|
||||
|
||||
/* Output message about test being performed */
|
||||
MESSAGE(5, ("Testing Deleting the last large attribute stored densely\n"));
|
||||
|
||||
/* Create the file */
|
||||
fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl);
|
||||
CHECK(fid, FAIL, "H5Fcreate");
|
||||
|
||||
/* Create the group */
|
||||
gid = H5Gcreate2(fid, GRPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||
CHECK(gid, FAIL, "H5Gcreate");
|
||||
|
||||
/* Create the dataspace */
|
||||
sid = H5Screate_simple(RANK, dim2, NULL);
|
||||
CHECK(sid, FAIL, "H5Screate_simple");
|
||||
|
||||
/* Attach the attribute to the group */
|
||||
aid = H5Acreate2(gid, ATTRNAME, H5T_IEEE_F64LE, sid, H5P_DEFAULT, H5P_DEFAULT);
|
||||
CHECK(aid, FAIL, "H5Acreate2");
|
||||
|
||||
/* Allocate the data buffer */
|
||||
data = (double *)HDmalloc((size_t)(DIM0 * DIM1) * sizeof(double));
|
||||
CHECK_PTR(data, "HDmalloc");
|
||||
|
||||
/* Initialize the data */
|
||||
for(i = 0; i < DIM0; i++)
|
||||
for(j = 0; j < DIM1; j++)
|
||||
*(data + i * DIM1 + j) = i + j;
|
||||
|
||||
/* Write to the attribute */
|
||||
ret = H5Awrite(aid, H5T_NATIVE_DOUBLE, data);
|
||||
CHECK(ret, FAIL, "H5Awrite");
|
||||
|
||||
/* Closing */
|
||||
ret = H5Aclose(aid);
|
||||
CHECK(ret, FAIL, "H5Aclose");
|
||||
ret = H5Sclose(sid);
|
||||
CHECK(ret, FAIL, "H5Sclose");
|
||||
ret = H5Gclose(gid);
|
||||
CHECK(ret, FAIL, "H5Gclose");
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
|
||||
/* Re-open the file */
|
||||
fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl);
|
||||
CHECK(fid, FAIL, "H5Fopen");
|
||||
|
||||
/* Open the group */
|
||||
gid = H5Gopen2(fid, GRPNAME, H5P_DEFAULT);
|
||||
CHECK(gid, FAIL, "H5Gopen");
|
||||
|
||||
/* Delete the attribute */
|
||||
ret = H5Adelete(gid, ATTRNAME);
|
||||
CHECK(ret, FAIL, "H5Adelete");
|
||||
|
||||
/* Closing */
|
||||
ret = H5Gclose(gid);
|
||||
CHECK(ret, FAIL, "H5Gclose");
|
||||
ret = H5Fclose(fid);
|
||||
CHECK(ret, FAIL, "H5Fclose");
|
||||
|
||||
/* Free the data buffer */
|
||||
if(data)
|
||||
HDfree(data);
|
||||
|
||||
} /* test_attr_delete_last_dense() */
|
||||
|
||||
/****************************************************************
|
||||
**
|
||||
** test_attr(): Main H5A (attribute) testing routine.
|
||||
@ -10819,6 +10912,7 @@ test_attr(void)
|
||||
test_attr_bug7(my_fcpl, my_fapl); /* Test creating and deleting large attributes in ohdr chunk 0 */
|
||||
test_attr_bug8(my_fcpl, my_fapl); /* Test attribute expanding object header with undecoded messages */
|
||||
test_attr_bug9(my_fcpl, my_fapl); /* Test large attributes converting to dense storage */
|
||||
test_attr_delete_last_dense(my_fcpl, my_fapl); /* Test */
|
||||
} /* end for */
|
||||
} /* end if */
|
||||
else {
|
||||
|
Loading…
x
Reference in New Issue
Block a user