/** * Schedules the execution of this thread from the last {@linkplain Continuable#suspend(Object)} point. * * @return * Future that promises the completion of the next {@link #runNextChunk()}. */ public Future<Object> resume(Outcome v) { if (resumeValue != null) { return Futures.immediateFailedFuture(new IllegalStateException("Already resumed with " + resumeValue)); } resumeValue = v; promise = SettableFuture.create(); group.scheduleRun(); return promise; }
@Override public ListenableFuture<Void> saveState() { try { final SettableFuture<Void> f = SettableFuture.create(); CpsFlowExecution exec = getFlowExecution(); if (!exec.getDurabilityHint().isPersistWithEveryStep()) { f.set(null); return f; } exec.runInCpsVmThread(new FutureCallback<CpsThreadGroup>() { @Override public void onSuccess(CpsThreadGroup result) { try { // TODO keep track of whether the program was saved anyway after saveState was called but before now, and do not bother resaving it in that case if (result.getExecution().getDurabilityHint().isPersistWithEveryStep()) { result.getExecution().getStorage().flush(); result.saveProgram(); } f.set(null); } catch (Exception x) { f.setException(x); } } @Override public void onFailure(Throwable t) { f.setException(t); } }); return f; } catch (IOException x) { return Futures.immediateFailedFuture(x); } }
programPromise = Futures.immediateFailedFuture(ex); throw new IOException("Failed to even create placeholder nodes for execution", ex); } finally { if (programPromise == null) { programPromise = Futures.immediateFailedFuture(new IllegalStateException("completed or broken execution"));
programPromise = Futures.immediateFailedFuture(new IllegalStateException("Failed loading heads", failureReason)); LOGGER.log(Level.INFO, "Creating placeholder flownodes for execution: " + this); if (this.owner != null) {