blob: 139acbefd3d4a53952b01d34f7a55da48f569a8b [file] [log] [blame]
/*****************************************************************************
*
* Copyright (C) 2010 Lawrence Livermore National Security, LLC.
* Produced at Lawrence Livermore National Laboratory.
* Written by Morris Jette <jette1@llnl.gov>.
*
* UCRL-CODE-235358
*
* This file is part of chaos-spankings, a set of spank plugins for SLURM.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************
* Two options are added for salloc, sbatch, and srun: --cache-io and
* --direct-io. These options will set a SPANK_DIRECT_IO environment variable
* for the job's Prolog and Epilog scripts. If neither option (or their
* corresponding environment variables) are set, then SPANK_DIRECT_IO
* will not exist. NOTE: Command line options take precidence over the
* environment variables.
*
* --cache-io or SLURM_CACHE_IO env var will set SPANK_DIRECT_IO=0
* --direct-io or SLURM_DIRECT_IO env var will set SPANK_DIRECT_IO=1
****************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <slurm/spank.h>
/*
* All spank plugins must define this macro for the SLURM plugin loader.
*/
SPANK_PLUGIN(direct-io, 1)
#define CACHE_IO 0x1
#define DIRECT_IO 0x2
static int io_style = 0;
static int _opt_process (int val, const char *optarg, int remote);
/*
* Provide a --cache-io/--direct-io option for srun:
*/
struct spank_option spank_option_array[] =
{
{ "cache-io", NULL, "Cache I/O",
0, CACHE_IO, (spank_opt_cb_f) _opt_process },
{ "direct-io", NULL, "Write I/O directly to disk, without caching",
0, DIRECT_IO, (spank_opt_cb_f) _opt_process },
SPANK_OPTIONS_TABLE_END
};
int slurm_spank_init(spank_t sp, int ac, char **av)
{
int i, j, rc = ESPANK_SUCCESS;
for (i=0; spank_option_array[i].name; i++) {
j = spank_option_register(sp, &spank_option_array[i]);
if (j != ESPANK_SUCCESS) {
slurm_error("Could not register Spank option %s",
spank_option_array[i].name);
rc = j;
}
}
return rc;
}
/*
* Called from both srun and slurmd.
*/
int slurm_spank_init_post_opt (spank_t sp, int ac, char **av)
{
int rc = ESPANK_SUCCESS;
if (spank_remote (sp))
return (0);
if (io_style == CACHE_IO) {
slurm_debug("cache_io option");
rc = spank_set_job_env("O_DIRECT", "0", 1);
} else if (io_style == DIRECT_IO) {
slurm_debug("direct_io option");
rc = spank_set_job_env("O_DIRECT", "1", 1);
} else if (getenv("SLURM_CACHE_IO")) {
slurm_debug("cache_io env var");
rc = spank_set_job_env("O_DIRECT", "0", 1);
} else if (getenv("SLURM_DIRECT_IO")) {
slurm_debug("direct_io env var");
rc = spank_set_job_env("O_DIRECT", "1", 1);
}
if (rc != ESPANK_SUCCESS)
slurm_error("spank_setjob_env: %s", spank_strerror(rc));
return (0);
}
static int _opt_process (int val, const char *optarg, int remote)
{
io_style = val;
return (0);
}