Search in sources :

Example 1 with ForwardingObjQueueKey

use of org.onosproject.net.flowobjective.ForwardingObjQueueKey in project onos by opennetworkinglab.

the class InOrderFlowObjectiveManager method execute.

/**
 * Submit the flow objective. Starting from this point on, the execution order is not guaranteed.
 * Therefore we must be certain that this method is called in-order.
 *
 * @param deviceId Device ID
 * @param obj Flow objective
 */
private void execute(DeviceId deviceId, Objective obj) {
    LogLevel logLevel = (obj.op() == Objective.Operation.VERIFY) ? LogLevel.TRACE : LogLevel.DEBUG;
    Tools.log(log, logLevel, "Submit objective installer, deviceId {}, obj {}", deviceId, obj);
    int priority = obj.priority();
    if (obj instanceof FilteringObjective) {
        FilteringObjQueueKey k = new FilteringObjQueueKey(deviceId, priority, ((FilteringObjective) obj).key());
        filtObjQueueHead.put(k, obj);
        super.filter(deviceId, (FilteringObjective) obj);
    } else if (obj instanceof ForwardingObjective) {
        ForwardingObjQueueKey k = new ForwardingObjQueueKey(deviceId, priority, ((ForwardingObjective) obj).selector());
        fwdObjQueueHead.put(k, obj);
        super.forward(deviceId, (ForwardingObjective) obj);
    } else if (obj instanceof NextObjective) {
        NextObjQueueKey k = new NextObjQueueKey(deviceId, obj.id());
        nextObjQueueHead.put(k, obj);
        super.next(deviceId, (NextObjective) obj);
    } else {
        log.error("Unknown flow objective instance: {}", obj.getClass().getName());
    }
}
Also used : NextObjective(org.onosproject.net.flowobjective.NextObjective) ForwardingObjQueueKey(org.onosproject.net.flowobjective.ForwardingObjQueueKey) FilteringObjQueueKey(org.onosproject.net.flowobjective.FilteringObjQueueKey) FilteringObjective(org.onosproject.net.flowobjective.FilteringObjective) ForwardingObjective(org.onosproject.net.flowobjective.ForwardingObjective) LogLevel(org.onlab.util.Tools.LogLevel) NextObjQueueKey(org.onosproject.net.flowobjective.NextObjQueueKey)

Example 2 with ForwardingObjQueueKey

use of org.onosproject.net.flowobjective.ForwardingObjQueueKey in project onos by opennetworkinglab.

the class InOrderFlowObjectiveManager method enqueue.

/**
 * Enqueue flow objective. Execute the flow objective if there is no pending objective ahead.
 *
 * @param deviceId Device ID
 * @param obj Flow objective
 */
private synchronized void enqueue(DeviceId deviceId, Objective obj) {
    int queueSize;
    int priority = obj.priority();
    LogLevel logLevel = (obj.op() == Objective.Operation.VERIFY) ? LogLevel.TRACE : LogLevel.DEBUG;
    Tools.log(log, logLevel, "Enqueue {}", obj);
    if (obj instanceof FilteringObjective) {
        FilteringObjQueueKey k = new FilteringObjQueueKey(deviceId, priority, ((FilteringObjective) obj).key());
        filtObjQueue.put(k, obj);
        queueSize = filtObjQueue.get(k).size();
    } else if (obj instanceof ForwardingObjective) {
        ForwardingObjQueueKey k = new ForwardingObjQueueKey(deviceId, priority, ((ForwardingObjective) obj).selector());
        fwdObjQueue.put(k, obj);
        queueSize = fwdObjQueue.get(k).size();
    } else if (obj instanceof NextObjective) {
        NextObjQueueKey k = new NextObjQueueKey(deviceId, obj.id());
        nextObjQueue.put(k, obj);
        queueSize = nextObjQueue.get(k).size();
    } else {
        log.error("Unknown flow objective instance: {}", obj.getClass().getName());
        return;
    }
    log.trace("{} queue size {}", obj.getClass().getSimpleName(), queueSize);
    // Execute immediately if there is no pending obj ahead
    if (queueSize == 1) {
        execute(deviceId, obj);
    }
}
Also used : NextObjective(org.onosproject.net.flowobjective.NextObjective) ForwardingObjQueueKey(org.onosproject.net.flowobjective.ForwardingObjQueueKey) FilteringObjQueueKey(org.onosproject.net.flowobjective.FilteringObjQueueKey) FilteringObjective(org.onosproject.net.flowobjective.FilteringObjective) ForwardingObjective(org.onosproject.net.flowobjective.ForwardingObjective) LogLevel(org.onlab.util.Tools.LogLevel) NextObjQueueKey(org.onosproject.net.flowobjective.NextObjQueueKey)

Example 3 with ForwardingObjQueueKey

use of org.onosproject.net.flowobjective.ForwardingObjQueueKey in project onos by opennetworkinglab.

the class FlowObjectiveQueueListCommand method doExecute.

