int MTraceLoadComputeNode( char *NodeLine, /* I */ mnode_t *N, /* O */ int Version) /* I */ { char *tok; char *TokPtr; char tmpLine[MAX_MLINE]; char tmpNLine[MAX_MLINE]; char ResourceType[MAX_MNAME]; char EventType[MAX_MNAME]; long ETime; char Name[MAX_MNAME]; char OpsysString[MAX_MNAME]; char ArchString[MAX_MNAME]; char FeatureString[MAX_MLINE]; char ClassString[MAX_MLINE]; char NetworkString[MAX_MLINE]; char GResString[MAX_MLINE]; char tmpSwapBuf[MAX_MNAME]; char tmpMemBuf[MAX_MNAME]; char tmpDiskBuf[MAX_MNAME]; int SlotsUsed; char RMName[MAX_MNAME]; int FIndex; int SIndex; int cindex; int rc; /* set default resource attributes */ memset(N,0,sizeof(mnode_t)); N->Load = 0.0; N->Speed = 1.0; N->PtIndex = 0; switch(Version) { case 230: if (strchr(NodeLine,';') != NULL) { sprintf(tmpNLine,"IFS-;%.*s", MAX_MLINE, NodeLine); } else { MUStrCpy(tmpNLine,NodeLine,sizeof(tmpNLine)); } /* FORMAT: <RESOURCETYPE> <EVENTTYPE> <EVENTTIME> <NAME> <RMINDEX> <SWAP> <MEMORY> <DISK> <MAXPROCS> <SLOTSUSED> <FRAMEINDEX> <SLOTINDEX> <OPSYS> <ARCH> [<FEATURE>]* [<CLASS>]* [<NETWORK>]* [<GRES>]* <RES1> <RES2> <RES3> */ rc = MUSScanF(tmpNLine,"%x%s %x%s %ld %x%s %x%s %x%s %x%s %x%s %d %d %d %d %x%s %x%s %x%s %x%s %x%s %x%s %x%s %x%s %x%s %x%s", MAX_MNAME, ResourceType, MAX_MNAME, EventType, &ETime, MAX_MNAME, Name, MAX_MNAME, RMName, MAX_MNAME, tmpSwapBuf, MAX_MNAME, tmpMemBuf, MAX_MNAME, tmpDiskBuf, &N->CRes.Procs, &FIndex, &SIndex, &SlotsUsed, MAX_MNAME, OpsysString, MAX_MNAME, ArchString, MAX_MLINE, FeatureString, MAX_MLINE, ClassString, MAX_MLINE, NetworkString, MAX_MLINE, GResString, MAX_MLINE, tmpLine, /* RES1 */ MAX_MLINE, tmpLine, /* RES2 */ MAX_MLINE, tmpLine, /* RES3 */ MAX_MLINE, tmpLine /* check for too many lines */ ); if ((rc == EOF) || (rc != 21)) { DBG(3,fSIM) DPrint("ALERT: resource tracefile corruption (%d of %d fields detected) on line '%s'\n", rc, 21, NodeLine); return(FAILURE); } /* process node attributes */ N->CRes.Swap = MURSpecToL(tmpSwapBuf,mvmMega,mvmMega); N->CRes.Mem = MURSpecToL(tmpMemBuf,mvmMega,mvmMega); N->CRes.Disk = MURSpecToL(tmpDiskBuf,mvmMega,mvmMega); if (!strcmp(RMName,NONE)) MRMAdd(RMName,&N->RM); else MRMAdd(DEFAULT,&N->RM); /* load Opsys */ if (strstr(OpsysString,MAList[eOpsys][0]) == NULL) N->ActiveOS = MUMAGetIndex(eOpsys,OpsysString,mAdd); /* load Arch */ if (strstr(ArchString,MAList[eArch][0]) == NULL) N->Arch = MUMAGetIndex(eArch,ArchString,mAdd); memcpy(&N->ARes,&N->CRes,sizeof(N->ARes)); strcpy(N->Name,MNodeAdjustName(Name,0)); /* load classes */ if (MSim.Flags & ((1 << msimfIgnClass) | (1 << msimfIgnAll))) { mclass_t *C; /* ignore specified classes */ MClassAdd("DEFAULT",&C); N->CRes.PSlot[0].count = N->CRes.Procs; N->CRes.PSlot[C->Index].count = N->CRes.Procs; } else { MUNumListFromString(N->CRes.PSlot,ClassString,eClass); for (cindex = 1;cindex < MAX_MCLASS;cindex++) { if (N->CRes.PSlot[cindex].count > 0) MClassAdd(MAList[eClass][cindex],NULL); } } memcpy(N->ARes.PSlot,N->CRes.PSlot,sizeof(N->ARes.PSlot)); break; default: DBG(4,fSIM) DPrint("ALERT: cannot load version %d resource trace record\n", Version); return(FAILURE); /*NOTREACHED*/ break; } /* END switch(Version) */ if ((MSim.Flags & ((1 << msimfIgnFrame) | (1 << msimfIgnAll))) || (FIndex < 0)) { N->FrameIndex = -1; N->SlotIndex = -1; } else { MFrameAddNode(&MFrame[FIndex],N,SIndex); if ((N->FrameIndex > 0) && (N->FrameIndex < MAX_MFRAME) && (N->SlotIndex > 0) && (N->SlotIndex <= MAX_MSLOTPERFRAME)) { mhost_t *S; int nindex; S = &MSys[N->FrameIndex][N->SlotIndex]; S->SlotsUsed = SlotsUsed; for (nindex = 0;nindex < MAX_MNETTYPE;nindex++) strcpy(S->NetName[nindex],N->Name); if (!strstr(ClassString,"NONE")) S->Attributes |= (1 << attrBatch); S->MTime = MSched.Time; } /* END if ((N->FrameIndex > 0) ... ) */ } /* END else if (MSim.Flags & ((1 << msimfIgnFrame) | ...)) */ /* initialize statistics */ N->STTime = 0; N->SUTime = 0; N->SATime = 0; /* load state */ if (N->CRes.Procs <= 0) { N->State = mnsNone; } else { if (!strcmp(EventType,"AVAILABLE")) N->State = mnsIdle; else if (!strcmp(EventType,"DEFINED")) N->State = mnsDown; else if (!strcmp(EventType,"DRAINED")) N->State = mnsDrained; else N->State = mnsNONE; } /* END else (N->CRes.Procs <= 0) */ N->EState = N->State; memcpy(&N->ARes,&N->CRes,sizeof(N->ARes)); /* load features */ if (strstr(FeatureString,MAList[eFeature][0]) == NULL) { tok = MUStrTok(FeatureString,"[]",&TokPtr); do { MNodeProcessFeature(N,tok); DBG(6,fSIM) DPrint("INFO: feature '%s' added (%s)\n", tok, MUMAList(eFeature,N->FBM,sizeof(N->FBM))); } while ((tok = MUStrTok(NULL,"[]",&TokPtr)) != NULL); } /* load network adapters */ if (strstr(NetworkString,MAList[eNetwork][0]) == NULL) { tok = MUStrTok(NetworkString,"[]",&TokPtr); do { N->Network |= MUMAGetBM(eNetwork,tok,mAdd); DBG(6,fSIM) DPrint("INFO: network '%s' added (%s)\n", tok, MUListAttrs(eNetwork,N->Network)); } while ((tok = MUStrTok(NULL,"[]",&TokPtr)) != NULL); } /* load generic resources */ if (!strcmp(GResString,NONE) != 0) { MUNumListFromString(N->CRes.GRes,GResString,eGRes); } DBG(4,fSIM) DPrint("INFO: node '%s' F:%d/S:%d %06d %04d %06d %02d %02d %10s %10s %20s %20s\n", N->Name, N->FrameIndex, N->SlotIndex, N->CRes.Swap, N->CRes.Mem, N->CRes.Disk, N->CRes.Procs, SlotsUsed, OpsysString, ArchString, FeatureString, MUCAListToString(N->CRes.PSlot,NULL,NULL)); return(SUCCESS); } /* END MTraceLoadComputeNode() */
int MTraceBuildResource( mnode_t *N, /* I */ int Version, /* I */ char *Buf, /* O */ int BufSize) /* I */ { int cindex; char Features[MAX_MLINE]; char Classes[MAX_MLINE]; char Networks[MAX_MLINE]; char *BPtr; int BSpace; const char *FName = "MTraceBuildResource"; DBG(3,fSIM) DPrint("%s(%s,%d,Buf,%d)\n", FName, (N != NULL) ? N->Name : "NULL", Version, BufSize); if ((N == NULL) || (Buf == NULL)) { return(FAILURE); } BPtr = Buf; BSpace = BufSize; BPtr[0] = '\0'; strcpy(Features,MUMAList(eFeature,N->FBM,sizeof(N->FBM))); strcpy(Networks,MUListAttrs(eNetwork,N->Network)); switch(Version) { case 230: Classes[0] = '\0'; for (cindex = 1;cindex < MAX_MCLASS;cindex++) { if (N->CRes.PSlot[cindex].count > 0) sprintf(Classes,"%s[%s:%d]", Classes, MAList[eClass][cindex], N->CRes.PSlot[cindex].count); } /* END for (cindex) */ if (Classes[0] == '\0') strcpy(Classes,NONE); /* FORMAT: <RESOURCETYPE> <EVENTTYPE> <EVENTTIME> <NAME> <RMINDEX> <SWAP> <MEMORY> <DISK> <MAXPROCS> <SLOTSUSED> <FRAMEINDEX> <SLOTINDEX> <OPSYS> <ARCH> [<FEATURE>]* [<CLASS>]* [<NETWORK>]* <RES1> <RES2> <RES3> <RES4> */ MUSNPrintF(&BPtr,&BSpace,"%s %s %d %s %s %dM %dM %dM %d %d %d %d %s %s %s %s %s %s %s %s %s", "COMPUTENODE", "AVAILABLE", 0, N->Name, (N->RM != NULL) ? N->RM->Name : NONE, N->CRes.Swap, N->CRes.Mem, N->CRes.Disk, N->CRes.Procs, N->FrameIndex, N->SlotIndex, (N->FrameIndex > 0) ? MSys[N->FrameIndex][N->SlotIndex].SlotsUsed : 1, MAList[eOpsys][N->ActiveOS], MAList[eArch][N->Arch], Features, Classes, Networks, NONE, NONE, NONE, NONE ); break; default: DBG(4,fSIM) DPrint("ALERT: cannot create version %d resource trace record\n", Version); return(FAILURE); /*NOTREACHED*/ break; } /* END switch(Version) */ return(SUCCESS); } /* END MTraceBuildResource() */
char *MAcctShow( mgcred_t *A, /* I */ char *Buf, /* O */ long *BufSize, long Mode) { static char Line[MAX_MLINE]; char FlagLine[MAX_MLINE]; char QALLine[MAX_MLINE]; char QALChar; char ALLine[MAX_MLINE]; char *ptr; const char *FName = "MAcctShow"; DBG(3, fUI) DPrint("%s(%s,Buf,BufSize,%ld)\n", FName, (A != NULL) ? A->Name : "NULL", Mode); ptr = (Buf != NULL) ? Buf : Line; if (A == NULL) { /* build header */ /* NAME PRI FLAG QDEF QLST * PLST TRG LIMITS */ sprintf(ptr, "%-12s %8s %12s %12s %12s%s %20s %6s %7s\n\n", "Name", "Priority", "Flags", "QDef", "QOSList", "*", "PartitionList", "Target", "Limits"); } else { /* build job info line */ MUBMToString(A->F.JobFlags, MJobFlags, ':', FlagLine, NONE); MUStrCpy(QALLine, MQOSBMToString(A->F.QAL), sizeof(QALLine)); if (A->F.QALType == qalAND) QALChar = '&'; else if (A->F.QALType == qalONLY) QALChar = '^'; else QALChar = ' '; MUStrCpy(ALLine, MCredShowAttrs(&A->L.AP, A->L.IP, NULL, NULL, NULL, &A->F, 0, (1 << mcsLimits)), sizeof(ALLine)); /* NAME PRIO FLAG QDEF QLST * PLST FSTARG LIMITS */ sprintf( ptr, "%-12s %8ld %12s %12s %12s%c %20s %6.2lf %7s\n", A->Name, A->F.Priority, FlagLine, ((mqos_t *)A->F.QDef) != NULL ? ((mqos_t *)A->F.QDef)->Name : NONE, (QALLine[0] != '\0') ? QALLine : NONE, QALChar, (A->F.PAL[0] == 0) ? NONE : MUListAttrs(ePartition, A->F.PAL[0]), A->F.FSTarget, (ALLine[0] != '\0') ? ALLine : NONE); } /* END else (A == NULL) */ return (ptr); } /* END MAcctShow() */
char *MGroupShow( mgcred_t *G, /* I */ char *SBuffer, /* O (optional) */ long *SBufSize, /* I */ long Mode) /* I */ { static char Line[MAX_MLINE]; char FlagLine[MAX_MLINE]; char QALLine[MAX_MLINE]; char QALChar; char GLLine[MAX_MLINE]; char *Head; char *BPtr; int BSpace; const char *FName = "MGroupShow"; DBG(3,fUI) DPrint("%s(%s,Buf,BufSize,%ld)\n", FName, (G != NULL) ? G->Name : "NULL", Mode); if (SBuffer != NULL) { BPtr = SBuffer; BSpace = *SBufSize; } else { BPtr = Line; BSpace = sizeof(Line); } BPtr[0] = '\0'; Head = BPtr; if (G == NULL) { /* build header */ /* NAME PRI FLAG QDEF QLST * PLST TRG LIMITS */ MUSNPrintF(&BPtr,&BSpace,"%-12s %8s %12s %12s %12s%s %20s %6s %7s\n\n", "Name", "Priority", "Flags", "QDef", "QOSList", "*", "PartitionList", "Target", "Limits"); } else { /* build job info line */ MUBMToString(G->F.JobFlags,MJobFlags,':',FlagLine,NONE); MUStrCpy(QALLine,MQOSBMToString(G->F.QAL),sizeof(QALLine)); if (G->F.QALType == qalAND) QALChar = '&'; else if (G->F.QALType == qalONLY) QALChar = '^'; else QALChar = ' '; MUStrCpy(GLLine, MCredShowAttrs(&G->L.AP,G->L.IP,NULL,NULL,NULL,&G->F,0,(1 << mcsLimits)),sizeof(GLLine)); /* NAME PRIO FLAG QDEF QLST * PLST FSTARG LIMITS */ MUSNPrintF(&BPtr,&BSpace,"%-12s %8ld %12s %12s %12s%c %20s %6.2lf %7s\n", G->Name, G->F.Priority, FlagLine, ((mqos_t *)G->F.QDef) != NULL ? ((mqos_t *)G->F.QDef)->Name : NONE, (QALLine[0] != '\0') ? QALLine : NONE, QALChar, (G->F.PAL[0] == 0) ? NONE : MUListAttrs(ePartition,G->F.PAL[0]), G->F.FSTarget, (GLLine[0] != '\0') ? GLLine : NONE); /* add group attributes */ if (G->L.APC != NULL) { int cindex; for (cindex = 0; cindex < MAX_MCLASS; cindex++) { if (G->L.APC[cindex].SLimit[mptMaxProc][0] > 0) { MUSNPrintF(&BPtr,&BSpace," MAXPROC[CLASS:%s]=%d,%d\n", MClass[cindex].Name, G->L.APC[cindex].SLimit[mptMaxProc][0], G->L.APC[cindex].HLimit[mptMaxProc][0]); } } /* END for (cindex) */ } /* END if (G->L.APC != NULL) */ if (G->L.APQ != NULL) { int cindex; for (cindex = 0; cindex < MAX_MQOS; cindex++) { if (G->L.APQ[cindex].SLimit[mptMaxProc][0] > 0) { MUSNPrintF(&BPtr,&BSpace," MAXPROC[QOS:%s]=%d,%d\n", MQOS[cindex].Name, G->L.APQ[cindex].SLimit[mptMaxProc][0], G->L.APQ[cindex].HLimit[mptMaxProc][0]); } } /* END for (cindex) */ } /* END if (G->L.APQ != NULL) */ if (Mode & (1 << mcmVerbose)) { char tmpLine[MAX_MLINE]; /* display additional attributes */ MCredConfigLShow( (void *)G, mxoGroup, TRUE, -1, tmpLine); if (tmpLine[0] != '\0') { MUSNPrintF(&BPtr,&BSpace," %s\n", tmpLine); } } /* END if (Mode == Verbose) */ } /* END else (G == NULL) */ return(Head); } /* END MGroupShow() */
int MClassShow( mclass_t *CP, /* I */ char *SBuffer, /* O */ long *SBufSize, /* O */ int DMode) /* I */ { int cindex; int aindex; char tmpLine[MAX_MLINE]; char tmpQALString[MAX_MLINE]; char tmpLString[MAX_MLINE]; int findex; char QALChar; mclass_t *C; int ClAList[] = { mclaOCNode, mclaOCDProcFactor, mclaDefReqFeature, mclaMaxProcPerNode, mclaWCOverrun, -1 }; int CAList[] = { mcaMaxProcPerUser, mcaMaxNodePerUser, mcaDefWCLimit, mcaMaxWCLimit, mcaMaxNodePerJob, mcaMaxProcPerJob, mcaMaxJobPerUser, -1 }; char *BPtr; int BSpace; const char *FName = "MClassShow"; DBG(3,fUI) DPrint("%s(%s,SBuffer,SBufSize,%d)\n", FName, (CP != NULL) ? CP->Name : "NULL", DMode); if (SBuffer == NULL) { return(FAILURE); } BPtr = SBuffer; BSpace = *SBufSize; MUSNPrintF(&BPtr,&BSpace,"Class/Queue Status\n\n"); /* NAME PRI FLAG QDEF QLST M PLST FST Limits */ MUSNPrintF(&BPtr,&BSpace,"%-14s %-8s %-12s %-12s %12s%c %-20s %-6s %s\n\n", "Name", "Priority", "Flags", "QDef", "QOSList", '*', "PartitionList", "Target", "Limits"); for (cindex = 0;cindex < MAX_MCLASS;cindex++) { C = &MClass[cindex]; DBG(8,fUI) DPrint("INFO: checking MClass[%02d]: %s\n", cindex, C->Name); if (C->Name[0] == '\0') continue; if (!strcmp(C->Name,NONE) || !strcmp(C->Name,ALL)) continue; if ((CP != NULL) && (strcmp(CP->Name,NONE) != 0) && (C != CP)) continue; tmpLine[0] = '\0'; for (findex = 0;MJobFlags[findex] != NULL;findex++) { if (!(C->F.JobFlags & (1 << findex))) continue; if (tmpLine[0] != '\0') strcat(tmpLine,":"); strcat(tmpLine,MJobFlags[findex]); } /* END for (findex) */ if (C->F.QALType == qalAND) QALChar = '&'; else if (C->F.QALType == qalONLY) QALChar = '^'; else QALChar = ' '; MUStrCpy(tmpQALString,MQOSBMToString(C->F.QAL),sizeof(tmpQALString)); MUStrCpy(tmpLString, MCredShowAttrs( &C->L.AP, C->L.IP, NULL, NULL, NULL, &C->F, 0, (1 << mcsLimits) | (1 << mcsUsage)), sizeof(tmpLString)); /* NAME PRIO FLAG QDEF QLST M PLST FSTARG Limits */ MUSNPrintF(&BPtr,&BSpace,"%-14s %8ld %-12s %-12s %12s%c %-20s %5.2lf %7s\n", C->Name, C->F.Priority, (tmpLine[0] != '\0') ? tmpLine : NONE, ((mqos_t *)C->F.QDef) != NULL ? ((mqos_t *)C->F.QDef)->Name : NONE, (tmpQALString[0] != '\0') ? tmpQALString : NONE, QALChar, (C->F.PAL[0] == 0) ? NONE : MUListAttrs(ePartition,C->F.PAL[0]), C->F.FSTarget, (tmpLString[0] != '\0') ? tmpLString : NONE); /* list extended class attributes */ tmpLine[0] = '\0'; for (aindex = 0;ClAList[aindex] != -1;aindex++) { if ((MClassAToString(C,ClAList[aindex],tmpLString,mdfString,0) == SUCCESS) && (tmpLString[0] != '\0') && strcmp(tmpLString,NONE)) { sprintf(&tmpLine[strlen(tmpLine)]," %s=%s", MClassAttr[ClAList[aindex]], tmpLString); } } /* END for (aindex) */ /* list extended cred attributes */ for (aindex = 0;CAList[aindex] != -1;aindex++) { if ((MCredAToString((void *)C,mxoClass,CAList[aindex],tmpLString,mdfString) == SUCCESS) && (tmpLString[0] != '\0')) { sprintf(&tmpLine[strlen(tmpLine)]," %s=%s", MCredAttr[CAList[aindex]], tmpLString); } } /* END for (aindex) */ if (tmpLine[0] != '\0') { MUStrNCat(&BPtr,&BSpace,tmpLine); MUStrNCat(&BPtr,&BSpace,"\n"); } } /* END for (cindex) */ return(SUCCESS); } /* END MClassShow() */