It's exciting to be able to show the collective filtered IO feature as part of a full software stack. Thank you for your hard work on this, and please let me know what more I can do to help keep it on glide path for release.
On Thu, Nov 9, 2017 at 3:22 PM, Jordan Henderson <jhender...@hdfgroup.org> wrote: > Thanks! I'll discuss this with others and see what the best way to proceed > forward from this is. I think this has been a very productive discussion and > very useful feedback. > ________________________________ > From: Michael K. Edwards <m.k.edwa...@gmail.com> > Sent: Thursday, November 9, 2017 5:01:33 PM > To: Jordan Henderson > Cc: HDF Users Discussion List > Subject: Re: [Hdf-forum] Collective IO and filters > > And here's the change to H5Z-blosc (still using the private H5MM APIs): > > diff --git a/src/blosc_filter.c b/src/blosc_filter.c > index bfd8c3e..9bc1a42 100644 > --- a/src/blosc_filter.c > +++ b/src/blosc_filter.c > @@ -16,6 +16,7 @@ > #include <string.h> > #include <errno.h> > #include "hdf5.h" > +#include "H5MMprivate.h" > #include "blosc_filter.h" > > #if defined(__GNUC__) > @@ -194,20 +195,21 @@ size_t blosc_filter(unsigned flags, size_t cd_nelmts, > /* We're compressing */ > if (!(flags & H5Z_FLAG_REVERSE)) { > > - /* Allocate an output buffer exactly as long as the input data; if > - the result is larger, we simply return 0. The filter is flagged > - as optional, so HDF5 marks the chunk as uncompressed and > - proceeds. > + /* Allocate an output buffer BLOSC_MAX_OVERHEAD (currently 16) bytes > + larger than the input data, to accommodate the BLOSC header. > + If compression with the requested parameters causes the data itself > + to grow (thereby causing the compressed data, with header, to exceed > + the output buffer size), fall back to memcpy mode (clevel=0). > */ > > - outbuf_size = (*buf_size); > + outbuf_size = nbytes + BLOSC_MAX_OVERHEAD; > > #ifdef BLOSC_DEBUG > fprintf(stderr, "Blosc: Compress %zd chunk w/buffer %zd\n", > nbytes, outbuf_size); > #endif > > - outbuf = malloc(outbuf_size); > + outbuf = H5MM_malloc(outbuf_size); > > if (outbuf == NULL) { > PUSH_ERR("blosc_filter", H5E_CALLBACK, > @@ -217,7 +219,11 @@ size_t blosc_filter(unsigned flags, size_t cd_nelmts, > > blosc_set_compressor(compname); > status = blosc_compress(clevel, doshuffle, typesize, nbytes, > - *buf, outbuf, nbytes); > + *buf, outbuf, outbuf_size); > + if (status < 0) { > + status = blosc_compress(0, doshuffle, typesize, nbytes, > + *buf, outbuf, outbuf_size); > + } > if (status < 0) { > PUSH_ERR("blosc_filter", H5E_CALLBACK, "Blosc compression error"); > goto failed; > @@ -228,7 +234,7 @@ size_t blosc_filter(unsigned flags, size_t cd_nelmts, > /* declare dummy variables */ > size_t cbytes, blocksize; > > - free(outbuf); > + H5MM_xfree(outbuf); > > /* Extract the exact outbuf_size from the buffer header. > * > @@ -243,7 +249,14 @@ size_t blosc_filter(unsigned flags, size_t cd_nelmts, > fprintf(stderr, "Blosc: Decompress %zd chunk w/buffer %zd\n", > nbytes, outbuf_size); > #endif > > - outbuf = malloc(outbuf_size); > + if (outbuf_size == 0) { > + H5MM_xfree(*buf); > + *buf = NULL; > + *buf_size = outbuf_size; > + return 0; /* Size of compressed/decompressed data */ > + } > + > + outbuf = H5MM_malloc(outbuf_size); > > if (outbuf == NULL) { > PUSH_ERR("blosc_filter", H5E_CALLBACK, "Can't allocate > decompression buffer"); > @@ -259,14 +272,14 @@ size_t blosc_filter(unsigned flags, size_t cd_nelmts, > } /* compressing vs decompressing */ > > if (status != 0) { > - free(*buf); > + H5MM_xfree(*buf); > *buf = outbuf; > *buf_size = outbuf_size; > return status; /* Size of compressed/decompressed data */ > } > > failed: > - free(outbuf); > + H5MM_xfree(outbuf); > return 0; > > } /* End filter function */ > > On Thu, Nov 9, 2017 at 2:45 PM, Jordan Henderson > <jhender...@hdfgroup.org> wrote: >> As the filtered collective path simply calls through the filter pipeline >> by >> way of the H5Z_pipeline() function, it would seem that either the filter >> pipeline itself is not handling this case correctly, or this is somewhat >> unexpected behavior for the pipeline to deal with. >> >> >> Either way, I think a pull request/diff file would be very useful for >> going >> over this. If you're able to generate a diff between what you have now and >> the current develop branch/H5Z-blosc code and put it here that would be >> useful. I don't think that there should be too much in the way of >> logistics >> for getting this code in, we just want to make sure that we approach the >> solution in the right way without breaking something else. _______________________________________________ Hdf-forum is for HDF software users discussion. Hdf-forum@lists.hdfgroup.org http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org Twitter: https://twitter.com/hdf5