@Override
protected void doExecute() {
    try {
        FlowObjectiveService service = get(FlowObjectiveService.class);
        ListMultimap<FilteringObjQueueKey, Objective> filtObjQueue = service.getFilteringObjQueue();
        ListMultimap<ForwardingObjQueueKey, Objective> fwdObjQueue = service.getForwardingObjQueue();
        ListMultimap<NextObjQueueKey, Objective> nextObjQueue = service.getNextObjQueue();
        Map<FilteringObjQueueKey, Objective> filtObjQueueHead = service.getFilteringObjQueueHead();
        Map<ForwardingObjQueueKey, Objective> fwdObjQueueHead = service.getForwardingObjQueueHead();
        Map<NextObjQueueKey, Objective> nextObjQueueHead = service.getNextObjQueueHead();
        if (cache) {
            printMap("Filtering objective cache", filtObjQueueHead, sizeOnly);
            printMap("Forwarding objective cache", fwdObjQueueHead, sizeOnly);
            printMap("Next objective cache", nextObjQueueHead, sizeOnly);
        } else {
            printMap("Filtering objective queue", filtObjQueue.asMap(), sizeOnly);
            printMap("Forwarding objective queue", fwdObjQueue.asMap(), sizeOnly);
            printMap("Next objective queue", nextObjQueue.asMap(), sizeOnly);
        }
    } catch (ServiceNotFoundException e) {
        print("FlowObjectiveService unavailable");
    }
}
Also used : Objective(org.onosproject.net.flowobjective.Objective) ForwardingObjQueueKey(org.onosproject.net.flowobjective.ForwardingObjQueueKey) FilteringObjQueueKey(org.onosproject.net.flowobjective.FilteringObjQueueKey) ServiceNotFoundException(org.onlab.osgi.ServiceNotFoundException) FlowObjectiveService(org.onosproject.net.flowobjective.FlowObjectiveService) NextObjQueueKey(org.onosproject.net.flowobjective.NextObjQueueKey)

Example 4 with ForwardingObjQueueKey

use of org.onosproject.net.flowobjective.ForwardingObjQueueKey in project onos by opennetworkinglab.

the class InOrderFlowObjectiveManager method dequeue.

/**
 * Dequeue flow objective. Execute the next flow objective in the queue, if any.
 *
 * @param deviceId Device ID
 * @param obj Flow objective
 * @param error ObjectiveError that triggers this dequeue. Null if this is not triggered by an error.
 */
