Harden ShardCommitCoordinator to survive EOS write retries 90/81790/1
authorTomas Cere <tomas.cere@pantheon.tech>
Fri, 26 Apr 2019 10:37:38 +0000 (12:37 +0200)
committerTomas Cere <tomas.cere@pantheon.tech>
Fri, 26 Apr 2019 10:37:38 +0000 (12:37 +0200)
EntityOwnershipShard can break the usual shard rule of only one 3PC
running at one time, causing the retrying write attempting to modify
an already sealed modification.

Change-Id: Iaa56b68a30f9191f7aa14428f39d4d7524aeb09d
Signed-off-by: Tomas Cere <tomas.cere@pantheon.tech>
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/CohortEntry.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ShardCommitCoordinator.java

index 3d5238e..5e5d0f1 100644 (file)
@@ -32,6 +32,7 @@ final class CohortEntry {
     private Shard shard;
 
     private CohortEntry(final ReadWriteShardDataTreeTransaction transaction, final short clientVersion) {
+        this.cohort = null;
         this.transaction = Preconditions.checkNotNull(transaction);
         this.transactionId = transaction.getIdentifier();
         this.clientVersion = clientVersion;
@@ -122,6 +123,10 @@ final class CohortEntry {
         }
     }
 
+    boolean isSealed() {
+        return cohort != null;
+    }
+
     Optional<SortedSet<String>> getParticipatingShardNames() {
         return cohort != null ? cohort.getParticipatingShardNames() : Optional.empty();
     }
index bfb4165..85e1345 100644 (file)
@@ -129,7 +129,7 @@ final class ShardCommitCoordinator {
      */
     void handleBatchedModifications(final BatchedModifications batched, final ActorRef sender, final Shard shard) {
         CohortEntry cohortEntry = cohortCache.get(batched.getTransactionId());
-        if (cohortEntry == null) {
+        if (cohortEntry == null || cohortEntry.isSealed()) {
             cohortEntry = CohortEntry.createOpen(dataTree.newReadWriteTransaction(batched.getTransactionId()),
                 batched.getVersion());
             cohortCache.put(cohortEntry.getTransactionId(), cohortEntry);

©2013 OpenDaylight, A Linux Foundation Collaborative Project. All Rights Reserved.
OpenDaylight is a registered trademark of The OpenDaylight Project, Inc.
Linux Foundation and OpenDaylight are registered trademarks of the Linux Foundation.
Linux is a registered trademark of Linus Torvalds.