diff options
author | jhendersonHDF <jhenderson@hdfgroup.org> | 2022-02-08 04:04:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-08 04:04:41 (GMT) |
commit | 01092658a3095c31d7dc1ed1beebbd965095c244 (patch) | |
tree | 34f67ee1370a3b0d5a8a22e606c42cb729b4a5f8 /src/H5AC.c | |
parent | c9347450c11edc8d73542a6244333d04f3462045 (diff) | |
download | hdf5-01092658a3095c31d7dc1ed1beebbd965095c244.zip hdf5-01092658a3095c31d7dc1ed1beebbd965095c244.tar.gz hdf5-01092658a3095c31d7dc1ed1beebbd965095c244.tar.bz2 |
Fix metadata cache bug when resizing a pinned/protected entry (#1358)
When resizing a pinned/protected cache entry, the metadata
cache code previously would wait until after resizing the
entry to attempt to log the newly-dirtied entry. This would
cause H5C_resize_entry to mark the entry as dirty and make
H5AC_resize_entry think that it doesn't need to add the
newly-dirtied entry to the dirty entries skiplist.
Thus, a subsequent H5AC__log_moved_entry would think it
needs to allocate a new entry for insertion into the dirty
entry skip list, since the entry doesn't exist on that list.
This causes an assertion failure, as the code to allocate a
new entry assumes that the entry is not dirty.
Diffstat (limited to 'src/H5AC.c')
-rw-r--r-- | src/H5AC.c | 8 |
1 files changed, 4 insertions, 4 deletions
@@ -1440,10 +1440,6 @@ H5AC_resize_entry(void *thing, size_t new_size) cache_ptr = entry_ptr->cache_ptr; HDassert(cache_ptr); - /* Resize the entry */ - if (H5C_resize_entry(thing, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry") - #ifdef H5_HAVE_PARALLEL { H5AC_aux_t *aux_ptr; @@ -1455,6 +1451,10 @@ H5AC_resize_entry(void *thing, size_t new_size) } #endif /* H5_HAVE_PARALLEL */ + /* Resize the entry */ + if (H5C_resize_entry(thing, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry") + done: /* If currently logging, generate a message */ if (cache_ptr != NULL && cache_ptr->log_info != NULL) |