BUG-2208: BUG-2208: Fix minors triggered resync bugs 96/32896/1
authorClaudio D. Gasparini <cgaspari@cisco.com>
Fri, 8 Jan 2016 12:02:46 +0000 (13:02 +0100)
committerMilos Fabian <milfabia@cisco.com>
Sun, 17 Jan 2016 22:24:04 +0000 (22:24 +0000)
Fix isTriggeredInitialSyncEnable
Change isSynchronized by method getSynchronized

Change-Id: Icef303f48fb0b192e4d62494e6462aca34e3eea8
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
(cherry picked from commit 6e9a5f7e5d30aea4811f1afa6eaadae8179e739e)

pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/AbstractTopologySessionListener.java
pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/Stateful07TopologySessionListener.java
pcep/topology-provider/src/main/java/org/opendaylight/bgpcep/pcep/topology/provider/SyncOptimization.java
pcep/topology-provider/src/test/java/org/opendaylight/bgpcep/pcep/topology/provider/PCEPTriggeredReSynchronizationProcedureTest.java

index 1a4850d1fe99adbb7a3f33b9471b3788811e9f51..18624407d8dc577f2c31018131ee073472309bdc 100644 (file)
@@ -119,6 +119,7 @@ public abstract class AbstractTopologySessionListener<S, L> implements PCEPSessi
     private boolean synced = false;
     private PCEPSession session;
     private SyncOptimization syncOptimization;
+    private boolean triggeredResyncInProcess;
 
     private ListenerStateRuntimeRegistration registration;
     private final SessionListenerState listenerState;
@@ -198,6 +199,7 @@ public abstract class AbstractTopologySessionListener<S, L> implements PCEPSessi
         updatePccNode(ctx, new PathComputationClientBuilder().setStateSync(pccSyncState).build());
         if (pccSyncState != PccSyncState.Synchronized) {
             this.synced = false;
+            this.triggeredResyncInProcess = true;
         }
         // All set, commit the modifications
         Futures.addCallback(ctx.trans.submit(), new FutureCallback<Void>() {
@@ -214,6 +216,10 @@ public abstract class AbstractTopologySessionListener<S, L> implements PCEPSessi
         });
     }
 
