summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2003-06-10 18:44:22 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2003-06-10 18:44:22 (GMT)
commit82384d5785fe1ca997ccd78ac1799e5badf4c27a (patch)
tree8bcf97508e40a8bc2ea64424d4a915afb1a69efc /src
parent33bf3c980dff3c1379effadaf709686bed65e370 (diff)
downloadhdf5-82384d5785fe1ca997ccd78ac1799e5badf4c27a.zip
hdf5-82384d5785fe1ca997ccd78ac1799e5badf4c27a.tar.gz
hdf5-82384d5785fe1ca997ccd78ac1799e5badf4c27a.tar.bz2
[svn-r7016] Purpose:
Bug fix Description: Chunked datasets with early space allocation and unlimited dimensions were running into problems where the dataset's "layout" message was marked as constant too early, preventing the dataset's dimensions from being extended. Solution: Change logic for marking the layout message constant to wait a bit longer. Platforms tested: FreeBSD 4.8 (sleipnir) w/parallel h5committest
Diffstat (limited to 'src')
-rw-r--r--src/H5D.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/H5D.c b/src/H5D.c
index c9f9fce..6ded25d 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -1496,9 +1496,9 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
}
/* Update layout message */
- /* (Don't make layout message constant yet, since space may not be allocated) */
+ /* (Don't make layout message constant unless allocation time is early, since space may not be allocated) */
/* Note: this is relying on H5D_alloc_storage not calling H5O_modify during dataset creation */
- if (H5D_COMPACT != layout->type && H5O_append(file, dxpl_id, oh, H5O_LAYOUT_ID, 0, layout) < 0)
+ if (H5D_COMPACT != layout->type && H5O_append(file, dxpl_id, oh, H5O_LAYOUT_ID, (alloc_time == H5D_ALLOC_TIME_EARLY ? H5O_FLAG_CONSTANT : 0), layout) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout");
#ifdef H5O_ENABLE_BOGUS
@@ -2410,7 +2410,8 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
hbool_t update_time, hbool_t full_overwrite)
{
struct H5O_layout_t *layout; /* The dataset's layout information */
- unsigned space_allocated=0; /* Flag to indicate that space was allocated */
+ unsigned init_space=0; /* Flag to indicate that space should be initialized */
+ unsigned addr_set=0; /* Flag to indicate that the dataset's storage address was set */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOINIT(H5D_alloc_storage);
@@ -2434,8 +2435,11 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
if (H5F_contig_create (f, dxpl_id, layout/*out*/)<0)
HGOTO_ERROR (H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage");
- /* Indicate that we allocated space */
- space_allocated=1;
+ /* Indicate that we set the storage addr */
+ addr_set=1;
+
+ /* Indicate that we should initialize storage space */
+ init_space=1;
} /* end if */
break;
@@ -2445,13 +2449,19 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
if (H5F_istore_create (f, dxpl_id, layout/*out*/)<0)
HGOTO_ERROR (H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize chunked storage");
- /* Indicate that we allocated space */
- space_allocated=1;
+ /* Indicate that we set the storage addr */
+ addr_set=1;
+
+ /* Indicate that we should initialize storage space */
+ init_space=1;
} /* end if */
- /* If MPIO, MPIPOSIX, or FPHDF5 is used, indicate that space was allocated, so the B-tree gets expanded */
- if(IS_H5FD_MPIO(f) || IS_H5FD_MPIPOSIX(f) || IS_H5FD_FPHDF5(f))
- space_allocated=1;
+ /* If space allocation is set to 'early' and we are extending
+ * the dataset, indicate that space was allocated, so the
+ * B-tree gets expanded. -QAK
+ */
+ if(dset->alloc_time==H5D_ALLOC_TIME_EARLY && time_alloc==H5D_ALLOC_EXTEND)
+ init_space=1;
break;
@@ -2464,8 +2474,11 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory for compact dataset");
layout->dirty = TRUE;
- /* Indicate that we allocated space */
- space_allocated=1;
+ /* Indicate that we set the storage addr */
+ addr_set=1;
+
+ /* Indicate that we should initialize storage space */
+ init_space=1;
} /* end if */
break;
@@ -2475,7 +2488,7 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
} /* end switch */
/* Check if we actually allocated space before performing other actions */
- if(space_allocated) {
+ if(init_space || addr_set) {
/* If we are filling the dataset on allocation, do that now */
if(dset->fill_time==H5D_FILL_TIME_ALLOC
&& !(dset->alloc_time==H5D_ALLOC_TIME_INCR && time_alloc==H5D_ALLOC_WRITE)) {
@@ -2483,10 +2496,10 @@ H5D_alloc_storage (H5F_t *f, hid_t dxpl_id, H5D_t *dset/*in,out*/, H5D_time_allo
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value");
} /* end if */
- /* Also update header message for layout with new address
- * (this is only for forward compatibility).
- */
- if(time_alloc!=H5D_ALLOC_CREATE)
+ /* Also update header message for layout with new address, if we
+ * set the address. (this is mainly for forward compatibility).
+ */
+ if(time_alloc!=H5D_ALLOC_CREATE && addr_set)
if (H5O_modify (&(dset->ent), H5O_LAYOUT_ID, 0, H5O_FLAG_CONSTANT, update_time, &(dset->layout), dxpl_id) < 0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout message");
} /* end if */