Ignore:
Timestamp:
12/07/11 18:00:32 (12 years ago)
Author:
mmamonski
Message:

node_properties and custom_resources support. Now one can request resources via env variable

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/pbs_drmaa/submit.c

    r45 r48  
    4949#endif 
    5050 
    51 static void 
    52 pbsdrmaa_submit_destroy( pbsdrmaa_submit_t *self ); 
    53  
    54 static char * 
    55 pbsdrmaa_submit_submit( pbsdrmaa_submit_t *self ); 
    56  
    57 static void 
    58 pbsdrmaa_submit_eval( pbsdrmaa_submit_t *self ); 
    59  
    60  
    61 static void 
    62 pbsdrmaa_submit_set( pbsdrmaa_submit_t *self, const char *pbs_attr, 
    63                 char *value, unsigned placeholders ); 
     51static void pbsdrmaa_submit_destroy( pbsdrmaa_submit_t *self ); 
     52 
     53static char *pbsdrmaa_submit_submit( pbsdrmaa_submit_t *self ); 
     54 
     55static void pbsdrmaa_submit_eval( pbsdrmaa_submit_t *self ); 
     56 
     57static void pbsdrmaa_submit_set( pbsdrmaa_submit_t *self, const char *pbs_attr, char *value, unsigned placeholders ); 
    6458 
    6559static void pbsdrmaa_submit_apply_defaults( pbsdrmaa_submit_t *self ); 
     
    10195                self->apply_job_environment = pbsdrmaa_submit_apply_job_environment; 
    10296                self->apply_email_notification = pbsdrmaa_submit_apply_email_notification; 
    103                 self->apply_native_specification = 
    104                         pbsdrmaa_submit_apply_native_specification; 
     97                self->apply_native_specification = pbsdrmaa_submit_apply_native_specification; 
    10598 
    10699                self->pbs_job_attributes = pbsdrmaa_pbs_template_new(); 
     
    143136        TRY 
    144137         { 
    145                 const fsd_template_t *pbs_tmpl = self->pbs_job_attributes; 
    146                 unsigned i; 
     138                fsd_template_t *pbs_tmpl = self->pbs_job_attributes; 
     139                int i; 
    147140                int tries_left = ((pbsdrmaa_session_t *)self->session)->max_retries_count; 
    148141                int sleep_time = 1; 
    149142 
    150                 for( i = 0;  i < PBSDRMAA_N_PBS_ATTRIBUTES;  i++ ) 
     143                for( i = PBSDRMAA_N_PBS_ATTRIBUTES - 1; i >= 0; i-- ) /* down loop -> start with custom resources */ 
    151144                 { 
    152145                        const char *name = pbs_tmpl->by_code( pbs_tmpl, i )->name; 
    153                         if( name  &&  name[0] != '!' && pbs_tmpl->get_attr( pbs_tmpl, name ) ) 
     146                        const char *value = pbs_tmpl->get_attr( pbs_tmpl, name ); 
     147 
     148                        if (!value) 
     149                                continue; 
     150 
     151                        if ( i == PBSDRMAA_ATTR_CUSTOM_RESOURCES) 
    154152                         { 
    155                                 const char *value; 
    156  
    157                                 value = pbs_tmpl->get_attr( pbs_tmpl, name ); 
     153                                char *value_copy = fsd_strdup(value); 
     154                                char *tok_comma_ctx = NULL; 
     155                                char *res_token = NULL; 
     156                                /* matlab:2,simulink:1 */ 
     157 
     158                                for (res_token = strtok_r(value_copy, ",", &tok_comma_ctx); res_token; res_token = strtok_r(NULL, ",", &tok_comma_ctx)) 
     159                                 { 
     160                                        char *value_p = strstr(res_token, ":"); 
     161 
     162                                        if (value_p) 
     163                                         { 
     164                                                char *name_p = NULL; 
     165                                                *value_p = '\0'; 
     166                                                value_p++; 
     167                                                name_p = fsd_asprintf("Resource_List.%s",res_token); 
     168                                                pbs_attr = pbsdrmaa_add_attr( pbs_attr, name_p, value_p ); 
     169                                                fsd_free(name_p); 
     170                                         } 
     171                                        else 
     172                                         { 
     173                                                fsd_exc_raise_code( FSD_DRMAA_ERRNO_INVALID_ATTRIBUTE_VALUE ); 
     174                                         } 
     175                                 } 
     176 
     177                                fsd_free(value_copy); 
     178                         } 
     179                        else if (i == PBSDRMAA_ATTR_NODE_PROPERTIES) 
     180                         { 
     181                                const char *nodes_value = pbs_tmpl->get_attr( pbs_tmpl, PBSDRMAA_NODES ); 
     182                                char *final_value = NULL; 
     183 
     184                                if (!nodes_value) 
     185                                 { 
     186                                        final_value = fsd_asprintf("%s:%s",nodes_value, value); 
     187                                 } 
     188                                else 
     189                                 { 
     190                                        final_value = fsd_asprintf("1:%s", value); 
     191                                 } 
     192 
     193                                pbs_tmpl->set_attr( pbs_tmpl, PBSDRMAA_NODES, final_value); 
     194                                fsd_free(final_value); 
     195                         } 
     196                        else 
     197                         { 
    158198                                pbs_attr = pbsdrmaa_add_attr( pbs_attr, name, value ); 
    159199                         } 
     
    448488} 
    449489 
     490 
     491 
    450492void 
    451493pbsdrmaa_submit_apply_job_environment( pbsdrmaa_submit_t *self ) 
     
    471513 
    472514        if (env_v) 
    473         { 
     515         { 
    474516                ii = 0; 
    475                 while (env_v[ii]) { 
     517                while (env_v[ii]) 
     518                 { 
    476519                        len += strlen(env_v[ii]) + 1; 
    477520                        ii++; 
    478                 } 
    479         } 
     521                 } 
     522         } 
    480523         
    481524        len+= strlen("PBS_O_WORKDIR=") + strlen(wd); 
     
    531574} 
    532575 
    533 static void parse_resources(fsd_template_t *pbs_attr,const char *resources) 
     576static const char *get_job_env(pbsdrmaa_submit_t *self, const char *env_name) 
     577{ 
     578        const fsd_template_t *jt = self->job_template; 
     579        const char *const *env_v = jt->get_v_attr( jt, DRMAA_V_ENV); 
     580        int ii = 0; 
     581 
     582        while (env_v[ii]) 
     583         { 
     584                char *eq_p = strstr(env_v[ii], "="); 
     585 
     586                if ((eq_p) && (strncmp(env_v[ii], env_name, eq_p - env_v[ii]) == 0)) 
     587                                return ++eq_p; 
     588 
     589                ii++; 
     590         } 
     591 
     592        return NULL; 
     593} 
     594 
     595static void parse_resources(pbsdrmaa_submit_t *self, fsd_template_t *pbs_attr,const char *resources) 
    534596{ 
    535597        char * volatile name = NULL; 
     
    550612                                name = fsd_asprintf("Resource_List.%s", arg); 
    551613                                value = ++psep; 
    552                                 pbs_attr->set_attr( pbs_attr, name , value ); 
     614                                if (value[0] == '$' && get_job_env(self, value + 1)) 
     615                                        pbs_attr->set_attr( pbs_attr, name , get_job_env(self, value + 1) ); /*get value from job env variable */ 
     616                                else 
     617                                        pbs_attr->set_attr( pbs_attr, name , value ); 
    553618                                fsd_free(name); 
    554619                                name = NULL; 
     
    600665                const char *native_specification ) 
    601666{ 
    602         fsd_log_enter(( "({native_specification=%s})", native_specification )); 
     667        fsd_log_enter(( "({native_specification=%s})", native_specification )); 
    603668 
    604669        if( native_specification == NULL ) 
     
    700765                                                        break; 
    701766                                                case 'l' : 
    702                                                         parse_resources(pbs_attr, arg); 
     767                                                        parse_resources( self, pbs_attr, arg); 
    703768                                                        break;                                                   
    704769                                                default : 
Note: See TracChangeset for help on using the changeset viewer.