blob: abec8fae34b627bd56f354533cac3dab71da9bbb [file] [log] [blame]
/*****************************************************************************\
* src/slurmd/slurmstepd/io.h - slurmstepd standard IO routines
*****************************************************************************
* Copyright (C) 2002 The Regents of the University of California.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Mark Grondona <mgrondona@llnl.gov>.
* CODE-OCEC-09-009. All rights reserved.
*
* This file is part of Slurm, a resource management program.
* For details, see <https://slurm.schedmd.com/>.
* Please also read the included file: DISCLAIMER.
*
* Slurm 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.
*
* In addition, as a special exception, the copyright holders give permission
* to link the code of portions of this program with the OpenSSL library under
* certain conditions as described in each individual source file, and
* distribute linked combinations including the two. You must obey the GNU
* General Public License in all respects for all of the code used other than
* OpenSSL. If you modify file(s) with this exception, you may extend this
* exception to your version of the file(s), but you are not obligated to do
* so. If you do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source files in
* the program, then also delete it here.
*
* Slurm 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 Slurm; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\*****************************************************************************/
#ifndef _IO_H
#define _IO_H
#include "src/common/eio.h"
#include "src/slurmd/slurmstepd/slurmstepd_job.h"
/* For each task's ofname and efname, are all the names NULL,
one null and the others "/dev/null", all non-null and unique,
or all non-null and identical. */
typedef enum {
SLURMD_ALL_NULL, /* output from all tasks goes to the client (srun) */
SLURMD_ONE_NULL, /* output from one task goes to the client, output
from other tasks is discarded */
SLURMD_ALL_UNIQUE, /* separate output files per task. written from
tasks unless stepd_step_rec_t->labelio == true, in
which case the slurmstepd does the write */
SLURMD_ALL_SAME, /* all tasks write to the same file. written from
tasks unless stepd_step_rec_t->labelio == true, in
which case the slurmstepd does the write */
SLURMD_UNKNOWN
} slurmd_filename_pattern_t;
/*
* Create a TCP connection back the initial client (e.g. srun).
*
* Since this is the first client connection and the IO engine has not
* yet started, we initialize the msg_queue as an empty list and
* directly add the eio_obj_t to the eio handle with eio_new_initial_handle.
*/
int io_initial_client_connect(srun_info_t *srun, stepd_step_rec_t *step,
int stdout_tasks, int stderr_tasks);
/*
* Initiate a TCP connection back to a waiting client (e.g. srun).
*
* Create a new eio client object and wake up the eio engine so that
* it can see the new object.
*/
int io_client_connect(srun_info_t *srun, stepd_step_rec_t *step);
/*
* Open a local file and create and eio object for files written
* from the slurmstepd, probably with labelled output.
*/
int
io_create_local_client(const char *filename, int file_flags,
stepd_step_rec_t *step, bool labelio,
int stdout_tasks, int stderr_tasks);
/*
* Initialize each task's standard I/O file descriptors. The file descriptors
* may be files, or may be the end of a pipe which is handled by an eio_obj_t.
*/
int io_init_tasks_stdio(stepd_step_rec_t *step);
/*
* Start IO handling thread.
* Initializes IO pipes, creates IO objects and appends them to job->objs,
* and opens 2*ntask initial connections for stdout/err, also appending these
* to job->objs list.
*/
extern void io_thread_start(stepd_step_rec_t *step);
int io_dup_stdio(stepd_step_task_info_t *t);
/*
* Close the tasks' ends of the stdio pipes.
* Presumably the tasks have already been started, and
* have their copies of these file descriptors.
*/
void io_close_task_fds(stepd_step_rec_t *step);
void io_close_all(stepd_step_rec_t *step);
void io_close_local_fds(stepd_step_rec_t *step);
/*
* Look for a pattern in the stdout and stderr file names, and see
* if stdout and stderr point to the same file(s).
* See comments above for slurmd_filename_pattern_t.
*/
void io_find_filename_pattern( stepd_step_rec_t *step,
slurmd_filename_pattern_t *outpattern,
slurmd_filename_pattern_t *errpattern,
bool *same_out_err_files );
/*
* Get the flags to be used with the open call to create output files.
*/
int io_get_file_flags(stepd_step_rec_t *step);
#endif /* !_IO_H */