package ai.h2o.api.proto.core;
import ai.h2o.api.GrpcUtils;
import io.grpc.stub.StreamObserver;
import water.*;
import static ai.h2o.api.proto.core.JobInfo.Status.*;
/**
*/
public class JobService extends JobGrpc.JobImplBase {
@Override
public void poll(JobId request, StreamObserver<JobInfo> responseObserver) {
try {
water.Job job = resolveJob(request);
responseObserver.onNext(fillJobInfo(job));
responseObserver.onCompleted();
} catch (Throwable ex) {
String jobId = request.getJobId();
GrpcUtils.sendError(ex, responseObserver, JobInfo.newBuilder().setJobId(jobId).setStatus(FAILED));
}
}
@Override
public void cancel(JobId request, StreamObserver<JobInfo> responseObserver) {
try {
water.Job job = resolveJob(request);
job.stop();
responseObserver.onNext(fillJobInfo(job));
responseObserver.onCompleted();
} catch (Throwable ex) {
String jobId = request.getJobId();
GrpcUtils.sendError(ex, responseObserver, JobInfo.newBuilder().setJobId(jobId).setStatus(FAILED));
}
}
//--------------------------------------------------------------------------------------------------------------------
// Helpers
//--------------------------------------------------------------------------------------------------------------------
private static water.Job resolveJob(JobId request) {
String strId = request.getJobId();
Value val = DKV.get(Key.make(strId));
if (val == null) {
throw new IllegalArgumentException("Job " + strId + " not found in the DKV");
}
Iced iced = val.get();
if (iced instanceof Job) {
return (water.Job) iced;
} else {
throw new IllegalArgumentException("Id " + strId + " does not reference a Job but a " + iced.getClass());
}
}
public static JobInfo fillJobInfo(water.Job job) {
float progress = job.progress();
JobInfo.Builder jb = JobInfo.newBuilder();
jb.setJobId(job._key.toString());
jb.setDuration(job.msec());
String message = job.progress_msg();
if (message != null)
jb.setMessage(message);
if (job.isRunning()) {
jb.setStatus(job.stop_requested()? STOPPING : RUNNING);
} else {
jb.setStatus(job.stop_requested()? CANCELLED : DONE);
}
if (jb.getStatus() == RUNNING && progress >= 1) progress = 0.999f;
if (jb.getStatus() == DONE && progress < 1) progress = 1;
jb.setProgress(progress);
Throwable ex = job.ex();
if (ex != null) {
jb.setStatus(FAILED)
.setError(GrpcUtils.buildError(ex, 0));
}
if (job._result != null && !job.readyForView())
jb.setTargetId(job._result.toString());
String ttype = TypeMap.theFreezable(job._typeid).getClass().getSimpleName();
jb.setTargetType(JobInfo.TargetType.valueOf(ttype.toUpperCase()));
return jb.build();
}
}