+    protected boolean isTriggeredSyncInProcess() {
+        return this.triggeredResyncInProcess;
+    }
+
     @GuardedBy("this")
     private void tearDown(final PCEPSession session) {
         this.serverSessionManager.releaseNodeState(this.nodeState, session, isLspDbPersisted());
@@ -448,6 +454,9 @@ public abstract class AbstractTopologySessionListener<S, L> implements PCEPSessi
 
         // Update synchronization flag
         this.synced = true;
+        if(this.triggeredResyncInProcess) {
+            this.triggeredResyncInProcess = false;
+        }
         updatePccNode(ctx, new PathComputationClientBuilder().setStateSync(PccSyncState.Synchronized).build());
 
         // The node has completed synchronization, cleanup metadata no longer reported back
index 642aeeb5a3c71c3cee659921465646516dbff562..340aa0363ca13effbe32012cf593f1f21f0c49ec 100644 (file)
@@ -141,7 +141,7 @@ class Stateful07TopologySessionListener extends AbstractTopologySessionListener<
     public synchronized ListenableFuture<OperationResult> triggerSync(final TriggerSyncArgs input) {
         if (isTriggeredInitialSynchro() && !isSynchronized()) {
             return triggerSynchronization(input);
-        } else if (isSynchronized() && isTriggeredReSyncEnabled()) {
+        } else if (getSynchronized() && isTriggeredReSyncEnabled()) {
             Preconditions.checkArgument(input != null && input.getNode() != null, MISSING_XML_TAG);
             if (input.getName() == null) {
                 return triggerResyncronization(input);
@@ -296,13 +296,15 @@ class Stateful07TopologySessionListener extends AbstractTopologySessionListener<
         case Active:
         case Down:
         case Up:
-            final PCEPRequest req = removeRequest(id);
-            if (req != null) {
-                LOG.debug("Request {} resulted in LSP operational state {}", id, lsp.getOperational());
-                rlb.setMetadata(req.getMetadata());
-                ctx.resolveRequest(req);
-            } else {
-                LOG.warn("Request ID {} not found in outstanding DB", id);
+            if(!isTriggeredSyncInProcess()) {
+                final PCEPRequest req = removeRequest(id);
+                if (req != null) {
+                    LOG.debug("Request {} resulted in LSP operational state {}", id, lsp.getOperational());
+                    rlb.setMetadata(req.getMetadata());
+                    ctx.resolveRequest(req);
+                } else {
+                    LOG.warn("Request ID {} not found in outstanding DB", id);
+                }
             }
             break;
         case GoingDown:
@@ -323,6 +325,17 @@ class Stateful07TopologySessionListener extends AbstractTopologySessionListener<
 
         if (!lsp.isSync() && (plspid == null || plspid.getValue() == 0)) {
             purgeStaleLsps(ctx);
+            if(isTriggeredSyncInProcess()) {
+                if (srp == null) {
+                    return false;
+                }
+                final SrpIdNumber id = srp.getOperationId();
+                if (id.getValue() == 0) {
+                    return false;
+                }
+                final PCEPRequest req = removeRequest(id);
+                ctx.resolveRequest(req);
+            }
             stateSynchronizationAchieved(ctx);
             return true;
         }
index 4fc02eea1a57cdbad38dcbb750e33c7e6944fe6a..c064a783ca21f762dc8afe57017241863c592515 100644 (file)
@@ -22,7 +22,7 @@ final class SyncOptimization {
     private final boolean isSyncAvoidanceEnabled;
     private final boolean isDeltaSyncEnabled;
     private final boolean isDbVersionPresent;
-    private final boolean isTriggeredInitialSynEnable;
+    private final boolean isTriggeredInitialSyncEnable;
     private final boolean isTriggeredReSyncEnable;
 
     public SyncOptimization(final PCEPSession session) {
@@ -35,7 +35,8 @@ final class SyncOptimization {
         this.isSyncAvoidanceEnabled = isSyncAvoidance(local) && isSyncAvoidance(remote);
         this.isDeltaSyncEnabled = isDeltaSync(local) && isDeltaSync(remote);
         this.isDbVersionPresent = localLspDbVersion != null || remoteLspDbVersion != null;
-        this.isTriggeredInitialSynEnable = isTriggeredInitialSync(local) && isTriggeredInitialSync(remote);
+        this.isTriggeredInitialSyncEnable = isTriggeredInitialSync(local) && isTriggeredInitialSync(remote) &&
+            (this.isDeltaSyncEnabled || this.isSyncAvoidanceEnabled);
         this.isTriggeredReSyncEnable = isTriggeredReSync(local) && isTriggeredReSync(remote);
     }
 
@@ -52,7 +53,7 @@ final class SyncOptimization {
     }
 
     public boolean isTriggeredInitSyncEnabled() {
-        return isTriggeredInitialSynEnable;
+        return isTriggeredInitialSyncEnable;
     }
     public boolean isTriggeredReSyncEnabled() {
         return isTriggeredReSyncEnable;
index a048d754bbe6b560431b8c3908ef5782e3dd3a0e..527bba82628fad1088c31739a76c1c8fe0aa00d9 100644 (file)
@@ -29,12 +29,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.cra
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Pcrpt;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SymbolicPathName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.symbolic.path.name.tlv.SymbolicPathNameBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject;
@@ -162,12 +164,15 @@ public class PCEPTriggeredReSynchronizationProcedureTest extends AbstractPCEPSes
     }
 
     private Pcrpt getSyncMsg() {
+        final SrpBuilder srpBuilder = new SrpBuilder();
+        // not sue whether use 0 instead of nextRequest() or do not insert srp == SRP-ID-number = 0
+        srpBuilder.setOperationId(new SrpIdNumber(1L));
         return MsgBuilderUtil.createPcRtpMessage(createLsp(0, false, Optional.of(
                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder().addAugmentation(
                     org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1.class,
                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev150714.Tlvs1Builder()
-                        .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(3l)).build()).build()).build()), true, false), Optional.<Srp>absent(),
-            createPath(Collections.<Subobject>emptyList()));
+                        .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(BigInteger.valueOf(3l)).build()).build()).build()), true, false),
+                            Optional.of(srpBuilder.build()), createPath(Collections.<Subobject>emptyList()));
     }
 
     private Pcrpt getPcrt() {