@Override public ListenableFuture<Void> abort() { return delegateCohort.abort(); }
/** * * Invokes canCommit on underlying cohorts and returns composite future * which will contains {@link Boolean#TRUE} only and only if * all cohorts returned true. * * Valid state transition is from SUBMITTED to CAN_COMMIT, * if currentPhase is not SUBMITTED throws IllegalStateException. * * @return List of all cohorts futures from can commit phase. * */ private ListenableFuture<?>[] canCommitAll() { final ListenableFuture<?>[] ops = new ListenableFuture<?>[cohorts.size()]; int i = 0; for (final DOMStoreThreePhaseCommitCohort cohort : cohorts) { ops[i++] = cohort.canCommit(); } return ops; }
@Override public ListenableFuture<Void> commit() { return delegateCohort.commit(); }
@Override public ListenableFuture<Void> preCommit() { return delegateCohort.preCommit(); }
/** * * Invokes preCommit on underlying cohorts and returns future * which will complete once all preCommit on cohorts completed or * failed. * * * Valid state transition is from CAN_COMMIT to PRE_COMMIT, if current * state is not CAN_COMMIT * throws IllegalStateException. * * @return List of all cohorts futures from can commit phase. * */ private ListenableFuture<?>[] preCommitAll() { final ListenableFuture<?>[] ops = new ListenableFuture<?>[cohorts.size()]; int i = 0; for (final DOMStoreThreePhaseCommitCohort cohort : cohorts) { ops[i++] = cohort.preCommit(); } return ops; }
@Override public void onSuccess(Void notUsed) { if(!cohortIterator.hasNext()) { // All cohorts completed successfully - we can move on to the commit phase doCommit(startTime, clientSubmitFuture, transaction, cohorts); } else { ListenableFuture<Void> preCommitFuture = cohortIterator.next().preCommit(); Futures.addCallback(preCommitFuture, this, MoreExecutors.directExecutor()); } }
/** * * Invokes commit on underlying cohorts and returns future which * completes * once all commits on cohorts are completed. * * Valid state transition is from PRE_COMMIT to COMMIT, if not throws * IllegalStateException * * @return List of all cohorts futures from can commit phase. */ private ListenableFuture<?>[] commitAll() { final ListenableFuture<?>[] ops = new ListenableFuture<?>[cohorts.size()]; int i = 0; for (final DOMStoreThreePhaseCommitCohort cohort : cohorts) { ops[i++] = cohort.commit(); } return ops; }
@Override public ListenableFuture<Void> abort() { return delegate().abort(); }
@Override public ListenableFuture<Boolean> canCommit() { return delegate().canCommit(); }
@Override public ListenableFuture<Void> preCommit() { return delegate().preCommit(); }
@Override public ListenableFuture<Void> commit() { return delegate().commit(); } }
/** * Invokes abort on underlying cohorts and returns future which * completes once all abort on cohorts are completed. * * @return Future which will complete once all cohorts completed * abort. */ @SuppressWarnings({"unchecked", "rawtypes"}) private ListenableFuture<Void> abortAsyncAll() { final ListenableFuture<?>[] ops = new ListenableFuture<?>[cohorts.size()]; int i = 0; for (final DOMStoreThreePhaseCommitCohort cohort : cohorts) { ops[i++] = cohort.abort(); } /* * We are returning all futures as list, not only succeeded ones in * order to fail composite future if any of them failed. * See Futures.allAsList for this description. */ return (ListenableFuture) Futures.allAsList(ops); } }
@Override public ListenableFuture<Boolean> canCommit() { return delegate().canCommit(); }
@Override public ListenableFuture<Void> preCommit() { return delegate().preCommit(); }
@Override public ListenableFuture<Void> commit() { return delegate().commit(); } }
@Override public ListenableFuture<Void> abort() { return delegate().abort(); }
@Override public void onSuccess(Boolean result) { if (result == null || !result) { handleException(clientSubmitFuture, transaction, cohorts, CAN_COMMIT, TransactionCommitFailedExceptionMapper.CAN_COMMIT_ERROR_MAPPER, new TransactionCommitFailedException( "Can Commit failed, no detailed cause available.")); } else { if(!cohortIterator.hasNext()) { // All cohorts completed successfully - we can move on to the preCommit phase doPreCommit(startTime, clientSubmitFuture, transaction, cohorts); } else { ListenableFuture<Boolean> canCommitFuture = cohortIterator.next().canCommit(); Futures.addCallback(canCommitFuture, this, MoreExecutors.directExecutor()); } } }
private void doPreCommit(final long startTime, final AsyncNotifyingSettableFuture clientSubmitFuture, final DOMDataWriteTransaction transaction, final Collection<DOMStoreThreePhaseCommitCohort> cohorts) { final Iterator<DOMStoreThreePhaseCommitCohort> cohortIterator = cohorts.iterator(); // Not using Futures.allAsList here to avoid its internal overhead. FutureCallback<Void> futureCallback = new FutureCallback<Void>() { @Override public void onSuccess(Void notUsed) { if(!cohortIterator.hasNext()) { // All cohorts completed successfully - we can move on to the commit phase doCommit(startTime, clientSubmitFuture, transaction, cohorts); } else { ListenableFuture<Void> preCommitFuture = cohortIterator.next().preCommit(); Futures.addCallback(preCommitFuture, this, MoreExecutors.directExecutor()); } } @Override public void onFailure(Throwable t) { handleException(clientSubmitFuture, transaction, cohorts, PRE_COMMIT, TransactionCommitFailedExceptionMapper.PRE_COMMIT_MAPPER, t); } }; ListenableFuture<Void> preCommitFuture = cohortIterator.next().preCommit(); Futures.addCallback(preCommitFuture, futureCallback, MoreExecutors.directExecutor()); }
private void doCommit(final long startTime, final AsyncNotifyingSettableFuture clientSubmitFuture, final DOMDataWriteTransaction transaction, final Collection<DOMStoreThreePhaseCommitCohort> cohorts) { final Iterator<DOMStoreThreePhaseCommitCohort> cohortIterator = cohorts.iterator(); // Not using Futures.allAsList here to avoid its internal overhead. FutureCallback<Void> futureCallback = new FutureCallback<Void>() { @Override public void onSuccess(Void notUsed) { if(!cohortIterator.hasNext()) { // All cohorts completed successfully - we're done. commitStatsTracker.addDuration(System.nanoTime() - startTime); clientSubmitFuture.set(); } else { ListenableFuture<Void> commitFuture = cohortIterator.next().commit(); Futures.addCallback(commitFuture, this, MoreExecutors.directExecutor()); } } @Override public void onFailure(Throwable t) { handleException(clientSubmitFuture, transaction, cohorts, COMMIT, TransactionCommitFailedExceptionMapper.COMMIT_ERROR_MAPPER, t); } }; ListenableFuture<Void> commitFuture = cohortIterator.next().commit(); Futures.addCallback(commitFuture, futureCallback, MoreExecutors.directExecutor()); }
int i = 0; for (DOMStoreThreePhaseCommitCohort cohort : cohorts) { canCommitFutures[i++] = cohort.abort();