From 2e3cf6fb12628ba021e5d1e59dfe09606c975208 Mon Sep 17 00:00:00 2001 From: Edgar Gabriel Date: Mon, 27 Aug 2018 15:57:52 -0500 Subject: [PATCH] io/base: fixes to file_delete selection logic file_delete triggers underneath the hood the full component selection logic, since we do not have a file handle, just a file name. As part of the selection logic, we have to however initiate the framework-open of the fs component in case of ompio, since ompio will call the delete function of the selected fs componentn, which is based on the file system where the file is located. This was not handled correctly so far. The problem however only shows up if the first I/O operatin to be executed is a file_delete, other wise the file_open will lead to the correct opening and initialization of the fs framework. This commit ensures that we do the right thing even if file_delete is the first file I/O operation in the application. Fixes issue #5611 Signed-off-by: Edgar Gabriel --- ompi/mca/io/base/io_base_delete.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ompi/mca/io/base/io_base_delete.c b/ompi/mca/io/base/io_base_delete.c index 48265b2347..b5926aad5b 100644 --- a/ompi/mca/io/base/io_base_delete.c +++ b/ompi/mca/io/base/io_base_delete.c @@ -13,6 +13,7 @@ * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2016-2017 IBM Corporation. All rights reserved. + * Copyright (c) 2008-2018 University of Houston. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -35,6 +36,8 @@ #include "opal/mca/base/base.h" #include "ompi/mca/io/io.h" #include "ompi/mca/io/base/base.h" +#include "ompi/mca/fs/fs.h" +#include "ompi/mca/fs/base/base.h" /* * Local types @@ -68,6 +71,8 @@ static void unquery(avail_io_t *avail, const char *filename, struct opal_info_t static int delete_file(avail_io_t *avail, const char *filename, struct opal_info_t *info); +extern opal_mutex_t ompi_mpi_ompio_bootstrap_mutex; + /* * Stuff for the OBJ interface @@ -142,8 +147,25 @@ int mca_io_base_delete(const char *filename, struct opal_info_t *info) } OBJ_RELEASE(selectable); - /* Finally -- delete the file with the selected component */ + if (!strcmp (selected.ai_component.v2_0_0.io_version.mca_component_name, + "ompio")) { + int ret; + opal_mutex_lock(&ompi_mpi_ompio_bootstrap_mutex); + if (OMPI_SUCCESS != (ret = mca_base_framework_open(&ompi_fs_base_framework, 0))) { + opal_mutex_unlock(&ompi_mpi_ompio_bootstrap_mutex); + return err; + } + opal_mutex_unlock(&ompi_mpi_ompio_bootstrap_mutex); + + if (OMPI_SUCCESS != + (ret = mca_fs_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { + return err; + } + } + + + /* Finally -- delete the file with the selected component */ if (OMPI_SUCCESS != (err = delete_file(&selected, filename, info))) { return err; }