summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2020-08-17 14:16:23 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2020-08-17 14:16:23 (GMT)
commit22b8f56d5efc9706b85903dc99a1f1a5b7f7ab25 (patch)
tree1c29f73d19fc960272f185ab9c5c3475a00d3331 /src
parent75ab7c667c77ec2cdb797ab8e2ff0968ca917fe0 (diff)
downloadhdf5-22b8f56d5efc9706b85903dc99a1f1a5b7f7ab25.zip
hdf5-22b8f56d5efc9706b85903dc99a1f1a5b7f7ab25.tar.gz
hdf5-22b8f56d5efc9706b85903dc99a1f1a5b7f7ab25.tar.bz2
Adds fix for H5Fstart_swmr_write lock issue
Needs a final review pass.
Diffstat (limited to 'src')
-rw-r--r--src/H5Fint.c19
-rw-r--r--src/H5Fpkg.h1
2 files changed, 16 insertions, 4 deletions
diff --git a/src/H5Fint.c b/src/H5Fint.c
index 29bbd45..38bff57 100644
--- a/src/H5Fint.c
+++ b/src/H5Fint.c
@@ -1730,6 +1730,9 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
set_flag = TRUE;
} /* end else */
+ /* Set the file locking flag */
+ file->use_file_locking = use_file_locking;
+
/* Check to see if both SWMR and cache image are requested. Fail if so */
if(H5C_cache_image_status(file, &ci_load, &ci_write) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get MDC cache image status")
@@ -3420,6 +3423,7 @@ H5F__start_swmr_write(H5F_t *f)
H5G_name_t *obj_paths = NULL; /* Group hierarchy path */
size_t u; /* Local index variable */
hbool_t setup = FALSE; /* Boolean flag to indicate whether SWMR setting is enabled */
+ hbool_t use_file_locking = TRUE;/* Using file locks? */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_PACKAGE
@@ -3531,6 +3535,12 @@ H5F__start_swmr_write(H5F_t *f)
setup = TRUE;
+ /* Place an advisory lock on the file */
+ if(f->use_file_locking)
+ if(H5FD_lock(f->shared->lf, TRUE) < 0) {
+ HGOTO_ERROR(H5E_FILE, H5E_CANTLOCKFILE, FAIL, "unable to lock the file")
+ }
+
/* Mark superblock as dirty */
if(H5F_super_dirty(f) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
@@ -3548,10 +3558,6 @@ H5F__start_swmr_write(H5F_t *f)
if(H5O_refresh_metadata_reopen(obj_ids[u], &obj_glocs[u], TRUE) < 0)
HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't refresh-close object")
- /* Unlock the file */
- if(H5FD_unlock(f->shared->lf) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to unlock the file")
-
done:
if(ret_value < 0 && setup) {
@@ -3580,6 +3586,11 @@ done:
HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
} /* end if */
+ /* Unlock the file */
+ if(f->use_file_locking)
+ if(H5FD_unlock(f->shared->lf) < 0)
+ HDONE_ERROR(H5E_FILE, H5E_CANTUNLOCKFILE, FAIL, "unable to unlock the file")
+
/* Free memory */
if(obj_ids)
H5MM_xfree(obj_ids);
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 14c00e1..7122d36 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -373,6 +373,7 @@ struct H5F_t {
hbool_t closing; /* File is in the process of being closed */
struct H5F_t *parent; /* Parent file that this file is mounted to */
unsigned nmounts; /* Number of children mounted to this file */
+ hbool_t use_file_locking; /* Whether or not to use file locking */
#ifdef H5_HAVE_PARALLEL
H5P_coll_md_read_flag_t coll_md_read; /* Do all metadata reads collectively */
hbool_t coll_md_write; /* Do all metadata writes collectively */