private synchronized void dequeue(DeviceId deviceId, Objective obj, ObjectiveError error) {
    List<Objective> remaining;
    int priority = obj.priority();
    LogLevel logLevel = (obj.op() == Objective.Operation.VERIFY) ? LogLevel.TRACE : LogLevel.DEBUG;
    Tools.log(log, logLevel, "Dequeue {}", obj);
    if (obj instanceof FilteringObjective) {
        FilteringObjQueueKey k = new FilteringObjQueueKey(deviceId, priority, ((FilteringObjective) obj).key());
        if (!Objects.equals(ObjectiveError.INSTALLATIONTIMEOUT, error)) {
            filtObjQueueHead.invalidate(k);
        }
        filtObjQueue.remove(k, obj);
        remaining = filtObjQueue.get(k);
    } else if (obj instanceof ForwardingObjective) {
        ForwardingObjQueueKey k = new ForwardingObjQueueKey(deviceId, priority, ((ForwardingObjective) obj).selector());
        if (!Objects.equals(ObjectiveError.INSTALLATIONTIMEOUT, error)) {
            fwdObjQueueHead.invalidate(k);
        }
        fwdObjQueue.remove(k, obj);
        remaining = fwdObjQueue.get(k);
    } else if (obj instanceof NextObjective) {
        if (error != null) {
            // Remove pendingForwards and pendingNexts if next objective failed
            Set<PendingFlowObjective> removedForwards = pendingForwards.remove(obj.id());
            List<PendingFlowObjective> removedNexts = pendingNexts.remove(obj.id());
            if (removedForwards != null) {
                removedForwards.stream().map(PendingFlowObjective::flowObjective).forEach(pendingObj -> pendingObj.context().ifPresent(c -> c.onError(pendingObj, error)));
            }
            if (removedNexts != null) {
                removedNexts.stream().map(PendingFlowObjective::flowObjective).forEach(pendingObj -> pendingObj.context().ifPresent(c -> c.onError(pendingObj, error)));
            }
        }
        NextObjQueueKey k = new NextObjQueueKey(deviceId, obj.id());
        if (!Objects.equals(ObjectiveError.INSTALLATIONTIMEOUT, error)) {
            nextObjQueueHead.invalidate(k);
        }
        nextObjQueue.remove(k, obj);
        remaining = nextObjQueue.get(k);
    } else {
        log.error("Unknown flow objective instance: {}", obj.getClass().getName());
        return;
    }
    log.trace("{} queue size {}", obj.getClass().getSimpleName(), remaining.size());
    // Submit the next one in the queue, if any
    if (remaining.size() > 0) {
        execute(deviceId, remaining.get(0));
    }
}
Also used : NextObjective(org.onosproject.net.flowobjective.NextObjective) ArrayListMultimap(com.google.common.collect.ArrayListMultimap) ObjectiveEvent(org.onosproject.net.flowobjective.ObjectiveEvent) ListMultimap(com.google.common.collect.ListMultimap) Tools(org.onlab.util.Tools) IFOM_OBJ_TIMEOUT_MS_DEFAULT(org.onosproject.net.OsgiPropertyConstants.IFOM_OBJ_TIMEOUT_MS_DEFAULT) NextObjQueueKey(org.onosproject.net.flowobjective.NextObjQueueKey) ComponentContext(org.osgi.service.component.ComponentContext) LoggerFactory(org.slf4j.LoggerFactory) Tools.groupedThreads(org.onlab.util.Tools.groupedThreads) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Strings.isNullOrEmpty(com.google.common.base.Strings.isNullOrEmpty) ForwardingObjective(org.onosproject.net.flowobjective.ForwardingObjective) Multimaps(com.google.common.collect.Multimaps) FlowObjectiveService(org.onosproject.net.flowobjective.FlowObjectiveService) ObjectiveError(org.onosproject.net.flowobjective.ObjectiveError) Component(org.osgi.service.component.annotations.Component) Executors.newSingleThreadScheduledExecutor(java.util.concurrent.Executors.newSingleThreadScheduledExecutor) ObjectiveQueueKey(org.onosproject.net.flowobjective.ObjectiveQueueKey) Map(java.util.Map) NextObjective(org.onosproject.net.flowobjective.NextObjective) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Activate(org.osgi.service.component.annotations.Activate) ForwardingObjQueueKey(org.onosproject.net.flowobjective.ForwardingObjQueueKey) LogLevel(org.onlab.util.Tools.LogLevel) ExecutorService(java.util.concurrent.ExecutorService) FlowObjectiveStoreDelegate(org.onosproject.net.flowobjective.FlowObjectiveStoreDelegate) Logger(org.slf4j.Logger) FilteringObjective(org.onosproject.net.flowobjective.FilteringObjective) Deactivate(org.osgi.service.component.annotations.Deactivate) IFOM_OBJ_TIMEOUT_MS(org.onosproject.net.OsgiPropertyConstants.IFOM_OBJ_TIMEOUT_MS) Set(java.util.Set) FilteringObjQueueKey(org.onosproject.net.flowobjective.FilteringObjQueueKey) Executors.newSingleThreadExecutor(java.util.concurrent.Executors.newSingleThreadExecutor) Objects(java.util.Objects) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) RemovalListeners(com.google.common.cache.RemovalListeners) ObjectiveContext(org.onosproject.net.flowobjective.ObjectiveContext) Objective(org.onosproject.net.flowobjective.Objective) Optional(java.util.Optional) RemovalListener(com.google.common.cache.RemovalListener) CacheBuilder(com.google.common.cache.CacheBuilder) Cache(com.google.common.cache.Cache) DeviceId(org.onosproject.net.DeviceId) ForwardingObjQueueKey(org.onosproject.net.flowobjective.ForwardingObjQueueKey) FilteringObjQueueKey(org.onosproject.net.flowobjective.FilteringObjQueueKey) ForwardingObjective(org.onosproject.net.flowobjective.ForwardingObjective) LogLevel(org.onlab.util.Tools.LogLevel) NextObjQueueKey(org.onosproject.net.flowobjective.NextObjQueueKey) ForwardingObjective(org.onosproject.net.flowobjective.ForwardingObjective) NextObjective(org.onosproject.net.flowobjective.NextObjective) FilteringObjective(org.onosproject.net.flowobjective.FilteringObjective) Objective(org.onosproject.net.flowobjective.Objective) FilteringObjective(org.onosproject.net.flowobjective.FilteringObjective)

Aggregations

FilteringObjQueueKey (org.onosproject.net.flowobjective.FilteringObjQueueKey)4 ForwardingObjQueueKey (org.onosproject.net.flowobjective.ForwardingObjQueueKey)4 NextObjQueueKey (org.onosproject.net.flowobjective.NextObjQueueKey)4 LogLevel (org.onlab.util.Tools.LogLevel)3 FilteringObjective (org.onosproject.net.flowobjective.FilteringObjective)3 ForwardingObjective (org.onosproject.net.flowobjective.ForwardingObjective)3 NextObjective (org.onosproject.net.flowobjective.NextObjective)3 FlowObjectiveService (org.onosproject.net.flowobjective.FlowObjectiveService)2 Objective (org.onosproject.net.flowobjective.Objective)2 Strings.isNullOrEmpty (com.google.common.base.Strings.isNullOrEmpty)1 Cache (com.google.common.cache.Cache)1 CacheBuilder (com.google.common.cache.CacheBuilder)1 RemovalListener (com.google.common.cache.RemovalListener)1 RemovalListeners (com.google.common.cache.RemovalListeners)1 ArrayListMultimap (com.google.common.collect.ArrayListMultimap)1 ListMultimap (com.google.common.collect.ListMultimap)1 Multimaps (com.google.common.collect.Multimaps)1 List (java.util.List)1 Map (java.util.Map)1 Objects (java.util.Objects)1