package org.zstack.header.core; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; import java.util.concurrent.TimeUnit; /** */ public class FutureCompletion extends Completion { private volatile boolean success; private ErrorCode errorCode; private volatile boolean done; private boolean timeout; public boolean isTimeout() { return timeout; } public void setTimeout(boolean timeout) { this.timeout = timeout; } public FutureCompletion(AsyncBackup one, AsyncBackup... others) { super(one, others); } @Override public final synchronized void success() { this.success = true; done = true; notifyAll(); } @Override public synchronized void fail(ErrorCode errorCode) { this.success = false; this.errorCode = errorCode; done = true; notifyAll(); } public boolean isSuccess() { return success; } public ErrorCode getErrorCode() { return errorCode; } public synchronized void await(long timeout) { if (done) { return; } try { wait(timeout); } catch (InterruptedException e) { throw new CloudRuntimeException(e); } if (!done) { this.timeout = true; ErrorCode err = new ErrorCode(); err.setCode(SysErrors.TIMEOUT.toString()); err.setDetails(String.format("FutureCompletion timeout after %s seconds", TimeUnit.MILLISECONDS.toSeconds(timeout))); fail(err); } } public synchronized void await() { if (done) { return; } try { wait(); } catch (InterruptedException e) { throw new CloudRuntimeException(e); } } }