Hi guys, I've found that while submitting data that located in multiple shards to datastore, the ThreePhaseCommitCohortProxy asks each ShardCoordinator by sending can-commit message(RPC) One-By-One. So I wonder what if these can-commit messages were sent parallel? Is there any side-effect to do this? The source code is located in controller/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java, line 156-199, and you can read it here. Thanks for answering in advance.
private void finishCanCommit(final SettableFuture<Boolean> returnFuture) { LOG.debug("Tx {} finishCanCommit", transactionId); // For empty transactions return immediately if (cohorts.size() == 0) { LOG.debug("Tx {}: canCommit returning result true", transactionId); returnFuture.set(Boolean.TRUE); return; } commitOperationCallback = new TransactionRateLimitingCallback(actorContext); commitOperationCallback.run(); final Iterator<CohortInfo> iterator = cohorts.iterator(); final OnComplete<Object> onComplete = new OnComplete<Object>() { @Override public void onComplete(Throwable failure, Object response) { if (failure != null) { LOG.debug("Tx {}: a canCommit cohort Future failed", transactionId, failure); returnFuture.setException(failure); commitOperationCallback.failure(); return; } // Only the first call to pause takes effect - subsequent calls before resume are no-ops. So // this means we'll only time the first transaction canCommit which should be fine. commitOperationCallback.pause(); boolean result = true; if (CanCommitTransactionReply.isSerializedType(response)) { CanCommitTransactionReply reply = CanCommitTransactionReply.fromSerializable(response); LOG.debug("Tx {}: received {}", transactionId, response); if (!reply.getCanCommit()) { result = false; } } else { LOG.error("Unexpected response type {}", response.getClass()); returnFuture.setException(new IllegalArgumentException( String.format("Unexpected response type %s", response.getClass()))); return; } if (iterator.hasNext() && result) { sendCanCommitTransaction(iterator.next(), this); } else { LOG.debug("Tx {}: canCommit returning result: {}", transactionId, result); returnFuture.set(Boolean.valueOf(result)); } } }; sendCanCommitTransaction(iterator.next(), onComplete); } -- Fan Hangyu Department of Electronic Engineering, Tsinghua University, Beijing 100084, P. R. China Email: fh...@mails.tsinghua.edu.cn
_______________________________________________ controller-dev mailing list controller-dev@lists.opendaylight.org https://lists.opendaylight.org/mailman/listinfo/controller-dev