Skip to content
Snippets Groups Projects
slurm_protocol_defs.c 12.32 KiB
/*****************************************************************************\
 *  slurm_protocol_defs.c - functions for initializing and releasing 
 *	storage for RPC data structures
 *****************************************************************************
 *  Copyright (C) 2002 The Regents of the University of California.
 *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
 *  Written by Kevin Tew <tew1@llnl.gov> et. al.
 *  UCRL-CODE-2002-040.
 *  
 *  This file is part of SLURM, a resource management program.
 *  For details, see <http://www.llnl.gov/linux/slurm/>.
 *  
 *  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.
 *  
 *  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.,
 *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
\*****************************************************************************/

#if HAVE_CONFIG_H
#  include <config.h>
#endif

#if HAVE_STDLIB_H
#  include <stdlib.h>
#endif

#include <stdio.h>

#include <src/common/log.h>
#include <src/common/slurm_protocol_defs.h>
#include <src/common/xmalloc.h>

/* short messages*/
void slurm_free_last_update_msg(last_update_msg_t * msg)
{
	xfree(msg);
}

void slurm_free_shutdown_msg(shutdown_msg_t * msg)
{
	xfree(msg);
}

void slurm_free_job_id_msg(job_id_msg_t * msg)
{
	xfree(msg);
}

void slurm_free_job_step_id(job_step_id_t * msg)
{
	xfree(msg);
}

void slurm_free_return_code_msg(return_code_msg_t * msg)
{
	xfree(msg);
}

void slurm_free_ctl_conf(slurm_ctl_conf_info_msg_t * build_ptr)
{
	if (build_ptr) {
		if (build_ptr->backup_controller)
			xfree(build_ptr->backup_controller);
		if (build_ptr->control_machine)
			xfree(build_ptr->control_machine);
		if (build_ptr->epilog)
			xfree(build_ptr->epilog);
		if (build_ptr->prioritize)
			xfree(build_ptr->prioritize);
		if (build_ptr->prolog)
			xfree(build_ptr->prolog);
		if (build_ptr->slurm_conf)
			xfree(build_ptr->slurm_conf);
		if (build_ptr->state_save_location)
			xfree(build_ptr->state_save_location);
		if (build_ptr->tmp_fs)
			xfree(build_ptr->tmp_fs);
		xfree(build_ptr);
	}
}

void slurm_free_job_desc_msg(job_desc_msg_t * msg)
{
	int i;

	if (msg) {
		for (i = 0; i < msg->env_size; i++) {
			if (msg->environment[i])
				xfree(msg->environment[i]);
		}
		if (msg->environment)
			xfree(msg->environment);
		if (msg->features)
			xfree(msg->features);
		if (msg->name)
			xfree(msg->name);
		if (msg->partition)
			xfree(msg->partition);
		if (msg->req_nodes)
			xfree(msg->req_nodes);
		if (msg->script)
			xfree(msg->script);
		if (msg->stderr)
			xfree(msg->stderr);
		if (msg->stdin)
			xfree(msg->stdin);
		if (msg->stdout)
			xfree(msg->stdout);
		if (msg->work_dir)
			xfree(msg->work_dir);
		xfree(msg);
	}
}

static void 
_free_all_partitions(partition_info_msg_t *msg)
{
	int i;
	xassert(msg != NULL);
	xassert(msg->partition_array != NULL);

	for (i = 0; i < msg->record_count; i++)
		slurm_free_partition_info_members(&msg->partition_array[i]);

}

void slurm_free_partition_info_msg(partition_info_msg_t * msg)
{
	if (msg) {
		if (msg->partition_array) {
			_free_all_partitions(msg);
			xfree(msg->partition_array);
		}
		xfree(msg);
	}
}

void slurm_free_partition_info(partition_info_t * part)
{
	if (part) {
		slurm_free_partition_info_members(part);
		xfree(part);
	}
}

