for ( IDuccProcess p : lproc.values() ) {
// look up share, update resident memory, process state, investment (eventually), maybe pid?
// simply update the share with the information. we pass in the jobid as a sanity check so
// we can crash or at least complain loudly on mismatch.
Share s = scheduler.getShare(p.getDuccId());
long mem = p.getResidentMemory();
ProcessState state = p.getProcessState();
String pid = p.getPID();
logger.info(methodName, jobid, "New process ", s.toString(), mem, state, pid);
if ( ! s.update(jobid, mem, state, p.getTimeWindowInit(), p.getTimeWindowRun(), pid) ) {
// TODO: probably change to just a warning and cancel the job - for now I want an attention-getter
throw new SchedulingException(jobid, "Process assignemnt arrives for share " + s.toString() +
" but jobid " + jobid + " does not match share " + s.getJob().getId());
}
//scheduler.signalGrowth(jobid, s);
// sadly, the pid is almost always null here
//logger.info(methodName, jobid,
// "New process arrives for share", s.toString(), "PID", pid);
}
// gone stuff in in the right side of the map
Map<DuccId, IDuccProcess> rproc = diffmap.getRight();
for ( IDuccProcess p : rproc .values()) {
// these processes are done. look up the job and tell it process complete.
Share s = scheduler.getShare(p.getDuccId());
IRmJob j = scheduler.getJob(jobid);
if ( j == null ) {
throw new SchedulingException(jobid, "Process completion arrives for share " + s.toString() +
" but job " + jobid + "cannot be found.");
}
scheduler.signalCompletion(j, s);
logger.info(methodName, jobid,
String.format("Process %5s", p.getPID()),
"Completion:", s.toString());
}
for( DuccMapValueDifference<IDuccProcess> pd: diffmap ) {
IDuccProcess pl = pd.getLeft();
IDuccProcess pr = pd.getRight();
Share sl = scheduler.getShare(pl.getDuccId());
Share sr = scheduler.getShare(pr.getDuccId());
String shareL = ( sl == null ) ? "<none>" : sl.toString();
String shareR = ( sr == null ) ? "<none>" : sr.toString();
ITimeWindow initL = pl.getTimeWindowInit();
ITimeWindow initR = pr.getTimeWindowInit();
long init_timeL = (initL == null) ? 0 : initL.getElapsedMillis();
long init_timeR = (initR == null) ? 0 : initR.getElapsedMillis();
/** extreme debugging only*/
if ( logger.isTrace() ) {
logger.trace(methodName, jobid,
"\n\tReconciling. incoming.(pid, mem, state, share, initTime)",
pl.getPID(),
pl.getResidentMemory(),
pl.getProcessState(),
shareL,
init_timeL,
"\n\tReconciling. existing.(pid, mem, state, share, initTime)",
pr.getPID(),
pr.getResidentMemory(),
pr.getProcessState(),
shareR,
init_timeR
);
} else {
if ( (pr.getPID() == null) && (pl.getPID() != null) ) {
logger.trace(methodName, jobid,
String.format("Process %5s", pl.getPID()),
"PID assignement for share", shareL);
}
if ( pl.getProcessState() != pr.getProcessState() ) {
logger.info(methodName, jobid,
String.format("Process %5s", pl.getPID()), sl.toString(),
"State:", pr.getProcessState(), "->", pl.getProcessState(),
getElapsedTime(pr.getTimeWindowInit()), getElapsedTime(pr.getTimeWindowRun()));
}
}
long mem = pl.getResidentMemory();
ProcessState state = pl.getProcessState();
String pid = pl.getPID();
Share s = scheduler.getShare(pl.getDuccId());
if ( pl.isActive() ) {
if ( s == null ) {
// this can happen if a node dies and the share is purged so it's ok.
logger.warn(methodName, jobid, "Update for share from process", pl.getPID(), pl.getDuccId(), "but cannot find share.");
continue;
}
if ( s.isPurged() ) {
IRmJob j = scheduler.getJob(jobid);
scheduler.signalCompletion(j, s);
logger.info(methodName, jobid, "Process", pl.getPID(), "marked complete because it is purged. State:", state);
}
if ( ! s.update(jobid, mem, state, pl.getTimeWindowInit(), pl.getTimeWindowRun(), pid) ) {
// TODO: probably change to just a warning and cancel the job - for now I want an attention-getter
throw new SchedulingException(jobid, "Process update arrives for share " + s.toString() +
" but jobid " + jobid + " does not match job in share " + s.getJob().getId());
}
// logger.debug(methodName, jobid, "Process update to process ", pid, "mem", mem, "state", state, "is assigned for share", s.toString());
} else if ( pl.isComplete() ) {
if ( s != null ) { // in some final states the share is already gone, not an error (e.g. Stopped)