use of org.opendaylight.controller.cluster.datastore.messages.BatchedModifications in project controller by opendaylight.
the class ShardCommitCoordinator method createForwardedBatchedModifications.
Collection<BatchedModifications> createForwardedBatchedModifications(final BatchedModifications from, final int maxModificationsPerBatch) {
CohortEntry cohortEntry = cohortCache.remove(from.getTransactionId());
if (cohortEntry == null || cohortEntry.getTransaction() == null) {
return Collections.singletonList(from);
}
cohortEntry.applyModifications(from.getModifications());
final LinkedList<BatchedModifications> newModifications = new LinkedList<>();
cohortEntry.getTransaction().getSnapshot().applyToCursor(new AbstractBatchedModificationsCursor() {
@Override
protected BatchedModifications getModifications() {
if (newModifications.isEmpty() || newModifications.getLast().getModifications().size() >= maxModificationsPerBatch) {
newModifications.add(new BatchedModifications(from.getTransactionId(), from.getVersion()));
}
return newModifications.getLast();
}
});
BatchedModifications last = newModifications.getLast();
last.setDoCommitOnReady(from.isDoCommitOnReady());
last.setReady(from.isReady());
last.setTotalMessagesSent(newModifications.size());
return newModifications;
}
use of org.opendaylight.controller.cluster.datastore.messages.BatchedModifications in project controller by opendaylight.
the class ShardCommitCoordinator method convertPendingTransactionsToMessages.
Collection<?> convertPendingTransactionsToMessages(final int maxModificationsPerBatch) {
final Collection<VersionedExternalizableMessage> messages = new ArrayList<>();
for (ShardDataTreeCohort cohort : dataTree.getAndClearPendingTransactions()) {
CohortEntry cohortEntry = cohortCache.remove(cohort.getIdentifier());
if (cohortEntry == null) {
continue;
}
final Deque<BatchedModifications> newMessages = new ArrayDeque<>();
cohortEntry.getDataTreeModification().applyToCursor(new AbstractBatchedModificationsCursor() {
@Override
protected BatchedModifications getModifications() {
final BatchedModifications lastBatch = newMessages.peekLast();
if (lastBatch != null && lastBatch.getModifications().size() >= maxModificationsPerBatch) {
return lastBatch;
}
// Allocate a new message
final BatchedModifications ret = new BatchedModifications(cohortEntry.getTransactionId(), cohortEntry.getClientVersion());
newMessages.add(ret);
return ret;
}
});
final BatchedModifications last = newMessages.peekLast();
if (last != null) {
final boolean immediate = cohortEntry.isDoImmediateCommit();
last.setDoCommitOnReady(immediate);
last.setReady(true);
last.setTotalMessagesSent(newMessages.size());
messages.addAll(newMessages);
if (!immediate) {
switch(cohort.getState()) {
case CAN_COMMIT_COMPLETE:
case CAN_COMMIT_PENDING:
messages.add(new CanCommitTransaction(cohortEntry.getTransactionId(), cohortEntry.getClientVersion()));
break;
case PRE_COMMIT_COMPLETE:
case PRE_COMMIT_PENDING:
messages.add(new CommitTransaction(cohortEntry.getTransactionId(), cohortEntry.getClientVersion()));
break;
default:
break;
}
}
}
}
return messages;
}
use of org.opendaylight.controller.cluster.datastore.messages.BatchedModifications in project controller by opendaylight.
the class EntityOwnershipShardCommitCoordinator method pruneModifications.
@Nullable
private BatchedModifications pruneModifications(BatchedModifications toPrune) {
BatchedModifications prunedModifications = new BatchedModifications(toPrune.getTransactionId(), toPrune.getVersion());
prunedModifications.setDoCommitOnReady(toPrune.isDoCommitOnReady());
prunedModifications.setReady(toPrune.isReady());
prunedModifications.setTotalMessagesSent(toPrune.getTotalMessagesSent());
for (Modification mod : toPrune.getModifications()) {
if (canForwardModificationToNewLeader(mod)) {
prunedModifications.addModification(mod);
}
}
return !prunedModifications.getModifications().isEmpty() ? prunedModifications : null;
}
use of org.opendaylight.controller.cluster.datastore.messages.BatchedModifications in project controller by opendaylight.
the class EntityOwnershipShardCommitCoordinator method newInflightCommitWithDifferentTransactionID.
private void newInflightCommitWithDifferentTransactionID() {
BatchedModifications newBatchedModifications = newBatchedModifications();
newBatchedModifications.addModifications(inflightCommit.getModifications());
inflightCommit = newBatchedModifications;
}
use of org.opendaylight.controller.cluster.datastore.messages.BatchedModifications in project controller by opendaylight.
the class ShardTest method testBatchedModificationsWithOperationFailure.
@Test
public void testBatchedModificationsWithOperationFailure() throws Exception {
new ShardTestKit(getSystem()) {
{
final TestActorRef<Shard> shard = actorFactory.createTestActor(newShardProps().withDispatcher(Dispatchers.DefaultDispatcherId()), "testBatchedModificationsWithOperationFailure");
waitUntilLeader(shard);
// Test merge with invalid data. An exception should occur when
// the merge is applied. Note that
// write will not validate the children for performance reasons.
final TransactionIdentifier transactionID = nextTransactionId();
final ContainerNode invalidData = ImmutableContainerNodeBuilder.create().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TestModel.TEST_QNAME)).withChild(ImmutableNodes.leafNode(TestModel.JUNK_QNAME, "junk")).build();
BatchedModifications batched = new BatchedModifications(transactionID, CURRENT_VERSION);
batched.addModification(new MergeModification(TestModel.TEST_PATH, invalidData));
shard.tell(batched, getRef());
Failure failure = expectMsgClass(duration("5 seconds"), akka.actor.Status.Failure.class);
final Throwable cause = failure.cause();
batched = new BatchedModifications(transactionID, DataStoreVersions.CURRENT_VERSION);
batched.setReady(true);
batched.setTotalMessagesSent(2);
shard.tell(batched, getRef());
failure = expectMsgClass(duration("5 seconds"), akka.actor.Status.Failure.class);
assertEquals("Failure cause", cause, failure.cause());
}
};
}
Aggregations