Harden ShardCommitCoordinator to survive EOS write retries 01/81801/1
authorTomas Cere <tomas.cere@pantheon.tech>
Fri, 26 Apr 2019 10:37:38 +0000 (12:37 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 29 Apr 2019 10:24:04 +0000 (10:24 +0000)
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>
(cherry picked from commit bb04f62f467cc6e6f0922ba8957b09715707940d)

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) {
+        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 403a96819f392726d7b24ef715827e1187f29841..61de06a07e1efd90e5bf8eca0870a81376018a3f 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);