1
1
openmpi/ompi/mca/fs/ime/fs_ime.c
Gaëtan Bossu ccc96efc2e DDN's Infinite Memory Engine support for OMPIO
Changes made:
 - Create a new fs component for IME
 - Create a new fbtl component for IME
 - Modify the close function of OMPIO to finalize IME if necessary

Signed-off-by: Gaëtan Bossu <gbossu@ddn.com>
Signed-off-by: Sylvain Didelot <sdidelot@ddn.com>
2018-08-16 11:45:47 +02:00

193 строки
4.9 KiB
C

/*
* Copyright (c) 2018 DataDirect Networks. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ime_native.h"
#include "ompi_config.h"
#include "mpi.h"
#include "ompi/mca/fs/fs.h"
#include "ompi/mca/fs/base/base.h"
#include "ompi/mca/fs/ime/fs_ime.h"
/*
* *******************************************************************
* ************************ actions structure ************************
* *******************************************************************
*/
static mca_fs_base_module_1_0_0_t ime = {
mca_fs_ime_module_init, /* initalise after being selected */
mca_fs_ime_module_finalize, /* close a module on a communicator */
mca_fs_ime_file_open,
mca_fs_ime_file_close,
mca_fs_ime_file_delete,
mca_fs_ime_file_set_size,
mca_fs_ime_file_get_size,
mca_fs_ime_file_sync
};
/*
* *******************************************************************
* ************************* structure ends **************************
* *******************************************************************
*/
/*
* Private variables
*/
static int mca_fs_ime_IS_INITIALIZED = 0;
/*
* Function decls
*/
int mca_fs_ime_component_init_query(bool enable_progress_threads,
bool enable_mpi_threads)
{
/* Nothing to do */
return OMPI_SUCCESS;
}
struct mca_fs_base_module_1_0_0_t *
mca_fs_ime_component_file_query (ompio_file_t *fh, int *priority)
{
/* IME should only be used for paths starting with ime: or IME:
Therefore, this function will return a NULL module when no IME
path is detected. */
char *tmp;
*priority = mca_fs_ime_priority;
tmp = strchr (fh->f_filename, ':');
if (!tmp) {
/* The communicator might be NULL if we only want to delete the file */
if (OMPIO_ROOT == fh->f_rank || MPI_COMM_NULL == fh->f_comm) {
fh->f_fstype = mca_fs_base_get_fstype ( fh->f_filename );
}
if (fh->f_comm != MPI_COMM_NULL) {
fh->f_comm->c_coll->coll_bcast (&(fh->f_fstype),
1,
MPI_INT,
OMPIO_ROOT,
fh->f_comm,
fh->f_comm->c_coll->coll_bcast_module);
}
}
else {
if (!strncmp(fh->f_filename, DEFAULT_IME_PREFIX_NO_FWD_SLASH,
IME_FILE_PREFIX_LEN_NO_FWD_SLASH)){
fh->f_fstype = IME;
}
}
/* According to my understanding, a valid module should be returned
as long as a valid FS type is detected. (This isn't what is done
for LUSTRE or PVFS2)
*/
if (IME == fh->f_fstype) {
if (*priority < FS_IME_INCREASED_PRIORITY) {
*priority = FS_IME_INCREASED_PRIORITY;
}
return &ime;
}
return NULL;
}
int mca_fs_ime_component_file_unquery (ompio_file_t *file)
{
/* This function might be needed for some purposes later. for now it
* does not have anything to do since there are no steps which need
* to be undone if this module is not selected */
return OMPI_SUCCESS;
}
int mca_fs_ime_module_init (ompio_file_t *file)
{
/* Make sure the file type is not overwritten by the last queried
* component */
file->f_fstype = IME;
if (mca_fs_ime_IS_INITIALIZED == 0) {
mca_fs_ime_IS_INITIALIZED = 1;
ime_native_init();
}
return OMPI_SUCCESS;
}
int mca_fs_ime_module_finalize (ompio_file_t *file)
{
/*
* Nothing to do here:
* We can't finalize IME here because other files might
* still be using it. Instead, IME is finalized when
* the OMPIO component is closed.
*/
return OMPI_SUCCESS;
}
int mca_fs_ime_get_mpi_err(int errno_val)
{
switch (errno_val) {
case EACCES:
return MPI_ERR_ACCESS;
case ENAMETOOLONG:
return MPI_ERR_BAD_FILE;
case ENOENT:
return MPI_ERR_NO_SUCH_FILE;
case EISDIR:
return MPI_ERR_BAD_FILE;
case EROFS:
return MPI_ERR_READ_ONLY;
case EEXIST:
return MPI_ERR_FILE_EXISTS;
case ENOSPC:
return MPI_ERR_NO_SPACE;
case EDQUOT:
return MPI_ERR_QUOTA;
case ETXTBSY:
return MPI_ERR_FILE_IN_USE;
case EBADF:
return MPI_ERR_FILE;
default:
return MPI_ERR_OTHER;
}
}
int mca_fs_ime_native_fini()
{
int ret;
if (mca_fs_ime_IS_INITIALIZED == 0) {
return OMPI_SUCCESS;
}
/* We don't actually need to reset this variable since
mca_fs_ime_native_fini is only called once:
when OMPIO is closed
*/
mca_fs_ime_IS_INITIALIZED = 0;
ret = ime_native_finalize();
if (ret != 0) {
return OMPI_ERROR;
}
return OMPI_SUCCESS;
}