void slurm_free_partition_info_members(partition_info_t * part)
{
	if (part) {
		if (part->name)
			xfree(part->name);
		if (part->allow_groups)
			xfree(part->allow_groups);
		if (part->nodes)
			xfree(part->nodes);
		if (part->node_inx)
			xfree(part->node_inx);
	}
}

static void _free_all_job_info(job_info_msg_t *msg)
{
	int i;
	xassert(msg != NULL);
	xassert(msg->job_array != NULL);

	for (i = 0; i < msg->record_count; i++)
		slurm_free_job_info_members(&msg->job_array[i]);
}

void slurm_free_job_info_msg(job_info_msg_t * msg)
{
	if (msg) {
		if (msg->job_array) {
			_free_all_job_info(msg);
			xfree(msg->job_array);
		}
		xfree(msg);
	}
}

void slurm_free_job_info(job_info_t * job)
{
	if (job) {
		slurm_free_job_info_members(job);
		xfree(job);
	}
}

void slurm_free_job_info_members(job_info_t * job)
{
	if (job) {
		if (job->nodes)
			xfree(job->nodes);
		if (job->partition)
			xfree(job->partition);
		if (job->name)
			xfree(job->name);
		if (job->node_inx)
			xfree(job->node_inx);
		if (job->req_nodes)
			xfree(job->req_nodes);
		if (job->features)
			xfree(job->features);
		xfree(job->req_node_inx);
	}
}

void slurm_free_job_step_info_members(job_step_info_t * msg)
{
	if (msg != NULL) {
		if (msg->partition != NULL)
			xfree(msg->partition);
		if (msg->nodes != NULL)
			xfree(msg->nodes);
	}
}

void slurm_free_job_step_info(job_step_info_t * msg)
{
	if (msg != NULL) {
		slurm_free_job_step_info_members(msg);
		xfree(msg);
	}
}


static void _free_all_step_info(job_step_info_response_msg_t *msg)
{
	int i;
	xassert (msg != NULL);
	xassert (msg->job_steps != NULL);

	for (i = 0; i < msg->job_step_count; i++)
		slurm_free_job_step_info_members(&msg->job_steps[i]);
}

void slurm_free_job_step_info_response_msg(job_step_info_response_msg_t *
					   msg)
{
	if (msg != NULL) {
		if (msg->job_steps != NULL) {
			_free_all_step_info(msg);
			xfree(msg->job_steps);
		}
		xfree(msg);
	}
}

static void _free_all_node_info(node_info_msg_t *msg)
{
	int i;
	xassert(msg != NULL);
	xassert(msg->node_array != NULL);
	
	for (i = 0; i < msg->record_count; i++) 
		slurm_free_node_info_members(&msg->node_array[i]);
}

void slurm_free_node_info_msg(node_info_msg_t * msg)
{
	if (msg) {
		if (msg->node_array) {
			_free_all_node_info(msg);
			xfree(msg->node_array);
		}
		xfree(msg);
	}
}

void slurm_free_node_info(node_info_t * node)
{
	if (node) {
		slurm_free_node_info_members(node);
		xfree(node);
	}
}

void slurm_free_node_info_members(node_info_t * node)
{
	if (node) {
		if (node->name)
			xfree(node->name);
		if (node->features)
			xfree(node->features);
		if (node->partition)
			xfree(node->partition);
	}
}

void
slurm_free_resource_allocation_response_msg
(resource_allocation_response_msg_t * msg)
{
	if (msg) {
		if (msg->node_list)
			xfree(msg->node_list);
		if (msg->cpus_per_node)
			xfree(msg->cpus_per_node);
		if (msg->cpu_count_reps)
			xfree(msg->cpu_count_reps);
		xfree(msg);
	}
}

void
slurm_free_resource_allocation_and_run_response_msg
(resource_allocation_and_run_response_msg_t * msg)
{
	if (msg) {
		if (msg->node_list)
			xfree(msg->node_list);
		if (msg->cpus_per_node)
			xfree(msg->cpus_per_node);
		if (msg->cpu_count_reps)
			xfree(msg->cpu_count_reps);
		if (msg->credentials)
			xfree(msg->credentials);
#		ifdef HAVE_LIBELAN3
		qsw_free_jobinfo(msg->qsw_job);
#		endif
		xfree(msg);
	}
}

