9a0042c61e
git-svn-id: svn://opensvn.adaptivecomputing.com/maui/trunk@2 3f5042e3-fb1d-0410-be18-d6ca2573e517
257 lines
4.9 KiB
C
257 lines
4.9 KiB
C
/* HEADER */
|
|
|
|
|
|
int MClusterUpdateNodeState()
|
|
|
|
{
|
|
int nindex;
|
|
int rqindex;
|
|
|
|
mreq_t *RQ;
|
|
mjob_t *J;
|
|
|
|
short TotalTaskDed[MAX_MNODE];
|
|
short TotalProcDed[MAX_MNODE];
|
|
|
|
double TotalProcUtl[MAX_MNODE];
|
|
|
|
mnode_t *N;
|
|
|
|
const char *FName = "MClusterUpdateNodeState";
|
|
|
|
DBG(3,fSTAT) DPrint("%s()\n",
|
|
FName);
|
|
|
|
memset(TotalTaskDed,0,sizeof(TotalTaskDed));
|
|
memset(TotalProcDed,0,sizeof(TotalProcDed));
|
|
memset(TotalProcUtl,0,sizeof(TotalProcUtl));
|
|
|
|
/* add procs of all active jobs (newly updated or not) */
|
|
|
|
for (J = MJob[0]->Next;(J != NULL) && (J != MJob[0]);J = J->Next)
|
|
{
|
|
if (MJOBISACTIVE(J))
|
|
{
|
|
for (rqindex = 0;J->Req[rqindex] != NULL;rqindex++)
|
|
{
|
|
RQ = J->Req[rqindex];
|
|
|
|
for (nindex = 0;RQ->NodeList[nindex].N != NULL;nindex++)
|
|
{
|
|
N = RQ->NodeList[nindex].N;
|
|
|
|
TotalTaskDed[N->Index] += RQ->NodeList[nindex].TC;
|
|
TotalProcDed[N->Index] += RQ->NodeList[nindex].TC * (RQ->DRes.Procs >= 0) ?
|
|
RQ->DRes.Procs : N->CRes.Procs;
|
|
TotalProcUtl[N->Index] += RQ->NodeList[nindex].TC *
|
|
RQ->URes.Procs / 100.0;
|
|
} /* END for (nindex) */
|
|
} /* END for (rqindex) */
|
|
} /* END if (J->State) */
|
|
} /* END for (J = MJob[0]->Next;(J != NULL) && (J != MJob[0]);J = J->Next) */
|
|
|
|
for (nindex = 0;nindex < MAX_MNODE;nindex++)
|
|
{
|
|
N = MNode[nindex];
|
|
|
|
if ((N == NULL) || (N->Name[0] == '\0'))
|
|
break;
|
|
|
|
if (N->Name[0] == '\1')
|
|
continue;
|
|
|
|
/* reset job info */
|
|
|
|
N->JList[0] = NULL;
|
|
|
|
MNodeAdjustAvailResources(
|
|
N,
|
|
TotalProcUtl[N->Index],
|
|
TotalProcDed[N->Index],
|
|
TotalTaskDed[N->Index]);
|
|
|
|
DBG(6,fPBS) DPrint("INFO: node '%s' C/A/D procs: %d/%d/%d\n",
|
|
N->Name,
|
|
N->CRes.Procs,
|
|
N->ARes.Procs,
|
|
N->DRes.Procs);
|
|
} /* END for (nindex) */
|
|
|
|
/* associate job to node */
|
|
|
|
for (J = MJob[0]->Next;(J != NULL) && (J != MJob[0]);J = J->Next)
|
|
{
|
|
if (MJOBISACTIVE(J))
|
|
{
|
|
MJobAddToNL(J,NULL);
|
|
}
|
|
} /* END for (J) */
|
|
|
|
return(SUCCESS);
|
|
} /* END MClusterUpdateNodeState() */
|
|
|
|
|
|
|
|
|
|
int MClusterClearUsage()
|
|
|
|
{
|
|
int nindex;
|
|
mnode_t *N;
|
|
|
|
const char *FName = "MClusterClearUsage";
|
|
|
|
DBG(3,fSTRUCT) DPrint("%s()\n",
|
|
FName);
|
|
|
|
for (nindex = 0;nindex < MAX_MNODE;nindex++)
|
|
{
|
|
N = MNode[nindex];
|
|
|
|
if ((N == NULL) || (N->Name[0] == '\0'))
|
|
break;
|
|
|
|
if (N->Name[0] == '\1')
|
|
continue;
|
|
|
|
memset(&N->DRes,0,sizeof(N->DRes));
|
|
} /* END for (nindex) */
|
|
|
|
/* adjust global node */
|
|
|
|
if (MSched.GN != NULL)
|
|
{
|
|
N = MSched.GN;
|
|
|
|
/* reset global node */
|
|
|
|
N->MTime = MSched.Time;
|
|
N->ATime = MSched.Time;
|
|
|
|
memcpy(&N->ARes,&N->CRes,sizeof(N->ARes));
|
|
|
|
MNodeSetState(N,mnsIdle,0);
|
|
} /* END if (MNodeFind(MDEF_GNNAME,&N) == SUCCESS) */
|
|
|
|
return(SUCCESS);
|
|
} /* END MClusterClearUsage() */
|
|
|
|
|
|
|
|
|
|
int MClusterShowARes(
|
|
|
|
char *ResDesc, /* I */
|
|
int DFlags, /* I */
|
|
int DisplayMode, /* I */
|
|
char *Buf, /* O */
|
|
int BufSize) /* O */
|
|
|
|
{
|
|
char UName[MAX_MNAME];
|
|
char GName[MAX_MNAME];
|
|
char AName[MAX_MNAME];
|
|
char CName[MAX_MNAME];
|
|
char QName[MAX_MNAME];
|
|
char PName[MAX_MNAME];
|
|
|
|
char FeatureString[MAX_MLINE];
|
|
|
|
long MinTime;
|
|
int MinNodes;
|
|
int MinProcs;
|
|
|
|
int ReqMem;
|
|
char ReqMemCmp[MAX_MNAME];
|
|
|
|
int ShowSMP; /* (boolean) */
|
|
|
|
int Flags; /* (BM) */
|
|
|
|
char *BPtr;
|
|
int BSpace;
|
|
|
|
const char *FName = "MClusterShowARes";
|
|
|
|
DBG(2,fUI) DPrint("%s(%s,%d,%d,Buf,BufSize)\n",
|
|
FName,
|
|
(ResDesc != NULL) ? ResDesc : "NULL",
|
|
DFlags,
|
|
DisplayMode);
|
|
|
|
if ((ResDesc == NULL) || (Buf == NULL))
|
|
{
|
|
return(FAILURE);
|
|
}
|
|
|
|
BPtr = Buf;
|
|
BSpace = BufSize;
|
|
|
|
BPtr[0] = '\0';
|
|
|
|
/* initialize response */
|
|
|
|
if (DisplayMode == mwpXML)
|
|
{
|
|
/* NYI */
|
|
}
|
|
|
|
/* parse resource description */
|
|
|
|
if (MUSScanF(ResDesc,"%x%s %x%s %x%s %x%s %ld %ld %ld %d %d %x%s %d %d %x%s %x%s %x%s",
|
|
sizeof(UName),
|
|
UName,
|
|
sizeof(GName),
|
|
GName,
|
|
sizeof(AName),
|
|
AName,
|
|
sizeof(PName),
|
|
PName,
|
|
&MinTime,
|
|
&MinNodes,
|
|
&MinProcs,
|
|
&ReqMem,
|
|
&ReqMem,
|
|
sizeof(ReqMemCmp),
|
|
ReqMemCmp,
|
|
&ShowSMP,
|
|
&Flags,
|
|
sizeof(CName),
|
|
CName,
|
|
sizeof(FeatureString),
|
|
FeatureString,
|
|
sizeof(QName),
|
|
QName) == FAILURE)
|
|
{
|
|
/* invalid request string */
|
|
|
|
DBG(3,fUI) DPrint("INFO: cannot parse request\n");
|
|
|
|
switch (DisplayMode)
|
|
{
|
|
case mwpXML:
|
|
|
|
/* NYI */
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
sprintf(BPtr,"ERROR: cannot parse request\n");
|
|
|
|
break;
|
|
} /* END switch(DisplayMode) */
|
|
|
|
return(FAILURE);
|
|
}
|
|
|
|
/* NYI */
|
|
|
|
return(SUCCESS);
|
|
} /* END MClusterShowARes() */
|
|
|
|
|
|
|
|
/* END MCluster.c */
|
|
|