import org.opendaylight.openflowplugin.api.openflow.device.handlers.MultiMsgCollector;
import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey;
+import org.opendaylight.openflowplugin.api.openflow.registry.ItemLifeCycleRegistry;
import org.opendaylight.openflowplugin.api.openflow.registry.flow.DeviceFlowRegistry;
import org.opendaylight.openflowplugin.api.openflow.registry.group.DeviceGroupRegistry;
import org.opendaylight.openflowplugin.api.openflow.registry.meter.DeviceMeterRegistry;
private static final Logger LOG = LoggerFactory.getLogger(DeviceContextImpl.class);
- // TODO: watermarks should be derived from effective rpc limit (75%|95%)
- private static final int PACKETIN_LOW_WATERMARK = 15000;
- private static final int PACKETIN_HIGH_WATERMARK = 19000;
// TODO: drain factor should be parametrized
public static final float REJECTED_DRAIN_FACTOR = 0.25f;
+ // TODO: low water mark factor should be parametrized
+ private static final float LOW_WATERMARK_FACTOR = 0.75f;
+ // TODO: high water mark factor should be parametrized
+ private static final float HIGH_WATERMARK_FACTOR = 0.95f;
private final ConnectionContext primaryConnectionContext;
private final DeviceState deviceState;
private final MessageTranslator<PacketInMessage, PacketReceived> packetInTranslator;
private final TranslatorLibrary translatorLibrary;
private Map<Long, NodeConnectorRef> nodeConnectorCache;
+ private ItemLifeCycleRegistry itemLifeCycleSourceRegistry;
@VisibleForTesting
messageSpy = _messageSpy;
packetInLimiter = new PacketInRateLimiter(primaryConnectionContext.getConnectionAdapter(),
- PACKETIN_LOW_WATERMARK, PACKETIN_HIGH_WATERMARK, messageSpy, REJECTED_DRAIN_FACTOR);
+ /*initial*/ 1000, /*initial*/2000, messageSpy, REJECTED_DRAIN_FACTOR);
this.translatorLibrary = translatorLibrary;
portStatusTranslator = translatorLibrary.lookupTranslator(
packetInTranslator = translatorLibrary.lookupTranslator(
new TranslatorKey(deviceState.getVersion(), PacketIn.class.getName()));
nodeConnectorCache = new ConcurrentHashMap<>();
+
+ itemLifeCycleSourceRegistry = new ItemLifeCycleRegistryImpl();
}
/**
deviceFlowRegistry.close();
deviceMeterRegistry.close();
+ itemLifeCycleSourceRegistry.clear();
+
for (final DeviceContextClosedHandler deviceContextClosedHandler : closeHandlers) {
deviceContextClosedHandler.onDeviceContextClosed(this);
Preconditions.checkNotNull(portNumber),
Preconditions.checkNotNull(nodeConnectorRef));
}
+
+ @Override
+ public void updatePacketInRateLimit(long upperBound) {
+ packetInLimiter.changeWaterMarks((int) (LOW_WATERMARK_FACTOR * upperBound), (int) (HIGH_WATERMARK_FACTOR * upperBound));
+ }
+
+ @Override
+ public ItemLifeCycleRegistry getItemLifeCycleSourceRegistry() {
+ return itemLifeCycleSourceRegistry;
+ }
}