void slurm_free_submit_response_response_msg(submit_response_msg_t * msg)
{
	if (msg)
		xfree(msg);
}

void
slurm_free_node_registration_status_msg
(slurm_node_registration_status_msg_t * msg)
{
	if (msg) {
		if (msg->node_name)
			xfree(msg->node_name);
		if (msg->job_id)
			xfree(msg->job_id);
		xfree(msg);
	}
}


void slurm_free_update_node_msg(update_node_msg_t * msg)
{
	if (msg) {
		if (msg->node_names)
			xfree(msg->node_names);
		xfree(msg);
	}
}

void slurm_free_update_part_msg(update_part_msg_t * msg)
{
	if (msg) {
		if (msg->name)
			xfree(msg->name);
		if (msg->nodes)
			xfree(msg->nodes);
		if (msg->allow_groups)
			xfree(msg->allow_groups);
		xfree(msg);
	}
}

void slurm_free_job_step_create_request_msg(job_step_create_request_msg_t *
					    msg)
{
	if (msg) {
		if (msg->node_list)
			xfree(msg->node_list);
		xfree(msg);
	}
}

void slurm_free_job_step_create_response_msg(job_step_create_response_msg_t
					     * msg)
{
	if (msg) {
		if (msg->credentials)
			xfree(msg->credentials);

#		ifdef HAVE_LIBELAN3
		qsw_free_jobinfo(msg->qsw_job);
#		endif

		xfree(msg);
	}

}

void slurm_free_launch_tasks_response_msg(launch_tasks_response_msg_t *
					  msg)
{
	if (msg) {
		if (msg->node_name)
			xfree(msg->node_name);
		xfree(msg);
	}
}

void slurm_free_revoke_credential_msg(revoke_credential_msg_t * msg)
{
	if (msg) {
		xfree(msg);
	}
}

void slurm_free_task_exit_msg(task_exit_msg_t * msg)
{
	if (msg) {
		xfree(msg);
	}
}

void slurm_free_launch_tasks_request_msg(launch_tasks_request_msg_t * msg)
{
	int i;
	if (msg) {
		if (msg->credential)
			xfree(msg->credential);
		if (msg->env) {
			for (i = 0; i < msg->envc; i++) {
				if (msg->env[i])
					xfree(msg->env[i]);
			}
			xfree(msg->env);
		}
		if (msg->cwd)
			xfree(msg->cwd);
		if (msg->argv) {
			for (i = 0; i < msg->argc; i++) {
				if (msg->argv[i])
					xfree(msg->argv[i]);
			}
			xfree(msg->argv);
		}
		if (msg->global_task_ids)
			xfree(msg->global_task_ids);
#		ifdef HAVE_LIBELAN3
		qsw_free_jobinfo(msg->qsw_job);
#		endif

		xfree(msg);
	}
}

void slurm_free_reattach_tasks_streams_msg(reattach_tasks_streams_msg_t *
					   msg)
{
	if (msg) {
		if (msg->credential)
			xfree(msg->credential);
		if (msg->global_task_ids)
			xfree(msg->global_task_ids);
		xfree(msg);
	}
}

void slurm_free_kill_tasks_msg(kill_tasks_msg_t * msg)
{
	if (msg) {
		xfree(msg);
	}
}

/**********************
 Init functions
 **********************/


