source: branches/slurm-drmaa-1.2.0/slurm_drmaa/util.c @ 38

Revision 38, 16.2 KB checked in by pkopta, 11 years ago (diff)
  • Property svn:executable set to *
  • Property svn:keywords set to Id
RevLine 
[1]1/*
2 * PSNC DRMAA for SLURM
[13]3 * Copyright (C) 2011 Poznan Supercomputing and Networking Center
[1]4 *
5 *  This program is free software: you can redistribute it and/or modify
6 *  it under the terms of the GNU General Public License as published by
7 *  the Free Software Foundation, either version 3 of the License, or
8 *  (at your option) any later version.
9 *
10 *  This program is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 *  GNU General Public License for more details.
14 *
15 *  You should have received a copy of the GNU General Public License
16 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19#include <drmaa_utils/common.h>
20#include <drmaa_utils/exception.h>
21#include <slurm_drmaa/util.h>
22#include <string.h>
23
24#include <time.h>
25#include <drmaa_utils/datetime.h>
26#include <drmaa_utils/datetime_impl.h>
27
28#ifndef lint
29static char rcsid[]
30#       ifdef __GNUC__
31                __attribute__ ((unused))
32#       endif
[5]33        = "$Id$";
[1]34#endif
35
[24]36unsigned int
[1]37slurmdrmaa_datetime_parse( const char *string )
38{
39#ifdef DEBUGGING
40        char dbg[256];
41#endif
42        fsd_dt_parser_t *volatile parser = NULL;
43        fsd_dt_lexer_t *volatile lexer = NULL;
44        int parse_err = 0;
45        fsd_datetime_t dt;
46
47        memset(&dt, 0, sizeof(fsd_datetime_t));
48
49        fsd_log_enter(( "(%s)", string ));
50        TRY
51         {
52                fsd_malloc( parser, fsd_dt_parser_t );
53                fsd_malloc( lexer, fsd_dt_lexer_t );
54
55                parser->lexer = lexer;
56                parser->n_errors = 0;
57                lexer->parser = parser;
58                lexer->begin = lexer->p = (unsigned char*)string;
59                lexer->end = (unsigned char*)( string + strlen(string) );
60                parse_err = fsd_dt_parse( parser, lexer );
61                if( parse_err || parser->n_errors )
62                        fsd_exc_raise_fmt(
63                                        FSD_ERRNO_INVALID_VALUE_FORMAT,
64                                        "invalid date/time format: %s", string
65                                        );
66
67                dt = parser->result;
68#ifdef DEBUGGING
69                fsd_datetime_dump( &dt, dbg, sizeof(dbg) );
70                fsd_log_debug(( "parsed: %s", dbg ));
71#endif
72        }
73        FINALLY
74         {
75                fsd_free( parser );
76                fsd_free( lexer );
77         }
78        END_TRY
79
[24]80        fsd_log_return(( "(%s) =%u minutes", string, (unsigned)60*dt.hour+dt.minute ));
[1]81        return 60*dt.hour+dt.minute;
82}
83
[28]84/* taken from SLURM src/common/proc_args.c */
85static int slurmdrmaa_mail_type_parse(const char *mail_type_str)
86{
87        int rc = 0;
88
89
90        if (strcasecmp(mail_type_str, "BEGIN") == 0)
91                rc = MAIL_JOB_BEGIN;
92        else if (strcasecmp(mail_type_str, "END") == 0)
93                rc = MAIL_JOB_END;
94        else if (strcasecmp(mail_type_str, "FAIL") == 0)
95                rc = MAIL_JOB_FAIL;
96        else if (strcasecmp(mail_type_str, "REQUEUE") == 0)
97                rc = MAIL_JOB_REQUEUE;
98        else if (strcasecmp(mail_type_str, "ALL") == 0)
99                rc = MAIL_JOB_BEGIN | MAIL_JOB_END | MAIL_JOB_FAIL | MAIL_JOB_REQUEUE;
[29]100        else {
101                fsd_log_error(("Unknown mail type: %s", mail_type_str));
102        }
[28]103
104        return rc;
105}
106
107
[1]108enum slurm_native {
109        SLURM_NATIVE_ACCOUNT,
110        SLURM_NATIVE_ACCTG_FREQ,
111        SLURM_NATIVE_COMMENT,
112        SLURM_NATIVE_CONSTRAINT,
113        SLURM_NATIVE_CONTIGUOUS,
[35]114        SLURM_NATIVE_CPUS_PER_TASK,
[1]115        SLURM_NATIVE_EXCLUSIVE,
116        SLURM_NATIVE_MEM,
117        SLURM_NATIVE_MEM_PER_CPU,
118        SLURM_NATIVE_MINCPUS,
119        SLURM_NATIVE_NODELIST,
120        SLURM_NATIVE_NODES,
121        SLURM_NATIVE_NTASKS_PER_NODE,
122        SLURM_NATIVE_PARTITION,
123        SLURM_NATIVE_QOS,
124        SLURM_NATIVE_REQUEUE,
125        SLURM_NATIVE_RESERVATION,
[18]126        SLURM_NATIVE_SHARE,
[19]127        SLURM_NATIVE_JOB_NAME,
[24]128        SLURM_NATIVE_TIME_LIMIT,
[28]129        SLURM_NATIVE_NTASKS,
130        SLURM_NATIVE_GRES,
131        SLURM_NATIVE_NO_KILL,
132        SLURM_NATIVE_LICENSES,
133        SLURM_NATIVE_MAIL_TYPE,
134        SLURM_NATIVE_NO_REQUEUE,
[30]135        SLURM_NATIVE_EXCLUDE,
136        SLURM_NATIVE_TMP
[1]137};
138
139void
140slurmdrmaa_init_job_desc(job_desc_msg_t *job_desc)
141{
142        memset(job_desc, 0, sizeof(job_desc_msg_t));
143}
144
145void
146slurmdrmaa_free_job_desc(job_desc_msg_t *job_desc)
147{
148        unsigned i = 0;
149        fsd_log_enter(( "" ));
150        fsd_free(job_desc->account);   
151        fsd_free(job_desc->comment);
152       
153        for(i = 0;i<job_desc->env_size;i++)
154        {
155                fsd_free(job_desc->environment[i]);
156        }       
157        fsd_free(job_desc->environment);
158        fsd_free(job_desc->features);
159        fsd_free(job_desc->name);       
160        fsd_free(job_desc->mail_user);
161        fsd_free(job_desc->partition);
162        fsd_free(job_desc->qos);
163        fsd_free(job_desc->script);
164        fsd_free(job_desc->std_in);
165        fsd_free(job_desc->std_out);
166        fsd_free(job_desc->std_err);   
167        fsd_free(job_desc->work_dir);
[29]168        fsd_free(job_desc->exc_nodes);
[28]169        fsd_free(job_desc->gres);
[38]170        fsd_free(job_desc->array_inx);
[1]171       
172        fsd_log_return(( "" ));
173}
174
175void
176slurmdrmaa_add_attribute(job_desc_msg_t *job_desc, unsigned attr, const char *value)
177{
178        char * ptr = NULL;
179        char * rest = NULL;
180        char * token = NULL;
181
182        switch(attr)
183        {
184                case SLURM_NATIVE_ACCOUNT:
185                        fsd_free(job_desc->account);
186                        fsd_log_debug(("# account = %s",value));
187                        job_desc->account = fsd_strdup(value);
188                        break;
189                case SLURM_NATIVE_ACCTG_FREQ:
190                        fsd_log_debug(("# acctg_freq = %s",value));
191                        job_desc->acctg_freq = fsd_atoi(value);
192                        break;
193                case SLURM_NATIVE_COMMENT:
194                        fsd_free(job_desc->comment);
195                        fsd_log_debug(("# comment = %s",value));
196                        job_desc->comment = fsd_strdup(value);
197                        break;
198                case SLURM_NATIVE_CONSTRAINT:
199                        fsd_free(job_desc->features);
200                        fsd_log_debug(("# constraints -> features = %s",value));
201                        job_desc->features = fsd_strdup(value);
202                        break;
203                case SLURM_NATIVE_CONTIGUOUS:
204                        fsd_log_debug(( "# contiguous = 1"));
205                        job_desc->contiguous = 1;
206                        break;
[35]207                case SLURM_NATIVE_CPUS_PER_TASK:
208                        fsd_log_debug(( "# cpus_per_task = %s", value));
209            job_desc->cpus_per_task = fsd_atoi(value);
210                        break;
[1]211                case SLURM_NATIVE_EXCLUSIVE:
212                        fsd_log_debug(( "# exclusive -> shared = 0"));
213                        job_desc->shared = 0;
214                        break;
215                case SLURM_NATIVE_MEM:
[13]216                        if(job_desc->pn_min_memory == NO_VAL ||  fsd_atoi(value) > (int)job_desc->pn_min_memory) {
217                                fsd_log_debug(("# pn_min_memory = %s",value));
218                                job_desc->pn_min_memory = fsd_atoi(value);
219                        }
220                        else {
[1]221                                fsd_log_debug(("mem value defined lower or equal to mem-per-cpu or value defined before"));
222                        }
223                        break;
224                case SLURM_NATIVE_MEM_PER_CPU:
[13]225                        if(job_desc->pn_min_memory == NO_VAL ||  fsd_atoi(value) > (int)job_desc->pn_min_memory) {
[31]226                                fsd_log_debug(("# pn_min_memory (MEM_PER_CPU) = %s",value));
227                                job_desc->pn_min_memory = fsd_atoi(value) | MEM_PER_CPU;
[13]228                        }
229                        else {
[1]230                                fsd_log_debug(("mem-per-cpu value defined lower or equal to mem or value defined before"));
231                        }
232                        break;
233                case SLURM_NATIVE_MINCPUS:
[35]234                        fsd_log_debug(("# pn_min_cpus = %s",value));
235                        job_desc->pn_min_cpus = fsd_atoi(value);
[1]236                        break;
237                case SLURM_NATIVE_NODELIST:
238                        fsd_free(job_desc->req_nodes);
239                        fsd_log_debug(("# node-list - > req_nodes = %s",value));
240                        job_desc->req_nodes = fsd_strdup(value);
241                        break;
242                case SLURM_NATIVE_NODES:
243                        ptr = strdup(value);
[24]244                       
[1]245                        if((token = strtok_r(ptr,"=",&rest)) == NULL){
246                                fsd_log_error(("strtok_r returned NULL"));
247                        }
248                                               
249                        fsd_log_debug(("nodes: %s ->",value));
250                        fsd_log_debug(("# min_nodes = %s",token));
251                        job_desc->min_nodes = fsd_atoi(token);
252                                               
253                        if(strcmp(rest,"") !=0 ) {
254                                fsd_log_debug(("# max_nodes = %s",rest));
255                                job_desc->max_nodes = fsd_atoi(rest);
256                        }
257                        fsd_free(ptr);
258                        break;         
259                case SLURM_NATIVE_NTASKS_PER_NODE:
260                        fsd_log_debug(("# ntasks_per_node = %s",value));
261                        job_desc->ntasks_per_node = fsd_atoi(value);
262                        break;
263                case SLURM_NATIVE_PARTITION:
264                        fsd_free(job_desc->partition);
265                        fsd_log_debug(("# partition = %s",value));
266                        job_desc->partition = fsd_strdup(value);
267                        break;
268                case SLURM_NATIVE_QOS:
269                        fsd_free(job_desc->qos);
270                        fsd_log_debug(("# qos = %s",value));
271                        job_desc->qos = fsd_strdup(value);
272                        break;
273                case SLURM_NATIVE_REQUEUE:
274                        fsd_log_debug(( "# requeue = 1"));
275                        job_desc->requeue = 1;
276                        break;
277                case SLURM_NATIVE_RESERVATION:
278                        fsd_log_debug(("# reservation = %s",value));
279                        job_desc->reservation = fsd_strdup(value);
280                        break;
281                case SLURM_NATIVE_SHARE:
282                        fsd_log_debug(("# shared = 1"));
283                        job_desc->shared = 1;
284                        break;
[18]285                case SLURM_NATIVE_JOB_NAME:
[24]286                        fsd_log_debug(("# job_name = %s",job_desc->name));
287                        job_desc->name = fsd_strdup(value);
[18]288                        break;
[24]289                case SLURM_NATIVE_NTASKS:
290                        fsd_log_debug(("# ntasks = %s",value));
291                        job_desc->num_tasks = fsd_atoi(value);
292                        break; 
293                case SLURM_NATIVE_TIME_LIMIT:
294                        fsd_log_debug(("# time_limit = %s",value));
295                        job_desc->time_limit = slurmdrmaa_datetime_parse(value);
296                        break; 
[28]297                case SLURM_NATIVE_GRES:
298                        fsd_log_debug(("# gres = %s",value));
299                        job_desc->gres = fsd_strdup(value);
300                        break;
301                case SLURM_NATIVE_NO_KILL:
302                        fsd_log_debug(("# no_kill = 1"));
303                        job_desc->kill_on_node_fail = 0;
304                        break;
305                case SLURM_NATIVE_LICENSES:
306                        fsd_log_debug(("# licenses = %s", value));
307                        job_desc->licenses = fsd_strdup(value);
308                        break;
309                case SLURM_NATIVE_MAIL_TYPE:
310                        fsd_log_debug(("# mail_type = %s", value));
311                        job_desc->mail_type = slurmdrmaa_mail_type_parse(value);
312                        break;
313                case SLURM_NATIVE_NO_REQUEUE:
314                        fsd_log_debug(("# requeue = 0"));
315                        job_desc->requeue = 0;
316                        break;
317                case SLURM_NATIVE_EXCLUDE:
318                        fsd_log_debug(("# exclude = %s", value));
319                        job_desc->exc_nodes = fsd_strdup(value);
320                        break;
[30]321                case SLURM_NATIVE_TMP:
322                        fsd_log_debug(("# tmp = %s", value));
[37]323                        job_desc->pn_min_tmp_disk = fsd_atoi(value);
[30]324                        break;
[1]325                default:
326                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,"Invalid attribute");
327        }
328}
329
330void
331slurmdrmaa_parse_additional_attr(job_desc_msg_t *job_desc,const char *add_attr)
332{
333        char * volatile name = NULL;
334        char *value = NULL;
335        char *ctxt = NULL;
336        char * volatile add_attr_copy = fsd_strdup(add_attr);
337
[35]338        fsd_log_enter(( "" ));
339
[1]340        TRY
341          {
342                name = fsd_strdup(strtok_r(add_attr_copy, "=", &ctxt));
343                value = strtok_r(NULL, "=", &ctxt);
[28]344                /*
345                 * TODO: move it to slurmdrmaa_add_attribute
346                 if (value == NULL) {
[24]347                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,
348                                "Invalid native specification: %s Missing '='.", add_attr_copy);
[28]349                } */
[24]350
[1]351                if(strcmp(name,"account") == 0) {
352                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_ACCOUNT,value);
353                }
354                else if(strcmp(name,"acctg-freq") == 0) {
355                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_ACCTG_FREQ,value);
356                }
357                else if (strcmp(name,"comment") == 0) {
358                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_COMMENT,value);
359                }
360                else if (strcmp(name,"constraint") == 0) {
361                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_CONSTRAINT,value);
362                }
363                else if (strcmp(name,"contiguous") == 0) {
364                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_CONTIGUOUS,NULL);
365                }
[35]366                else if (strcmp(name,"cpus-per-task") == 0) {
367                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_CPUS_PER_TASK,value);
368                }
[1]369                else if(strcmp(name,"exclusive") == 0) {
370                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_EXCLUSIVE,NULL);
371                }
372                else if (strcmp(name,"mem") == 0) {
373                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_MEM,value);
374                }
375                else if (strcmp(name,"mem-per-cpu") == 0) {
376                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_MEM_PER_CPU,value);
377                }
378                else if (strcmp(name,"mincpus") == 0) {
379                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_MINCPUS,value);
380                }
381                else if (strcmp(name,"nodelist") == 0) {
382                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NODELIST,value);                 
383                }
384                else if (strcmp(name,"nodes") == 0) {
385                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NODES,value);
386                }
387                else if (strcmp(name,"ntasks-per-node") == 0) {
388                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NTASKS_PER_NODE,value);
389                }
390                else if (strcmp(name,"partition") == 0) {
391                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_PARTITION,value);
392                }
393                else if (strcmp(name,"qos") == 0) {
394                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_QOS,value);
395                }
396                else if (strcmp(name,"requeue") == 0) {
397                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_REQUEUE,NULL);
398                }
399                else if (strcmp(name,"reservation") == 0) {
400                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_RESERVATION,value);
401                }
402                else if (strcmp(name,"share") == 0) {
403                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_SHARE,NULL);
404                }               
[28]405                else if(strcmp(name,"job_name") == 0) {
406                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_JOB_NAME,value);
407                }
408                else if(strcmp(name,"time_limit") == 0) {
409                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_TIME_LIMIT,value);
410                }
[22]411                else if(strcmp(name,"time") == 0) {
[28]412                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_TIME_LIMIT,value);
413                }
414                else if(strcmp(name,"ntasks") == 0) {
415                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NTASKS,value);
416                }
417                else if(strcmp(name,"gres") == 0) {
418                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_GRES,value);
419                }
420                else if(strcmp(name,"no-kill") == 0) {
421                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NO_KILL,NULL);
422                }
423                else if(strcmp(name,"licenses") == 0) {
424                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_LICENSES,value);
425                }
426                else if(strcmp(name,"mail-type") == 0) {
427                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_MAIL_TYPE,value);
428                }
429                else if(strcmp(name,"no-requeue") == 0) {
430                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NO_REQUEUE,NULL);
431                }
432                else if(strcmp(name,"exclude") == 0) {
433                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_EXCLUDE,value);
434                }
[30]435                else if(strcmp(name,"tmp") == 0) {
436                        slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_TMP,value);
437                } else {
[1]438                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,
439                                        "Invalid native specification: %s (Unsupported option: --%s)",
440                                        add_attr, name);
441                }
442       
443          }
444        FINALLY
445          {
446                fsd_free(name);
447                fsd_free(add_attr_copy);
448          }
449        END_TRY
[35]450        fsd_log_return(( "" ));
[1]451}
452
453void
454slurmdrmaa_parse_native(job_desc_msg_t *job_desc, const char * value)
455{
456        char *arg = NULL;
457        char * volatile native_specification = fsd_strdup(value);
458        char * volatile native_spec_copy = fsd_strdup(native_specification);
459        char * ctxt = NULL;
460        int opt = 0;
461               
462        fsd_log_enter(( "" ));
463        TRY
464         {
465                for (arg = strtok_r(native_spec_copy, " \t", &ctxt); arg; arg = strtok_r(NULL, " \t",&ctxt) ) {
466                        if (!opt) {
467                                if ( (arg[0] != '-') || ((strlen(arg) != 2) && (strlen(arg) > 2) && arg[2] != ' ' && arg[1] !='-' ) ) {
468                                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,
469                                                        "Invalid native specification: %s",
470                                                        native_specification);
471                                }
472                                if(arg[1] == '-') {
473                                        slurmdrmaa_parse_additional_attr(job_desc, arg+2);
474                                }
475                                else {
476                                        opt = arg[1];
477                                }               
478                        } else {
[28]479                                switch (opt) {
[1]480                                        case 'A' :
481                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_ACCOUNT, arg);
482                                                break;
483                                        case 'C' :
484                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_CONSTRAINT, arg);
485                                                break; 
[35]486                                        case 'c' :
487                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_CPUS_PER_TASK, arg);
488                                                break; 
[1]489                                        case 'N' :     
490                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NODES, arg);
491                                                break; 
492                                        case 'p' :
493                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_PARTITION, arg);
494                                                break;
495                                        case 's' :
496                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_SHARE, NULL);
[28]497                                                break;
[1]498                                        case 'w' :
499                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NODELIST, arg);
[18]500                                                break;
501                                        case 'J' :
502                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_JOB_NAME, arg);
[28]503                                                break;
[24]504                                        case 't' :
505                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_TIME_LIMIT, arg);
506                                                break; 
507                                        case 'n' :
508                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_NTASKS, arg);
509                                                break; 
[28]510                                        case 'x' :
511                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_EXCLUDE, arg);
512                                                break;
[33]513                                        case 'L' :
514                                                slurmdrmaa_add_attribute(job_desc,SLURM_NATIVE_LICENSES, arg);
515                                                break;                                                 
[28]516                                        default :
[1]517                                                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,
518                                                                        "Invalid native specification: %s (Unsupported option: -%c)",
519                                                                        native_specification, opt);
520                                }
521                                if (arg[0] == '-' && strlen(arg) == 2) { /* attribute without arg */
522                                        opt = arg[1];
523                                }
524                                else {
525                                        opt = 0;
526                                }
527                        }
528                }
529
530                if(strlen(native_spec_copy) == 2 && native_spec_copy[0] == '-' && native_spec_copy[1] == 's')
531                {
532                        slurmdrmaa_add_attribute(job_desc, SLURM_NATIVE_SHARE, NULL);
533                        opt = 0;
534                }
535               
536                if (opt)
537                        fsd_exc_raise_fmt(FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE,
538                                        "Invalid native specification: %s",
539                                        native_specification);
540
541         }
542        FINALLY
543         {
[35]544        fsd_log_debug(( "finalizing job constraints" ));
545        if( job_desc->cpus_per_task > 0 ) {
546            job_desc->min_cpus = job_desc->num_tasks * job_desc->cpus_per_task ;
547            fsd_log_debug((
548                        "set min_cpus to ntasks*cpus_per_task: %d",
549                        job_desc->min_cpus
550                        ));
551        } else {
552            job_desc->min_cpus = job_desc->num_tasks ;
553            fsd_log_debug((
554                        "set min_cpus to ntasks: %d",
555                        job_desc->min_cpus
556                        ));
557        }
[1]558                fsd_free(native_spec_copy);
559                fsd_free(native_specification);
560         }
561        END_TRY
562
563        fsd_log_return(( "" ));
564}
565
Note: See TracBrowser for help on using the repository browser.