/** \brief Export variable * * Either add another entry into a supplied vtable (used in start_process), or directly export the variable using setenv() (used in run_pelog). * * @param name Name of the variable * @param value Value of the variable * @param vtable Used when this is export into a controlled sub-process, otherwise NULL */ void export_variable(const char* name, const char* value, struct var_table *vtable) { if (vtable != NULL) bld_env_variables(vtable,(char*)name,(char*)value); else setenv(name,value,1); }
int add_env_variables( struct var_table *vtable, int n_env_vars, int n_mem_to_use) { char *buf; char *alphabet = strdup("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghigjklmnopqrstuvwxyz"); char *p, *bp, *ptest_block; int n = n_mem_to_use/n_env_vars; int m = n_mem_to_use % n_env_vars; int siz, i, j, len; char varname[64]; char *varNval; ptest_block = envBuffer; for (i=0; i < n_env_vars; i++) { if (i != (n_env_vars - 1)) siz = n; else siz = n + m; buf = (char *)calloc(siz, sizeof(char)); p = alphabet; bp = buf; for(j=0; j < (siz - 1); ++j) { if (*p == '\0') p = alphabet; *bp++ = *p++; } sprintf(varname, "var%d=", i); len = strlen(varname) + strlen(buf) + 1; varNval = (char *) calloc(len, sizeof(char)); sprintf(varNval, "%s%s", varname, buf); penv[i] = ptest_block; strcpy(penv[i], varNval); ptest_block += strlen(varNval) + 1; if (bld_env_variables(vtable, varNval, NULL) != PBSE_NONE) { return -1; } free(buf); free(varNval); } return 0; }
int CPACreatePartition( job *pjob, /* I */ struct var_table *vtab) /* I */ { char id[] = "CPACreatePartition"; cpa_node_req_t *NodeReq; int rc; char *Value; char *Spec; int PPN; int Flags; int Size = 0; int UID; char *AcctID = NULL; char *JobID; char *HostList = NULL; /* scheduler specified list of hosts to allocate (optional) */ unsigned long ParID; /* O - partition id */ unsigned long long AdminCookie; /* O - admin cookie */ unsigned long long AllocCookie; /* O - alloc cookie */ char longbuf[1024]; resource *presc; /* Requested Resource List */ resource_def *prd; attribute *pattr; int rc; cpa_nid_list_t Wanted = NULL; /* first, get the size, uid, jobid, and subnodelist from the job */ pattr = &pjob->ji_wattr[JOB_ATR_resource]; prd = find_resc_def(svr_resc_def, "size", svr_resc_size); presc = find_resc_entry(pattr, prd); if (presc != NULL) { Size = presc->rs_value.at_val.at_long; } UID = pjob->ji_qs.ji_un.ji_momt.ji_exuid; if ((Size <= 0) || (UID < 0)) { /* FAILURE */ sprintf(log_buffer, "ERROR: invalid parameters: Size: %d UID: %d \n", Size, UID); log_err(-1, id, log_buffer); return(1); } pattr = &pjob->ji_wattr[JOB_ATR_resource]; prd = find_resc_def(svr_resc_def, "subnode_list", svr_resc_size); presc = find_resc_entry(pattr, prd); if (presc != NULL) { HostList = presc->rs_value.at_val.at_string; } if (pjob->ji_wattr[JOB_ATR_account].at_flags & ATR_VFLAG_SET) { AcctID = pjob->ji_wattr[JOB_ATR_account].at_val.at_str; } JobID = pjob->ji_qs.ji_jobid; PPN = 1; /* NOTE: not really supported w/in CPA, always use 1 */ Flags = 0; /* NOTE: only allocate compute hosts, always use 0 */ Spec = NULL; /* NOTE: required node specification, not used */ if (HostList != NULL) { char tmpBuffer[256000]; int index; rc = nid_list_create( 0, MaxListSize, /* max count */ 0, MaxNID, /* max value */ &Wanted); /* O */ if (rc != 0) { /* FAILURE */ printf("nid_list_create: rc=%d (%s)\n", rc, cpa_rc2str(rc)); return(1); } strncpy(tmpBuffer, HostList, sizeof(tmpBuffer)); tmpBuffer[sizeof(tmpBuffer) - 1] = '\0'; for (index = 0;tmpBuffer[index] != '\0';index++) { if (tmpBuffer[index] == ':') tmpBuffer[index] = ','; } rc = nid_list_destringify(tmpBuffer, Wanted); if (rc != 0) { /* FAILURE */ printf("nid_list_destringify: rc=%d (%s)\n", rc, cpa_rc2str(rc)); nid_list_destroy(Wanted); return(1); } if (loglevel >= 3) { char *buf = NULL; int bufsize = 0; rc = nid_list_stringify(Wanted, &buf, &bufsize); if (rc == 0) { snprintf(log_buffer, sizeof(log_buffer), "CPANodeList: %s\n", buf); } else { snprintf(log_buffer, sizeof(log_buffer), "CPA nid_list_stringify: rc=%d\n", rc); } log_record( PBSEVENT_JOB, PBS_EVENTCLASS_JOB, pjob->ji_qs.ji_jobid, log_buffer); free(buf); } } else { Wanted = NULL; } NodeReq = cpa_new_node_req( Size, /* number of procs/nodes required by job */ PPN, Flags, Spec, Wanted); /* I */ if (NodeReq == NULL) { /* FAILURE: cannot alloc memory for node req */ sprintf(log_buffer, "cpa_new_node_req: NULL\n"); log_err(-1, id, log_buffer); nid_list_destroy(Wanted); return(1); } rc = cpa_create_partition( NodeReq, CPA_BATCH, CPA_NOT_SPECIFIED, UID, (AcctID != NULL) ? AcctID : "DEFAULT", (cpa_partition_id_t *) & ParID, /* O */ (cpa_cookie_t *) & AdminCookie, /* O */ (cpa_cookie_t *) & AllocCookie); /* O */ if (rc != 0) { /* FAILURE */ sprintf(log_buffer, "cpa_create_partition: rc=%d (%s)\n", rc, cpa_rc2str(rc)); log_err(-1, id, log_buffer); nid_list_destroy(Wanted); return(1); } rc = cpa_assign_partition( (cpa_partition_id_t)ParID, (cpa_cookie_t)AdminCookie, JobID, 1); /* NOT CURRENTLY USED - should be set to NID of 'master host' */ /* free memory, nid list no longer required */ nid_list_destroy(Wanted); if (rc != 0) { /* FAILURE */ sprintf(log_buffer, "cpa_assign_partition: rc=%d (%s)\n", rc, cpa_rc2str(rc)); log_err(-1, id, log_buffer); return(1); } /* save the partition and cookies in the job and vtab */ prd = find_resc_def(svr_resc_def, "cpapartition", svr_resc_size); if (prd == NULL) { return(PBSE_SYSTEM); } if ((presc = find_resc_entry(pattr, prd)) == NULL) { if ((presc = add_resource_entry(pattr, prd)) == NULL) { return(PBSE_SYSTEM); } } else { prd->rs_free(&presc->rs_value); } snprintf(longbuf, 1023, "%lu", ParID); prd->rs_decode(&presc->rs_value, NULL, NULL, longbuf); presc->rs_value.at_flags |= ATR_VFLAG_SET; bld_env_variables(vtab, "BATCH_PARTITION_ID", longbuf); prd = find_resc_def(svr_resc_def, "cpaadmincookie", svr_resc_size); if (prd == NULL) { return(PBSE_SYSTEM); } if ((presc = find_resc_entry(pattr, prd)) == NULL) { if ((presc = add_resource_entry(pattr, prd)) == NULL) { return(PBSE_SYSTEM); } } else { prd->rs_free(&presc->rs_value); } snprintf(longbuf, 1023, "%llu", AdminCookie); prd->rs_decode(&presc->rs_value, NULL, NULL, longbuf); presc->rs_value.at_flags |= ATR_VFLAG_SET; /* admincookie doesn't go into job env */ prd = find_resc_def(svr_resc_def, "cpaalloccookie", svr_resc_size); if (prd == NULL) { return(PBSE_SYSTEM); } if ((presc = find_resc_entry(pattr, prd)) == NULL) { if ((presc = add_resource_entry(pattr, prd)) == NULL) { return(PBSE_SYSTEM); } } else { prd->rs_free(&presc->rs_value); } snprintf(longbuf, 1023, "%llu", AllocCookie); prd->rs_decode(&presc->rs_value, NULL, NULL, longbuf); presc->rs_value.at_flags |= ATR_VFLAG_SET; bld_env_variables(vtab, "BATCH_ALLOC_COOKIE", longbuf); bld_env_variables(vtab, "BATCH_JOBID", JobID); return(0); } /* END CPACreatePartition() */