X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=applications%2Fsouthbound-cli%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fapplications%2Fsouthboundcli%2FReconciliationServiceImpl.java;h=30bfd73598343c3b66c6baad480709bc338ec7ba;hb=674bb50091db4628a50c08606f8f8b9f3c8a5e55;hp=31daf4235fb0a83ccaa072e922dfca3bc04de00b;hpb=e24d613b2b6f151c424750e062215baab60880f1;p=openflowplugin.git diff --git a/applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/ReconciliationServiceImpl.java b/applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/ReconciliationServiceImpl.java index 31daf4235f..30bfd73598 100644 --- a/applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/ReconciliationServiceImpl.java +++ b/applications/southbound-cli/src/main/java/org/opendaylight/openflowplugin/applications/southboundcli/ReconciliationServiceImpl.java @@ -8,27 +8,32 @@ package org.opendaylight.openflowplugin.applications.southboundcli; -import static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.NodeReconcileState.State.COMPLETED; -import static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.NodeReconcileState.State.FAILED; -import static org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.NodeReconcileState.State.INPROGRESS; +import static java.util.Objects.requireNonNull; +import static org.opendaylight.openflowplugin.api.openflow.ReconciliationState.ReconciliationStatus.COMPLETED; +import static org.opendaylight.openflowplugin.api.openflow.ReconciliationState.ReconciliationStatus.FAILED; +import static org.opendaylight.openflowplugin.api.openflow.ReconciliationState.ReconciliationStatus.STARTED; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.math.BigInteger; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.stream.Collectors; import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.binding.api.ReadWriteTransaction; import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.openflowplugin.api.openflow.FlowGroupCacheManager; +import org.opendaylight.openflowplugin.api.openflow.ReconciliationState; import org.opendaylight.openflowplugin.applications.southboundcli.alarm.AlarmAgent; import org.opendaylight.openflowplugin.applications.southboundcli.util.OFNode; import org.opendaylight.openflowplugin.applications.southboundcli.util.ShellUtil; @@ -42,19 +47,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.frm.reconciliation.service.rev180227.ReconcileNodeInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.frm.reconciliation.service.rev180227.ReconcileNodeInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.frm.reconciliation.service.rev180227.ReconcileNodeOutput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.NodeReconcileState.State; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconcileInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconcileOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconcileOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconciliationCounter; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconciliationService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.ReconciliationState; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.counter.ReconcileCounter; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.counter.ReconcileCounterBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.counter.ReconcileCounterKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.state.ReconciliationStateList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.state.ReconciliationStateListBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.app.reconciliation.service.rev180227.reconciliation.state.ReconciliationStateListKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -70,15 +70,20 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo private final DataBroker broker; private final FrmReconciliationService frmReconciliationService; private final AlarmAgent alarmAgent; + private final NodeListener nodeListener; private final Long startCount = 1L; private final int threadPoolSize = 10; private final ExecutorService executor = Executors.newWorkStealingPool(threadPoolSize); + private volatile Map reconciliationStates = new ConcurrentHashMap(); public ReconciliationServiceImpl(final DataBroker broker, final FrmReconciliationService frmReconciliationService, - final AlarmAgent alarmAgent) { + final AlarmAgent alarmAgent, final NodeListener nodeListener, + final FlowGroupCacheManager flowGroupCacheManager) { this.broker = broker; this.frmReconciliationService = frmReconciliationService; this.alarmAgent = alarmAgent; + this.nodeListener = requireNonNull(nodeListener, "NodeListener cannot be null!"); + reconciliationStates = flowGroupCacheManager.getReconciliationStates(); } @Override @@ -115,12 +120,12 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo } List inprogressNodes = new ArrayList<>(); nodesToReconcile.parallelStream().forEach(nodeId -> { - Optional state = getReconciliationState(nodeId); - if (state.isPresent() && state.get().getState().equals(INPROGRESS)) { + ReconciliationState state = getReconciliationState(nodeId); + if (state != null && state.getState().equals(STARTED)) { inprogressNodes.add(Uint64.valueOf(nodeId)); } else { alarmAgent.raiseNodeReconciliationAlarm(nodeId); - LOG.info("Executing reconciliation for node {}", nodeId); + LOG.info("Executing reconciliation for node {} with state ", nodeId); NodeKey nodeKey = new NodeKey(new NodeId("openflow:" + nodeId)); ReconciliationTask reconcileTask = new ReconciliationTask(new BigInteger(String.valueOf(nodeId)), nodeKey); @@ -138,17 +143,8 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo } } - private Optional getReconciliationState(final Long nodeId) { - InstanceIdentifier instanceIdentifier = InstanceIdentifier - .builder(ReconciliationState.class).child(ReconciliationStateList.class, - new ReconciliationStateListKey(new BigInteger(String.valueOf(nodeId)))).build(); - try (ReadTransaction tx = broker.newReadOnlyTransaction()) { - return tx.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier).get(); - - } catch (InterruptedException | ExecutionException e) { - LOG.error("Exception while reading reconciliation state for {}", nodeId, e); - } - return Optional.empty(); + private ReconciliationState getReconciliationState(final Long nodeId) { + return reconciliationStates.get(nodeId.toString()); } private ListenableFuture> buildErrorResponse(String msg) { @@ -160,8 +156,8 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo } private List getAllNodes() { - List nodeList = ShellUtil.getAllNodes(broker); - List nodes = nodeList.stream().distinct().map(OFNode::getNodeId).collect(Collectors.toList()); + List nodeList = ShellUtil.getAllNodes(nodeListener); + List nodes = nodeList.stream().distinct().map(node -> node.getNodeId()).collect(Collectors.toList()); return nodes; } @@ -180,7 +176,7 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo ReconcileNodeInput reconInput = new ReconcileNodeInputBuilder() .setNodeId(nodeId).setNode(new NodeRef(InstanceIdentifier.builder(Nodes.class) .child(Node.class, nodeKey).build())).build(); - updateReconciliationState(INPROGRESS); + updateReconciliationState(STARTED); Future> reconOutput = frmReconciliationService .reconcileNode(reconInput); try { @@ -240,7 +236,7 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo } private Optional getReconciliationCount(ReadWriteTransaction tx, - InstanceIdentifier instanceIdentifier) { + InstanceIdentifier instanceIdentifier) { try { return tx.read(LogicalDatastoreType.OPERATIONAL, instanceIdentifier).get(); } catch (InterruptedException | ExecutionException e) { @@ -249,20 +245,10 @@ public class ReconciliationServiceImpl implements ReconciliationService, AutoClo return Optional.empty(); } - private void updateReconciliationState(State state) { - ReadWriteTransaction tx = broker.newReadWriteTransaction(); - InstanceIdentifier instanceIdentifier = InstanceIdentifier - .builder(ReconciliationState.class).child(ReconciliationStateList.class, - new ReconciliationStateListKey(nodeId)).build(); - ReconciliationStateListBuilder stateBuilder = new ReconciliationStateListBuilder() - .withKey(new ReconciliationStateListKey(nodeId)) - .setState(state); - try { - tx.merge(LogicalDatastoreType.OPERATIONAL, instanceIdentifier, stateBuilder.build(), true); - tx.commit().get(); - } catch (InterruptedException | ExecutionException e) { - LOG.error("Exception while updating reconciliation state: {}", nodeId, e); - } + + private void updateReconciliationState(ReconciliationState.ReconciliationStatus status) { + ReconciliationState state = new ReconciliationState(status, LocalDateTime.now()); + reconciliationStates.put(nodeId.toString(),state); } } }