diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2003-02-10 17:26:09 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2003-02-10 17:26:09 (GMT) |
commit | 24d8506dd564c5cc0fdebb5ebdfaec7bda5a7435 (patch) | |
tree | 6b2eb3bb1e782c40718204882428e6471b6281ac /src/H5FDmulti.c | |
parent | 738661ab9f409b8d961ba1402d6c4dd5f99ecb43 (diff) | |
download | hdf5-24d8506dd564c5cc0fdebb5ebdfaec7bda5a7435.zip hdf5-24d8506dd564c5cc0fdebb5ebdfaec7bda5a7435.tar.gz hdf5-24d8506dd564c5cc0fdebb5ebdfaec7bda5a7435.tar.bz2 |
[svn-r6387] Purpose:
Bug Fix
Description:
Metadata cache in parallel I/O can cause hangs in applications which
perform independent I/O on chunked datasets, because the metadata cache
can attempt to flush out dirty metadata from only a single process, instead
of collectively from all processes.
Solution:
Pass a dataset transfer property list down from every API function which
could possibly trigger metadata I/O.
Then, split the metadata cache into two sets of entries to allow dirty
metadata to be set aside when a hash table collision occurs during
independent I/O.
Platforms tested:
Tested h5committest {arabica (fortran), eirene (fortran, C++)
modi4 (parallel, fortran)}
FreeBSD 4.7 (sleipnir) serial & parallel
Misc. update:
Updated release_docs/RELEASE
Diffstat (limited to 'src/H5FDmulti.c')
-rw-r--r-- | src/H5FDmulti.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/H5FDmulti.c b/src/H5FDmulti.c index 45ee689..c16c43a 100644 --- a/src/H5FDmulti.c +++ b/src/H5FDmulti.c @@ -123,14 +123,14 @@ static haddr_t H5FD_multi_get_eoa(H5FD_t *_file); static herr_t H5FD_multi_set_eoa(H5FD_t *_file, haddr_t eoa); static haddr_t H5FD_multi_get_eof(H5FD_t *_file); static herr_t H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle); -static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size); -static herr_t H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, haddr_t addr, +static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size); +static herr_t H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size); static herr_t H5FD_multi_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size, void *_buf/*out*/); static herr_t H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size, const void *_buf); -static herr_t H5FD_multi_flush(H5FD_t *_file, unsigned closing); +static herr_t H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing); /* The class struct */ static const H5FD_class_t H5FD_multi_g = { @@ -1267,10 +1267,6 @@ H5FD_multi_close(H5FD_t *_file) /* Clear the error stack */ H5Eclear(); - /* Flush our own data */ - if (H5FD_multi_flush(_file,TRUE)<0) - nerrors++; - /* Close as many members as possible */ ALL_MEMBERS(mt) { if (file->memb[mt]) { @@ -1579,7 +1575,7 @@ H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle) *------------------------------------------------------------------------- */ static haddr_t -H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size) +H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) { H5FD_multi_t *file = (H5FD_multi_t*)_file; H5FD_mem_t mmt; @@ -1589,7 +1585,7 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size) mmt = file->fa.memb_map[type]; if (H5FD_MEM_DEFAULT==mmt) mmt = type; - if (HADDR_UNDEF==(addr=H5FDalloc(file->memb[mmt], type, size))) { + if (HADDR_UNDEF==(addr=H5FDalloc(file->memb[mmt], type, dxpl_id, size))) { H5Epush_ret(func, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", HADDR_UNDEF); } addr += file->fa.memb_addr[mmt]; @@ -1615,7 +1611,7 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hsize_t size) *------------------------------------------------------------------------- */ static herr_t -H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, haddr_t addr, hsize_t size) +H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, hsize_t size) { H5FD_multi_t *file = (H5FD_multi_t*)_file; H5FD_mem_t mmt; @@ -1628,7 +1624,7 @@ H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, haddr_t addr, hsize_t size) assert(addr>=file->fa.memb_addr[mmt]); assert(addr+size<=file->memb_next[mmt]); - return H5FDfree(file->memb[mmt], type, addr-file->fa.memb_addr[mmt], size); + return H5FDfree(file->memb[mmt], type, dxpl_id, addr-file->fa.memb_addr[mmt], size); } @@ -1760,7 +1756,7 @@ H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, si *------------------------------------------------------------------------- */ static herr_t -H5FD_multi_flush(H5FD_t *_file, unsigned closing) +H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing) { H5FD_multi_t *file = (H5FD_multi_t*)_file; H5FD_mem_t mt; @@ -1806,7 +1802,7 @@ H5FD_multi_flush(H5FD_t *_file, unsigned closing) for (mt=H5FD_MEM_SUPER; mt<H5FD_MEM_NTYPES; mt=(H5FD_mem_t)(mt+1)) { if (file->memb[mt]) { H5E_BEGIN_TRY { - if (H5FDflush(file->memb[mt],closing)<0) nerrors++; + if (H5FDflush(file->memb[mt],dxpl_id,closing)<0) nerrors++; } H5E_END_TRY; } } |