97
106
rc = slurm_checkpoint_complete(job_id, step_id, (time_t) 0,
98
107
error_code++, error_msg);
100
else if (strncasecmp(op, "disable", 3) == 0)
109
else if (strncasecmp(op, "disable", MAX(oplen, 1)) == 0)
101
110
rc = slurm_checkpoint_disable (job_id, step_id);
102
else if (strncasecmp(op, "enable", 2) == 0)
111
else if (strncasecmp(op, "enable", MAX(oplen, 2)) == 0)
103
112
rc = slurm_checkpoint_enable (job_id, step_id);
104
else if (strncasecmp(op, "create", 2) == 0)
105
rc = slurm_checkpoint_create (job_id, step_id, CKPT_WAIT);
106
else if (strncasecmp(op, "vacate", 2) == 0)
107
rc = slurm_checkpoint_vacate (job_id, step_id, CKPT_WAIT);
108
else if (strncasecmp(op, "restart", 2) == 0)
109
rc = slurm_checkpoint_restart (job_id, step_id);
110
else if (strncasecmp(op, "error", 2) == 0) {
113
else if (strncasecmp(op, "create", MAX(oplen, 2)) == 0) {
114
if (_parse_checkpoint_args(argc, argv, &max_wait, &image_dir)) {
117
rc = slurm_checkpoint_create (job_id, step_id, max_wait, image_dir);
119
} else if (strncasecmp(op, "vacate", MAX(oplen, 2)) == 0) {
120
if (_parse_checkpoint_args(argc, argv, &max_wait, &image_dir)) {
123
rc = slurm_checkpoint_vacate (job_id, step_id, max_wait, image_dir);
125
} else if (strncasecmp(op, "restart", MAX(oplen, 2)) == 0) {
126
if (_parse_restart_args(argc, argv, &stick, &image_dir)) {
129
rc = slurm_checkpoint_restart (job_id, step_id, stick, image_dir);
131
} else if (strncasecmp(op, "error", MAX(oplen, 2)) == 0) {
111
132
rc = slurm_checkpoint_error (job_id, step_id,
112
133
&ckpt_errno, &ckpt_strerror);
113
134
if (rc == SLURM_SUCCESS) {
201
263
scontrol_update_job (int argc, char *argv[])
203
265
int i, update_cnt = 0;
204
268
job_desc_msg_t job_msg;
206
270
slurm_init_job_desc_msg (&job_msg);
208
272
for (i=0; i<argc; i++) {
209
if (strncasecmp(argv[i], "JobId=", 6) == 0)
274
val = strchr(argv[i], '=');
276
taglen = val - argv[i];
278
vallen = strlen(val);
279
} else if (strncasecmp(tag, "Nice", MAX(strlen(tag), 2)) == 0) {
280
/* "Nice" is the only tag that might not have an
281
equal sign, so it is handled specially. */
282
job_msg.nice = NICE_OFFSET + 100;
287
fprintf (stderr, "Invalid input: %s\n", argv[i]);
288
fprintf (stderr, "Request aborted\n");
292
if (strncasecmp(tag, "JobId", MAX(taglen, 1)) == 0) {
211
(uint32_t) strtol(&argv[i][6],
213
else if (strncasecmp(argv[i], "Comment=", 8) == 0) {
214
job_msg.comment = &argv[i][8];
294
(uint32_t) strtol(val, (char **) NULL, 10);
296
else if (strncasecmp(tag, "Comment", MAX(taglen, 3)) == 0) {
297
job_msg.comment = val;
217
else if (strncasecmp(argv[i], "TimeLimit=", 10) == 0) {
218
int time_limit = time_str2mins(&argv[i][10]);
300
else if (strncasecmp(tag, "TimeLimit", MAX(taglen, 2)) == 0) {
301
int time_limit = time_str2mins(val);
219
302
if ((time_limit < 0) && (time_limit != INFINITE)) {
220
303
error("Invalid TimeLimit value");
242
324
job_msg.nice = NICE_OFFSET + nice;
245
else if (strncasecmp(argv[i], "Nice", 4) == 0) {
246
job_msg.nice = NICE_OFFSET + 100;
249
else if (strncasecmp(argv[i], "ReqProcs=", 9) == 0) {
327
else if (strncasecmp(tag, "ReqProcs", MAX(taglen, 4)) == 0) {
250
328
job_msg.num_procs =
251
(uint32_t) strtol(&argv[i][9],
329
(uint32_t) strtol(val, (char **) NULL, 10);
255
else if (strncasecmp(argv[i], "Requeue=", 8) == 0) {
332
else if (strncasecmp(tag, "Requeue", MAX(taglen, 4)) == 0) {
256
333
job_msg.requeue =
257
(uint16_t) strtol(&argv[i][8],
334
(uint16_t) strtol(val, (char **) NULL, 10);
261
337
/* MinNodes was replaced by ReqNodes in SLURM version 1.2 */
262
else if ((strncasecmp(argv[i], "MinNodes=", 9) == 0) ||
263
(strncasecmp(argv[i], "ReqNodes=", 9) == 0)) {
338
else if ((strncasecmp(tag, "MinNodes", MAX(taglen, 4)) == 0) ||
339
(strncasecmp(tag, "ReqNodes", MAX(taglen, 8)) == 0)) {
266
(uint32_t) strtol(&argv[i][9],
341
job_msg.min_nodes = (uint32_t) strtol(val, &tmp, 10);
268
342
if (tmp[0] == '-') {
269
343
job_msg.max_nodes = (uint32_t)
270
344
strtol(&tmp[1], (char **) NULL, 10);
273
347
"minimum value (%u < %u)",
274
348
job_msg.max_nodes,
275
349
job_msg.min_nodes);
280
else if (strncasecmp(argv[i], "ReqSockets=", 11) == 0) {
356
else if (strncasecmp(tag, "ReqSockets", MAX(taglen, 4)) == 0) {
281
357
job_msg.min_sockets =
282
(uint16_t) strtol(&argv[i][11],
358
(uint16_t) strtol(val, (char **) NULL, 10);
286
else if (strncasecmp(argv[i], "ReqCores=", 9) == 0) {
361
else if (strncasecmp(tag, "ReqCores", MAX(taglen, 4)) == 0) {
287
362
job_msg.min_cores =
288
(uint16_t) strtol(&argv[i][9],
363
(uint16_t) strtol(val, (char **) NULL, 10);
292
else if (strncasecmp(argv[i], "TasksPerNode=", 13) == 0) {
366
else if (strncasecmp(tag, "TasksPerNode", MAX(taglen, 2))==0) {
293
367
job_msg.ntasks_per_node =
294
(uint16_t) strtol(&argv[i][13],
368
(uint16_t) strtol(val, (char **) NULL, 10);
298
else if (strncasecmp(argv[i], "ReqThreads=", 11) == 0) {
371
else if (strncasecmp(tag, "ReqThreads", MAX(taglen, 4)) == 0) {
299
372
job_msg.min_threads =
300
(uint16_t) strtol(&argv[i][11],
373
(uint16_t) strtol(val, (char **) NULL, 10);
304
else if (strncasecmp(argv[i], "MinProcs=", 9) == 0) {
376
else if (strncasecmp(tag, "MinProcs", MAX(taglen, 4)) == 0) {
305
377
job_msg.job_min_procs =
306
(uint32_t) strtol(&argv[i][9],
378
(uint32_t) strtol(val, (char **) NULL, 10);
310
else if (strncasecmp(argv[i], "MinSockets=", 11) == 0) {
381
else if (strncasecmp(tag, "MinSockets", MAX(taglen, 4)) == 0) {
311
382
job_msg.job_min_sockets =
312
(uint16_t) strtol(&argv[i][11],
383
(uint16_t) strtol(val, (char **) NULL, 10);
316
else if (strncasecmp(argv[i], "MinCores=", 9) == 0) {
386
else if (strncasecmp(tag, "MinCores", MAX(taglen, 4)) == 0) {
317
387
job_msg.job_min_cores =
318
(uint16_t) strtol(&argv[i][9],
388
(uint16_t) strtol(val, (char **) NULL, 10);
322
else if (strncasecmp(argv[i], "MinThreads=", 11) == 0) {
391
else if (strncasecmp(tag, "MinThreads", MAX(taglen, 5)) == 0) {
323
392
job_msg.job_min_threads =
324
(uint16_t) strtol(&argv[i][11],
393
(uint16_t) strtol(val, (char **) NULL, 10);
328
else if (strncasecmp(argv[i], "MinMemoryNode=", 14) == 0) {
396
else if (strncasecmp(tag, "MinMemoryNode",
397
MAX(taglen, 10)) == 0) {
329
398
job_msg.job_min_memory =
330
(uint32_t) strtol(&argv[i][14],
399
(uint32_t) strtol(val, (char **) NULL, 10);
334
else if (strncasecmp(argv[i], "MinMemoryCPU=", 13) == 0) {
402
else if (strncasecmp(tag, "MinMemoryCPU",
403
MAX(taglen, 10)) == 0) {
335
404
job_msg.job_min_memory =
336
(uint32_t) strtol(&argv[i][13],
405
(uint32_t) strtol(val, (char **) NULL, 10);
338
406
job_msg.job_min_memory |= MEM_PER_CPU;
341
else if (strncasecmp(argv[i], "MinTmpDisk=", 11) == 0) {
409
else if (strncasecmp(tag, "MinTmpDisk", MAX(taglen, 5)) == 0) {
342
410
job_msg.job_min_tmp_disk =
343
(uint32_t) strtol(&argv[i][11],
347
else if (strncasecmp(argv[i], "Partition=", 10) == 0) {
348
job_msg.partition = &argv[i][10];
351
else if (strncasecmp(argv[i], "Name=", 5) == 0) {
352
job_msg.name = &argv[i][5];
355
else if (strncasecmp(argv[i], "Shared=", 7) == 0) {
356
if (strcasecmp(&argv[i][7], "YES") == 0)
411
(uint32_t) strtol(val, (char **) NULL, 10);
414
else if (strncasecmp(tag, "PartitionName",
415
MAX(taglen, 2)) == 0) {
416
job_msg.partition = val;
419
else if (strncasecmp(tag, "ReservationName",
420
MAX(taglen, 3)) == 0) {
421
job_msg.reservation = val;
424
else if (strncasecmp(tag, "Name", MAX(taglen, 2)) == 0) {
428
else if (strncasecmp(tag, "WCKey", MAX(taglen, 1)) == 0) {
432
else if (strncasecmp(tag, "Shared", MAX(taglen, 2)) == 0) {
433
if (strncasecmp(val, "YES", MAX(vallen, 1)) == 0)
357
434
job_msg.shared = 1;
358
else if (strcasecmp(&argv[i][7], "NO") == 0)
435
else if (strncasecmp(val, "NO", MAX(vallen, 1)) == 0)
359
436
job_msg.shared = 0;
362
(uint16_t) strtol(&argv[i][7],
439
(uint16_t) strtol(val,
363
440
(char **) NULL, 10);
366
else if (strncasecmp(argv[i], "Contiguous=", 11) == 0) {
367
if (strcasecmp(&argv[i][11], "YES") == 0)
443
else if (strncasecmp(tag, "Contiguous", MAX(taglen, 3)) == 0) {
444
if (strncasecmp(val, "YES", MAX(vallen, 1)) == 0)
368
445
job_msg.contiguous = 1;
369
else if (strcasecmp(&argv[i][11], "NO") == 0)
446
else if (strncasecmp(val, "NO", MAX(vallen, 1)) == 0)
370
447
job_msg.contiguous = 0;
372
449
job_msg.contiguous =
373
(uint16_t) strtol(&argv[i][11],
450
(uint16_t) strtol(val,
374
451
(char **) NULL, 10);
377
else if (strncasecmp(argv[i], "ExcNodeList=", 12) == 0) {
378
job_msg.exc_nodes = &argv[i][12];
381
else if (strncasecmp(argv[i], "ReqNodeList=", 12) == 0) {
382
job_msg.req_nodes = &argv[i][12];
385
else if (strncasecmp(argv[i], "Features=", 9) == 0) {
386
job_msg.features = &argv[i][9];
389
else if (strncasecmp(argv[i], "Account=", 8) == 0) {
390
job_msg.account = &argv[i][8];
393
else if (strncasecmp(argv[i], "Dependency=", 11) == 0) {
394
job_msg.dependency = &argv[i][11];
454
else if (strncasecmp(tag, "ExcNodeList", MAX(taglen, 1)) == 0) {
455
job_msg.exc_nodes = val;
458
else if (strncasecmp(tag, "ReqNodeList", MAX(taglen, 8)) == 0) {
459
job_msg.req_nodes = val;
462
else if (strncasecmp(tag, "Features", MAX(taglen, 1)) == 0) {
463
job_msg.features = val;
466
else if (strncasecmp(tag, "Account", MAX(taglen, 1)) == 0) {
467
job_msg.account = val;
470
else if (strncasecmp(tag, "Dependency", MAX(taglen, 1)) == 0) {
471
job_msg.dependency = val;
398
else if (strncasecmp(argv[i], "Geometry=", 9) == 0) {
475
else if (strncasecmp(tag, "Geometry", MAX(taglen, 1)) == 0) {
399
476
char* token, *delimiter = ",x", *next_ptr;
401
478
uint16_t geo[SYSTEM_DIMENSIONS];
402
char* geometry_tmp = xstrdup(&argv[i][9]);
479
char* geometry_tmp = xstrdup(val);
403
480
char* original_ptr = geometry_tmp;
404
481
token = strtok_r(geometry_tmp, delimiter, &next_ptr);
405
482
for (j=0; j<SYSTEM_DIMENSIONS; j++) {