Merge "bug 1888 - FRM Flow Listener registration fail"
authorTony Tkacik <ttkacik@cisco.com>
Fri, 19 Sep 2014 11:12:32 +0000 (11:12 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 19 Sep 2014 11:12:32 +0000 (11:12 +0000)
1  2 
opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/frm/impl/FlowForwarder.java

index 96418596a4295cadf8a13d1b363d5fe7733abb38,3196cbe5cada579a2d47303984e484686b57346b..698dbcb0d1593a912cc1caba527fb9a12e174cfd
@@@ -7,7 -7,6 +7,6 @@@
   */
  package org.opendaylight.controller.frm.impl;
  
- import com.google.common.base.Preconditions;
  import org.opendaylight.controller.frm.ForwardingRulesManager;
  import org.opendaylight.controller.md.sal.binding.api.DataBroker;
  import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
@@@ -33,6 -32,8 +32,8 @@@ import org.opendaylight.yangtools.yang.
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
+ import com.google.common.base.Preconditions;
  /**
   * GroupForwarder
   * It implements {@link org.opendaylight.controller.md.sal.binding.api.DataChangeListener}}
@@@ -52,8 -53,27 +53,27 @@@ public class FlowForwarder extends Abst
      public FlowForwarder (final ForwardingRulesManager manager, final DataBroker db) {
          super(manager, Flow.class);
          Preconditions.checkNotNull(db, "DataBroker can not be null!");
-         this.listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                 getWildCardPath(), FlowForwarder.this, DataChangeScope.SUBTREE);
+         registrationListener(db, 5);
+     }
+     private void registrationListener(final DataBroker db, int i) {
+         try {
+             listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                     getWildCardPath(), FlowForwarder.this, DataChangeScope.SUBTREE);
+         } catch (final Exception e) {
+             if (i >= 1) {
+                 try {
+                     Thread.sleep(100);
+                 } catch (InterruptedException e1) {
+                     LOG.error("Thread interrupted '{}'", e1);
+                     Thread.currentThread().interrupt();
+                 }
+                 registrationListener(db, --i);
+             } else {
+                 LOG.error("FRM Flow DataChange listener registration fail!", e);
+                 throw new IllegalStateException("FlowForwarder registration Listener fail! System needs restart.", e);
+             }
+         }
      }
  
      @Override
@@@ -61,7 -81,7 +81,7 @@@
          if (listenerRegistration != null) {
              try {
                  listenerRegistration.close();
-             } catch (Exception e) {
+             } catch (final Exception e) {
                  LOG.error("Error by stop FRM FlowChangeListener.", e);
              }
              listenerRegistration = null;
              builder.setNode(new NodeRef(nodeIdent.firstIdentifierOf(Node.class)));
              builder.setFlowTable(new FlowTableRef(nodeIdent.child(Table.class, tableKey)));
              builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
-             this.provider.getSalFlowService().removeFlow(builder.build());
+             provider.getSalFlowService().removeFlow(builder.build());
          }
      }
  
              builder.setUpdatedFlow((new UpdatedFlowBuilder(update)).build());
              builder.setOriginalFlow((new OriginalFlowBuilder(original)).build());
  
-             this.provider.getSalFlowService().updateFlow(builder.build());
+             provider.getSalFlowService().updateFlow(builder.build());
          }
      }
  
              builder.setFlowRef(new FlowRef(identifier));
              builder.setFlowTable(new FlowTableRef(nodeIdent.child(Table.class, tableKey)));
              builder.setTransactionUri(new Uri(provider.getNewTransactionId()));
-             this.provider.getSalFlowService().addFlow(builder.build());
+             provider.getSalFlowService().addFlow(builder.build());
          }
      }
  
      private boolean tableIdValidationPrecondition (final TableKey tableKey, final Flow flow) {
          Preconditions.checkNotNull(tableKey, "TableKey can not be null or empty!");
          Preconditions.checkNotNull(flow, "Flow can not be null or empty!");
 -        if (flow.getTableId() != tableKey.getId()) {
 +        if (! tableKey.getId().equals(flow.getTableId())) {
              LOG.error("TableID in URI tableId={} and in palyload tableId={} is not same.",
                      flow.getTableId(), tableKey.getId());
              return false;