/****** qmaster/setup_qmaster/sge_setup_job_resend() *************************** * NAME * sge_setup_job_resend() -- Setup job resend events. * * SYNOPSIS * void sge_setup_job_resend(void) * * FUNCTION * Register a job resend event for each job or array task which does have a * 'JTRANSFERING' status. * * INPUTS * void - none * * RESULT * void - none * * NOTES * MT-NOTE: sge_setup_job_resend() is not MT safe * *******************************************************************************/ void sge_setup_job_resend(void) { lListElem *job = NULL; object_description *object_base = object_type_get_object_description(); DENTER(TOP_LAYER, "sge_setup_job_resend"); job = lFirst(*object_base[SGE_TYPE_JOB].list); while (NULL != job) { lListElem *task; u_long32 job_num; job_num = lGetUlong(job, JB_job_number); task = lFirst(lGetList(job, JB_ja_tasks)); while (NULL != task) { if (lGetUlong(task, JAT_status) == JTRANSFERING) { lListElem *granted_queue, *qinstance, *host; const char *qname; u_long32 task_num, when; te_event_t ev; task_num = lGetUlong(task, JAT_task_number); granted_queue = lFirst(lGetList(task, JAT_granted_destin_identifier_list)); qname = lGetString(granted_queue, JG_qname); qinstance = cqueue_list_locate_qinstance(*object_base[SGE_TYPE_CQUEUE].list, qname); host = host_list_locate(*object_base[SGE_TYPE_EXECHOST].list, lGetHost(qinstance, QU_qhostname)); when = lGetUlong(task, JAT_start_time); when += MAX(load_report_interval(host), MAX_JOB_DELIVER_TIME); ev = te_new_event((time_t)when, TYPE_JOB_RESEND_EVENT, ONE_TIME_EVENT, job_num, task_num, "job-resend_event"); te_add_event(ev); te_free_event(&ev); DPRINTF(("Did add job resend for "sge_u32"/"sge_u32" at %d\n", job_num, task_num, when)); } task = lNext(task); } job = lNext(job); } DEXIT; return; } /* sge_setup_job_resend() */
/****** sgeobj/var/var_list_split_prefix_vars() ******************************* * NAME * var_list_split_prefix_vars() -- split a list of variables * * SYNOPSIS * void var_list_split_prefix_vars(lList **varl, * lList **pefix_vars, * const char *prefix) * * FUNCTION * Move all variable elements form "varl" to "pefix_vars" which * begin with "prefix". *pefix_vars will be created if is does not * exist. * * INPUTS * lList **varl - VA_Type list * lList **pefix_vars - pointer to VA_Type list * const char *prefix - string (e.g. VAR_PREFIX) * * RESULT * void - None * * SEE ALSO * sgeobj/var/var_list_remove_prefix_vars() ******************************************************************************/ void var_list_split_prefix_vars(lList **varl, lList **pefix_vars, const char *prefix) { int prefix_len = strlen(prefix); lListElem *var_elem = NULL; lListElem *next_var_elem = NULL; DENTER(TOP_LAYER, "var_list_remove_prefix_vars"); next_var_elem = lFirst(*varl); while((var_elem = next_var_elem)) { const char *prefix_name = lGetString(var_elem, VA_variable); next_var_elem = lNext(var_elem); if (!strncmp(prefix_name, prefix, prefix_len)) { lListElem *dechained_elem = lDechainElem(*varl, var_elem); if (*pefix_vars == NULL) { *pefix_vars = lCreateList("", VA_Type); } lAppendElem(*pefix_vars, dechained_elem); } } DEXIT; return; }
/*-------------------------------------------------------------------------*/ void qmonSetCE_Type( Widget w, lList *lp, int full ) { lListElem *ep; int row; int max_rows; const char *ce_entry[CE_MAX]; int i; DENTER(GUI_LAYER, "qmonSetCE_Type"); XtVaGetValues(w, XmNrows, &max_rows, NULL); /* clear the area */ XtVaSetValues(w, XmNcells, NULL, NULL); for (ep = lFirst(lp), row = 0; ep; ep = lNext(ep), row++) { if (row == max_rows) { XbaeMatrixAddRows(w, max_rows, NULL, /* empty rows */ NULL, /* no lables */ NULL, /* no different colors */ 1); /* we add 1 row */ max_rows++; } if (getCE_TypeValues(ep, ce_entry)) { if (full) { for (i=0; i<CE_MAX; i++) { /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, i, ce_entry[i] ? (String)ce_entry[i] : ""); } } else { /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, 0, ce_entry[CE_NAME] ? (String)ce_entry[CE_NAME] : ""); /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, 1, ce_entry[CE_TYPE] ? (String)ce_entry[CE_TYPE] : ""); /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, 2, ce_entry[CE_RELOP] ? (String)ce_entry[CE_RELOP] : ""); } } else DPRINTF(("qmonSetCE_Type failure\n")); } DEXIT; }
/****** sgeobj/str/str_list_append_to_dstring() ******************************* * NAME * str_list_append_to_dstring() -- append strings to dstring * * SYNOPSIS * const char * * str_list_append_to_dstring(const lList *this_list, * dstring *string, * const char delimiter) * * FUNCTION * Append the strings contained in "this_list" to the dstring * "string". Separate them by the character contained in * "delimiter". * If "this_list" is NULL or conaines no elements, "NONE" will * be added to the dstring. * * INPUTS * const lList *this_list - ST_Type list * dstring *string - dynamic string * const char delimiter - delimiter * * RESULT * const char * - pointer to the given "string"-buffer * * SEE ALSO * sgeobj/str/str_list_parse_from_string() *******************************************************************************/ const char * str_list_append_to_dstring(const lList *this_list, dstring *string, const char delimiter) { const char *ret = NULL; DENTER(STR_LAYER, "str_list_append_to_dstring"); if (string != NULL) { lListElem *elem = NULL; bool printed = false; for_each(elem, this_list) { sge_dstring_append(string, lGetString(elem, ST_name)); if (lNext(elem) != NULL) { sge_dstring_sprintf_append(string, "%c", delimiter); } printed = true; }
int schedd_log_list(lList **monitor_alpp, bool monitor_next_run, const char *logstr, lList *lp, int nm) { int fields[] = { 0, 0 }; const char *delis[] = {NULL, " ", NULL}; lList *lp_part = NULL; lListElem *ep = NULL; DENTER(TOP_LAYER, "schedd_log_list"); #ifndef WIN32NATIVE if (monitor_alpp == NULL && !monitor_next_run) { DRETURN(0); } fields[0] = nm; for_each(ep, lp) { if (!lp_part) { lp_part = lCreateList("partial list", lGetListDescr(lp)); } lAppendElem(lp_part, lCopyElem(ep)); if ((lGetNumberOfElem(lp_part) == NUM_ITEMS_ON_LINE) || !lNext(ep)) { char log_string[2048]; sge_strlcpy(log_string, logstr, sizeof(log_string)); #ifndef WIN32NATIVE uni_print_list(NULL, log_string + strlen(log_string), sizeof(log_string) - strlen(log_string) - 1, lp_part, fields, delis, 0); #endif schedd_log(log_string, monitor_alpp, monitor_next_run); lFreeList(&lp_part); lp_part = NULL; } } #else DPRINTF(("schedd_log_list does nothing for QMonNT !!!\n")); #endif DEXIT; return 0; }
/****** sgeobj/var/var_list_remove_prefix_vars() ****************************** * NAME * var_list_remove_prefix_vars() -- remove vars with certain prefix * * SYNOPSIS * void var_list_remove_prefix_vars(lList **varl, * const char *prefix) * * FUNCTION * Remove all entries from "varl" where the name * beginns with "prefix" * * INPUTS * lList **varl - VA_Type list * const char *prefix - prefix string (e.g. VAR_PREFIX) * * SEE ALSO * sgeobj/var/var_list_remove_prefix_vars() ******************************************************************************/ void var_list_remove_prefix_vars(lList **varl, const char *prefix) { int prefix_len = strlen(prefix); lListElem *var_elem = NULL; lListElem *next_var_elem = NULL; DENTER(TOP_LAYER, "var_list_remove_prefix_vars"); next_var_elem = lFirst(*varl); while((var_elem = next_var_elem)) { const char *prefix_name = lGetString(var_elem, VA_variable); next_var_elem = lNext(var_elem); if (!strncmp(prefix_name, prefix, prefix_len)) { lRemoveElem(*varl, &var_elem); } } DEXIT; return; }
/****** SCHEDD/remove_immediate_jobs()****************************************** * NAME * remove_immediate_jobs() -- test for and remove immediate jobs which can't * be scheduled * * SYNOPSIS * int remove_immediate_jobs(lList *pending_job_list, lList *running_job_list, order_t *orders) * * FUNCTION * Goes through all jobs in the pending list to see if any are immediate and * not idle. If any are, they are removed. This is done by generating an * order of type ORT_remove_immediate_job. If any array jobs are removed, * the running list is checked for tasks belonging to the job, which are * also removed. This is done by removing the ORT_start_job orders and * adding an order of type ORT_remove_immediate_job. * * INPUTS * lList *pending_job_list - The list of pending jobs for this scheduler * pass (JB_Type) * lList *running_job_list - The list of running jobs for this scheduler * pass (JB_Type) * order_t *orders - The order structure for this scheduler pass * * RESULT * int - Error code: 0 = OK, 1 = Errors -- always returns 0 * * NOTES * MT-NOTE: remove_immediate_jobs() is MT safe * *******************************************************************************/ int remove_immediate_jobs(lList *pending_job_list, lList *running_job_list, order_t *orders) { lListElem *next_job, *job, *ep; lList* lp; DENTER (TOP_LAYER, "remove_immediate_jobs"); next_job = lFirst (pending_job_list); while ((job = next_job)) { lCondition *where = NULL; next_job = lNext(job); /* skip non immediate .. */ if (!JOB_TYPE_IS_IMMEDIATE(lGetUlong(job, JB_type))) { continue; } /* .. and non idle jobs */ if ((lp = lGetList(job, JB_ja_tasks)) && (ep = lFirst(lp)) && lGetUlong(ep, JAT_status)==JIDLE) { continue; } /* Prepare search condition for running list */ where = lWhere("%T(%I==%u)", JB_Type, JB_job_number, lGetUlong(job, JB_job_number)); /* Remove the job from the pending list */ remove_immediate_job(pending_job_list, job, orders, 0); /* If the job also exists in the running list, we need to remove it there * as well since array jobs are all or nothing. */ if ((job = lFindFirst(running_job_list, where)) != NULL) { remove_immediate_job(running_job_list, job, orders, 1); } lFreeWhere(&where); } DEXIT; return 0; }
/****** cull/dump_scan/lDumpList() ******************************************** * NAME * lDumpList() -- Writes a list to a FILE stream * * SYNOPSIS * int lDumpList(FILE *fp, const lList *lp, int indent) * * FUNCTION * Writes a list to a FILE stream. * * INPUTS * FILE *fp - file stream * const lList *lp - list * int indent - * * RESULT * int - error state * 0 - OK * -1 - Error * * NOTES * MT-NOTE: lDumpList() is not MT safe *******************************************************************************/ int lDumpList(FILE *fp, const lList *lp, int indent) { lListElem *ep; int i, ret = ~EOF; char space[256]; DENTER(CULL_LAYER, "lDumpList"); space[0] = '\0'; for (i = 0; i < indent; i++) strcat(space, INDENT_STRING); if (!fp) { LERROR(LEFILENULL); DEXIT; return -1; } if (!lp) { LERROR(LELISTNULL); DEXIT; return -1; } ret = fprintf(fp, "%s{ /* LIST BEGIN */\n", space); ret = fprintf(fp, "%s/* LISTNAME */ \"%s\"\n", space, lGetListName(lp)); ret = fprintf(fp, "%s/* NUMBER OF ELEMENTS */ %d\n", space, lGetNumberOfElem(lp)); ret = lDumpDescr(fp, lGetListDescr(lp), indent); for (ep = lFirst(lp); ep && ret != EOF; ep = lNext(ep)) ret = lDumpElemFp(fp, ep, indent); ret = fprintf(fp, "%s} /* LIST END */\n", space); DEXIT; return (ret == EOF) ? -1 : 0; }
bool sge_parse_qrsub(sge_gdi_ctx_class_t *ctx, lList *pcmdline, lList **alpp, lListElem **ar) { lListElem *ep = NULL, *next_ep = NULL; lList *lp = NULL; DENTER(TOP_LAYER, "sge_parse_qrsub"); /* -help print this help */ if ((ep = lGetElemStr(pcmdline, SPA_switch, "-help"))) { lRemoveElem(pcmdline, &ep); sge_usage(QRSUB, stdout); DEXIT; SGE_EXIT((void **)&ctx, 0); } /* -a date_time start time in [[CC]YY]MMDDhhmm[.SS] SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-a"))) { lSetUlong(*ar, AR_start_time, lGetUlong(ep, SPA_argval_lUlongT)); lRemoveElem(pcmdline, &ep); } /* -e date_time end time in [[CC]YY]MMDDhhmm[.SS] SGE_ULONG*/ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-e"))) { lSetUlong(*ar, AR_end_time, lGetUlong(ep, SPA_argval_lUlongT)); lRemoveElem(pcmdline, &ep); } /* -d time duration in TIME format SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-d"))) { lSetUlong(*ar, AR_duration, lGetUlong(ep, SPA_argval_lUlongT)); lRemoveElem(pcmdline, &ep); } /* -w e/v validate availability of AR request, default e SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-w"))) { lSetUlong(*ar, AR_verify, lGetInt(ep, SPA_argval_lIntT)); lRemoveElem(pcmdline, &ep); } /* -N name AR name SGE_STRING */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-N"))) { lSetString(*ar, AR_name, lGetString(ep, SPA_argval_lStringT)); lRemoveElem(pcmdline, &ep); } /* -A account_string AR name in accounting record SGE_STRING */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-A"))) { lSetString(*ar, AR_account, lGetString(ep, SPA_argval_lStringT)); lRemoveElem(pcmdline, &ep); } /* -l resource_list request the given resources SGE_LIST */ parse_list_simple(pcmdline, "-l", *ar, AR_resource_list, 0, 0, FLG_LIST_APPEND); centry_list_remove_duplicates(lGetList(*ar, AR_resource_list)); /* -u wc_user access list SGE_LIST */ /* -u ! wc_user TBD: Think about eval_expression support in compare allowed and excluded lists */ parse_list_simple(pcmdline, "-u", *ar, AR_acl_list, ARA_name, 0, FLG_LIST_MERGE); /* -u ! list separation */ lp = lGetList(*ar, AR_acl_list); next_ep = lFirst(lp); while ((ep = next_ep)) { bool is_xacl = false; const char *name = lGetString(ep, ARA_name); next_ep = lNext(ep); if (name[0] == '!') { /* move this element to xacl_list */ is_xacl = true; name++; } if (!is_hgroup_name(name)) { struct passwd *pw; struct passwd pw_struct; char *buffer; int size; stringT group; size = get_pw_buffer_size(); buffer = sge_malloc(size); pw = sge_getpwnam_r(name, &pw_struct, buffer, size); if (pw == NULL) { answer_list_add_sprintf(alpp, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR, MSG_USER_XISNOKNOWNUSER_S, name); FREE(buffer); DRETURN(false); } sge_gid2group(pw->pw_gid, group, MAX_STRING_SIZE, MAX_NIS_RETRIES); lSetString(ep, ARA_group, group); FREE(buffer); } if (is_xacl) { lListElem *new_ep = lAddSubStr(*ar, ARA_name, name, AR_xacl_list, ARA_Type); lSetString(new_ep, ARA_group, lGetString(ep, ARA_group)); lRemoveElem(lp, &ep); } } /* -q wc_queue_list reserve in queue(s) SGE_LIST */ parse_list_simple(pcmdline, "-q", *ar, AR_queue_list, 0, 0, FLG_LIST_APPEND); /* -pe pe_name slot_range reserve slot range for parallel jobs */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-pe"))) { lSetString(*ar, AR_pe, lGetString(ep, SPA_argval_lStringT)); /* SGE_STRING, */ lSwapList(*ar, AR_pe_range, ep, SPA_argval_lListT); /* SGE_LIST */ lRemoveElem(pcmdline, &ep); } /* AR_master_queue_list -masterq wc_queue_list, SGE_LIST bind master task to queue(s) */ parse_list_simple(pcmdline, "-masterq", *ar, AR_master_queue_list, 0, 0, FLG_LIST_APPEND); /* -ckpt ckpt-name reserve in queue with ckpt method SGE_STRING */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-ckpt"))) { lSetString(*ar, AR_checkpoint_name, lGetString(ep, SPA_argval_lStringT)); lRemoveElem(pcmdline, &ep); } /* -m b/e/a/n define mail notification events SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-m"))) { u_long32 ul; u_long32 old_mail_opts; ul = lGetInt(ep, SPA_argval_lIntT); if ((ul & NO_MAIL)) { lSetUlong(*ar, AR_mail_options, 0); } else { old_mail_opts = lGetUlong(*ar, AR_mail_options); lSetUlong(*ar, AR_mail_options, ul | old_mail_opts); } lRemoveElem(pcmdline, &ep); } /* -M user[@host],... notify these e-mail addresses SGE_LIST*/ parse_list_simple(pcmdline, "-M", *ar, AR_mail_list, MR_host, MR_user, FLG_LIST_MERGE); /* -he yes/no hard error handling SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-he"))) { lSetUlong(*ar, AR_error_handling, lGetUlong(ep, SPA_argval_lUlongT)); lRemoveElem(pcmdline, &ep); } /* -now reserve in queues with qtype interactive SGE_ULONG */ while ((ep = lGetElemStr(pcmdline, SPA_switch, "-now"))) { u_long32 ar_now = lGetUlong(*ar, AR_type); if(lGetInt(ep, SPA_argval_lIntT)) { JOB_TYPE_SET_IMMEDIATE(ar_now); } else { JOB_TYPE_CLEAR_IMMEDIATE(ar_now); } lSetUlong(*ar, AR_type, ar_now); lRemoveElem(pcmdline, &ep); } /* Remove the script elements. They are not stored in the ar structure */ if ((ep = lGetElemStr(pcmdline, SPA_switch, STR_PSEUDO_SCRIPT))) { lRemoveElem(pcmdline, &ep); } if ((ep = lGetElemStr(pcmdline, SPA_switch, STR_PSEUDO_SCRIPTLEN))) { lRemoveElem(pcmdline, &ep); } if ((ep = lGetElemStr(pcmdline, SPA_switch, STR_PSEUDO_SCRIPTPTR))) { lRemoveElem(pcmdline, &ep); } ep = lFirst(pcmdline); if(ep) { const char *option = lGetString(ep,SPA_switch); /* as jobarg are stored no switch values, need to be filtered */ if(sge_strnullcmp(option, "jobarg") != 0) { answer_list_add_sprintf(alpp, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR, MSG_PARSE_INVALIDOPTIONARGUMENTX_S, lGetString(ep,SPA_switch)); } else { answer_list_add_sprintf(alpp, STATUS_ESEMANTIC, ANSWER_QUALITY_ERROR, MSG_PARSE_INVALIDOPTIONARGUMENT); } DRETURN(false); } if (lGetUlong(*ar, AR_start_time) == 0 && lGetUlong(*ar, AR_end_time) != 0 && lGetUlong(*ar, AR_duration) != 0) { lSetUlong(*ar, AR_start_time, lGetUlong(*ar, AR_end_time) - lGetUlong(*ar, AR_duration)); } else if (lGetUlong(*ar, AR_start_time) != 0 && lGetUlong(*ar, AR_end_time) == 0 && lGetUlong(*ar, AR_duration) != 0) { lSetUlong(*ar, AR_end_time, duration_add_offset(lGetUlong(*ar, AR_start_time), lGetUlong(*ar, AR_duration))); lSetUlong(*ar, AR_duration, lGetUlong(*ar, AR_end_time) - lGetUlong(*ar, AR_start_time)); } else if (lGetUlong(*ar, AR_start_time) != 0 && lGetUlong(*ar, AR_end_time) != 0 && lGetUlong(*ar, AR_duration) == 0) { lSetUlong(*ar, AR_duration, lGetUlong(*ar, AR_end_time) - lGetUlong(*ar, AR_start_time)); } DRETURN(true); }
/*-------------------------------------------------------------------------*/ void qmonSet2xN( Widget w, lList *lp, int field1, int field2 ) { lListElem *ep; int row; int max_rows; const char *col1 = NULL, *col2 = NULL; int val; double dval; char buf[128]; DENTER(GUI_LAYER, "qmonSet2xN"); /* clear the area */ XtVaSetValues(w, XmNcells, NULL, NULL); if (!lp) { DEXIT; return; } XtVaGetValues(w, XmNrows, &max_rows, NULL); for (ep = lFirst(lp), row = 0; ep; ep = lNext(ep), row++) { if (row == max_rows) { XbaeMatrixAddRows(w, max_rows, NULL, /* empty rows */ NULL, /* no lables */ NULL, /* no different colors */ 1); /* we add 1 rows */ max_rows++; } /* ** the first column of the matrix can be string or host type ** */ switch (lGetType(lGetListDescr(lp), field1)) { case lStringT: col1 = (StringConst)lGetString(ep, field1); break; case lHostT: col1 = (StringConst)lGetHost(ep,field1); break; } /* ** the second column can be of different type */ switch (lGetType(lGetListDescr(lp), field2)) { case lStringT: col2 = (StringConst)lGetString(ep, field2); break; case lHostT: col2 = (StringConst)lGetHost(ep,field2); break; case lUlongT: val = (int)lGetUlong(ep, field2); if (val) { sprintf(buf, "%d", val); col2 = buf; } else col2 = NULL; break; case lDoubleT: dval = lGetDouble(ep, field2); sprintf(buf, "%.2f", dval); col2 = buf; break; } if (col1) { /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, 0 , col1 ? (String)col1 : ""); /* FIX_CONST_GUI */ XbaeMatrixSetCell(w, row, 1 , col2 ? (String)col2 : ""); } } DEXIT; }
/*-------------------------------------------------------------------------*/ void qmonSetNxN(Widget w, lList *lp, int num_fields, ...) { lListElem *ep; int i, row; int max_rows; int val; double dval; char buf[128]; int *field; const char **col; va_list ap; DENTER(GUI_LAYER, "qmonSetNxN"); /* clear the area */ XtVaSetValues(w, XmNcells, NULL, NULL); if (!lp) { DEXIT; return; } field = malloc(num_fields*sizeof(int)); col = malloc(num_fields*sizeof(char *)); if (field == NULL || col == NULL) abort(); va_start(ap, num_fields); for(i=0; i<num_fields; i++) field[i] = va_arg(ap, int); XtVaGetValues(w, XmNrows, &max_rows, NULL); for (ep = lFirst(lp), row = 0; ep; ep = lNext(ep), row++) { if (row == max_rows) { XbaeMatrixAddRows(w, max_rows, NULL, /* empty rows */ NULL, /* no lables */ NULL, /* no different colors */ 1); /* we add 1 rows */ max_rows++; } memset(col, 0, num_fields*sizeof(char *)); /* * get column values */ for(i=0; i<num_fields; i++) { switch (lGetType(lGetListDescr(lp), field[i])) { case lStringT: col[i] = (StringConst)lGetString(ep, field[i]); break; case lHostT: col[i] = (StringConst)lGetHost(ep,field[i]); break; case lUlongT: val = (int)lGetUlong(ep, field[i]); #if 0 if (val) { sprintf(buf, "%d", val); col[i] = buf; } else col[i] = NULL; #else sprintf(buf, "%d", val); col[i] = buf; #endif break; case lDoubleT: dval = lGetDouble(ep, field[i]); sprintf(buf, "%.2f", dval); col[i] = buf; break; } } if (col[0]) { /* FIX_CONST_GUI */ for(i=0; i<num_fields; i++) XbaeMatrixSetCell(w, row, i, col[i] ? (String)col[i] : ""); } } va_end(ap); free(field); free(col); DEXIT; }
/******************************************************** ensure - all nodes have a unique path in share tree - a project is not referenced more than once in share tree - a user appears only once in a project sub-tree - a user appears only once outside of a project sub-tree - a user does not appear as a non-leaf node - all leaf nodes in a project sub-tree reference a known user object or the reserved name "default" - there are no sub-projects within a project sub-tree - all leaf nodes not in a project sub-tree reference a known user or project object - all user leaf nodes in a project sub-tree have access to the project ********************************************************/ int check_sharetree( lList **alpp, lListElem *node, lList *user_list, lList *project_list, lListElem *project, lList **found /* tmp list that contains one entry for each found u/p */ ) { lList *children; lListElem *child, *remaining; lList *save_found = NULL; const char *name = lGetString(node, STN_name); lListElem *pep; DENTER(TOP_LAYER, "check_sharetree"); /* Check for dangling or circular references. */ if (name == NULL) { ERROR((SGE_EVENT, MSG_STREE_NOVALIDNODEREF_U, sge_u32c(lGetUlong(node, STN_id)))); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return -1; } if ((children=lGetList(node, STN_children))) { /* not a leaf node */ /* check if this is a project node */ if ((pep=prj_list_locate(project_list, name))) { /* check for sub-projects (not allowed) */ if (project) { ERROR((SGE_EVENT, MSG_STREE_PRJINPTJSUBTREE_SS, name, lGetString(project, PR_name))); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return -1; } /* check for projects appearing more than once */ if (lGetElemStr(*found, STN_name, name)) { ERROR((SGE_EVENT, MSG_STREE_PRJTWICE_S, name)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return -1; } /* register that this project was found */ lAddElemStr(found, STN_name, name, STN_Type); /* set up for project sub-tree recursion */ project = pep; save_found = *found; *found = NULL; /* check for user appearing as non-leaf node */ } else if (user_list_locate(user_list, name)) { ERROR((SGE_EVENT, MSG_STREE_USERNONLEAF_S, name)); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); DEXIT; return -1; } for_each(child, children) { /* ensure pathes are identically inside share tree */ for (remaining=lNext(child); remaining; remaining=lNext(remaining)) { const char *cn = lGetString(child, STN_name); const char *rn = lGetString(remaining, STN_name); if (cn == NULL || rn == NULL) { ERROR((SGE_EVENT, MSG_GDI_KEYSTR_NULL_S, "STN_name")); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); /* restore old found list */ if (save_found) { lFreeList(found); *found = save_found; } DEXIT; return -1; } if (!strcmp(cn, rn)) { ERROR((SGE_EVENT, MSG_SGETEXT_FOUND_UP_TWICE_SS, cn, lGetString(node, STN_name))); answer_list_add(alpp, SGE_EVENT, STATUS_EUNKNOWN, ANSWER_QUALITY_ERROR); /* restore old found list */ if (save_found) { lFreeList(found); *found = save_found; } DEXIT; return -1; } } if (check_sharetree(alpp, child, user_list, project_list, project, found)) { /* restore old found list */ if (save_found) { lFreeList(found); *found = save_found; } DEXIT; return -1; } } /* restore old found list */ if (save_found) { lFreeList(found); *found = save_found; } } else { /* a leaf node */ /* check if this is a project node */ if (prj_list_locate(project_list, name)) {
/****** qquota_output/qquota_output() ******************************************** * NAME * qquota_output() -- qquota output function * * SYNOPSIS * bool qquota_output(void *ctx, lList *host_list, lList *resource_match_list, * lList *user_list, lList *pe_list, lList *project_list, lList * *cqueue_list, lList **alpp, report_handler_t* report_handler) * * FUNCTION * print resource quota rule and the limit * * INPUTS * void *ctx - gdi handler * lList *host_list - selected hosts * lList *resource_match_list - selected resources * lList *user_list - selected users * lList *pe_list - selecte pes * lList *project_list - selected projects * lList *cqueue_list - selected cluster queues * lList **alpp - answer list * report_handler_t* report_handler - report handler for xml output * * RESULT * bool - true on success * false on error * * NOTES * MT-NOTE: qquota_output() is MT safe * *******************************************************************************/ bool qquota_output(sge_gdi_ctx_class_t *ctx, lList *host_list, lList *resource_match_list, lList *user_list, lList *pe_list, lList *project_list, lList *cqueue_list, lList **alpp, report_handler_t* report_handler) { lList *rqs_list = NULL; lList *centry_list = NULL; lList *userset_list = NULL; lList *hgroup_list = NULL; lList *exechost_list = NULL; lListElem* global_host = NULL; lListElem* exec_host = NULL; lList* printed_rules = NULL; /* Hash list of already printed resource quota rules (possible with -u user1,user2,user3...) */ bool ret = true; int xml_ret = 0; qquota_filter_t qquota_filter = { "*", "*", "*", "*", "*" }; dstring rule_name = DSTRING_INIT; DENTER(TOP_LAYER, "qquota_output"); /* If no user is requested on command line we set the current user as default */ qquota_filter.user = ctx->get_username(ctx); ret = get_all_lists(ctx, &rqs_list, ¢ry_list, &userset_list, &hgroup_list, &exechost_list, host_list, alpp); if (ret == true) { lListElem *rqs = NULL; printed_rules = lCreateList("rule_hash", ST_Type); global_host = host_list_locate(exechost_list, SGE_GLOBAL_NAME); if (report_handler != NULL) { xml_ret = report_handler->report_started(report_handler, alpp); if (xml_ret != QQUOTA_SUCCESS) { ret = false; goto qquota_output_error; } } for_each(rqs, rqs_list) { lListElem *rule = NULL; int rule_count = 1; if (lGetBool(rqs, RQS_enabled) == false) { continue; } for_each(rule, lGetList(rqs, RQS_rule)) { lListElem *user_ep = lFirst(user_list); lListElem *project_ep = lFirst(project_list); lListElem *pe_ep = lFirst(pe_list); lListElem *queue_ep = lFirst(cqueue_list); lListElem *host_ep = lFirst(host_list); do { if (user_ep != NULL) { qquota_filter.user = lGetString(user_ep, ST_name); } do { if (project_ep != NULL) { qquota_filter.project = lGetString(project_ep, ST_name); } do { if (pe_ep != NULL) { qquota_filter.pe = lGetString(pe_ep, ST_name); } do { if (queue_ep != NULL) { qquota_filter.queue = lGetString(queue_ep, ST_name); } do { if (host_ep != NULL) { qquota_filter.host = lGetString(host_ep, ST_name); } if (rqs_is_matching_rule(rule, qquota_filter.user, NULL, qquota_filter.project, qquota_filter.pe, qquota_filter.host, qquota_filter.queue, userset_list, hgroup_list)) { lListElem *limit = NULL; for_each(limit, lGetList(rule, RQR_limit)) { const char *limit_name = lGetString(limit, RQRL_name); lList *rue_list = lGetList(limit, RQRL_usage); lListElem *raw_centry = centry_list_locate(centry_list, limit_name); lListElem *rue_elem = NULL; if (raw_centry == NULL) { /* undefined centries can be ignored */ DPRINTF(("centry %s not defined -> IGNORING\n", limit_name)); continue; } if ((resource_match_list != NULL) && ((centry_list_locate(resource_match_list, limit_name) == NULL) && (centry_list_locate(resource_match_list, lGetString(raw_centry, CE_shortcut)) == NULL))) { DPRINTF(("centry %s was not requested on CLI -> IGNORING\n", limit_name)); continue; } if (lGetString(rule, RQR_name)) { sge_dstring_sprintf(&rule_name, "%s/%s", lGetString(rqs, RQS_name), lGetString(rule, RQR_name)); } else { sge_dstring_sprintf(&rule_name, "%s/%d", lGetString(rqs, RQS_name), rule_count); } if (lGetUlong(raw_centry, CE_consumable)) { /* for consumables we need to walk through the utilization and search for matching values */ DPRINTF(("found centry %s - consumable\n", limit_name)); for_each(rue_elem, rue_list) { u_long32 dominant = 0; const char *rue_name = lGetString(rue_elem, RUE_name); char *cp = NULL; stringT user, project, pe, queue, host; dstring limit_str = DSTRING_INIT; dstring value_str = DSTRING_INIT; qquota_filter_t qf = { NULL, NULL, NULL, NULL, NULL }; /* check user name */ cp = qquota_get_next_filter(user, rue_name); /* usergroups have the same beginning character @ as host groups */ if (is_hgroup_name(qquota_filter.user)) { lListElem *ugroup = NULL; if ((ugroup = userset_list_locate(userset_list, &qquota_filter.user[1])) != NULL) { if (sge_contained_in_access_list(user, NULL, ugroup, NULL) == 0) { continue; } } } else { if ((strcmp(user, "-") != 0) && (strcmp(qquota_filter.user, "*") != 0) && (fnmatch(qquota_filter.user, user, 0) != 0)) { continue; } } /* check project */ cp = qquota_get_next_filter(project, cp); if ((strcmp(project, "-") != 0) && (strcmp(qquota_filter.project, "*") != 0) && (fnmatch(qquota_filter.project, project, 0) != 0)) { continue; } /* check parallel environment */ cp = qquota_get_next_filter(pe, cp); if ((strcmp(pe, "-") != 0) && (strcmp(qquota_filter.pe, "*") != 0) && (fnmatch(qquota_filter.pe, pe, 0) != 0) ) { continue; } /* check cluster queue */ cp = qquota_get_next_filter(queue, cp); if ((strcmp(queue, "-") != 0) && (strcmp(qquota_filter.queue, "*") != 0) && (fnmatch(qquota_filter.queue, queue, 0) != 0)) { continue; } /* check host name */ cp = qquota_get_next_filter(host, cp); if (is_hgroup_name(qquota_filter.host)) { lListElem *hgroup = NULL; if ((hgroup = hgroup_list_locate(hgroup_list, qquota_filter.host)) != NULL) { lList *host_list = NULL; hgroup_find_all_references(hgroup, NULL, hgroup_list, &host_list, NULL); if (host_list == NULL && lGetElemHost(host_list, HR_name, host) == NULL) { lFreeList(&host_list); continue; } lFreeList(&host_list); } } else { if ((strcmp(host, "-") != 0) && (strcmp(qquota_filter.host, "*") != 0) && (fnmatch(qquota_filter.host, host, 0) != 0) ) { continue; } } if (lGetBool(limit, RQRL_dynamic)) { exec_host = host_list_locate(exechost_list, host); sge_dstring_sprintf(&limit_str, "%d", (int)scaled_mixed_load(lGetString(limit, RQRL_value), global_host, exec_host, centry_list)); } else { lSetDouble(raw_centry, CE_pj_doubleval, lGetDouble(limit, RQRL_dvalue)); sge_get_dominant_stringval(raw_centry, &dominant, &limit_str); } lSetDouble(raw_centry,CE_pj_doubleval, lGetDouble(rue_elem, RUE_utilized_now)); sge_get_dominant_stringval(raw_centry, &dominant, &value_str); qf.user = user; qf.project = project; qf.pe = pe; qf.queue = queue; qf.host = host; ret = qquota_print_out_rule(rule, rule_name, limit_name, sge_dstring_get_string(&value_str), sge_dstring_get_string(&limit_str), qf, raw_centry, report_handler, printed_rules, alpp); sge_dstring_free(&limit_str); sge_dstring_free(&value_str); } } else { /* static values */ qquota_filter_t qf = { NULL, NULL, NULL, NULL, NULL }; DPRINTF(("found centry %s - static value\n", limit_name)); ret = qquota_print_out_rule(rule, rule_name, limit_name, NULL, lGetString(limit, RQRL_value), qf, raw_centry, report_handler, printed_rules, alpp); } } } } while ((host_ep = lNext(host_ep))); } while ((queue_ep = lNext(queue_ep))); } while ((pe_ep = lNext(pe_ep))); } while ((project_ep = lNext(project_ep)));
/*-------------------------------------------------------------------------*/ static void qmonUserAskForProject(Widget w, XtPointer cld, XtPointer cad) { XbaeMatrixLabelActivateCallbackStruct *cbs = (XbaeMatrixLabelActivateCallbackStruct *) cad; Boolean status = False; lList *pl = NULL; lListElem *cep = NULL; int n, i; StringConst *strs = NULL; static char buf[BUFSIZ]; lList *lp = NULL; lList *alp = NULL; lListElem *ep; static lEnumeration *what = NULL; DENTER(GUI_LAYER, "qmonUserAskForProject"); if (!what) { what = lWhat("%T(%I %I)", UU_Type, UU_name, UU_default_project); } if (cbs->column != 1) { DEXIT; return; } qmonMirrorMultiAnswer(PROJECT_T, &alp); if (alp) { qmonMessageBox(w, alp, 0); lFreeList(&alp); DEXIT; return; } pl = qmonMirrorList(SGE_PR_LIST); lPSortList(pl, "%I+", PR_name); n = lGetNumberOfElem(pl); if (n>0) { strs = (StringConst*)XtMalloc(sizeof(String)*(n+1)); strs[0] = "NONE"; for (cep=lFirst(pl), i=0; i<n; cep=lNext(cep), i++) { /* ** we get only references don't free, the strings */ strs[i+1] = lGetString(cep, PR_name); } strcpy(buf, ""); /* FIX_CONST_GUI */ status = XmtAskForItem(w, NULL, "@{Select a project}", "@{Available projects}", (String*)strs, n+1, False, buf, BUFSIZ, NULL); if (status) { int rows, i; rows = XbaeMatrixNumRows(user_matrix); for (i=0; i<rows; i++) { String s = XbaeMatrixGetCell(user_matrix, i, 0); if (XbaeMatrixIsRowSelected(user_matrix, i) && s && strcmp(s, "")) { ep = lAddElemStr(&lp, UU_name, s, UU_Type); lSetString(ep, UU_default_project, buf); } } XbaeMatrixDeselectAll(user_matrix); /* ** send to master as modify request */ for_each (ep, lp) { if (ep && lGetString(ep, UU_default_project) && !strcasecmp(lGetString(ep, UU_default_project), "NONE")) lSetString(ep, UU_default_project, NULL); } if (lp) { alp = qmonModList(SGE_UU_LIST, qmonMirrorListRef(SGE_UU_LIST), UU_name, &lp, NULL, what); qmonMessageBox(w, alp, 0); updateManopList(); lFreeList(&alp); lFreeList(&lp); } } /* ** don't free referenced strings, they are in the pl list */ XtFree((char*)strs); }
/*-------------------------------------------------------------------------*/ static void set_StringList( Widget w, XtPointer address, XrmQuark type, Cardinal size ) { lList *lp = NULL; Widget parent; /* * Here special Qmon Quarks are used. Does it work ? */ if (type != QmonQUS_Type && type != QmonQMR_Type && type != QmonQPR_Type && type != QmonQSTR_Type && type != QmonQSTU_Type && type != QmonQHR_Type) { XmtWarningMsg("XmtDialogSetDialogValues", "XbaeMatrix", "Type Mismatch: Widget '%s':\n\tCan't set widget values" " from a resource of type '%s'", XtName(w), XrmQuarkToString(type)); return; } if (size == sizeof(lList*)) lp = *(lList**) address; else return; /* if our parent is a layout widget disable/reenable it */ parent = XtParent(w); while (parent && !XtIsSubclass(parent, xmtLayoutWidgetClass)) parent = XtParent(parent); XmtLayoutDisableLayout(parent); if (type == QmonQUS_Type) { UpdateXmListFromCull(w, XmFONTLIST_DEFAULT_TAG, lp, US_name); } if (type == QmonQPR_Type) { UpdateXmListFromCull(w, XmFONTLIST_DEFAULT_TAG, lp, PR_name); } if (type == QmonQHR_Type) { UpdateXmListFromCull(w, XmFONTLIST_DEFAULT_TAG, lp, HR_name); } if (type == QmonQMR_Type) { String *str_table = NULL; Cardinal itemCount; StringConst str1, str2; int size, i; char buf[BUFSIZ]; lListElem *ep = NULL; XtVaGetValues(w, XmNitemCount, &itemCount, NULL); if (!lp) { if (itemCount) XmListDeleteAllItems(w); return; } if ((size = lGetNumberOfElem(lp)) <=0) { return; } if (!(str_table = (String *)XtMalloc(sizeof(String)*size))) { return; } for (ep=lFirst(lp), i=0; ep; ep=lNext(ep), i++) { str1 = (StringConst)lGetString(ep, MR_user); str2 = (StringConst)lGetHost(ep, MR_host); if (str1) { if (!str2) sge_strlcpy(buf, str1, BUFSIZ); else snprintf(buf, BUFSIZ, "%s@%s", str1, str2); str_table[i] = XtNewString(buf); } else str_table[i] = NULL; } UpdateXmList(w, str_table, size, XmFONTLIST_DEFAULT_TAG); StringTableFree(str_table, size); } if (type == QmonQSTR_Type) { UpdateXmListFromCull(w, XmFONTLIST_DEFAULT_TAG, lp, ST_name); } if (type == QmonQSTU_Type) { UpdateXmListFromCull(w, XmFONTLIST_DEFAULT_TAG, lp, STU_name); } XmtLayoutEnableLayout(parent); }