void slurm_init_job_desc_msg(job_desc_msg_t * job_desc_msg)
{
	job_desc_msg->contiguous =
	    (uint16_t) SLURM_JOB_DESC_DEFAULT_CONTIGUOUS;
	job_desc_msg->environment = SLURM_JOB_DESC_DEFAULT_ENVIRONMENT;
	job_desc_msg->env_size    = SLURM_JOB_DESC_DEFAULT_ENV_SIZE;
	job_desc_msg->features    = SLURM_JOB_DESC_DEFAULT_FEATURES;

	job_desc_msg->job_id      = SLURM_JOB_DESC_DEFAULT_JOB_ID;

	job_desc_msg->name        = SLURM_JOB_DESC_DEFAULT_JOB_NAME;
	job_desc_msg->min_procs   = SLURM_JOB_DESC_DEFAULT_MIN_PROCS;
	job_desc_msg->min_memory  = SLURM_JOB_DESC_DEFAULT_MIN_MEMORY;
	job_desc_msg->min_tmp_disk= SLURM_JOB_DESC_DEFAULT_MIN_TMP_DISK;
	job_desc_msg->partition   = SLURM_JOB_DESC_DEFAULT_PARTITION;
	job_desc_msg->priority    = SLURM_JOB_DESC_DEFAULT_PRIORITY;
	job_desc_msg->req_nodes   = SLURM_JOB_DESC_DEFAULT_REQ_NODES;
	job_desc_msg->script      = SLURM_JOB_DESC_DEFAULT_JOB_SCRIPT;
	job_desc_msg->shared      = (uint16_t) SLURM_JOB_DESC_DEFAULT_SHARED;
	job_desc_msg->time_limit  = SLURM_JOB_DESC_DEFAULT_TIME_LIMIT;
	job_desc_msg->num_procs   = SLURM_JOB_DESC_DEFAULT_NUM_PROCS;
	job_desc_msg->num_nodes   = SLURM_JOB_DESC_DEFAULT_NUM_NODES;
	job_desc_msg->stderr      = NULL;
	job_desc_msg->stdin       = NULL;
	job_desc_msg->stdout      = NULL;
	job_desc_msg->user_id     = SLURM_JOB_DESC_DEFAULT_USER_ID;
	job_desc_msg->work_dir    = SLURM_JOB_DESC_DEFAULT_WORKING_DIR;
}

void slurm_init_part_desc_msg(update_part_msg_t * update_part_msg)
{
	update_part_msg->name 		= NULL;
	update_part_msg->nodes 		= NULL;
	update_part_msg->allow_groups 	= NULL;
	update_part_msg->max_time 	= (uint32_t) NO_VAL;
	update_part_msg->max_nodes 	= (uint32_t) NO_VAL;
	update_part_msg->default_part 	= (uint16_t) NO_VAL;
	update_part_msg->root_only 	= (uint16_t) NO_VAL;
	update_part_msg->shared 	= (uint16_t) NO_VAL;
	update_part_msg->state_up 	= (uint16_t) NO_VAL;
}

char *job_state_string(enum job_states inx)
{
	static char *job_state_string[] = {
		"PENDING",
		"STAGE_IN",
		"RUNNING",
		"STAGE_OUT",
		"COMPLETE",
		"FAILED",
		"TIMEOUT",
		"NODE_FAIL",
		"END"
	};
	return job_state_string[inx];
}

char *job_state_string_compact(enum job_states inx)
{
	static char *job_state_string[] = {
		"PD",
		"SI",
		"R",
		"SO",
		"C",
		"F",
		"TO",
		"END"
	};
	return job_state_string[inx];
}

char *node_state_string(enum node_states inx)
{
	static char *node_state_string[] = {
		"DOWN",
		"UNKNOWN",
		"IDLE",
		"ALLOCATED",
		"DRAINED",
		"DRAINING",
		"END"
	};
	static char *node_down_string[] = {
		"NoResp+DOWN",
		"NoResp+UNKNOWN",
		"NoResp+IDLE",
		"NoResp+ALLOCATED",
		"NoResp+DRAINED",
		"NoResp+DRAINING",
		"END"
	};
	if (inx & NODE_STATE_NO_RESPOND) {
		inx = (uint16_t) (inx & (~NODE_STATE_NO_RESPOND));
		return node_down_string[inx];
	}
	else
		return node_state_string[inx];
}

char *node_state_string_compact(enum node_states inx)
{
	static char *node_state_string[] = {
		"DN",
		"UN",
		"I",
		"AL",
		"DD",
		"DG",
		"END"
	};
	return node_state_string[inx];
}