Hi Darren, On Dec 14, 2011, at 9:46 AM, Darren Dale wrote:
> On Wed, Dec 14, 2011 at 8:03 AM, Quincey Koziol <[email protected]> wrote: >> Hi Darren, >> >> On Dec 12, 2011, at 11:29 AM, Darren Dale wrote: >> >>> (Apologies if this gets posted twice) >>> >>> Someone reported a bug at the h5py issue tracker: >>> >>> --- >>> import h5py >>> >>> # test setup >>> fid = h5py.File('test.hdf5', 'w') >>> >>> g = fid.create_group('old_loc') >>> g2 = g.create_group('group') >>> d = g.create_dataset('dataset', data=0) >>> >>> print "before move:" >>> print g2.name >>> print d.name >>> >>> # now rename toplevel group >>> g.parent.id.move('old_loc', 'new_loc') >>> >>> print "after move:" >>> # old parent remains in dataset name, group is ok >>> print g2.name >>> print d.name >>> >>> # parent is accessed by name 'g' which does not exist any more >>> d.parent >>> >>> fid.close() >>> --- >>> >>> That script produces the following output: >>> >>> --- >>> before move: >>> /old_loc/group >>> /old_loc/dataset >>> after move: >>> /new_loc/group >>> /old_loc/dataset >>> Traceback (most recent call last): >>> File "move_error.py", line 24, in <module> >>> d.parent >>> File >>> "/Users/darren/Library/Python/2.7/lib/python/site-packages/h5py/_hl/base.py", >>> line 144, in parent >>> return self.file[posixpath.dirname(self.name)] >>> File >>> "/Users/darren/Library/Python/2.7/lib/python/site-packages/h5py/_hl/group.py", >>> line 128, in __getitem__ >>> oid = h5o.open(self.id, self._e(name), lapl=self._lapl) >>> File "h5o.pyx", line 176, in h5py.h5o.open (h5py/h5o.c:2814) >>> KeyError: "unable to open object (Symbol table: Can't open object)" >>> --- >>> >>> g.name and d.name simply return the result of h5i.get_name. >>> >>> d.parent just splits d.name at the last "/" and returns the the first >>> part of the split. >>> >>> g.parent.id.move calls H5Gmove2. I've read the warnings about >>> corrupting data using H5Gmove at >>> http://www.hdfgroup.org/HDF5/doc1.6/Groups.html#H5GUnlinkToCorrupt , >>> but the situation described there does not appear to be relevant to >>> the problem we are seeing. Is h5py not performing the move properly, >>> or could this be a bug in HDF5? >> >> I think that the move is probably working correctly, but maybe h5py's >> name tracking isn't. I would say that g2's name after the move should be >> "/new_loc/group", not "/old_loc/group". > > I think there is a misunderstanding. g2's name after the move *is* > "/new_loc/group". I probably should have been more explicit: the > example illustrates that the problem is isolated to Datasets, Groups > are not effected. Whoops, sorry, yes, you are right. > H5py does not do any explicit name tracking. It delegates that task > completely to hdf5: for both Datasets and Groups, h5py simply calls > H5Iget_name. It seems to me that open dataset ids are not getting > their information updated, but open group ids are. Now that I think > about it, aren't there other issues with copying open datasets in > <hdf5-1.8.9? Perhaps the issues extend to moving open datasets as > well. That's pretty weird (that it would only affect datasets), since the H5Iget_name code doesn't depend on the object type. Can you replicate this with a short C program? Quincey _______________________________________________ Hdf-forum is for HDF software users discussion. [email protected] http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org
