Yuta HIGUCHI
Committed by Yuta Higuchi

IntentStores: clear transient states, after transitioning to parking state

Fix for ONOS-372

Change-Id: I2e397f7f9a60855945fd49a8170c41ab0166f6d3
...@@ -53,6 +53,7 @@ import org.slf4j.Logger; ...@@ -53,6 +53,7 @@ import org.slf4j.Logger;
53 53
54 import java.util.ArrayList; 54 import java.util.ArrayList;
55 import java.util.EnumSet; 55 import java.util.EnumSet;
56 +import java.util.HashSet;
56 import java.util.List; 57 import java.util.List;
57 import java.util.Map; 58 import java.util.Map;
58 import java.util.Set; 59 import java.util.Set;
...@@ -76,6 +77,8 @@ public class DistributedIntentStore ...@@ -76,6 +77,8 @@ public class DistributedIntentStore
76 /** Valid parking state, which can transition to WITHDRAWN. */ 77 /** Valid parking state, which can transition to WITHDRAWN. */
77 private static final Set<IntentState> PRE_WITHDRAWN = EnumSet.of(INSTALLED, FAILED); 78 private static final Set<IntentState> PRE_WITHDRAWN = EnumSet.of(INSTALLED, FAILED);
78 79
80 + private static final Set<IntentState> PARKING = EnumSet.of(SUBMITTED, INSTALLED, WITHDRAWN, FAILED);
81 +
79 private final Logger log = getLogger(getClass()); 82 private final Logger log = getLogger(getClass());
80 83
81 // Assumption: IntentId will not have synonyms 84 // Assumption: IntentId will not have synonyms
...@@ -415,6 +418,8 @@ public class DistributedIntentStore ...@@ -415,6 +418,8 @@ public class DistributedIntentStore
415 List<Operation> failed = new ArrayList<>(); 418 List<Operation> failed = new ArrayList<>();
416 final Builder builder = BatchWriteRequest.newBuilder(); 419 final Builder builder = BatchWriteRequest.newBuilder();
417 420
421 + final Set<IntentId> transitionedToParking = new HashSet<>();
422 +
418 for (Operation op : batch.operations()) { 423 for (Operation op : batch.operations()) {
419 switch (op.type()) { 424 switch (op.type()) {
420 case CREATE_INTENT: 425 case CREATE_INTENT:
...@@ -440,6 +445,11 @@ public class DistributedIntentStore ...@@ -440,6 +445,11 @@ public class DistributedIntentStore
440 intent = op.arg(0); 445 intent = op.arg(0);
441 IntentState newState = op.arg(1); 446 IntentState newState = op.arg(1);
442 builder.put(STATES_TABLE, strIntentId(intent.id()), serializer.encode(newState)); 447 builder.put(STATES_TABLE, strIntentId(intent.id()), serializer.encode(newState));
448 + if (PARKING.contains(newState)) {
449 + transitionedToParking.add(intent.id());
450 + } else {
451 + transitionedToParking.remove(intent.id());
452 + }
443 break; 453 break;
444 454
445 case SET_INSTALLABLE: 455 case SET_INSTALLABLE:
...@@ -467,6 +477,7 @@ public class DistributedIntentStore ...@@ -467,6 +477,7 @@ public class DistributedIntentStore
467 BatchWriteResult batchWriteResult = dbService.batchWrite(builder.build()); 477 BatchWriteResult batchWriteResult = dbService.batchWrite(builder.build());
468 if (batchWriteResult.isSuccessful()) { 478 if (batchWriteResult.isSuccessful()) {
469 // no-failure (except for invalid input) 479 // no-failure (except for invalid input)
480 + transitionedToParking.forEach((intentId) -> transientStates.remove(intentId));
470 return failed; 481 return failed;
471 } else { 482 } else {
472 // everything failed 483 // everything failed
......
...@@ -76,6 +76,8 @@ public class HazelcastIntentStore ...@@ -76,6 +76,8 @@ public class HazelcastIntentStore
76 /** Valid parking state, which can transition to WITHDRAWN. */ 76 /** Valid parking state, which can transition to WITHDRAWN. */
77 private static final Set<IntentState> PRE_WITHDRAWN = EnumSet.of(INSTALLED, FAILED); 77 private static final Set<IntentState> PRE_WITHDRAWN = EnumSet.of(INSTALLED, FAILED);
78 78
79 + private static final Set<IntentState> PARKING = EnumSet.of(SUBMITTED, INSTALLED, WITHDRAWN, FAILED);
80 +
79 private final Logger log = getLogger(getClass()); 81 private final Logger log = getLogger(getClass());
80 82
81 // Assumption: IntentId will not have synonyms 83 // Assumption: IntentId will not have synonyms
...@@ -348,6 +350,8 @@ public class HazelcastIntentStore ...@@ -348,6 +350,8 @@ public class HazelcastIntentStore
348 } 350 }
349 } 351 }
350 352
353 + // TODO slice out methods after merging Ali's patch
354 + // CHECKSTYLE IGNORE MethodLength FOR NEXT 1 LINES
351 @Override 355 @Override
352 public List<Operation> batchWrite(BatchWrite batch) { 356 public List<Operation> batchWrite(BatchWrite batch) {
353 // Hazelcast version will never fail for conditional failure now. 357 // Hazelcast version will never fail for conditional failure now.
...@@ -479,6 +483,10 @@ public class HazelcastIntentStore ...@@ -479,6 +483,10 @@ public class HazelcastIntentStore
479 483
480 try { 484 try {
481 IntentState prevIntentState = (IntentState) subops.get(0).get(); 485 IntentState prevIntentState = (IntentState) subops.get(0).get();
486 +
487 + if (PARKING.contains(newState)) {
488 + transientStates.remove(intentId);
489 + }
482 log.trace("{} - {} -> {}", intentId, prevIntentState, newState); 490 log.trace("{} - {} -> {}", intentId, prevIntentState, newState);
483 // TODO sanity check and log? 491 // TODO sanity check and log?
484 } catch (InterruptedException e) { 492 } catch (InterruptedException e) {
......