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 3d5238ee77812eed4190017d7d7a1289887875dd..5e5d0f16cd220759c7ad3d1a99dfa8e6c8f61f06 100644 (file)
@@ -32,6 +32,7 @@ final class CohortEntry {
     private Shard shard;
 
     private CohortEntry(final ReadWriteShardDataTreeTransaction transaction, final short clientVersion) {
     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;
         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();
     }
     Optional<SortedSet<String>> getParticipatingShardNames() {
         return cohort != null ? cohort.getParticipatingShardNames() : Optional.empty();
     }
index bfb416534bdc1a5d0cb5efa9c36d465820b4d15d..85e1345e0b03e5e765c0640010e59452485d563c 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());
      */
     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);
             cohortEntry = CohortEntry.createOpen(dataTree.newReadWriteTransaction(batched.getTransactionId()),
                 batched.getVersion());
             cohortCache.put(cohortEntry.getTransactionId(), cohortEntry);