summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPedro Vicente Nunes <pvn@hdfgroup.org>2009-06-17 18:42:23 (GMT)
committerPedro Vicente Nunes <pvn@hdfgroup.org>2009-06-17 18:42:23 (GMT)
commit86fa22c385bb655afaed25e31dd8676b9f94024b (patch)
tree5c532ed79b4dcec84878c91ecdad79a746b8670e
parent93a6cd92d7f2f6fd20bb22636a5c9245af01c7ef (diff)
downloadhdf5-86fa22c385bb655afaed25e31dd8676b9f94024b.zip
hdf5-86fa22c385bb655afaed25e31dd8676b9f94024b.tar.gz
hdf5-86fa22c385bb655afaed25e31dd8676b9f94024b.tar.bz2
[svn-r17077] merge 17076 from trunk
bug fix: h5repack was not applying a requested contiguous layout for a dataset with filters added a test to the C program test (not to the script), that verifies the layout and filters tested: linux
-rw-r--r--tools/h5repack/h5repack_filters.c106
-rw-r--r--tools/h5repack/h5repack_verify.c32
-rw-r--r--tools/h5repack/h5repacktst.c17
3 files changed, 88 insertions, 67 deletions
diff --git a/tools/h5repack/h5repack_filters.c b/tools/h5repack/h5repack_filters.c
index ee9621d..6b08a2f 100644
--- a/tools/h5repack/h5repack_filters.c
+++ b/tools/h5repack/h5repack_filters.c
@@ -42,10 +42,10 @@ int aux_find_obj(const char* name, /* object name from traverse list */
*obj = options->op_tbl->objs[i];
return i;
}
-
+
pdest = strstr(name,options->op_tbl->objs[i].path);
result = (int)(pdest - name);
-
+
/* found at position 1, meaning without '/' */
if( pdest != NULL && result==1 )
{
@@ -73,19 +73,19 @@ int aux_assign_obj(const char* name, /* object name from traverse lis
pack_opt_t *options, /* repack options */
pack_info_t *obj /*OUT*/) /* info about object to filter */
{
-
+
int idx, i;
pack_info_t tmp;
-
+
init_packobject(&tmp);
-
+
idx = aux_find_obj(name,options,&tmp);
-
+
/* name was on input */
if (idx>=0)
{
-
-
+
+
/* applying to all objects */
if (options->all_layout)
{
@@ -125,9 +125,9 @@ int aux_assign_obj(const char* name, /* object name from traverse lis
default:
break;
}/*switch*/
-
+
}
-
+
/* applying to all objects */
if (options->all_filter)
{
@@ -143,16 +143,16 @@ int aux_assign_obj(const char* name, /* object name from traverse lis
tmp.filter[i] = options->op_tbl->objs[idx].filter[i];
}
}
-
-
+
+
} /* if idx */
-
-
+
+
/* no input name */
-
+
else
{
-
+
if (options->all_filter)
{
int k;
@@ -183,11 +183,11 @@ int aux_assign_obj(const char* name, /* object name from traverse lis
}/*switch*/
}
}
-
+
*obj = tmp;
return 1;
-
-}
+
+}
/*-------------------------------------------------------------------------
@@ -223,40 +223,40 @@ int apply_filters(const char* name, /* object name from traverse list */
pack_info_t obj;
*has_filter = 0;
-
+
if (rank==0) /* scalar dataset, do not apply */
return 0;
-
+
/*-------------------------------------------------------------------------
* initialize the assigment object
*-------------------------------------------------------------------------
*/
init_packobject(&obj);
-
+
/*-------------------------------------------------------------------------
* find options
*-------------------------------------------------------------------------
*/
if (aux_assign_obj(name,options,&obj)==0)
return 0;
-
+
/* get information about input filters */
if ((nfilters = H5Pget_nfilters(dcpl_id))<0)
return -1;
-
+
/*-------------------------------------------------------------------------
* check if we have filters in the pipeline
* we want to replace them with the input filters
* only remove if we are inserting new ones
*-------------------------------------------------------------------------
*/
- if (nfilters && obj.nfilters )
+ if (nfilters && obj.nfilters )
{
*has_filter = 1;
if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
return -1;
}
-
+
/*-------------------------------------------------------------------------
* check if there is an existent chunk
* read it only if there is not a requested layout
@@ -266,7 +266,7 @@ int apply_filters(const char* name, /* object name from traverse list */
{
if ((layout = H5Pget_layout(dcpl_id))<0)
return -1;
-
+
if (layout == H5D_CHUNKED)
{
if ((rank = H5Pget_chunk(dcpl_id,NELMTS(chsize),chsize/*out*/))<0)
@@ -277,7 +277,7 @@ int apply_filters(const char* name, /* object name from traverse list */
obj.chunk.chunk_lengths[i] = chsize[i];
}
}
-
+
/*-------------------------------------------------------------------------
* the type of filter and additional parameter
* type can be one of the filters
@@ -290,10 +290,10 @@ int apply_filters(const char* name, /* object name from traverse list */
* H5Z_FILTER_SCALEOFFSET 6 , scaleoffset compression
*-------------------------------------------------------------------------
*/
-
+
if (obj.nfilters)
{
-
+
/*-------------------------------------------------------------------------
* filters require CHUNK layout; if we do not have one define a default
*-------------------------------------------------------------------------
@@ -332,14 +332,14 @@ int apply_filters(const char* name, /* object name from traverse list */
}
}
-
+
for ( i=0; i<obj.nfilters; i++)
{
switch (obj.filter[i].filtn)
{
default:
break;
-
+
/*-------------------------------------------------------------------------
* H5Z_FILTER_DEFLATE 1 , deflation like gzip
*-------------------------------------------------------------------------
@@ -347,7 +347,7 @@ int apply_filters(const char* name, /* object name from traverse list */
case H5Z_FILTER_DEFLATE:
{
unsigned aggression; /* the deflate level */
-
+
aggression = obj.filter[i].cd_values[0];
/* set up for deflated data */
if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
@@ -356,7 +356,7 @@ int apply_filters(const char* name, /* object name from traverse list */
return -1;
}
break;
-
+
/*-------------------------------------------------------------------------
* H5Z_FILTER_SZIP 4 , szip compression
*-------------------------------------------------------------------------
@@ -365,19 +365,19 @@ int apply_filters(const char* name, /* object name from traverse list */
{
unsigned options_mask;
unsigned pixels_per_block;
-
+
options_mask = obj.filter[i].cd_values[0];
pixels_per_block = obj.filter[i].cd_values[1];
-
+
/* set up for szip data */
if(H5Pset_chunk(dcpl_id,obj.chunk.rank,obj.chunk.chunk_lengths)<0)
return -1;
if (H5Pset_szip(dcpl_id,options_mask,pixels_per_block)<0)
return -1;
-
+
}
break;
-
+
/*-------------------------------------------------------------------------
* H5Z_FILTER_SHUFFLE 2 , shuffle the data
*-------------------------------------------------------------------------
@@ -388,7 +388,7 @@ int apply_filters(const char* name, /* object name from traverse list */
if (H5Pset_shuffle(dcpl_id)<0)
return -1;
break;
-
+
/*-------------------------------------------------------------------------
* H5Z_FILTER_FLETCHER32 3 , fletcher32 checksum of EDC
*-------------------------------------------------------------------------
@@ -413,15 +413,15 @@ int apply_filters(const char* name, /* object name from traverse list */
* H5Z_FILTER_SCALEOFFSET , scale+offset compression
*-------------------------------------------------------------------------
*/
-
+
case H5Z_FILTER_SCALEOFFSET:
{
H5Z_SO_scale_type_t scale_type;
int scale_factor;
-
+
scale_type = obj.filter[i].cd_values[0];
scale_factor = obj.filter[i].cd_values[1];
-
+
if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
return -1;
if (H5Pset_scaleoffset(dcpl_id,scale_type,scale_factor)<0)
@@ -430,30 +430,38 @@ int apply_filters(const char* name, /* object name from traverse list */
break;
} /* switch */
}/*i*/
-
+
}
/*obj.nfilters*/
-
+
/*-------------------------------------------------------------------------
* layout
*-------------------------------------------------------------------------
*/
-
+
if (obj.layout>=0)
{
/* a layout was defined */
if (H5Pset_layout(dcpl_id, obj.layout)<0)
return -1;
-
- if (H5D_CHUNKED==obj.layout) { /* set up chunk */
+
+ if (H5D_CHUNKED == obj.layout)
+ {
if(H5Pset_chunk(dcpl_id, obj.chunk.rank, obj.chunk.chunk_lengths)<0)
return -1;
}
- else if (H5D_COMPACT==obj.layout) {
+ else if (H5D_COMPACT == obj.layout)
+ {
if (H5Pset_alloc_time(dcpl_id, H5D_ALLOC_TIME_EARLY)<0)
return -1;
}
-
+ /* remove filters for the H5D_CONTIGUOUS case */
+ else if (H5D_CONTIGUOUS == obj.layout)
+ {
+ if (H5Premove_filter(dcpl_id,H5Z_FILTER_ALL)<0)
+ return -1;
+ }
+
}
return 0;
diff --git a/tools/h5repack/h5repack_verify.c b/tools/h5repack/h5repack_verify.c
index 92d758e..69df02c 100644
--- a/tools/h5repack/h5repack_verify.c
+++ b/tools/h5repack/h5repack_verify.c
@@ -18,8 +18,8 @@
#include "h5tools_utils.h"
extern char *progname;
-static int has_layout(hid_t pid, pack_info_t *obj);
-static int has_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter);
+static int verify_layout(hid_t pid, pack_info_t *obj);
+static int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter);
/*-------------------------------------------------------------------------
@@ -82,7 +82,7 @@ int h5repack_verify(const char *fname,
* filter check
*-------------------------------------------------------------------------
*/
- if(has_filters(pid, tid, obj->nfilters, obj->filter) <= 0)
+ if(verify_filters(pid, tid, obj->nfilters, obj->filter) <= 0)
ok = 0;
@@ -90,7 +90,7 @@ int h5repack_verify(const char *fname,
* layout check
*-------------------------------------------------------------------------
*/
- if((obj->layout != -1) && (has_layout(pid, obj) == 0))
+ if((obj->layout != -1) && (verify_layout(pid, obj) == 0))
ok = 0;
/*-------------------------------------------------------------------------
@@ -151,7 +151,7 @@ int h5repack_verify(const char *fname,
if(options->all_filter == 1)
{
- if(has_filters(pid, tid, options->n_filter_g, options->filter_g) <= 0)
+ if(verify_filters(pid, tid, options->n_filter_g, options->filter_g) <= 0)
ok = 0;
}
@@ -165,7 +165,7 @@ int h5repack_verify(const char *fname,
init_packobject(&pack);
pack.layout = options->layout_g;
pack.chunk = options->chunk_g;
- if(has_layout(pid, &pack) == 0)
+ if(verify_layout(pid, &pack) == 0)
ok = 0;
}
@@ -215,13 +215,13 @@ error:
/*-------------------------------------------------------------------------
- * Function: has_layout
+ * Function: verify_layout
*
* Purpose: verify which layout is present in the property list DCPL_ID
*
* H5D_COMPACT = 0
* H5D_CONTIGUOUS = 1
- * H5D_CHUNKED = 2
+ * H5D_CHUNKED = 2
*
* Return: 1 has, 0 does not, -1 error
*
@@ -232,8 +232,8 @@ error:
*-------------------------------------------------------------------------
*/
-int has_layout(hid_t pid,
- pack_info_t *obj)
+int verify_layout(hid_t pid,
+ pack_info_t *obj)
{
hsize_t chsize[64]; /* chunk size in elements */
H5D_layout_t layout; /* layout */
@@ -241,17 +241,13 @@ int has_layout(hid_t pid,
int rank; /* rank */
int i; /* index */
- /* if no information about the input layout is requested return exit */
- if (obj==NULL)
- return 1;
-
/* check if we have filters in the input object */
if ((nfilters = H5Pget_nfilters(pid)) < 0)
return -1;
- /* a non chunked layout was requested on a filtered object; avoid the test */
+ /* a non chunked layout was requested on a filtered object */
if (nfilters && obj->layout!=H5D_CHUNKED)
- return 1;
+ return 0;
/* get layout */
if ((layout = H5Pget_layout(pid)) < 0)
@@ -458,7 +454,7 @@ error:
/*-------------------------------------------------------------------------
- * Function: has_filters
+ * Function: verify_filters
*
* Purpose: verify if all requested filters in the array FILTER obtained
* from user input are present in the property list PID obtained from
@@ -477,7 +473,7 @@ error:
*/
static
-int has_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter)
+int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *filter)
{
int nfilters_dcpl; /* number of filters in DCPL*/
unsigned filt_flags; /* filter flags */
diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c
index af4d671..b36afde 100644
--- a/tools/h5repack/h5repacktst.c
+++ b/tools/h5repack/h5repacktst.c
@@ -659,6 +659,23 @@ int main (void)
if (h5repack_end (&pack_options) < 0)
GOERROR;
+ /*-------------------------------------------------------------------------
+ * do the same test for a file with filters (chunked)
+ *-------------------------------------------------------------------------
+ */
+ if (h5repack_init (&pack_options, 0) < 0)
+ GOERROR;
+ if (h5repack_addlayout("CONTI",&pack_options) < 0)
+ GOERROR;
+ if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
+ GOERROR;
+ if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
+ GOERROR;
+ if (h5repack_verify(FNAME8OUT,&pack_options)<=0)
+ GOERROR;
+ if (h5repack_end (&pack_options) < 0)
+ GOERROR;
+
PASSED();
TESTING(" adding layout compact");