524
570
launch_msg_ptr->environment =
525
571
get_job_env(job_ptr, &launch_msg_ptr->envc);
526
572
launch_msg_ptr->job_mem = job_ptr->details->job_min_memory;
527
launch_msg_ptr->num_cpu_groups = job_ptr->num_cpu_groups;
528
launch_msg_ptr->cpus_per_node = xmalloc(sizeof(uint32_t) *
529
job_ptr->num_cpu_groups);
530
memcpy(launch_msg_ptr->cpus_per_node, job_ptr->cpus_per_node,
531
(sizeof(uint32_t) * job_ptr->num_cpu_groups));
574
launch_msg_ptr->num_cpu_groups = job_ptr->select_job->cpu_array_cnt;
575
launch_msg_ptr->cpus_per_node = xmalloc(sizeof(uint16_t) *
576
job_ptr->select_job->cpu_array_cnt);
577
memcpy(launch_msg_ptr->cpus_per_node,
578
job_ptr->select_job->cpu_array_value,
579
(sizeof(uint16_t) * job_ptr->select_job->cpu_array_cnt));
532
580
launch_msg_ptr->cpu_count_reps = xmalloc(sizeof(uint32_t) *
533
job_ptr->num_cpu_groups);
534
memcpy(launch_msg_ptr->cpu_count_reps, job_ptr->cpu_count_reps,
535
(sizeof(uint32_t) * job_ptr->num_cpu_groups));
581
job_ptr->select_job->cpu_array_cnt);
582
memcpy(launch_msg_ptr->cpu_count_reps,
583
job_ptr->select_job->cpu_array_reps,
584
(sizeof(uint32_t) * job_ptr->select_job->cpu_array_cnt));
537
586
launch_msg_ptr->select_jobinfo = select_g_copy_jobinfo(
538
587
job_ptr->select_jobinfo);
1056
* epilog_slurmctld - execute the prolog_slurmctld for a job that has just
1058
* IN job_ptr - pointer to job that has been terminated
1059
* RET SLURM_SUCCESS(0) or error code
1061
extern int epilog_slurmctld(struct job_record *job_ptr)
1064
pthread_t thread_id_epilog;
1065
pthread_attr_t thread_attr_epilog;
1067
if ((slurmctld_conf.epilog_slurmctld == NULL) ||
1068
(slurmctld_conf.epilog_slurmctld[0] == '\0'))
1069
return SLURM_SUCCESS;
1071
if (access(slurmctld_conf.epilog_slurmctld, X_OK) < 0) {
1072
error("Invalid EpilogSlurmctld: %m");
1076
slurm_attr_init(&thread_attr_epilog);
1077
pthread_attr_setdetachstate(&thread_attr_epilog,
1078
PTHREAD_CREATE_DETACHED);
1080
rc = pthread_create(&thread_id_epilog,
1081
&thread_attr_epilog,
1082
_run_epilog, (void *) job_ptr);
1084
return SLURM_SUCCESS;
1085
if (errno == EAGAIN)
1087
error("pthread_create: %m");
1092
static char **_build_env(struct job_record *job_ptr)
1094
char **my_env, *name;
1096
my_env = xmalloc(sizeof(char *));
1099
select_g_get_jobinfo(job_ptr->select_jobinfo,
1100
SELECT_DATA_RESV_ID, &name);
1101
setenvf(&env, "BASIL_RESERVATION_ID", "%s", name);
1105
select_g_get_jobinfo(job_ptr->select_jobinfo,
1106
SELECT_DATA_BLOCK_ID, &name);
1107
setenvf(&my_env, "MPIRUN_PARTITION", "%s", name);
1109
setenvf(&my_env, "SLURM_JOB_ACCOUNT", "%s", job_ptr->account);
1110
if (job_ptr->details) {
1111
setenvf(&my_env, "SLURM_JOB_CONSTRAINTS",
1112
"%s", job_ptr->details->features);
1114
setenvf(&my_env, "SLURM_JOB_GID", "%u", job_ptr->group_id);
1115
name = gid_to_string((uid_t) job_ptr->group_id);
1116
setenvf(&my_env, "SLURM_JOB_GROUP", "%s", name);
1118
setenvf(&my_env, "SLURM_JOB_ID", "%u", job_ptr->job_id);
1119
setenvf(&my_env, "SLURM_JOB_NAME", "%s", job_ptr->name);
1120
setenvf(&my_env, "SLURM_JOB_NODELIST", "%s", job_ptr->nodes);
1121
setenvf(&my_env, "SLURM_JOB_PARTITION", "%s", job_ptr->partition);
1122
setenvf(&my_env, "SLURM_JOB_UID", "%u", job_ptr->user_id);
1123
name = uid_to_string((uid_t) job_ptr->user_id);
1124
setenvf(&my_env, "SLURM_JOB_USER", "%s", name);
1130
static void *_run_epilog(void *arg)
1132
struct job_record *job_ptr = (struct job_record *) arg;
1135
int i, status, wait_rc;
1136
char *argv[2], **my_env;
1137
/* Locks: Read config, job */
1138
slurmctld_lock_t config_read_lock = {
1139
READ_LOCK, READ_LOCK, NO_LOCK, NO_LOCK };
1141
lock_slurmctld(config_read_lock);
1142
argv[0] = xstrdup(slurmctld_conf.epilog_slurmctld);
1144
my_env = _build_env(job_ptr);
1145
job_id = job_ptr->job_id;
1146
unlock_slurmctld(config_read_lock);
1148
if ((cpid = fork()) < 0) {
1149
error("epilog_slurmctld fork error: %m");
1153
#ifdef SETPGRP_TWO_ARGS
1158
execve(argv[0], argv, my_env);
1163
wait_rc = waitpid(cpid, &status, 0);
1167
error("epilog_slurmctld waitpid error: %m");
1169
} else if (wait_rc > 0) {
1170
killpg(cpid, SIGKILL); /* kill children too */
1175
error("epilog_slurmctld job %u epilog exit status %u:%u",
1176
job_id, WEXITSTATUS(status), WTERMSIG(status));
1178
debug2("epilog_slurmctld job %u prolog completed", job_id);
1180
fini: xfree(argv[0]);
1181
for (i=0; my_env[i]; i++)
1188
* prolog_slurmctld - execute the prolog_slurmctld for a job that has just
1189
* been allocated resources.
1190
* IN job_ptr - pointer to job that will be initiated
1191
* RET SLURM_SUCCESS(0) or error code
1193
extern int prolog_slurmctld(struct job_record *job_ptr)
1196
pthread_t thread_id_prolog;
1197
pthread_attr_t thread_attr_prolog;
1199
if ((slurmctld_conf.prolog_slurmctld == NULL) ||
1200
(slurmctld_conf.prolog_slurmctld[0] == '\0'))
1201
return SLURM_SUCCESS;
1203
if (access(slurmctld_conf.prolog_slurmctld, X_OK) < 0) {
1204
error("Invalid PrologSlurmctld: %m");
1208
if (job_ptr->details)
1209
job_ptr->details->prolog_running = 1;
1211
slurm_attr_init(&thread_attr_prolog);
1212
pthread_attr_setdetachstate(&thread_attr_prolog,
1213
PTHREAD_CREATE_DETACHED);
1215
rc = pthread_create(&thread_id_prolog,
1216
&thread_attr_prolog,
1217
_run_prolog, (void *) job_ptr);
1219
return SLURM_SUCCESS;
1220
if (errno == EAGAIN)
1222
error("pthread_create: %m");
1227
static void *_run_prolog(void *arg)
1229
struct job_record *job_ptr = (struct job_record *) arg;
1232
int i, status, wait_rc;
1233
char *argv[2], **my_env;
1234
/* Locks: Read config, job */
1235
slurmctld_lock_t config_read_lock = {
1236
READ_LOCK, READ_LOCK, NO_LOCK, NO_LOCK };
1238
lock_slurmctld(config_read_lock);
1239
argv[0] = xstrdup(slurmctld_conf.prolog_slurmctld);
1241
my_env = _build_env(job_ptr);
1242
job_id = job_ptr->job_id;
1243
unlock_slurmctld(config_read_lock);
1245
if ((cpid = fork()) < 0) {
1246
error("prolog_slurmctld fork error: %m");
1250
#ifdef SETPGRP_TWO_ARGS
1255
execve(argv[0], argv, my_env);
1260
wait_rc = waitpid(cpid, &status, 0);
1264
error("prolog_slurmctld waitpid error: %m");
1266
} else if (wait_rc > 0) {
1267
killpg(cpid, SIGKILL); /* kill children too */
1272
error("prolog_slurmctld job %u prolog exit status %u:%u",
1273
job_id, WEXITSTATUS(status), WTERMSIG(status));
1275
debug2("prolog_slurmctld job %u prolog completed", job_id);
1277
fini: xfree(argv[0]);
1278
for (i=0; my_env[i]; i++)
1281
lock_slurmctld(config_read_lock);
1282
if (job_ptr->job_id != job_id) {
1283
error("prolog_slurmctld job %u pointer invalid", job_id);
1284
job_ptr = find_job_record(job_id);
1285
if (job_ptr == NULL)
1286
error("prolog_slurmctld job %u now defunct", job_id);
1289
if (job_ptr->details)
1290
job_ptr->details->prolog_running = 0;
1291
if (job_ptr->batch_flag &&
1292
((job_ptr->job_state == JOB_RUNNING) ||
1293
(job_ptr->job_state == JOB_SUSPENDED)))
1294
launch_job(job_ptr);
1296
unlock_slurmctld(config_read_lock);
985
1302
* build_feature_list - Translate a job's feature string into a feature_list
986
1303
* IN details->features
987
1304
* OUT details->feature_list