blob: b90858b156a6c46d452704635d6d8dc0541da2c1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ducc.orchestrator;
import java.io.File;
import org.apache.uima.ducc.common.utils.DuccLogger;
import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
import org.apache.uima.ducc.common.utils.TimeStamp;
import org.apache.uima.ducc.common.utils.id.DuccId;
import org.apache.uima.ducc.orchestrator.user.UserLogging;
import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
import org.apache.uima.ducc.transport.event.common.IDuccWorkService.ServiceDeploymentType;
import org.apache.uima.ducc.transport.event.common.IDuccWorkJob;
import org.apache.uima.ducc.transport.event.common.IRationale;
import org.apache.uima.ducc.transport.event.common.IDuccCompletionType.JobCompletionType;
import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
public class StateJobAccounting {
private static final DuccLogger logger = DuccLoggerComponents.getOrLogger(StateJobAccounting.class.getName());
private static StateJobAccounting instance = new StateJobAccounting();
public static StateJobAccounting getInstance() {
return instance;
}
private boolean advance(IDuccWorkJob job) {
String methodName = "advance";
boolean retVal = false;
try {
DuccType duccType = job.getDuccType();
switch(duccType) {
case Service:
ServiceDeploymentType sdt = job.getServiceDeploymentType();
switch(sdt) {
case other:
JobState state = job.getJobState();
switch(state) {
case Initializing:
JobState next = JobState.Running;
JobState prev = state;
logger.info(methodName, job.getDuccId(),"current["+next+"] previous["+prev+"]"+" "+"-> skipped");
retVal = stateChange(job, next);
break;
default:
logger.debug(methodName, job.getDuccId(), "State is not "+JobState.Initializing+" state");
break;
}
break;
default:
logger.debug(methodName, job.getDuccId(), "Service is not ManagedReservation (other); ServiceDeploymentType="+sdt);
break;
}
break;
default:
logger.debug(methodName, job.getDuccId(), "DuccType="+duccType);
break;
}
}
catch(Exception e) {
logger.error(methodName, job.getDuccId(), e);
}
return retVal;
}
public boolean stateChange(IDuccWorkJob job, JobState state) {
String methodName = "stateChange";
boolean retVal = false;
JobState prev = job.getJobState();
JobState next = state;
switch(prev) {
case Completing:
retVal = stateChangeFromCompleting(prev, next);
break;
case Completed:
switch(next) {
case Completing:
next = prev;
break;
default:
break;
}
retVal = stateChangeFromCompleted(prev, next);
break;
case Assigned:
retVal = stateChangeFromAssigned(prev, next);
break;
case Initializing:
retVal = stateChangeFromInitializing(prev, next);
break;
case Received:
retVal = stateChangeFromReceived(prev, next);
break;
case Running:
retVal = stateChangeFromRunning(prev, next);
break;
case Undefined:
retVal = stateChangeFromUndefined(prev, next);
break;
case WaitingForDriver:
retVal = stateChangeFromWaitingForDriver(prev, next);
break;
case WaitingForResources:
retVal = stateChangeFromWaitingForResources(prev, next);
break;
case WaitingForServices:
retVal = stateChangeFromWaitingForServices(prev, next);
break;
}
if(retVal) {
job.setJobState(state);
switch(state) {
case Completing:
job.getStandardInfo().setDateOfCompletion(TimeStamp.getCurrentMillis());
default:
break;
}
switch(state) {
case Completed:
recordUserState(job);
recordUserCompletion(job);
break;
default:
recordUserState(job);
break;
}
boolean advanceVal = advance(job);
if(!advanceVal) {
logger.info(methodName, job.getDuccId(),"current["+next+"] previous["+prev+"]");
}
}
else {
try {
throw new RuntimeException();
}
catch(Exception e) {
logger.error(methodName, job.getDuccId(),"current["+prev+"] requested["+next+"]"+" ignored", e);
}
}
return retVal;
}
private boolean stateChangeFromCompleting(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromCompleted(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: break;
case Completed: break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromAssigned(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: retVal = true; break;
case Received: break;
case Running: retVal = true; break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromInitializing(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: retVal = true; break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromReceived(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: retVal = true; break;
case WaitingForResources: retVal = true; break;
case WaitingForServices: retVal = true; break;
}
return retVal;
}
private boolean stateChangeFromRunning(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromUndefined(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: break;
case Completed: break;
case Assigned: break;
case Initializing: break;
case Received: retVal = true; break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromWaitingForDriver(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: retVal = true; break;
case WaitingForServices: retVal = true; break;
}
return retVal;
}
private boolean stateChangeFromWaitingForResources(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: retVal = true; break;
case Initializing: retVal = true; break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: break;
case WaitingForServices: break;
}
return retVal;
}
private boolean stateChangeFromWaitingForServices(JobState prev, JobState next) {
boolean retVal = false;
switch(next) {
case Completing: retVal = true; break;
case Completed: retVal = true; break;
case Assigned: break;
case Initializing: break;
case Received: break;
case Running: break;
case Undefined: break;
case WaitingForDriver: break;
case WaitingForResources: retVal = true; break;
case WaitingForServices: break;
}
return retVal;
}
public boolean complete(IDuccWorkJob job, JobCompletionType completionType, IRationale completionRationale) {
String methodName = "complete";
boolean retVal = false;
logger.debug(methodName, job.getDuccId(), job.getCompletionType()+" "+job.getCompletionRationale());
switch(job.getCompletionType()) {
case Undefined:
retVal = true;
break;
default:
break;
}
if(retVal) {
job.setCompletion(completionType,completionRationale);
logger.info(methodName, job.getDuccId(), completionType+" "+completionRationale);
}
else {
logger.info(methodName, job.getDuccId(), completionType+" "+"ignored");
}
return retVal;
}
private void recordUserState(IDuccWorkJob job) {
String methodName = "recordUserState";
DuccId jobid = null;
String text = "";
try {
jobid = job.getDuccId();
String userName = job.getStandardInfo().getUser();
String userLogDir = job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
JobState jobState = job.getJobState();
if(jobState != null) {
text = jobState.toString();
UserLogging.record(userName, userLogDir, text);
logger.debug(methodName, job.getDuccId(), text);
}
}
catch(Exception e) {
logger.error(methodName, jobid, e);
}
}
private void recordUserCompletion(IDuccWorkJob job) {
String methodName = "recordUserCompletion";
DuccId jobid = null;
String text = "";
try {
jobid = job.getDuccId();
String userName = job.getStandardInfo().getUser();
String userLogDir = job.getUserLogsDir()+job.getDuccId().getFriendly()+File.separator;
JobCompletionType jobCompletionType = job.getCompletionType();
if(jobCompletionType != null) {
text = "completion type: "+jobCompletionType.toString();
UserLogging.record(userName, userLogDir, text);
logger.debug(methodName, job.getDuccId(), text);
}
IRationale rationale = job.getCompletionRationale();
if(rationale != null) {
text = "rationale: "+rationale.toString();
UserLogging.record(userName, userLogDir, text);
logger.debug(methodName, job.getDuccId(), text);
}
}
catch(Exception e) {
logger.error(methodName, jobid, e);
}
}
}