Hi,
I’ve encountered some strange behaviour when using H5S_SELECT_OR
to merge two hyperslab selections.
If I have two regular hyperslabs (A & B) the order in which I provide them to H5Sselect_hyperslab()
(A OR
B vs B OR
A) seens to determine whether I get either the expected behaviour or an error. I only see this behaviour with HDF5 1.10.7 and not with 1.10.6.
The code in the link below demonstrates the issue.
In summary the code tries to:
- First create a file and write a 10x10 dataset and confirm that my two sets of hyperslab parameters do what’s expected when used independently.
- Then reset the file dataspace to hyperslab 1 selection and use a further call to
H5Sselect_hyperslab(op = H5S_SELECT_OR)
to combine the selections.H5Dread()
works fine with this. - Finally, reset to hyperslab 2 selection and this time use
H5Sselect_hyperslab()
to combine with the hyperslab 1 parameters.H5Dread()
works in 1.10.6, and errors with 1.10.7
Here’s the output using 1.10.6:
HDF5 Version: 1.10.6
Data Written to File:
1 11 21 31 41 51 61 71 81 91
2 12 22 32 42 52 62 72 82 92
3 13 23 33 43 53 63 73 83 93
4 14 24 34 44 54 64 74 84 94
5 15 25 35 45 55 65 75 85 95
6 16 26 36 46 56 66 76 86 96
7 17 27 37 47 57 67 77 87 97
8 18 28 38 48 58 68 78 88 98
9 19 29 39 49 59 69 79 89 99
10 20 30 40 50 60 70 80 90 100
Hyperslab 1:
22 32
25 35
Hyperslab 2:
23 33
26 36
Hyperslab 1 OR Hyperslab 2:
22 32 23 33
25 35 26 36
Hyperslab 2 OR Hyperslab 1:
22 32 23 33
25 35 26 36
However if I run the same code compiled against HDF5 1.10.7, I get the following output when it gets to reading the combined hyperslabs. The first seems to work fine, the second errors:
HDF5 Version: 1.10.7
...
Hyperslab 1 OR Hyperslab 2:
22 32 23 33
25 35 26 36
HDF5-DIAG: Error detected in HDF5 (1.10.7) thread 0:
#000: H5Dio.c line 198 in H5Dread(): can't read data
major: Dataset
minor: Read failed
#001: H5Dio.c line 599 in H5D__read(): can't read data
major: Dataset
minor: Read failed
#002: H5Dcontig.c line 622 in H5D__contig_read(): contiguous read failed
major: Dataset
minor: Read failed
#003: H5Dscatgath.c line 520 in H5D__scatgath_read(): file gather failed
major: Low-level I/O
minor: Read failed
#004: H5Dscatgath.c line 250 in H5D__gather_file(): read error
major: Dataspace
minor: Read failed
#005: H5Dcontig.c line 957 in H5D__contig_readvv(): can't perform vectorized sieve buffer read
major: Dataset
minor: Can't operate on object
#006: H5VM.c line 1422 in H5VM_opvv(): can't perform operation
major: Internal error (too specific to document in detail)
minor: Can't operate on object
#007: H5Dcontig.c line 861 in H5D__contig_readvv_sieve_cb(): block read failed
major: Dataset
minor: Read failed
#008: H5Fio.c line 116 in H5F_block_read(): read through page buffer failed
major: Low-level I/O
minor: Read failed
#009: H5PB.c line 736 in H5PB_read(): read through metadata accumulator failed
major: Page Buffering
minor: Read failed
#010: H5Faccum.c line 260 in H5F__accum_read(): driver read request failed
major: Low-level I/O
minor: Read failed
#011: H5FDint.c line 193 in H5FD_read(): addr overflow, addr = 2496, size = 400, eoa = 2448
major: Invalid arguments to routine
minor: Address overflowed
Many thanks for any feedback on what I might be doing wrong if this isn’t a bug.